# Conduit ↔ Claude Code v2.1.126 Reference Map > **Purpose:** Behavioral reference mapping between the Claude Code TypeScript > source, the decompiled v2.1.126 binary chunks, and the Go conduit > implementation. Used for understanding CC behavior, tracking intentional > divergences, and milestone planning. Conduit maintains wire compatibility > (OAuth, API headers, plugin format) but is free to diverge in behavior and > features β€” divergences are noted in the Notes column. > > **Status legend:** > - βœ… Complete β€” implemented and tested in conduit > - 🟑 Partial β€” exists but missing edge cases or sub-features > - ❌ Missing β€” not yet implemented > - ⬛ Descoped β€” intentionally excluded > - πŸ”² N/A β€” not applicable to Go binary (React/Ink UI idioms, etc.) ## Milestone completions (2026-05) | Milestone | Status | Key deliverables | |-----------|--------|-----------------| | M-A CLAUDE.md loading | βœ… | Directory walk, @include, TypeUser/Project/Local, system block injection | | M-B Agent/API gaps | βœ… | Exponential backoff (429), HTTP proxy, auto-compact, thinking budget, rate-limit display | | M-C Missing tools | βœ… | EnterPlanMode, ExitPlanMode, AskUserQuestion, Config, StructuredOutput | | M-D Missing slash commands | βœ… | /status, /tasks, /agents, /thinkback, /color, /copy, /search, LiveState fix | | M-E Hook completion | βœ… | HTTP hooks, prompt hooks, agent hooks, async hooks, desktop notifications | | M-F Session completion | βœ… | Cost persistence, session titles in /resume, /search, file access tracking | | M-G Config completion | βœ… | env injection, XDG/Windows paths, claudeDir(), settings.ApplyEnv() | | M-H MCP completion | βœ… | ListResources, ReadResource on stdio+HTTP clients; ListMcpResources/ReadMcpResource tools | | M-I TUI polish | βœ… | Full GFM: headings, italic, strikethrough, task lists, tables, blockquotes, H-rules | | M-J Worktree support | βœ… | EnterWorktree, ExitWorktree, git worktree add/remove, sanitizeSlug | | M-K Rate limit display | βœ… | anthropic-ratelimit-* headers, warning <20%, EventRateLimit, status bar | | M-L Token counting + fast mode | βœ… | /fast (⚑ badge), /effort (thinking budget), model.ThinkingBudgets map | | M-N Memory completion | βœ… | ScanMemories, RelevantMemories, /memory list/show/scan, age tracking | | M-P Bubbletea v2 upgrade | βœ… | charm.land/v2 across bubbletea/bubbles/lipgloss; native Shift+Enter via Kitty keyboard protocol; declarative tea.View; structured key.Code + key.Mod | | M-Q Custom keybindings | βœ… | `internal/keybindings/` β€” parser, resolver, JSON loader, defaults. TUI hookup: `activeContexts()`, `dispatchKeybindingAction()`, `command:*` slash dispatch, chat/select/confirm action IDs. | | M-R Image paste | βœ… | ctrl+v reads clipboard via osascript (macOS PNG/TIFF) or xclip/wl-paste (Linux). Multiple images accumulate, badge shows count. tea.PasteMsg for large text pastes. | | M-S Bubbletea v2 polish | βœ… | Sticky-bottom scroll, overlay viewport shrink, system msg wrap, innerW lipgloss-v2 fix, ctrl+c signal handling, handleKey/handleKeyBuiltins split (prevents KB recursion), /keybindings live resolver output | | M-T Crush-inspired TUI polish | βœ… | `internal/tui/workinganim/` gradient scramble work indicator replaces the plain footer Thinking spinner; ultraviolet compositor layers floating, size-clamped panels/pickers/modals without viewport shrink; assistant info rows show model/duration/cost; live and resumed tool rows stay one-line with tool-specific verbs and summaries while preserving error details | **Test count:** 507 passing, race clean (2026-05-02) --- ## Wire sync notes ### 2.1.137 β†’ 2.1.138 (2026-05-10) | Item | Action | |------|--------| | `Version` | Bumped to `2.1.138` in `cmd/conduit/main.go` | | No other changes | All other wire constants unchanged (`sdk_package_version`, `anthropic-version`, `oauth_client_id`, `token_url`, `oauth_beta_header`, `beta_registry` remain identical) | --- ### 2.1.133 β†’ 2.1.137 (2026-05-09) | Item | Action | |------|--------| | `Version` | Bumped to `2.1.137` in `cmd/conduit/main.go` | | `SDKPackageVersion` | Bumped to `0.93.0` in `internal/api/client.go` | | `oidc-federation-2026-04-01` | Added to `betaHeaders` in `internal/app/auth.go`; appeared in upstream beta registry | | `web_search` tool | Detected upstream; conduit does not implement (no search endpoint exposed to external OAuth clients) | | `mcp`, `mcp__` | Detected as upstream tool names; conduit MCP tool is `ListMcpResources`/`ReadMcpResourceTool` (already βœ…) β€” the bare `mcp`/`mcp__` names are pass-through aliases in upstream CC, not separate tools | | `ReadMcpResourceTool` | Already implemented in `internal/tools/mcpresourcetool/` (M-H) | | Beta extractor divergence | Upstream 2.1.137 beta registry only shows 2 betas via extractor pattern matching; conduit sends 11. Extra betas are still valid API features β€” downgraded to DIVERGED in verify.mjs (not a blocking incompatibility). Verify via mitmproxy capture if needed. | | New headers (v137) | `anthropic-admin-api-key`, `anthropic-api-key`, `anthropic-client-platform`, `anthropic-marketplace`, `anthropic-plugins`, `anthropic-workspace-id`, `x-anthropic-additional-protection` added to KNOWN_HEADERS in extract.mjs. CCR-only: `x-claude-remote-container-id`, `x-claude-remote-session-id` (bridge infra, conduit descoped). | --- ## 1. Auth & OAuth | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | OAuth 2.0 + PKCE flow | `utils/auth.ts` (2002 LOC) | `1220.js`, `0533.js` | `internal/auth/flow.go`, `pkce.go`, `authurl.go` | βœ… | | | Token exchange (code β†’ token) | `services/oauth/` | `1220.js` | `internal/auth/token.go` | βœ… | | | Token refresh | `utils/auth.ts` | `1220.js` | `internal/auth/persist.go` `EnsureFresh` | βœ… | | | Token persistence (keychain) | `utils/auth.ts` | `1220.js` | `internal/secure/`, `internal/auth/persist.go` | βœ… | Uses file-based + go-keyring | | OAuth callback HTTP listener | `services/oauth/auth-code-listener.ts` | `0533.js` | `internal/auth/listener.go` | βœ… | | | Browser launch for login | `utils/auth.ts` | `0533.js` | `internal/auth/browser.go` | βœ… | | | Auth file descriptor tokens | `utils/authFileDescriptor.ts` | β€” | ❌ | ⬛ | CCR container only (FD pipe across tmux boundaries) | | Portable auth | `utils/authPortable.ts` | β€” | ❌ | ⬛ | macOS Keychain removal utility; not needed | | Profile fetch (name, email) | `utils/auth.ts` | `1220.js` | `internal/profile/profile.go` | βœ… | | | Multi-account support | `utils/auth.ts` | β€” | `internal/auth/accounts.go` | βœ… | `~/.conduit/conduit.json` `accounts` metadata + per-email keychain keys; imports legacy `~/.claude/accounts.json`; `/login` registers account; `/login --switch ` activates; `/logout` removes active; `loadAuth` uses active email; backwards-compatible with legacy single-account key | | Token revocation | `utils/auth.ts` | β€” | `internal/auth/persist.go` Delete | βœ… | Local keychain clear; Anthropic OAuth has no public RFC 7009 endpoint β€” server-side revoke is through the console | | JWT utils (bridge auth) | `bridge/jwtUtils.ts` | β€” | ❌ | ⬛ | Bridge-only | | Trusted device auth | `bridge/trustedDevice.ts` | β€” | ❌ | ⬛ | Bridge-only | | Work secret | `bridge/workSecret.ts` | β€” | ❌ | ⬛ | Bridge-only | | AWS auth status | `components/AwsAuthStatusBox.tsx` | β€” | ❌ | ⬛ | AWS-specific | | mTLS certificate handling | `utils/mtls.ts` | β€” | ❌ | ⬛ | Enterprise-only | | CA certificate management | `utils/caCerts.ts`, `caCertsConfig.ts` | β€” | ❌ | ⬛ | Enterprise-only | --- ## 2. API Client & SSE Streaming | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | HTTP POST /v1/messages | `utils/api.ts` | `0158.js`, `4500.js` | `internal/api/client.go` | βœ… | | | Streaming SSE parsing | `services/api/` | `0137.js`, `0156.js` | `internal/sse/parser.go`, `internal/api/stream.go` | βœ… | | | Required headers (User-Agent, x-app, beta) | `utils/api.ts` | `4500.js` | `internal/api/client.go` | βœ… | Exact headers matched | | Cache-control on system blocks | `services/api/` | `2831.js` | `internal/api/client.go` | βœ… | ephemeral + scope=global | | 401 refresh + retry | `utils/api.ts` | `4500.js` | `internal/api/client.go` | βœ… | | | 429 retry-after handling | `utils/api.ts` | `4500.js` | `internal/api/retry.go` | βœ… | Exp backoff: base 1s, 2Γ—, max 32s, jitter, 5 retries | | Request timeout (600s) | `utils/api.ts` | `4500.js` | `internal/api/client.go` | βœ… | X-Stainless-Timeout: 600 | | Stainless headers | `utils/api.ts` | `4500.js` | `internal/api/client.go` | βœ… | | | HTTP proxy support | `utils/proxy.ts` | β€” | `internal/api/retry.go` | βœ… | HTTPS_PROXY/HTTP_PROXY via NewClientWithProxy | | VCR request recording/playback | `services/vcr.ts` | β€” | ❌ | ⬛ | Debug/testing only | | API pre-connect optimization | `utils/apiPreconnect.ts` | β€” | `cmd/conduit/main.go` | βœ… | Background HEAD to api.anthropic.com during startup | | Rate limit quota tracking | `services/claudeAiLimits.ts` | β€” | `internal/ratelimit/ratelimit.go` | βœ… | Parse anthropic-ratelimit-* headers, <20% warning in status bar | | Rate limit messages | `services/rateLimitMessages.ts` | β€” | `internal/ratelimit/ratelimit.go` | βœ… | WarningMessage() in status bar | | Claude plan usage footer | `statusLine` user command + oauth usage endpoint | β€” | `internal/planusage/`, `/toggle-usage` | βœ… | conduit-only native footer: 5h/7d usage windows, reset times, cached 60s fetch loop; API 429 reset metadata is reflected immediately in the current-session row | | Token estimation | `services/tokenEstimation.ts` | β€” | `internal/tokens/tokens.go` | βœ… | cl100k_base via tiktoken-go; falls back to chars/4 if encoder init fails | | Cost tracking | `cost-tracker.ts` (323 LOC) | β€” | `internal/session/extras.go` | βœ… | AppendCost per turn, LoadCost on resume | --- ## 3. Agent Loop & Query Engine | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Main agentic loop (query β†’ tool β†’ response) | `QueryEngine.ts` (1295 LOC), `query.ts` (1729 LOC) | `3585.js`, `3918.js`, `4091.js` | `internal/agent/loop.go` | βœ… | | | Multi-turn tool dispatch | `QueryEngine.ts` | `3585.js` | `internal/agent/loop.go` `executeTools` | βœ… | | | Parallel tool execution (bounded pool) | `coordinator/coordinatorMode.ts` | β€” | `internal/agent/loop.go` | βœ… | maxConcurrentTools=4 | | System prompt assembly | `constants/prompts.ts` | `2831.js` | `internal/agent/systemprompt.go` | πŸ”Ά | Content complete (tool-usage policy, search, skills, error-recovery, blast-radius sections added) but not byte-identical to TS β€” conduit-authored to avoid IP reproduction. | | Billing header injection | β€” | `2831.js` | `internal/agent/systemprompt.go` | βœ… | | | Sub-agent spawning | `tools/AgentTool/` | β€” | `internal/agent/loop.go` `RunSubAgent` | βœ… | | | Max turns limit | `query.ts` | β€” | `internal/agent/loop.go` | βœ… | | | Context compaction (auto) | `services/compact/autoCompact.ts` | β€” | `internal/agent/loop.go` | βœ… | Fires near model/provider context limit using input + cache read/write prompt tokens | | Micro-compaction | `services/compact/microCompact.ts` | β€” | `internal/microcompact/microcompact.go` | βœ… | Time-based path: when last assistant >60min old, replace older tool_results with `[Old tool result content cleared]`, keep last 5. Cache-editing path is Anthropic-internal. | | Session memory compaction | `services/compact/sessionMemoryCompact.ts` | β€” | ❌ | ⬛ | GrowthBook-gated (`tengu_sm_compact`+`tengu_session_memory`); see FEATURE_FLAGS.md | | Token budget tracking | `query/tokenBudget.ts` | β€” | `internal/tui/model.go` (tallyTokens/syncLive), `internal/tui/livestate.go`, `internal/agent/loop.go` | βœ… | Shows context-window usage separately from billing totals; provider `contextWindow` overrides model-name fallback; auto-compact counts input + cache read/write prompt tokens against the model context window | | Extended thinking / effort modes | `utils/effort.ts` | β€” | `internal/model/model.go`, `internal/agent/loop.go` | βœ… | ThinkingBudgets map; /effort low\|medium\|high\|max; CLAUDE_THINKING_BUDGET env | | Interleaved thinking | `constants/betas.ts` | β€” | `internal/agent/systemprompt.go` | βœ… | Beta header included | | Stop hooks (clean shutdown) | `query/stopHooks.ts` | β€” | `internal/hooks/hooks.go` `RunStop` | βœ… | | | Query profiler | `utils/queryProfiler.ts` | β€” | ❌ | ⬛ | Debug only | | Conversation recovery on error | `utils/conversationRecovery.ts` | β€” | `internal/agent/loop.go` + `internal/session/session.go` | βœ… | drainStream returns partial blocks; EventPartial persists to JSONL; LoadMessages applies FilterUnresolvedToolUses on /resume | --- ## 4. Tools ### 4a. Core Tool Framework | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Tool interface & registry | `Tool.ts` (792 LOC), `tools.ts` (389 LOC) | β€” | `internal/tool/tool.go` | βœ… | | | Permission gate per tool | `hooks/toolPermission/` | β€” | `internal/permissions/permissions.go` | βœ… | | | Tool result envelope | `Tool.ts` | β€” | `internal/tool/tool.go` `Result` | βœ… | | | ReadOnly + ConcurrencySafe flags | `Tool.ts` | β€” | `internal/tool/tool.go` | βœ… | | | Tool schema (JSON Schema) | `Tool.ts` | β€” | `internal/tool/*.go` | βœ… | | | Tool search / deferred loading | `tools/ToolSearchTool/` | β€” | `internal/tools/toolsearchtool/` | βœ… | | | Synthetic output tool | `tools/SyntheticOutputTool/` | β€” | `internal/tools/syntheticoutputtool/` | βœ… | | ### 4b. Individual Tools | Tool | TS Source | Decoded Chunk | Go (conduit) | Status | Notes | |------|-----------|--------------|--------------|--------|-------| | AgentTool (Task) | `tools/AgentTool/` | β€” | `internal/tools/agenttool/` | βœ… | Wire name "Task" | | AskUserQuestion | `tools/AskUserQuestionTool/` | β€” | `internal/tools/askusertool/` | βœ… | Blocks on TUI permissionAskMsg | | BashTool | `tools/BashTool/` (18 files) | β€” | `internal/tools/bashtool/` | βœ… | RTK filtering wired. **Divergence**: on Windows, BashTool is NOT registered; instead `internal/tools/winshelltool/` (Shell/PowerShell) is registered under the name "Shell". | | BriefTool | `tools/BriefTool/` | β€” | ❌ | ⬛ | KAIROS-gated (GrowthBook build flag) | | ConfigTool | `tools/ConfigTool/` | β€” | `internal/tools/configtool/` | βœ… | get/set model, modes, allow/deny, env | | EnterPlanMode | `tools/EnterPlanModeTool/` | β€” | `internal/tools/planmodetool/` | βœ… | AskEnter callback, sets plan mode | | EnterWorktree | `tools/EnterWorktreeTool/` | β€” | `internal/tools/worktreetool/` | βœ… | git worktree add, switches cwd | | ExitPlanMode | `tools/ExitPlanModeTool/` | β€” | `internal/tools/planmodetool/` | βœ… | **Divergence**: AskApprove returns `PlanApprovalDecision` (struct) instead of bool; user can choose auto/accept-edits/default mode; rejection can include textual feedback returned to model. Plan is shown in a scrollable inset take-over modal (not CC's sticky-footer inline widget). "Chat about this" option collapses CC's inline feedback input β€” user types in the main chat input after dismissing. Council chat path now also opens the plan-approval picker (CC has no equivalent; council is conduit-original). | | ExitWorktree | `tools/ExitWorktreeTool/` | β€” | `internal/tools/worktreetool/` | βœ… | keep/remove action, branch cleanup | | FileEditTool | `tools/FileEditTool/` | β€” | `internal/tools/fileedittool/` | βœ… | | | FileReadTool | `tools/FileReadTool/` | β€” | `internal/tools/filereadtool/` | βœ… | | | FileWriteTool | `tools/FileWriteTool/` | β€” | `internal/tools/filewritetool/` | βœ… | | | GlobTool | `tools/GlobTool/` | β€” | `internal/tools/globtool/` | βœ… | | | GrepTool | `tools/GrepTool/` | β€” | `internal/tools/greptool/` | βœ… | rg backend | | ListMcpResources | `tools/ListMcpResourcesTool/` | β€” | `internal/tools/mcpresourcetool/` | βœ… | Lists from all connected servers | | LocalImplement | β€” | β€” | `internal/tools/localimplementtool/` | βœ… | conduit-only wrapper; exposes configured MCP `local_implement` as a bounded implementation offload tool | | LSPTool | `tools/LSPTool/` | β€” | `internal/tools/lsp/`, `internal/lsp/` | βœ… | hover, definition, references, diagnostics; JSON-RPC/stdio; auto-detects gopls/typescript-language-server/pylsp/rust-analyzer | | McpAuthTool | `tools/McpAuthTool/` | β€” | `internal/tools/mcpauthtool/` + `internal/commands/mcp.go` | βœ… | Per-server pseudo-tool registered for needs-auth servers (mcp____authenticate) + manual /mcp auth | | MCPTool | `tools/MCPTool/` | β€” | `internal/tools/mcptool/` | βœ… | MCP tool proxy | | NotebookEditTool | `tools/NotebookEditTool/` | β€” | `internal/tools/notebookedittool/` | βœ… | | | PowerShellTool | `tools/PowerShellTool/` | β€” | `internal/tools/winshelltool/` | βœ… | Windows-only; registered as "Shell" (not "PowerShell" as in CC). Registered instead of BashTool on Windows. | | EnterAutoMode | β€” (conduit extension) | β€” | `internal/tools/automodetool/` | βœ… | No CC counterpart. Lets model request auto (bypassPermissions) mode with user consent via permission prompt. | | ExitAutoMode | β€” (conduit extension) | β€” | `internal/tools/automodetool/` | βœ… | No CC counterpart. Lets model return to default mode without prompting. | | ReadMcpResource | `tools/ReadMcpResourceTool/` | β€” | `internal/tools/mcpresourcetool/` | βœ… | Reads one resource by URI | | RemoteTriggerTool | `tools/RemoteTriggerTool/` | β€” | ❌ | ⬛ | Remote-only (M10) | | REPLTool | `tools/REPLTool/` | β€” | `internal/tools/repltool/` | 🟑 | Functional but no tool-level tests | | ScheduleCronTool | `tools/ScheduleCronTool/` | β€” | ❌ | ⬛ | KAIROS-gated (isKairosCronEnabled) | | SendMessageTool | `tools/SendMessageTool/` | β€” | ❌ | ⬛ | Team messaging (descoped) | | SkillTool | `tools/SkillTool/` | β€” | `internal/tools/skilltool/` | βœ… | | | SleepTool | `tools/SleepTool/` | β€” | `internal/tools/sleeptool/` | βœ… | | | SyntheticOutputTool | `tools/SyntheticOutputTool/` | β€” | `internal/tools/syntheticoutputtool/` | βœ… | In-band coordinator signaling | | TaskCreateTool | `tools/TaskCreateTool/` | β€” | `internal/tools/tasktool/` | βœ… | | | TaskGetTool | `tools/TaskGetTool/` | β€” | `internal/tools/tasktool/` | βœ… | | | TaskListTool | `tools/TaskListTool/` | β€” | `internal/tools/tasktool/` | βœ… | | | TaskOutputTool | `tools/TaskOutputTool/` | β€” | `internal/tools/tasktool/` | βœ… | | | TaskStopTool | `tools/TaskStopTool/` | β€” | `internal/tools/tasktool/` | βœ… | | | TaskUpdateTool | `tools/TaskUpdateTool/` | β€” | `internal/tools/tasktool/` | βœ… | | | TeamCreateTool | `tools/TeamCreateTool/` | β€” | ❌ | ⬛ | Requires teammate mailbox; descoped | | TeamDeleteTool | `tools/TeamDeleteTool/` | β€” | ❌ | ⬛ | Same | | TodoWriteTool | `tools/TodoWriteTool/` | β€” | `internal/tools/todowritetool/` | βœ… | | | ToolSearchTool | `tools/ToolSearchTool/` | β€” | `internal/tools/toolsearchtool/` | βœ… | | | WebFetchTool | `tools/WebFetchTool/` | β€” | `internal/tools/webfetchtool/` | βœ… | HTMLβ†’markdown | | WebSearchTool | `tools/WebSearchTool/` | β€” | `internal/tools/websearchtool/` | βœ… | | --- ## 5. Permissions & Hooks | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Permission modes (default/acceptEdits/plan/bypass) | `utils/permissions/` | β€” | `internal/permissions/permissions.go` | βœ… | | | Allow/deny/ask rule matching | `utils/permissions/` | β€” | `internal/permissions/permissions.go` | βœ… | Glob + exact match | | Session-scoped allow | `utils/permissions/` | β€” | `internal/permissions/permissions.go` | βœ… | | | Shift+Tab mode cycling | `keybindings/defaultBindings.ts` | β€” | `internal/tui/model.go` | βœ… | | | Classifier approvals | `utils/classifierApprovals.ts` | β€” | ❌ | ⬛ | ML model required; Anthropic-internal inference endpoint | | PreToolUse hooks | `utils/hooks/` | β€” | `internal/hooks/hooks.go` | βœ… | | | PostToolUse hooks | `utils/hooks/` | β€” | `internal/hooks/hooks.go` | βœ… | | | SessionStart hooks | `utils/hooks/` | β€” | `internal/hooks/hooks.go` | βœ… | | | Stop hooks | `utils/hooks/` | β€” | `internal/hooks/hooks.go` | βœ… | | | Hook approve directive | `utils/hooks/` | β€” | `internal/hooks/hooks.go` | βœ… | Bypasses AskPermission; sticky across all matchers (block still short-circuits) | | Hook block directive | `utils/hooks/` | β€” | `internal/hooks/hooks.go` | βœ… | | | HTTP hooks | `utils/hooks/execHttpHook.ts` | β€” | `internal/hooks/http.go` | βœ… | POST JSON, parse decision | | Prompt hooks | `utils/hooks/execPromptHook.ts` | β€” | `internal/hooks/llm.go` | βœ… | Sub-agent prompt, inject result | | Agent hooks | `utils/hooks/execAgentHook.ts` | β€” | `internal/hooks/llm.go` | βœ… | Spawns full agent loop | | Async hook registry | `utils/hooks/AsyncHookRegistry.ts` | β€” | `internal/hooks/hooks.go` | βœ… | Non-blocking goroutine for async=true | | Notification hooks | `hooks/notifs/` (16 files) | β€” | `internal/hooks/notify.go` | βœ… | macOS osascript / Linux notify-send | | Bridge permission callbacks | `bridge/bridgePermissionCallbacks.ts` | β€” | ❌ | ⬛ | Bridge-only | | Interactive permission prompt (TUI) | `screens/REPL.tsx` | β€” | `internal/tui/model.go` | βœ… | | --- ## 6. TUI & Rendering | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Main REPL screen | `screens/REPL.tsx` (5005 LOC) | `0219.js`+ | `internal/tui/model.go`, `internal/tui/update.go`, `internal/tui/keyhandler.go`, `internal/tui/layoutview.go` | βœ… | Bubble Tea vs React/Ink | | Message display (streaming) | `components/Messages.tsx` | β€” | `internal/tui/render.go` | βœ… | | | Markdown rendering | `components/Markdown.tsx` | β€” | `internal/tui/render.go` | βœ… | Full GFM: tables, headings, task lists, strikethrough, blockquotes, italic | | Syntax highlighting | `components/HighlightedCode.tsx` | β€” | `internal/tui/syntaxhighlight.go` | βœ… | hand-rolled syntax highlighting (no Chroma dependency); functionally equivalent to Prism.js | | Spinner / thinking indicator | `components/Spinner.tsx` | β€” | `internal/tui/model.go` | βœ… | | | Status bar | `components/StatusLine.tsx` | β€” | `internal/tui/layoutview.go`, `internal/tui/usagefooter.go` | βœ… | | | Permission mode badge | `components/StatusLine.tsx` | β€” | `internal/tui/model.go` | βœ… | | | Input box (textarea) | `components/PromptInput/` | β€” | `internal/tui/model.go` | βœ… | | | Input history (up/down) | `screens/REPL.tsx` | β€” | `internal/tui/keyhandler.go` | βœ… | | | Slash command picker | `screens/REPL.tsx` | β€” | `internal/tui/attachmentspicker.go` | βœ… | | | Tab completion | `screens/REPL.tsx` | β€” | `internal/tui/keyhandler.go`, `internal/tui/attachmentspicker.go` | βœ… | | | Session resume picker | `screens/ResumeConversation.tsx` | β€” | `internal/tui/model.go` | βœ… | | | MCP panel | β€” | β€” | `internal/tui/model.go` (panel) | βœ… | conduit-only | | Plugin panel (full) | `commands/plugin/` | β€” | `internal/tui/pluginpanel.go`, `internal/tui/pluginpaneldata.go`, `internal/tui/pluginpanelkeys.go`, `internal/tui/pluginpanelrender.go` | βœ… | conduit-only | | Login flow UI | `components/ConsoleOAuthFlow.tsx` | β€” | `internal/tui/login.go` | βœ… | Browser-launch OAuth flow with URL fallback and code-paste option; no CSS animations (N/A in terminal) | | Cost display | `components/Stats.tsx` | β€” | `internal/tui/summaries.go`, `internal/tui/model.go` (tallyTokens/syncLive) + `/cost` | βœ… | Status bar (cumulative $X.XX) + /cost shows input/output tokens, total cost, per-turn breakdown | | Context visualization | `components/ContextVisualization.tsx` | β€” | `/context` command | βœ… | Bar chart of tokens: system/history/tools/remaining | | Virtual message list / scroll | `components/VirtualMessageList.tsx` | β€” | `internal/tui/model.go` (viewport) | βœ… | Bubble Tea viewport with sticky-bottom; no DOM virtualization needed for terminal rendering | | Code copy (Ctrl+Y) | `screens/REPL.tsx` | β€” | `internal/tui/keyhandler.go` | βœ… | | | Ctrl+C interrupt | `screens/REPL.tsx` | β€” | `internal/tui/keyhandler.go`, `internal/tui/update.go` | βœ… | | | Flash messages | β€” | β€” | `internal/tui/model.go` | βœ… | conduit-only | | Doctor screen | `screens/Doctor.tsx` | β€” | `/doctor` β†’ doctor-panel overlay | βœ… | Full-screen checklist panel with βœ…/❌ icons, binary path, OS/arch; q/Esc closes | | Stats screen | `components/Stats.tsx` | β€” | `internal/tui/settingspanel.go`, `internal/tui/settingsstats.go`, `internal/sessionstats/` | βœ… | /stats opens Settings panel β†’ Stats tab; Overview + Models + asciigraph chart | | Log selector | `components/LogSelector.tsx` | β€” | `internal/tui/model.go` (resumePrompt) | βœ… | Session picker with live fuzzy filter, j/k navigation, Esc-to-clear, count badge, message count, preview panel showing age+count+title of selected session. Tag tabs descoped (no tag-based grouping in CC external build). | | Global search dialog | `components/GlobalSearchDialog.tsx` | β€” | `/search` command β†’ search-panel overlay | βœ… | Navigable search results panel; j/k navigation; Enter loads matching session; grouped by session title+age; ripgrep code-search panel descoped | | Model picker dialog | `components/ModelPicker.tsx` | β€” | `internal/tui/model.go` (pickerState) | βœ… | /model with no args opens picker; ↑/↓/jk Enter; current marked ● | | Theme picker | `components/ThemePicker.tsx` | β€” | `internal/tui/model.go` (pickerState) | βœ… | /theme with no args opens picker; lists built-ins + user themes | | Output style picker | `components/OutputStylePicker.tsx` | β€” | `internal/tui/model.go` (pickerState) | βœ… | /output-style with no args opens picker | | Feedback dialog | `components/Feedback.tsx` | β€” | ❌ | ⬛ | Anthropic-internal | | Onboarding flow | `components/Onboarding.tsx` | β€” | `internal/tui/model.go` (onboardingState) | βœ… | First-run welcome overlay shows once: auth status, key commands, Enter to dismiss; persisted via settings.onboardingComplete | | Coordinator agent status | `components/CoordinatorAgentStatus.tsx` | β€” | `internal/tui/coordinatorfooter.go` | βœ… | Footer panel below input shows in-progress tasks + elapsed time; 1s tick refreshes only while active | | Vim mode | `vim/` (5 files, 1513 LOC) | β€” | ❌ | ⬛ | Large effort (1513 LOC); niche use case; deferred | | Custom keybindings | `keybindings/` (14 files) | β€” | `internal/keybindings/` | βœ… | Full MVP: parser, resolver, JSON loader, defaults, TUI hookup. `command:*` actions execute slash commands; chat/select/confirm actions wired. Single-keystroke only; chords deferred. | | Image paste | `utils/imagePaste.ts` | β€” | `internal/attach/clipboard.go` + resize | βœ… | Image paste βœ…; PDF paste βœ… via `internal/attach/pdf.go` (clipboard PDF type + Finder file URI fallback) | | Drag-drop attachments | `utils/attachments.ts` | β€” | βœ… | βœ… | file:// URIs + shell-escaped paths β†’ @mention / pendingImages / pendingPDFs | | Ink rendering engine | `ink/` (96 files, 13306 LOC) | β€” | Bubble Tea | πŸ”² | Different framework | --- ## 7. Slash Commands | Command | TS Source | Go (conduit) | Status | Notes | |---------|-----------|--------------|--------|-------| | /help | `commands/help/` | `internal/commands/builtin.go` | βœ… | | | /clear | `commands/clear/` | `internal/commands/builtin.go` | βœ… | | | /exit | `commands/exit/` | `internal/commands/misc.go` | βœ… | | | /model | `commands/model/` | `internal/commands/builtin.go` | βœ… | grouped provider picker; emits provider-switch for Claude subscription and MCP providers; persists conduit `activeProvider` and mirrors to `providers` + `roles.default`; Ctrl+M assigns Default/Main/Background/Planning/Implement roles | | /compact | `commands/compact/` | `internal/commands/builtin.go` | βœ… | | | /permissions | `commands/permissions/` | `internal/commands/builtin.go` | βœ… | | | /hooks | `commands/hooks/` | `internal/commands/builtin.go` | βœ… | | | /login | `commands/login/` | `internal/commands/misc.go` | βœ… | | | /logout | `commands/logout/` | `internal/commands/session.go` | βœ… | | | /resume | `commands/resume/` | `internal/commands/session.go` | βœ… | | | /rewind | `commands/rewind/` | `internal/commands/session.go` | βœ… | | | /cost | `commands/cost/` | `internal/commands/session.go` | βœ… | | | /export | `commands/export/` | `internal/commands/session.go` | βœ… | | | /add-dir | `commands/add-dir/` | `internal/commands/misc.go` | βœ… | | | /privacy-settings | `commands/privacy-settings/` | `internal/commands/misc.go` | βœ… | | | /mcp | `commands/mcp/` | `internal/commands/mcp.go` | βœ… | | | /plugin | `commands/plugin/` (17 files) | `internal/commands/plugins.go` | βœ… | | | /reload-plugins | `commands/reload-plugins/` | `internal/commands/plugins.go` | βœ… | | | /skills | `commands/skills/` | `internal/commands/skills.go` | βœ… | | | /output-style | `commands/output-style/` | `internal/commands/outputstyle.go` | βœ… | | | /rtk gain | β€” | `internal/commands/rtk.go` | βœ… | conduit-only | | /buddy | β€” | `internal/commands/buddy.go` | βœ… | conduit-only | | /keybindings | `commands/keybindings/` | `internal/commands/session.go` | βœ… | Live resolver bindings grouped by context; fixed bindings listed; edit `~/.conduit/keybindings.json`; legacy Claude keybindings are fallback only | | /plan | `commands/plan/` | `internal/commands/misc.go` | βœ… | Sets plan mode; EnterPlanMode tool wired | | /memory | `commands/memory/` | `internal/commands/session.go` | βœ… | list\|show\|scan subcommands; memdir.ScanMemories | | /config | `commands/config/` | `internal/commands/session.go` | βœ… | list / get / set / validate; writes `~/.conduit/conduit.json` | | /context | `commands/context/` | `internal/commands/session.go` | βœ… | Bar chart + token breakdown + remaining | | /diff | `commands/diff/` | `internal/commands/session.go` | βœ… | git diff of files edited this session | | /doctor | `commands/doctor/` | `internal/commands/session.go` | βœ… | auth, MCP, settings health check | | /effort | `commands/effort/` | `internal/commands/session.go` | βœ… | low\|medium\|high\|max thinking budget | | /fast | `commands/fast/` | `internal/commands/session.go` | βœ… | Toggles model; ⚑ in status bar | | /feedback | `commands/feedback/` | ❌ | ⬛ | Anthropic-internal | | /files | `commands/files/` | `internal/commands/session.go` | βœ… | Files read/written this session | | /ide | `commands/ide/` | ❌ | ⬛ | Bridge-only | | /review | `commands/review/` | `internal/commands/session.go` | βœ… | /compact + summary | | /session | `commands/session/` | `internal/commands/session.go` | βœ… | ID, path, message count, duration | | /stats | `commands/stats/` | `internal/commands/session.go` + settings panel | βœ… | Opens Stats panel (Overview + Models tabs) | | /status | `commands/status/` | `internal/commands/session.go` | βœ… | Model, mode, session ID, cost, context% | | /tag | `commands/tag/` | `internal/commands/session.go` | βœ… | Tag/clear current session; tag shown in /session and /resume picker | | /tasks | `commands/tasks/` | `internal/commands/session.go` | βœ… | Lists active TaskTool tasks | | /theme | `commands/theme/` | `internal/commands/misc.go` + `internal/theme/` | βœ… | Switch palette: dark/light/dark-accessible/light-accessible; hot-swap via OnChange listeners; persisted to `~/.conduit/conduit.json` | | /usage | `commands/usage/` | `internal/commands/session.go` | βœ… | Token/cost breakdown by turn | | /vim | `commands/vim/` | ❌ | ⬛ | Descoped with vim mode (1513 LOC; deferred) | | /branch | `commands/branch/` | ❌ | 🚫 REMOVED | Conversation branching deferred; command not registered | | /voice | `commands/voice/` | ❌ | ⬛ | Requires cgo audio | | /rename | `commands/rename/` | `internal/commands/session.go` | βœ… | Renames current session | | /sandbox-toggle | `commands/sandbox-toggle/` | ❌ | ⬛ | Anthropic-internal | | /install-github-app | `commands/install-github-app/` | ❌ | ⬛ | Anthropic-internal | | /install-slack-app | `commands/install-slack-app/` | ❌ | ⬛ | Anthropic-internal | | /bridge | `commands/bridge/` | ❌ | ⬛ | Bridge-only | | /remote-env | `commands/remote-env/` | ❌ | ⬛ | Remote-only | | /remote-setup | `commands/remote-setup/` | ❌ | ⬛ | Remote-only | | /agents | `commands/agents/` | `internal/commands/session.go` | βœ… | Lists active sub-agents | | /stickers | `commands/stickers/` | ❌ | ⬛ | Cosmetic | | /thinkback | `commands/thinkback/` | `internal/commands/session.go` | βœ… | Shows last thinking blocks | | /thinkback-play | `commands/thinkback-play/` | ❌ | ⬛ | Cosmetic animation replay; terminal rendering doesn't support smooth animation | | /upgrade | `commands/upgrade/` | ❌ | ⬛ | Auto-update | | /color | `commands/color/` | `internal/commands/session.go` | βœ… | Toggle ANSI color output | | /copy | `commands/copy/` | `internal/commands/session.go` | βœ… | Copies last response to clipboard | | /search | β€” | `internal/commands/session.go` | βœ… | conduit-only; scans JSONL transcripts | | /pr-comments | `commands/pr_comments/` | `internal/commands/session.go` | βœ… | conduit-only; PR review workflow | | /local | β€” | `internal/commands/local.go` | βœ… | hidden conduit-only debug command; direct active MCP provider call | | /local-implement | β€” | `internal/commands/local.go` | βœ… | hidden conduit-only debug command; bounded private/local implementation draft with diff output | | /local-mode | β€” | `internal/commands/local.go` | βœ… | hidden conduit-only compatibility command; toggles `activeProvider` between Claude and MCP | | /accounts | β€” | `internal/commands/accounts.go` | βœ… | conduit-only alias for `/account` settings panel | | /passes | `commands/passes/` | ❌ | ⬛ | Anthropic referral/rewards system; not in OAuth Max scope | | /rate-limit-options | `commands/rate-limit-options/` | ❌ | ⬛ | Billing dialog (upgrade/extra-usage); Anthropic billing API required | | /release-notes | `commands/release-notes/` | ❌ | ⬛ | Anthropic-internal | | /extra-usage | `commands/extra-usage/` | ❌ | ⬛ | Anthropic overage credit provisioning; not in OAuth Max scope | | /terminalSetup | `commands/terminalSetup/` | `internal/commands/terminalsetup.go` + `terminalsetupapply.go` | βœ… | Detects TERM_PROGRAM; shows manual recipe by default; `/terminalSetup --apply` writes config automatically: Apple Terminal (PlistBuddy), VSCode/Cursor/Windsurf (keybindings.json merge), Alacritty (alacritty.toml append), Zed (keymap.json merge); backup-before-write, idempotent | --- ## 8. MCP Host | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | stdio transport | `services/mcp/` | `0154.js` | `internal/mcp/client.go` | βœ… | | | HTTP/SSE transport | `services/mcp/` | `0154.js` | `internal/mcp/client.go` | βœ… | | | Tool discovery & proxy | `services/mcp/`, `tools/MCPTool/` | `0402.js` | `internal/tools/mcptool/` | βœ… | | | Config loading (claude.json) | `services/mcp/` | β€” | `internal/mcp/config.go` | βœ… | | | Config loading (.mcp.json) | `services/mcp/` | β€” | `internal/mcp/config.go` | βœ… | Includes conduit `~/.conduit/mcp.json` overlay after Claude/project/plugin sources | | `claude mcp add/list/get/remove/add-json` CLI | `commands/mcp/` | β€” | `cmd/conduit/mcp_cli.go` + `internal/mcp/writer.go` | βœ… | Claude-parity CLI; default scope `project`; conduit also exposes the same surface as `/mcp add ...` slash commands | | Plugin MCP server registration | `services/mcp/` | β€” | `internal/mcp/manager.go` `SyncPluginServers` | βœ… | | | Server lifecycle (connect/disconnect) | `services/mcp/` | β€” | `internal/mcp/manager.go` | βœ… | | | MCP server approval dialog | `components/MCPServerApprovalDialog.tsx` | β€” | `internal/mcp/manager.go`, `internal/tui/model.go`, `internal/commands/mcp.go` | βœ… | Project-scope (.mcp.json) servers gated on user approval; startup picker offers Yes/Yes-All/No; persisted to `~/.conduit/conduit.json` project state | | OAuth for MCP servers | `services/mcp/` | β€” | `internal/mcp/oauth.go` + `oauthpersist.go` | βœ… | RFC 8414 metadata discovery (+OIDC fallback), RFC 7591 dynamic client registration, PKCE S256, localhost callback, token exchange + refresh, per-server bundle in secure storage | | MCP resource listing | `tools/ListMcpResourcesTool/` | β€” | `internal/mcp/manager.go`, `internal/tools/mcpresourcetool/` | βœ… | resources/list JSON-RPC | | MCP resource reading | `tools/ReadMcpResourceTool/` | β€” | `internal/mcp/manager.go`, `internal/tools/mcpresourcetool/` | βœ… | resources/read JSON-RPC | | MCP WebSocket transport | `utils/mcpWebSocketTransport.ts` | β€” | `internal/mcp/clientws.go` | βœ… | nhooyr.io/websocket; type="ws"\|"websocket" in server config | | MCP instructions delta | `utils/mcpInstructionsDelta.ts` | β€” | `internal/mcp/manager.go` + `cmd/conduit/main.go` | βœ… | Server instructions from initialize response injected into system prompt | | LSP integration | `services/lsp/` (7 files) | β€” | `internal/lsp/` | 🟑 | Client, Manager, languageβ†’server auto-detect; 6 tests exist in `internal/tools/lsp/lsp_test.go` (tool wrapper); `internal/lsp/` package itself has zero unit tests | --- ## 9. Plugins & Skills | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Plugin manifest loading | `types/plugin.ts`, `services/plugins/` | `2484.js` | `internal/plugins/loader.go` | βœ… | Conduit-owned `~/.conduit/plugins`; imports legacy Claude plugin storage if Conduit storage is absent | | Plugin installation (git clone) | `commands/plugin/` | β€” | `internal/plugins/install.go` | βœ… | Writes install registry/cache under `~/.conduit/plugins` | | Plugin uninstallation | `commands/plugin/` | β€” | `internal/plugins/install.go` | βœ… | Writes install registry/cache under `~/.conduit/plugins` | | Marketplace discovery | `commands/plugin/` | β€” | `internal/plugins/discover.go` | βœ… | `known_marketplaces.json` lives under `~/.conduit/plugins` | | Install counts (GitHub stats) | `commands/plugin/` | β€” | `internal/plugins/discover.go` | βœ… | Cache lives under `~/.conduit/plugins` | | Plugin enable/disable | `services/plugins/` | β€” | `internal/settings/settings.go` | βœ… | | | Plugin MCP server sync | `services/mcp/` | β€” | `internal/mcp/manager.go` | βœ… | | | Plugin output styles | `utils/plugins/loadPluginOutputStyles.ts` | β€” | `internal/outputstyles/outputstyles.go` | βœ… | LoadFromPluginDirs; merged at startup, plugin < user/project priority | | Plugin slash commands | `services/plugins/` | β€” | `internal/plugins/loader.go` | βœ… | | | Plugin skills (SKILL.md) | `skills/loadSkillsDir.ts` | β€” | `internal/plugins/loader.go` `loadSkills` + `internal/plugins/skills.go` | βœ… | skills/*/SKILL.md per-plugin; frontmatter description + tools enforced via Registry.Subset | | Plugin hooks (hooks.json) | `utils/plugins/pluginLoader.ts` | β€” | `internal/plugins/loader.go` `loadHooks` + `internal/plugins/hooks.go` | βœ… | CLAUDE_PLUGIN_ROOT injected into command subprocesses; plugin hooks trusted (not project-local) | | Plugin agents (agents/*.md) | `services/plugins/` | β€” | `internal/plugins/loader.go` `loadAgents` + `internal/plugins/agents.go` + `internal/tools/agenttool/` | βœ… | Task(subagent_type=…) dispatches to named agents; per-agent system prompt, model, tool allowlist | | Skill discovery from plugins | `skills/loadSkillsDir.ts` | β€” | `internal/tools/skilltool/` | βœ… | | | Bundled/built-in skills | `skills/bundledSkills.ts` | β€” | `internal/skills/bundled.go` | βœ… | /simplify (3-agent code review) and /remember (memory promotion review) | | Skill listing in system prompt | `skills/` | β€” | `internal/agent/systemprompt.go` | βœ… | | | SkillTool invocation | `tools/SkillTool/` | β€” | `internal/tools/skilltool/` | βœ… | | | Plugin marketplace management | `commands/plugin/` | β€” | `internal/plugins/marketplace.go` | βœ… | | | Plugin signature verification | β€” | β€” | ❌ | ⬛ | Not in CC either; aspirational | | Plugin version management | β€” | β€” | ❌ | ⬛ | No version conflict resolution in CC; just git pull | | Built-in plugins list | `plugins/builtinPlugins.ts` | β€” | ❌ | ⬛ | Empty in CC external build (scaffolding only) | | MagicDocs | `services/MagicDocs/` | β€” | ❌ | ⬛ | | --- ## 10. Memory System | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Memory directory path | `memdir/paths.ts` | `2829.js` | `internal/memdir/memdir.go` `Path` | βœ… | | | MEMORY.md loading + truncation | `memdir/memdir.ts` | `2830.js` | `internal/memdir/memdir.go` | βœ… | 200-line / 25KB caps | | Memory type taxonomy (4 types) | `memdir/memoryTypes.ts` | β€” | `internal/memdir/memdir.go` | βœ… | user/feedback/project/reference | | Full behavioral instructions in prompt | `memdir/memdir.ts` | β€” | `internal/memdir/memdir.go` | βœ… | | | Auto-dream gate (24h + 5 sessions) | `services/autoDream/` | `3899.js` | `internal/memdir/dream.go` | βœ… | | | Auto-dream consolidation prompt | `services/autoDream/consolidationPrompt.ts` | β€” | `internal/memdir/dream.go` | βœ… | 4-phase prompt | | Dream lock file | `services/autoDream/` | β€” | `internal/memdir/dream.go` | βœ… | | | Memory scanning utilities | `memdir/memoryScan.ts` | β€” | `internal/memdir/scan.go` | βœ… | ScanMemories, FormatMemoryList, formatAge | | Memory age tracking | `memdir/memoryAge.ts` | β€” | `internal/memdir/scan.go` | βœ… | ModTime tracking, human-readable age | | Relevant memory search | `memdir/findRelevantMemories.ts` | β€” | `internal/memdir/scan.go` | βœ… | Keyword matching (no embeddings) | | Memory extraction from conversations | `services/extractMemories/` | β€” | `internal/memdir/extract.go` | βœ… | RunExtract spawns sub-agent w/ buildExtractPrompt; auto-fires on every Loop end_turn (single-flighted); /memory extract triggers manually | | Session memory management | `services/SessionMemory/` | `3901.js` | `internal/sessionmem/sessionmem.go` | βœ… | summary.md per session, throttled sub-agent updates (every 3 end_turns), loaded as system block on --continue/resume | | Team memory paths | `memdir/teamMemPaths.ts` | β€” | ❌ | ⬛ | Team feature | | Team memory prompts | `memdir/teamMemPrompts.ts` | β€” | ❌ | ⬛ | Team feature | | Team memory sync | `services/teamMemorySync/` | β€” | ❌ | ⬛ | Team feature | --- ## 11. RTK (Token Compression) | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Command classification (75 rules) | RTK Rust source | β€” | `internal/rtk/registry.go` | βœ… | | | Git filters | RTK Rust source | β€” | `internal/rtk/filters.go` | βœ… | | | Go test filters | RTK Rust source | β€” | `internal/rtk/filters.go` | βœ… | | | Cargo/Rust filters | RTK Rust source | β€” | `internal/rtk/filters.go` | βœ… | | | npm/pnpm/yarn filters | RTK Rust source | β€” | `internal/rtk/filters.go` | βœ… | | | Python/pytest filters | RTK Rust source | β€” | `internal/rtk/filters.go` | βœ… | | | JS/TS (eslint, tsc, vitest) filters | RTK Rust source | β€” | `internal/rtk/filters.go` | βœ… | | | AWS filters + secret redaction | RTK Rust source | β€” | `internal/rtk/filters.go` | βœ… | | | Docker/kubectl/terraform filters | RTK Rust source | β€” | `internal/rtk/filters.go` | βœ… | | | ANSI stripping | RTK Rust source | β€” | `internal/rtk/ansi.go` | βœ… | | | SQLite tracking (history.db) | RTK Rust source | β€” | `internal/rtk/track/track.go` | βœ… | modernc.org/sqlite | | /rtk gain command | RTK Rust binary | β€” | `internal/commands/rtk.go` | βœ… | | | rtk discover (transcript scan) | RTK Rust binary | β€” | `internal/commands/rtk.go` | βœ… | Scans JSONL sessions for unclassified Bash commands; ranks by frequency | | BashTool integration | β€” | β€” | `internal/tools/bashtool/` | βœ… | Filter on every exec | | Env var stripping in classify | RTK Rust source | β€” | `internal/rtk/registry.go` | βœ… | | --- ## 12. Session & History | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | JSONL session transcript | `utils/sessionStorage.ts` | `3096.js` | `internal/session/session.go` | βœ… | | | Session path sanitization | `utils/sessionStoragePortable.ts` | β€” | `internal/session/session.go` | βœ… | djb2 hash fallback | | Session list (newest first) | `utils/sessionStorage.ts` | β€” | `internal/session/session.go` | βœ… | | | Session resume (--continue) | `utils/sessionRestore.ts` | β€” | `cmd/claude/main.go` | βœ… | | | Session title | `utils/sessionTitle.ts` | β€” | `internal/session/session.go`, `internal/tui/model.go` | βœ… | Shown in status bar; /rename persists; auto-title from first message | | Session summary (compact) | `utils/sessionStorage.ts` | β€” | `internal/session/session.go` | βœ… | SetSummary() persisted on every auto-compact via OnCompact callback | | Message compaction | `services/compact/compact.ts` | β€” | `internal/compact/compact.go` | βœ… | | | Auto-compaction | `services/compact/autoCompact.ts` | β€” | `internal/agent/loop.go` | βœ… | Fires near the model context limit using total prompt tokens, including cache_read/cache_creation | | Conversation recovery | `utils/conversationRecovery.ts` | β€” | `internal/agent/loop.go` + `internal/session/session.go` | βœ… | Partial assistant message persisted on stream error; orphan tool_use filtered on /resume | | File access history | `utils/fileHistory.ts` | β€” | `internal/session/extras.go` | βœ… | AppendFileAccess / LoadFileAccess | | Session activity tracking | `utils/sessionActivity.ts` | β€” | `internal/session/extras.go` | βœ… | LoadActivity returns first/last/idle from JSONL timestamps; remote keepalive heartbeat descoped (bridge-only) | | Session environment setup | `utils/sessionEnvironment.ts` | β€” | `internal/settings/env.go` | βœ… | ApplyEnv + cleanup restore | | Session URL handling | `utils/sessionUrl.ts` | β€” | `cmd/conduit/main.go` `--resume` flag | βœ… | `--resume ` and `--resume ` supported; URL-based remote resume descoped (M10/bridge) | | Cost tracking persistence | `cost-tracker.ts` | β€” | `internal/session/extras.go` | βœ… | AppendCost per turn, LoadCost on resume | | Transcript search | `utils/transcriptSearch.ts` | β€” | `internal/session/extras.go` | βœ… | Case-insensitive JSONL search | --- ## 13. Config & Settings | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Settings load (global + project) | `utils/config.ts` (1817 LOC) | `0628.js` | `internal/settings/settings.go` | βœ… | Loads Claude-compatible settings plus conduit-only `~/.conduit/conduit.json` overlay for provider roles and active permission mode | | Settings merge (global β†’ project) | `utils/config.ts` | β€” | `internal/settings/settings.go` | βœ… | | | Hook settings parsing | `schemas/hooks.ts` | β€” | `internal/settings/settings.go` | βœ… | | | Plugin enable/disable | `utils/config.ts` | β€” | `internal/settings/settings.go` | βœ… | | | Settings file preservation on update | `utils/config.ts` | β€” | `internal/settings/settings.go` | βœ… | Raw JSON map | | CLAUDE.md loading | `utils/claudemd.ts` (1479 LOC) | β€” | `internal/claudemd/claudemd.go` | βœ… | Dir walk, @include, .claudeignore, per-session cache | | Output style setting | `utils/config.ts` | β€” | `internal/settings/settings.go`, `internal/tui/run.go` | βœ… | Persisted to `~/.conduit/conduit.json`; user styles load from `~/.conduit/output-styles` with Claude fallback | | Environment variable management | `utils/env.ts`, `envDynamic.ts` | β€” | `internal/settings/env.go` | βœ… | ApplyEnv; session.Env injected into BashTool subprocess | | Managed env constants | `utils/managedEnvConstants.ts` | β€” | `internal/settings/env.go` `dangerousEnvKeys` | βœ… | DANGEROUS_SHELL_SETTINGS filtered from ApplyEnv | | Remote managed settings | `services/remoteManagedSettings/` | β€” | ❌ | ⬛ | Anthropic-internal | | Settings sync service | `services/settingsSync/` | β€” | ❌ | ⬛ | Anthropic-internal | | Platform-specific settings | `utils/platformSettings.ts` | β€” | ❌ | ⬛ | File does not exist in TS source; probably removed | | GrowthBook feature flags | `utils/featureFlags.ts` | β€” | ❌ | ⬛ | Anthropic-internal | | Migrations | `migrations/` (11 files) | β€” | `internal/migrations/migrations.go` | βœ… | modelNormalize migration; completedMigrations in settings.json; 5 tests | | XDG base directory | `utils/xdg.ts` | β€” | `internal/settings/env.go` `claudeDir()` | βœ… | XDG_CONFIG_HOME/claude on Linux | | Windows paths | `utils/windowsPaths.ts` | β€” | `internal/settings/env.go` `claudeDir()` | βœ… | %APPDATA%/claude on Windows | --- ## 14. Bridge (IDE Integration) β€” M10 | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | VS Code bridge (JSON-RPC) | `bridge/bridgeMain.ts` (2999 LOC) | `4910.js` | ❌ | ⬛ | conduit is a standalone terminal tool; IDE users use real CC extension | | JetBrains bridge | `utils/jetbrains.ts` | β€” | ❌ | ⬛ | Same | | REPL bridge | `bridge/replBridge.ts` (2406 LOC) | `5155.js` | ❌ | ⬛ | Same | | Remote bridge core | `bridge/remoteBridgeCore.ts` (1008 LOC) | β€” | ❌ | ⬛ | Same | | Bridge messaging | `bridge/bridgeMessaging.ts` | β€” | ❌ | ⬛ | Same | | Session runner | `bridge/sessionRunner.ts` | β€” | ❌ | ⬛ | Same | | Bridge session creation | `bridge/createSession.ts` | β€” | ❌ | ⬛ | Same | | Bridge API | `bridge/bridgeApi.ts` | β€” | ❌ | ⬛ | Same | | Inbound attachments (IDE) | `bridge/inboundAttachments.ts` | β€” | ❌ | ⬛ | Same | | IDE path conversion | `utils/idePathConversion.ts` | β€” | ❌ | ⬛ | Same | | Bridge UI dialogs | `components/BridgeDialog.tsx` etc. | β€” | ❌ | ⬛ | Same | | All 31 bridge/* files | `bridge/` (31 files, 12613 LOC) | β€” | ❌ | ⬛ | Same | --- ## 15. Remote & ULTRAPLAN β€” M10 | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Remote session manager | `remote/RemoteSessionManager.ts` | β€” | ❌ | ⬛ | Requires bridge; descoped | | Remote WebSocket sessions | `remote/SessionsWebSocket.ts` | β€” | ❌ | ⬛ | Same | | Remote permission bridge | `remote/remotePermissionBridge.ts` | β€” | ❌ | ⬛ | Same | | Upstream proxy relay | `upstreamproxy/relay.ts` | β€” | ❌ | ⬛ | Same | | Teleport (session migration) | `utils/teleport.tsx` (1225 LOC) | β€” | ❌ | ⬛ | Same | | RemoteTriggerTool | `tools/RemoteTriggerTool/` | β€” | ❌ | ⬛ | Same | | Direct connect server | `server/directConnectManager.ts` | β€” | ❌ | ⬛ | Same | --- ## 16. Coordinator / Agent Swarms | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Coordinator mode | `coordinator/coordinatorMode.ts` (369 LOC) | β€” | `internal/coordinator/coordinator.go` + `internal/agent/loop.go` | βœ… | `/coordinator` toggle, system prompt injection, task-notification XML, session mode persistence, status bar badge, MCP context | | TeamCreateTool | `tools/TeamCreateTool/` | β€” | ❌ | ⬛ | Requires teammate mailbox (swarm) | | TeamDeleteTool | `tools/TeamDeleteTool/` | β€” | ❌ | ⬛ | Same | | SendMessageTool | `tools/SendMessageTool/` | β€” | ❌ | ⬛ | Same | | Teammate mailbox | `utils/teammateMailbox.ts` (1183 LOC) | β€” | ❌ | ⬛ | Full swarm feature | | Team memory ops | `utils/teamMemoryOps.ts` | β€” | ❌ | ⬛ | Team feature | | Team discovery | `utils/teamDiscovery.ts` | β€” | ❌ | ⬛ | Team feature | | ULTRAPLAN | `services/ultraplan/` | β€” | ❌ | ⬛ | Depends on bridge + remote | | Agent listing delta | `utils/agentContext.ts` | β€” | ❌ | ⬛ | AsyncLocalStorage analytics context; Anthropic-internal | | Coordinator agent status UI | `components/CoordinatorAgentStatus.tsx` | β€” | `internal/tui/coordinatorfooter.go` | βœ… | Footer panel below input shows in-progress tasks with elapsed time; 1s tick refreshes only while active tasks exist | --- ## 17. Attachments & File Paste β€” M13 | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Image paste from clipboard | `utils/imagePaste.ts` (416 LOC) | β€” | `internal/attach/clipboard.go` | βœ… | ctrl+v; macOS osascript PNG+TIFF; Linux xclip/wl-paste | | Image resize | `utils/imageResizer.ts` (880 LOC) | β€” | `internal/attach/resize.go` | βœ… | Resize if >2000px or >3.75MB; CatmullRom downsampling; re-encode JPEG; TIFF decode via x/image/tiff | | Image storage | `utils/imageStore.ts` | β€” | `internal/tui/model.go` (pendingImages) | βœ… | Multiple images accumulated per turn | | PDF handling | `utils/pdf.ts` (300 LOC) | β€” | `internal/attach/atmention.go` + `pdf.go` | βœ… | @file.pdf β†’ type=document base64 block; clipboard PDF paste (ctrl+v) β†’ type=document block | | File drag-drop | `utils/attachments.ts` (3997 LOC) | β€” | `internal/attach/dragdrop.go` | βœ… | Detects file:// URIs in bracketed-paste; converts to @mention tokens; handles space-separated multi-file drops; verifies path exists | | ANSI to PNG | `utils/ansiToPng.ts` (334 LOC) | β€” | `internal/attach/ansipng.go` | βœ… | `ANSIToPNG(text) string` β†’ base64 PNG; parses SGR (8-color, 256-color, truecolor); basicfont rendering; dark terminal theme | | ANSI to SVG | `utils/ansiToSvg.ts` | β€” | ❌ | ⬛ | No current use case; PNG covers screenshot sharing | | Screenshot clipboard | `utils/screenshotClipboard.ts` | β€” | `internal/attach/clipboard.go` | βœ… | Covered by image paste (TIFF fallback handles macOS screenshots) | | Asciinema recording | `utils/asciicast.ts` | β€” | `internal/recorder/` | βœ… | /record start/stop; asciicast v2 header + "o"/"r" events; os.Pipe() tee; SIGWINCH resize; writes to `${CLAUDE_CONFIG_DIR:-~/.claude}/recordings/.cast` | | @file mention parsing | `utils/attachments.ts` | β€” | `internal/attach/atmention.go` | βœ… | @path @"path" #L10-20 line ranges; dirs listed; injected as file_content blocks; 7 tests | | IDE inbound attachments | `bridge/inboundAttachments.ts` | β€” | ❌ | ❌ | M13+bridge | --- ## 18. Buddy / Voice / KAIROS | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Companion generation (Mulberry32) | `buddy/companion.ts` | β€” | `internal/buddy/buddy.go` | βœ… | | | 18 species + 5 rarities | `buddy/types.ts` | β€” | `internal/buddy/buddy.go` | βœ… | | | ASCII sprite renderer | `buddy/sprites.ts` (514 LOC) | β€” | `internal/buddy/buddy.go` | βœ… | Full 5-line sprites matching TS source; 3 frames per species; hat slot on line 0; {E} eye substitution | | Companion soul persistence | `buddy/companion.ts` | β€” | `internal/buddy/store.go` | βœ… | | | /buddy command | `buddy/useBuddyNotification.tsx` | β€” | `internal/commands/buddy.go` | βœ… | | | Companion speech bubble / animation | `buddy/CompanionSprite.tsx` (370 LOC) | β€” | `internal/tui/model.go` (companionBubble) | βœ… | Animated sprite (500ms frame cycle via buddyTick) + speech bubble; [Name: text] marker detection; auto-clears after 10s. Pet hearts descoped. | | Companion intro injection | `buddy/prompt.ts` | β€” | `internal/buddy/buddy.go` (IntroPrompt) | βœ… | When a companion is configured, system prompt gains a "# Companion" block telling the model to defer to the buddy by name | | Buddy notification (rainbow teaser) | `buddy/useBuddyNotification.tsx` | β€” | ❌ | ⬛ | One-time CC launch promo (rainbow /buddy notification, April 1-7 2026 only). Window has passed; permanent /buddy command already exists. | | Voice recording (CoreAudio/ALSA) | `services/voice.ts` (525 LOC) | β€” | ❌ | ⬛ | Deferred β€” local whisper.cpp required; large standalone project | | Voice STT (WebSocket) | `services/voiceStreamSTT.ts` (544 LOC) | β€” | ❌ | ⬛ | CC uses Anthropic private endpoint; conduit requires local STT | | Voice keyterms | `services/voiceKeyterms.ts` | β€” | ❌ | ⬛ | Deferred with voice | | KAIROS (assistant mode) | `assistant/` | β€” | ❌ | ⬛ | GrowthBook-gated | --- ## 19. Output Styles & Undercover | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | Output style loader | `outputStyles/loadOutputStylesDir.ts` | β€” | `internal/outputstyles/outputstyles.go` | βœ… | Built-in default/Explanatory/Learning + user/project/plugin merge | | YAML frontmatter parsing | `utils/frontmatterParser.ts` | β€” | `internal/outputstyles/outputstyles.go` | βœ… | | | Project + user dir merge | `outputStyles/loadOutputStylesDir.ts` | β€” | `internal/outputstyles/outputstyles.go` | βœ… | | | Plugin output styles | `utils/plugins/loadPluginOutputStyles.ts` | β€” | `internal/outputstyles/outputstyles.go` | βœ… | LoadFromPluginDirs; merged at startup (same as section 9) | | /output-style command | `commands/output-style/` | β€” | `internal/commands/outputstyle.go` | βœ… | | | Undercover mode | `utils/undercover.ts` | β€” | `internal/undercover/undercover.go` | βœ… | | | Undercover auto-detection | `utils/undercover.ts` | β€” | ❌ | ⬛ | Gated on `USER_TYPE===ant`; dead code in external build | | Undercover auto-notice | `utils/undercover.ts` | β€” | ❌ | ⬛ | Same gate | --- ## 20. Analytics & Telemetry | Feature | TS Source | Decoded Chunk(s) | Go (conduit) | Status | Notes | |---------|-----------|-----------------|--------------|--------|-------| | tengu_* event names | `services/analytics/` | β€” | ❌ | ⬛ | No-op intentional | | Diagnostic tracking | `services/diagnosticTracking.ts` | β€” | ❌ | ⬛ | | | Query profiler | `utils/queryProfiler.ts` | β€” | ❌ | ⬛ | | | Heap dump service | `utils/heapDumpService.ts` | β€” | ❌ | ⬛ | | | Startup profiler | `utils/startupProfiler.ts` | β€” | ❌ | ⬛ | | | FPS tracker | `utils/fpsTracker.ts` | β€” | ❌ | ⬛ | | | Stats collection | `utils/stats.ts` (1061 LOC) | β€” | ❌ | ⬛ | | --- ## 21. Utilities (Shared) | Feature | TS Source | Go (conduit) | Status | Notes | |---------|-----------|--------------|--------|-------| | Git utilities | `utils/git.ts` (926 LOC) | ❌ | ⬛ | Used by commit attribution (Anthropic-internal, undercover gate) | | Git diff parsing | `utils/gitDiff.ts` | ❌ | ⬛ | Used by commit attribution only | | Commit attribution | `utils/commitAttribution.ts` | ❌ | ⬛ | Anthropic-internal (classifies repos as internal/external for undercover) | | Ripgrep integration | `utils/ripgrep.ts` (679 LOC) | `internal/ripgrep/ripgrep.go` | βœ… | Shared package; GrepTool uses it; /search rg: does file-content search in cwd | | File I/O utilities | `utils/file.ts`, `fsOperations.ts` | ❌ | ⬛ | Functionality scattered in tools; no standalone port needed | | File read cache | `utils/fileReadCache.ts` | ❌ | ⬛ | Optimization used by attachment system; not needed standalone | | Shell command wrapper | `utils/ShellCommand.ts` | ❌ | ⬛ | Wrapped in bashtool; no standalone port needed | | Shell config | `utils/shellConfig.ts` | ❌ | ⬛ | Shell detection already in bashtool | | HTTP proxy | `utils/proxy.ts` | `internal/api/retry.go` `NewClientWithProxy` | βœ… | HTTPS_PROXY / HTTP_PROXY env vars | | Markdown utilities | `utils/markdown.ts` | ❌ | ⬛ | Inline in render.go; no standalone port needed | | Memoization | `utils/memoize.ts` | ❌ | ⬛ | sync.Once used ad-hoc throughout | | Cron scheduler | `utils/cronScheduler.ts` (565 LOC) | ❌ | ⬛ | Used by ScheduleCronTool (KAIROS-gated) | | Token counting | `utils/tokens.ts` | `internal/tokens/tokens.go` | βœ… | cl100k_base estimate; chars/4 fallback | | Theme management | `utils/theme.ts` | `internal/theme/` | βœ… | 4 built-in themes + user themes; hot-swap | | String utilities | `utils/stringUtils.ts` | ❌ | ⬛ | Inline; no standalone port needed | | Word utilities | `utils/words.ts` | ❌ | ⬛ | Used by tab-wrap in CC Ink; not needed in Bubble Tea | | Context analysis | `utils/analyzeContext.ts` | ❌ | ⬛ | Analytics/GrowthBook context classification | | CLAUDE.md loading | `utils/claudemd.ts` (1479 LOC) | `internal/claudemd/claudemd.go` | βœ… | Done in M-A | | Auto-updater | `utils/autoUpdater.ts` | `internal/updater/` | βœ… | Divergence: CC self-replaces via npm. Conduit ships as a single binary via Homebrew/Scoop/winget; updater is a passive notifier that queries GitHub Releases (24h cache) and prints an install-method-aware hint. Skipped when AppVersion=="dev". | | Platform detection | `utils/platform.ts` | `cmd/claude/util.go` | βœ… | OS/arch; full GOOS/GOARCH available; no browser/node checks needed | | Glob utilities | `utils/glob.ts` | `internal/tools/globtool/` | βœ… | Embedded in globtool; no standalone port needed (Go stdlib covers it) | --- ## 22. State Management | Feature | TS Source | Go (conduit) | Status | Notes | |---------|-----------|--------------|--------|-------| | Redux-like app state | `state/` (6 files, 2380 LOC) | ❌ | πŸ”² | Bubble Tea model replaces this | | Bootstrap state | `bootstrap/state.ts` (1758 LOC) | ❌ | πŸ”² | Handled in main.go | | React contexts | `context/` (9 files) | ❌ | πŸ”² | Bubble Tea model handles | --- ## Summary Scorecard | Area | βœ… Complete | 🟑 Partial | ❌ Missing | ⬛ Descoped | Total | |------|------------|-----------|-----------|------------|-------| | Auth & OAuth | 9 | 0 | 1 | 8 | 18 | | API Client & SSE | 10 | 0 | 0 | 2 | 12 | | Agent Loop | 12 | 0 | 0 | 3 | 15 | | Tools (framework) | 6 | 0 | 1 | 0 | 7 | | Tools (individual, 40) | 33 | 0 | 1 | 6 | 40 | | Permissions & Hooks | 16 | 0 | 0 | 3 | 19 | | TUI & Rendering | 23 | 0 | 3 | 5 | 31 | | Slash Commands | 41 | 0 | 2 | 17 | 60 | | MCP Host | 13 | 0 | 1 | 0 | 14 | | Plugins & Skills | 12 | 0 | 0 | 5 | 17 | | Memory System | 10 | 0 | 0 | 6 | 16 | | RTK | 15 | 0 | 0 | 0 | 15 | | Session & History | 12 | 0 | 0 | 2 | 14 | | Config & Settings | 9 | 0 | 0 | 9 | 18 | | Bridge (IDE) | 0 | 0 | 0 | 14 | 14 | | Remote & ULTRAPLAN | 0 | 0 | 0 | 7 | 7 | | Coordinator / Swarms | 2 | 0 | 0 | 8 | 10 | | Attachments (M13) | 5 | 0 | 5 | 1 | 11 | | Buddy / Voice / KAIROS | 7 | 0 | 0 | 6 | 13 | | Output Styles & Undercover | 7 | 0 | 0 | 2 | 9 | | Analytics & Telemetry | 0 | 0 | 0 | 7 | 7 | | Utilities (shared) | 3 | 0 | 0 | 16 | 19 | | State Management | 0 | 0 | 0 | 3 | 3 | | **TOTAL** | **249** | **0** | **10** | **130** | **394** | **Overall parity: 249/264 scoped features (94% complete)** **Descoped: 130 features (intentionally excluded β€” bridge, remote, voice, team swarm, Anthropic-internal)** ### Remaining actionable ❌ items | Feature | Area | Effort | Plan | |---------|------|--------|------| | Release versioning + CI | Infra | Medium | goreleaser, GitHub Actions cross-platform builds | | `/vim` command | Commands | Large | Deferred with vim mode | | `/voice` command | Commands | Large | Deferred with local STT | | ScheduleCronTool | Tools | Medium | In-process cron for KAIROS-style scheduling (deferred) | | IDE inbound attachments | Bridge | β€” | ⬛ Descoped with bridge | --- ## Milestone Map (Updated) | Milestone | Features | Status | |-----------|----------|--------| | M1 β€” Auth + bare API call | Auth (9), API basics (5) | βœ… Done | | M2 β€” Streaming + 5 core tools | SSE, BashTool, FileRead/Write/Edit, Grep, Glob | βœ… Done | | M3 β€” TUI | Bubble Tea REPL, status bar, input, viewport | βœ… Done | | M4 β€” All core tools | 24 tools implemented | βœ… Done | | M5 β€” Permissions + hooks + commands | Permissions, all 4 hook types, 22 commands | βœ… Done | | M6 β€” RTK in-process | 75 rules, SQLite tracking, /rtk gain | βœ… Done | | M7 β€” MCP host | stdio/HTTP transports, tool proxy, config | βœ… Done | | M8 β€” Plugins + Skills + memdir | Plugin ecosystem, skill tool, memory/dream | βœ… Done | | M9 β€” Multi-agent | AgentTool, RunSubAgent, parallel tools | βœ… Done | | Council mode | **conduit-original** β€” no CC mapping; internal/tui/council.go. Parallel multi-model debate with synthesis, convergence detection, roles, voting, transcript persistence, and /council command. | βœ… Done | | M11 β€” Cosmetic parity | Buddy, output styles, undercover | βœ… Done | | M-A β€” CLAUDE.md loading | Dir walk, @include, .claudeignore, session cache | βœ… Done | | M-B β€” Agent/API gaps | Backoff, proxy, auto-compact, thinking budget, rate limits | βœ… Done | | M-C β€” Missing tools | EnterPlanMode, ExitPlanMode, AskUser, Config, SyntheticOutput, worktree, MCP resources | βœ… Done | | M-D β€” Missing slash commands | /status /tasks /agents /thinkback /color /copy /search /session /memory /context /effort /fast | βœ… Done | | M-E β€” Hook completion | HTTP, prompt, agent hooks; async; desktop notifications | βœ… Done | | M-F β€” Session completion | Cost persistence, file access, transcript search, title extraction | βœ… Done | | M-G β€” Config completion | Env injection, XDG/Windows claudeDir(), ApplyEnv | βœ… Done | | M-H β€” MCP completion | ListResources, ReadResource on all transports | βœ… Done | | M-I β€” TUI polish | Full GFM: tables, headings, italic, strikethrough, task lists, blockquotes | βœ… Done | | M-J β€” Worktree support | EnterWorktree, ExitWorktree, sanitizeSlug, IsInsideWorktree | βœ… Done | | M-K β€” Rate limit display | anthropic-ratelimit-* parse, <20% warning, status bar badge | βœ… Done | | M-L β€” Fast mode + effort | /fast ⚑, /effort low\|medium\|high\|max, ThinkingBudgets | βœ… Done | | M-N β€” Memory completion | ScanMemories, RelevantMemories, /memory list\|show\|scan, age tracking | βœ… Done | | **M10 β€” Bridge (IDE)** | 21 bridge features | ❌ Not started | | **M12 β€” Hardening** | Conformance tests, benchmarks | ❌ Not started | | **M13 β€” Attachments** | Image/PDF paste, drag-drop, @file mentions, ANSI PNG, recording | βœ… Done except bridge-only IDE inbound attachments | --- ## Key Missing Features (Not in Any Milestone Yet) These are implemented in Claude Code but not yet in conduit and not in M10/M13 (as of 2026-05-08): 1. **Vim mode** β€” vi keybindings in input box (`vim/`, 5 files). Medium value; large effort. 2. **Voice/STT** β€” deferred pending a local STT design; Claude's private endpoint is not available to Conduit. 3. **Plugin signature verification** β€” git commit sig check on install (note: not in CC either; aspirational). 4. **IDE inbound attachments** β€” bridge-dependent and descoped with M10. **Newly descoped (KAIROS/GrowthBook-gated β€” not in external builds):** BriefTool, ScheduleCronTool, RemoteTriggerTool (remote-only). Previously listed as missing but now βœ… implemented (2026-05): CLAUDE.md loading, auto-compact, HTTP proxy, rate limit tracking, AskUserQuestion, EnterPlanMode/ExitPlanMode, MCP resources, effort/fast modes, /memory /context /status /tasks /session /agents /thinkback /color /copy /search /diff /doctor /files /review /usage /stats /theme /rename /pr-comments /tag, worktree tools, HTTP/prompt/agent hooks, XDG paths, cost persistence, transcript search, SyntheticOutputTool, Stats panel (asciigraph chart, per-model series, Overview heatmap), session activity tracking (idle reporting in /session), visual pickers for /theme /model /output-style, conversation recovery (partial assistant message persisted on stream error + orphan tool_use filter on /resume), MCP server approval dialog (project-scope security gate with startup picker + persisted Yes/Yes-All/No), memory extraction (RunExtract sub-agent fired on each end_turn, single-flighted; manual /memory extract), session memory service (per-session summary.md updated by sub-agent every 3 end_turns; loaded as system block on --continue/resume), accurate token counting (cl100k_base via tiktoken-go), API preconnect now honors HTTP(S)_PROXY skips and ANTHROPIC_BASE_URL, time-based micro-compaction (clears older tool_results after 60min idle, keeps last 5), first-run onboarding overlay (auth status + key commands; persisted via onboardingComplete), MCP OAuth (RFC 8414 discovery + RFC 7591 DCR + PKCE + token refresh; McpAuthTool pseudo-tool + /mcp auth manual command; 401 on connect β†’ StatusNeedsAuth). --- ## Conduit-Only Features (No CC Counterpart) | Feature | Package | Notes | |---------|---------|-------| | Decision Journal | `internal/decisionlog/`, `internal/tools/decisiontool/` | Append-only JSONL per-project; `RecordDecision` tool; system prompt block 9; council auto-records verdicts | | Diff-First Review Gate | `internal/pendingedits/`, `internal/tui/diffreview.go` | Conduit-original; no CC precedent. **Phase 1**: hunk-level diff (`hunks.go` + `apply.go`); per-hunk cursor in overlay (a/r/x); partial Apply writes only approved hunks. **Phase 2**: `n` note minibuffer; rejected hunks β†’ `` XML injected as next user turn via `diffReviewFollowupMsg` + `pendingMessages`. **Phase 3**: `ModeAcceptEditsLive` (identical permissions to `acceptEdits`); `OnToolBatchComplete` in `LoopConfig` pauses the foreground loop mid-turn when `pendingTable.Len() β‰₯ threshold`; zeroed in all sub-agent child configs; threshold default 3, env `CONDUIT_DIFF_REVIEW_THRESHOLD`; plan-approval picker adds "live review" as option 3 |