1866 lines
89 KiB
JSON
1866 lines
89 KiB
JSON
{
|
|
"version": "1.0",
|
|
"updated_at": "2026-02-13",
|
|
"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"
|
|
]
|
|
},
|
|
"gmail-html-sanitization": {
|
|
"status": "completed",
|
|
"date": "2026-02-10",
|
|
"summary": "Sanitize HTML entities and tags in Gmail tool output. Gmail API returns snippets with HTML entities (&, ', <br>, etc.) that leaked into LLM responses. Added shared sanitizeHtml() utility and applied to both gmail tool and gmail watcher.",
|
|
"files_created": [
|
|
"src/utils/html.ts",
|
|
"src/utils/html.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/tools/builtin/gmail.ts",
|
|
"src/tools/builtin/gmail.test.ts",
|
|
"src/automation/gmail.ts"
|
|
],
|
|
"test_status": "21/21 passing (html.test) + 18/18 passing (gmail.test) + 16/16 passing (automation/gmail.test)"
|
|
},
|
|
"webchat-slash-commands": {
|
|
"status": "completed",
|
|
"date": "2026-02-10",
|
|
"summary": "Slash commands, autocomplete popup, web search button, and message action buttons (copy/edit) for the webchat SPA. 6 commands: /help, /reset, /compact, /usage, /status, /model. Search button toggles web search mode. Copy button on all messages, edit button on user messages populates input.",
|
|
"phases": {
|
|
"backend_command_handling": {
|
|
"status": "completed",
|
|
"description": "Extended agent.send RPC handler to accept optional metadata (isCommand, command). /reset handled server-side via agent.reset().",
|
|
"files_modified": [
|
|
"src/gateway/handlers/agent.ts"
|
|
]
|
|
},
|
|
"frontend_slash_commands": {
|
|
"status": "completed",
|
|
"description": "Slash command parsing, autocomplete popup (arrow keys, Enter/Tab/Escape), search button toggle, system messages, /help /reset /compact /usage /status /model handlers",
|
|
"files_modified": [
|
|
"src/gateway/ui/pages/chat.js"
|
|
]
|
|
},
|
|
"css_styling": {
|
|
"status": "completed",
|
|
"description": "Styles for .chat-actions, .btn-action, .slash-popup, .slash-popup-item, .message.system, .chat-input-wrapper, plus responsive breakpoints for 600px and 768px",
|
|
"files_modified": [
|
|
"src/gateway/ui/style.css"
|
|
]
|
|
},
|
|
"message_action_buttons": {
|
|
"status": "completed",
|
|
"description": "Discrete copy and edit buttons on messages. Copy on all messages (clipboard API with checkmark feedback), edit on user messages (populates input textarea). Hidden until hover on desktop, always visible on mobile.",
|
|
"files_modified": [
|
|
"src/gateway/ui/pages/chat.js",
|
|
"src/gateway/ui/style.css"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"tui-fullscreen-improvements": {
|
|
"status": "completed",
|
|
"date": "2026-02-10",
|
|
"summary": "ASCII art banner, fullscreen tool access via NativeAgent, Ink-compatible tool use display, proper /reset with agent state cleanup",
|
|
"phases": {
|
|
"ascii_banner": {
|
|
"status": "completed",
|
|
"description": "Shared banner module with FLYNN ASCII art, colored ANSI output for minimal mode, plain lines for Ink/React fullscreen mode",
|
|
"files_created": [
|
|
"src/frontends/tui/banner.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/frontends/tui/minimal.ts",
|
|
"src/frontends/tui/components/MessageList.tsx",
|
|
"src/frontends/tui/index.ts"
|
|
]
|
|
},
|
|
"fullscreen_tool_access": {
|
|
"status": "completed",
|
|
"description": "Fullscreen TUI now uses NativeAgent.process() for full tool loop instead of direct model client calls. Agent passed through from CLI to App component.",
|
|
"files_modified": [
|
|
"src/frontends/tui/fullscreen.ts",
|
|
"src/frontends/tui/components/App.tsx",
|
|
"src/cli/tui.ts"
|
|
]
|
|
},
|
|
"fullscreen_tool_display": {
|
|
"status": "completed",
|
|
"description": "Replaced process.stdout.write-based onToolUse callback with React state-driven display. Tool names, args, and completion status shown in streaming content area during agent processing.",
|
|
"files_modified": [
|
|
"src/frontends/tui/components/App.tsx"
|
|
]
|
|
},
|
|
"fullscreen_reset_fix": {
|
|
"status": "completed",
|
|
"description": "The /reset command now calls agent.reset() which clears session, history, tool fingerprint, and usage counters together.",
|
|
"files_modified": [
|
|
"src/frontends/tui/components/App.tsx"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"remaining-phases-phase1-pr1-context-levels": {
|
|
"file": "phase1-pr1-context-level-checklist.md",
|
|
"status": "completed",
|
|
"date": "2026-02-12",
|
|
"summary": "Added prompt context levels (minimal/normal/detailed/debug) with config schema support, prompt assembly behavior changes, daemon wiring, and coverage for parsing plus level-specific prompt output.",
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/prompt/template.ts",
|
|
"src/prompt/template.test.ts",
|
|
"src/daemon/services.ts",
|
|
"config/default.yaml"
|
|
],
|
|
"test_status": "typecheck + targeted template tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
|
|
},
|
|
"remaining-phases-phase1-pr2-command-registry": {
|
|
"file": "phase1-pr2-command-registry-checklist.md",
|
|
"status": "completed",
|
|
"date": "2026-02-12",
|
|
"summary": "Added a deterministic fast-path CommandRegistry with built-in slash commands and integrated it into channel routing and gateway agent handling so known commands execute before orchestrator message processing.",
|
|
"files_created": [
|
|
"src/commands/types.ts",
|
|
"src/commands/registry.ts",
|
|
"src/commands/builtin/index.ts",
|
|
"src/commands/index.ts",
|
|
"src/commands/registry.test.ts",
|
|
"src/gateway/handlers/agent.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/daemon/index.ts",
|
|
"src/daemon/routing.ts",
|
|
"src/daemon/routing.test.ts",
|
|
"src/daemon/services.ts",
|
|
"src/gateway/server.ts",
|
|
"src/gateway/handlers/agent.ts"
|
|
],
|
|
"test_status": "typecheck + targeted command/routing/gateway tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
|
|
},
|
|
"remaining-phases-phase1-pr3-memory-structure": {
|
|
"file": "phase1-pr3-memory-structure-checklist.md",
|
|
"status": "completed",
|
|
"date": "2026-02-12",
|
|
"summary": "Added structured memory categories (facts/preferences/decisions/projects) with backward-compatible MemoryStore category APIs, optional category-aware search filters, prompt-context category inclusion, and updated memory tool namespace docs.",
|
|
"files_created": [
|
|
"src/memory/categories.ts",
|
|
"src/memory/categories.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"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"
|
|
],
|
|
"test_status": "typecheck + targeted categories/store tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
|
|
},
|
|
"remaining-phases-phase2-pr1-component-registry": {
|
|
"file": "phase2-pr1-component-registry-checklist.md",
|
|
"status": "completed",
|
|
"date": "2026-02-12",
|
|
"summary": "Added intent/component registry routing with configurable match rules and deterministic resolution, integrated opt-in intent-based agent override in daemon routing, and exposed gateway inspection endpoints (`intents.list`, `intents.match`).",
|
|
"files_created": [
|
|
"src/intents/registry.ts",
|
|
"src/intents/index.ts",
|
|
"src/intents/registry.test.ts",
|
|
"src/gateway/handlers/intents.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/daemon/index.ts",
|
|
"src/daemon/routing.ts",
|
|
"src/daemon/routing.test.ts",
|
|
"src/daemon/services.ts",
|
|
"src/gateway/server.ts",
|
|
"src/gateway/handlers/index.ts",
|
|
"src/gateway/handlers/handlers.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted intents/routing/handlers tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
|
|
},
|
|
"remaining-phases-phase2-pr2-confidence-routing": {
|
|
"file": "phase2-pr2-confidence-routing-checklist.md",
|
|
"status": "completed",
|
|
"date": "2026-02-12",
|
|
"summary": "Added confidence-based routing policy with configurable thresholds to choose fast-path intent routing versus standard LLM orchestration, and exposed routing decision inspection via gateway.",
|
|
"files_created": [
|
|
"src/routing/policy.ts",
|
|
"src/routing/index.ts",
|
|
"src/routing/policy.test.ts",
|
|
"src/gateway/handlers/routing.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/intents/registry.test.ts",
|
|
"src/daemon/index.ts",
|
|
"src/daemon/routing.ts",
|
|
"src/daemon/routing.test.ts",
|
|
"src/daemon/services.ts",
|
|
"src/gateway/server.ts",
|
|
"src/gateway/handlers/index.ts",
|
|
"src/gateway/handlers/handlers.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted policy/intents/routing tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
|
|
},
|
|
"remaining-phases-phase2-pr3-history-index": {
|
|
"file": "phase2-pr3-history-index-checklist.md",
|
|
"status": "completed",
|
|
"date": "2026-02-13",
|
|
"summary": "Added lightweight session history indexing and topic search with migration-safe metadata persistence, ranked keyword search + recency scoring, gateway search/reindex handlers, and optional routing confidence boost from historical overlap.",
|
|
"files_created": [
|
|
"src/session/indexer.ts",
|
|
"src/session/search.ts",
|
|
"src/session/indexer.test.ts",
|
|
"src/session/search.test.ts",
|
|
"src/gateway/handlers/history.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/session/store.ts",
|
|
"src/session/store.test.ts",
|
|
"src/session/manager.ts",
|
|
"src/session/manager.test.ts",
|
|
"src/session/index.ts",
|
|
"src/daemon/index.ts",
|
|
"src/daemon/routing.ts",
|
|
"src/daemon/routing.test.ts",
|
|
"src/gateway/handlers/index.ts",
|
|
"src/gateway/handlers/handlers.test.ts",
|
|
"src/gateway/server.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run (1593/1593) + pnpm build passing"
|
|
},
|
|
"remaining-phases-phase3-pr1-adaptive-memory-compaction": {
|
|
"file": "phase3-pr1-adaptive-memory-compaction-checklist.md",
|
|
"status": "completed",
|
|
"date": "2026-02-12",
|
|
"summary": "Added configurable memory injection strategies (all/recent/adaptive) with adaptive relevance scoring and budget clipping, plus weighted compaction that can preserve high-importance turns while keeping default behavior when thresholds remain at defaults.",
|
|
"files_created": [
|
|
"src/memory/adaptive.ts",
|
|
"src/memory/adaptive.test.ts",
|
|
"src/context/weighting.ts",
|
|
"src/context/weighting.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/memory/store.ts",
|
|
"src/memory/index.ts",
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/backends/native/orchestrator.test.ts",
|
|
"src/context/compaction.ts",
|
|
"src/context/compaction.test.ts",
|
|
"src/daemon/routing.ts",
|
|
"src/gateway/session-bridge.ts"
|
|
],
|
|
"test_status": "typecheck + targeted adaptive/weighting/compaction/orchestrator tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
|
|
},
|
|
"remaining-phases-phase3-pr2-policy-autonomy-hardening": {
|
|
"file": "phase3-pr2-policy-autonomy-hardening-checklist.md",
|
|
"status": "completed",
|
|
"date": "2026-02-12",
|
|
"summary": "Added runtime-enforceable truthfulness guardrails (strict/standard/relaxed modes injected into system prompts) and autonomy-aware tool execution controls (conservative/standard/autonomous levels with per-tool danger classification and override logic). Both configs default to 'standard' for safe behavior.",
|
|
"files_created": [
|
|
"src/backends/native/guardrails.ts",
|
|
"src/backends/native/guardrails.test.ts",
|
|
"src/hooks/autonomy.ts",
|
|
"src/hooks/autonomy.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/tools/policy.ts",
|
|
"src/tools/executor.ts",
|
|
"src/audit/types.ts",
|
|
"src/prompt/template.ts",
|
|
"src/daemon/services.ts",
|
|
"src/daemon/routing.ts",
|
|
"src/gateway/session-bridge.ts",
|
|
"src/tools/integration.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted guardrails/autonomy/executor/engine/schema/template tests + full suite passing (1490/1490); lint passing baseline (394 warnings, 0 errors); build passing"
|
|
},
|
|
"model-persistence-per-session": {
|
|
"file": "2026-02-11-model-persistence-per-session.md",
|
|
"status": "completed",
|
|
"date": "2026-02-13",
|
|
"summary": "Implemented per-session model tier persistence across routing, gateway, and Telegram by adding SQLite session config storage and wiring /model and /reset command fast-paths to persist/clear model overrides.",
|
|
"files_modified": [
|
|
"src/session/store.ts",
|
|
"src/session/store.test.ts",
|
|
"src/session/manager.ts",
|
|
"src/session/manager.test.ts",
|
|
"src/session/index.ts",
|
|
"src/daemon/routing.ts",
|
|
"src/daemon/routing.test.ts",
|
|
"src/gateway/session-bridge.ts",
|
|
"src/gateway/session-bridge.test.ts",
|
|
"src/gateway/handlers/agent.ts",
|
|
"src/gateway/handlers/agent.test.ts",
|
|
"src/gateway/server.ts",
|
|
"src/gateway/handlers/index.ts",
|
|
"src/channels/telegram/adapter.ts",
|
|
"src/daemon/index.ts",
|
|
"src/daemon/services.ts",
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/backends/native/orchestrator.test.ts",
|
|
"src/context/compaction.ts",
|
|
"src/context/compaction.test.ts",
|
|
"src/memory/store.ts",
|
|
"src/memory/store.test.ts",
|
|
"src/memory/index.ts",
|
|
"src/tools/builtin/memory-read.ts",
|
|
"src/tools/builtin/memory-search.ts",
|
|
"src/tools/builtin/memory-write.ts",
|
|
"src/models/capabilities.ts",
|
|
"src/automation/cron.ts",
|
|
"src/automation/heartbeat.ts",
|
|
"src/cli/tui.ts",
|
|
"src/audit/types.ts",
|
|
"src/audit/logger.ts",
|
|
"src/audit/rotation.ts",
|
|
"config/default.yaml"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run (1586/1586) + pnpm build passing"
|
|
},
|
|
"gateway-agent-cancel-runtime": {
|
|
"status": "completed",
|
|
"date": "2026-02-13",
|
|
"summary": "Implemented real runtime cancellation wiring for `agent.cancel`: active requests are now cancellable at safe points in `NativeAgent`, queued lane work is cleared, and gateway/session bridge cancellation paths return explicit status messages.",
|
|
"files_modified": [
|
|
"src/backends/native/agent.ts",
|
|
"src/backends/native/agent.test.ts",
|
|
"src/backends/native/orchestrator.ts",
|
|
"src/gateway/session-bridge.ts",
|
|
"src/gateway/session-bridge.test.ts",
|
|
"src/gateway/handlers/agent.ts",
|
|
"src/gateway/handlers/handlers.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run (1597/1597) + pnpm build passing"
|
|
},
|
|
"skills_infrastructure": {
|
|
"file": "2026-02-11-skills-infrastructure-plan.md",
|
|
"status": "completed",
|
|
"date": "2026-02-11",
|
|
"summary": "Three-phase plan to improve skills system: Command Dispatch (P0), Skills Watcher (P1), Installer Specs (P1). Infrastructure-first approach before integrating ClawHub skills. Estimated 8-11 hours total. Model strategy: glm-4.7-flash for mechanical tasks, glm-4.7 for complex/orchestration tasks.",
|
|
"phases": {
|
|
"phase_1_command_dispatch": {
|
|
"priority": "P0",
|
|
"status": "completed",
|
|
"description": "flynn skills CLI commands (list/info/install/uninstall/refresh) with doctor enhancement",
|
|
"effort": "2-3 hours",
|
|
"sub_slices": {
|
|
"skills_list_command": {
|
|
"status": "completed",
|
|
"description": "Added `flynn skills list` command dispatch with table/JSON output and CLI registration",
|
|
"files_created": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/cli/index.ts",
|
|
"src/cli/index.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted skills/index CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
|
|
},
|
|
"skills_info_command": {
|
|
"status": "completed",
|
|
"description": "Added `flynn skills info <name>` command dispatch with human-readable and JSON output for discovered skills",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted skills CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
|
|
},
|
|
"skills_install_command_local": {
|
|
"status": "completed",
|
|
"description": "Added `flynn skills install <path>` local-directory command dispatch using SkillInstaller with config-aware managed_dir resolution",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted skills CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
|
|
},
|
|
"skills_uninstall_command": {
|
|
"status": "completed",
|
|
"description": "Added `flynn skills uninstall <name>` command dispatch with --yes confirmation guard and managed-tier uninstall protection",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted skills CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
|
|
},
|
|
"skills_refresh_command": {
|
|
"status": "completed",
|
|
"description": "Added `flynn skills refresh` command dispatch with human-readable and JSON summary output for current skill discovery",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted skills CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
|
|
},
|
|
"doctor_skills_diagnostics": {
|
|
"status": "completed",
|
|
"description": "Enhanced `flynn doctor` skills diagnostics to report availability counts and warn on missing configured skill directories",
|
|
"files_modified": [
|
|
"src/cli/doctor.ts",
|
|
"src/cli/doctor.test.ts"
|
|
],
|
|
"test_status": "typecheck + targeted doctor tests + full test suite + lint (warnings only, 0 errors) + build passing"
|
|
}
|
|
}
|
|
},
|
|
"phase_2_skills_watcher": {
|
|
"priority": "P1",
|
|
"status": "completed",
|
|
"description": "Auto-reload skills with chokidar file watcher, configurable debounce",
|
|
"effort": "3-4 hours",
|
|
"sub_slices": {
|
|
"watcher_bootstrap": {
|
|
"status": "completed",
|
|
"description": "Added core `SkillsWatcher` class with debounced change batching, lifecycle controls, and foundational tests",
|
|
"files_created": [
|
|
"src/skills/watcher.ts",
|
|
"src/skills/watcher.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/skills/index.ts"
|
|
],
|
|
"test_status": "typecheck + targeted watcher tests + full test suite + lint (warnings only, 0 errors) + build passing"
|
|
},
|
|
"watcher_daemon_wiring": {
|
|
"status": "completed",
|
|
"description": "Wired SkillsWatcher into daemon skills initialization and shutdown lifecycle behind config toggle with debounce settings",
|
|
"files_created": [
|
|
"src/daemon/services.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/daemon/services.ts",
|
|
"src/daemon/index.ts",
|
|
"src/skills/index.ts"
|
|
],
|
|
"test_status": "typecheck + targeted schema/services tests + full test suite + lint (warnings only, 0 errors) + build passing"
|
|
},
|
|
"watcher_callback_full_reload": {
|
|
"status": "completed",
|
|
"description": "Implemented watcher callback behavior to fully reload skills from disk and repopulate SkillRegistry on debounced change events",
|
|
"files_modified": [
|
|
"src/daemon/services.ts",
|
|
"src/daemon/services.test.ts",
|
|
"src/skills/registry.ts",
|
|
"src/skills/registry.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/daemon/services.test.ts src/skills/registry.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"watcher_targeted_skill_updates": {
|
|
"status": "completed",
|
|
"description": "Optimized watcher callback to perform targeted skill add/update/remove by mapped path, with safe fallback to full reload for ambiguous paths",
|
|
"files_modified": [
|
|
"src/daemon/services.ts",
|
|
"src/daemon/services.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/daemon/services.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"watcher_observability_polish": {
|
|
"status": "completed",
|
|
"description": "Improved watcher event logs with explicit mode/reason and per-event counters for upsert/remove/shadowed updates versus fallback reloads",
|
|
"files_modified": [
|
|
"src/daemon/services.ts",
|
|
"src/daemon/services.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/daemon/services.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
}
|
|
}
|
|
},
|
|
"phase_3_installer_specs": {
|
|
"priority": "P1",
|
|
"status": "completed",
|
|
"description": "Auto-install dependencies (brew/node/go/download) with package manager detection",
|
|
"effort": "3-4 hours",
|
|
"sub_slices": {
|
|
"manifest_installers_type_validation": {
|
|
"status": "completed",
|
|
"description": "Added manifest installers type definitions and loader validation for brew/node/go/download installer specs with focused tests",
|
|
"files_modified": [
|
|
"src/skills/types.ts",
|
|
"src/skills/index.ts",
|
|
"src/skills/loader.ts",
|
|
"src/skills/loader.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/skills/loader.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_dry_run_planning_surface": {
|
|
"status": "completed",
|
|
"description": "Added dry-run installer planning with package-manager selection rules and surfaced planned/skipped installer steps in skills info output",
|
|
"files_created": [
|
|
"src/skills/planner.ts",
|
|
"src/skills/planner.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/skills/index.ts",
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/skills/planner.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_plan_command_json_output": {
|
|
"status": "completed",
|
|
"description": "Added dedicated skills plan command surface with reusable installer plan view and JSON/text rendering helpers for automation consumption",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_preflight_preview_in_install": {
|
|
"status": "completed",
|
|
"description": "Wired dry-run installer preflight preview into skills install flow with optional JSON output for automation clients",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"install_preflight_only_mode": {
|
|
"status": "completed",
|
|
"description": "Added --preflight-only mode to skills install for plan-only previews without performing installation, including JSON output path",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_execution_stub_command": {
|
|
"status": "completed",
|
|
"description": "Added skills execute command that consumes installer plans and reports stub execution output without running package-manager commands",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"shared_install_action_modes": {
|
|
"status": "completed",
|
|
"description": "Centralized install action handling into shared plan-only/stub/install modes and wired install command options through the shared flow while keeping real installer execution disabled",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_safety_confirmation_receipts": {
|
|
"status": "completed",
|
|
"description": "Added explicit --confirm semantics and stable no-op execution receipt fields for plan-only/stub/install JSON outputs while keeping installer command execution disabled",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_execution_policy_gate_checks": {
|
|
"status": "completed",
|
|
"description": "Added explicit execution policy gate evaluation for install/stub modes and surfaced policy reasons (including confirmation_required) in no-op execution receipts while preserving disabled command execution",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_runner_interface_noop": {
|
|
"status": "completed",
|
|
"description": "Added a pluggable installer command runner interface with policy-gated dispatch and a default no-op runner, preserving execution-disabled behavior while preparing a future real runner",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_step_execution_envelopes_noop": {
|
|
"status": "completed",
|
|
"description": "Added structured per-step execution envelopes (`attempted` + `results`) to install/plan/stub JSON receipts with policy-derived blocked/skipped statuses while keeping command execution disabled",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_runner_terminal_status_mapping": {
|
|
"status": "completed",
|
|
"description": "Extended step result envelopes to support real-runner terminal statuses (`succeeded`/`failed`) and added runner-to-envelope mapping helpers while retaining execution-disabled defaults",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_optional_shell_runner": {
|
|
"status": "completed",
|
|
"description": "Added an optional concrete shell-based installer command runner that emits structured succeeded/failed command results with machine-readable reasons, while default flow remains policy-gated and no-op",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_cli_runner_opt_in_wiring": {
|
|
"status": "completed",
|
|
"description": "Added explicit install CLI opt-in wiring for execution (`--execute`) and runner selection (`--runner noop|shell`) with strict confirmation gating, preserving execution-disabled defaults unless explicitly requested",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"skills_execute_opt_in_runner_wiring": {
|
|
"status": "completed",
|
|
"description": "Extended `skills execute <name>` with explicit execution opt-in and runner selection (`--execute`, `--runner noop|shell`), wired through shared policy/result envelope logic with safe defaults and confirmation gating",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"skills_cli_option_parsing_integration_tests": {
|
|
"status": "completed",
|
|
"description": "Added CLI-level integration tests for `skills install`/`skills execute` option parsing and failure modes around `--execute`, `--runner`, and `--confirm`, validating command wiring through commander actions",
|
|
"files_modified": [
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"skills_execute_without_confirm_guardrails": {
|
|
"status": "completed",
|
|
"description": "Added explicit user-facing CLI guardrails for invalid execution opt-in (`--execute` without `--confirm`) on both install and execute commands, with deterministic error messaging and exit status coverage",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_receipt_edge_case_tests": {
|
|
"status": "completed",
|
|
"description": "Added edge-case coverage for execution receipt mapping: partial/empty runner results, deterministic fallback reasons, and commander-path JSON fallback statuses for install/execute flows",
|
|
"files_modified": [
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_execution_global_policy_gate": {
|
|
"status": "completed",
|
|
"description": "Added a global skills execution policy gate (`skills.installation_execution`) with default disabled behavior, wiring install/execute CLI flows to return deterministic `execution_policy_disabled` receipts unless config explicitly enables execution",
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts",
|
|
"config/default.yaml"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"installer_execution_policy_help_text": {
|
|
"status": "completed",
|
|
"description": "Improved user-facing execution guidance by documenting config gate requirements in CLI option help text and adding explicit render output when policy blocks installer execution",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"shell_runner_rollout_controls": {
|
|
"status": "completed",
|
|
"description": "Added explicit config-gated rollout control for shell runner usage (`skills.allow_shell_runner` default false), with deterministic CLI guard errors for install/execute when `--runner shell` is requested without policy enablement",
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts",
|
|
"config/default.yaml"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"shell_runner_command_allowlist": {
|
|
"status": "completed",
|
|
"description": "Added command-level shell runner allowlisting via `skills.shell_runner_allowlist` patterns, wiring install/execute shell runs to block non-matching commands with deterministic `allowlist_blocked` receipt reasons",
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts",
|
|
"config/default.yaml"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"shell_runner_audit_telemetry": {
|
|
"status": "completed",
|
|
"description": "Added deterministic shell-runner audit telemetry hooks using existing audit tool events, emitting policy denials and per-command outcomes for install/execute shell flows via `emitShellRunnerAuditEvents(...)`",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"skills_installer_dedicated_audit_events": {
|
|
"status": "completed",
|
|
"description": "Added dedicated audit event types (`skills.installer.execution_blocked`, `skills.installer.command_result`) and migrated shell-runner telemetry emission from generic tool events to richer skills installer event contracts",
|
|
"files_modified": [
|
|
"src/audit/types.ts",
|
|
"src/audit/logger.ts",
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"skills_installer_audit_command_redaction_hashing": {
|
|
"status": "completed",
|
|
"description": "Hardened skills installer audit payload safety by hashing command strings and sanitizing potentially sensitive spawn-error reason details before emitting shell-runner command-result telemetry",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint + pnpm build passing"
|
|
},
|
|
"shell_runner_rollout_status_and_guardrails": {
|
|
"status": "completed",
|
|
"description": "Added `skills rollout-status` with phased recommendation output (`locked|guarded_observe|guarded_review|expand_candidate`), guardrail checks for execution/audit/allowlist posture, and audit-window telemetry summary including hashed-command coverage",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint + pnpm build passing"
|
|
},
|
|
"shell_runner_governance_workflow_operationalization": {
|
|
"status": "completed",
|
|
"description": "Operationalized shell-runner allowlist governance by adding explicit config-backed ownership/review/promotion criteria (`skills.shell_runner_governance`) and wiring `skills rollout-status` to enforce owner presence when shell runner is enabled",
|
|
"files_modified": [
|
|
"src/config/schema.ts",
|
|
"src/config/schema.test.ts",
|
|
"config/default.yaml",
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"shell_runner_rollout_status_export_output": {
|
|
"status": "completed",
|
|
"description": "Extended `skills rollout-status` with `--out <path>` export support so governance and recommendation payloads can be saved as machine-readable JSON artifacts for review workflows",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"shell_runner_rollout_trend_snapshot": {
|
|
"status": "completed",
|
|
"description": "Added historical trend snapshots to `skills rollout-status` by comparing current and previous equal-duration windows, including deltas for failures, allowlist blocks, and hashed-command coverage in both console and JSON payloads",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"shell_runner_rollout_promotion_policy_checks": {
|
|
"status": "completed",
|
|
"description": "Added promotion-policy evaluation to `skills rollout-status` using governance thresholds (`review_cadence_days`, `promotion_min_success_rate`) and trend deltas, with structured blockers/recommendation in JSON and console output",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
|
|
},
|
|
"shell_runner_promotion_contract_output": {
|
|
"status": "completed",
|
|
"description": "Added dedicated machine-readable promotion contract output for `skills rollout-status` (`--contract`) with stable schema, CI-friendly gate/exit code semantics, and optional `--out` export support",
|
|
"files_modified": [
|
|
"src/cli/skills.ts",
|
|
"src/cli/skills.test.ts"
|
|
],
|
|
"test_status": "pnpm test:run src/cli/skills.test.ts + pnpm typecheck + pnpm build passing"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"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": 1597,
|
|
"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): 2/2 plans complete — milestone done",
|
|
"gmail_auth_cli": "flynn gmail-auth command implemented with OAuth2 flow, doctor check, config routed to Telegram",
|
|
"native_audio_support": "completed — smart routing for native audio (Gemini/OpenAI/GitHub) vs Whisper transcription fallback",
|
|
"remaining_phases_completion": "Phase 1: 3/3 (100%) — context levels, command registry, memory structure. Phase 2: 3/3 (100%) — component registry, confidence routing, history index. Phase 3: 2/2 (100%) — adaptive memory/compaction, truthfulness/autonomy hardening",
|
|
"next_up": "Define next milestone and create a new implementation checklist (all remaining-phases PR slices complete)"
|
|
},
|
|
"soul_md_and_cron_create": {
|
|
"date": "2026-02-11",
|
|
"summary": "SOUL.md updated with comprehensive tool listing (web.search, memory.*, cron.*, process.*) and stronger 'act don't narrate' guidance. Added cron.create and cron.delete tools for runtime cron job management. Updated tool policy profiles (messaging/coding) and group:cron. Fixed issue where Flynn would narrate intended actions without calling tools.",
|
|
"files_modified": [
|
|
"SOUL.md",
|
|
"src/tools/builtin/cron.ts",
|
|
"src/automation/cron.ts",
|
|
"src/tools/policy.ts"
|
|
]
|
|
},
|
|
"local-model-message-normalization": {
|
|
"date": "2026-02-11",
|
|
"summary": "Ollama & llama.cpp tool calling message normalization — normalizeMessagesForOllama() converts tool_use/tool_result content blocks to Ollama's native role:tool format, normalizeMessagesForLlamaCpp() converts to OpenAI-style tool_calls arrays with hybrid fallback for GGUF templates that drop role:tool messages.",
|
|
"files_modified": [
|
|
"src/models/local/ollama.ts",
|
|
"src/models/local/ollama.test.ts",
|
|
"src/models/local/llamacpp.ts",
|
|
"src/models/local/llamacpp.test.ts"
|
|
]
|
|
},
|
|
"agent-loop-resilience": {
|
|
"date": "2026-02-11",
|
|
"summary": "Agent loop same-tool nudging (after 4 consecutive identical tool calls, inject a nudge message) and try-catch error handling around individual tool executions to prevent daemon crashes.",
|
|
"files_modified": [
|
|
"src/backends/native/agent.ts",
|
|
"src/backends/native/agent.test.ts"
|
|
]
|
|
},
|
|
"native-audio-support": {
|
|
"status": "completed",
|
|
"date": "2026-02-11",
|
|
"summary": "Native audio input support — voice messages passed directly to audio-capable models (Gemini, OpenAI, GitHub) instead of always transcribing via Whisper. Smart routing decides per-model whether to pass raw audio or transcribe first.",
|
|
"phases": {
|
|
"audio_transcribe_tool": {
|
|
"status": "completed",
|
|
"description": "audio.transcribe tool with Whisper-compatible API support",
|
|
"files_created": [
|
|
"src/tools/builtin/audio-transcribe.ts"
|
|
]
|
|
},
|
|
"type_system_and_clients": {
|
|
"status": "completed",
|
|
"description": "AudioSource type, audio content part handling in all model clients (Gemini inlineData, OpenAI input_audio, GitHub input_audio = native; Anthropic, Bedrock = text fallback)",
|
|
"files_modified": [
|
|
"src/models/types.ts",
|
|
"src/models/gemini.ts",
|
|
"src/models/openai.ts",
|
|
"src/models/github.ts",
|
|
"src/models/anthropic.ts",
|
|
"src/models/bedrock.ts",
|
|
"src/models/media.ts"
|
|
]
|
|
},
|
|
"capabilities_and_routing": {
|
|
"status": "completed",
|
|
"description": "supportsAudioInput() capability check, smart routing in daemon that transcribes for non-audio models and passes raw audio for capable ones, supports_audio config override",
|
|
"files_created": [
|
|
"src/models/capabilities.ts",
|
|
"src/models/capabilities.test.ts"
|
|
],
|
|
"files_modified": [
|
|
"src/daemon/routing.ts",
|
|
"src/config/schema.ts"
|
|
],
|
|
"test_status": "18/18 passing"
|
|
},
|
|
"tests_and_token_estimation": {
|
|
"status": "completed",
|
|
"description": "Audio tests for media helpers, audio token estimation (base64→bytes→duration→tokens at 32 tokens/sec), supports_audio config override wiring",
|
|
"files_modified": [
|
|
"src/models/media.test.ts",
|
|
"src/context/tokens.ts",
|
|
"src/context/tokens.test.ts"
|
|
],
|
|
"test_status": "20/20 tokens tests, 87/87 media tests"
|
|
}
|
|
}
|
|
},
|
|
"stopreason-normalization": {
|
|
"date": "2026-02-11",
|
|
"summary": "Normalize OpenAI/GitHub finish_reason to Flynn stopReason conventions. OpenAI 'stop' → 'end_turn', 'length' → 'max_tokens', 'tool_calls' with tools → 'tool_use', 'tool_calls' without tools → 'end_turn'. Fixes premature agent loop exit when falling back to GitHub Copilot (Anthropic API quota exhausted). Agent loop now accepts both 'tool_use' and 'tool_calls' as belt-and-suspenders.",
|
|
"files_modified": [
|
|
"src/models/openai.ts",
|
|
"src/models/openai.test.ts",
|
|
"src/models/github.ts",
|
|
"src/backends/native/agent.ts"
|
|
],
|
|
"test_status": "4/4 passing"
|
|
}
|
|
}
|