Current AgentLoop unconditionally observes into the process-global
default PocketPaw soul, so cloud chats with specific agents evolve
the wrong soul. Spec now routes soul observe + self-eval to the
target agent's SoulManager via AgentPool and gates the global
observe behind a per-run flag (default off in OSS).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Separate /cloud/chat/{scope}/{scope_id}/agent SSE endpoint with
scope-aware context (dm/group/pocket), pocket-scoped tools, ripple
pass-through, and WS broadcast of finished messages. Shares the
AgentLoop engine with OSS; /api/v1/chat.py stays untouched.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Rebuilt with improved compilation prompt — articles now include:
- Purpose and architectural context (why this module exists)
- Business logic explanations (not just method signatures)
- Authorization model details
- Design decisions and patterns
- System flow descriptions
38 articles, 504 concepts, 50,618 words, 33 linked.
Avg 1,332 words per article (up from 328).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
LLM-compiled wiki with 67 articles, 604 concepts, 22K words covering
the entire ee/cloud enterprise module. Generated by the standalone
knowledge-base package using AST analysis + Claude Haiku compilation.
Each article has: purpose, key classes/functions, authorization model,
dependencies, and backlinks to related modules. 528 cross-references
via import graph analysis.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove /api/qr and /api/v1/qr from exempt_paths in auth middleware so
the QR endpoint can no longer be hit without a valid session. Previously
any network-reachable client could GET /api/qr, decode the PNG, and
extract a fully valid 1-hour session token — a complete auth bypass
(OWASP A01 — Broken Access Control).
Changes:
- Remove /api/qr and /api/v1/qr from exempt_paths in dashboard_auth.py
- Reduce QR pairing token TTL from 1 hour to 60 seconds
- Add ttl_seconds param to create_session_token() for short-lived tokens
- Add audit log event on QR code generation
- Update v1 QR endpoint (/api/v1/auth.py) with matching fix
- Update tests: unauthenticated /api/qr now returns 401
- Update docs to reflect auth requirement
Fixes#854
Two gaps that blocked end-to-end demo credibility, now closed:
Gap 1: Real HTTP in DirectRESTAdapter
- execute() now makes actual httpx calls (GET/POST/PUT/PATCH/DELETE)
- Auth header building for api_key, bearer, basic methods
- LOCAL actions (CSV) skip HTTP gracefully
- Error handling for HTTP status errors and request failures
- 7 tests with mocked httpx
Gap 2: Agent tools for enterprise features
- fabric_query: search objects by type, traverse links
- fabric_create: define types, create objects, link objects
- fabric_stats: ontology statistics
- instinct_propose: agent proposes actions for human approval
- instinct_pending: check pending approval queue
- instinct_audit: query decision audit log
- All tools gracefully degrade when ee/ is not available
- 6 tests with mocked stores
The agent can now: query Fabric objects → reason about data →
propose actions via Instinct → humans approve in the UI.
The fuel line is connected.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Document MCP tool support via .mcp.json file discovery
(stdio, SSE, HTTP transports, trust model, Claude Code compat)
- Document ACP (Agent Communication Protocol) for IDE integration
- Note that MCP is file-based discovery, not programmatic via
create_deep_agent() - dashboard MCP config doesn't carry over
- Update comparison table to show MCP support
Add LangChain Deep Agents as a 7th agent backend, providing access to
the LangGraph ecosystem with built-in planning, subagent delegation,
and multi-provider LLM support via init_chat_model.
- New DeepAgentsBackend in agents/deep_agents.py with streaming support
- LangChain StructuredTool bridge in tool_bridge.py
- Registry entry, config fields, optional dep (pocketpaw[deep-agents])
- Dashboard settings UI (model + max turns)
- 16 new tests, full suite green (3491 passed)
- Add A2A Protocol section to System settings with toggle, agent name,
description, task timeout, and trusted agents list
- Wire frontend state, WebSocket save/load, and backend handler
- Add docs/integrations/a2a-protocol.mdx with full protocol docs
- Add A2A to sidebar nav and integrations overview card
- Add live smoke test script (scripts/test_a2a_live.py)
* feat(cli): add 10 new subcommands for local agent management
New CLI commands:
- doctor: full diagnostics with connectivity checks
- health: quick startup-only health check (no network)
- channels: list channel status, start/stop adapters via REST
- skills: list and search available skills
- sessions: list, delete, and search chat sessions
- memory: show stats and search long-term memories
- config: show (masked), set, validate, path
- errors: show recent errors with --limit and --search
- logs: show/tail audit log with --follow
All commands support --json for scripting. Refactored __main__.py
to subcommand-based parser while keeping full backwards compat
with existing flags (--doctor, --telegram, --discord, etc).
* docs: add new CLI subcommands to CLAUDE.md
* docs: add CLI reference page with all subcommands
New docs page at getting-started/cli covering all 15+ CLI commands
with usage examples, flags, and descriptions. Added to sidebar nav
after Quick Start.
* feat(discord): replace discord.py with discli subprocess adapter
Replace the direct discord.py library dependency with discord-cli-agent (discli),
a subprocess-based adapter that communicates via JSONL over stdin/stdout. This
gives the agent full Discord superpowers: reactions, threads, message search,
DMs, and channel management via the new DiscordCLITool.
- Rewrite DiscordAdapter as DiscliAdapter (subprocess bridge to discli serve)
- Add DiscordCLITool wrapping discli CLI for agent-initiated Discord actions
- Replace discord.py with discord-cli-agent in all pyproject.toml extras
- Update dependency checks in headless.py and dashboard_state.py
- Register discord_cli tool in builtin tools and tool policy
- Rewrite test suite for new adapter API (46 tests passing)
- Update deploy identity/instructions with new capabilities (reactions, threads, search)
* fix(tests): update extras install test for discord-cli-agent
Update test_check_installed_dep assertion from discord.py to
discord-cli-agent to match the dependency change.
* fix(tests): update extras install test for discli module name
* fix(tests): update media attachment tests for DiscliAdapter
* fix(discord): drain stderr and clean up process on startup failure
Two fixes for the dashboard showing stuck "starting" status:
1. Add _drain_stderr() task to continuously read discli's stderr pipe.
Without this, if discord.py logs warnings to stderr the pipe buffer
fills up and the process blocks, preventing the ready event from
being emitted on stdout.
2. Call _on_stop() before raising on startup timeout so the subprocess
and background tasks are properly cleaned up instead of leaking.
* feat(discord): add thread/poll to system prompt and tool description
- Add Discord section to default instructions with thread/poll examples
- Update DiscordCLITool description with thread create and poll create
- Mark /resume target param as optional
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat(discord): inject discord.md instructions when on Discord channel
- Create bootstrap/discord.md with full Discord capability docs
(messages, DMs, threads, polls, channels, roles, members, server)
- Context builder loads channel-specific instruction files and injects
them into the system prompt only when on that channel
- Inject discord_username and discord_guild_id from message metadata
so the LLM knows who it's talking to and can DM them
- Pass metadata through from agent loop to context builder
- Remove Discord section from default_provider.py (now in discord.md)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* chore: bump discord-cli-agent dependency to >=0.6.0
Requires v0.6.0 for the complete serve action registry
(threads, polls, DMs, channels, roles, members, server).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(discord): propagate bot token to parent env for CLI tool
DiscordCLITool spawns separate discli processes that need
DISCORD_BOT_TOKEN, but the token was only set in the serve
subprocess env. Now also sets it in os.environ so all child
processes (including discord_cli tool calls) inherit it.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: register DiscordCLITool in tools CLI dispatcher
discord_cli was missing from the CLI registry, so all agent calls
via `python -m pocketpaw.tools.cli discord_cli '...'` failed with
"Unknown tool". This is why the bot couldn't DM, create threads,
or do any Discord operations through the Claude SDK backend.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: background channel startup, CLI auth bypass, converse tests
- Dashboard: start slow adapters (Discord) in background so HTTP
response returns fast; frontend polls until running
- Claude SDK: skip API key check when claude CLI is available
(handles OAuth auth internally)
- Tests: add converse slash command enable/disable tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat(discord): add slash commands, user mentions, and admin-gate converse
Add rename/backend/model/tools/delete/backends slash commands to the
Discord adapter, include sender_id in context, document user mention
syntax (<@ID>), restrict /converse to admins, and update /help output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(security): patch command injection, temp leak, and deprecated API
- DiscordCLITool: replace create_subprocess_shell with
create_subprocess_exec + shlex.split to prevent shell injection
- Clean up slash config temp file on adapter stop
- Use asyncio.get_running_loop() instead of deprecated get_event_loop()
- Convert conversation_channel_ids from list to set
- Scope Claude CLI auth bypass to claude_code provider only
- Add is_admin to converse test events
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat(discord): MCP server, permission fix, and system prompt overhaul
- Add pocketpaw-discord MCP server that wraps discli, exposing Discord
operations (send messages, polls, threads, reactions, roles, etc.)
as native MCP tools for all backends (codex_cli, google_adk, etc.)
- Auto-register the MCP server when the Discord adapter starts
- Fix /converse permission check: accept Manage Server in addition to
Administrator, use interaction.permissions (Discord payload) instead
of guild_permissions (member cache) via discli 0.6.4
- Rewrite discord.md system prompt: hide internal tool names from users,
add context-based reaction guidance, keep responses conversational
- Fix [NO_RESPONSE] marker leaking through streaming responses
- Handle rate_limit_event from Anthropic API in stateless query path
- Update docs and CLAUDE.md for discli adapter and MCP integration
- Remove stale /allowchannel /allowuser references from dashboard UI
* fix(dependencies): update discord-cli-agent to version 0.6.4
* style: format discord_server and discord_adapter
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: add agent status API & CLI design
Design for GET /api/v1/agent/status endpoint, SSE stream, and
pocketpaw status CLI command. Exposes real-time agent state
(idle/thinking/tool_running/streaming/error) for external integrations.
* docs: add agent status API implementation plan
9-task plan covering StatusTracker, REST endpoint, SSE stream,
CLI command, auth, tests, and lifecycle wiring.
* feat: add agent status API, SSE stream, and CLI command
Adds a public status endpoint for external integrations (stream decks,
LED indicators, desktop widgets) to monitor PocketPaw agent state.
- GET /api/v1/agent/status returns global state (idle/active/degraded)
and per-session breakdown (thinking/tool_running/streaming/error)
- GET /api/v1/agent/status/stream pushes SSE events on state changes
- pocketpaw status CLI with --json and --watch flags
- Optional API key auth via POCKETPAW_STATUS_API_KEY / X-Status-Key
- StatusTracker subscribes to bus events, no internal coupling
- 22 tests covering state transitions, auth, and CLI formatting
* fix(tests): update router count to 24 and fix lint in test files
Update test_v1_routers_count assertion from 23 to 24 for the new
agent_status router. Reformat test files and fix UP038 lint error.
* fix: address review issues in agent status API
- Cache status API key to avoid Settings.load() on every request
- Add client disconnect detection in SSE stream loop
- Fix wait_for_change race condition with version-based tracking
- Wire response_model=AgentStatusResponse and fix schema alias mismatch
- Move lifecycle registration from module scope to startup_event
- Extract session title enrichment into dedicated method
- Update tests for new caching and version tracking
* fix: emit agent_start/end events, fix SSE stream spamming, add docs
- AgentLoop now emits agent_start before processing and agent_end on
completion/error so StatusTracker actually tracks sessions
- Skip redundant thinking notifications when state is already thinking
- Deduplicate SSE stream using state fingerprints (ignores timing fields)
- Increase SSE debounce from 200ms to 1s to coalesce rapid tool events
- Add API docs for GET /agent/status and GET /agent/status/stream
* feat: add LiteLLM provider support and unified env resolution
Add LiteLLM as a provider option for all backends (Claude SDK, OpenAI
Agents, Google ADK, Copilot SDK), enabling access to 100+ LLM providers
including HuggingFace, Ollama, vLLM, Together AI, Groq, Mistral, and
more through a single proxy or direct SDK integration.
Key changes:
- New config fields: litellm_api_base, litellm_api_key, litellm_model
- OpenAI Agents: native LitellmModel extension with proxy fallback
- Google ADK: LiteLlm model wrapper for cross-provider support
- Claude SDK: routes through LiteLLM proxy via ANTHROPIC_BASE_URL
- Copilot SDK: LiteLLM via OpenAI-compatible BYOK config
- resolve_backend_env() pushes unified POCKETPAW_* keys to env vars
each SDK expects, fixing the issue where switching backends required
manually reconfiguring environment variables
* fix: complete LiteLLM integration across dashboard, health checks, and WS
- Fix health check false warning: add 'litellm' to provider skip list
in check_api_key_primary() for Claude SDK, OpenAI Agents, and
Google ADK backends
- Add google_adk_provider to WS settings handler and broadcast
- Add litellm_api_base, litellm_api_key, litellm_model to WS handler
- Add 'LiteLLM (100+ Providers)' option to provider dropdowns in
settings UI for Claude SDK and OpenAI Agents backends
- Add LiteLLM config fields (proxy URL, API key, model) shown when
litellm provider is selected in the settings modal
* fix: add LiteLLM provider to Copilot SDK and Google ADK settings UI
- Add LiteLLM option to Copilot SDK provider dropdown
- Add provider dropdown to Google ADK settings (was missing entirely)
- Add LiteLLM config fields (proxy URL, API key, model) for Google ADK
when litellm provider is selected
* fix: sync env vars at runtime when API keys change via dashboard
resolve_backend_env() now accepts force=True to overwrite existing env
vars. Called after every settings/API-key save so backends immediately
see updated keys without a restart. Codex CLI subprocess gets an
explicit env snapshot via env=os.environ.copy().
* refactor: provider adapter pattern for LLM providers
Extract provider-specific logic (config resolution, client creation,
env var setup, error formatting) into adapter classes under
llm/providers/. Six adapters: Anthropic, Ollama, OpenAICompatible,
OpenRouter, Gemini, LiteLLM.
LLMClient delegates to adapters internally while keeping its public
API stable. Backends (OpenAI Agents, Google ADK, Copilot SDK) now use
adapters directly, replacing 70+ line if/elif chains with ~5 line
adapter calls. Adding a new provider means adding one adapter file
and registering it, no backend changes needed.
30 new tests for adapters, registry, model resolution, and LLMClient
delegation.
* fix: _stderr_lines UnboundLocalError and test_fast_path failures
Move _stderr_lines initialization before the try block so the except
handler can always access it. Add missing _HookMatcher and is_litellm
to test mocks.
* style: format test files and fix UP038 lint
* docs: add Discord deployment config with multi-provider support
Add Docker Compose, Dockerfile, env example, and identity files for
headless Discord bot deployment. Supports direct Anthropic, LiteLLM
proxy, OpenAI-compatible, and OpenAI Agents backends out of the box.
* chore: remove Discord deploy files (moved to separate PR #597)
Deploy config now lives under deploy/discord/ in the
deploy/discord-docker branch to keep this PR focused on
the provider adapter pattern and LiteLLM integration.
* fix: LiteLLM max_tokens setting, config persistence, and health recheck
- Add litellm_max_tokens config option so users can cap output tokens
for models like DeepSeek (8192 limit)
- Fix LiteLLM settings not persisting on reload: litellmApiBase,
litellmModel, litellmMaxTokens were missing from SETTINGS_MAP in
app.js, so the frontend never loaded them back from the server
- Also add 13 other missing backend settings to SETTINGS_MAP
(openaiAgentsModel, googleAdkProvider, codexCliModel, etc.)
- Re-run health checks after settings save so switching to LiteLLM
immediately clears the "no Anthropic API key" degraded warning
- Claude SDK fast-path respects provider max_tokens instead of
hardcoding 1024
* fix: LiteLLM proxy routing, adapter bugs, and remove plan docs
- Fix LiteLLM + OpenAI Agents: use OpenAI-compat proxy path when
base_url is set instead of native LitellmModel which tried to route
directly (causing Vertex AI credential errors)
- Fix operator precedence in _to_provider_config() base_url resolution
- Fix dashboard unable to clear LiteLLM API key (falsy vs None check)
- Fix fragile hasattr duck-typing in openai_agents, add explicit
provider == "litellm" guard
- Replace unnecessary getattr() with direct attribute access in
google_adk now that the field exists in Settings
- Pass api_key and base_url to ADK LiteLlm wrapper explicitly
- Remove plan design doc
* docs: add OpenRouter and LiteLLM provider documentation
- Add dedicated OpenRouter and LiteLLM sections to LLM providers guide
with configuration examples for proxy vs direct SDK mode
- Update backend compatibility matrix to include both new providers
- Update per-backend provider tables (Claude SDK, OpenAI Agents,
Google ADK, Copilot SDK) with LiteLLM and OpenRouter support
- Add OpenRouter and LiteLLM config fields to configuration reference
- Update getting-started configuration with OpenRouter and LiteLLM
environment variable examples
- Replace OpenRouter-only section in backends index with combined
OpenRouter + LiteLLM section
Add FUNDING.yml for the Sponsor button and funding.json for
the open source funding standard (FLOSS fund compatible).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace em dash with comma in FAQ JSON-LD answer text
- Fix POCKETPAW_ALLOWED_TELEGRAM_IDS to POCKETPAW_ALLOWED_USER_ID
(matches actual config.py field name, singular int not list)
Comprehensive SEO optimization across 80 documentation pages:
Title optimization (all pages):
- Replaced generic titles like "Architecture", "Discord", "Slack"
with search-intent titles like "PocketPaw Architecture: Event-Driven
Message Bus", "Discord Bot Setup: Add PocketPaw to Your Server"
- All titles now 50-70 characters with qualifying keywords
Meta descriptions:
- Expanded 7 short descriptions (under 145 chars) to 150-160 chars
- Roadmap description expanded from 76 to 196 chars
- Troubleshooting, Codex CLI, OpenCode, WebMCP all expanded
H1 heading fixes:
- Ensured single H1 per page matching the frontmatter title
- All H1 headings updated to match new optimized titles
Internal cross-links:
- Added Related CardGroup sections to 60+ individual pages
- Each links to 2-3 related pages within and across sections
- Channels link to channel guides, backends link to Ollama guide, etc.
Em dash cleanup:
- Replaced em dashes with colons, periods, or double hyphens
across multiple files in tools/, channels/, integrations/
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Restore the Channels/Integrations/Tools/API Reference links that were
removed when the Guides dropdown was added. Now two separate dropdowns
so both tutorials and reference docs are one click away.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5 SEO-targeted tutorial guides for long-tail keyword traffic:
- Self-host an AI agent on your laptop
- Build a Telegram AI bot in 5 minutes
- Add AI to your Discord server
- Run AI with Ollama (no API key)
- AI agents vs chatbots comparison
Landing page: FAQ section with FAQPage JSON-LD schema markup
(targets Google "People Also Ask" snippets).
Internal linking: cross-links from channels, backends, and
introduction pages back to relevant guides. Updated navbar
dropdown and footer with guide links.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- og:url and og:image pointed to pocketpaw.netlify.app, now pocketpaw.xyz
- JSON-LD softwareVersion was 0.1.0, now 0.4.7
- JSON-LD applicationCategory broadened to include Productivity and Utilities
- docs-config.json metadata URL was pocketpaw.com, now pocketpaw.xyz
- pyproject.toml Homepage now points to pocketpaw.xyz (not GitHub)
- pyproject.toml Documentation now points to pocketpaw.xyz/introduction
- Added footer links to /channels, /tools, /backends, /getting-started
- Updated all remaining dsc.gg/pocketpaw Discord links
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- og:url and og:image pointed to pocketpaw.netlify.app, now pocketpaw.xyz
- JSON-LD softwareVersion was 0.1.0, now 0.4.7
- JSON-LD applicationCategory broadened to include Productivity and Utilities
- docs-config.json metadata URL was pocketpaw.com, now pocketpaw.xyz
- pyproject.toml Homepage now points to pocketpaw.xyz (not GitHub)
- pyproject.toml Documentation now points to pocketpaw.xyz/introduction
- Added footer links to /channels, /tools, /backends, /getting-started
- Updated all remaining dsc.gg/pocketpaw Discord links
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: merge desktop client into monorepo under client/
Move the Tauri 2.0 + SvelteKit desktop client from the separate
pocketpaw-client repo into client/ to create a monorepo. Update
.gitignore with client build artifact ignores and add Desktop Client
section to CLAUDE.md.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(client): unignore client/src/lib and broaden node/sveltekit ignores
The root .gitignore `lib/` pattern was blocking client/src/lib/ from
being tracked. Anchor it to `/lib/` so only the root Python lib dir is
ignored. Also generalize node_modules/ and .svelte-kit/ patterns to
work at any depth.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(client): fix white OAuth screen on Windows
Load a local loading page first in the OAuth popup window, then
navigate to the external OAuth URL via eval(). WebView2 on Windows
may not be fully initialized when WebviewUrl::External is used
directly, resulting in a permanently white window.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(client): replace WebView OAuth popup with system browser + localhost server
WebView2 secondary windows fail to render on Windows (white/transparent screen).
Replace the OAuth popup with a temporary localhost HTTP server that captures the
callback, and open the authorize URL in the system browser instead.
Also pre-create sidepanel and quickask windows in tauri.conf.json (with
visible: false) so they initialize alongside the main window, avoiding the
same WebView2 rendering issue with dynamically-created transparent windows.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add multi-mode workspace client design
Design for transforming the desktop client into a full workspace IDE
with tabbed workspaces, tiling layout engine, pluggable widgets,
real-time agent collaboration, unified file management (local + remote
+ cloud), and responsive mobile support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add multi-mode workspace implementation plan
Detailed 6-phase implementation plan with ~49 new files across Rust
backend (fs commands, PTY, git, widget windows), SvelteKit frontend
(tiling layout, Monaco editor, file previews, widget system, terminal),
filesystem providers (local, remote, cloud), and co-work features.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: rewrite design as AI file explorer (Poly.app-inspired)
Complete redesign from VS Code-like IDE to file-explorer-first UI.
Primary interface is a visual file grid with rich thumbnails and
5 view modes (Icon, Grid, List, Column, Gallery). AI chat lives
in a collapsible right sidebar with folder/file context awareness.
Agent actions (create, edit, delete files) reflect in the grid
in real-time. Terminal output is inline in chat, not a separate panel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): add file explorer with list view, search/filter, and context menu
Implements a full file explorer with Rust-backed filesystem operations
(read, write, delete, rename, watch, thumbnails), multiple view modes
(icon grid + list table), inline search/filter, and an enhanced context
menu with rename, new folder, and keyboard shortcuts (Ctrl+F, F2, Del).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(deep-work): add v2 engine — retry, timeout, cancel, output chaining, PawKit schema
Deep Work v2 hardens the execution engine and lays the foundation for
PawKit-based Command Centers. This is the first WIP PR toward the
blueprints-strategy vision.
Engine improvements:
- Task retry: auto-retry failed tasks up to configurable max_retries
- Task timeout: per-task asyncio.wait_for with timeout_minutes
- Output storage: task.output field for cross-task chaining
- Error tracking: task.error_message for diagnostics
- Project cancellation: CANCELLED status, stop_all_project_tasks,
skip pending tasks with error_message
- Manual retry API: POST /projects/{id}/tasks/{tid}/retry
New PawKit config schema v0.1:
- Pydantic v2 models for Command Center templates
- Layout (panels, sections), workflows, user_config, integrations
- YAML load/save utilities with PyYAML
Files changed:
- src/pocketpaw/mission_control/models.py — 5 new Task fields
- src/pocketpaw/deep_work/models.py — TaskSpec v2 + CANCELLED status
- src/pocketpaw/mission_control/executor.py — retry, timeout, output, stop_all
- src/pocketpaw/deep_work/session.py — cancel(), materialize v2 fields
- src/pocketpaw/deep_work/api.py — cancel + retry endpoints
- src/pocketpaw/deep_work/__init__.py — cancel_project export
- src/pocketpaw/deep_work/pawkit.py — NEW: PawKit config schema
- tests/test_deep_work_v2.py — 71 new tests
- tests/test_mission_control_executor.py — adapted for retry defaults
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test(deep-work): add 21 E2E tests for v2 engine features
API-level E2E tests using httpx.AsyncClient with ASGI transport.
Real file-based store, session, scheduler, and executor — only the
agent backend (LLM calls) is mocked.
Coverage: full lifecycle, output chaining, auto-retry, timeout,
cancellation, manual retry API, get plan API, skip task API,
and PawKit YAML round-trip.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs(deep-work): add v2 feature docs — retry, timeout, cancel, output chaining, PawKit
Updated the Deep Work guide with new sections covering auto-retry,
task timeout, output chaining, project cancellation, and PawKit
template format. Added API endpoint pages for Cancel Project and
Retry Task. Updated sidebar navigation in docs-config.json.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add Command Centers concept page and PawKit technical reference
New standalone pages for the two biggest ideas in the v2 engine:
- docs/concepts/command-centers.mdx — the "why": agent-operated
dashboards, PawKits as templates, conversational building,
Kit Store marketplace, how it all connects
- docs/advanced/pawkit.mdx — the "how": full YAML schema reference
with panel types, workflow triggers, user config fields,
integrations, and Python API examples
Trimmed the PawKit section in deep-work.mdx to a cross-reference
since the content now lives in dedicated pages. Updated sidebar
navigation with both new entries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): enhance file explorer with viewers, clipboard, and editor save
Add file preview support (audio, video, PDF, markdown with syntax highlighting),
copy/cut/paste with keyboard shortcuts, file properties dialog, open-in-terminal,
editable code editor with Ctrl+S save and dirty tracking, and improved AI model
settings panel with Ollama model fetching.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): migrate stores to REST-first architecture, WS push-only
Move all request-response flows (sessions, chat, settings) to REST HTTP.
WebSocket is now exclusively for server-initiated push events.
- Add createSession() REST method to client
- Remove WS convenience methods (chat, newSession, switchSession, etc.)
- Remove bindEvents/disposeEvents from all stores
- Rewrite sessionStore to use POST /sessions and REST history
- Rewrite settingsStore.saveApiKey to use PUT /settings
- Simplify connectionStore (remove sessionId, connection_info listener)
- Simplify initializeStores (no more bindEvents calls)
- Clean up WS types (remove chat/session event types)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(api): REST-first architecture, fix WS dual-delivery and persistent client bugs (#384)
Move all request-response flows to REST HTTP. WebSocket is now push-only.
Fixes dual-delivery bug where SSE chat responses were broadcast to all WS
clients, and persistent Claude SDK client issues with stale data across sessions.
Backend changes:
- Add POST /sessions endpoint with SessionCreateResponse schema
- Fix WS adapter send() — drop messages for unknown chat_ids instead of broadcasting
- Fix WS adapter on_system_event() — route by session_key, not broadcast
- Enhance PUT /settings with runtime side-effects (reset_router + memory reload)
- Add cancel_task() to AgentLoop — lightweight cancellation without stopping router
- Fix _on_done callback race — don't remove newer task's entry from _active_tasks
- Add session lock contention logging for diagnostics
Chat streaming fixes:
- Cancel in-flight SSE streams when new request arrives for same session
- Only cancel agent tasks when there IS a competing stream (not on every request)
- Add diagnostic logging to SSE bridge event delivery
Claude SDK persistent client fixes:
- Include session_key in persistent client key — different sessions get fresh subprocesses
- Drain trailing ResultMessage from subprocess pipe after each query to prevent
stale data on subsequent queries (root cause of "second message shows first response")
- Add dispatch/event logging for persistent vs stateless path diagnostics
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(api): add PawKits system + MC/DW route mounting for serve command
- Add kits module (models, store, catalog, builtin YAML kits)
- Add kits API router with CRUD, catalog, and data resolution endpoints
- Add api:agents and api:standup source resolvers in kits data resolution
- Mount MC and DW routers in serve.py (was only in dashboard.py)
- Fix standup resolver to use manager.generate_standup()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: merge desktop client into monorepo (#290)
* feat: merge desktop client into monorepo under client/
Move the Tauri 2.0 + SvelteKit desktop client from the separate
pocketpaw-client repo into client/ to create a monorepo. Update
.gitignore with client build artifact ignores and add Desktop Client
section to CLAUDE.md.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(client): unignore client/src/lib and broaden node/sveltekit ignores
The root .gitignore `lib/` pattern was blocking client/src/lib/ from
being tracked. Anchor it to `/lib/` so only the root Python lib dir is
ignored. Also generalize node_modules/ and .svelte-kit/ patterns to
work at any depth.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(client): fix white OAuth screen on Windows
Load a local loading page first in the OAuth popup window, then
navigate to the external OAuth URL via eval(). WebView2 on Windows
may not be fully initialized when WebviewUrl::External is used
directly, resulting in a permanently white window.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(client): replace WebView OAuth popup with system browser + localhost server
WebView2 secondary windows fail to render on Windows (white/transparent screen).
Replace the OAuth popup with a temporary localhost HTTP server that captures the
callback, and open the authorize URL in the system browser instead.
Also pre-create sidepanel and quickask windows in tauri.conf.json (with
visible: false) so they initialize alongside the main window, avoiding the
same WebView2 rendering issue with dynamically-created transparent windows.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add multi-mode workspace client design
Design for transforming the desktop client into a full workspace IDE
with tabbed workspaces, tiling layout engine, pluggable widgets,
real-time agent collaboration, unified file management (local + remote
+ cloud), and responsive mobile support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add multi-mode workspace implementation plan
Detailed 6-phase implementation plan with ~49 new files across Rust
backend (fs commands, PTY, git, widget windows), SvelteKit frontend
(tiling layout, Monaco editor, file previews, widget system, terminal),
filesystem providers (local, remote, cloud), and co-work features.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: rewrite design as AI file explorer (Poly.app-inspired)
Complete redesign from VS Code-like IDE to file-explorer-first UI.
Primary interface is a visual file grid with rich thumbnails and
5 view modes (Icon, Grid, List, Column, Gallery). AI chat lives
in a collapsible right sidebar with folder/file context awareness.
Agent actions (create, edit, delete files) reflect in the grid
in real-time. Terminal output is inline in chat, not a separate panel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): add file explorer with list view, search/filter, and context menu
Implements a full file explorer with Rust-backed filesystem operations
(read, write, delete, rename, watch, thumbnails), multiple view modes
(icon grid + list table), inline search/filter, and an enhanced context
menu with rename, new folder, and keyboard shortcuts (Ctrl+F, F2, Del).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): enhance file explorer with viewers, clipboard, and editor save
Add file preview support (audio, video, PDF, markdown with syntax highlighting),
copy/cut/paste with keyboard shortcuts, file properties dialog, open-in-terminal,
editable code editor with Ctrl+S save and dirty tracking, and improved AI model
settings panel with Ollama model fetching.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): migrate stores to REST-first architecture, WS push-only
Move all request-response flows (sessions, chat, settings) to REST HTTP.
WebSocket is now exclusively for server-initiated push events.
- Add createSession() REST method to client
- Remove WS convenience methods (chat, newSession, switchSession, etc.)
- Remove bindEvents/disposeEvents from all stores
- Rewrite sessionStore to use POST /sessions and REST history
- Rewrite settingsStore.saveApiKey to use PUT /settings
- Simplify connectionStore (remove sessionId, connection_info listener)
- Simplify initializeStores (no more bindEvents calls)
- Clean up WS types (remove chat/session event types)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): full Mission Control integration — agents, execution, projects, notifications
- Add MC/DW types (AgentProfile, MCTask, MCMessage, MCProject, etc.)
- Add 25+ API methods (mcRequest + dwRequest helpers) for agents, tasks, execution, notifications, projects
- Add mcStore (agents, running tasks, execution streaming, notifications) and projectStore (project lifecycle, planning)
- Add AgentRoster panel with CRUD, KanbanBoard enhancements (assignment, run/stop, messages, running indicator)
- Add TaskExecutionPanel slide-over for live agent streaming
- Add NotificationBell in titlebar with unread badge
- Add StandupPanel and document viewer/editor in DataTable
- Add /projects route with creation wizard, plan review, lifecycle controls
- Remove internal-docs from git tracking
- Rename tabs: Deep Work → PawKits, Projects → Deep Work
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): add PawKits catalog, layout renderer, and remaining panel components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(api): add PawKits system + MC/DW route mounting for serve command
- Add kits module (models, store, catalog, builtin YAML kits)
- Add kits API router with CRUD, catalog, and data resolution endpoints
- Add api:agents and api:standup source resolvers in kits data resolution
- Mount MC and DW routers in serve.py (was only in dashboard.py)
- Fix standup resolver to use manager.generate_standup()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: add plans and update lockfile
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: remove plans and revert uv.lock
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: resolve merge breakages in chat, context builder, and MC routes
- Add missing FileContext model and field to ChatRequest schema
- Add file_context parameter to build_system_prompt()
- Move /tasks/running route before /tasks/{task_id} to fix 404
- Remove unused TaskStatus import in kits.py
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: resilient SDK streaming, in-app file viewer, and explorer tool
- Replace _safe_iter with _resilient_receive to handle MessageParseError
by re-creating the iterator instead of losing the stream
- Add file-open command interception (start, xdg-open, etc.) to redirect
to the in-app explorer viewer via PreToolUse hook
- Add /api/files/content endpoint for serving file contents with MIME types
- Add explorer built-in tool and open_in_explorer CLI command
- Update dashboard frontend with file viewer modal and transparency fixes
- Set SDK stream close timeout to 24h for long-running tool use
- Suppress API-key errors in ResultMessage to avoid noisy logs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(client): tabbed explorer, file viewers, command palette, and onboarding refresh
- Add multi-tab explorer with history, file type filtering, and address bar
- Implement PDF, spreadsheet, notebook, document, and text preview viewers
- Add command palette (Ctrl+K) with fuzzy search
- Overhaul onboarding wizard with model search and backend setup
- Add Tauri fs commands for file content and metadata
- Improve chat input, file preview, and session dropdown
- Update dialog components and workspace tabs
- Add content preview caching and binary utils for file handling
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Rohit Kushwaha <technicalrohit06@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Rohit Kushwaha <rohitk290106@gmail.com>
* docs: add PocketPaw vs OpenClaw comparison page
Adds a research-backed comparison page covering security architecture,
install experience, code footprint, local model support, and use case
guidance. Includes Guardian AI vs context compaction analysis, Ollama
setup tabs, and honest pros/cons for both projects.
- docs/concepts/vs-openclaw.mdx: new comparison page
- docs/docs-config.json: add page to Core Concepts sidebar nav
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: update vs-openclaw comparison with governance details and enhanced security architecture
* fix: remove soul-protocol from PyPI extras, bump to v0.4.6
soul-protocol is not published on PyPI yet. Having it as a resolved
dependency in the [soul] and [paw] extras caused a hard install failure
for anyone running pip install pocketpaw[paw] or pocketpaw[soul].
The paw CLI already handles missing soul-protocol gracefully at runtime
via lazy imports and _check_soul_protocol(). This removes the broken
PyPI resolution — users who want soul features install manually:
pip install git+https://github.com/qbtrix/soul-protocol.git
Fixes: pip install pocketpaw[paw] ERROR: No matching distribution found
for soul-protocol>=0.2.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: correct version to 0.4.5.1 (hotfix patch)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fixed malformed PUT api and retuns 400
* fixed detail format and restore blank line
---------
Co-authored-by: Prakash <prakashd88@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Rohit Kushwaha <rohitk290106@gmail.com>
* fix(mcp): correct gws preset package name and move health check out of startup
The google-workspace preset referenced a non-existent npm package
(@anthropic-ai/gws). The actual package is @googleworkspace/cli.
Also removed the fabricated `cargo install gws` install hint and
moved the gws health check to a separate INTEGRATION_CHECKS list
so it doesn't run on every startup for users who don't use it.
Refs #431
* test: add tests for gws preset and health check
- Test google-workspace preset fields (package, command, args, transport)
- Test check_gws_binary with mocked shutil.which (found + not found)
- Test INTEGRATION_CHECKS registry and that gws is not in STARTUP_CHECKS
* docs: add Google Workspace MCP integration page
Covers prerequisites (gws CLI install, auth setup), dashboard and
config-file installation, service filtering, alternative auth methods,
health check, troubleshooting, and comparison with built-in Google tools.
Refs #431
- Add metadata.url for sitemap and llms.txt generation
- Add integrations.llmsTxt config for AI discoverability
- Add llms.txt top-level nav anchor alongside Documentation and API Reference
- Remove unused _landing/robots.txt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The documentation site has moved from the docs subdomain to the root
domain. Update all references across README, docs README, and MCP
servers integration guide.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add type column to configuration reference tables
Add Type column to all configuration tables showing data types:
- string - API keys, tokens, URLs, model names
- integer - ports, IDs, numeric limits
- boolean - true/false flags
- string[] - comma-separated lists (allowed IDs, tools)
- integer[] - numeric ID lists (Discord guilds/users)
- enum - fields with specific allowed values (with options listed)
This improves developer experience by making it clear:
- Whether dashboard_port is a string or integer
- Whether tools_allow is a JSON array or comma-separated string
- Whether mem0_auto_learn is boolean or string "true"/"false"
- What values are valid for enum fields like llm_provider
Fixes#148
* Fix incorrect default values in configuration reference
Cross-checked defaults against config.py and corrected:
- tool_profile: coding → full
- whatsapp_mode: business → "" (unset until configured)
- mem0_llm_provider: ollama → anthropic
- mem0_llm_model: llama3.2 → claude-haiku-4-5-20251001
- mem0_embedder_provider: ollama → openai
- mem0_embedder_model: nomic-embed-text → text-embedding-3-small