14 Commits

Author SHA1 Message Date
Ragini Pandey
ee64be4fc8 fix(security): require auth on /api/qr to prevent session token leak
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
2026-04-03 19:52:32 +00:00
Rohit Kushwaha
5adeae1f9c feat: agent status API, SSE stream, and CLI command (#586)
* 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
2026-03-14 10:14:12 +05:30
Rohit Kushwaha
869407bf69 refactor: provider adapter pattern + LiteLLM support (#595)
* 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
2026-03-14 03:46:02 +05:30
Prakash Dalai
fdf128120d feat(deep-work): v2 engine — retry, timeout, cancel, output chaining, PawKit schema (#375)
* 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>
2026-03-07 21:02:27 +05:30
Vaibhavee Singh
232a5f2d84 docs: add type column to configuration reference tables (#305)
* 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
2026-02-24 20:55:33 +05:30
Rohit Kushwaha
8bb8ee6186 Merge pull request #201 from pocketpaw/docs/health-engine
docs: add health engine documentation
2026-02-17 23:05:11 +05:30
Rohit Kushwaha
94f393da2a Merge branch 'dev' into fix/smart-routing-claude-sdk-settings 2026-02-17 21:59:32 +05:30
Rohit Kushwaha
3972fbdfdd Merge branch 'dev' into docs/health-engine 2026-02-17 18:16:46 +05:30
Rohit Kushwaha
c26ad7ef04 docs(mcp): document OAuth support, CIMD, and transport changes
Update MCP documentation to reflect the OAuth support, registry
removal, and transport improvements from 38c0aac:

- Add OAuth authentication section with full flow explanation
- Add CIMD guide explaining why GitHub MCP needs it (no dynamic
  client registration) and how to set it up
- Document new transport types: streamable-http, sse, and http
  auto-detect (tries Streamable HTTP then falls back to SSE)
- Add oauth field to preset and server config API docs
- Add mcp_client_metadata_url to configuration reference
- Add mcp_oauth_redirect WebSocket message type
- Create new /api/mcp/oauth/callback endpoint doc
- Update REST API table with actual implemented endpoints
- Replace "Popular MCP Servers" table with preset catalog section
- Add error handling section (ExceptionGroup unwrapping, OAuth hints)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 17:51:55 +05:30
Rohit Kushwaha
441fa36087 docs: update docs for Claude SDK settings and smart routing changes
- backends/claude-sdk: add Claude SDK Settings section with model
  override, max turns, and callouts about auto-select vs smart routing
- advanced/model-router: note disabled by default, add configuration
  env vars, update callout text
- api/configuration-reference: add claude_sdk_model, claude_sdk_max_turns,
  smart_routing_enabled, and model tier settings to the table
- getting-started/configuration: add Claude SDK env vars and config.json
  fields with info callout
- README: update smart router description, add SDK fields to config example
- CLAUDE.md: mention SDK-specific settings in backend description

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 17:14:08 +05:30
Prakash
4129f98e63 docs: add health engine concept page and API endpoint docs
Document the health engine system merged in #189. Adds a concept page
covering architecture, all 11 health checks, status computation, persistent
error log, agent diagnostic tools, system prompt injection, repair playbooks,
dashboard UI, and heartbeat scheduling. Adds 4 API endpoint pages for
GET /api/health, GET /api/health/errors, POST /api/health/check, and
DELETE /api/health/errors. Updates sidebar navigation with entries in both
Core Concepts and API Reference sections.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 16:40:06 +05:30
Rohit Kushwaha
b6e24334bb fix: rename POCKETCLAW_ env prefix and paths to POCKETPAW_
Complete the user-facing rename from pocketclaw to pocketpaw across
env vars, Docker paths (~/.pocketclaw → ~/.pocketpaw), and all
documentation references.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 23:44:46 +05:30
Rohit Kushwaha
b665a1a9cd feat: add centralized LLMClient abstraction and Ollama support across all backends
Consolidate duplicated provider detection, AsyncAnthropic client creation,
env var construction, and error formatting into a single LLMClient dataclass
with a resolve_llm_client() factory. Refactor 10 consumer files to use it.

- New llm/client.py: LLMClient frozen dataclass + resolve_llm_client()
- Claude SDK backend: Ollama env vars via llm.to_sdk_env(), --check-ollama CLI
- PocketPaw Native: replace _llm_provider tracking with LLMClient
- Security modules: force_provider="anthropic" for Guardian + InjectionScanner
- Dashboard: Ollama settings UI, provider selection
- Docs: Ollama backend documentation
- Tests: 19 new LLMClient tests, updated Ollama + concurrency tests

Closes #53

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 00:52:21 +05:30
Rohit Kushwaha
4bb7313829 feat: move docs into monorepo, add deploy workflow
Consolidate documentation from the separate pocketpaw-web repo into the
main pocketpaw repo. This keeps docs and code in sync so PRs can update
both atomically.

- Remove docs/ from .gitignore
- Remove docs' own .git (was pocketpaw/pocketpaw-web)
- Add .github/workflows/deploy-docs.yml (builds from docs/ subdirectory)
- Track all 120+ MDX pages, config, landing page, and public assets

The separate pocketpaw-web repo can now be archived.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:12:04 +05:30