@loicngr/kobo 2.1.28 → 2.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +60 -11
- package/CHANGELOG.md +20 -1
- package/CONFIGURATION.md +140 -35
- package/CONTRIBUTING.md +2 -2
- package/DESIGN.md +1 -1
- package/README.md +12 -9
- package/SECURITY.md +7 -2
- package/dist/server/db/memory-schema.js +5 -5
- package/dist/server/db/migrations.js +2 -0
- package/dist/server/db/mistral-memory-migration.js +40 -0
- package/dist/server/routes/engines.js +14 -0
- package/dist/server/routes/environment.js +1 -1
- package/dist/server/routes/health.js +14 -3
- package/dist/server/routes/settings.js +7 -1
- package/dist/server/routes/workspaces.js +116 -9
- package/dist/server/services/agent/engines/claude-code/capabilities.js +2 -0
- package/dist/server/services/agent/engines/claude-code/engine.js +3 -0
- package/dist/server/services/agent/engines/claude-code/resolve-binary.js +1 -1
- package/dist/server/services/agent/engines/codex/capabilities.js +2 -0
- package/dist/server/services/agent/engines/codex/engine.js +3 -0
- package/dist/server/services/agent/engines/configuration.js +14 -0
- package/dist/server/services/agent/engines/mistral-vibe/capabilities.js +13 -0
- package/dist/server/services/agent/engines/mistral-vibe/client.js +64 -0
- package/dist/server/services/agent/engines/mistral-vibe/configuration.js +76 -0
- package/dist/server/services/agent/engines/mistral-vibe/engine.js +361 -0
- package/dist/server/services/agent/engines/mistral-vibe/event-mapper.js +297 -0
- package/dist/server/services/agent/engines/mistral-vibe/options-builder.js +35 -0
- package/dist/server/services/agent/engines/mistral-vibe/server-requests.js +278 -0
- package/dist/server/services/agent/engines/mistral-vibe/spawn.js +176 -0
- package/dist/server/services/agent/engines/registry.js +2 -0
- package/dist/server/services/agent/engines/types.js +6 -0
- package/dist/server/services/agent/orchestrator.js +88 -25
- package/dist/server/services/agent/session-controller.js +5 -0
- package/dist/server/services/auto-loop-final-review-service.js +10 -3
- package/dist/server/services/dev-server-service.js +68 -4
- package/dist/server/services/environment-check-service.js +9 -3
- package/dist/server/services/memory-service.js +1 -1
- package/dist/server/services/mistral-options-service.js +145 -0
- package/dist/server/services/pr-watcher-service.js +40 -11
- package/dist/server/services/review-service.js +33 -9
- package/dist/server/services/session-handoff-service.js +28 -2
- package/dist/server/services/settings-defaults.js +1 -0
- package/dist/server/services/settings-service.js +19 -1
- package/dist/server/services/workspace-creation-mcp-service.js +50 -8
- package/dist/server/services/workspace-dialogue-service.js +2 -0
- package/dist/server/services/workspace-message-service.js +19 -1
- package/dist/server/services/workspace-permission-policy-service.js +24 -0
- package/dist/server/utils/bounded-process.js +1 -1
- package/dist/shared/launch-instructions.js +18 -7
- package/dist/shared/memory.js +1 -1
- package/dist/shared/mistral-models.js +9 -0
- package/dist/shared/mistral-options.js +1 -0
- package/dist/shared/question-selections.js +16 -0
- package/dist/shared/workspace-creation-tools.js +8 -2
- package/dist/shared/workspace-dialogue-tools.js +15 -4
- package/docs/deployment-vps.md +10 -3
- package/docs/getting-started.md +4 -3
- package/docs/troubleshooting.md +2 -2
- package/package.json +20 -14
- package/src/client/dist/pwa/assets/ActivityFeed-C5stmHXP.js +2 -0
- package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-CIDSX32d.css +1 -0
- package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-DG32W_0G.js +1 -0
- package/src/client/dist/pwa/assets/{ChangelogPage-CAAUEn5X.js → ChangelogPage-_vItY8vA.js} +1 -1
- package/src/client/dist/pwa/assets/{ClosePopup-CRV2hxHS.js → ClosePopup-rU8Bm-mC.js} +1 -1
- package/src/client/dist/pwa/assets/{ComparisonPanel-BCb7vB5E.js → ComparisonPanel-B3BMzQH0.js} +2 -2
- package/src/client/dist/pwa/assets/CreatePage-FlGrfmjX.js +2 -0
- package/src/client/dist/pwa/assets/CreatePage-oh8ihVC4.css +1 -0
- package/src/client/dist/pwa/assets/{DashboardPage-XE52EABP.js → DashboardPage-lJGwWQYQ.js} +1 -1
- package/src/client/dist/pwa/assets/DiffViewer-DIaQH3lA.js +8 -0
- package/src/client/dist/pwa/assets/{DocumentsPanel-L4pbQfz1.js → DocumentsPanel-Ct-nm4fX.js} +1 -1
- package/src/client/dist/pwa/assets/{DrawerToggleButton-DiOJm5he.js → DrawerToggleButton-M5qv4Io-.js} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-BaHCgb3p.js +3 -0
- package/src/client/dist/pwa/assets/GitPanel-C8vw2qvW.css +1 -0
- package/src/client/dist/pwa/assets/HealthPage-DR3wa6iD.js +1 -0
- package/src/client/dist/pwa/assets/HealthPage-Dbn4J_DT.css +1 -0
- package/src/client/dist/pwa/assets/{MainLayout-DoAEgANU.css → MainLayout-CHi8qP1D.css} +1 -1
- package/src/client/dist/pwa/assets/MainLayout-WJabICsA.js +2 -0
- package/src/client/dist/pwa/assets/{MemoryPanel-DtEvh_b7.js → MemoryPanel-CRpWdfc0.js} +1 -1
- package/src/client/dist/pwa/assets/MemoryProposalList-DGz3lDbL.js +1 -0
- package/src/client/dist/pwa/assets/{QBadge-CW3Lw-kL.js → QBadge-DiwbRpte.js} +1 -1
- package/src/client/dist/pwa/assets/{QBanner-BT2ZemYu.js → QBanner-Cw89HSjk.js} +1 -1
- package/src/client/dist/pwa/assets/QBtn-kfhHFy7Q.js +1 -0
- package/src/client/dist/pwa/assets/{QBtnDropdown-CWPIugs8.js → QBtnDropdown-tt8rUNNR.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnGroup-CnM4vSJA.js → QBtnGroup-Bioxjp9q.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnToggle-DccOOtbh.js → QBtnToggle-Bod-x9im.js} +1 -1
- package/src/client/dist/pwa/assets/{QChip-Be16M4Ig.js → QChip-DvhtPv_L.js} +1 -1
- package/src/client/dist/pwa/assets/{QExpansionItem-D-EGL2b3.js → QExpansionItem-BkrI3UPL.js} +1 -1
- package/src/client/dist/pwa/assets/{QItemSection-MdJ1_ZK7.js → QItemSection-ahqRK4JF.js} +1 -1
- package/src/client/dist/pwa/assets/{QList-Cx1UfaUm.js → QList-CAUl0v66.js} +1 -1
- package/src/client/dist/pwa/assets/{QMarkupTable-UhP7fVUp.js → QMarkupTable-B4LLAly-.js} +1 -1
- package/src/client/dist/pwa/assets/{QPage-CqkGHokx.js → QPage-DIy_mRoT.js} +1 -1
- package/src/client/dist/pwa/assets/{QScrollArea-BMrqK-xd.js → QScrollArea-BvgnY-oA.js} +1 -1
- package/src/client/dist/pwa/assets/QSelect-BtZB1wrB.js +1 -0
- package/src/client/dist/pwa/assets/{QSpinnerDots-xdWyaE1i.js → QSpinnerDots-Bea6hAuJ.js} +1 -1
- package/src/client/dist/pwa/assets/{QTooltip-Bk8dLUtU.js → QTooltip-CDH6p745.js} +1 -1
- package/src/client/dist/pwa/assets/{SchedulePanel-CuxmxCKi.js → SchedulePanel-C2rWlh7l.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-DKnQPUqY.js → SearchPage-BFd4NQwJ.js} +1 -1
- package/src/client/dist/pwa/assets/{SettingsPage-B4rmd2WX.css → SettingsPage-Bm0TcarK.css} +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-DDQCgnjL.js +9 -0
- package/src/client/dist/pwa/assets/{SplitWorkspacePage-WhQyX8fn.js → SplitWorkspacePage-DKCtOZO4.js} +1 -1
- package/src/client/dist/pwa/assets/TerminalPanel-BE_MSZF0.js +16 -0
- package/src/client/dist/pwa/assets/{ToolCallItem-DYubi-J0.js → ToolCallItem-BEYaOtgh.js} +4 -4
- package/src/client/dist/pwa/assets/{TouchPan-DDotyYLN.js → TouchPan-DeYoOjX5.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-kAnEMcy2.js → TourReplayButton-D5lMwIKt.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-BHEAsIoo.js +1 -0
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-v7ein__H.css +1 -0
- package/src/client/dist/pwa/assets/WorkspacePage-5_wsJPaJ.js +4 -0
- package/src/client/dist/pwa/assets/WorkspacePage-CtUXz0Cq.css +1 -0
- package/src/client/dist/pwa/assets/{browser-DVYLH8vl.js → browser-ogy_9LVv.js} +2 -2
- package/src/client/dist/pwa/assets/build-path-tree-CRXxaYkA.js +1 -0
- package/src/client/dist/pwa/assets/custom-sounds-iLTkCd_i.js +1 -0
- package/src/client/dist/pwa/assets/de-BqDU7iZH.js +17 -0
- package/src/client/dist/pwa/assets/detached-fullscreen-CHqMxB-8.js +1 -0
- package/src/client/dist/pwa/assets/dom-CRPVbmiy.js +2 -0
- package/src/client/dist/pwa/assets/ecl-94qehhXe.js +1 -0
- package/src/client/dist/pwa/assets/{editor.api-BC38eXAS.js → editor.api-Dx6TbfZG.js} +9 -9
- package/src/client/dist/pwa/assets/editor.worker-xrHNhPSq.js +33 -0
- package/src/client/dist/pwa/assets/efforts-DnJh2fW_.js +9 -0
- package/src/client/dist/pwa/assets/es-D4VMXQRk.js +17 -0
- package/src/client/dist/pwa/assets/expand-template-PUEVWny3.js +1 -0
- package/src/client/dist/pwa/assets/{format-OwxXBnDJ.js → format-yf9XM3dV.js} +48 -48
- package/src/client/dist/pwa/assets/{formatters-YgaCZcwJ.js → formatters-D0sXu9Oe.js} +1 -1
- package/src/client/dist/pwa/assets/fr-DIyaCFB3.js +17 -0
- package/src/client/dist/pwa/assets/{freemarker2-l7R42fI2.js → freemarker2-l_xIHxRf.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-DFmPrgjH.js → handlebars-CYgq99yQ.js} +1 -1
- package/src/client/dist/pwa/assets/{html-CERIAlPM.js → html-C28GatN_.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-2AmHIUy0.js +1 -0
- package/src/client/dist/pwa/assets/index-C0MApoXN.css +1 -0
- package/src/client/dist/pwa/assets/index-MMYMztJ_.js +20 -0
- package/src/client/dist/pwa/assets/it-CF6_4OS0.js +17 -0
- package/src/client/dist/pwa/assets/{javascript-BBYncplF.js → javascript-YCSueyyk.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-C1HqYyYU.js → liquid-CUBn90Gs.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-E74dsP22.js → mdx-C5WOHShJ.js} +1 -1
- package/src/client/dist/pwa/assets/monaco-contributions-DYwqbh7m.js +53 -0
- package/src/client/dist/pwa/assets/{monaco.contribution-DYdn9CwR.js → monaco.contribution-CoFzrPQl.js} +2 -2
- package/src/client/dist/pwa/assets/network-auth-BpJ6Noax.js +1 -0
- package/src/client/dist/pwa/assets/notify-theme-NPq4-Tup.js +1 -0
- package/src/client/dist/pwa/assets/permissionModes-Bbl901Hx.js +36 -0
- package/src/client/dist/pwa/assets/{private.use-form-DY1BkePL.js → private.use-form-BcspuzM9.js} +1 -1
- package/src/client/dist/pwa/assets/{project-color-_snXWYUp.js → project-color-gNyhKJlV.js} +1 -1
- package/src/client/dist/pwa/assets/{python-DNAAGBcX.js → python-lhKUZdPj.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-CB3g5p_T.js → razor-Chi44rEL.js} +1 -1
- package/src/client/dist/pwa/assets/reactivity.esm-bundler-Dplx1ILy.js +1 -0
- package/src/client/dist/pwa/assets/render-chat-markdown-C9ihAYBt.js +67 -0
- package/src/client/dist/pwa/assets/runtime-core.esm-bundler-BAUgNzMK.js +1 -0
- package/src/client/dist/pwa/assets/{typescript-0kpz8bqP.js → typescript-CU2TXVm6.js} +1 -1
- package/src/client/dist/pwa/assets/{use-checkbox-v4aAbE6K.js → use-checkbox-DUxgXR4e.js} +1 -1
- package/src/client/dist/pwa/assets/{use-id-BrdYXce0.js → use-id-B7ieAx2m.js} +1 -1
- package/src/client/dist/pwa/assets/use-is-mobile-CHmaewI1.js +1 -0
- package/src/client/dist/pwa/assets/{use-search-index-status-D38yFOD_.js → use-search-index-status-CQ9S05G7.js} +1 -1
- package/src/client/dist/pwa/assets/use-slide-transition-BJh9xGMa.js +1 -0
- package/src/client/dist/pwa/assets/use-tours-BmrZbHjz.js +2 -0
- package/src/client/dist/pwa/assets/use-tours-CU5oA7cz.css +1 -0
- package/src/client/dist/pwa/assets/use-worktree-restore-DcucRlLh.js +1 -0
- package/src/client/dist/pwa/assets/{workspace-templates-D-lPJQ4G.js → workspace-templates-DaG42EEt.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-BbOuqdUe.js → xml-CPO5LI6F.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-gasFQtfk.js → yaml-CoYs82jI.js} +1 -1
- package/src/client/dist/pwa/index.html +10 -10
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/mcp-server/README.md +18 -6
- package/src/client/dist/pwa/assets/ActivityFeed-D58VS9o2.js +0 -2
- package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-CK3r_fVB.js +0 -1
- package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-Q-OlSQ1c.css +0 -1
- package/src/client/dist/pwa/assets/CreatePage-DasH1Uk4.js +0 -2
- package/src/client/dist/pwa/assets/CreatePage-DxOes_cF.css +0 -1
- package/src/client/dist/pwa/assets/DiffViewer-CncKlXne.js +0 -8
- package/src/client/dist/pwa/assets/GitPanel-WJlzy2VJ.js +0 -3
- package/src/client/dist/pwa/assets/GitPanel-yHvU38dp.css +0 -1
- package/src/client/dist/pwa/assets/HealthPage-Cnlhrn--.css +0 -1
- package/src/client/dist/pwa/assets/HealthPage-hJY5MurK.js +0 -1
- package/src/client/dist/pwa/assets/MainLayout-DgWElK7w.js +0 -2
- package/src/client/dist/pwa/assets/MemoryProposalList-kgFCm9zz.js +0 -1
- package/src/client/dist/pwa/assets/QBtn-BUSdPaf4.js +0 -1
- package/src/client/dist/pwa/assets/QSelect-DFWyDWCE.js +0 -1
- package/src/client/dist/pwa/assets/SettingsPage-CO3vIpPd.js +0 -9
- package/src/client/dist/pwa/assets/TerminalPanel-BY0lPq6k.js +0 -16
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-B9LE8HtU.css +0 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-DiYt3rP3.js +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-BEBwwr81.css +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-K-1ce50d.js +0 -4
- package/src/client/dist/pwa/assets/build-path-tree-DEuOdIIk.js +0 -1
- package/src/client/dist/pwa/assets/custom-sounds-Ggw6V9iF.js +0 -1
- package/src/client/dist/pwa/assets/de-Bk3zQrin.js +0 -17
- package/src/client/dist/pwa/assets/detached-fullscreen-Du3TcYdX.js +0 -1
- package/src/client/dist/pwa/assets/dom-BtYTvLeN.js +0 -2
- package/src/client/dist/pwa/assets/ecl-D05T4iGw.js +0 -1
- package/src/client/dist/pwa/assets/editor.worker-BLJF_oQx.js +0 -33
- package/src/client/dist/pwa/assets/efforts-TGacUPcJ.js +0 -9
- package/src/client/dist/pwa/assets/es-f3xuAWA9.js +0 -17
- package/src/client/dist/pwa/assets/expand-template-DM8gq3Mo.js +0 -1
- package/src/client/dist/pwa/assets/fr-B6c21SG3.js +0 -17
- package/src/client/dist/pwa/assets/i18n-WaE4cZK9.js +0 -1
- package/src/client/dist/pwa/assets/index-C8zAZ-k-.css +0 -1
- package/src/client/dist/pwa/assets/index-CpWBGKdM.js +0 -20
- package/src/client/dist/pwa/assets/it-DUstDpC2.js +0 -17
- package/src/client/dist/pwa/assets/monaco-contributions-DHvm-kp5.js +0 -53
- package/src/client/dist/pwa/assets/network-auth-DTZUKbny.js +0 -1
- package/src/client/dist/pwa/assets/notify-theme-FuTL7HuS.js +0 -1
- package/src/client/dist/pwa/assets/permissionModes-D-Nexnoo.js +0 -36
- package/src/client/dist/pwa/assets/reactivity.esm-bundler-DY1JkAEA.js +0 -1
- package/src/client/dist/pwa/assets/render-chat-markdown-CafzCcmu.js +0 -69
- package/src/client/dist/pwa/assets/runtime-core.esm-bundler-Bqg71Vll.js +0 -1
- package/src/client/dist/pwa/assets/use-is-mobile-CDB_rzM9.js +0 -1
- package/src/client/dist/pwa/assets/use-slide-transition-B_Nu6u-t.js +0 -1
- package/src/client/dist/pwa/assets/use-tours-BWkHp34X.js +0 -2
- package/src/client/dist/pwa/assets/use-tours-CTZuBZOi.css +0 -1
- package/src/client/dist/pwa/assets/use-worktree-restore-DUjZr44N.js +0 -1
package/AGENTS.md
CHANGED
|
@@ -4,7 +4,7 @@ Guidance for AI coding agents (Claude Code, Cursor, etc.) working on this reposi
|
|
|
4
4
|
|
|
5
5
|
## What this project is
|
|
6
6
|
|
|
7
|
-
**Kōbō** (工房, Japanese for "workshop") orchestrates Claude Code
|
|
7
|
+
**Kōbō** (工房, Japanese for "workshop") orchestrates Claude Code, OpenAI Codex and Mistral Vibe agents across isolated git worktrees. Each "workspace" is a self-contained mission with its own worktree, branch, agent sessions, optional dev server, optional Notion/Sentry context, and a dedicated MCP tools server. A Vue 3 UI lets the human track progress, read live agent output, review Git changes, and manage the lifecycle. A workspace can switch engines through a handoff to a fresh session while preserving its worktree and history.
|
|
8
8
|
|
|
9
9
|
Single-user dev tool, local by default. The server binds `127.0.0.1` unless the opt-in "network access" setting is enabled. Operator HTTP access uses the network token or a 12-hour HttpOnly browser session; browsers use 60-second single-use path-bound tickets for WebSocket upgrades, never the operator token in the URL or localStorage. Behind-a-reverse-proxy mode also gates loopback operator requests. Rotation, network disable and proxy-mode changes revoke sessions, tickets and active WebSockets. `/api/health` stays exempt. Host/Origin checks apply separately; public proxy origin must be declared explicitly. No multi-tenant concerns.
|
|
10
10
|
|
|
@@ -12,7 +12,7 @@ External `/api/mcp` and global stdio require dedicated hashed credentials with t
|
|
|
12
12
|
|
|
13
13
|
## Tech stack
|
|
14
14
|
|
|
15
|
-
**Backend**: Node.js ≥
|
|
15
|
+
**Backend**: Node.js ≥ 26.12.1, Hono (HTTP), `ws` (WebSocket), better-sqlite3 (WAL mode), nanoid, `@modelcontextprotocol/sdk`. TypeScript throughout, `tsx` for dev, `tsc` for production build.
|
|
16
16
|
|
|
17
17
|
**Frontend**: Vue 3, Quasar 2, Pinia, vue-router, marked + dompurify for markdown rendering. Vite via `@quasar/app-vite`, built and served as a Progressive Web App in production.
|
|
18
18
|
|
|
@@ -70,7 +70,7 @@ src/
|
|
|
70
70
|
│ │ │ ├── orchestrator.ts # per-workspace engine map, retry/quota handling, watchdog, public API
|
|
71
71
|
│ │ │ ├── session-controller.ts # lifecycle wrapper around an AgentEngine instance
|
|
72
72
|
│ │ │ ├── event-router.ts # persists/broadcasts normalized AgentEvent via WebSocket
|
|
73
|
-
│ │ │ └── engines/{claude-code,codex}/ # per-engine adapters implementing the AgentEngine contract
|
|
73
|
+
│ │ │ └── engines/{claude-code,codex,mistral-vibe}/ # per-engine adapters implementing the AgentEngine contract
|
|
74
74
|
│ │ ├── forge/ # github / gitlab / bitbucket-community / none, registry + auto-resolve
|
|
75
75
|
│ │ ├── change-source-branch-service.ts # re-target a workspace onto a new source branch (built-in cherry-pick or custom bash)
|
|
76
76
|
│ │ ├── git-stats-service.ts # pure compute of commit/ahead-behind/diff stats + forge availability for a workspace
|
|
@@ -178,7 +178,7 @@ and [VPS setup](./docs/vps-projects-and-skills.md#switch-engine-accounts-inside-
|
|
|
178
178
|
|
|
179
179
|
## Persistent memory
|
|
180
180
|
|
|
181
|
-
Kōbō memory is independent of provider chat history/native memory and shared by Claude Code and
|
|
181
|
+
Kōbō memory is independent of provider chat history/native memory and shared by Claude Code, Codex and Mistral Vibe. `memoryMode` is a global setting defaulting to `hybrid`: Manual permits reads only; Hybrid applies workspace writes and proposes project/global writes; Automatic applies writes to the explicitly targeted scope. Mode is checked per operation, so a setting change affects existing agent sessions; pending/rejected proposals are never automatically approved or revived. Plan/review/report-only capabilities cannot write.
|
|
182
182
|
|
|
183
183
|
`memory_scopes` identify global, normalized configured project path, or durable workspace id. Project identity is not a display name, branch, or worktree path. Clear is transactional: it deletes entries and pending proposals only from the exact scope, increments generation, and writes content-free journal metadata. Every delayed writer supplies its expected generation. Workspace archive/purge preserves memory; workspace deletion cascades its own scope and launch records while leaving global/project scopes intact. Provenance FKs become null when the source session/workspace is deleted; saved memory remains in its scope until explicitly erased.
|
|
184
184
|
|
|
@@ -444,7 +444,7 @@ See the "Notion integration" section of the README for the end-user setup guide.
|
|
|
444
444
|
### Launch instructions
|
|
445
445
|
|
|
446
446
|
`src/shared/launch-instructions.ts` composes application-owned MCP discovery,
|
|
447
|
-
permissions, progress reporting and continuation rules for
|
|
447
|
+
permissions, progress reporting and continuation rules for all three engines on every
|
|
448
448
|
fresh/resumed launch. Prefer discovering the available tool schemas to embedding
|
|
449
449
|
a duplicate catalogue. Keep Plan conversation-only; template approval cannot
|
|
450
450
|
expand tool permissions. Initial writable auto-loop launches seed tasks and end;
|
|
@@ -493,11 +493,58 @@ through `ExitPlanMode`; a permission change requires a new launch.
|
|
|
493
493
|
|
|
494
494
|
### Agent engines
|
|
495
495
|
|
|
496
|
-
|
|
496
|
+
**Mistral Vibe** (`mistral-vibe/`, engine id `mistral-vibe`) uses ACP v1 through
|
|
497
|
+
SDK 2.0.1 and the server user's PATH-resolved `vibe-acp`. Native setup/authentication
|
|
498
|
+
belongs to that same user/environment, including Docker; Kōbō stores no Vibe key.
|
|
499
|
+
Model/thinking choices come from validated native ACP `configOptions`, including
|
|
500
|
+
model-specific thinking levels. `auto` omits setters; explicit launch selections
|
|
501
|
+
use public ACP setters and may persist native Vibe preferences. Discovery uses
|
|
502
|
+
child-only native environment overrides and session/new without prompts, setters,
|
|
503
|
+
provider requests or Kōbō MCP grants. Resolve workspace/project context server-side;
|
|
504
|
+
cache/coalesce only after confirmed native closure and retain failed shutdown slots.
|
|
505
|
+
Preflight explicit choices before mutations, then confirm mode → model → thinking
|
|
506
|
+
again on the actual new/load session before prompting. Static Auto catalogues are
|
|
507
|
+
fallbacks, never complete membership validators. Configured Auto must not acquire
|
|
508
|
+
an observed session-model override during resume or review return; explicit source
|
|
509
|
+
configuration may restore the observed source/brainstorm alias. Native review
|
|
510
|
+
return thinking comes from the pinned saved session, never the workspace iteration
|
|
511
|
+
effort. Auto-model resumes with explicit thinking defer catalogue membership to
|
|
512
|
+
the loaded native session because session/new defaults may use another model.
|
|
513
|
+
Fresh Vibe workspaces default to `interactive`;
|
|
514
|
+
`interactive`/`strict`/`bypass` select advertised native `ask`/`accept-edits`/
|
|
515
|
+
`auto-approve`. Native profiles/admin policy remain authoritative. Reject Plan,
|
|
516
|
+
readOnly and restricted handoff-summary launches before spawn or workspace mutations.
|
|
517
|
+
Manual Vibe reviews always use a fresh controlled launch, Interactive by default;
|
|
518
|
+
automatic final reviews are fixed Interactive. Native permissions do not enforce
|
|
519
|
+
filesystem read-only access: prompts forbid every modification and approvals may
|
|
520
|
+
pause the review. Kōbō MCP/memory grants and bootstrap remain read-only even in
|
|
521
|
+
Automatic memory mode. Returning/final reviewers derive this role from durable
|
|
522
|
+
state; no-return reviews use the private KOBO_REVIEW_ONLY launch marker.
|
|
523
|
+
Explicit native Plan requests still fail; only explicitly starting a native review
|
|
524
|
+
chooses its independent Interactive default. Ordinary saved Plan is never promoted.
|
|
525
|
+
|
|
526
|
+
No live steering, account/quota panel, managed skills or sub-agent cards/individual
|
|
527
|
+
stop. Queue messages until confirmed native closure, then resume; immediate sends
|
|
528
|
+
fail while busy. Normal task/memory/progress MCP and manual handoff destinations
|
|
529
|
+
remain supported. Shared memory migration v55 preserves existing facts and adds
|
|
530
|
+
Mistral provenance. Setup requests have 20-second initialize/30-second session
|
|
531
|
+
limits; prompts have no absolute deadline. Opt-in liveness uses 120 seconds
|
|
532
|
+
foreground silence or 30 minutes unresolved tools, paused for human input.
|
|
533
|
+
|
|
534
|
+
Native shutdown drains stdout, ends stdin and awaits actual exit and an empty
|
|
535
|
+
owned process group; a close ACK is insufficient. Allow 15 seconds for native EOF
|
|
536
|
+
cleanup before bounded signal fallback. Unconfirmed/abnormal exit retains ownership.
|
|
537
|
+
Do not claim arbitrary unmanaged descendant containment. Vibe 3.0.1 has passed the
|
|
538
|
+
real-adapter offline provider/MCP smoke on Linux; paid-provider compatibility is
|
|
539
|
+
still unverified. Health version detection proves executable availability only,
|
|
540
|
+
never authentication. See [setup](CONFIGURATION.md#mistral-vibe) and
|
|
541
|
+
[compatibility evidence](src/__tests__/fixtures/mistral-acp/README.md).
|
|
542
|
+
|
|
543
|
+
Three engines live under `src/server/services/agent/engines/`, implementing the `AgentEngine` contract in `types.ts`:
|
|
497
544
|
|
|
498
545
|
Global `agentWatchdogEnabled` is opt-in (false for fresh and existing installs;
|
|
499
546
|
settings migration v64). The orchestrator snapshots it into `StartOptions.watchdogEnabled`
|
|
500
|
-
on every launch/resume for
|
|
547
|
+
on every launch/resume for all three engines. Gate stream/tool inactivity, background
|
|
501
548
|
stall, compaction and failed-result-drain watchdogs; retain normal completion,
|
|
502
549
|
manual stop, protocol/startup deadlines and confirmed-dead-process cleanup.
|
|
503
550
|
The toggle is first in Settings → Agents and does not reconfigure active launches.
|
|
@@ -536,7 +583,7 @@ Background: the engine was migrated from `@openai/codex-sdk` (one-shot `codex ex
|
|
|
536
583
|
- **Permission mode vs collaboration mode are independent.** Sandbox + approvalPolicy control *what the agent may do at OS level* (read-only / workspace-write, never / on-request / unless-trusted). `collaborationMode` is a separate session-level flag that gates internal Codex behaviour (notably interactive Q&A). Kōbō hides both behind a single "permission mode" selector and maps them together.
|
|
537
584
|
- **Sub-agents map to `collabAgentToolCall`.** Codex's analogue of Claude's Task tool is `collabAgentToolCall` (`spawnAgent` / `sendInput` / `resumeAgent` / `wait` / `closeAgent`). The mapper emits **both** a `tool:call` named `Task` (chat card) and a `subagent:progress` event (right-hand panel) per call, the same dual-emission Claude does. See `event-mapper.ts` `handleItemStarted` / `handleItemCompleted` for the `collabAgentToolCall` branch.
|
|
538
585
|
- **`fileChange` items carry a unified-diff blob.** The protocol shape is `{ path, kind: PatchChangeKind, diff: string }` per change; `kind` is a discriminated union, not a string. The mapper flattens the first change into a Claude-style Edit input (`{ file_path, diff, change_kind, move_path? }`) so the existing `ToolCallItem` renderer picks it up. The client parses the unified diff into `DiffLine[]` via `parseUnifiedDiff` in `inline-diff.ts`.
|
|
539
|
-
- **Streaming bursts trip auto-scroll.**
|
|
586
|
+
- **Streaming bursts trip auto-scroll.** All three engines can emit token deltas; Claude enables SDK partial messages as well. The naive `eventCount` watcher in `ActivityFeed.vue` triggered an animated `scrollToBottom(180)` per event, causing stacked animations and visible jank. Scroll requests are coalesced through `requestAnimationFrame`; preserve burst handling when changing the feed.
|
|
540
587
|
- **`MCP tools` need `default_tools_approval_mode: 'auto'` in `config.mcp_servers`.** Without it Codex flags every MCP tool call as needing user approval ("user cancelled MCP tool call"). Kōbō trusts every tool it spawns, so the options-builder pre-approves the namespace.
|
|
541
588
|
|
|
542
589
|
## Workspace operations
|
|
@@ -616,8 +663,10 @@ never automatically resend a possibly delivered summary. Explicit user stop canc
|
|
|
616
663
|
the continuation. Errors retain recoverable intent and restore original settings.
|
|
617
664
|
|
|
618
665
|
`auto_loop_final_reviews` (migration v52) adds an optional final gate configured
|
|
619
|
-
before execution. Each pass starts a separate
|
|
620
|
-
engine/model/effort/instructions
|
|
666
|
+
before execution. Each pass starts a separate review session with its own
|
|
667
|
+
engine/model/effort/instructions: Plan for Claude Code/Codex, native Interactive
|
|
668
|
+
for Vibe. Kōbō grants allow only reads and scoped reports; native Vibe permissions
|
|
669
|
+
do not guarantee filesystem read-only access and may require human approval. Only the active reviewer capability may submit
|
|
621
670
|
the structured `kobo__submit_final_review` verdict. Findings become work tasks,
|
|
622
671
|
invalidate finalization, and return to the exact original working session for
|
|
623
672
|
automatic corrections under its original permissions. Repeat verification and a
|
|
@@ -716,7 +765,7 @@ global and project settings; keep this help and CONFIGURATION.md in sync.
|
|
|
716
765
|
|
|
717
766
|
Successful paired creation opens the existing `split` route with `left` and `right` workspace ids in creation order. A single successful creation keeps the normal workspace route, including when the second creation fails.
|
|
718
767
|
|
|
719
|
-
One task,
|
|
768
|
+
One task, Claude Code versus Codex, two sibling worktrees. Mistral Vibe is excluded from comparisons. `POST /api/workspaces` accepts a `comparisonId`; the client posts twice with the same one (sequentially — parallel creations contend on the git index lock), suffixing the name with the engine's display name and the branch with the engine id and giving the non-configured engine the model picked for it on the form and its own effort / permission defaults. `workspaces.comparison_id` (migration v40) groups them; `listComparisonMembers` reads them back, treating an empty id as no group rather than as a match against the NULL majority. `GET /api/workspaces/:id/comparison` returns each member with its cached git stats (`null`, never zeros, when nothing has been measured). `ComparisonPanel.vue` renders the table at the top of the Git tab, only for workspaces that belong to a comparison. See [CONFIGURATION.md → Comparing two engines on one task](CONFIGURATION.md#comparing-two-engines-on-one-task).
|
|
720
769
|
|
|
721
770
|
### Unanswered question reminder
|
|
722
771
|
|
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Kōbō are documented here. The format is based on
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/). Each release is an `## <version>`
|
|
5
|
-
section — the in-app "What's new" dialog reads
|
|
5
|
+
section — the in-app "What's new" dialog reads released version sections.
|
|
6
|
+
|
|
7
|
+
## 2.1.30
|
|
8
|
+
|
|
9
|
+
- fix(workspaces): preserve pr merge transitions and mobile focus
|
|
10
|
+
- feat(agents): integrate mistral vibe through acp
|
|
11
|
+
|
|
12
|
+
## Unreleased
|
|
13
|
+
|
|
14
|
+
- Add Mistral Vibe through the official ACP SDK alongside Claude Code and Codex,
|
|
15
|
+
with native model/thinking discovery, permissions, resume, managed MCP and reviews.
|
|
16
|
+
Vibe is installed separately and does not support Plan mode.
|
|
17
|
+
- Expose automatic-agent concurrency in Settings and group agent defaults by provider.
|
|
18
|
+
- Preserve PR merge hooks and archiving across UI refreshes, show mergeability
|
|
19
|
+
recalculation explicitly, and keep branch deletion usable after worktree cleanup.
|
|
20
|
+
- Avoid automatically opening the phone keyboard when switching workspaces.
|
|
21
|
+
|
|
22
|
+
## 2.1.29
|
|
23
|
+
|
|
24
|
+
- chore: upgrade node and dependencies and fix dev server readiness
|
|
6
25
|
|
|
7
26
|
## 2.1.28
|
|
8
27
|
|
package/CONFIGURATION.md
CHANGED
|
@@ -41,6 +41,7 @@ Reference for Kōbō configuration and external integrations. The tables cover t
|
|
|
41
41
|
- [Agent runtimes](#agent-runtimes)
|
|
42
42
|
- [Claude Code](#claude-code)
|
|
43
43
|
- [OpenAI Codex](#openai-codex)
|
|
44
|
+
- [Mistral Vibe](#mistral-vibe)
|
|
44
45
|
- [Permission modes](#permission-modes)
|
|
45
46
|
- [Dev server](#dev-server)
|
|
46
47
|
- [Forge integration](#forge-integration)
|
|
@@ -137,7 +138,7 @@ settings exports.
|
|
|
137
138
|
| Key | Type | Purpose |
|
|
138
139
|
|---|---|---|
|
|
139
140
|
| `defaultModel` | `string` | Fallback model when no engine-specific default is set. |
|
|
140
|
-
| `defaultModelByEngine` | `Record<engine, string>` | Per-engine default model (`claude-code` / `codex`). Fresh installs use Sonnet 5.5 (`claude-sonnet-5-5`) for Claude Code and `auto` for Codex. Historical migrations and existing user choices are preserved. The actual model is reported by the engine when the session starts; an Auto configuration label is not a model name. |
|
|
141
|
+
| `defaultModelByEngine` | `Record<engine, string>` | Per-engine default model (`claude-code` / `codex` / `mistral-vibe`). Fresh installs use Sonnet 5.5 (`claude-sonnet-5-5`) for Claude Code and `auto` for Codex and Mistral Vibe. Historical migrations and existing user choices are preserved. The actual model is reported by the engine when the session starts; an Auto configuration label is not a model name. |
|
|
141
142
|
| `workflowPolicy` | `{ commit, push, publish }` | Independent `manual` / `automatic` preferences, snapshotted at workspace creation. Fresh defaults are manual. See [Git preferences](#first-run-defaults-and-git-workflow-preferences). |
|
|
142
143
|
| `skillSuite` | `string` | Standard, an external suite/combination, or custom instructions. Fresh default `standard`; see [Skill suites](#skill-suites). |
|
|
143
144
|
| `defaultPermissionModeByEngine` | `Record<engine, mode>` | Default permission mode per engine. See [Permission modes](#permission-modes). |
|
|
@@ -653,11 +654,14 @@ above.
|
|
|
653
654
|
|
|
654
655
|
## Choosing an LLM for code review
|
|
655
656
|
|
|
656
|
-
The workspace's **Start review** dialog offers engine (Claude Code or
|
|
657
|
+
The workspace's **Start review** dialog offers engine (Claude Code, Codex or Mistral Vibe),
|
|
657
658
|
model, reasoning effort and permission mode using the same catalogues as workspace
|
|
658
659
|
creation. The current workspace settings are selected initially. Changing any of
|
|
659
660
|
these settings automatically enables and locks **New session**; with unchanged
|
|
660
|
-
settings
|
|
661
|
+
settings Claude Code/Codex can continue the current session or start a fresh one explicitly.
|
|
662
|
+
Mistral Vibe reviews always use a fresh session and default to native **Interactive**
|
|
663
|
+
permissions. Their prompts forbid modifications, but they cannot guarantee filesystem
|
|
664
|
+
read-only access; Kōbō-managed tools remain restricted. See [Mistral Vibe](#mistral-vibe).
|
|
661
665
|
|
|
662
666
|
Enable **Return to the current session after the review** to resume the original
|
|
663
667
|
conversation with its original LLM settings and the reviewer's final summary.
|
|
@@ -681,8 +685,10 @@ also keeps a recoverable return instead of silently losing it.
|
|
|
681
685
|
Enable **Final review** in the creation form or the workspace's Auto-loop panel.
|
|
682
686
|
Configure the reviewer engine, model, reasoning effort and additional instructions
|
|
683
687
|
in advance. Workspace templates and remembered creation preferences retain these
|
|
684
|
-
settings. Each review uses a separate session
|
|
685
|
-
|
|
688
|
+
settings. Each review uses a separate session: Plan for Claude Code/Codex, native
|
|
689
|
+
Interactive for Vibe. Kōbō grants allow only reads and scoped reports; Vibe does not
|
|
690
|
+
guarantee filesystem read-only access and may pause for human approval. The review
|
|
691
|
+
returns to the exact working session with its original LLM settings and permissions.
|
|
686
692
|
|
|
687
693
|
After all work and final checks pass, Kōbō launches the reviewer. Its structured
|
|
688
694
|
findings become tasks for the original agent to correct automatically. The agent
|
|
@@ -870,7 +876,15 @@ capacity release and lifecycle-guard release reconsider waiting workspaces.
|
|
|
870
876
|
It emits `autoloop:waiting-for-slot` so the
|
|
871
877
|
interface can say so rather than looking stalled.
|
|
872
878
|
|
|
873
|
-
|
|
879
|
+
Change the limit in **Settings → Agents**. Saving applies immediately: increasing
|
|
880
|
+
it, or changing a finite limit to `0`, immediately reconsiders waiting auto-loop
|
|
881
|
+
iterations and review returns through the normal admission checks. Cron, wakeup
|
|
882
|
+
and quota retries retain their existing timers and deadlines; their next admission
|
|
883
|
+
check reads the new limit. Reducing it never interrupts active sessions; new
|
|
884
|
+
automatic sessions wait until capacity becomes available. Progress and retry state
|
|
885
|
+
are preserved.
|
|
886
|
+
|
|
887
|
+
The setting also lives in `settings.json` under `global`:
|
|
874
888
|
|
|
875
889
|
```json
|
|
876
890
|
{ "global": { "maxConcurrentAgents": 3 } }
|
|
@@ -985,7 +999,7 @@ arguments, ordering, retry behavior and update limits.
|
|
|
985
999
|
|
|
986
1000
|
## Persistent memory
|
|
987
1001
|
|
|
988
|
-
Kōbō stores deliberate, concise facts in SQLite, independently of Claude Code's native memory and provider chat history. Claude Code and
|
|
1002
|
+
Kōbō stores deliberate, concise facts in SQLite, independently of Claude Code's native memory and provider chat history. Claude Code, Codex and Mistral Vibe read the same Kōbō scopes, so facts can follow a mission across engines. The incremental v55 migration preserves existing entries/proposals while extending engine provenance. There is no background transcript extractor or extra LLM call: agents must deliberately use the memory tools to save useful knowledge.
|
|
989
1003
|
|
|
990
1004
|
Choose the global behavior in **Settings → Memory**. New and upgraded installations default to **Hybrid**:
|
|
991
1005
|
|
|
@@ -1293,7 +1307,7 @@ and [project/skills operations guide](./docs/vps-projects-and-skills.md).
|
|
|
1293
1307
|
|
|
1294
1308
|
### The image
|
|
1295
1309
|
|
|
1296
|
-
Multi-stage `Dockerfile`, `node:
|
|
1310
|
+
Multi-stage `Dockerfile`, `node:26.12.1-slim` base:
|
|
1297
1311
|
|
|
1298
1312
|
- **Build stage**: installs root, client, and PWA deps, then runs `npm run build` (client via Quasar, server via `tsc`).
|
|
1299
1313
|
- **Runtime stage**: production deps only, plus OS tooling the agents and forge CLIs need — `git`, `openssh-client` + `openssh-server`, `ripgrep`, `fd-find`, `jq`, `curl`, Python + build tools, the Docker CLI, Compose and Buildx plugins (talk to a mounted host socket, see [Volumes](#volumes)), netcat (`nc`), `gh`, `glab`, `tmux`, `vim`/`nano`, and more for interactive shell use.
|
|
@@ -1336,7 +1350,7 @@ retrieved once — see [Token / login flow](#token--login-flow).
|
|
|
1336
1350
|
|
|
1337
1351
|
| Mount | RO/RW | Purpose |
|
|
1338
1352
|
|---|---|---|
|
|
1339
|
-
| `kobo-home:/root` (`vps.yml`, named volume) | RW | Independent Kōbō, Claude/Codex, Git and forge state. Authenticate inside the container; no PC credential files are required. |
|
|
1353
|
+
| `kobo-home:/root` (`vps.yml`, named volume) | RW | Independent Kōbō, Claude/Codex, optional Vibe native state, Git and forge state. Authenticate inside the container; no PC credential files are required. |
|
|
1340
1354
|
| `<name>-data:/root/.config/kobo` (named volume) | RW | Kōbō's own state — SQLite DB, `settings.json`, etc. Named (not bind-mounted) so it survives `docker compose down` without `-v`, and so it can be deliberately **shared** across compose files by reusing the same volume name (see the two local files, both `kobo-test-data`). |
|
|
1341
1355
|
| `${KOBO_PROJECTS_DIR:-./kobo-projects}:/projects` | RW | Your project repositories. Ensure the configured worktree directory is also persistent. For project Docker bind mounts, use the VPS example’s identical host/container paths; see the [path setup](./docs/deployment-vps.md#optional-project-docker-environments). |
|
|
1342
1356
|
| `${HOME}/.ssh:/root/.ssh` | RO | Git SSH auth — needed to push/pull over SSH remotes. |
|
|
@@ -1509,7 +1523,7 @@ An old image alone is not a complete rollback after database migrations.
|
|
|
1509
1523
|
|
|
1510
1524
|
## Agent runtimes
|
|
1511
1525
|
|
|
1512
|
-
Engines are selected per workspace at creation time.
|
|
1526
|
+
Engines are selected per workspace at creation time. All three share chat, task tracking, memory and auto-loop; available permissions and optional controls depend on each engine's capabilities.
|
|
1513
1527
|
|
|
1514
1528
|
### Claude Code
|
|
1515
1529
|
|
|
@@ -1544,7 +1558,7 @@ its dedicated auto-loop API.
|
|
|
1544
1558
|
|
|
1545
1559
|
**Settings → Agents → Enable agent inactivity watchdogs**, at the top of the tab,
|
|
1546
1560
|
controls the global `agentWatchdogEnabled` boolean. It is **off by default**, for
|
|
1547
|
-
both new and existing installations. Each
|
|
1561
|
+
both new and existing installations. Each engine launch or resume captures
|
|
1548
1562
|
the current value; saving the toggle does not interrupt or reconfigure an already
|
|
1549
1563
|
running agent. Stop and resume that agent to apply the new value.
|
|
1550
1564
|
|
|
@@ -1597,6 +1611,92 @@ When a Codex session is already working, **Send now** sends a queued chat messag
|
|
|
1597
1611
|
|
|
1598
1612
|
The selector reads [`src/shared/codex-models.ts`](./src/shared/codex-models.ts). This checkout lists GPT-6 Astra, GPT-5.6 Sol/Terra/Luna, GPT-5.5 and older variants; availability depends on your account and authentication. Kōbō exposes effort values `auto`, `none`, `low`, `medium`, `high`, `xhigh`, and `max`, as declared in the engine's capabilities. The runtime must support the selected model/effort combination. Both selectors switch when you change the engine.
|
|
1599
1613
|
|
|
1614
|
+
### Mistral Vibe
|
|
1615
|
+
|
|
1616
|
+
> Experimental. Target version: **Vibe 3.0.1**, ACP v1 with SDK 2.0.1.
|
|
1617
|
+
|
|
1618
|
+
Follow the official [native Vibe setup](https://docs.mistral.ai/vibe/code/cli/install-setup)
|
|
1619
|
+
and [Vibe 3.0.1 ACP instructions](https://github.com/mistralai/mistral-vibe/blob/v3.0.1/docs/acp-setup.md).
|
|
1620
|
+
Install Vibe separately; run `vibe` for its native authentication wizard (`vibe --setup`
|
|
1621
|
+
to repeat it). Run these as the **same OS user and in the same environment as the
|
|
1622
|
+
Kōbō server**. `vibe-acp` must be on that user's PATH. Kōbō inherits native provider
|
|
1623
|
+
configuration/authentication and does not store a Mistral key. Explicit native
|
|
1624
|
+
model/thinking selections can persist Vibe preferences as described below. In Docker, host installation/login is insufficient: install and
|
|
1625
|
+
configure Vibe inside the container and persist its native state; see
|
|
1626
|
+
[VPS setup](./docs/vps-projects-and-skills.md#use-mistral-vibe-inside-the-container).
|
|
1627
|
+
|
|
1628
|
+
The health diagnostic checks `vibe-acp --version` without contacting a provider.
|
|
1629
|
+
A detected executable/version is **not an authentication check**. If a launch
|
|
1630
|
+
reports authentication required, complete native setup in the server environment;
|
|
1631
|
+
check PATH/permissions for executable errors. Kōbō does not launch browser login,
|
|
1632
|
+
install or update Vibe for you.
|
|
1633
|
+
|
|
1634
|
+
Model and thinking **Auto** retain native selection and send no override. Native
|
|
1635
|
+
model aliases, display names and model-specific thinking levels are discovered
|
|
1636
|
+
from Vibe for the selected project/workspace and permission mode. Settings without
|
|
1637
|
+
a project use the server user's home. Discovery creates and closes a native session
|
|
1638
|
+
without sending a prompt, contacting a provider or changing configuration. It uses
|
|
1639
|
+
short-lived child environment overrides, never model/thinking setters. Discovery
|
|
1640
|
+
results are cached for 30 seconds; failed discovery leaves Auto available and keeps
|
|
1641
|
+
explicit saved choices visible. Use Retry to request the options again.
|
|
1642
|
+
|
|
1643
|
+
**Explicit model or thinking selections may persist in native Vibe preferences**
|
|
1644
|
+
through Vibe's public ACP setters, including preferences used outside Kōbō. At each
|
|
1645
|
+
actual launch, Kōbō confirms native mode, model and thinking in that order before
|
|
1646
|
+
sending the prompt. Native profiles/admin policy remain authoritative; unavailable
|
|
1647
|
+
or overridden selections fail explicitly instead of falling back to Auto. Project
|
|
1648
|
+
preflight cannot guarantee a future worktree or resumed session has identical
|
|
1649
|
+
options, so launch validation remains mandatory. Thinking values are native values
|
|
1650
|
+
(e.g. `off`, `low`, `medium`, `high`, `max` when advertised); `none` and `xhigh` are
|
|
1651
|
+
not translated. Brainstorming has independent model/thinking choices. On return
|
|
1652
|
+
from a review, native saved-session thinking is retained separately from the
|
|
1653
|
+
workspace iteration settings. An Auto-model resume validates explicit thinking
|
|
1654
|
+
against the loaded session, not a new session using potentially different defaults.
|
|
1655
|
+
|
|
1656
|
+
New Vibe workspaces visibly default to **Interactive**. Only these native execution
|
|
1657
|
+
modes are offered:
|
|
1658
|
+
|
|
1659
|
+
| Kōbō mode | Native Vibe mode |
|
|
1660
|
+
|---|---|
|
|
1661
|
+
| `interactive` | `ask` |
|
|
1662
|
+
| `strict` | `accept-edits` |
|
|
1663
|
+
| `bypass` | `auto-approve` |
|
|
1664
|
+
|
|
1665
|
+
These are native approval modes, not a Kōbō sandbox. Native profiles and admin
|
|
1666
|
+
policy may change effective permissions. Plan/read-only launches are rejected before spawning or changing the workspace. Existing Plan
|
|
1667
|
+
choices require an explicit supported mode; they are never promoted automatically.
|
|
1668
|
+
The comparison feature remains **Claude Code versus Codex**.
|
|
1669
|
+
|
|
1670
|
+
Native tools, approval/question panels, managed tasks/memory/progress MCP, resume
|
|
1671
|
+
and whole-session Stop are supported. Messages wait in the normal queue until
|
|
1672
|
+
the native process closes, then resume the conversation. Live steering and
|
|
1673
|
+
**Send now** are unavailable while Vibe is busy, including forced immediate
|
|
1674
|
+
messages and external MCP sends; rejected sends are not silently queued.
|
|
1675
|
+
Account/quota controls, managed skills and sub-agent cards/individual stop are
|
|
1676
|
+
excluded. Native tools/skills remain Vibe's own configuration.
|
|
1677
|
+
|
|
1678
|
+
A manual handoff can target Vibe with a supported execution mode. For a Vibe
|
|
1679
|
+
source, disable **Generate a handoff with the current agent** and use the existing
|
|
1680
|
+
mission/history handoff: Vibe cannot run the restricted read-only summary launch.
|
|
1681
|
+
Vibe is available for manual and automatic final reviews. Manual reviews always
|
|
1682
|
+
start a fresh session, defaulting to Interactive independently of source permissions;
|
|
1683
|
+
Accept edits and Bypass remain explicit manual choices. Automatic final reviews
|
|
1684
|
+
always use Interactive and may pause for human approval. Review instructions forbid
|
|
1685
|
+
all modifications, but native permissions provide no guaranteed filesystem read-only
|
|
1686
|
+
enforcement. Kōbō memory and managed MCP remain read/report-only, including under
|
|
1687
|
+
Automatic memory mode; final-verdict and progress grants stay scoped. Explicit
|
|
1688
|
+
review model/thinking choices use the same native catalogue and persistence rules.
|
|
1689
|
+
Other supported engines can also review Vibe's work. Stop/transfer waits for actual
|
|
1690
|
+
native exit; an ACP close acknowledgement alone does not release the worktree.
|
|
1691
|
+
|
|
1692
|
+
On **2026-10-23, Linux x64, Node 26.12.1**, the installed 3.0.1 passed the real
|
|
1693
|
+
Kōbō adapter smoke using an isolated loopback provider and synthetic stdio MCP:
|
|
1694
|
+
permissions, question, all three modes with MCP, native resume without duplicated
|
|
1695
|
+
history, renewed MCP environment and managed-job cleanup after confirmed exit.
|
|
1696
|
+
This made no paid call. **Real-provider end-to-end compatibility remains unverified**;
|
|
1697
|
+
its separately opt-in scenario has not been run. Commands and exact limits are in
|
|
1698
|
+
[the compatibility record](./src/__tests__/fixtures/mistral-acp/README.md).
|
|
1699
|
+
|
|
1600
1700
|
### Switch Claude Code and Codex accounts with ccswap
|
|
1601
1701
|
|
|
1602
1702
|
The usage popover in the chat footer can show the current **managed account**
|
|
@@ -1658,7 +1758,7 @@ credential-directory environment. See [VPS account setup](./docs/vps-projects-an
|
|
|
1658
1758
|
|
|
1659
1759
|
### Permission modes
|
|
1660
1760
|
|
|
1661
|
-
Claude Code uses SDK permission modes; Codex uses sandbox and approval flags. These controls differ by engine. A Git worktree itself is not a security boundary.
|
|
1761
|
+
Claude Code uses SDK permission modes; Codex uses sandbox and approval flags; [Mistral Vibe](#mistral-vibe) uses native execution modes and excludes Plan. These controls differ by engine. A Git worktree itself is not a security boundary.
|
|
1662
1762
|
|
|
1663
1763
|
**Claude Code** (controlled via SDK options):
|
|
1664
1764
|
|
|
@@ -1702,15 +1802,17 @@ Kōbō treats the dev server in two independent layers:
|
|
|
1702
1802
|
| Layer | Driven by | Works for any project? |
|
|
1703
1803
|
|---|---|---|
|
|
1704
1804
|
| **Start / Stop** | The shell commands you configure | ✅ Yes, any shell-startable process |
|
|
1705
|
-
| **Status badge, URL
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1805
|
+
| **Status badge, URL** | A tracked process's local readiness announcement, or the Docker convention below | Quasar (`App URL...`) and Vite/Next (`Local:`), or matching Docker containers |
|
|
1806
|
+
| **Container count, logs viewer** | The `.container/instances/*.env` convention + Docker | ❌ No, requires the convention below |
|
|
1807
|
+
|
|
1808
|
+
Configured processes can be started and stopped. A tracked direct process reports
|
|
1809
|
+
`starting` until it announces a local HTTP(S) URL in a recognized readiness line
|
|
1810
|
+
on stdout or stderr, then reports `running` with that URL and port. Colored output
|
|
1811
|
+
and lines split across chunks are supported. This observes the CLI announcement;
|
|
1812
|
+
it does not probe application health. Docker container status and logs require a
|
|
1813
|
+
matching instance file and running containers. Without a tracked process or an
|
|
1814
|
+
instance, runtime detection returns `unknown`; the HTTP route may show the saved
|
|
1815
|
+
status instead. Without a start command, the route returns `not_configured`.
|
|
1714
1816
|
|
|
1715
1817
|
### 1. Configure start / stop commands
|
|
1716
1818
|
|
|
@@ -1729,9 +1831,9 @@ How Kōbō runs them:
|
|
|
1729
1831
|
- `DEV_DOCKER_NO_FOLLOW=1`: a hint that a Docker setup script should exit after starting its containers instead of following logs. A tracked start process reports `starting` when an instance file exists but no matching container is running yet; once containers appear, Docker status takes precedence.
|
|
1730
1832
|
- `stopCommand` runs with `INSTANCE` and `PROJECT_NAME` in the environment. After it, Kōbō also unconditionally runs `docker compose -p <PROJECT_NAME> down` if a `PROJECT_NAME` was resolved, so a Docker project does not strictly need a `stopCommand` at all.
|
|
1731
1833
|
|
|
1732
|
-
### 2.
|
|
1834
|
+
### 2. Docker status — the `.container/instances` contract
|
|
1733
1835
|
|
|
1734
|
-
For
|
|
1836
|
+
For Docker detection, the URL, the container count, and the logs button to appear, your **start command must create an instance file**:
|
|
1735
1837
|
|
|
1736
1838
|
```
|
|
1737
1839
|
<project-root>/.container/instances/<any-name>.env
|
|
@@ -1753,13 +1855,12 @@ The simplest correct start script therefore: read `$INSTANCE`, start your contai
|
|
|
1753
1855
|
|
|
1754
1856
|
### 3. Running detection and logs
|
|
1755
1857
|
|
|
1756
|
-
- **Status**: `running` if at least one container has the exact Compose project label; `starting`
|
|
1858
|
+
- **Status**: a tracked process with a recognized local readiness URL reports `running`. Otherwise, `running` if at least one container has the exact Compose project label; `starting` while the start process remains tracked; `stopped` when an instance exists but no container or process remains; `unknown` if neither a tracked process nor an instance matched.
|
|
1757
1859
|
- **Logs**: the logs button runs `docker logs` on those same matched containers.
|
|
1758
1860
|
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
containers are running. Direct processes can still be started and stopped.
|
|
1861
|
+
The logs viewer and container count remain **Docker-only**. Writing an instance
|
|
1862
|
+
file alone is not enough to expose a URL: matching containers must be running,
|
|
1863
|
+
or a tracked direct process must have announced its local URL.
|
|
1763
1864
|
|
|
1764
1865
|
### Minimal setups
|
|
1765
1866
|
|
|
@@ -1767,11 +1868,15 @@ containers are running. Direct processes can still be started and stopped.
|
|
|
1767
1868
|
|
|
1768
1869
|
**Non-Docker project (e.g. Vite/Node)**: configure a foreground command such as
|
|
1769
1870
|
`npm run dev`. Kōbō tracks its process group for shutdown, including children that
|
|
1770
|
-
outlive the shell.
|
|
1771
|
-
|
|
1871
|
+
outlive the shell. Quasar's `App URL... http://localhost:9000/` and Vite/Next's
|
|
1872
|
+
`Local: http://localhost:5173/` announcements populate the status and URL without
|
|
1873
|
+
an instance file. Other output formats remain `starting`; there is no general
|
|
1874
|
+
process health monitoring or direct-process log viewer. Readiness URLs are kept
|
|
1875
|
+
only for the current launch and cleared when it stops.
|
|
1772
1876
|
|
|
1773
|
-
**No instance file at all**: Start/Stop run your commands;
|
|
1774
|
-
|
|
1877
|
+
**No instance file at all**: Start/Stop run your commands; a tracked process uses
|
|
1878
|
+
the direct-process detection above. Otherwise the panel uses the saved status
|
|
1879
|
+
when available, or `unknown`, with no URL or Docker logs.
|
|
1775
1880
|
|
|
1776
1881
|
### Kōbō shutdown
|
|
1777
1882
|
|
|
@@ -2256,7 +2361,7 @@ Lets you bypass the bundled prompts entirely and write your own. The five `custo
|
|
|
2256
2361
|
|
|
2257
2362
|
## gbrain (companion MCP)
|
|
2258
2363
|
|
|
2259
|
-
[`gbrain`](https://github.com/garrytan/gbrain) is a separate companion tool: a per-project knowledge graph and semantic search index, with an MCP server interface. It's **not** a Kōbō skill suite (it doesn't change the auto-generated prompts) but it plugs into Kōbō workspaces transparently via the standard Claude Code MCP config: Claude Code sessions can inherit MCP servers registered in `~/.claude.json`. Codex uses its own native MCP configuration; Kōbō does not copy arbitrary Claude MCP entries into Codex. The managed Notion/Sentry connections described above are supplied explicitly to
|
|
2364
|
+
[`gbrain`](https://github.com/garrytan/gbrain) is a separate companion tool: a per-project knowledge graph and semantic search index, with an MCP server interface. It's **not** a Kōbō skill suite (it doesn't change the auto-generated prompts) but it plugs into Kōbō workspaces transparently via the standard Claude Code MCP config: Claude Code sessions can inherit MCP servers registered in `~/.claude.json`. Codex uses its own native MCP configuration; Kōbō does not copy arbitrary Claude MCP entries into Codex. The managed Notion/Sentry connections described above are supplied explicitly to all three engines.
|
|
2260
2365
|
|
|
2261
2366
|
When gbrain is configured, the agent gets access to tools like:
|
|
2262
2367
|
|
|
@@ -2481,7 +2586,7 @@ as failures, with safe diagnostics; authentication/permission errors never justi
|
|
|
2481
2586
|
modifying credentials or Kōbō storage to bypass the tools. Ambiguous mutation
|
|
2482
2587
|
outcomes require checking available status/receipts before retrying.
|
|
2483
2588
|
|
|
2484
|
-
Plan launches remain conversation-only. Writable auto-loop launches prepare the plan and task list before returning control to the loop; writable manual launches implement after plan approval, under the configured Git policy. Custom brainstorming, Notion and Sentry templates are preserved; they cannot expand launch permissions or authorize commits automatically.
|
|
2589
|
+
Plan launches remain conversation-only. Writable auto-loop launches prepare the plan and task list before returning control to the loop; writable manual launches implement after plan approval, under the configured Git policy. Custom brainstorming, Notion and Sentry templates are preserved; they cannot expand launch permissions or authorize commits automatically. Returning Claude Code/Codex reviewers and handoff reports remain in read-only Plan mode. Vibe reviewers use native permissions (Interactive by default, fixed Interactive for automatic final reviews), which may require human approval and do not guarantee filesystem read-only access. These restricted review/report launches restrict Kōbō grants to reads, scoped reports and operational progress; review instructions forbid modifications. Plan approval does not change permissions; explicitly select an execution mode in Kōbō and start a new launch to implement.
|
|
2485
2590
|
|
|
2486
2591
|
The expandable **Kōbō instructions** chat entry records the application-owned text prepared by the engine builder for the initial launch or a pending initial-prompt retry, including progress guidance, continuation rules, workflow policy and managed integration notices. The pending initial mission is retained until this entry is durably recorded, so a failure during asynchronous launch preparation remains retryable. A later replacement mission is never cleared by an earlier launch. Preparation is not proof of provider delivery. The provider's own system preset is not included. Retrieved memory bodies and capability tokens are not copied to chat; memory usage remains visible separately in the Memory panel. Existing historical prompt entries retain their original content. Ordinary resumes receive current instructions without creating another initial-prompt entry.
|
|
2487
2592
|
|
|
@@ -2509,7 +2614,7 @@ the complete backend environment is not serialized into the agent configuration.
|
|
|
2509
2614
|
Saving settings does not replace connections in an already-running engine. Stop
|
|
2510
2615
|
that engine and resume, or start a fresh session, to apply changes. Disabling an
|
|
2511
2616
|
integration removes its Kōbō-managed connection from subsequent launches; it does
|
|
2512
|
-
not remove independent MCP servers configured in Claude or
|
|
2617
|
+
not remove independent MCP servers configured in Claude Code, Codex or Mistral Vibe. Integration
|
|
2513
2618
|
credentials do not authorize the agent to modify remote data.
|
|
2514
2619
|
|
|
2515
2620
|
|
package/CONTRIBUTING.md
CHANGED
|
@@ -4,7 +4,7 @@ Thanks for considering a contribution. This guide covers the from-source setup,
|
|
|
4
4
|
|
|
5
5
|
## Prerequisites
|
|
6
6
|
|
|
7
|
-
Node.js ≥
|
|
7
|
+
Node.js ≥ 26.12.1. The repository's `.nvmrc` pins the tested version; run
|
|
8
8
|
`nvm use` when using nvm.
|
|
9
9
|
|
|
10
10
|
## Setup
|
|
@@ -52,7 +52,7 @@ Run a single test file with `npx vitest run src/__tests__/<file>.test.ts`, filte
|
|
|
52
52
|
|
|
53
53
|
TDD for backend changes: write the failing test, confirm it fails for the right reason, implement minimally, then confirm it passes. Frontend tests cover stores, utilities, composables, and selected Vue components using Vue Test Utils and `happy-dom`. Type-checking and browser smoke tests complement this coverage. See [`AGENTS.md`](./AGENTS.md#testing-discipline) for route mocking and cleanup conventions.
|
|
54
54
|
|
|
55
|
-
Backend tests pin `KOBO_HOME` to a temporary directory; never point tests at your production data. Live MCP tests are a separate, explicit command (`npm run test:mcp:live`) requiring `KOBO_LIVE_ENGINE`, `KOBO_LIVE_MODEL`, and real provider credentials. They stay outside normal CI; see the [MCP guide](./src/mcp-server/README.md#live-engine-validation).
|
|
55
|
+
Backend tests pin `KOBO_HOME` to a temporary directory; never point tests at your production data. Live MCP tests are a separate, explicit command (`npm run test:mcp:live`) requiring `KOBO_LIVE_ENGINE`, `KOBO_LIVE_MODEL`, and real provider credentials. They stay outside normal CI; see the [MCP guide](./src/mcp-server/README.md#live-engine-validation). Mistral Vibe also has native ACP fixtures and an offline adapter smoke; see its [compatibility record](./src/__tests__/fixtures/mistral-acp/README.md) for the exact commands, prerequisites and the separate opt-in provider test.
|
|
56
56
|
|
|
57
57
|
Schema changes must append a migration and update the fresh-install schema, with upgrade tests proving data preservation. See [Database migrations](./AGENTS.md#database-migrations). UI changes must follow [`DESIGN.md`](./DESIGN.md) and update all five translation files for user-visible text.
|
|
58
58
|
|
package/DESIGN.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Product Context
|
|
4
4
|
|
|
5
|
-
- **What this is:** Kōbō — a Claude Code and
|
|
5
|
+
- **What this is:** Kōbō — a Claude Code, Codex and Mistral Vibe multi-agent orchestrator. Each "workspace" is a
|
|
6
6
|
self-contained mission with its own git worktree, branch, agent session, optional dev
|
|
7
7
|
server, optional Notion source-of-truth, and a dedicated MCP tools server.
|
|
8
8
|
- **Who it's for:** Developers using their own local instance, from a first mission to advanced parallel workflows,
|