v1.12.1: rich status indicator + server-side workspace pane sync
Status indicator (StatusDot): drops the flat amber pulse for a richer set of states — orbiting amber for streaming, spinning sky ring for tool_running, static violet for waiting_for_input, plus the existing idle/error. Backend chat_status frame widens from 'working|idle|error' to discriminate streaming vs tool execution vs paused for user input. Workspace pane sync: pane layout moves from per-device localStorage to server-side sessions.workspace_panes jsonb. PATCH /api/sessions/:id/workspace broadcasts session_workspace_updated on the user channel for cross-device live sync. Echo dedup via JSON comparison so the round-trip frame doesn't loop. Legacy localStorage seeds the server on first hydrate, then is deleted. Deprecated session_panes table dropped. Resilience: startup sweep marks any stale 'streaming' message older than 5 minutes as 'failed' so v1.12.0-style hung rows clear on container restart. useWorkspacePanes gains validatePanes() to prune dead chatId references from saved pane state when the chat list lands. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# BooCode v1.x — Roadmap
|
||||
|
||||
Last updated: 2026-05-20
|
||||
Last updated: 2026-05-21
|
||||
|
||||
## Overview
|
||||
|
||||
@@ -10,7 +10,7 @@ Live at `https://code.indifferentketchup.com` (Caddy → Authelia → Tailscale
|
||||
|
||||
**Architectural commitments:**
|
||||
|
||||
- No embeddings. The model uses file-view tools (`view_file`, `list_dir`, `grep`, `find_files`) + sidecar analyzers (codecontext, codesight). Walked away from the RAG pipeline May 2026.
|
||||
- No embeddings. Model uses file-view tools (`view_file`, `list_dir`, `grep`, `find_files`) + sidecar analyzers (codecontext, codesight) + codecontext MCP tools. Walked away from the RAG pipeline May 2026.
|
||||
- Read-only in v1.x. Write tools land in BooCoder (separate container, post-v1.x).
|
||||
- One Postgres (`boocode_db`), one frontend SPA, container-per-service for new capabilities.
|
||||
|
||||
@@ -18,136 +18,87 @@ External code lifted from / referenced in: see `boocode_code_review.md` for full
|
||||
|
||||
-----
|
||||
|
||||
## Shipped (status as of 2026-05-20)
|
||||
## Shipped (status as of 2026-05-21)
|
||||
|
||||
| Version | Theme | Notes |
|
||||
| Version | Theme | Tag |
|
||||
|---|---|---|
|
||||
| v1.0 | Initial scaffold | live |
|
||||
| Batches 1–4.4 | Markdown, sidebar, panes, chats-inside-sessions, archive, fork/delete, header polish, settings drawer | merged |
|
||||
| v1.5 | resolveProjectPath, BOOTSTRAP_ROOT, vitest pin | merged |
|
||||
| v1.6, v1.6.1, v1.6.2 | Mobile pass + RightRail mobile drawer | merged |
|
||||
| v1.7 | Drag-drop file + paste-as-attachment | merged |
|
||||
| v1.8, v1.8.1, v1.8.2 | Settings drawer, git_status tool, WS reconnect, **per-turn budget reset + Continue affordance + CapHitSentinel** | merged |
|
||||
| v1.9.1 | Skills system (`/opt/skills/` + `skill_find`/`skill_use`/`skill_resource` tools + `/skill` slash command) | merged |
|
||||
| v1.9.7 | `ask_user_input` elicitation tool | merged |
|
||||
| **Batch 9 (Agents Tier 2)** | `AGENTS.md` + 6 builtin agents + AgentPicker in ChatInput toolbar + `sessions.agent_id` | **merged in `92bd3b1`**, included in v1.9.1/v1.9.7/v1.10.x tags |
|
||||
| v1.10.0 | BooTerm: separate container, xterm.js + node-pty + tmux | merged |
|
||||
| v1.10.1 | BooTerm-user (spawn as samkintop, login bash, Claude Code/opencode PATH) | merged |
|
||||
| v1.10.4, v1.10.5 | Mobile terminal + XML tool-call fallback parser | merged |
|
||||
| **v1.11.0** | **opencode-style compaction port** (auto-overflow, anchored summary, tail preservation) | merged |
|
||||
| v1.11.1 | Compaction follow-up (working indicator during compaction, unit tests, .bak cleanup) | merged |
|
||||
| v1.11.2 | ContextBar (persistent context-usage indicator) | merged |
|
||||
| v1.11.3 | `ctx_max` capture via `/upstream/<model>/props` (replaces dead `timings.n_ctx` read) | merged |
|
||||
| v1.0 | Initial scaffold | — |
|
||||
| Batches 1–4.4 | Markdown, sidebar, panes, chats-inside-sessions, archive, fork/delete, header polish, settings drawer | — |
|
||||
| v1.5 | resolveProjectPath, BOOTSTRAP_ROOT, vitest pin | — |
|
||||
| v1.6, v1.6.1, v1.6.2 | Mobile pass + RightRail mobile drawer | — |
|
||||
| v1.7 | Drag-drop file + paste-as-attachment | — |
|
||||
| v1.8, v1.8.1, v1.8.2 | Settings drawer, git_status tool, WS reconnect, per-turn budget reset + Continue affordance + CapHitSentinel | — |
|
||||
| v1.9.1 | Skills system (`/opt/skills/` + `skill_find` / `skill_use` / `skill_resource` + `/skill` slash command) | `v1.9.1` |
|
||||
| v1.9.7 | `ask_user_input` elicitation tool | `v1.9.7` |
|
||||
| Batch 9 (Agents Tier 2) | `AGENTS.md` + 6 builtin agents + AgentPicker in ChatInput toolbar + `sessions.agent_id` | folded into `v1.9.1`/`v1.9.7` |
|
||||
| v1.10.0 | BooTerm: separate container, xterm.js + node-pty + tmux | `v1.10.0` |
|
||||
| v1.10.1 | BooTerm-user (spawn as samkintop, login bash, Claude Code/opencode PATH) | `v1.10.1` |
|
||||
| v1.10.4, v1.10.5 | Mobile terminal + XML tool-call fallback parser | — |
|
||||
| v1.11.0 | opencode-style compaction port (auto-overflow, anchored summary, tail preservation) | — |
|
||||
| v1.11.1 | Compaction follow-up (working indicator during compaction, unit tests, .bak cleanup) | — |
|
||||
| v1.11.2 | ContextBar (persistent context-usage indicator above MessageList) | — |
|
||||
| v1.11.3 | `ctx_max` capture via `/upstream/<model>/props` (replaces dead `timings.n_ctx` read) | `v1.11.3` |
|
||||
| v1.11.5 | ContextBar inline next to agent picker; remove ChatContextPopover; default new sessions to no agent | — |
|
||||
| v1.11.6 | Doom-loop guard from opencode (3 identical tool calls → sentinel, abort recursion) | — |
|
||||
| v1.11.7 | pathGuard secrets filter (continue.dev `DEFAULT_SECURITY_IGNORE_FILETYPES`) | — |
|
||||
| v1.11.8 | web_search + web_fetch tools via SearXNG | — |
|
||||
| v1.11.9 | Manual redirect handling — re-run URL guard on each hop (SSRF hardening) | — |
|
||||
| v1.11.10 | Stream-cap response body at 5MB, abort on overflow | `v1.11.x` |
|
||||
| **v1.12.0** | **codecontext sidecar (Go HTTP shim, NDJSON MCP framing, child.Wait supervisor) + container guidance (BOOCHAT.md/BOOCODER.md) + 7 vendored skills + system-prompt.ts extraction + mtime-watch cache + 8 codecontext tool wrappers + per-agent tool whitelists + .codecontextignore template + agents.ts ALL_TOOL_NAMES single-source-of-truth fix** | `v1.12.0` |
|
||||
|
||||
-----
|
||||
|
||||
## In flight / queued
|
||||
## In flight (uncommitted on disk, 2026-05-21)
|
||||
|
||||
| Version | Theme | Status |
|
||||
v1.12.1 work — landed today, not yet committed:
|
||||
|
||||
| Item | Status | Notes |
|
||||
|---|---|---|
|
||||
| ~~v1.11.4~~ | ~~Per-turn budget + Continue affordance~~ | **CANCELLED** — already shipped in v1.8.2 |
|
||||
| **v1.11.5** | ContextBar relocate (above agent-picker row), thicker, always-visible, remove ChatContextPopover | **dispatched** |
|
||||
| v1.11.6 | Doom-loop guard from opencode (3 identical tool calls → sentinel, abort recursion) | drafted |
|
||||
| v1.11.7 | pathGuard secrets filter (continue.dev's `DEFAULT_SECURITY_IGNORE_FILETYPES`) | drafted |
|
||||
| v1.11.x | Tag consolidation point (everything since v1.11.0) | queued |
|
||||
| Server-side workspace pane sync | Done | `sessions.workspace_panes jsonb` column; PATCH endpoint; `session_workspace_updated` WS frame; localStorage migration on first load; deprecated `session_panes` table dropped |
|
||||
| Richer status indicators | Done | Five states (`streaming` / `tool_running` / `waiting_for_input` / `idle` / `error`) with distinct visuals: amber orbiting dots for streaming, amber spinning ring for tool execution, blue static for waiting on user, emerald/gray/red for idle/error |
|
||||
| Startup hung-row sweep | Done | `UPDATE messages SET status='failed' WHERE status='streaming' AND created_at < NOW() - INTERVAL '5 minutes'` on server boot |
|
||||
| One stuck row from v1.12.0 smoke | Cleared | Manual UPDATE (`d63c25b1`) |
|
||||
| `detectSameNameLoop` code path | Added, never fired | Candidate for revert in next batch — dead code |
|
||||
| Diagnostic logging in inference.ts | Added for debugging | Must come out before commit |
|
||||
|
||||
-----
|
||||
|
||||
## Major work after v1.11.x
|
||||
## v1.12.x cleanup (NEXT — small, immediate)
|
||||
|
||||
| Version | Theme | LoC est. |
|
||||
|---|---|---|
|
||||
| **v1.12** | codecontext sidecar + tool output truncation + repair tool call (Integration 1 + 3 from May review, fused) | ~600 |
|
||||
| v1.13 | Phase B groundwork — parts table + AI SDK adoption + per-tool `read_only`/`write` tagging | ~1500 |
|
||||
| v1.14 | Phase C — outer agent loop (multi-step until non-tool finish, AGENTS.md `steps` field, reasoning as part type) | ~800 |
|
||||
| v1.15 | Phase D — permission ruleset + MCP client (lays foundation for BooCoder) | ~600 |
|
||||
| v1.16 | Batch 11b — codesight repo_health (call graph, circular deps, dead code) | ~400 |
|
||||
| **v2.0** | Batch 14 — BooCoder pending changes (new container, write tools, plandex pattern) | ~1200 |
|
||||
| v2.1 | Batch 15 — BooCoder runtime isolation (per-session Docker sandbox, OpenHands pattern) | ~600 |
|
||||
| v2.x | Batch 16/17 — Multi-provider LLM (optional, pi-ai) and Workflow graphs (far future, agent-framework concepts) | tbd |
|
||||
Five items. Group them or split them — your call.
|
||||
|
||||
-----
|
||||
### v1.12.1 — commit consolidation
|
||||
|
||||
## Roadmap doc deviations and corrections
|
||||
**Action items, in order:**
|
||||
|
||||
This roadmap was significantly out of sync with reality until 2026-05-20. Key corrections folded in:
|
||||
1. **Remove diagnostic logging** from `apps/server/src/services/inference.ts`. The 12 `ctx.log.info` calls added today proved the inference loop was functioning correctly; the prompts were just slow. Verbose for production. Strip them, keep the file clean.
|
||||
|
||||
1. **Batch 9 (Agents Tier 2) is done**, not "next up." Shipped as commit `92bd3b1`, included in v1.9.1 forward. The original "Track A: Batch 9 next" recommendation was correct but the doc never got updated.
|
||||
2. **v1.6.2 merged.** No longer "in flight."
|
||||
3. **Batch 5 (fork/delete), Batch 6 (drag-drop), Batch 7 (settings drawer), Batch 8 (web search), Batch 10 (BooTerm) all shipped**, scattered across the v1.6–v1.10 version line. Original "Track A polish then agents" plan was abandoned; work happened opportunistically.
|
||||
4. **v1.11.0 was a major unplanned addition** — opencode-style compaction (auto-overflow detection + anchored rolling summary + tail preservation). This is NOT a batch from the old roadmap. It opened a new patch line (v1.11.x) of small follow-ups in front of the original Batches 11–17.
|
||||
5. **Batch 11 (codecontext sidecar) moves to v1.12.** Bundles with truncation and repair-tool-call lift (both from opencode) since they share concerns and the `tool_choice='required'` confirmation makes repair-tool-call viable.
|
||||
6. **Phase B (parts table + AI SDK + tool-call lifecycle) becomes v1.13.** This absorbs the old Batch 13 (append-only event log) — same outcome (typed message parts), different mental framing.
|
||||
7. **Phase C and Phase D are new** (numbered v1.14/v1.15). They originate from the opencode integration analysis, not from the original 17-batch plan. Phase C delivers the outer agent loop with explicit step boundaries. Phase D delivers the permission ruleset + MCP client needed for codecontext to be useful and for BooCoder to gate writes.
|
||||
8. **BooCoder (v2.0/v2.1)** is the second-major-version line. New container, new safety story (pending changes + per-session Docker sandbox). Maps to original Batches 14/15.
|
||||
2. **Revert `detectSameNameLoop`.** Three additions in inference.ts:
|
||||
- `DOOM_LOOP_SAME_NAME_THRESHOLD = 5` constant
|
||||
- `detectSameNameLoop()` function
|
||||
- Call site in `runAssistantTurn` immediately after the existing `detectDoomLoop` check
|
||||
|
||||
Never fired in any real run today. Dead code. The existing `detectDoomLoop` (identical args, threshold 3) is sufficient.
|
||||
|
||||
-----
|
||||
3. **Drop the stale `messages_status_check` CHECK constraint** in `apps/server/src/schema.sql`. Two constraints exist on the table:
|
||||
- `messages_status_check` allows `streaming|complete|failed` (old, stale)
|
||||
- `messages_status_chk` allows `streaming|complete|failed|cancelled` (new)
|
||||
|
||||
The old one prevents `cancelled` from being written. Drop it with `ALTER TABLE messages DROP CONSTRAINT IF EXISTS messages_status_check;`.
|
||||
|
||||
## v1.11.x patches in detail
|
||||
4. **Stop-handler writes terminal status.** When user clicks stop mid-stream, the abort path must `UPDATE messages SET status='cancelled' WHERE id = $assistantMessageId AND status='streaming'`. Currently rows just sit `streaming` forever. The startup sweep catches them on restart, but they should be written immediately. Edit `apps/server/src/services/inference.ts` `handleAbortOrError` to add the UPDATE.
|
||||
|
||||
### v1.11.0 — opencode-style compaction port ✅
|
||||
5. **Commit + tag v1.12.1.** Include the workspace pane sync, status indicator overhaul, startup sweep, and items 1–4 above. Single commit per item is fine; tag at end.
|
||||
|
||||
**What shipped:** Auto-detection of context overflow (`isOverflow(usage, model)`) triggers compaction on the *next* user turn. Compaction preserves the last 2 turns verbatim and produces an anchored Markdown summary (8-section template lifted verbatim from opencode `compaction.ts`) that replaces older head messages. Summary is rolling — each new compaction updates the prior summary, not stacks. Schema additions: `messages.compacted_at`, `messages.summary`, `messages.tail_start_id`, `chats.needs_compaction`. WS `compacted` frame fires sonner toast on completion.
|
||||
**Estimated:** ~150 LoC net (deletions dominate).
|
||||
|
||||
**Key divergences from opencode:** Per-chat (not per-session) compaction state because BooCode history is per-chat. UUID `tail_start_id` not BIGINT. No `parent_id` on messages. Context limit comes from `messages.ctx_max` (last-known `n_ctx`), not a `model.context_limit` field.
|
||||
### v1.12.2 — live throughput display (small UX win)
|
||||
|
||||
### v1.11.1 — Compaction follow-up ✅
|
||||
Surface `tokens_per_second` and `ctx_used` next to the status indicator while streaming. Backend already emits these in the `usage` frame; just consume them in the StatusDot wrapper or a sibling component. ~80 LoC, frontend-only.
|
||||
|
||||
Working-state `chat_status: working/idle` frames around the LLM call inside `compaction.process()`. 24 new vitest cases for the six pure functions (`usable`, `isOverflow`, `estimate`, `turns`, `select`, `buildPrompt`). 7 `.bak-v1.11` files deleted.
|
||||
### v1.12.3 — stale-stream frontend banner
|
||||
|
||||
### v1.11.2 — ContextBar ✅
|
||||
|
||||
New `ContextBar.tsx` rendering above MessageList. Shows `{used} / {max} ({pct}%)` with color tiers computed against `max - 20k` reserve (matches `compaction.usable()`): muted <60%, amber 60-80%, orange 80-95%, red ≥95%. Tooltip shows "Auto-compaction at ~N%". Mobile breakpoints: `< 380px` shows "Ctx" + numbers; `380-639px` adds parenthetical %; `≥ 640px` shows full "Context" label.
|
||||
|
||||
### v1.11.3 — ctx_max capture fix ✅
|
||||
|
||||
Discovered the dead code at `inference.ts:479-481` and `compaction.ts:300` reading `parsed.timings.n_ctx` never fired — llama-server emits `prompt_n / predicted_n / *_ms / *_per_second` in timings but NOT `n_ctx`. New `model-context.ts` module fetches `GET /upstream/<model>/props` with 3s timeout, positive cache (no TTL), 60s negative cache. Wired into all 4 ctx_max write sites (3 in inference.ts, 1 in compaction.ts). 12 new vitest cases. 7 historical rows backfilled to `ctx_max = 262144` (single-day backfill, only qwen3.6-35b-a3b-mxfp4 in use).
|
||||
|
||||
### v1.11.4 — CANCELLED
|
||||
|
||||
Original scope: per-turn budget reset + Continue affordance + CapHitSentinel card. Recon revealed all three are already shipped (v1.8.2 timestamps in inference.ts comments). Dead version slot.
|
||||
|
||||
### v1.11.5 — ContextBar relocate (DISPATCHED)
|
||||
|
||||
Relocate ContextBar from above MessageList to above the agent-picker row. Bump height from ~4px bar to ~10-12px. Always-visible (zero-state when no assistant messages + use `model_context_limit` from v1.11.3 cache). Remove `ChatContextPopover` entirely (redundant signal; mobile-hostile).
|
||||
|
||||
### v1.11.6 — Doom-loop guard (QUEUED)
|
||||
|
||||
Detect 3 identical tool calls in a row within one turn (same name + same args via JSON.stringify). On detection: abort tool-call recursion, insert `metadata.kind='doom_loop'` sentinel, trigger summary turn via existing `runCapHitSummary` path. New `DoomLoopSentinel.tsx` component (no Continue button — looping shouldn't be retried with same tools). Per-turn sliding window, scoped to current turn's tool-call accumulator.
|
||||
|
||||
**Lift source:** opencode `processor.ts`, `DOOM_LOOP_THRESHOLD = 3` constant.
|
||||
|
||||
### v1.11.7 — pathGuard secrets filter (QUEUED)
|
||||
|
||||
Extend pathGuard with `DEFAULT_SECURITY_IGNORE_FILETYPES` from continue.dev `core/indexing/ignore.ts`. Three-tier matcher: exact basenames (`credentials`, `secrets.yml`), extensions (`.env`, `.pem`, `.key`, `.crt`, etc.), prefix patterns (`id_rsa`, `id_dsa`, `id_ecdsa`, `id_ed25519`). Blocked files appear in `list_dir` and `find_files` results with `(blocked)` annotation. `view_file` returns `{ error: 'blocked_secret_file', ... }`. `grep` cannot read blocked file contents. No override mechanism in v1.x (use host shell).
|
||||
|
||||
**Why it matters:** `/opt:/opt:ro` mount currently exposes `boolab/.env`, `dubdrive/users.json`, `authelia/state`, every other service's secrets to any tool past path validation. Cheap close on that surface area.
|
||||
|
||||
-----
|
||||
|
||||
## v1.12 — codecontext sidecar + truncation + repair tool call
|
||||
|
||||
Three lifts fused because they share concerns:
|
||||
|
||||
1. **codecontext sidecar** — new container, single-instance, path-addressed multi-project. Mount `/opt/projects:/workspace:ro`. 8 tools wired as static `ToolDef` wrappers in `apps/server/src/services/tools/codecontext/` (one file per tool). HTTP client to `http://codecontext:8765`. New module `apps/server/src/services/codecontext_bridge.ts` translates `project_id` → `/workspace/<relative>/` paths.
|
||||
|
||||
2. **Tool output truncation** — opencode `truncate.ts` pattern. Cap at 2000 lines / 50KB. Larger outputs: write full content server-side, return preview + opaque `id`. New tool `view_truncated_output(id)` retrieves full content by server-mapped id. **No pathGuard exception** for `/tmp` directory — the opaque-id approach avoids exposing a writable filesystem location to the model. Only codecontext outputs need truncation; native tools (view_file 200 lines, grep 200 results, list_dir 500 entries, find_files 200 results) already cap reasonably.
|
||||
|
||||
3. **`experimental_repairToolCall` equivalent** — when model emits malformed tool call (JSON parse fails or Zod validation fails), return a synthetic tool result instead of an error: `{ error, raw_args, tool_name, hint: 'Retry with valid JSON arguments.' }`. Model self-corrects on next step. Add one line to system prompt instructing self-correction on malformed-args results. Confirmed working precondition: `tool_choice: "required"` accepted by llama-swap (verified 2026-05-20 against qwen3.6-35b-a3b-mxfp4).
|
||||
|
||||
**Hand-roll, not AI SDK adoption.** AI SDK migration deferred to v1.13.
|
||||
|
||||
**AGENTS.md updates:** Each of the 6 builtin agents gets a curated codecontext tool whitelist:
|
||||
- Architect: all 8
|
||||
- Debugger: `search_symbols`, `get_dependencies`
|
||||
- Code Reviewer: `get_file_analysis`
|
||||
- Refactorer: `get_semantic_neighborhoods`, `get_dependencies`
|
||||
- Security Auditor: `get_file_analysis`, `search_symbols`, `get_dependencies`
|
||||
- Prompt Builder: none (no structural reasoning relevance)
|
||||
|
||||
**Dependencies:** v1.11.x merged. No others.
|
||||
|
||||
**Estimated:** 600 LoC across 3-4 dispatches under the v1.12 umbrella.
|
||||
When a chat has a `streaming` row older than ~60s with no new tokens, the UI should surface a "Previous response didn't complete. [Retry] [Discard]" banner instead of silently queueing new sends. Today's debugging spent four hours misreading slow streams as dead; this is the UX fix that prevents that. ~150 LoC, frontend + small backend endpoint for the discard action.
|
||||
|
||||
-----
|
||||
|
||||
@@ -162,11 +113,15 @@ Three lifts fused because they share concerns:
|
||||
3. Tool registry: `ToolDef<T>` gains `category: 'read_only' | 'write'` field. BooCode v1.x rejects any `write` tool at registry time (defense in depth for the BooCoder split). Alpha-sort tool list before sending to model (prompt-cache stability).
|
||||
4. Reasoning content (`reasoning_content` from Qwen3.6) captured as its own part type instead of dropped or inlined.
|
||||
|
||||
**Migration risk:** non-trivial. inference.ts is ~1400 lines with custom XML fallback, SSE parsing, compaction integration. Plan dedicated cutover window. Compaction.ts must update to assemble head from parts.
|
||||
**Migration risk:** non-trivial. `inference.ts` is ~1700 lines with custom XML fallback, SSE parsing, compaction integration. Plan dedicated cutover window. `compaction.ts` must update to assemble head from parts.
|
||||
|
||||
**Replaces:** Original Batch 13 (append-only event log) — same outcome, different vocabulary.
|
||||
|
||||
**Dependencies:** v1.12 merged.
|
||||
**Today's debugging spike validates this work.** Four hours of confusion came from JSON-blob `tool_calls` / `tool_results` columns hiding state from logs and from the inference state machine being invisible. Typed parts + per-part status would have shown the slow-stream-vs-dead distinction in seconds.
|
||||
|
||||
**Dependencies:** v1.12.x cleanup merged.
|
||||
|
||||
**Estimated:** ~1500 LoC.
|
||||
|
||||
-----
|
||||
|
||||
@@ -179,10 +134,12 @@ Three lifts fused because they share concerns:
|
||||
1. Outer loop continues until model returns non-tool finish OR step cap hit. Step ≠ tool call: one step can contain multiple tool calls in parallel.
|
||||
2. `agent.steps ?? Infinity` per-agent step cap. AGENTS.md gains `steps:` field. Refactorer `steps: 5`, Architect `steps: 20`, etc.
|
||||
3. Step-boundary events (`step_start`, `step_finish`) explicit in the parts stream. Per-step snapshot for revert (planned for BooCoder; backend-only in v1.14).
|
||||
4. Doom-loop guard (v1.11.6) migrates from "abort recursion" to "raise within loop iteration." Same predicate, different control flow.
|
||||
4. Doom-loop guards (v1.11.6) migrate from "abort recursion" to "raise within loop iteration." Same predicate, different control flow.
|
||||
|
||||
**Dependencies:** v1.13 merged.
|
||||
|
||||
**Estimated:** ~800 LoC.
|
||||
|
||||
-----
|
||||
|
||||
## v1.15 — Phase D: permission ruleset + MCP client
|
||||
@@ -200,6 +157,8 @@ Three lifts fused because they share concerns:
|
||||
|
||||
**Dependencies:** v1.13 merged (parts table for permission events). Independent of v1.14.
|
||||
|
||||
**Estimated:** ~600 LoC.
|
||||
|
||||
-----
|
||||
|
||||
## v1.16 — Batch 11b: codesight repo_health
|
||||
@@ -208,6 +167,8 @@ Call graph, circular dependency detection, dead code flagging. Port `analyze.mjs
|
||||
|
||||
**Dependencies:** v1.12 merged (can reuse codecontext parse output where overlapping).
|
||||
|
||||
**Estimated:** ~400 LoC.
|
||||
|
||||
-----
|
||||
|
||||
## v2.0 — BooCoder pending changes
|
||||
@@ -218,6 +179,8 @@ New container `boocoder` at `100.114.205.53:9502`. Owns write tools (`edit_file`
|
||||
|
||||
**Dependencies:** v1.13 (parts) + v1.15 (permissions).
|
||||
|
||||
**Estimated:** ~1200 LoC.
|
||||
|
||||
-----
|
||||
|
||||
## v2.1 — BooCoder runtime isolation
|
||||
@@ -228,6 +191,8 @@ Per-session Docker sandbox spawned by BooCoder on first write. Only project path
|
||||
|
||||
**Dependencies:** v2.0.
|
||||
|
||||
**Estimated:** ~600 LoC.
|
||||
|
||||
-----
|
||||
|
||||
## v2.x — Optional / far future
|
||||
@@ -243,17 +208,18 @@ Per-session Docker sandbox spawned by BooCoder on first write. Only project path
|
||||
|
||||
| Container | Port | Mount | Purpose | Status |
|
||||
|---|---|---|---|---|
|
||||
| `boocode` | `100.114.205.53:9500` | `/opt:/opt:ro` | Chat + read-only tools + SPA | Live |
|
||||
| `boocode` | `100.114.205.53:9500` | `/opt:/opt` | Chat + read-only tools + SPA | Live |
|
||||
| `boocode_db` | `127.0.0.1:5500` | `boocode_pgdata` volume | Postgres 16-alpine | Live |
|
||||
| `booterm` | `100.114.205.53:9501` | `/opt/repos:/opt/repos:rw` | Terminals (tmux + node-pty) | Live (v1.10.0) |
|
||||
| `codecontext` | `:8765` (internal) | `/opt/projects:/workspace:ro` | MCP server for architect tools | v1.12 |
|
||||
| **`codecontext`** | **`:8765` (internal)** | **`/opt/projects:/workspace:ro`** | **MCP server for architect tools** | **Live (v1.12.0)** |
|
||||
| `boocoder` | `100.114.205.53:9502` | per-session sandbox | Write tools | v2.0 |
|
||||
|
||||
### Schema additions by version
|
||||
|
||||
- **v1.11.0:** `messages.compacted_at`, `messages.summary`, `messages.tail_start_id`, `chats.needs_compaction`
|
||||
- **v1.11.7:** none (pathGuard logic, no DB)
|
||||
- **v1.12:** none (codecontext is stateless on disk; truncation uses in-memory id→path map with TTL cleanup)
|
||||
- **v1.12.0:** none (codecontext stateless; truncation in-memory id-map with TTL cleanup)
|
||||
- **v1.12.1:** `sessions.workspace_panes jsonb` (workspace sync); drop deprecated `session_panes` table; drop stale `messages_status_check` constraint
|
||||
- **v1.13:** `message_parts` table; `messages` becomes header-only
|
||||
- **v1.14:** `agents.steps` column (or AGENTS.md parser extension; no DB if file-only)
|
||||
- **v1.15:** `permissions` table, `agent_permissions` join, `session_permissions` join
|
||||
@@ -268,11 +234,11 @@ Full inventory in `boocode_code_review.md`. Headline items:
|
||||
|
||||
| Source | Used for | Where |
|
||||
|---|---|---|
|
||||
| **`sst/opencode`** (MIT, TS) | **Compaction algorithms** | **v1.11.0 (shipped)** |
|
||||
| `sst/opencode` (MIT, TS) | Doom-loop guard | v1.11.6 |
|
||||
| `sst/opencode` (MIT, TS) | `repairToolCall`, truncate.ts, MCP client, permission evaluate, runLoop | v1.12/v1.13/v1.14/v1.15 |
|
||||
| `continuedev/continue` (Apache-2.0) | `DEFAULT_SECURITY_IGNORE_FILETYPES` | v1.11.7 |
|
||||
| `nmakod/codecontext` (MIT, Go) | Architect: codebase map sidecar | v1.12 |
|
||||
| `sst/opencode` (MIT, TS) | Compaction algorithms | v1.11.0 (shipped) |
|
||||
| `sst/opencode` (MIT, TS) | Doom-loop guard | v1.11.6 (shipped) |
|
||||
| `sst/opencode` (MIT, TS) | `repairToolCall`, truncate.ts, MCP client, permission evaluate, runLoop | v1.12 (shipped) / v1.13 / v1.14 / v1.15 |
|
||||
| `continuedev/continue` (Apache-2.0) | `DEFAULT_SECURITY_IGNORE_FILETYPES` | v1.11.7 (shipped) |
|
||||
| `nmakod/codecontext` (MIT, Go) | Architect: codebase map sidecar | v1.12.0 (shipped) |
|
||||
| `spirituslab/codesight` (MIT-ish, TS) | Architect: repo health analyzer | v1.16 |
|
||||
| `Aider-AI/aider` (Apache-2.0) | Fallback `.scm` grammars | v1.12 (fallback) |
|
||||
| `cline/cline` (Apache-2.0) | Plan/Act pattern (absorbed into v1.15 permissions) | v1.15 |
|
||||
@@ -281,8 +247,6 @@ Full inventory in `boocode_code_review.md`. Headline items:
|
||||
| `aimasteracc/tree-sitter-analyzer` (MIT) | Outline-first patterns | v1.12 (alt) |
|
||||
| `earendil-works/pi` (MIT) | Multi-provider LLM | v2.x (optional) |
|
||||
|
||||
**Original Batch 13 (event log from OpenHands) replaced** by v1.13 (parts table). Same outcome, different framing.
|
||||
|
||||
-----
|
||||
|
||||
## Decisions log
|
||||
@@ -293,10 +257,15 @@ Full inventory in `boocode_code_review.md`. Headline items:
|
||||
- **Globstar parked** — not an architect tool. Future verify-before-commit candidate only.
|
||||
- **codeprysm rejected** — embedding-based. Node/edge taxonomy noted as reference if we ever build our own graph.
|
||||
- **Batch 9 decoupled from Batch 7 (2026-05-16); shipped in `92bd3b1`.** Builtin defaults: six agents (Code Reviewer, Debugger, Refactorer, Architect, Security Auditor, Prompt Builder) with no `model` field. Session model wins by default.
|
||||
- **opencode lift opened** (2026-05-20). Started with compaction (v1.11.0). Continuing through v1.15. Five distinct algorithms: compaction, doom-loop guard, repairToolCall, runLoop, permission evaluate. Plus `truncate.ts` and `MCP client`. Each lifts the algorithm, not the Effect-TS plumbing.
|
||||
- **AI SDK adoption deferred to v1.13.** Hand-roll repairToolCall in v1.12 first. Migrate everything together when parts table lands.
|
||||
- **`tool_choice='required'` confirmed supported** by llama-swap (qwen3.6-35b-a3b-mxfp4, 2026-05-20). Unblocks repair tool call viability.
|
||||
- **v1.11.4 cancelled** (2026-05-20). Per-turn budget reset + Continue affordance + CapHitSentinel were already shipped in v1.8.2. Roadmap was 14 versions stale at time of recon.
|
||||
- **opencode lift opened** (2026-05-20). Started with compaction (v1.11.0). Continuing through v1.15. Five distinct algorithms: compaction, doom-loop guard, repairToolCall, runLoop, permission evaluate. Plus `truncate.ts` and MCP client. Each lifts the algorithm, not the Effect-TS plumbing.
|
||||
- **AI SDK adoption deferred to v1.13.** Hand-roll repairToolCall in v1.12 — not actually done in v1.12.0; truncation also deferred. v1.12.0 shipped codecontext + container guidance + skills only.
|
||||
- **`tool_choice='required'` confirmed supported** by llama-swap (qwen3.6-35b-a3b-mxfp4, 2026-05-20).
|
||||
- **v1.11.4 cancelled** (2026-05-20). Per-turn budget reset + Continue affordance + CapHitSentinel were already shipped in v1.8.2.
|
||||
- **v1.12.0 shipped** (2026-05-21). codecontext sidecar Track B + container guidance Track A. v1.12 truncation and repairToolCall were deferred into v1.13's AI SDK migration where they get for-free.
|
||||
- **v1.12.1 workspace pane sync** (2026-05-21). Moved pane state from per-device localStorage to `sessions.workspace_panes jsonb` with WS broadcast for cross-device sync. Deprecated `session_panes` table dropped. Legacy localStorage migrates on first load.
|
||||
- **v1.12.1 status indicator overhaul** (2026-05-21). ChatStatusFrame expanded from `working|idle|error` to `streaming|tool_running|waiting_for_input|idle|error`. StatusDot rewritten with distinct animations per state. Added `executeToolPhase`-entry `tool_running` publish.
|
||||
- **detectSameNameLoop reverted** (planned v1.12.1). Added during the 2026-05-21 debugging spike to catch same-tool-name-with-different-args loops. Never fired in any real run because the existing `detectDoomLoop` covers the actual failure modes. Dead code, reverting.
|
||||
- **The 2026-05-21 "freeze" debugging spike taught one lesson**: BooCode has no UI signal for the difference between a slow stream and a dead stream. Diagnostic logging (added today, reverted in v1.12.1) revealed the inference loop was working correctly throughout — what looked like four hours of deterministic hang was multiple instances of qwen3.6 generating 8k tokens of self-doubt at temperature 0.2 on a "find the bug" prompt with no real bug. v1.12.2 (live tok/s display) and v1.12.3 (stale-stream banner) directly address this gap.
|
||||
|
||||
-----
|
||||
|
||||
|
||||
Reference in New Issue
Block a user