Files
pocketpaw/docs/docs-config.json
Prakash Dalai 01fe314afa feat(cloud): Projects entity + snapshot scheduler for Mission Control (#1114)
* feat(cloud): add Projects entity, scheduler wiring, and project_id refs

Adds the Projects entity (workspace > project > pocket/task/cycle) as a
Linear-style scoping primitive, threads optional project_id through the
existing Pocket / Task / Cycle entities, and wires an opt-in in-process
daily-snapshot scheduler for the burnup chart.

Project entity:
- 4-file shape under ee/cloud/projects/ matching pockets canonical.
- Beanie ProjectDocument indexed on (workspace, status).
- ProjectCreated / ProjectUpdated / ProjectArchived / ProjectDeleted
  realtime events.
- Soft-archive (idempotent) + hard-delete with cascade soft-unassign on
  Pockets, Tasks, and Cycles in the same workspace. Children keep their
  data; only the project_id reference clears.
- import-linter contract entry forbids non-service.py imports of the
  project Beanie doc.

project_id wired into siblings:
- Pockets, Tasks, Cycles all carry an optional project_id (default None
  preserves existing rows).
- Each entity validates a supplied project_id against the current
  workspace before write.
- list endpoints accept ?project_id=<id> (empty string filters for the
  Mission Control "Unassigned" bucket).
- Mission Control facade threads project_id through the visible-pocket
  set so Nudges inherit their parent pocket's project assignment.

Scheduler:
- ee.cloud.cycles.scheduler runs an asyncio loop that sleeps until the
  next UTC midnight then calls snapshot_all_active() for every workspace
  with at least one active cycle.
- Gated on POCKETPAW_CLOUD_SCHEDULER_ENABLED=true so test runs and dev
  shells don't spawn a background task. Production hosts that prefer
  external cron / Kubernetes CronJob / Celery beat keep the flag unset
  and dispatch the same callable from their platform scheduler.
- POST /cycles/{id}/snapshot manually triggers today's snapshot for
  testing and onboarding. Idempotent within a UTC day.
- list_active_workspace_ids helper exposed on cycles.service so the loop
  doesn't need direct Beanie access.

Tests (78 new + adjacent passing):
- test_projects_service.py: CRUD, tenant isolation, archive idempotence,
  cascade unassign on delete.
- test_projects_router.py: HTTP smoke + tenancy.
- test_cycles_snapshot_scheduler.py: manual trigger + idempotence,
  workspace discovery, scheduler start/stop wiring.
- test_mission_control_project_filter.py: project_id narrows the
  visible-pocket set on the items feed.

import-linter: 13 contracts kept (Projects added, all others unchanged).

* docs(advanced): add Mission Control (Cloud) operator console page

The existing /advanced/mission-control page describes the local
multi-agent orchestration framework (file-based JSON storage, single
process). This new page covers the cloud SaaS surface: workspace-scoped
REST API + MongoDB-backed entities served by ee/cloud/.

The page opens with a callout flagging the distinction so readers landing
from search don't conflate the two. It then walks through the
vocabulary (Tray, Pawprints, Snags, Projects, Cycles), the
Workspace > Project > Pocket > Cycle/Task hierarchy, the WorkItem shape,
the REST endpoint inventory across mission_control / tasks / cycles /
projects, the SSE event surface, and the scheduler wiring options
(in-process opt-in vs external cron).

Sidebar entry added to docs-config.json under Advanced, just below the
existing Mission Control entry, with a cloud-themed lucide:cloud icon.

* fix(projects): abort delete if cascade-unassign fails

The previous _unassign_project swallowed every exception per child and
let agent_delete proceed to drop the project row. If the pockets, tasks,
or cycles bulk-update failed (transient mongo error, version mismatch),
the project was gone while its children kept dangling project_id values
that resolved to nothing — only fixable by hand in mongo.

Narrow the except to ImportError (the lazy-import degrade for forks
that ship without a child entity) and let everything else propagate. A
failed cascade now aborts the delete with the children still attached,
so the caller can retry safely.

New test test_delete_aborts_if_cascade_unassign_fails monkeypatches the
tasks unassign helper to raise, asserts agent_delete raises, and
verifies the project row survives.

Addresses pocketpaw#1114 review.

* fix(mission-control): façade now composes Tasks alongside Nudges

The Mission Control items endpoint only queried Instinct (Nudges).
Any Task created via POST /api/v1/tasks landed in Mongo but never
surfaced in GET /mission-control/items. Operators creating work via
the new modal saw their task disappear from the feed on every refresh
even though the backend returned a valid Task id with status
"in_progress".

Smoke-test trace that surfaced it:
  [NewWorkItemModal] created OK { id: 6a08…, status: in_progress }
  [MissionControl] onCreated → refreshing feed
  [WorkFeed] listWorkItems → 0 items {}

agent_list_work_items now:

- Pulls Tasks via tasks_service.agent_list_tasks (lazy import keeps
  the façade installable on forks without the Tasks entity, matching
  the projects/_unassign_project pattern).
- Drops the early `if not visible: return []` — that gated the whole
  feed on pocket visibility, which is correct for Instinct Nudges
  (pocket-scoped) but wrong for Tasks (workspace-scoped, may have
  null/empty pocket_id).
- Projects each Task into a WorkItem via the new _task_to_work_item
  helper. Status mapping: proposed → IN_PROGRESS, in_progress →
  IN_PROGRESS, awaiting_approval → AWAITING_APPROVAL, done → DONE,
  reverted → REJECTED, failed → FAILED, blocked → BLOCKED. Section
  routing: agent in-flight → AGENTS, terminal → PAWPRINTS/SNAGS,
  everything else → TRAY.
- ID prefix matches the convention the bulk endpoints already
  expect: `task:<id>` for Tasks, `nudge:<id>` for Actions.

Test changes:

- New regression test_includes_tasks_alongside_nudges proves a Task
  surfaces in the items list AND keeps surfacing when the workspace
  has no visible pockets (the empty-string pocket case from the
  captain's smoke test).
- Three existing autouse fixtures stub agent_list_tasks to [] so
  Instinct-only test files don't need a Beanie test DB. Tests that
  exercise the Tasks branch override the stub.

All 57 MC + projects + cycles tests pass; ruff clean.
2026-05-16 22:08:12 +05:30

950 lines
29 KiB
JSON

{
"metadata": {
"name": "PocketPaw",
"description": "Self-hosted AI agent with a native desktop app. Controlled via Telegram, Discord, Slack, WhatsApp, or a web dashboard.",
"url": "https://pocketpaw.xyz",
"version": "1.0.0"
},
"branding": {
"favicon": "/paw.webp",
"logo": {
"light": "/paw.webp",
"dark": "/paw.webp",
"href": "/"
},
"colors": {
"primary": "#0A84FF",
"secondary": "#4a6fa5",
"accent": "#d49a5c",
"background": "#f9f8f6",
"text": "#1a1a2e"
},
"fonts": {
"body": "Plus Jakarta Sans",
"code": "JetBrains Mono"
}
},
"theme": {
"mode": "auto",
"defaultDark": false,
"primaryColor": "#0A84FF",
"accentColor": "#d49a5c"
},
"navigation": {
"navbar": {
"links": [
{
"label": "Docs",
"href": "/introduction"
},
{
"label": "Guides",
"type": "dropdown",
"items": [
{
"label": "Self-Host an AI Agent",
"href": "/guides/self-host-ai-agent",
"description": "Run your own AI assistant on a laptop or server"
},
{
"label": "Telegram AI Bot",
"href": "/guides/telegram-ai-bot",
"description": "Build a personal AI bot on Telegram in 5 minutes"
},
{
"label": "Discord AI Bot",
"href": "/guides/discord-ai-bot",
"description": "Add AI to your Discord server with slash commands"
},
{
"label": "Run AI with Ollama",
"href": "/guides/local-llm-agent",
"description": "Free, private AI using local models, no API key"
},
{
"label": "All Guides",
"href": "/guides",
"description": "Browse all tutorials and walkthroughs"
}
]
},
{
"label": "Reference",
"type": "dropdown",
"items": [
{
"label": "Channels",
"href": "/channels",
"description": "Connect to 9+ messaging platforms"
},
{
"label": "Integrations",
"href": "/integrations",
"description": "Gmail, Calendar, Drive, Spotify, and more"
},
{
"label": "Tools",
"href": "/tools",
"description": "50+ built-in tools and custom tool creation"
},
{
"label": "API Reference",
"href": "/api",
"description": "REST and WebSocket APIs"
}
]
}
],
"social": {
"github": {
"href": "https://github.com/pocketpaw/pocketpaw",
"showStars": true
},
"discord": {
"href": "https://discord.gg/asRrtm95Zc"
}
},
"cta": {
"label": "Get Started",
"href": "/getting-started/installation"
}
},
"anchors": [
{
"label": "Documentation",
"href": "/introduction",
"icon": "lucide:book-open",
"groups": ["Introduction", "Getting Started", "Guides", "Core Concepts", "Desktop Client", "Channels", "Agent Backends", "Tools", "Integrations", "Security", "Memory", "Advanced", "Deployment"]
},
{
"label": "API Reference",
"href": "/api",
"icon": "lucide:code",
"color": "#3b82f6",
"groups": ["API Reference"]
},
{
"label": "llms.txt",
"href": "/llms.txt",
"icon": "lucide:bot",
"color": "#10b981"
}
],
"sidebar": [
{
"label": "Introduction",
"items": [
{
"label": "Welcome",
"href": "/introduction",
"icon": "lucide:home"
},
{
"label": "Why PocketPaw?",
"href": "/introduction/why-pocketpaw",
"icon": "lucide:sparkles"
}
]
},
{
"label": "Getting Started",
"items": [
{
"label": "Installation",
"href": "/getting-started/installation",
"icon": "lucide:download"
},
{
"label": "Quick Start",
"href": "/getting-started/quick-start",
"icon": "lucide:rocket"
},
{
"label": "CLI Reference",
"href": "/getting-started/cli",
"icon": "lucide:terminal"
},
{
"label": "Configuration",
"href": "/getting-started/configuration",
"icon": "lucide:settings"
},
{
"label": "Project Structure",
"href": "/getting-started/project-structure",
"icon": "lucide:folder-tree"
}
]
},
{
"label": "Guides",
"items": [
{
"label": "Overview",
"href": "/guides",
"icon": "lucide:compass"
},
{
"label": "Self-Host an AI Agent",
"href": "/guides/self-host-ai-agent",
"icon": "lucide:server"
},
{
"label": "Build a Telegram AI Bot",
"href": "/guides/telegram-ai-bot",
"icon": "lucide:send"
},
{
"label": "Discord AI Bot",
"href": "/guides/discord-ai-bot",
"icon": "lucide:gamepad-2"
},
{
"label": "Run AI with Ollama",
"href": "/guides/local-llm-agent",
"icon": "lucide:hard-drive"
},
{
"label": "AI Agents vs Chatbots",
"href": "/guides/ai-agent-vs-chatbot",
"icon": "lucide:scale"
}
]
},
{
"label": "Desktop Client",
"items": [
{
"label": "Overview",
"href": "/desktop-client",
"icon": "lucide:monitor"
},
{
"label": "Installation",
"href": "/desktop-client/installation",
"icon": "lucide:download"
},
{
"label": "Development",
"href": "/desktop-client/development",
"icon": "lucide:code"
},
{
"label": "API Server (serve)",
"href": "/desktop-client/api-server",
"icon": "lucide:server"
}
]
},
{
"label": "Core Concepts",
"items": [
{
"label": "Architecture",
"href": "/concepts/architecture",
"icon": "lucide:layers"
},
{
"label": "Message Bus",
"href": "/concepts/message-bus",
"icon": "lucide:arrow-left-right"
},
{
"label": "Agent Loop",
"href": "/concepts/agent-loop",
"icon": "lucide:repeat"
},
{
"label": "Health Engine",
"href": "/concepts/health-engine",
"icon": "lucide:activity"
},
{
"label": "Memory System",
"href": "/concepts/memory-system",
"icon": "lucide:brain"
},
{
"label": "Tool System",
"href": "/concepts/tool-system",
"icon": "lucide:wrench"
},
{
"label": "LLM Providers & Models",
"href": "/concepts/llm-providers",
"icon": "lucide:cpu"
},
{
"label": "Security Model",
"href": "/concepts/security-model",
"icon": "lucide:shield"
},
{
"label": "Command Centers",
"href": "/concepts/command-centers",
"icon": "lucide:layout-dashboard"
},
{
"label": "PocketPaw vs OpenClaw",
"href": "/concepts/vs-openclaw",
"icon": "lucide:scale"
}
]
},
{
"label": "Channels",
"items": [
{
"label": "Overview",
"href": "/channels",
"icon": "lucide:radio"
},
{
"label": "Web Dashboard",
"href": "/channels/web-dashboard",
"icon": "lucide:layout-dashboard"
},
{
"label": "Telegram",
"href": "/channels/telegram",
"icon": "lucide:send"
},
{
"label": "Discord",
"href": "/channels/discord",
"icon": "lucide:gamepad-2"
},
{
"label": "Slack",
"href": "/channels/slack",
"icon": "lucide:hash"
},
{
"label": "WhatsApp",
"href": "/channels/whatsapp",
"icon": "lucide:message-circle"
},
{
"label": "Signal",
"href": "/channels/signal",
"icon": "lucide:lock"
},
{
"label": "Matrix",
"href": "/channels/matrix",
"icon": "lucide:grid-3x3"
},
{
"label": "Microsoft Teams",
"href": "/channels/teams",
"icon": "lucide:users"
},
{
"label": "Google Chat",
"href": "/channels/google-chat",
"icon": "lucide:message-square"
}
]
},
{
"label": "Agent Backends",
"items": [
{
"label": "Overview",
"href": "/backends",
"icon": "lucide:cpu"
},
{
"label": "Claude Agent SDK",
"href": "/backends/claude-sdk",
"icon": "lucide:sparkles"
},
{
"label": "OpenAI Agents SDK",
"href": "/backends/openai-agents",
"icon": "lucide:brain"
},
{
"label": "Google ADK",
"href": "/backends/google-adk",
"icon": "lucide:hexagon"
},
{
"label": "Codex CLI",
"href": "/backends/codex-cli",
"icon": "lucide:code"
},
{
"label": "OpenCode",
"href": "/backends/opencode",
"icon": "lucide:server"
},
{
"label": "Copilot SDK",
"href": "/backends/copilot-sdk",
"icon": "lucide:github"
},
{
"label": "Deep Agents",
"href": "/backends/deep-agents",
"icon": "lucide:workflow"
},
{
"label": "Ollama (Local LLMs)",
"href": "/backends/ollama",
"icon": "lucide:hard-drive"
}
]
},
{
"label": "Tools",
"items": [
{
"label": "Overview",
"href": "/tools",
"icon": "lucide:wrench"
},
{
"label": "Web Search",
"href": "/tools/web-search",
"icon": "lucide:search"
},
{
"label": "Image Generation",
"href": "/tools/image-generation",
"icon": "lucide:image"
},
{
"label": "Voice & TTS",
"href": "/tools/voice-tts",
"icon": "lucide:volume-2"
},
{
"label": "Speech to Text",
"href": "/tools/speech-to-text",
"icon": "lucide:mic"
},
{
"label": "Research",
"href": "/tools/research",
"icon": "lucide:book-open"
},
{
"label": "OCR",
"href": "/tools/ocr",
"icon": "lucide:scan"
},
{
"label": "Browser Automation",
"href": "/tools/browser",
"icon": "lucide:globe"
},
{
"label": "Delegation",
"href": "/tools/delegation",
"icon": "lucide:git-branch"
},
{
"label": "Skill Generator",
"href": "/tools/skill-generator",
"icon": "lucide:wand-2"
},
{
"label": "Desktop",
"href": "/tools/desktop",
"icon": "lucide:monitor"
},
{
"label": "Session Tools",
"href": "/tools/sessions",
"icon": "lucide:history"
},
{
"label": "Tool Policy",
"href": "/tools/tool-policy",
"icon": "lucide:shield-check"
},
{
"label": "Custom Tools",
"href": "/tools/custom-tools",
"icon": "lucide:puzzle"
}
]
},
{
"label": "Integrations",
"items": [
{
"label": "Overview",
"href": "/integrations",
"icon": "lucide:plug"
},
{
"label": "OAuth Framework",
"href": "/integrations/oauth",
"icon": "lucide:key"
},
{
"label": "Gmail",
"href": "/integrations/gmail",
"icon": "lucide:mail"
},
{
"label": "Google Calendar",
"href": "/integrations/calendar",
"icon": "lucide:calendar"
},
{
"label": "Google Drive",
"href": "/integrations/google-drive",
"icon": "lucide:hard-drive"
},
{
"label": "Google Docs",
"href": "/integrations/google-docs",
"icon": "lucide:file-text"
},
{
"label": "Google Workspace (MCP)",
"href": "/integrations/google-workspace-mcp",
"icon": "lucide:briefcase"
},
{
"label": "Spotify",
"href": "/integrations/spotify",
"icon": "lucide:music"
},
{
"label": "Reddit",
"href": "/integrations/reddit",
"icon": "lucide:message-circle"
},
{
"label": "MCP Servers",
"href": "/integrations/mcp-servers",
"icon": "lucide:server"
},
{
"label": "A2A Protocol",
"href": "/integrations/a2a-protocol",
"icon": "lucide:network"
}
]
},
{
"label": "Security",
"items": [
{
"label": "Overview",
"href": "/security",
"icon": "lucide:shield"
},
{
"label": "Guardian AI",
"href": "/security/guardian-ai",
"icon": "lucide:shield-alert"
},
{
"label": "Injection Scanner",
"href": "/security/injection-scanner",
"icon": "lucide:scan-line"
},
{
"label": "Audit Log",
"href": "/security/audit-log",
"icon": "lucide:file-check"
},
{
"label": "Security Audit CLI",
"href": "/security/audit-cli",
"icon": "lucide:terminal"
},
{
"label": "Self-Audit Daemon",
"href": "/security/self-audit-daemon",
"icon": "lucide:activity"
},
{
"label": "PII Detection",
"href": "/security/pii-masking",
"icon": "lucide:user-x"
},
{
"label": "Streaming Redaction",
"href": "/security/streaming-redaction",
"icon": "lucide:eye-off"
}
]
},
{
"label": "Memory",
"items": [
{
"label": "Overview",
"href": "/memory",
"icon": "lucide:brain"
},
{
"label": "File Store",
"href": "/memory/file-store",
"icon": "lucide:database"
},
{
"label": "Mem0 Integration",
"href": "/memory/mem0",
"icon": "lucide:sparkles"
},
{
"label": "Sessions",
"href": "/memory/sessions",
"icon": "lucide:history"
},
{
"label": "Context Building",
"href": "/memory/context-building",
"icon": "lucide:layers"
},
{
"label": "Memory Isolation",
"href": "/memory/memory-isolation",
"icon": "lucide:shield"
}
]
},
{
"label": "Advanced",
"items": [
{
"label": "Model Router",
"href": "/advanced/model-router",
"icon": "lucide:route"
},
{
"label": "Plan Mode",
"href": "/advanced/plan-mode",
"icon": "lucide:list-checks"
},
{
"label": "Cron Scheduler",
"href": "/advanced/scheduler",
"icon": "lucide:clock"
},
{
"label": "Skills System",
"href": "/advanced/skills",
"icon": "lucide:wand-2"
},
{
"label": "Deep Work",
"href": "/advanced/deep-work",
"icon": "lucide:brain"
},
{
"label": "PawKit Reference",
"href": "/advanced/pawkit",
"icon": "lucide:package"
},
{
"label": "Mission Control",
"href": "/advanced/mission-control",
"icon": "lucide:radar"
},
{
"label": "Mission Control (Cloud)",
"href": "/advanced/mission-control-cloud",
"icon": "lucide:cloud"
},
{
"label": "Autonomous Messaging",
"href": "/advanced/autonomous-messaging",
"icon": "lucide:bell"
},
{
"label": "AGENTS.md",
"href": "/advanced/agents-md",
"icon": "lucide:file-text"
},
{
"label": "WebMCP",
"href": "/advanced/webmcp",
"icon": "lucide:globe"
},
{
"label": "Roadmap",
"href": "/advanced/roadmap",
"icon": "lucide:map"
}
]
},
{
"label": "API Reference",
"items": [
{
"label": "Overview",
"href": "/api",
"icon": "lucide:server"
},
{
"label": "Channels",
"items": [
{ "label": "Get Channel Status", "href": "/api/get-channels-status", "method": "GET" },
{ "label": "Save Channel Config", "href": "/api/post-channels-save", "method": "POST" },
{ "label": "Toggle Channel", "href": "/api/post-channels-toggle", "method": "POST" }
]
},
{
"label": "Sessions",
"items": [
{ "label": "List Sessions", "href": "/api/get-sessions", "method": "GET" },
{ "label": "Search Sessions", "href": "/api/get-sessions-search", "method": "GET" },
{ "label": "Delete Session", "href": "/api/delete-session", "method": "DELETE" },
{ "label": "Rename Session", "href": "/api/post-session-title", "method": "POST" },
{ "label": "Get Session History", "href": "/api/get-session-history", "method": "GET" }
]
},
{
"label": "MCP Servers",
"items": [
{ "label": "Get MCP Status", "href": "/api/get-mcp-status", "method": "GET" },
{ "label": "Add MCP Server", "href": "/api/post-mcp-add", "method": "POST" },
{ "label": "Remove MCP Server", "href": "/api/post-mcp-remove", "method": "POST" },
{ "label": "Toggle MCP Server", "href": "/api/post-mcp-toggle", "method": "POST" },
{ "label": "Test MCP Server", "href": "/api/post-mcp-test", "method": "POST" },
{ "label": "List MCP Presets", "href": "/api/get-mcp-presets", "method": "GET" },
{ "label": "Install MCP Preset", "href": "/api/post-mcp-preset-install", "method": "POST" },
{ "label": "MCP OAuth Callback", "href": "/api/get-mcp-oauth-callback", "method": "GET" }
]
},
{
"label": "Memory",
"items": [
{ "label": "List Memories", "href": "/api/get-memory-long-term", "method": "GET" },
{ "label": "Delete Memory", "href": "/api/delete-memory-entry", "method": "DELETE" },
{ "label": "Get Memory Settings", "href": "/api/get-memory-settings", "method": "GET" },
{ "label": "Update Memory Settings", "href": "/api/post-memory-settings", "method": "POST" },
{ "label": "Get Memory Stats", "href": "/api/get-memory-stats", "method": "GET" }
]
},
{
"label": "Security & Audit",
"items": [
{ "label": "Get Audit Logs", "href": "/api/get-audit-logs", "method": "GET" },
{ "label": "Run Security Audit", "href": "/api/post-security-audit", "method": "POST" },
{ "label": "List Audit Reports", "href": "/api/get-self-audit-reports", "method": "GET" },
{ "label": "Get Audit Report", "href": "/api/get-self-audit-report", "method": "GET" },
{ "label": "Trigger Self-Audit", "href": "/api/post-self-audit-run", "method": "POST" }
]
},
{
"label": "Authentication",
"items": [
{ "label": "Create Session Token", "href": "/api/post-auth-session", "method": "POST" },
{ "label": "Generate QR Code", "href": "/api/get-qr-code", "method": "GET" },
{ "label": "Regenerate Token", "href": "/api/post-token-regenerate", "method": "POST" },
{ "label": "Start OAuth Flow", "href": "/api/get-oauth-authorize", "method": "GET" }
]
},
{
"label": "Webhooks",
"items": [
{ "label": "List Webhooks", "href": "/api/get-webhooks", "method": "GET" },
{ "label": "Create Webhook", "href": "/api/post-webhooks-add", "method": "POST" },
{ "label": "Remove Webhook", "href": "/api/post-webhooks-remove", "method": "POST" },
{ "label": "Receive Payload", "href": "/api/post-webhook-inbound", "method": "POST" }
]
},
{
"label": "Deep Work",
"items": [
{ "label": "Start Project", "href": "/api/post-deep-work-start", "method": "POST" },
{ "label": "Get Plan", "href": "/api/get-deep-work-plan", "method": "GET" },
{ "label": "Approve Plan", "href": "/api/post-deep-work-approve", "method": "POST" },
{ "label": "Pause Project", "href": "/api/post-deep-work-pause", "method": "POST" },
{ "label": "Resume Project", "href": "/api/post-deep-work-resume", "method": "POST" },
{ "label": "Cancel Project", "href": "/api/post-deep-work-cancel", "method": "POST" },
{ "label": "Skip Task", "href": "/api/post-deep-work-skip-task", "method": "POST" },
{ "label": "Retry Task", "href": "/api/post-deep-work-retry-task", "method": "POST" }
]
},
{
"label": "Health",
"items": [
{ "label": "Get Health Status", "href": "/api/get-health-status", "method": "GET" },
{ "label": "Get Health Errors", "href": "/api/get-health-errors", "method": "GET" },
{ "label": "Run Health Check", "href": "/api/run-health-check", "method": "POST" },
{ "label": "Clear Health Errors", "href": "/api/clear-health-errors", "method": "DELETE" }
]
},
{
"label": "Mission Control",
"items": [
{ "label": "List Agents", "href": "/api/get-mc-agents", "method": "GET" },
{ "label": "Create Agent", "href": "/api/post-mc-agent", "method": "POST" },
{ "label": "List Tasks", "href": "/api/get-mc-tasks", "method": "GET" },
{ "label": "Create Task", "href": "/api/post-mc-task", "method": "POST" },
{ "label": "Run Task", "href": "/api/post-mc-run-task", "method": "POST" },
{ "label": "Get Standup", "href": "/api/get-mc-standup", "method": "GET" }
]
},
{
"label": "Agent Status",
"items": [
{ "label": "Get Agent Status", "href": "/api/get-agent-status", "method": "GET" },
{ "label": "Agent Status Stream", "href": "/api/get-agent-status-stream", "method": "GET" }
]
},
{
"label": "Tunnel",
"items": [
{ "label": "Get Tunnel Status", "href": "/api/get-tunnel-status", "method": "GET" },
{ "label": "Start Tunnel", "href": "/api/post-tunnel-start", "method": "POST" },
{ "label": "Stop Tunnel", "href": "/api/post-tunnel-stop", "method": "POST" }
]
},
{
"label": "WebSocket Protocol",
"href": "/api/websocket",
"icon": "lucide:radio"
},
{
"label": "Configuration Reference",
"href": "/api/configuration-reference",
"icon": "lucide:settings"
}
]
},
{
"label": "Deployment",
"items": [
{
"label": "Self-Hosting",
"href": "/deployment/self-hosting",
"icon": "lucide:server"
},
{
"label": "Docker",
"href": "/deployment/docker",
"icon": "lucide:container"
},
{
"label": "Discord Docker",
"href": "/deployment/discord-docker",
"icon": "lucide:gamepad-2"
},
{
"label": "Systemd Service",
"href": "/deployment/systemd",
"icon": "lucide:cog"
}
]
}
]
},
"seo": {
"ogImage": "/pocket-paw-og.webp",
"defaultAuthor": "PocketPaw Team",
"defaultKeywords": [
"ai agent",
"self-hosted ai",
"local ai assistant",
"multi-channel ai bot",
"telegram ai bot",
"discord ai bot",
"slack ai bot",
"whatsapp ai bot",
"claude agent sdk",
"openai agents",
"google adk",
"mcp servers",
"ai automation",
"pocketpaw",
"private ai",
"ai tools",
"multi-agent orchestration"
],
"enableJsonLd": true,
"organizationName": "PocketPaw",
"organizationLogo": "/paw.webp",
"articleType": "TechArticle",
"autoCanonical": true,
"enableBreadcrumbs": true,
"twitterHandle": "@pocketpaw_ai",
"twitterSite": "@pocketpaw_ai"
},
"search": {
"enabled": true,
"provider": "local",
"placeholder": "Search PocketPaw docs..."
},
"integrations": {
"editPage": {
"enabled": true,
"pattern": "https://github.com/pocketpaw/pocketpaw/edit/main/docs/{path}"
},
"lastUpdated": {
"enabled": true,
"format": "long"
},
"feedback": {
"enabled": true
},
"copyPage": {
"enabled": true
},
"llmsTxt": {
"enabled": true,
"title": "PocketPaw",
"description": "Self-hosted AI agent controlled via Telegram, Discord, Slack, WhatsApp, or a web dashboard. Multi-backend support (Claude, OpenAI, Google, Codex, Copilot), 50+ built-in tools, MCP servers, and extensible integrations."
}
},
"assets": {
"images": "_images",
"static": "_assets"
},
"landing": {
"type": "custom",
"source": "_landing",
"navbar": false,
"footer": false
},
"footer": {
"layout": "full",
"tagline": "Your AI agent, your rules. Self-hosted, multi-channel, infinitely extensible.",
"copyright": "\u00a9 {year} PocketPaw. All rights reserved.",
"showBranding": true,
"showVersion": true,
"socials": {
"github": "https://github.com/pocketpaw/pocketpaw",
"discord": "https://discord.gg/asRrtm95Zc"
},
"links": [
{
"title": "Documentation",
"items": [
{ "label": "Getting Started", "href": "/getting-started/installation" },
{ "label": "Guides & Tutorials", "href": "/guides" },
{ "label": "Architecture", "href": "/concepts/architecture" },
{ "label": "API Reference", "href": "/api" }
]
},
{
"title": "Features",
"items": [
{ "label": "Tools", "href": "/tools" },
{ "label": "Integrations", "href": "/integrations" },
{ "label": "Security", "href": "/security" },
{ "label": "Memory", "href": "/memory" }
]
},
{
"title": "Community",
"items": [
{ "label": "GitHub", "href": "https://github.com/pocketpaw/pocketpaw", "external": true },
{ "label": "Discord", "href": "https://discord.gg/asRrtm95Zc", "external": true },
{ "label": "Issues", "href": "https://github.com/pocketpaw/pocketpaw/issues", "external": true }
]
}
]
}
}