본문으로 건너뛰기
  1. 문서/

에이전트 서버

PocketHook Agent Server란?
#

에이전트 서버는 PocketHook을 완전한 AI 어시스턴트로 만듭니다. 응답 로직을 직접 작성하는 대신, LLM(Claude, GPT, Gemini 등)을 연결하여 메시지를 처리하고, 도구를 호출하고, 구조화된 PocketHook 응답(단축어 트리거 포함)을 반환합니다.

서버는 당신의 머신에서 실행됩니다. 데이터는 당신에게 남습니다.

이것은 시작점입니다. 서버는 핵심 도구 세트를 포함하고 있으며 당신이 확장할 수 있도록 설계되었습니다. 이메일, 캘린더, 문서, API 등 자체 통합을 추가하여 당신만의 것으로 만드세요.

기능
#

  • 멀티 프로바이더 LLM — Anthropic, OpenAI, GitHub Copilot, Google, Mistral, Groq, xAI, OpenRouter, Ollama(로컬), LM Studio(로컬)
  • OAuth 인증 — GitHub Copilot과 OpenAI Codex(디바이스 코드/브라우저 플로우 지원)
  • 에이전트 도구 — 셸 명령, 파일 읽기/쓰기, 디렉토리 목록, 웹 검색, 웹 스크래핑, 개발 서버 관리
  • 프레임워크/사용자 분리 — 프레임워크 파일(skills/, custom-tools/, config/)은 읽기 전용으로 유지. 당신의 커스터마이징은 data/user/ 아래(스킬, 커스텀 도구, 인스트럭션, 타입드 prefs)에 저장. 프레임워크 업데이트가 당신의 작업을 덮어쓰지 않고 깔끔하게 적용
  • 타입드 사용자 prefs — 선호하는 지도 앱이나 터널 도메인 같은 값을 data/user/prefs.json에 저장. 스킬에서 {{prefs.key}}로 참조하면 서버가 로드 시점에 치환
  • 프로그래밍 작업을 단일 호출로run_code_job 메타 도구가 prompt 타입의 백그라운드 작업(설정한 LLM이 실행)을 생성하고 사용자에게 확인을 한 번에 전송 — 오류가 잦은 “respond + create-job” 패턴을 대체
  • 타입드 프로토콜 도구 — 6개의 전용 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_skillcreate_custom_tool은 사용자 레이어 markdown을 올바른 frontmatter로 작성하므로, 로더가 항상 파싱할 수 있고 에이전트가 이러한 파일을 직접 작성할 일이 없습니다
  • 백그라운드 작업 — cron 표현식 또는 간단한 간격으로 일회성 또는 반복 작업
  • 동적 스킬 — 단축어와 동작 규칙을 .md 파일로 정의. 컴팩트한 인덱스만 프롬프트에 로드되고, 전체 내용은 load_skill 도구로 온디맨드 가져오기
  • 자기 관리 스킬 — 에이전트가 스킬 정의를 생성, 편집, 삭제 가능(쓰기는 항상 사용자 레이어에 저장)
  • 시맨틱 메모리 — 임베딩(Ollama, LM Studio 또는 OpenAI)을 사용한 벡터 기반 검색. 메모리는 LLM에 의해 wing/room/hall/status 차원으로 자동 분류
  • 지식 그래프 — 자동 무효화가 포함된 시간 기반 트리플 저장소. 다중 값 관계는 공존하고, 단일 값 사실은 자동 교체
  • PARA 메서드(프로젝트 종료 캐스케이드 포함) — 모든 메모리에 상태(Project, Area, Resource, Archive) 태그 지정. 프로젝트가 끝나면 단일 complete_project 호출로 해당 벡터를 아카이브하고, 그 슬러그에 연결된 모든 계획 트리플을 무효화하며, 완료를 기록 — 세 번이 아닌 한 번의 호출로 처리
  • 하이브리드 리콜 — FTS5 키워드 검색과 벡터 시맨틱 검색을 역순위 융합으로 결합
  • 장기 기억 — 시맨틱 메모리가 비활성화된 경우 폴백으로 SQLite + FTS5 전문 검색
  • 터널 계약이 포함된 개발 서버 관리 — 개발 서버 시작, 중지, 목록 표시. tunnel: true가 요청되면 서버는 사전 및 스폰 후에 이를 강제 — 도달할 수 없는 localhost 서버가 조용히 남겨지는 일이 없습니다
  • 자동 URL 정리 — 에이전트가 응답에 localhost URL을 남기면, respond_* 도구가 일치하는 터널 URL로 재작성하여 당신의 폰이 항상 접근 가능한 링크를 받도록 합니다
  • 커스텀 도구 — 에이전트가 CLI 도구를 설치하고 새로운 기능으로 등록 가능
  • 버전 관리 — 워크스페이스 파일의 자동 git 버전 관리. 스킬과 권한의 설정 백업
  • 웹 대시보드 — 백그라운드 작업의 실시간 개요. 사용자별 커스터마이징 가능. /dashboard/api/jobs는 설계상 인증되지 않습니다 — 네트워크 계층에서 접근을 제한하거나(Tailscale ACL, 방화벽, basic auth가 적용된 리버스 프록시) 필요하지 않다면 DASHBOARD=false로 설정하세요
  • HTTPS 터널링 — Tailscale, ngrok, Cloudflare Tunnel 내장 지원
  • 시스템 서비스 — macOS, Linux 또는 Windows에서 영구 서비스로 설치
  • 속도 제한 — 설정 가능한 임계값으로 토큰별 요청 제한

요구 사항
#

  • Bun 런타임
  • LLM 프로바이더의 API 키 또는 OAuth 자격 증명
  • (선택 사항) 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
서버 URLhttps://your-host
헬스 체크 URLhttps://your-host/health
폴링 URLhttps://your-host/jobs

작동 방식
#

  1. PocketHook에서 메시지를 보냅니다
  2. 서버가 대화 기록, 회상된 메모리, 사용 가능한 도구와 함께 선택한 LLM으로 전달합니다
  3. LLM이 메시지를 처리합니다 — 셸 명령 실행, 파일 읽기/쓰기, 웹 검색, 백그라운드 작업 스케줄링, 사실 기억, 개발 서버 시작이 가능합니다
  4. 응답이 PocketHook 형식(msg + shortcut + data + url)으로 반환됩니다
  5. PocketHook이 메시지를 표시하고 기기에서 단축어를 실행합니다

지원되는 LLM 프로바이더
#

프로바이더인증기본 모델
AnthropicAPI 키claude-sonnet-4-20250514
OpenAIAPI 키gpt-4.1-mini
OpenAI CodexOAuthgpt-5.1-codex-mini
GitHub CopilotOAuthclaude-sonnet-4
Google (Gemini)API 키gemini-2.5-flash
MistralAPI 키mistral-medium-latest
GroqAPI 키llama-3.3-70b-versatile
xAI (Grok)API 키grok-3-mini-fast
OpenRouterAPI 키anthropic/claude-sonnet-4
Ollama(로컬)없음llama3.2
LM Studio(로컬)없음qwen3.5-4b-mlx

bun run switch로 언제든지 프로바이더를 전환할 수 있습니다. Ollama와 LM Studio는 완전히 당신의 머신에서 실행됩니다 — API 키 불필요, 데이터가 네트워크 밖으로 나가지 않습니다.

메모리
#

메모리 시스템은 세 개의 레이어로 구성되며, 각각 다른 목적을 가집니다.

시맨틱 메모리 설계는 MemPalace(메모리를 wing, hall, room으로 구성하는 메모리 팰리스 아키텍처)와 Tiago Forte의 PARA 메서드(Projects, Areas, Resources, Archive — 지식 라이프사이클 관리)의 아이디어를 결합합니다.

대화 메모리
#

FTS5 전문 검색이 포함된 SQLite. 모든 메시지가 타임스탬프와 세션 ID와 함께 저장됩니다.

  • 단기 — 세션당 최근 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

질문하면 엔티티 추출이 가장 관련성 높은 wing에 벡터 검색을 집중시킵니다. 결과는 역순위 융합을 사용하여 FTS5 키워드 결과와 병합되므로, 키워드와 시맨틱 매칭의 장점을 모두 얻을 수 있습니다.

지식 그래프
#

구조화된 영구 사실을 위한 시간 기반 트리플 저장소:

  • 트리플: (subject, predicate, object)valid_from / valid_until 타임스탬프 포함
  • 단일 값 술어(lives_in, partner)는 업데이트 시 이전 값을 자동 무효화
  • 다중 값 술어(child, friend, hobby)는 무효화 없이 공존
  • 지식 그래프 사실은 모든 대화에서 회상된 메모리와 함께 주입됩니다

에이전트에게 *“베를린으로 이사했어”*라고 말하면, 이전 lives_in 트리플을 무효화하고 새로운 것을 자동으로 생성합니다.

PARA 라이프사이클
#

모든 메모리에 PARA 상태가 태그됩니다:

  • Project — 활성화된 기한이 있는 작업
  • Area — 지속적인 책임
  • Resource — 참조 자료(목록, 추천, 하우투)
  • Archive — 완료되거나 취소된 프로젝트

프로젝트가 완료되면 에이전트는 시맨틱 유사도를 사용하여 해당 프로젝트의 메모리만 아카이브하고, 참조 자료는 향후 사용을 위해 보존합니다.

프로젝트 종료 캐스케이드
#

*“바르셀로나 여행을 취소할래”*라고 말하면 단일 도구 호출이 모든 것을 처리합니다:

  1. 프로젝트의 벡터(바르셀로나와 연결된 events, decisions, requests)를 아카이브.
  2. 술어가 프로젝트 슬러그와 일치하는 모든 활성 지식 그래프 트리플을 무효화(scheduled_visit_barcelona, planning_visit_barcelona, confirmed_visit_barcelona).
  3. 완료를 새 트리플로 기록: (user, "cancelled_visit_barcelona", "2026-04-15").

매칭은 경계를 인식합니다 — revisit_barcelona라는 다른 프로젝트는 그대로 유지됩니다. 에이전트가 세 번의 별개 호출을 올바른 순서로 조율할 필요가 없어지므로, 작은 모델도 제대로 처리합니다.

VECTOR_MEMORY가 비활성화되거나 임베딩 프로바이더에 접근할 수 없으면, 시스템은 오류 없이 FTS5 전용으로 폴백합니다.

스킬
#

스킬은 skills/ 디렉토리의 .md 파일로, 에이전트가 트리거할 수 있는 iOS 단축어와/또는 동작 규칙을 정의합니다. 동적 로딩을 사용합니다: 컴팩트한 인덱스(제목, 설명, 단축어 목록)만 시스템 프롬프트에 주입됩니다. 에이전트는 load_skill 도구로 온디맨드로 전체 내용을 로드하여 스킬이 추가되어도 토큰 사용량을 낮게 유지합니다.

각 스킬 파일은 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

프론트매터 필드
#

필드필수설명
title사람이 읽기 쉬운 이름
description에이전트에게 표시되는 스킬 인덱스에 사용되는 한 문장
shortcuts파일에 정의된 단축어 이름 배열. 동작 규칙 전용 스킬의 경우 [] 사용
target아니오단축어가 실행되는 위치: device(기본값, iOS로 전송) 또는 mac(서버에서 실행)
sync_app아니오서버 측 실행 후 iCloud 동기화를 트리거하기 위해 백그라운드에서 잠깐 실행할 앱(예: Notes, Calendar, Reminders). 생략하거나 none을 사용하면 건너뜀

스킬은 단축어 없이 동작 규칙만 될 수도 있습니다(예: “가족 여행 계획 방법”). 이 경우 shortcuts: []를 사용합니다.

에이전트는 요청 시 스킬을 생성하고 관리할 수 있습니다 — *“조명을 제어하는 스킬을 만들어줘”*라고 요청하면 .md 파일을 작성해줍니다. 새로 작성되고 편집된 스킬은 항상 당신의 사용자 레이어(data/user/skills/)에 저장되므로, 프레임워크 업데이트가 절대 덮어쓰지 않습니다. 아래의 에이전트 커스터마이징 섹션을 참조하세요.

Mac 서버에서 단축어 실행하기
#

스킬에 target: mac이 설정되어 있으면, 단축어는 iOS 기기로 전송되는 대신 shortcuts run CLI를 통해 Mac 서버에서 조용히 실행됩니다. 이는 iCloud로 동기화되는 콘텐츠(노트, 미리 알림, 캘린더 이벤트)를 생성하는 작업에 이상적입니다 — PocketHook 앱이 아무 작업도 하지 않아도 결과가 모든 기기에 자동으로 동기화되기 때문입니다.

작동 방식:

  1. 에이전트가 단축어를 실행해야 한다고 결정합니다(예: “오늘 회의 노트로 메모 만들기”)
  2. 서버는 PocketHook iOS가 사용하는 것과 동일한 래퍼 형식을 사용하여, 데이터를 stdin에 JSON으로 전달하며 shortcuts run "shortcutName"을 호출합니다
  3. sync_app이 설정된 경우, 서버는 해당 앱을 잠시 백그라운드에서 열어(open -gj -a Notes) iCloud 동기화를 강제한 뒤 5초 후에 닫습니다
  4. 사용자는 채팅에서 확인 메시지를 받습니다. 단축어 자체는 기기로 전송되지 않습니다

요구 사항:

  • 서버는 macOS에서 실행되어야 합니다 — shortcuts run은 macOS 전용입니다. 다른 플랫폼에서는 서버가 경고를 로그에 남기고 기기 실행으로 폴백합니다
  • 단축어는 서버 Mac의 Shortcuts.app에 설치되어 있어야 합니다
  • 단축어는 입력으로 Dictionary를 기대해야 합니다(PocketHook은 데이터를 { context, timestamp, app, data }로 래핑합니다)

target: mac을 사용할 때:

  • iCloud 동기화 작업(Notes, Reminders, Calendar) — 결과가 어차피 모든 기기에 도달합니다
  • iOS 기기에서 분리하고 싶은 장기 실행 처리
  • iPhone UI와 상호작용할 필요가 없는 모든 단축어

target: device(기본값)를 유지할 때:

  • iPhone 전용 기능(카메라, 정확한 위치, 로컬 앱 자동화)이 필요한 단축어
  • 사용자에게 대화형 입력을 요청하는 단축어
  • iOS 전용 앱의 App Intents를 사용하는 단축어

백그라운드 작업
#

에이전트에게 작업을 스케줄링하도록 요청하면 나머지는 알아서 처리합니다:

  • “매일 아침 8시에 날씨를 확인하고 노트를 만들어줘”
  • “이 스크립트를 매시간 실행해줘”
  • “30분 후에 이메일 확인하라고 알려줘”

작업은 cron 표현식(0 8 * * *)과 간단한 간격(30m, 1h, 2d)을 지원합니다. 결과는 PocketHook이 /jobs 엔드포인트를 폴링할 때 전달됩니다.

두 가지 실행 유형:

  • Shell — bash 명령을 실행하고 출력을 캡처. 완료 시 단축어 트리거 가능
  • Prompt — 전체 도구 접근 권한을 가진 AI 에이전트가 처리하고, 완전한 PocketHook 응답을 저장

개발 서버
#

에이전트가 워크스페이스에 웹 프로젝트(Hugo, Astro, Next.js, Flask, Go 등)를 만들면, 적극적으로 서빙을 제안합니다:

  • 프리뷰 — 자동 할당 포트에서 로컬 개발 서버를 시작하여 빠른 확인
  • 퍼블릭 — 서버를 시작하고 HTTPS 터널로 공개하여 어디서든 접근 가능

에이전트가 라이프사이클을 관리합니다: 시작, 중지, 실행 중인 서버 목록. 메인 서버가 중지되면 모든 서버가 정리됩니다.

터널 계약
#

에이전트가 터널 노출을 요청하여 서버를 시작할 때, 런타임은 이를 강제합니다: 터널 도구(Tailscale, ngrok, cloudflared)가 설치되어 있지 않으면 서버는 시작을 거부합니다. 스폰 후 터널 설정이 실패하면 고아 프로세스는 중지되고 에이전트에게 명시적으로 알려집니다 — 에이전트가 프리뷰 모드로 폴백하거나 당신에게 터널 설치를 요청할 수 있도록 말입니다. 터널링이 활성화되어 있으면 반환되는 URL은 항상 터널 URL이며, 로컬 URL은 호스트 전용이라는 참고사항이 함께 제공됩니다.

안전망으로서, 모든 respond_* 도구는 자신의 메시지를 후처리합니다: 답장에 슬쩍 들어간 localhost127.0.0.1 URL은, 관리 중인 서버에 대응하는 터널 URL이 있다면 자동으로 재작성됩니다. 재작성할 수 없는 경우, 깨진 링크가 당신의 폰에 도달하는 대신 로그에 경고가 남습니다.

대시보드
#

/dashboard의 내장 웹 대시보드는 백그라운드 작업의 실시간 개요를 보여줍니다.

설계상 인증 없음. /dashboard/api/jobs는 모두 열린 GET 엔드포인트입니다 — 호스트에 도달할 수 있는 사람은 누구나 작업 목록을 볼 수 있습니다. 네트워크 계층에서 접근을 제한하거나(Tailscale ACL, 방화벽, basic auth가 적용된 리버스 프록시) 필요하지 않다면 DASHBOARD=false로 설정하세요. PocketHook iOS 앱은 이 엔드포인트들을 사용하지 않습니다.

완전히 커스터마이징 가능합니다:

  • 빠른 편집 — 간단한 커스터마이징은 workspace/dashboard/dashboard.html 배치
  • 풀 프로젝트workspace/dashboard/에 프레임워크 프로젝트(Svelte, React, Vue 등) 생성, dist/에 빌드 출력

에이전트에게 대시보드 커스터마이징을 요청하면 처리해줍니다 — 각 사용자가 고유하고 개인화된 대시보드를 얻습니다.

커스텀 도구
#

에이전트는 CLI 도구를 설치하고 새로운 기능으로 등록할 수 있습니다 — 서버 코드를 수정하지 않고 스스로를 확장합니다.

예를 들어, *“Playwright를 설치하고 스크린샷을 찍는 데 사용해줘”*라고 말해보세요. 에이전트는:

  1. 의존성 설치
  2. 도구 정의(간단한 .md 파일) 생성
  3. 이후 대화에서 새 도구 사용

커스텀 도구는 핫 리로드됩니다 — 재시작 불필요. .md 파일을 삭제하면 도구가 제거됩니다.

버전 관리
#

모든 사용자 데이터는 자동으로 버전 관리됩니다:

  • 워크스페이스 파일workspace/ 내 로컬 git 저장소로 추적. 모든 쓰기마다 자동 커밋. 에이전트에게 *“마지막 변경을 취소해줘”*라고 요청하거나 수동으로 git revert HEAD 사용
  • 설정 파일config/agent-instructions.md, config/personality.md, skills/, permissions.json은 수정 전 백업. 파일당 최대 20개 버전

git은 선택 사항입니다 — 설치되지 않으면 워크스페이스 변경이 버전 관리되지 않습니다. 설정 백업은 항상 작동합니다.

에이전트 커스터마이징
#

에이전트 서버는 최소한의 프레임워크 베이스와 함께 제공되며, 그 위에 당신만의 커스터마이징을 레이어로 쌓기를 기대합니다. 런타임이 둘을 분리해 두기 때문에 프레임워크 업데이트가 당신의 작업을 덮어쓰지 않습니다.

프레임워크 vs 사용자
#

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/로 갑니다. 이 디렉토리는 앞으로 프레임워크 릴리스가 당신이 설치한 것들을 덮어쓰지 않고 선택적인 내장 도구를 제공할 수 있도록 예약되어 있습니다. 그렇게 되더라도 도구 이름 충돌 시에는 당신의 사용자 레이어 파일이 우선하므로 마이그레이션할 것이 없습니다.

네 가지 커스터마이징 방법
#

변경하고 싶은 것위치
단축어 또는 동작 스킬data/user/skills/<name>.md“내 운동을 기록하는 스킬을 만들어줘”
에이전트 기능으로 래핑된 CLI 도구data/user/custom-tools/<name>.md“ffmpeg를 설치해서 변환에 쓸 수 있게 해줘”
글로벌 규칙(“항상 영어로 답장”, “테이블은 쓰지 마”)data/user/instructions.md“이제부터 기사들은 항상 3개의 불릿으로 요약해줘”
스킬이 참조하는 타입드 기본값data/user/prefs.json“내 기본 경로 출발지는 마드리드야”{"routeOrigin": "Madrid"}

이 파일들을 직접 작성할 필요는 전혀 없습니다. 에이전트에게 원하는 바를 말하기만 하면 알맞은 레이어를 자동으로 선택합니다.

{{prefs.*}}로 타입드 환경설정
#

기본 출발지를 알아야 하는 경로 플래너 스킬을 작성한다고 합시다. “Madrid"를 스킬에 하드코딩하는 대신 pref를 참조하세요:

- **출발지**: {{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(필수)LLM 프로바이더 API 키
LLM_PROVIDERanthropic프로바이더 이름
LLM_MODELclaude-sonnet-4-20250514모델 ID
LLM_REASONINGoff추론 노력: off, minimal, low, medium, high, xhigh. 더 높은 레벨은 숨겨진 사고 토큰을 추가합니다(느려지고 더 비쌈). 지원하지 않는 모델에서는 무시
PORT3000서버 포트
AGENT_NAMEPocketHook Assistant에이전트 표시 이름
MAX_HISTORY50단기 기억의 메시지 수
MAX_RECALL5시맨틱 회상으로 턴당 반환되는 메모리 수(VECTOR_MEMORY=true인 경우에만)
SESSION_TTL_MINUTES60세션 만료
VECTOR_MEMORYfalse시맨틱 메모리 활성화(임베딩 프로바이더 필요)
EMBEDDING_PROVIDERollama임베딩 프로바이더: ollama, lm-studio, 또는 openai
EMBEDDING_MODELnomic-embed-text임베딩 모델 이름
EMBEDDING_URL(자동)임베딩 API URL
EMBEDDING_API_KEYOpenAI 임베딩용 API 키
LOG_LEVELinfo로그 레벨: debug, info, warn, error
RATE_LIMIT_MAX30윈도우당 최대 요청 수
DASHBOARDtrue웹 대시보드 활성화(/dashboard 라우트)
INSTANCE_NAME(프로젝트 디렉토리 이름에서 pockethook- 제거)시스템 서비스 레이블, 로그 디렉토리, 프로세스 매칭에 사용되는 접미사. 같은 머신에서 여러 체크아웃을 실행할 때는 명시적으로 설정

전체 설정 레퍼런스는 GitHub 저장소를 참조하세요.

서비스로 실행
#

자동 시작되는 영구 서비스로 설치:

bun run service install
플랫폼백엔드서비스 위치
macOSlaunchd~/Library/LaunchAgents/com.pockethook.${INSTANCE_NAME}.plist
Linuxsystemd (사용자)~/.config/systemd/user/pockethook-${INSTANCE_NAME}.service
WindowsNSSMWindows Service Manager의 PocketHook-${PascalCase(INSTANCE_NAME)}

INSTANCE_NAME의 기본값은 프로젝트 디렉토리 이름에서 pockethook- 접두사를 제거한 것입니다(예: pockethook-agent-server/의 체크아웃은 agent-server가 됩니다). 같은 머신에서 충돌 없이 여러 체크아웃을 실행하려면 명시적으로 설정하세요 — 각 인스턴스는 자체 data/와 로그를 유지합니다.

bun run service status, restart, stop, uninstall로 관리합니다.

보안
#

  • HTTPS 필수 — PocketHook은 모든 URL에 HTTPS를 강제
  • Bearer 토큰 인증 — 앱과 서버 간 공유 시크릿
  • 속도 제한 — 토큰별 제한으로 남용 방지
  • 샌드박스 도구 — 셸 명령과 파일 접근은 권한으로 제한
  • 차단 패턴 — 위험한 명령(sudo, rm -rf /)은 기본적으로 차단
  • 작업 디렉토리 경계 — 에이전트는 지정된 디렉토리를 벗어날 수 없음
  • 민감한 파일 보호.env, .git, *.key, *.pem은 에이전트 접근에서 차단
  • 자동 버전 관리 — 모든 워크스페이스 변경은 쉬운 롤백을 위해 git으로 추적