ff03f74404
Implements `flynn gmail-auth` to complete the OAuth2 flow that GmailWatcher references but was never built. Supports local callback server (default) and --manual paste mode. Adds Gmail health check to `flynn doctor`. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
994 lines
42 KiB
JSON
994 lines
42 KiB
JSON
{
|
|
"version": "1.0",
|
|
"updated_at": "2026-02-10",
|
|
"description": "Tracks the status of all Flynn plans and implementation phases",
|
|
|
|
"plans": {
|
|
"openclaw-feature-gap-analysis": {
|
|
"file": "2026-02-06-openclaw-feature-gap-analysis.md",
|
|
"status": "completed",
|
|
"date": "2026-02-06",
|
|
"updated": "2026-02-07",
|
|
"summary": "Comprehensive comparison of Flynn vs OpenClaw. 116 features compared: 75 match (65%), 2 partial (2%), 38 missing (33%). Updated 2026-02-07 after full codebase audit revealed 33+ features previously marked MISSING were actually implemented."
|
|
},
|
|
"p0-p1-implementation-plan": {
|
|
"file": "2026-02-06-p0-p1-implementation-plan.md",
|
|
"status": "completed",
|
|
"date": "2026-02-06",
|
|
"summary": "7 features across 7 phases (0-6). Estimated 15-22 days total.",
|
|
"phases": {
|
|
"phase_0_multi_model_delegation": {
|
|
"priority": "P0",
|
|
"status": "completed",
|
|
"description": "AgentOrchestrator with sub-agent delegation to different model tiers",
|
|
"files_created": [
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/backends/native/orchestrator.test.ts",
|
|
"src/backends/native/prompts.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/daemon/index.ts",
|
|
"src/config/schema.ts"
|
|
],
|
|
"test_status": "20/20 passing"
|
|
},
|
|
"phase_1_context_compaction": {
|
|
"priority": "P0",
|
|
"status": "completed",
|
|
"description": "Token estimation, auto-compaction, /compact command, SQLite history replacement",
|
|
"files_created": [
|
|
"src/context/tokens.ts",
|
|
"src/context/tokens.test.ts",
|
|
"src/context/compaction.ts",
|
|
"src/context/compaction.test.ts",
|
|
"src/context/index.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/session/manager.ts",
|
|
"src/session/store.ts",
|
|
"src/config/schema.ts",
|
|
"src/daemon/index.ts",
|
|
"src/frontends/tui/commands.ts"
|
|
],
|
|
"test_status": "21/21 passing"
|
|
},
|
|
"phase_2_memory_system": {
|
|
"priority": "P0",
|
|
"status": "completed",
|
|
"description": "Persistent memory with file-based storage, memory tools, auto-extraction after compaction",
|
|
"depends_on": ["phase_0", "phase_1"],
|
|
"files_created": [
|
|
"src/memory/store.ts",
|
|
"src/memory/store.test.ts",
|
|
"src/memory/index.ts",
|
|
"src/tools/builtin/memory-read.ts",
|
|
"src/tools/builtin/memory-write.ts",
|
|
"src/tools/builtin/memory-search.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/tools/builtin/index.ts",
|
|
"src/config/schema.ts",
|
|
"src/backends/native/agent.ts",
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/context/compaction.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "17/17 passing"
|
|
},
|
|
"phase_3_messaging_channels": {
|
|
"priority": "P1",
|
|
"status": "completed",
|
|
"description": "Discord, Slack, WhatsApp channel adapters",
|
|
"sub_phases": {
|
|
"3a_discord": {
|
|
"status": "completed",
|
|
"effort": "1-2 days",
|
|
"files_created": [
|
|
"src/channels/discord/adapter.ts",
|
|
"src/channels/discord/adapter.test.ts",
|
|
"src/channels/discord/index.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/channels/index.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "22/22 passing"
|
|
},
|
|
"3b_slack": {
|
|
"status": "completed",
|
|
"effort": "1 day",
|
|
"files_created": [
|
|
"src/channels/slack/adapter.ts",
|
|
"src/channels/slack/adapter.test.ts",
|
|
"src/channels/slack/index.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/channels/index.ts",
|
|
"src/daemon/index.ts",
|
|
"package.json"
|
|
],
|
|
"new_dependencies": ["@slack/bolt"],
|
|
"test_status": "22/22 passing",
|
|
"notes": "Socket Mode only (HTTP fallback deferred). Slash commands deferred. User ID used as senderName (display name resolution is a follow-up)."
|
|
},
|
|
"3c_whatsapp": {
|
|
"status": "completed",
|
|
"effort": "2-3 days",
|
|
"files_created": [
|
|
"src/channels/whatsapp/adapter.ts",
|
|
"src/channels/whatsapp/adapter.test.ts",
|
|
"src/channels/whatsapp/index.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/channels/index.ts",
|
|
"src/daemon/index.ts",
|
|
"package.json"
|
|
],
|
|
"new_dependencies": ["whatsapp-web.js"],
|
|
"test_status": "25/25 passing",
|
|
"notes": "QR code auth via LocalAuth. Session persistence via data_dir. Group messages filtered (DM only). Phone number allowlist. Headless Chrome with Puppeteer."
|
|
}
|
|
},
|
|
"planned_files": [
|
|
"src/channels/discord/adapter.ts",
|
|
"src/channels/discord/index.ts",
|
|
"src/channels/slack/adapter.ts",
|
|
"src/channels/slack/index.ts",
|
|
"src/channels/whatsapp/adapter.ts",
|
|
"src/channels/whatsapp/index.ts",
|
|
"src/channels/utils/chunking.ts",
|
|
"src/channels/utils/auth.ts",
|
|
"src/channels/utils/markdown.ts"
|
|
]
|
|
},
|
|
"phase_4_web_search": {
|
|
"priority": "P1",
|
|
"status": "completed",
|
|
"description": "Web search tool (Brave Search API + SearXNG fallback)",
|
|
"effort": "0.5 day",
|
|
"files_created": [
|
|
"src/tools/builtin/web-search.ts",
|
|
"src/tools/builtin/web-search.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/tools/builtin/index.ts",
|
|
"src/tools/index.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "14/14 passing"
|
|
},
|
|
"phase_5_background_exec": {
|
|
"priority": "P1",
|
|
"status": "completed",
|
|
"description": "Background process management tools (start, status, output, kill, list)",
|
|
"effort": "1-2 days",
|
|
"files_created": [
|
|
"src/tools/builtin/process/manager.ts",
|
|
"src/tools/builtin/process/start.ts",
|
|
"src/tools/builtin/process/status.ts",
|
|
"src/tools/builtin/process/output.ts",
|
|
"src/tools/builtin/process/kill.ts",
|
|
"src/tools/builtin/process/list.ts",
|
|
"src/tools/builtin/process/index.ts",
|
|
"src/tools/builtin/process/manager.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/tools/builtin/index.ts",
|
|
"src/tools/index.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "28/28 passing"
|
|
},
|
|
"phase_6_enhanced_web_fetch": {
|
|
"priority": "P1",
|
|
"status": "completed",
|
|
"description": "HTML-to-markdown extraction, format parameter, response caching",
|
|
"effort": "1 day",
|
|
"files_modified": [
|
|
"src/tools/builtin/web-fetch.ts",
|
|
"src/tools/builtin/web-fetch.test.ts"
|
|
],
|
|
"new_dependencies": ["turndown", "linkedom", "@mozilla/readability", "@types/turndown"],
|
|
"test_status": "10/10 passing"
|
|
}
|
|
}
|
|
},
|
|
"p2-implementation": {
|
|
"status": "completed",
|
|
"date": "2026-02-06",
|
|
"summary": "7 P2 features: tech debt cleanup, retry policy, system prompt templating, usage tracking, tool allow/deny profiles, Docker sandboxing, multi-agent routing",
|
|
"phases": {
|
|
"tech_debt_cleanup": {
|
|
"priority": "P2",
|
|
"status": "completed",
|
|
"description": "Extract shared splitMessage() from 4 adapters into channels/utils.ts; fix Slack senderName with users.info API + caching",
|
|
"files_created": [
|
|
"src/channels/utils.ts",
|
|
"src/channels/utils.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/channels/telegram/adapter.ts",
|
|
"src/channels/discord/adapter.ts",
|
|
"src/channels/slack/adapter.ts",
|
|
"src/channels/whatsapp/adapter.ts",
|
|
"src/channels/index.ts"
|
|
],
|
|
"test_status": "10/10 passing"
|
|
},
|
|
"retry_policy": {
|
|
"priority": "P2",
|
|
"status": "completed",
|
|
"description": "withRetry() with exponential backoff + jitter, isRetryable() filter, wired into ModelRouter.chat() (non-streaming)",
|
|
"files_created": [
|
|
"src/models/retry.ts",
|
|
"src/models/retry.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/models/router.ts",
|
|
"src/models/index.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "18/18 passing"
|
|
},
|
|
"system_prompt_templating": {
|
|
"priority": "P2",
|
|
"status": "completed",
|
|
"description": "assembleSystemPrompt() multi-file template system (SOUL/AGENTS/IDENTITY/USER/TOOLS.md) with configurable search dirs and extra sections",
|
|
"files_created": [
|
|
"src/prompt/template.ts",
|
|
"src/prompt/template.test.ts",
|
|
"src/prompt/index.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "12/12 passing"
|
|
},
|
|
"usage_tracking": {
|
|
"priority": "P2",
|
|
"status": "completed",
|
|
"description": "Usage accumulators in NativeAgent + AgentOrchestrator, estimateCost() with model pricing, /usage TUI command",
|
|
"files_created": [
|
|
"src/models/costs.ts",
|
|
"src/models/costs.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/backends/native/agent.ts",
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/backends/native/index.ts",
|
|
"src/backends/index.ts",
|
|
"src/frontends/tui/commands.ts",
|
|
"src/frontends/tui/commands.test.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "11/11 passing (9 costs + 2 commands)"
|
|
},
|
|
"tool_allow_deny_profiles": {
|
|
"priority": "P2",
|
|
"status": "completed",
|
|
"description": "Configurable tool filtering with 4 built-in profiles (minimal/messaging/coding/full), global and per-agent/per-provider allow/deny lists with glob patterns, defense-in-depth enforcement at listing and execution",
|
|
"files_created": [
|
|
"src/tools/policy.ts",
|
|
"src/tools/policy.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/index.ts",
|
|
"src/tools/registry.ts",
|
|
"src/tools/executor.ts",
|
|
"src/tools/index.ts",
|
|
"src/backends/native/agent.ts",
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/daemon/index.ts",
|
|
"src/gateway/handlers/tools.ts",
|
|
"src/gateway/handlers/handlers.test.ts",
|
|
"src/gateway/server.test.ts"
|
|
],
|
|
"test_status": "37/37 passing"
|
|
},
|
|
"docker_sandboxing": {
|
|
"priority": "P2",
|
|
"status": "completed",
|
|
"description": "Docker-based tool sandboxing: DockerSandbox container lifecycle, SandboxManager per-session containers, sandboxed shell.exec/process.start tool wrappers, ToolRegistry.clone()/replace(), lazy container creation, daemon wiring with shutdown cleanup",
|
|
"files_created": [
|
|
"src/sandbox/docker.ts",
|
|
"src/sandbox/docker.test.ts",
|
|
"src/sandbox/manager.ts",
|
|
"src/sandbox/manager.test.ts",
|
|
"src/sandbox/tools.ts",
|
|
"src/sandbox/tools.test.ts",
|
|
"src/sandbox/index.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/index.ts",
|
|
"src/tools/registry.ts",
|
|
"src/tools/registry.test.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "31/31 passing (10 docker + 6 manager + 8 tools + 5 registry + 2 integration)"
|
|
},
|
|
"multi_agent_routing": {
|
|
"priority": "P2",
|
|
"status": "completed",
|
|
"description": "Config-driven agent routing: AgentConfigRegistry for named agent configs (system_prompt, model_tier, tool_profile, sandbox), AgentRouter with sender→channel→default resolution (glob patterns), per-agent tool registry cloning with sandboxed overrides, daemon wiring",
|
|
"files_created": [
|
|
"src/agents/registry.ts",
|
|
"src/agents/registry.test.ts",
|
|
"src/agents/router.ts",
|
|
"src/agents/router.test.ts",
|
|
"src/agents/index.ts",
|
|
"src/daemon/routing.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/index.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "14/14 passing (5 registry + 7 router + 2 integration)"
|
|
}
|
|
}
|
|
},
|
|
"p4-media-pipeline": {
|
|
"status": "completed",
|
|
"date": "2026-02-06",
|
|
"summary": "Multimodal media pipeline: receive images from channel adapters and pass through to vision-capable models (Anthropic, OpenAI, Gemini, Bedrock)",
|
|
"phases": {
|
|
"type_widening": {
|
|
"priority": "P4",
|
|
"status": "completed",
|
|
"description": "Widen Message.content from string to string | MessageContentPart[], add Attachment type to channel layer, add ImageSource/MessageContentPart types",
|
|
"files_created": [
|
|
"src/models/media.ts",
|
|
"src/models/media.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/models/types.ts",
|
|
"src/models/index.ts",
|
|
"src/channels/types.ts",
|
|
"src/channels/index.ts"
|
|
],
|
|
"test_status": "25/25 passing"
|
|
},
|
|
"model_client_multimodal": {
|
|
"priority": "P4",
|
|
"status": "completed",
|
|
"description": "Update all model clients to convert MessageContentPart[] to provider-specific image formats (Anthropic base64, OpenAI data URI, Gemini inlineData, Bedrock image bytes)",
|
|
"files_modified": [
|
|
"src/models/anthropic.ts",
|
|
"src/models/openai.ts",
|
|
"src/models/gemini.ts",
|
|
"src/models/bedrock.ts",
|
|
"src/models/local/llamacpp.ts",
|
|
"src/models/local/ollama.ts"
|
|
]
|
|
},
|
|
"agent_attachment_passthrough": {
|
|
"priority": "P4",
|
|
"status": "completed",
|
|
"description": "Wire attachments through NativeAgent.process() and AgentOrchestrator.process() to daemon message handler",
|
|
"files_modified": [
|
|
"src/backends/native/agent.ts",
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/daemon/index.ts"
|
|
]
|
|
},
|
|
"downstream_type_fixes": {
|
|
"priority": "P4",
|
|
"status": "completed",
|
|
"description": "Fix all consumers of Message.content to use getMessageText() helper: token estimation, compaction, TUI rendering",
|
|
"files_modified": [
|
|
"src/context/tokens.ts",
|
|
"src/context/compaction.ts",
|
|
"src/frontends/tui/components/MessageList.tsx"
|
|
]
|
|
},
|
|
"channel_adapter_extraction": {
|
|
"priority": "P4",
|
|
"status": "completed",
|
|
"description": "Extract images from platform messages in all channel adapters",
|
|
"sub_phases": {
|
|
"telegram": {
|
|
"status": "completed",
|
|
"description": "Handle message:photo (largest size, download via getFile API, base64) and image message:document events with caption text",
|
|
"files_modified": ["src/channels/telegram/adapter.ts"]
|
|
},
|
|
"discord": {
|
|
"status": "completed",
|
|
"description": "Extract image attachments from message.attachments Collection, pass Discord CDN URLs directly",
|
|
"files_modified": ["src/channels/discord/adapter.ts"]
|
|
},
|
|
"slack": {
|
|
"status": "completed",
|
|
"description": "Download image files via url_private_download with bot token auth, base64 encode",
|
|
"files_modified": ["src/channels/slack/adapter.ts"]
|
|
},
|
|
"whatsapp": {
|
|
"status": "completed",
|
|
"description": "Use downloadMedia() from whatsapp-web.js (returns base64 natively)",
|
|
"files_modified": ["src/channels/whatsapp/adapter.ts"]
|
|
},
|
|
"webchat": {
|
|
"status": "deferred",
|
|
"description": "Requires gateway protocol update for WebSocket attachment messages"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"p5-github-copilot-provider": {
|
|
"status": "completed",
|
|
"date": "2026-02-06",
|
|
"summary": "GitHub Copilot as a model provider with OAuth device flow and auto-login on first use",
|
|
"phases": {
|
|
"copilot_client": {
|
|
"priority": "P5",
|
|
"status": "completed",
|
|
"description": "GitHubModelsClient using OpenAI SDK against api.githubcopilot.com with Copilot-specific headers, multimodal support, streaming, tool calls",
|
|
"files_created": [
|
|
"src/models/github.ts",
|
|
"src/auth/github.ts",
|
|
"src/auth/index.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/models/index.ts",
|
|
"src/models/costs.ts",
|
|
"src/daemon/index.ts",
|
|
"src/cli/tui.ts"
|
|
]
|
|
},
|
|
"oauth_device_flow": {
|
|
"priority": "P5",
|
|
"status": "completed",
|
|
"description": "Interactive OAuth device flow via /login github command, token stored at ~/.config/flynn/auth.json with chmod 0600",
|
|
"files_modified": [
|
|
"src/frontends/tui/minimal.ts",
|
|
"src/frontends/tui/commands.ts"
|
|
]
|
|
},
|
|
"auto_login": {
|
|
"priority": "P5",
|
|
"status": "completed",
|
|
"description": "Lazy token resolution with onLoginRequired callback — triggers OAuth device flow automatically on first API call when no token is available",
|
|
"files_modified": [
|
|
"src/models/github.ts",
|
|
"src/daemon/index.ts",
|
|
"src/cli/tui.ts"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"p6-enhanced-media-pipeline": {
|
|
"status": "completed",
|
|
"date": "2026-02-07",
|
|
"summary": "Enhanced media pipeline: image analysis tool, outbound attachments, gateway protocol attachments, audio transcription for voice messages across all channels",
|
|
"phases": {
|
|
"6a_image_analyze_tool": {
|
|
"priority": "P6",
|
|
"status": "completed",
|
|
"description": "Factory createImageAnalyzeTool(modelClient) that sends images to a vision-capable model and returns textual analysis",
|
|
"files_created": [
|
|
"src/tools/builtin/image-analyze.ts",
|
|
"src/tools/builtin/image-analyze.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/tools/builtin/index.ts"
|
|
],
|
|
"test_status": "15/15 passing"
|
|
},
|
|
"6b_outbound_attachments": {
|
|
"priority": "P6",
|
|
"status": "completed",
|
|
"description": "OutboundAttachment type, OutboundAttachmentCollector (push/drain pattern), media.send tool for queuing outbound files, channel adapter send support (Telegram, Discord, Slack, WhatsApp)",
|
|
"files_created": [
|
|
"src/backends/native/attachments.ts",
|
|
"src/backends/native/attachments.test.ts",
|
|
"src/tools/builtin/media-send.ts",
|
|
"src/tools/builtin/media-send.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/channels/types.ts",
|
|
"src/channels/index.ts",
|
|
"src/backends/native/agent.ts",
|
|
"src/backends/native/index.ts",
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/channels/telegram/adapter.ts",
|
|
"src/channels/discord/adapter.ts",
|
|
"src/channels/slack/adapter.ts",
|
|
"src/channels/whatsapp/adapter.ts",
|
|
"src/tools/builtin/index.ts",
|
|
"src/tools/index.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "15/15 passing (7 collector + 8 tool)"
|
|
},
|
|
"6c_gateway_protocol_attachments": {
|
|
"priority": "P6",
|
|
"status": "completed",
|
|
"description": "GatewayAttachment type, attachment event type, agent.send handler accepts optional attachments parameter and converts for agent pipeline",
|
|
"files_modified": [
|
|
"src/gateway/protocol.ts",
|
|
"src/gateway/protocol.test.ts",
|
|
"src/gateway/handlers/agent.ts",
|
|
"src/gateway/handlers/handlers.test.ts",
|
|
"src/gateway/index.ts"
|
|
],
|
|
"test_status": "5 new tests passing"
|
|
},
|
|
"6d_audio_transcription": {
|
|
"priority": "P6",
|
|
"status": "completed",
|
|
"description": "Whisper-compatible audio transcription via configurable endpoint. Functions: isSupportedAudio(), mimeToExtension(), transcribeAudio(), buildUserMessageWithAudio(). Config schema audio section. Daemon wires transcription into message router. All channel adapters extract audio (Telegram voice+audio, Discord audio/*, Slack audio/*, WhatsApp ptt+audio)",
|
|
"files_modified": [
|
|
"src/models/media.ts",
|
|
"src/models/media.test.ts",
|
|
"src/config/schema.ts",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "57/57 passing (was 25, +32 audio tests)"
|
|
}
|
|
}
|
|
},
|
|
"p7-web-ui-dashboard": {
|
|
"file": "2026-02-07-web-ui-dashboard.md",
|
|
"status": "completed",
|
|
"date": "2026-02-07",
|
|
"summary": "Full SPA control dashboard: Dashboard (health, channels, auto-refresh), Chat (session selector, tool events, markdown), Sessions (list, history, delete), Settings (hook editor, tools, config viewer)",
|
|
"phases": {
|
|
"phase_1_backend_enhancements": {
|
|
"priority": "P7",
|
|
"status": "completed",
|
|
"description": "New gateway handlers (sessions.delete, sessions.switch, system.channels, system.usage), channelRegistry wiring, static file content types",
|
|
"files_modified": [
|
|
"src/gateway/handlers/sessions.ts",
|
|
"src/gateway/handlers/system.ts",
|
|
"src/gateway/server.ts",
|
|
"src/gateway/static.ts",
|
|
"src/daemon/index.ts"
|
|
]
|
|
},
|
|
"phase_2_spa_shell": {
|
|
"priority": "P7",
|
|
"status": "completed",
|
|
"description": "SPA shell with hash-based router, sidebar nav, WebSocket RPC client with auto-reconnect, connection status indicator",
|
|
"files_created": [
|
|
"src/gateway/ui/app.js",
|
|
"src/gateway/ui/lib/ws-client.js"
|
|
],
|
|
"files_modified": [
|
|
"src/gateway/ui/index.html",
|
|
"src/gateway/ui/style.css"
|
|
]
|
|
},
|
|
"phase_3_dashboard": {
|
|
"priority": "P7",
|
|
"status": "completed",
|
|
"description": "Dashboard page with health stats cards, channel status grid, usage summary, 10s auto-refresh",
|
|
"files_created": [
|
|
"src/gateway/ui/pages/dashboard.js"
|
|
]
|
|
},
|
|
"phase_4_chat": {
|
|
"priority": "P7",
|
|
"status": "completed",
|
|
"description": "Chat page with session selector, new session, streaming tool events (collapsible), markdown rendering with syntax highlighting",
|
|
"files_created": [
|
|
"src/gateway/ui/pages/chat.js"
|
|
]
|
|
},
|
|
"phase_5_sessions": {
|
|
"priority": "P7",
|
|
"status": "completed",
|
|
"description": "Sessions browser with list table, history viewer, delete with confirmation",
|
|
"files_created": [
|
|
"src/gateway/ui/pages/sessions.js"
|
|
]
|
|
},
|
|
"phase_6_settings": {
|
|
"priority": "P7",
|
|
"status": "completed",
|
|
"description": "Settings page with hook pattern editor (save via config.patch), tool list, channel grid, redacted config viewer",
|
|
"files_created": [
|
|
"src/gateway/ui/pages/settings.js"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"p8-agent-tools": {
|
|
"status": "completed",
|
|
"date": "2026-02-07",
|
|
"summary": "8 new agent-callable tools exposing existing internal APIs, plus gap analysis audit update (25% → 65% match rate)",
|
|
"phases": {
|
|
"sessions_tools": {
|
|
"priority": "P8",
|
|
"status": "completed",
|
|
"description": "sessions.list, sessions.history, sessions.create, sessions.delete tools wrapping SessionManager",
|
|
"files_created": [
|
|
"src/tools/builtin/sessions.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/tools/builtin/index.ts",
|
|
"src/tools/index.ts",
|
|
"src/daemon/index.ts"
|
|
]
|
|
},
|
|
"agents_list_tool": {
|
|
"priority": "P8",
|
|
"status": "completed",
|
|
"description": "agents.list tool wrapping AgentConfigRegistry.list()",
|
|
"files_created": [
|
|
"src/tools/builtin/agents-list.ts"
|
|
]
|
|
},
|
|
"message_send_tool": {
|
|
"priority": "P8",
|
|
"status": "completed",
|
|
"description": "message.send tool wrapping ChannelRegistry for cross-channel messaging",
|
|
"files_created": [
|
|
"src/tools/builtin/message-send.ts"
|
|
]
|
|
},
|
|
"cron_tools": {
|
|
"priority": "P8",
|
|
"status": "completed",
|
|
"description": "cron.list, cron.trigger tools wrapping CronScheduler",
|
|
"files_created": [
|
|
"src/tools/builtin/cron.ts"
|
|
]
|
|
},
|
|
"gap_analysis_update": {
|
|
"priority": "P8",
|
|
"status": "completed",
|
|
"description": "Full codebase audit and gap analysis document update. 33+ features previously marked MISSING corrected to MATCH. Scorecard: 75/116 match (65%), 2 partial, 38 missing",
|
|
"files_modified": [
|
|
"docs/plans/2026-02-06-openclaw-feature-gap-analysis.md"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"tier3-file-patch-and-gmail": {
|
|
"status": "completed",
|
|
"date": "2026-02-07",
|
|
"summary": "2 features from Tier 3 gap analysis: file.patch multi-hunk tool and Gmail Pub/Sub watcher",
|
|
"phases": {
|
|
"file_patch_tool": {
|
|
"priority": "Tier3",
|
|
"status": "completed",
|
|
"description": "file.patch tool for multi-hunk structured patches — apply multiple line-based edits (replacements, insertions, deletions) across one or more files in a single tool call. Hunks applied bottom-up to preserve line numbers.",
|
|
"files_created": [
|
|
"src/tools/builtin/file-patch.ts",
|
|
"src/tools/builtin/file-patch.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/tools/builtin/index.ts",
|
|
"src/tools/policy.ts"
|
|
],
|
|
"test_status": "10/10 passing"
|
|
},
|
|
"gmail_pubsub_watcher": {
|
|
"priority": "Tier3",
|
|
"status": "completed",
|
|
"description": "Gmail Pub/Sub watcher ChannelAdapter — monitors Gmail via Google Cloud Pub/Sub push notifications with polling fallback. OAuth2 auth, configurable watch labels, template rendering with email metadata placeholders. Wired into daemon lifecycle and gateway (POST /gmail/push endpoint).",
|
|
"files_created": [
|
|
"src/automation/gmail.ts",
|
|
"src/automation/gmail.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/automation/index.ts",
|
|
"src/config/schema.ts",
|
|
"src/gateway/server.ts",
|
|
"src/daemon/index.ts",
|
|
"package.json"
|
|
],
|
|
"new_dependencies": ["googleapis"],
|
|
"test_status": "16/16 passing"
|
|
}
|
|
}
|
|
},
|
|
"runtime-context-awareness": {
|
|
"status": "completed",
|
|
"date": "2026-02-07",
|
|
"summary": "Runtime context: system.info tool + automatic date/time injection in system prompt",
|
|
"phases": {
|
|
"system_prompt_date_injection": {
|
|
"status": "completed",
|
|
"description": "assembleSystemPrompt() now unconditionally appends a '# Runtime Context' section with current date and time",
|
|
"files_modified": [
|
|
"src/prompt/template.ts",
|
|
"src/prompt/template.test.ts"
|
|
],
|
|
"test_status": "13/13 passing"
|
|
},
|
|
"system_info_tool": {
|
|
"status": "completed",
|
|
"description": "New system.info tool providing date, time, hostname, platform, architecture, OS release, uptime, Node.js version, memory usage, working directory. Added to all tool profiles (minimal/messaging/coding).",
|
|
"files_created": [
|
|
"src/tools/builtin/system-info.ts",
|
|
"src/tools/builtin/system-info.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/tools/builtin/index.ts",
|
|
"src/tools/policy.ts",
|
|
"src/tools/index.ts",
|
|
"SOUL.md"
|
|
],
|
|
"test_status": "6/6 passing"
|
|
}
|
|
}
|
|
},
|
|
"local-model-tool-calling": {
|
|
"status": "completed",
|
|
"date": "2026-02-07",
|
|
"summary": "Add tool calling support to both local model backends (Ollama and llama.cpp), plus thinking/reasoning field handling for Ollama",
|
|
"phases": {
|
|
"ollama_tool_calling": {
|
|
"status": "completed",
|
|
"description": "Pass tools to Ollama API in correct format, parse tool_calls from responses with generated IDs, set stopReason to 'tool_use'. Handle thinking field from reasoning models (deepseek-r1, glm-4.7-flash) — use as content fallback and expose via thinkingContent. Streaming support for both tool calls and thinking.",
|
|
"files_modified": [
|
|
"src/models/local/ollama.ts",
|
|
"src/models/local/ollama.test.ts"
|
|
],
|
|
"test_status": "8/8 passing (was 1)"
|
|
},
|
|
"llamacpp_tool_calling": {
|
|
"status": "completed",
|
|
"description": "Pass tools via OpenAI-compatible /v1/chat/completions endpoint, parse tool_calls from responses, accumulate streaming tool call deltas across incremental chunks. Set stopReason to 'tool_use' when tool calls present.",
|
|
"files_modified": [
|
|
"src/models/local/llamacpp.ts",
|
|
"src/models/local/llamacpp.test.ts"
|
|
],
|
|
"test_status": "8/8 passing (was 3)"
|
|
}
|
|
}
|
|
},
|
|
"tier3-remaining-features": {
|
|
"status": "completed",
|
|
"date": "2026-02-09",
|
|
"summary": "5 Tier 3 features from gap analysis: Lane Queue, credential redaction, Web UI token dashboard, xAI (Grok) provider, Voyage AI embeddings",
|
|
"phases": {
|
|
"lane_queue": {
|
|
"priority": "Tier3",
|
|
"status": "completed",
|
|
"description": "Per-session FIFO queue in gateway — serializes concurrent requests instead of rejecting. LaneQueue class with enqueue/cancel/queueLength methods.",
|
|
"files_created": [
|
|
"src/gateway/lane-queue.ts",
|
|
"src/gateway/lane-queue.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/gateway/handlers/agent.ts",
|
|
"src/gateway/server.ts",
|
|
"src/gateway/index.ts"
|
|
],
|
|
"test_status": "9/9 passing"
|
|
},
|
|
"credential_redaction": {
|
|
"priority": "Tier3",
|
|
"status": "completed",
|
|
"description": "Expanded redactConfig() from 2 secret locations to 18+ secret fields — telegram, discord, slack tokens; server.token; all model tier api_key/auth_token; web_search, audio, memory embedding api_keys; webhook secrets; gmail credentials; MCP server env vars.",
|
|
"files_modified": [
|
|
"src/gateway/handlers/config.ts",
|
|
"src/gateway/handlers/handlers.test.ts"
|
|
],
|
|
"test_status": "16/16 passing"
|
|
},
|
|
"web_ui_token_dashboard": {
|
|
"priority": "Tier3",
|
|
"status": "completed",
|
|
"description": "system.tokenUsage gateway endpoint + Usage page in web dashboard SPA with summary cards, per-session table, and auto-refresh.",
|
|
"files_created": [
|
|
"src/gateway/ui/pages/usage.js"
|
|
],
|
|
"files_modified": [
|
|
"src/gateway/handlers/system.ts",
|
|
"src/gateway/session-bridge.ts",
|
|
"src/daemon/index.ts",
|
|
"src/gateway/ui/index.html",
|
|
"src/gateway/ui/style.css"
|
|
]
|
|
},
|
|
"xai_grok_provider": {
|
|
"priority": "Tier3",
|
|
"status": "completed",
|
|
"description": "xAI as OpenAI-compatible model provider — reuses OpenAIClient with baseURL https://api.x.ai/v1, XAI_API_KEY env var fallback, pricing for grok-3/grok-3-mini/grok-2/grok-2-mini/grok-3-fast.",
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/daemon/index.ts",
|
|
"src/models/costs.ts"
|
|
]
|
|
},
|
|
"voyage_ai_embeddings": {
|
|
"priority": "Tier3",
|
|
"status": "completed",
|
|
"description": "Voyage AI embedding provider for memory/vector search — OpenAI SDK with baseURL https://api.voyageai.com/v1, defaults to 1024 dimensions, VOYAGE_API_KEY env var.",
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/memory/embeddings.ts",
|
|
"src/memory/embeddings.test.ts"
|
|
],
|
|
"test_status": "5/5 passing"
|
|
}
|
|
}
|
|
},
|
|
"tier4-features": {
|
|
"status": "completed",
|
|
"date": "2026-02-09",
|
|
"summary": "4 Tier 4 features from gap analysis: Gateway lock (single-client mode), shell completion (bash/zsh/fish), Tailscale Serve/Funnel, DM pairing codes (PairingManager + channel adapters + gateway handlers + TUI command)",
|
|
"phases": {
|
|
"gateway_lock": {
|
|
"priority": "Tier4",
|
|
"status": "completed",
|
|
"description": "Single-client gateway mode — if lock=true and a client is connected, reject new connections with code 4003. UI detects locked state.",
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/gateway/server.ts",
|
|
"src/gateway/server.test.ts",
|
|
"src/gateway/ui/lib/ws-client.js",
|
|
"src/daemon/index.ts"
|
|
],
|
|
"test_status": "4/4 passing"
|
|
},
|
|
"shell_completion": {
|
|
"priority": "Tier4",
|
|
"status": "completed",
|
|
"description": "Generate shell completions for bash, zsh, and fish. --install flag writes to appropriate rc file.",
|
|
"files_created": [
|
|
"src/cli/completion.ts",
|
|
"src/cli/completion.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/cli/index.ts"
|
|
],
|
|
"test_status": "11/11 passing"
|
|
},
|
|
"tailscale_serve": {
|
|
"priority": "Tier4",
|
|
"status": "completed",
|
|
"description": "Auto-start tailscale serve on gateway start, auto-stop on shutdown. isTailscaleAvailable() check, doctor integration.",
|
|
"files_created": [
|
|
"src/gateway/tailscale.ts",
|
|
"src/gateway/tailscale.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/gateway/index.ts",
|
|
"src/daemon/index.ts",
|
|
"src/cli/doctor.ts"
|
|
],
|
|
"test_status": "6/6 passing"
|
|
},
|
|
"dm_pairing_codes": {
|
|
"priority": "Tier4",
|
|
"status": "completed",
|
|
"description": "PairingManager with TTL codes, channel adapter integration (Telegram, Discord, Slack, WhatsApp), gateway pairing handlers (generate/list/revoke), TUI /pair command execution, daemon wiring, SQLite persistence via PairingStore interface.",
|
|
"files_created": [
|
|
"src/channels/pairing.ts",
|
|
"src/channels/pairing.test.ts",
|
|
"src/gateway/handlers/pairing.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/channels/index.ts",
|
|
"src/channels/telegram/adapter.ts",
|
|
"src/channels/discord/adapter.ts",
|
|
"src/channels/slack/adapter.ts",
|
|
"src/channels/whatsapp/adapter.ts",
|
|
"src/config/schema.ts",
|
|
"src/gateway/handlers/index.ts",
|
|
"src/gateway/handlers/handlers.test.ts",
|
|
"src/gateway/server.ts",
|
|
"src/daemon/index.ts",
|
|
"src/daemon/services.ts",
|
|
"src/session/store.ts",
|
|
"src/frontends/tui/commands.ts",
|
|
"src/frontends/tui/commands.test.ts",
|
|
"src/frontends/tui/minimal.ts",
|
|
"src/cli/tui.ts"
|
|
],
|
|
"test_status": "35/35 passing (20 pairing + 6 handlers + 4 store + 5 commands)"
|
|
}
|
|
}
|
|
},
|
|
"setup-wizard": {
|
|
"file": "2026-02-10-setup-wizard-implementation.md",
|
|
"status": "completed",
|
|
"date": "2026-02-10",
|
|
"design": "2026-02-10-setup-wizard-design.md",
|
|
"summary": "Interactive setup wizard for Flynn. Two entry points: auto-trigger on first run (flynn start with no config) and explicit flynn setup command. Minimal-first flow (provider + channel) then menu-driven reconfiguration (6 sections: models, channels, memory, automation, security, gateway). Made telegram optional in config schema.",
|
|
"files_created": [
|
|
"src/cli/setup.ts",
|
|
"src/cli/setup/prompts.ts",
|
|
"src/cli/setup/prompts.test.ts",
|
|
"src/cli/setup/config.ts",
|
|
"src/cli/setup/config.test.ts",
|
|
"src/cli/setup/summary.ts",
|
|
"src/cli/setup/providers.ts",
|
|
"src/cli/setup/providers.test.ts",
|
|
"src/cli/setup/channels.ts",
|
|
"src/cli/setup/channels.test.ts",
|
|
"src/cli/setup/memory.ts",
|
|
"src/cli/setup/automation.ts",
|
|
"src/cli/setup/security.ts",
|
|
"src/cli/setup/gateway.ts",
|
|
"src/cli/setup/orchestrator.ts",
|
|
"src/cli/setup/orchestrator.test.ts",
|
|
"src/cli/setup/sections.test.ts",
|
|
"src/cli/setup/integration.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/cli/start.ts",
|
|
"src/cli/index.ts",
|
|
"src/cli/completion.ts",
|
|
"src/daemon/channels.ts",
|
|
"src/cli/tui.ts",
|
|
"src/cli/doctor.ts"
|
|
],
|
|
"test_status": "31/31 passing"
|
|
},
|
|
"log-level-system": {
|
|
"status": "completed",
|
|
"date": "2026-02-09",
|
|
"summary": "Configurable log-level system to suppress noisy fallback debug output in TUI. Replaces console.debug/log/warn with structured logger respecting config log_level (default: info).",
|
|
"files_created": ["src/logger.ts"],
|
|
"files_modified": [
|
|
"src/models/router.ts",
|
|
"src/models/retry.ts",
|
|
"src/daemon/models.ts",
|
|
"src/config/schema.ts",
|
|
"src/daemon/index.ts",
|
|
"src/cli/tui.ts",
|
|
"config/default.yaml"
|
|
]
|
|
},
|
|
"earlier_plans": {
|
|
"plans": [
|
|
{ "file": "2026-02-02-flynn-design.md", "status": "completed" },
|
|
{ "file": "2026-02-02-flynn-phase1-implementation.md", "status": "completed" },
|
|
{ "file": "2026-02-02-flynn-phase2-implementation.md", "status": "completed" },
|
|
{ "file": "2026-02-05-flynn-phase3-implementation.md", "status": "completed" },
|
|
{ "file": "2026-02-05-tui-redesign.md", "status": "completed" },
|
|
{ "file": "2026-02-05-tui-redesign-implementation.md", "status": "completed" },
|
|
{ "file": "2026-02-05-llamacpp-integration-design.md", "status": "completed" },
|
|
{ "file": "2026-02-05-llamacpp-implementation.md", "status": "completed" },
|
|
{ "file": "2026-02-05-backend-switch-design.md", "status": "completed" },
|
|
{ "file": "2026-02-05-backend-switch-implementation.md", "status": "completed" },
|
|
{ "file": "2026-02-05-openclaw-parity-design.md", "status": "completed" },
|
|
{ "file": "2026-02-05-phase1-tool-framework.md", "status": "completed" },
|
|
{ "file": "2026-02-05-phase2-websocket-gateway.md", "status": "completed" },
|
|
{ "file": "2026-02-05-phase3-channel-adapters.md", "status": "completed" },
|
|
{ "file": "2026-02-05-phase5-cli-cron-doctor-design.md", "status": "completed" },
|
|
{ "file": "2026-02-05-phase5a-implementation.md", "status": "completed" }
|
|
]
|
|
}
|
|
},
|
|
|
|
"overall_progress": {
|
|
"total_test_count": 1151,
|
|
"all_tests_passing": true,
|
|
"p0_completion": "3/3 (100%)",
|
|
"p1_completion": "4/4 (100%)",
|
|
"p2_completion": "7/7 (100%)",
|
|
"p3_completion": "completed (group chat, gateway auth, Gemini, OpenRouter, Bedrock, browser control)",
|
|
"p4_completion": "1/1 (100%) — multimodal media pipeline",
|
|
"p5_completion": "1/1 (100%) — GitHub Copilot provider with auto-login",
|
|
"p6_completion": "4/4 (100%) — enhanced media pipeline (image.analyze, outbound attachments, gateway attachments, audio transcription)",
|
|
"p7_completion": "6/6 (100%) — web UI dashboard SPA (dashboard, chat, sessions, settings)",
|
|
"p8_completion": "8/8 (100%) — agent tools (sessions.list/history/create/delete, agents.list, message.send, cron.list/trigger) + gap analysis audit",
|
|
"tier1_completion": "5/5 (100%) — !!think prefix, /verbose command, typing indicators (Discord/WhatsApp), session pruning (TTL), tool groups",
|
|
"tier2_completion": "4/4 (100%) — inbound webhooks, vector memory search, Dockerfile, heartbeat monitor",
|
|
"tier3_completion": "5/5 (100%) — lane queue, credential redaction, web UI token dashboard, xAI (Grok) provider, Voyage AI embeddings",
|
|
"tier4_completion": "4/4 (100%) — gateway lock, shell completion, Tailscale Serve/Funnel, DM pairing codes",
|
|
"feature_gap_scorecard": "100/128 match (78%), 0 partial (0%), 28 missing (22%)",
|
|
"operator_dx_milestone": "Phase 3 (Live Ops Dashboard): 1/2 plans complete — metrics backend done, dashboard UI next",
|
|
"gmail_auth_cli": "flynn gmail-auth command implemented with OAuth2 flow, doctor check, config routed to Telegram",
|
|
"next_up": "GSD Milestone: Operator DX — Phase 3 Plan 02 (Dashboard UI consuming metrics RPC). All phases P0-P8 and Tiers 1-4 complete. Setup wizard added. Remaining gaps: Tier 4 channels (Signal, Matrix, Teams, Google Chat), Tier 5 deferred/niche items"
|
|
}
|
|
}
|