Przewiń do głównej treści
  1. Dokumentacja/

Serwer agenta

Czym jest PocketHook Agent Server?
#

Serwer agenta zamienia PocketHook w pełnego asystenta AI. Zamiast samodzielnie pisać logikę odpowiedzi, podłączasz LLM (Claude, GPT, Gemini itd.), który przetwarza wiadomości, wywołuje narzędzia i zwraca ustrukturyzowane odpowiedzi PocketHook — w tym wyzwalacze Skrótów.

Serwer działa na Twoim własnym komputerze. Twoje dane pozostają przy Tobie.

To jest punkt wyjścia. Serwer jest dostarczany z podstawowym zestawem narzędzi i jest zaprojektowany tak, abyś mógł go rozszerzać. Dodaj własne integracje — e-mail, kalendarze, dokumenty, API — i dostosuj go do swoich potrzeb.

Funkcje
#

  • Wielu dostawców LLM — Anthropic, OpenAI, GitHub Copilot, Google, Mistral, Groq, xAI, OpenRouter, Ollama (lokalne), LM Studio (lokalne)
  • Uwierzytelnianie OAuth — GitHub Copilot i OpenAI Codex przez flow kodu urządzenia / przeglądarki
  • Narzędzia agenta — Polecenia powłoki, odczyt/zapis plików, lista katalogów, wyszukiwanie w sieci, scraping stron, zarządzanie serwerami deweloperskimi
  • Podział framework / użytkownik — Pliki frameworku (skills/, custom-tools/, config/) pozostają tylko do odczytu. Twoje dostosowania trafiają do data/user/ (umiejętności, niestandardowe narzędzia, instrukcje, typowane preferencje). Aktualizacje frameworku są wgrywane czysto, bez nadpisywania Twojej pracy
  • Typowane preferencje użytkownika — Przechowuj wartości, takie jak preferowana aplikacja map czy domena tunelu, w data/user/prefs.json. Odwołuj się do nich w umiejętnościach jako {{prefs.key}}, a serwer podstawi je przy ładowaniu
  • Zadania programistyczne w jednym wywołaniu — Meta-narzędzie run_code_job tworzy zadanie tła typu prompt (uruchamiane przez skonfigurowany LLM) i w jednym kroku wysyła użytkownikowi potwierdzenie, zastępując podatny na błędy schemat „respond + create-job"
  • Typowane narzędzia protokołu — Sześć dedykowanych narzędzi respond_* (respond_text, respond_image, respond_buttons, respond_shortcut, respond_html, respond_sequence), a także typowane narzędzia zadań (create_once_job, create_cron_job) i typowane narzędzia przestrzeni roboczej (create_project, list_projects, delete_project). Schematy odrzucają nieprawidłowe URL-e, składnię przycisków oraz kombinacje type/schedule, zanim trafią one na urządzenie
  • Typowane writery do dostosowywaniacreate_user_skill i create_custom_tool budują markdown warstwy użytkownika z poprawnym frontmatterem, dzięki czemu loader zawsze je parsuje, a agent nigdy nie pisze tych plików ręcznie
  • Zadania w tle — Jednorazowe lub cykliczne zadania z wyrażeniami cron lub prostymi interwałami
  • Dynamiczne umiejętności — Definiuj skróty i reguły zachowań jako pliki .md. Do promptu ładowany jest tylko kompaktowy indeks; pełna treść pobierana jest na żądanie za pomocą narzędzia load_skill
  • Samozarządzające się umiejętności — Agent może tworzyć, edytować i usuwać definicje umiejętności (zapisy zawsze trafiają do warstwy użytkownika)
  • Pamięć semantyczna — Wyszukiwanie wektorowe z embeddingami (Ollama, LM Studio lub OpenAI). Wspomnienia są automatycznie klasyfikowane przez LLM do wymiarów wing/room/hall/status
  • Graf wiedzy — Temporalny magazyn trójek dla trwałych faktów z auto-unieważnianiem. Relacje wielowartościowe współistnieją; fakty jednowartościowe są automatycznie zastępowane
  • Metoda PARA z kaskadą zakończenia projektu — Każde wspomnienie jest oznaczone statusem (Projekt, Obszar, Zasób, Archiwum). Gdy projekt się kończy, jedno wywołanie complete_project archiwizuje jego wektory, unieważnia wszystkie trójki planowania powiązane z jego slugiem i zapisuje zakończenie — jedno wywołanie zamiast trzech
  • Hybrydowe przywołanie — Łączy wyszukiwanie słów kluczowych FTS5 z wektorowym wyszukiwaniem semantycznym przy użyciu reciprocal rank fusion
  • Pamięć długoterminowa — SQLite + pełnotekstowe wyszukiwanie FTS5 jako awaryjne rozwiązanie, gdy pamięć semantyczna jest wyłączona
  • Zarządzanie serwerami deweloperskimi z kontraktem tunelu — Uruchamianie, zatrzymywanie i lista serwerów deweloperskich. Gdy zażądano tunnel: true, serwer wymusza to przed startem i po spawn — nieosiągalny serwer localhost nigdy nie zostaje cicho uruchomiony
  • Automatyczna sanityzacja URL-i — Jeśli agent zostawi w odpowiedzi URL localhost, narzędzia respond_* przepiszą go na pasujący URL tunelu, aby Twój telefon zawsze dostał osiągalny link
  • Niestandardowe narzędzia — Agent może instalować narzędzia CLI i rejestrować je jako nowe możliwości
  • Wersjonowanie — Automatyczne wersjonowanie git dla plików roboczych; kopie zapasowe konfiguracji dla umiejętności i uprawnień
  • Pulpit webowy — Podgląd na żywo zadań w tle, konfigurowalny na użytkownika. /dashboard i /api/jobs są celowo nieuwierzytelnione — ogranicz dostęp na poziomie sieci (Tailscale ACL, firewall, reverse proxy z basic auth) lub ustaw DASHBOARD=false, jeśli ich nie potrzebujesz
  • Tunelowanie HTTPS — Wbudowana obsługa Tailscale, ngrok i Cloudflare Tunnel
  • Usługa systemowa — Instalacja jako trwała usługa na macOS, Linux lub Windows
  • Limitowanie żądań — Limity na token z konfigurowalnymi progami

Wymagania
#

  • Środowisko uruchomieniowe Bun
  • Klucz API lub dane uwierzytelniające OAuth dla Twojego dostawcy LLM
  • (Opcjonalnie) Tailscale, ngrok lub cloudflared do tunelowania HTTPS

Szybki start
#

git clone https://github.com/pockethook-app/pockethook-agent-server.git
cd pockethook-agent-server
bun install

# Interaktywna konfiguracja — wybierz dostawcę, model, token uwierzytelniający, port
bun run setup

# Uruchom serwer + tunel HTTPS
bun run dev:tunnel

Kreator konfiguracji przeprowadzi Cię przez wybór dostawcy LLM, konfigurację uwierzytelniania i ustawienie uprawnień narzędzi.

Po uruchomieniu skopiuj wyświetlone adresy URL do Ustawień PocketHook:

Ustawienie PocketHookURL
Server URLhttps://your-host
Health Check URLhttps://your-host/health
Polling URLhttps://your-host/jobs

Jak to działa
#

  1. Wysyłasz wiadomość w PocketHook
  2. Serwer przekazuje ją do wybranego LLM wraz z historią konwersacji, przywołanymi wspomnieniami i dostępnymi narzędziami
  3. LLM przetwarza wiadomość — może uruchamiać polecenia powłoki, czytać/pisać pliki, przeszukiwać sieć, planować zadania w tle, zapamiętywać fakty lub uruchamiać serwery deweloperskie
  4. Odpowiedź jest zwracana w formacie PocketHook (msg + shortcut + data + url)
  5. PocketHook wyświetla wiadomość i wykonuje wszelkie Skróty na Twoim urządzeniu

Obsługiwani dostawcy LLM
#

DostawcaUwierzytelnianieDomyślny model
AnthropicKlucz APIclaude-sonnet-4-20250514
OpenAIKlucz APIgpt-4.1-mini
OpenAI CodexOAuthgpt-5.1-codex-mini
GitHub CopilotOAuthclaude-sonnet-4
Google (Gemini)Klucz APIgemini-2.5-flash
MistralKlucz APImistral-medium-latest
GroqKlucz APIllama-3.3-70b-versatile
xAI (Grok)Klucz APIgrok-3-mini-fast
OpenRouterKlucz APIanthropic/claude-sonnet-4
Ollama (lokalne)Brakllama3.2
LM Studio (lokalne)Brakqwen3.5-4b-mlx

Zmień dostawcę w dowolnym momencie za pomocą bun run switch. Ollama i LM Studio działają całkowicie na Twoim komputerze — nie potrzebujesz klucza API, żadne dane nie opuszczają Twojej sieci.

Pamięć
#

System pamięci składa się z trzech warstw, z których każda służy innemu celowi.

Projekt pamięci semantycznej łączy idee z MemPalace (architektura pałacu pamięci, która organizuje wspomnienia w skrzydła, korytarze i pokoje) oraz metody PARA Tiago Forte (Projekty, Obszary, Zasoby, Archiwum) do zarządzania cyklem życia wiedzy.

Pamięć konwersacji
#

SQLite z pełnotekstowym wyszukiwaniem FTS5. Wszystkie wiadomości są przechowywane ze znacznikami czasu i identyfikatorami sesji.

  • Krótkoterminowa — Ostatnie MAX_HISTORY wiadomości trzymane w pamięci na sesję
  • Długoterminowa — Wszystkie wiadomości zapisane w SQLite, przeszukiwalne przez dopasowanie słów kluczowych FTS5
  • Przywołanie na turę — Gdy pamięć semantyczna jest włączona, MAX_RECALL kontroluje, ile odpowiednich wspomnień jest wstrzykiwanych do promptu w każdej turze
  • Sesje wygasają po SESSION_TTL_MINUTES, ale pamięć długoterminowa jest trwała

Dostosuj te wartości interaktywnie poleceniem bun run memory.

Pamięć semantyczna
#

Wymaga VECTOR_MEMORY=true i dostawcy embeddingów (Ollama, LM Studio lub OpenAI).

Każde wspomnienie jest osadzone jako wektor i automatycznie klasyfikowane przez LLM w czterech wymiarach:

  • Wing — Encja: user, person:john, project:blog, place:london
  • Room — Typ: facts, preferences, events, decisions, requests
  • Hall — Temat: personal, tech, health, travel, food, work
  • Status — Klasyfikacja PARA: project, area, resource, archive

Gdy zadajesz pytanie, ekstrakcja encji kieruje wyszukiwanie wektorowe na najbardziej odpowiednie skrzydła. Wyniki są łączone z wynikami słów kluczowych FTS5 przy użyciu reciprocal rank fusion — dzięki czemu otrzymujesz najlepsze z wyszukiwania słów kluczowych i semantycznego.

Graf wiedzy
#

Temporalny magazyn trójek dla ustrukturyzowanych, trwałych faktów:

  • Trójki: (podmiot, predykat, obiekt) ze znacznikami czasu valid_from / valid_until
  • Predykaty jednowartościowe (lives_in, partner) automatycznie unieważniają starą wartość przy aktualizacji
  • Predykaty wielowartościowe (child, friend, hobby) współistnieją bez unieważniania
  • Fakty z grafu wiedzy są wstrzykiwane obok przywołanych wspomnień w każdej konwersacji

Gdy powiesz agentowi „Przeprowadziłem się do Berlina", unieważni starą trójkę lives_in i utworzy nową — automatycznie.

Cykl życia PARA
#

Każde wspomnienie jest oznaczone statusem PARA:

  • Projekt — Aktywna, ograniczona czasowo praca
  • Obszar — Bieżące odpowiedzialności
  • Zasób — Materiały referencyjne (listy, rekomendacje, poradniki)
  • Archiwum — Ukończone lub anulowane projekty

Gdy projekt jest ukończony, agent używa podobieństwa semantycznego, aby zarchiwizować tylko wspomnienia tego projektu, zachowując materiały referencyjne do przyszłego użytku.

Kaskada zakończenia projektu
#

Powiedz „Odwołuję wyjazd do Barcelony", a jedno wywołanie narzędzia załatwi wszystko:

  1. Archiwizuje wektory projektu (wydarzenia, decyzje, prośby powiązane z Barceloną).
  2. Unieważnia każdą aktywną trójkę grafu wiedzy, której predykat pasuje do sluga projektu (scheduled_visit_barcelona, planning_visit_barcelona, confirmed_visit_barcelona).
  3. Zapisuje zakończenie jako nową trójkę: (user, "cancelled_visit_barcelona", "2026-04-15").

Dopasowywanie uwzględnia granice słów — inny projekt o nazwie revisit_barcelona pozostaje nietknięty. Agent nie musi już orkiestrować trzech oddzielnych wywołań we właściwej kolejności, więc mniejsze modele również sobie z tym radzą.

Jeśli VECTOR_MEMORY jest wyłączone lub dostawca embeddingów jest niedostępny, system wraca do trybu FTS5 bez błędów.

Umiejętności
#

Umiejętności to pliki .md w katalogu skills/, które definiują Skróty iOS, które agent może wyzwalać i/lub reguły zachowań. Używają dynamicznego ładowania: do promptu systemowego wstrzykiwany jest tylko kompaktowy indeks (tytuł, opis, lista skrótów). Agent ładuje pełną treść na żądanie za pomocą narzędzia load_skill, utrzymując niskie zużycie tokenów w miarę dodawania kolejnych umiejętności.

Każdy plik umiejętności używa frontmatter YAML:

---
title: Notes
description: Create notes on the user's device with a title and body
shortcuts: [newNote]
target: mac
sync_app: Notes
---

### New Note

Shortcut name: `newNote`

Creates a new note on the user's device.

Data fields:
- title (string, required): Note title
- content (string, required): Note body

Pola frontmattera
#

PoleWymaganeOpis
titleTakCzytelna nazwa
descriptionTakJedno zdanie używane w indeksie umiejętności pokazywanym agentowi
shortcutsTakTablica nazw skrótów zdefiniowanych w pliku. Użyj [] dla umiejętności zawierających wyłącznie reguły zachowań
targetNieGdzie wykonywane są skróty: device (domyślnie, wysyłane do iOS) lub mac (uruchamiane na serwerze)
sync_appNieAplikacja, która jest na chwilę otwierana w tle po wykonaniu po stronie serwera, aby wymusić synchronizację iCloud (np. Notes, Calendar, Reminders). Pomiń lub użyj none, aby pominąć

Umiejętności mogą być również regułami zachowań bez skrótów (np. „jak zaplanować wycieczkę rodzinną"). Użyj shortcuts: [] w takich przypadkach.

Agent może tworzyć i zarządzać umiejętnościami na żądanie — poproś go o „stwórz umiejętność do sterowania moimi lampami", a napisze plik .md za Ciebie. Nowe i edytowane umiejętności zawsze trafiają do Twojej warstwy użytkownika (data/user/skills/), więc aktualizacje frameworku nigdy ich nie nadpiszą. Zobacz sekcję Customizing your agent poniżej.

Wykonywanie skrótów na serwerze Mac
#

Gdy umiejętność ma target: mac, skróty uruchamiają się po cichu na serwerze Mac za pomocą CLI shortcuts run zamiast być wysyłane do urządzenia iOS. Jest to idealne dla akcji tworzących treści synchronizowane z iCloud — notatek, przypomnień, wydarzeń kalendarza — ponieważ wynik synchronizuje się automatycznie ze wszystkimi Twoimi urządzeniami bez konieczności angażowania aplikacji PocketHook.

Jak to działa:

  1. Agent decyduje, że skrót powinien zostać uruchomiony (np. „stwórz notatkę z dzisiejszego spotkania")
  2. Serwer wywołuje shortcuts run "nazwaSkrótu" przekazując dane jako JSON na stdin, używając tego samego formatu opakowania, którego używa PocketHook iOS
  3. Jeśli ustawiono sync_app, serwer na chwilę otwiera tę aplikację w tle (open -gj -a Notes), aby wymusić synchronizację iCloud, a następnie zamyka ją po 5 sekundach
  4. Użytkownik otrzymuje wiadomość potwierdzającą w czacie; sam skrót nie jest wysyłany do urządzenia

Wymagania:

  • Serwer musi działać na macOSshortcuts run jest dostępne tylko na macOS. Na innych platformach serwer loguje ostrzeżenie i wraca do wykonania na urządzeniu
  • Skrót musi być zainstalowany w Shortcuts.app na serwerze Mac
  • Skrót powinien oczekiwać Słownika jako wejścia (PocketHook opakowuje dane w { context, timestamp, app, data })

Kiedy używać target: mac:

  • Akcje synchronizowane z iCloud (Notes, Reminders, Calendar) — wynik i tak dociera do każdego urządzenia
  • Długotrwałe przetwarzanie, które chcesz trzymać poza urządzeniem iOS
  • Wszelkie skróty, które nie muszą wchodzić w interakcję z interfejsem iPhone’a

Kiedy zostawić target: device (domyślne):

  • Skróty wymagające funkcji dostępnych tylko na iPhonie (kamera, precyzyjna lokalizacja, lokalne automatyzacje aplikacji)
  • Skróty, które proszą użytkownika o interaktywne dane wejściowe
  • Skróty używające App Intents z aplikacji dostępnych tylko na iOS

Zadania w tle
#

Poproś agenta o zaplanowanie zadań, a resztę załatwi sam:

  • „Sprawdzaj pogodę codziennie rano o 8 i utwórz notatkę"
  • „Uruchamiaj ten skrypt co godzinę"
  • „Przypomnij mi, żebym sprawdził e-mail za 30 minut"

Zadania obsługują wyrażenia cron (0 8 * * *) i proste interwały (30m, 1h, 2d). Wyniki są dostarczane do PocketHook, gdy odpytuje punkt końcowy /jobs.

Dwa typy wykonania:

  • Shell — Uruchamia polecenie bash, przechwytuje wynik. Może wyzwolić Skrót po zakończeniu
  • Prompt — Przetwarzane przez agenta AI z pełnym dostępem do narzędzi, zapisuje kompletną odpowiedź PocketHook

Serwery deweloperskie
#

Gdy agent tworzy projekt webowy w przestrzeni roboczej (Hugo, Astro, Next.js, Flask, Go itd.), proaktywnie oferuje jego serwowanie:

  • Podgląd — Uruchamia lokalny serwer deweloperski na automatycznie przypisanym porcie do szybkiego podglądu
  • Publiczny — Uruchamia serwer i wystawia go przez tunel HTTPS, aby był dostępny z dowolnego miejsca

Agent zarządza cyklem życia: uruchamianie, zatrzymywanie i wyświetlanie listy działających serwerów. Wszystkie serwery są czyszczone po zatrzymaniu serwera głównego.

Kontrakt tunelu
#

Gdy agent uruchamia serwer z żądaniem ekspozycji przez tunel, środowisko uruchomieniowe to wymusza: jeśli żadne narzędzie tunelowe (Tailscale, ngrok, cloudflared) nie jest zainstalowane, serwer odmawia startu. Jeśli konfiguracja tunelu nie powiedzie się po spawn, osierocony proces jest zatrzymywany, a agent otrzymuje wyraźną informację — tak aby mógł przejść w tryb podglądu lub poprosić Cię o instalację tunelu. Zwracany URL to zawsze URL tunelu, gdy tunelowanie jest włączone, z notką, że lokalny URL jest dostępny tylko dla hosta.

Jako zabezpieczenie każde narzędzie respond_* post-przetwarza swoją wiadomość: każdy URL localhost lub 127.0.0.1, który przekradnie się do odpowiedzi, jest automatycznie przepisywany na pasujący URL tunelu, gdy zarządzany serwer go posiada. Gdy nie da się przepisać, dostajesz ostrzeżenie w logach zamiast zepsutego linka na telefonie.

Pulpit
#

Wbudowany pulpit webowy pod adresem /dashboard pokazuje podgląd na żywo zadań w tle.

Celowo nieuwierzytelniony. Zarówno /dashboard, jak i /api/jobs to otwarte endpointy GET — każdy, kto może dotrzeć do hosta, może wylistować zadania. Ogranicz dostęp na poziomie sieci (Tailscale ACL, firewall, reverse proxy z basic auth) lub ustaw DASHBOARD=false, jeśli ich nie potrzebujesz. Aplikacja iOS PocketHook nie korzysta z tych endpointów.

Jest w pełni konfigurowalny:

  • Szybka edycja — Umieść plik dashboard.html w workspace/dashboard/ dla prostych dostosowań
  • Pełny projekt — Stwórz projekt z framework (Svelte, React, Vue itd.) w workspace/dashboard/ z wynikiem kompilacji do dist/

Poproś agenta o dostosowanie Twojego pulpitu, a resztę załatwi sam — każdy użytkownik otrzymuje unikalny, spersonalizowany pulpit.

Niestandardowe narzędzia
#

Agent może instalować narzędzia CLI i rejestrować je jako nowe możliwości — rozszerzając się bez modyfikacji kodu serwera.

Na przykład powiedz „zainstaluj Playwright i użyj go do robienia zrzutów ekranu". Agent:

  1. Zainstaluje zależność
  2. Utworzy definicję narzędzia (prosty plik .md)
  3. Użyje nowego narzędzia w przyszłych konwersacjach

Niestandardowe narzędzia są ładowane na gorąco — nie trzeba restartować. Usuń plik .md, aby usunąć narzędzie.

Wersjonowanie
#

Wszystkie dane użytkownika są automatycznie wersjonowane:

  • Pliki robocze — Śledzone lokalnym repozytorium git wewnątrz workspace/. Każdy zapis tworzy auto-commit. Poproś agenta o „cofnij ostatnią zmianę" lub użyj git revert HEAD ręcznie
  • Pliki konfiguracyjneconfig/agent-instructions.md, config/personality.md, skills/ i permissions.json są kopiowane przed każdą modyfikacją. Do 20 wersji na plik

Git jest opcjonalny — jeśli nie jest zainstalowany, zmiany w przestrzeni roboczej nie są wersjonowane. Kopie zapasowe konfiguracji zawsze działają.

Customizing your agent
#

Serwer agenta jest dostarczany z minimalną bazą frameworku i oczekuje, że nałożysz własne dostosowania na wierzch. Środowisko uruchomieniowe oddziela te dwie warstwy, aby aktualizacje frameworku nigdy nie nadpisywały Twojej pracy.

Framework a użytkownik
#

pockethook-agent-server/
├── skills/                      # umiejętności dostarczane przez framework (tylko do odczytu)
├── custom-tools/                # zarezerwowane dla narzędzi dostarczanych przez framework (tylko do odczytu)
├── config/
│   ├── agent-instructions.md    # instrukcje agenta z frameworku (tylko do odczytu)
│   └── personality.md           # osobowość z frameworku (tylko do odczytu)
└── data/user/                   # TWOJE dostosowania (ignorowane przez git)
    ├── skills/                  # Twoje własne umiejętności (nadpisują bazę po nazwie pliku)
    ├── custom-tools/            # Twoje zainstalowane niestandardowe narzędzia
    ├── instructions.md          # Twoje dodatki do instrukcji agenta
    └── prefs.json               # typowane wartości używane jako {{prefs.key}}

Dostosowania użytkownika są zapisywane przez dedykowane typowane narzędzia (create_user_skill, create_custom_tool), dzięki czemu powstałe pliki zawsze pasują do formatu loadera. Narzędzie write odrzuca również każdą ścieżkę pod skills/, custom-tools/ lub config/ i przekierowuje agenta do data/user/* — więc nawet bezpośrednie edycje plików kończą w warstwie użytkownika.

Uwaga o bazowym katalogu custom-tools/. Dzisiaj przechowuje tylko szablon (_example.md), który loader ignoruje — każde narzędzie, które agent instaluje dla Ciebie, trafia do data/user/custom-tools/. Katalog jest zarezerwowany, aby przyszłe wydania frameworku mogły dostarczać opcjonalne narzędzia wbudowane bez nadpisywania Twoich instalacji. Gdy to nastąpi, Twoje pliki warstwy użytkownika nadal wygrywają przy kolizji nazw narzędzi, więc nic nie trzeba migrować.

Cztery sposoby dostosowania
#

Co chcesz zmienićGdzie to trafiaPrzykład
Skrót lub umiejętność z regułą zachowaniadata/user/skills/<nazwa>.md„Stwórz umiejętność do logowania moich treningów"
Narzędzie CLI opakowane jako zdolność agentadata/user/custom-tools/<nazwa>.md„Zainstaluj ffmpeg i pozwól mi go używać do konwersji"
Reguła globalna („zawsze odpowiadaj po polsku", „nigdy nie używaj tabel")data/user/instructions.md„Od teraz zawsze podsumowuj artykuły w 3 punktach"
Typowana wartość domyślna używana przez umiejętnościdata/user/prefs.json„Domyślne miejsce startu trasy to Madryt"{"routeOrigin": "Madryt"}

Nigdy nie musisz pisać tych plików ręcznie. Wystarczy powiedzieć agentowi, czego chcesz, a on sam wybierze właściwą warstwę.

Typowane preferencje z {{prefs.*}}
#

Załóżmy, że piszesz umiejętność planera trasy, która musi znać Twój domyślny punkt startowy. Zamiast zakodowywać „Madryt" w umiejętności, odwołaj się do preferencji:

- **Punkt startowy**: {{prefs.routeOrigin}}, chyba że użytkownik poda inny punkt wyjścia.

I przechowuj wartość w data/user/prefs.json:

{
  "routeOrigin": "Madryt, Hiszpania",
  "preferredMapsApp": "apple",
  "tunnel": { "domain": "my-host.ts.net" }
}

Serwer podstawia placeholdery przy ładowaniu umiejętności. Klucze zagnieżdżone ({{prefs.tunnel.domain}}) również działają. Nieznane klucze są pozostawiane bez zmian, więc literówki pozostają widoczne.

Edytowanie bazy frameworku bezpośrednio
#

Jeśli hostujesz samodzielnie i chcesz zmodyfikować sam framework, możesz edytować config/agent-instructions.md, config/personality.md, skills/ lub custom-tools/ bezpośrednio — serwer Cię nie zatrzyma, gdy używasz edytora plików. Ale agent nie zapisze do tych ścieżek z konwersacji. A aktualizacje frameworku nadpiszą Twoje zmiany. Preferuj warstwę użytkownika dla wszystkiego, co chcesz zachować.

Rozszerzanie serwera
#

  • Niestandardowe narzędzia — Poproś agenta o instalację narzędzi CLI; trafiają automatycznie do data/user/custom-tools/
  • Dodaj umiejętności — Poproś agenta o stworzenie umiejętności; plik trafia do data/user/skills/
  • Zmień zachowanie — Poproś agenta o zastosowanie globalnej reguły; dopisze ją do data/user/instructions.md
  • Skonfiguruj uprawnienia — Uruchom bun run permissions, aby kontrolować, które narzędzia agent może używać
  • Dodaj wbudowane narzędzia — Zaimplementuj nowe funkcje narzędzi w src/tools.ts dla głębszych integracji (wymaga forka serwera)

Konfiguracja
#

Wszystkie ustawienia są przechowywane w .env (tworzonym przez bun run setup). Kluczowe opcje:

ZmiennaDomyślnaOpis
AUTH_TOKEN(wymagany)Wspólny sekret z PocketHook
LLM_API_KEY(wymagany)Klucz API dostawcy LLM
LLM_PROVIDERanthropicNazwa dostawcy
LLM_MODELclaude-sonnet-4-20250514ID modelu
LLM_REASONINGoffPoziom rozumowania: off, minimal, low, medium, high, xhigh. Wyższe poziomy dodają ukryte tokeny myślenia (wolniejsze + droższe). Ignorowane przez modele, które tego nie wspierają
PORT3000Port serwera
AGENT_NAMEPocketHook AssistantNazwa wyświetlana agenta
MAX_HISTORY50Wiadomości w pamięci krótkoterminowej
MAX_RECALL5Wspomnienia zwracane na turę przez przywołanie semantyczne (tylko gdy VECTOR_MEMORY=true)
SESSION_TTL_MINUTES60Wygasanie sesji
VECTOR_MEMORYfalseWłącz pamięć semantyczną (wymaga dostawcy embeddingów)
EMBEDDING_PROVIDERollamaDostawca embeddingów: ollama, lm-studio lub openai
EMBEDDING_MODELnomic-embed-textNazwa modelu embeddingów
EMBEDDING_URL(auto)URL API embeddingów
EMBEDDING_API_KEYKlucz API dla embeddingów OpenAI
LOG_LEVELinfoPoziom logowania: debug, info, warn, error
RATE_LIMIT_MAX30Maksymalna liczba żądań na okno
DASHBOARDtrueWłącz pulpit webowy (trasa /dashboard)
INSTANCE_NAME(nazwa katalogu projektu, z usuniętym prefiksem pockethook-)Sufiks używany dla etykiety usługi systemowej, katalogu logów i dopasowywania procesu. Ustaw jawnie, gdy uruchamiasz kilka kopii na tej samej maszynie

Pełną dokumentację konfiguracji znajdziesz w repozytorium GitHub.

Uruchamianie jako usługa
#

Zainstaluj jako trwałą usługę, która uruchamia się automatycznie:

bun run service install
PlatformaBackendLokalizacja usługi
macOSlaunchd~/Library/LaunchAgents/com.pockethook.${INSTANCE_NAME}.plist
Linuxsystemd (user)~/.config/systemd/user/pockethook-${INSTANCE_NAME}.service
WindowsNSSMPocketHook-${PascalCase(INSTANCE_NAME)} w Menedżerze usług Windows

INSTANCE_NAME domyślnie przyjmuje nazwę katalogu projektu z usuniętym prefiksem pockethook- (np. kopia w pockethook-agent-server/ staje się agent-server). Ustaw go jawnie, aby uruchomić kilka kopii na tej samej maszynie bez kolizji — każda instancja zachowuje własne data/ i logi.

Zarządzaj za pomocą bun run service status, restart, stop lub uninstall.

Bezpieczeństwo
#

  • Wymagany HTTPS — PocketHook wymusza HTTPS dla wszystkich adresów URL
  • Uwierzytelnianie tokenem Bearer — Wspólny sekret między aplikacją a serwerem
  • Limitowanie żądań — Limity na token zapobiegają nadużyciom
  • Izolowane narzędzia — Polecenia powłoki i dostęp do plików ograniczony przez uprawnienia
  • Zablokowane wzorce — Niebezpieczne polecenia (sudo, rm -rf /) domyślnie zablokowane
  • Granica katalogu roboczego — Agent nie może opuścić wyznaczonego katalogu
  • Chronione pliki wrażliwe.env, .git, *.key, *.pem zablokowane przed dostępem agenta
  • Automatyczne wersjonowanie — Wszystkie zmiany w przestrzeni roboczej są śledzone przez git dla łatwego cofania