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ą dodata/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_jobtworzy 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 kombinacjetype/schedule, zanim trafią one na urządzenie - Typowane writery do dostosowywania —
create_user_skillicreate_custom_toolbudują 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ędziaload_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_projectarchiwizuje 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ędziarespond_*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.
/dashboardi/api/jobssą celowo nieuwierzytelnione — ogranicz dostęp na poziomie sieci (Tailscale ACL, firewall, reverse proxy z basic auth) lub ustawDASHBOARD=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 PocketHook | URL |
|---|---|
| Server URL | https://your-host |
| Health Check URL | https://your-host/health |
| Polling URL | https://your-host/jobs |
Jak to działa#
- Wysyłasz wiadomość w PocketHook
- Serwer przekazuje ją do wybranego LLM wraz z historią konwersacji, przywołanymi wspomnieniami i dostępnymi narzędziami
- 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
- Odpowiedź jest zwracana w formacie PocketHook (
msg+shortcut+data+url) - PocketHook wyświetla wiadomość i wykonuje wszelkie Skróty na Twoim urządzeniu
Obsługiwani dostawcy LLM#
| Dostawca | Uwierzytelnianie | Domyślny model |
|---|---|---|
| Anthropic | Klucz API | claude-sonnet-4-20250514 |
| OpenAI | Klucz API | gpt-4.1-mini |
| OpenAI Codex | OAuth | gpt-5.1-codex-mini |
| GitHub Copilot | OAuth | claude-sonnet-4 |
| Google (Gemini) | Klucz API | gemini-2.5-flash |
| Mistral | Klucz API | mistral-medium-latest |
| Groq | Klucz API | llama-3.3-70b-versatile |
| xAI (Grok) | Klucz API | grok-3-mini-fast |
| OpenRouter | Klucz API | anthropic/claude-sonnet-4 |
| Ollama (lokalne) | Brak | llama3.2 |
| LM Studio (lokalne) | Brak | qwen3.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_HISTORYwiadomoś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_RECALLkontroluje, 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 czasuvalid_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:
- Archiwizuje wektory projektu (wydarzenia, decyzje, prośby powiązane z Barceloną).
- 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). - 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#
| Pole | Wymagane | Opis |
|---|---|---|
title | Tak | Czytelna nazwa |
description | Tak | Jedno zdanie używane w indeksie umiejętności pokazywanym agentowi |
shortcuts | Tak | Tablica nazw skrótów zdefiniowanych w pliku. Użyj [] dla umiejętności zawierających wyłącznie reguły zachowań |
target | Nie | Gdzie wykonywane są skróty: device (domyślnie, wysyłane do iOS) lub mac (uruchamiane na serwerze) |
sync_app | Nie | Aplikacja, 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:
- Agent decyduje, że skrót powinien zostać uruchomiony (np. „stwórz notatkę z dzisiejszego spotkania")
- 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 - 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 - Użytkownik otrzymuje wiadomość potwierdzającą w czacie; sam skrót nie jest wysyłany do urządzenia
Wymagania:
- Serwer musi działać na macOS —
shortcuts runjest 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/jobsto otwarte endpointyGET— 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 ustawDASHBOARD=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.htmlwworkspace/dashboard/dla prostych dostosowań - Pełny projekt — Stwórz projekt z framework (Svelte, React, Vue itd.) w
workspace/dashboard/z wynikiem kompilacji dodist/
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:
- Zainstaluje zależność
- Utworzy definicję narzędzia (prosty plik
.md) - 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żyjgit revert HEADręcznie - Pliki konfiguracyjne —
config/agent-instructions.md,config/personality.md,skills/ipermissions.jsonsą 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 dodata/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 trafia | Przykład |
|---|---|---|
| Skrót lub umiejętność z regułą zachowania | data/user/skills/<nazwa>.md | „Stwórz umiejętność do logowania moich treningów" |
| Narzędzie CLI opakowane jako zdolność agenta | data/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ści | data/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.tsdla głębszych integracji (wymaga forka serwera)
Konfiguracja#
Wszystkie ustawienia są przechowywane w .env (tworzonym przez bun run setup). Kluczowe opcje:
| Zmienna | Domyślna | Opis |
|---|---|---|
AUTH_TOKEN | (wymagany) | Wspólny sekret z PocketHook |
LLM_API_KEY | (wymagany) | Klucz API dostawcy LLM |
LLM_PROVIDER | anthropic | Nazwa dostawcy |
LLM_MODEL | claude-sonnet-4-20250514 | ID modelu |
LLM_REASONING | off | Poziom 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ą |
PORT | 3000 | Port serwera |
AGENT_NAME | PocketHook Assistant | Nazwa wyświetlana agenta |
MAX_HISTORY | 50 | Wiadomości w pamięci krótkoterminowej |
MAX_RECALL | 5 | Wspomnienia zwracane na turę przez przywołanie semantyczne (tylko gdy VECTOR_MEMORY=true) |
SESSION_TTL_MINUTES | 60 | Wygasanie sesji |
VECTOR_MEMORY | false | Włącz pamięć semantyczną (wymaga dostawcy embeddingów) |
EMBEDDING_PROVIDER | ollama | Dostawca embeddingów: ollama, lm-studio lub openai |
EMBEDDING_MODEL | nomic-embed-text | Nazwa modelu embeddingów |
EMBEDDING_URL | (auto) | URL API embeddingów |
EMBEDDING_API_KEY | — | Klucz API dla embeddingów OpenAI |
LOG_LEVEL | info | Poziom logowania: debug, info, warn, error |
RATE_LIMIT_MAX | 30 | Maksymalna liczba żądań na okno |
DASHBOARD | true | Włą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
| Platforma | Backend | Lokalizacja usługi |
|---|---|---|
| macOS | launchd | ~/Library/LaunchAgents/com.pockethook.${INSTANCE_NAME}.plist |
| Linux | systemd (user) | ~/.config/systemd/user/pockethook-${INSTANCE_NAME}.service |
| Windows | NSSM | PocketHook-${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,*.pemzablokowane przed dostępem agenta - Automatyczne wersjonowanie — Wszystkie zmiany w przestrzeni roboczej są śledzone przez git dla łatwego cofania