{ "version": "1.0", "updated_at": "2026-02-07", "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", "summary": "Comprehensive comparison of Flynn vs OpenClaw. 118 features compared: 29 match, 11 partial, 78 missing." }, "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": "4 P2 features: tech debt cleanup, retry policy, system prompt templating, usage tracking & cost estimation", "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)" } } }, "earlier_plans": { "status": "completed", "summary": "Original design and implementation phases from 2026-02-02 to 2026-02-05", "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": 818, "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)", "next_up": "All planned phases P0-P6 complete. Remaining gaps from feature analysis: Signal/iMessage/Teams channels, webhooks, onboard wizard, typing indicators for non-Telegram channels, session pruning, DM pairing" } }