Що таке PocketHook Agent Server?#
Агентський сервер перетворює PocketHook на повноцінного AI асистента. Замість написання логіки відповідей самостійно, ви підключаєте LLM (Claude, GPT, Gemini тощо), яка обробляє повідомлення, викликає інструменти та повертає структуровані відповіді PocketHook — включно з тригерами Shortcuts.
Сервер працює на вашій власній машині. Ваші дані залишаються у вас.
Це відправна точка. Сервер постачається з базовим набором інструментів і призначений для розширення вами. Додавайте власні інтеграції — електронна пошта, календарі, документи, API — і робіть його своїм.
Можливості#
- Мультипровайдерна LLM — Anthropic, OpenAI, GitHub Copilot, Google, Mistral, Groq, xAI, OpenRouter, Ollama (локально), LM Studio (локально)
- OAuth автентифікація — GitHub Copilot та OpenAI Codex через device code / браузерний потік
- Інструменти агента — Команди оболонки, читання/запис файлів, перегляд каталогів, веб-пошук, веб-скрейпінг, керування dev-серверами
- Розділення framework / користувач — Файли фреймворку (
skills/,custom-tools/,config/) залишаються лише для читання. Ваші налаштування живуть підdata/user/(навички, користувацькі інструменти, інструкції, типізовані налаштування). Оновлення фреймворку надходять чисто, не перезаписуючи вашу роботу - Типізовані користувацькі налаштування — Зберігайте значення, такі як улюблений застосунок мап або домен тунеля у
data/user/prefs.json. Посилайтеся на них у навичках як{{prefs.key}}, і сервер підставить їх при завантаженні - Програмні завдання одним викликом — Мета-інструмент
run_code_jobстворює фонове завдання типу prompt (виконуване вашою налаштованою LLM) і надсилає користувачу підтвердження за один крок, замінюючи схильний до помилок шаблон «respond + create-job» - Типізовані протокольні інструменти — Шість виділених інструментів
respond_*(respond_text,respond_image,respond_buttons,respond_shortcut,respond_html,respond_sequence), плюс типізовані інструменти завдань (create_once_job,create_cron_job) та типізовані інструменти робочого простору (create_project,list_projects,delete_project). Схеми відхиляють некоректні URL, синтаксис кнопок і комбінаціїtype/scheduleще до того, як вони досягнуть пристрою - Типізовані записувачі для налаштування —
create_user_skillіcreate_custom_toolбудують markdown користувацького шару з правильним frontmatter, тож завантажувач завжди їх парсить, а агент ніколи не пише ці файли вручну - Фонові завдання — Одноразові або повторювані завдання з cron-виразами або простими інтервалами
- Динамічні навички — Визначайте швидкі команди та правила поведінки як файли
.md. У промпт завантажується лише компактний індекс; повний вміст підвантажується на вимогу через інструментload_skill - Самокеровані навички — Агент може створювати, редагувати та видаляти визначення навичок (записи завжди потрапляють у користувацький шар)
- Семантична пам’ять — Векторний пошук з ембедингами (Ollama, LM Studio або OpenAI). Спогади автоматично класифікуються LLM за вимірами wing/room/hall/status
- Граф знань — Темпоральне сховище триплетів для стійких фактів з автоматичною інвалідацією. Множинні значення співіснують; одиничні значення автозамінюються
- Метод PARA з каскадом завершення проекту — Кожен спогад позначається статусом (Проект, Область, Ресурс, Архів). Коли проект завершується, один виклик
complete_projectархівує його вектори, інвалідує кожен триплет планування, прив’язаний до slug проекту, та записує завершення — один виклик замість трьох - Гібридний пошук — Поєднує повнотекстовий пошук FTS5 з векторним семантичним пошуком за допомогою reciprocal rank fusion
- Довготривала пам’ять — SQLite + FTS5 повнотекстовий пошук як запасний варіант при вимкненій семантичній пам’яті
- Керування dev-серверами з контрактом тунеля — Запуск, зупинка та список dev-серверів. Коли запитується
tunnel: true, сервер перевіряє це до та після запуску — недоступний localhost-сервер ніколи не залишається тихо працювати - Автоматична санітизація URL — Якщо агент залишає
localhostURL у відповіді, інструментиrespond_*переписують його на відповідний тунельний URL, щоб ваш телефон завжди отримував доступне посилання - Користувацькі інструменти — Агент може встановлювати CLI інструменти та реєструвати їх як нові можливості
- Версіонування — Автоматичне git-версіонування файлів робочого простору; бекапи конфігурації для навичок та дозволів
- Веб-панель — Живий огляд фонових завдань, налаштовуваний для кожного користувача.
/dashboardта/api/jobsза задумом неавтентифіковані — обмежте доступ на мережевому рівні (Tailscale ACL, фаєрвол, reverse proxy з basic auth) або встановітьDASHBOARD=false, якщо вони вам не потрібні - HTTPS тунелювання — Вбудована підтримка Tailscale, ngrok та Cloudflare Tunnel
- Системна служба — Встановлення як постійний сервіс на macOS, Linux або Windows
- Обмеження запитів — Ліміти запитів на токен з налаштовуваними порогами
Вимоги#
- Середовище виконання Bun
- API ключ або OAuth облікові дані для вашого LLM провайдера
- (Опціонально) Tailscale, ngrok або cloudflared для HTTPS тунелювання
Швидкий старт#
git clone https://github.com/pockethook-app/pockethook-agent-server.git
cd pockethook-agent-server
bun install
# Інтерактивне налаштування — вибір провайдера, моделі, токена авторизації, порту
bun run setup
# Запуск сервера + HTTPS тунель
bun run dev:tunnel
Майстер налаштування проведе вас через вибір LLM провайдера, налаштування автентифікації та встановлення дозволів інструментів.
Після запуску скопіюйте відображені URL у налаштування PocketHook:
| Налаштування PocketHook | URL |
|---|---|
| Server URL | https://your-host |
| Health Check URL | https://your-host/health |
| Polling URL | https://your-host/jobs |
Як це працює#
- Ви надсилаєте повідомлення в PocketHook
- Сервер пересилає його обраній LLM з історією розмови, витягнутими спогадами та доступними інструментами
- LLM обробляє повідомлення — може виконувати команди оболонки, читати/записувати файли, шукати в вебі, планувати фонові завдання, запам’ятовувати факти або запускати dev-сервери
- Відповідь повертається у форматі PocketHook (
msg+shortcut+data+url) - PocketHook відображає повідомлення та виконує всі Shortcuts на вашому пристрої
Підтримувані LLM провайдери#
| Провайдер | Авторизація | Модель за замовчуванням |
|---|---|---|
| Anthropic | API ключ | claude-sonnet-4-20250514 |
| OpenAI | API ключ | gpt-4.1-mini |
| OpenAI Codex | OAuth | gpt-5.1-codex-mini |
| GitHub Copilot | OAuth | claude-sonnet-4 |
| Google (Gemini) | API ключ | gemini-2.5-flash |
| Mistral | API ключ | mistral-medium-latest |
| Groq | API ключ | llama-3.3-70b-versatile |
| xAI (Grok) | API ключ | grok-3-mini-fast |
| OpenRouter | API ключ | anthropic/claude-sonnet-4 |
| Ollama (локально) | Немає | llama3.2 |
| LM Studio (локально) | Немає | qwen3.5-4b-mlx |
Перемикайте провайдерів у будь-який час за допомогою bun run switch. Ollama та LM Studio працюють повністю на вашій машині — без API ключа, дані не залишають вашу мережу.
Пам’ять#
Система пам’яті має три рівні, кожен з яких служить певній меті.
Дизайн семантичної пам’яті поєднує ідеї MemPalace (архітектура палацу пам’яті, що організовує спогади у wings, halls та rooms) та методу PARA Тьяго Форте (Проекти, Області, Ресурси, Архів) для управління життєвим циклом знань.
Пам’ять розмови#
SQLite з повнотекстовим пошуком FTS5. Усі повідомлення зберігаються з мітками часу та ідентифікаторами сесій.
- Короткострокова — Останні
MAX_HISTORYповідомлень зберігаються в пам’яті на сесію - Довгострокова — Усі повідомлення зберігаються в SQLite, доступні для пошуку через FTS5
- Витягання за хід — Коли семантична пам’ять увімкнена,
MAX_RECALLконтролює, скільки релевантних спогадів вставляється в промпт у кожному ході - Сесії закінчуються після
SESSION_TTL_MINUTES, але довгострокова пам’ять зберігається назавжди
Налаштовуйте ці значення інтерактивно за допомогою bun run memory.
Семантична пам’ять#
Вимагає VECTOR_MEMORY=true та провайдера ембедингів (Ollama, LM Studio або OpenAI).
Кожен спогад перетворюється на вектор та автоматично класифікується LLM за чотирма вимірами:
- Wing — Сутність:
user,person:john,project:blog,place:london - Room — Тип:
facts,preferences,events,decisions,requests - Hall — Тема:
personal,tech,health,travel,food,work - Status — Класифікація PARA:
project,area,resource,archive
Коли ви ставите запитання, витягування сутностей фокусує векторний пошук на найбільш релевантних wings. Результати об’єднуються з результатами FTS5 за допомогою reciprocal rank fusion — так ви отримуєте найкраще від обох видів пошуку.
Граф знань#
Темпоральне сховище триплетів для структурованих, стійких фактів:
- Триплети:
(subject, predicate, object)з міткамиvalid_from/valid_until - Одиничні предикати (
lives_in,partner) автоматично інвалідують старе значення при оновленні - Множинні предикати (
child,friend,hobby) співіснують без інвалідації - Факти графу знань впроваджуються разом із витягнутими спогадами у кожну розмову
Коли ви кажете агенту «Я переїхав до Берліна», він інвалідує старий триплет lives_in та створює новий — автоматично.
Життєвий цикл PARA#
Кожен спогад позначається статусом PARA:
- Проект — Активна, обмежена в часі робота
- Область — Постійні обов’язки
- Ресурс — Довідкові матеріали (списки, рекомендації, інструкції)
- Архів — Завершені або скасовані проекти
Коли проект завершується, агент використовує семантичну подібність для архівації лише спогадів цього проекту, зберігаючи довідкові матеріали для майбутнього використання.
Каскад завершення проекту#
Скажіть «Я скасовую поїздку до Барселони», і один виклик інструменту зробить усе:
- Архівує вектори проекту (події, рішення, запити, пов’язані з Барселоною).
- Інвалідує кожен активний триплет графа знань, чий предикат відповідає slug проекту (
scheduled_visit_barcelona,planning_visit_barcelona,confirmed_visit_barcelona). - Записує завершення як новий триплет:
(user, "cancelled_visit_barcelona", "2026-04-15").
Зіставлення враховує межі — інший проект із назвою revisit_barcelona залишається недоторканим. Агенту більше не потрібно оркеструвати три окремих виклики в правильному порядку, тож навіть менші моделі справляються правильно.
Якщо VECTOR_MEMORY вимкнений або провайдер ембедингів недоступний, система перемикається на FTS5 без помилок.
Навички#
Навички — це файли .md у skills/, які визначають iOS Shortcuts, які агент може запускати, та/або правила поведінки. Вони використовують динамічне завантаження: у системний промпт впроваджується лише компактний індекс (заголовок, опис, список швидких команд). Агент завантажує повний вміст на вимогу через інструмент load_skill, зберігаючи низьке споживання токенів при додаванні нових навичок.
Кожен файл навички використовує YAML frontmatter:
---
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
Поля frontmatter#
| Поле | Обов’язково | Опис |
|---|---|---|
title | Так | Ім’я, зрозуміле для людини |
description | Так | Одне речення, що використовується в індексі навичок, показаному агенту |
shortcuts | Так | Масив імен швидких команд, визначених у файлі. Використовуйте [] для навичок лише з правилами поведінки |
target | Ні | Де виконуються Shortcuts: device (за замовчуванням, надсилається до iOS) або mac (виконується на сервері) |
sync_app | Ні | Застосунок, який слід ненадовго відкрити у фоні після серверного виконання, щоб запустити синхронізацію iCloud (наприклад, Notes, Calendar, Reminders). Пропустіть або використайте none, щоб вимкнути |
Навички також можуть бути правилами поведінки без швидких команд (наприклад, «як планувати сімейну подорож»). Використовуйте shortcuts: [] для таких випадків.
Агент може створювати та керувати навичками за запитом — попросіть його «створи навичку для керування моїми лампочками», і він напише файл .md за вас. Нові та відредаговані навички завжди потрапляють у ваш користувацький шар (data/user/skills/), тож оновлення фреймворку ніколи їх не перезаписують. Див. нижче розділ Customizing your agent.
Виконання Shortcuts на Mac-сервері#
Коли у навички вказано target: mac, Shortcuts виконуються тихо на Mac-сервері через CLI shortcuts run, а не надсилаються на пристрій iOS. Це ідеально підходить для дій, що створюють контент, синхронізований через iCloud — нотатки, нагадування, події календаря — оскільки результат автоматично синхронізується з усіма вашими пристроями без жодних дій з боку застосунку PocketHook.
Як це працює:
- Агент вирішує, що Shortcut слід запустити (наприклад, «створи нотатку із сьогоднішніми записами зустрічі»)
- Сервер викликає
shortcuts run "shortcutName"з даними, що передаються як JSON через stdin, використовуючи той самий формат-обгортку, що й PocketHook iOS - Якщо задано
sync_app, сервер короткочасно відкриває цей застосунок у фоні (open -gj -a Notes), щоб примусово запустити синхронізацію iCloud, а потім закриває його через 5 секунд - Користувач отримує підтверджувальне повідомлення в чаті; сам Shortcut на пристрій не надсилається
Вимоги:
- Сервер має працювати на macOS —
shortcuts runдоступний лише для macOS. На інших платформах сервер записує попередження та повертається до виконання на пристрої - Shortcut має бути встановлений у Shortcuts.app на сервері Mac
- Shortcut має очікувати Dictionary на вході (PocketHook загортає дані у
{ context, timestamp, app, data })
Коли використовувати target: mac:
- Дії з синхронізацією через iCloud (Notes, Reminders, Calendar) — результат і так потрапляє на кожен пристрій
- Тривала обробка, яку ви хочете тримати подалі від iOS-пристрою
- Будь-який Shortcut, якому не потрібна взаємодія з інтерфейсом iPhone
Коли залишати target: device (за замовчуванням):
- Shortcuts, що використовують функції, доступні лише на iPhone (камера, точна геолокація, локальні автоматизації застосунків)
- Shortcuts, які запитують у користувача інтерактивне введення
- Shortcuts, що використовують App Intents із застосунків лише для iOS
Фонові завдання#
Попросіть агента запланувати завдання, і він все зробить:
- «Перевіряй погоду кожного ранку о 8 годині та створюй нотатку»
- «Запускай цей скрипт кожну годину»
- «Нагадай мені перевірити пошту через 30 хвилин»
Завдання підтримують cron-вирази (0 8 * * *) та прості інтервали (30m, 1h, 2d). Результати доставляються в PocketHook при опитуванні ендпоінту /jobs.
Два типи виконання:
- Shell — Виконує команду bash, захоплює вивід. Може запускати Shortcut після завершення
- Prompt — Обробляється AI агентом з повним доступом до інструментів, зберігає повну відповідь PocketHook
Dev-сервери#
Коли агент створює веб-проект у робочому просторі (Hugo, Astro, Next.js, Flask, Go тощо), він завчасно пропонує його обслуговувати:
- Попередній перегляд — Запускає локальний dev-сервер на автоматично призначеному порті для швидкого перегляду
- Публічний — Запускає сервер та відкриває його через HTTPS тунель для доступу з будь-якого місця
Агент керує життєвим циклом: запуск, зупинка та список працюючих серверів. Усі сервери очищаються при зупинці основного сервера.
Контракт тунеля#
Коли агент запускає сервер із запитаним відкриттям через тунель, середовище виконання забезпечує це: якщо не встановлено жодного тунельного інструменту (Tailscale, ngrok, cloudflared), сервер відмовляється запускатися. Якщо налаштування тунеля зазнає невдачі після запуску, осиротілий процес зупиняється, і агент отримує явне повідомлення — тож він може повернутися в режим попереднього перегляду або попросити вас встановити тунель. Повернутий URL завжди є тунельним URL, коли тунелювання увімкнене, з приміткою, що локальний URL доступний лише на хості.
Як запобіжник, кожен інструмент respond_* постобробляє своє повідомлення: будь-який localhost або 127.0.0.1 URL, що пролізає у відповідь, автоматично переписується на відповідний тунельний URL, коли керований сервер має такий. Коли переписати неможливо, ви отримуєте попередження в логах замість зламаного посилання на телефоні.
Панель керування#
Вбудована веб-панель за адресою /dashboard показує живий огляд фонових завдань.
За задумом неавтентифікована. І
/dashboard, і/api/jobs— це відкритіGETендпоінти; будь-хто, хто може дістатися до хоста, може переглянути список завдань. Обмежте доступ на мережевому рівні (Tailscale ACL, фаєрвол, reverse proxy з basic auth) або встановітьDASHBOARD=false, якщо вони вам не потрібні. iOS-застосунок PocketHook не використовує ці ендпоінти.
Вона повністю налаштовувана:
- Швидке редагування — Розмістіть
dashboard.htmlуworkspace/dashboard/для простих налаштувань - Повний проект — Створіть проект на фреймворку (Svelte, React, Vue тощо) у
workspace/dashboard/з виводом збірки уdist/
Попросіть агента налаштувати вашу панель, і він все зробить — кожен користувач отримує унікальну, персоналізовану панель.
Користувацькі інструменти#
Агент може встановлювати CLI інструменти та реєструвати їх як нові можливості — розширюючи себе без модифікації коду сервера.
Наприклад, скажіть «встанови Playwright та використовуй його для створення скріншотів». Агент:
- Встановить залежність
- Створить визначення інструменту (простий файл
.md) - Використовуватиме новий інструмент у майбутніх розмовах
Користувацькі інструменти перезавантажуються на льоту — перезапуск не потрібен. Видаліть файл .md, щоб прибрати інструмент.
Версіонування#
Усі користувацькі дані версіонуються автоматично:
- Файли робочого простору — Відстежуються через локальний git-репозиторій всередині
workspace/. Кожен запис створює автокоміт. Попросіть агента «скасувати останню зміну» або використовуйтеgit revert HEADвручну - Файли конфігурації —
config/agent-instructions.md,config/personality.md,skills/таpermissions.jsonзберігаються перед кожною модифікацією. До 20 версій на файл
Git опціональний — якщо не встановлений, зміни робочого простору не версіонуються. Бекапи конфігурації працюють завжди.
Customizing your agent#
Агентський сервер постачається з мінімальною базою фреймворку і очікує, що ви нашаруєте власні налаштування зверху. Середовище виконання тримає ці дві речі окремо, щоб оновлення фреймворку ніколи не псували вашу роботу.
Framework проти користувача#
pockethook-agent-server/
├── skills/ # навички, що постачаються з фреймворком (лише для читання)
├── custom-tools/ # зарезервовано для інструментів фреймворку (лише для читання)
├── config/
│ ├── agent-instructions.md # інструкції агента з фреймворку (лише для читання)
│ └── personality.md # особистість з фреймворку (лише для читання)
└── data/user/ # ВАШІ налаштування живуть тут (ігноруються git)
├── skills/ # ваші власні навички (переважають над базою за ім'ям файлу)
├── custom-tools/ # ваші встановлені користувацькі інструменти
├── instructions.md # ваші доповнення до інструкцій агента
└── prefs.json # типізовані значення, на які посилаються як {{prefs.key}}
Користувацькі налаштування записуються через виділені типізовані інструменти (create_user_skill, create_custom_tool), тож отримані файли завжди відповідають формату завантажувача. Інструмент write також відхиляє будь-який шлях під skills/, custom-tools/ чи config/ і перенаправляє агента до data/user/* — тож навіть прямі редагування файлів потрапляють у користувацький шар.
Примітка про базовий каталог
custom-tools/. Сьогодні він містить лише шаблон (_example.md), який завантажувач ігнорує — кожен інструмент, який агент встановлює для вас, потрапляє вdata/user/custom-tools/. Каталог зарезервовано, щоб майбутні релізи фреймворку могли постачати опціональні вбудовані інструменти, не перезаписуючи ваших установок. Коли це станеться, ваші файли в користувацькому шарі все одно переможуть при конфлікті імен інструментів, тож нічого мігрувати не доведеться.
Чотири способи налаштування#
| Що ви хочете змінити | Куди це йде | Приклад |
|---|---|---|
| Навичка-shortcut або поведінкова навичка | data/user/skills/<назва>.md | «Створи навичку для запису моїх тренувань» |
| CLI інструмент, обгорнутий як можливість агента | data/user/custom-tools/<назва>.md | «Встанови ffmpeg і дай мені використовувати його для конверсій» |
| Глобальне правило («завжди відповідай англійською», «ніколи не використовуй таблиці») | data/user/instructions.md | «Відтепер завжди підсумовуй статті в 3 пункти» |
| Типізоване значення за замовчуванням, на яке посилаються навички | data/user/prefs.json | «Мій типовий пункт відправлення — Мадрид» → {"routeOrigin": "Madrid"} |
Вам ніколи не треба писати ці файли вручну. Просто скажіть агенту, чого ви хочете, і він автоматично обере правильний шар.
Типізовані налаштування з {{prefs.*}}#
Припустимо, ви пишете навичку-планувальник маршрутів, якій потрібно знати ваш типовий пункт відправлення. Замість того щоб зашивати «Мадрид» у навичку, посилайтеся на налаштування:
- **Пункт відправлення**: {{prefs.routeOrigin}}, якщо користувач не вказав інший початок.
І збережіть значення у data/user/prefs.json:
{
"routeOrigin": "Madrid, Spain",
"preferredMapsApp": "apple",
"tunnel": { "domain": "my-host.ts.net" }
}
Сервер підставляє плейсхолдери при завантаженні навички. Вкладені ключі ({{prefs.tunnel.domain}}) також працюють. Невідомі ключі залишаються недоторканими, щоб помилки написання залишалися видимими.
Пряме редагування бази фреймворку#
Якщо ви хостите самостійно і хочете налаштувати сам фреймворк, ви можете напряму редагувати config/agent-instructions.md, config/personality.md, skills/ або custom-tools/ — сервер не зупиняє вас, коли ви використовуєте редактор файлів. Але агент не буде писати в ці шляхи з розмови. А оновлення фреймворку перезапишуть ваші правки. Для всього, що хочете зберегти, віддавайте перевагу користувацькому шару.
Розширення сервера#
- Користувацькі інструменти — Попросіть агента встановити CLI інструменти; вони автоматично потрапляють у
data/user/custom-tools/ - Додавання навичок — Попросіть агента створити навичку; файл потрапляє в
data/user/skills/ - Зміна поведінки — Попросіть агента застосувати глобальне правило; воно додається до
data/user/instructions.md - Налаштування дозволів — Запустіть
bun run permissionsдля керування доступними інструментами агента - Додавання вбудованих інструментів — Реалізуйте нові функції інструментів у
src/tools.tsдля глибших інтеграцій (вимагає форку сервера)
Конфігурація#
Усі налаштування зберігаються у .env (створюється через bun run setup). Основні параметри:
| Змінна | За замовчуванням | Опис |
|---|---|---|
AUTH_TOKEN | (обов’язково) | Спільний секрет з PocketHook |
LLM_API_KEY | (обов’язково) | API ключ LLM провайдера |
LLM_PROVIDER | anthropic | Ім’я провайдера |
LLM_MODEL | claude-sonnet-4-20250514 | ID моделі |
LLM_REASONING | off | Рівень міркування: off, minimal, low, medium, high, xhigh. Вищі рівні додають приховані токени мислення (повільніше + дорожче). Моделі, які цього не підтримують, ігнорують |
PORT | 3000 | Порт сервера |
AGENT_NAME | PocketHook Assistant | Відображуване ім’я агента |
MAX_HISTORY | 50 | Повідомлень у короткостроковій пам’яті |
MAX_RECALL | 5 | Спогади, що повертаються за хід семантичним витяганням (лише коли VECTOR_MEMORY=true) |
SESSION_TTL_MINUTES | 60 | Час закінчення сесії |
VECTOR_MEMORY | false | Увімкнути семантичну пам’ять (потрібен провайдер ембедингів) |
EMBEDDING_PROVIDER | ollama | Провайдер ембедингів: ollama, lm-studio або openai |
EMBEDDING_MODEL | nomic-embed-text | Назва моделі ембедингів |
EMBEDDING_URL | (авто) | URL API ембедингів |
EMBEDDING_API_KEY | — | API ключ для ембедингів OpenAI |
LOG_LEVEL | info | Рівень логування: debug, info, warn, error |
RATE_LIMIT_MAX | 30 | Максимум запитів за вікно |
DASHBOARD | true | Увімкнути веб-панель (маршрут /dashboard) |
INSTANCE_NAME | (базова назва каталогу проекту з відрізаним префіксом pockethook-) | Суфікс, що використовується для мітки системної служби, каталогу логів та зіставлення процесу. Встановіть явно, коли запускаєте кілька копій на одній машині |
Повну довідку з конфігурації дивіться у GitHub репозиторії.
Запуск як служба#
Встановіть як постійну службу, яка запускається автоматично:
bun run service install
| Платформа | Бекенд | Розташування служби |
|---|---|---|
| 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)} у диспетчері служб Windows |
INSTANCE_NAME за замовчуванням — це базова назва каталогу проекту з відрізаним префіксом pockethook- (наприклад, копія в pockethook-agent-server/ стає agent-server). Встановіть його явно, щоб запустити кілька копій на одній машині без колізій — кожен екземпляр зберігає власні data/ та логи.
Керуйте за допомогою bun run service status, restart, stop або uninstall.
Безпека#
- Обов’язковий HTTPS — PocketHook вимагає HTTPS для всіх URL
- Авторизація Bearer токеном — Спільний секрет між додатком та сервером
- Обмеження запитів — Ліміти на токен запобігають зловживанням
- Ізольовані інструменти — Команди оболонки та доступ до файлів обмежені дозволами
- Заблоковані шаблони — Небезпечні команди (
sudo,rm -rf /) заблоковані за замовчуванням - Межа робочого каталогу — Агент не може вийти за межі призначеного каталогу
- Захист конфіденційних файлів —
.env,.git,*.key,*.pemзаблоковані для доступу агента - Автоматичне версіонування — Усі зміни робочого простору відстежуються через git для легкого відкату