@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.
Files changed (207) hide show
  1. package/AGENTS.md +60 -11
  2. package/CHANGELOG.md +20 -1
  3. package/CONFIGURATION.md +140 -35
  4. package/CONTRIBUTING.md +2 -2
  5. package/DESIGN.md +1 -1
  6. package/README.md +12 -9
  7. package/SECURITY.md +7 -2
  8. package/dist/server/db/memory-schema.js +5 -5
  9. package/dist/server/db/migrations.js +2 -0
  10. package/dist/server/db/mistral-memory-migration.js +40 -0
  11. package/dist/server/routes/engines.js +14 -0
  12. package/dist/server/routes/environment.js +1 -1
  13. package/dist/server/routes/health.js +14 -3
  14. package/dist/server/routes/settings.js +7 -1
  15. package/dist/server/routes/workspaces.js +116 -9
  16. package/dist/server/services/agent/engines/claude-code/capabilities.js +2 -0
  17. package/dist/server/services/agent/engines/claude-code/engine.js +3 -0
  18. package/dist/server/services/agent/engines/claude-code/resolve-binary.js +1 -1
  19. package/dist/server/services/agent/engines/codex/capabilities.js +2 -0
  20. package/dist/server/services/agent/engines/codex/engine.js +3 -0
  21. package/dist/server/services/agent/engines/configuration.js +14 -0
  22. package/dist/server/services/agent/engines/mistral-vibe/capabilities.js +13 -0
  23. package/dist/server/services/agent/engines/mistral-vibe/client.js +64 -0
  24. package/dist/server/services/agent/engines/mistral-vibe/configuration.js +76 -0
  25. package/dist/server/services/agent/engines/mistral-vibe/engine.js +361 -0
  26. package/dist/server/services/agent/engines/mistral-vibe/event-mapper.js +297 -0
  27. package/dist/server/services/agent/engines/mistral-vibe/options-builder.js +35 -0
  28. package/dist/server/services/agent/engines/mistral-vibe/server-requests.js +278 -0
  29. package/dist/server/services/agent/engines/mistral-vibe/spawn.js +176 -0
  30. package/dist/server/services/agent/engines/registry.js +2 -0
  31. package/dist/server/services/agent/engines/types.js +6 -0
  32. package/dist/server/services/agent/orchestrator.js +88 -25
  33. package/dist/server/services/agent/session-controller.js +5 -0
  34. package/dist/server/services/auto-loop-final-review-service.js +10 -3
  35. package/dist/server/services/dev-server-service.js +68 -4
  36. package/dist/server/services/environment-check-service.js +9 -3
  37. package/dist/server/services/memory-service.js +1 -1
  38. package/dist/server/services/mistral-options-service.js +145 -0
  39. package/dist/server/services/pr-watcher-service.js +40 -11
  40. package/dist/server/services/review-service.js +33 -9
  41. package/dist/server/services/session-handoff-service.js +28 -2
  42. package/dist/server/services/settings-defaults.js +1 -0
  43. package/dist/server/services/settings-service.js +19 -1
  44. package/dist/server/services/workspace-creation-mcp-service.js +50 -8
  45. package/dist/server/services/workspace-dialogue-service.js +2 -0
  46. package/dist/server/services/workspace-message-service.js +19 -1
  47. package/dist/server/services/workspace-permission-policy-service.js +24 -0
  48. package/dist/server/utils/bounded-process.js +1 -1
  49. package/dist/shared/launch-instructions.js +18 -7
  50. package/dist/shared/memory.js +1 -1
  51. package/dist/shared/mistral-models.js +9 -0
  52. package/dist/shared/mistral-options.js +1 -0
  53. package/dist/shared/question-selections.js +16 -0
  54. package/dist/shared/workspace-creation-tools.js +8 -2
  55. package/dist/shared/workspace-dialogue-tools.js +15 -4
  56. package/docs/deployment-vps.md +10 -3
  57. package/docs/getting-started.md +4 -3
  58. package/docs/troubleshooting.md +2 -2
  59. package/package.json +20 -14
  60. package/src/client/dist/pwa/assets/ActivityFeed-C5stmHXP.js +2 -0
  61. package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-CIDSX32d.css +1 -0
  62. package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-DG32W_0G.js +1 -0
  63. package/src/client/dist/pwa/assets/{ChangelogPage-CAAUEn5X.js → ChangelogPage-_vItY8vA.js} +1 -1
  64. package/src/client/dist/pwa/assets/{ClosePopup-CRV2hxHS.js → ClosePopup-rU8Bm-mC.js} +1 -1
  65. package/src/client/dist/pwa/assets/{ComparisonPanel-BCb7vB5E.js → ComparisonPanel-B3BMzQH0.js} +2 -2
  66. package/src/client/dist/pwa/assets/CreatePage-FlGrfmjX.js +2 -0
  67. package/src/client/dist/pwa/assets/CreatePage-oh8ihVC4.css +1 -0
  68. package/src/client/dist/pwa/assets/{DashboardPage-XE52EABP.js → DashboardPage-lJGwWQYQ.js} +1 -1
  69. package/src/client/dist/pwa/assets/DiffViewer-DIaQH3lA.js +8 -0
  70. package/src/client/dist/pwa/assets/{DocumentsPanel-L4pbQfz1.js → DocumentsPanel-Ct-nm4fX.js} +1 -1
  71. package/src/client/dist/pwa/assets/{DrawerToggleButton-DiOJm5he.js → DrawerToggleButton-M5qv4Io-.js} +1 -1
  72. package/src/client/dist/pwa/assets/GitPanel-BaHCgb3p.js +3 -0
  73. package/src/client/dist/pwa/assets/GitPanel-C8vw2qvW.css +1 -0
  74. package/src/client/dist/pwa/assets/HealthPage-DR3wa6iD.js +1 -0
  75. package/src/client/dist/pwa/assets/HealthPage-Dbn4J_DT.css +1 -0
  76. package/src/client/dist/pwa/assets/{MainLayout-DoAEgANU.css → MainLayout-CHi8qP1D.css} +1 -1
  77. package/src/client/dist/pwa/assets/MainLayout-WJabICsA.js +2 -0
  78. package/src/client/dist/pwa/assets/{MemoryPanel-DtEvh_b7.js → MemoryPanel-CRpWdfc0.js} +1 -1
  79. package/src/client/dist/pwa/assets/MemoryProposalList-DGz3lDbL.js +1 -0
  80. package/src/client/dist/pwa/assets/{QBadge-CW3Lw-kL.js → QBadge-DiwbRpte.js} +1 -1
  81. package/src/client/dist/pwa/assets/{QBanner-BT2ZemYu.js → QBanner-Cw89HSjk.js} +1 -1
  82. package/src/client/dist/pwa/assets/QBtn-kfhHFy7Q.js +1 -0
  83. package/src/client/dist/pwa/assets/{QBtnDropdown-CWPIugs8.js → QBtnDropdown-tt8rUNNR.js} +1 -1
  84. package/src/client/dist/pwa/assets/{QBtnGroup-CnM4vSJA.js → QBtnGroup-Bioxjp9q.js} +1 -1
  85. package/src/client/dist/pwa/assets/{QBtnToggle-DccOOtbh.js → QBtnToggle-Bod-x9im.js} +1 -1
  86. package/src/client/dist/pwa/assets/{QChip-Be16M4Ig.js → QChip-DvhtPv_L.js} +1 -1
  87. package/src/client/dist/pwa/assets/{QExpansionItem-D-EGL2b3.js → QExpansionItem-BkrI3UPL.js} +1 -1
  88. package/src/client/dist/pwa/assets/{QItemSection-MdJ1_ZK7.js → QItemSection-ahqRK4JF.js} +1 -1
  89. package/src/client/dist/pwa/assets/{QList-Cx1UfaUm.js → QList-CAUl0v66.js} +1 -1
  90. package/src/client/dist/pwa/assets/{QMarkupTable-UhP7fVUp.js → QMarkupTable-B4LLAly-.js} +1 -1
  91. package/src/client/dist/pwa/assets/{QPage-CqkGHokx.js → QPage-DIy_mRoT.js} +1 -1
  92. package/src/client/dist/pwa/assets/{QScrollArea-BMrqK-xd.js → QScrollArea-BvgnY-oA.js} +1 -1
  93. package/src/client/dist/pwa/assets/QSelect-BtZB1wrB.js +1 -0
  94. package/src/client/dist/pwa/assets/{QSpinnerDots-xdWyaE1i.js → QSpinnerDots-Bea6hAuJ.js} +1 -1
  95. package/src/client/dist/pwa/assets/{QTooltip-Bk8dLUtU.js → QTooltip-CDH6p745.js} +1 -1
  96. package/src/client/dist/pwa/assets/{SchedulePanel-CuxmxCKi.js → SchedulePanel-C2rWlh7l.js} +1 -1
  97. package/src/client/dist/pwa/assets/{SearchPage-DKnQPUqY.js → SearchPage-BFd4NQwJ.js} +1 -1
  98. package/src/client/dist/pwa/assets/{SettingsPage-B4rmd2WX.css → SettingsPage-Bm0TcarK.css} +1 -1
  99. package/src/client/dist/pwa/assets/SettingsPage-DDQCgnjL.js +9 -0
  100. package/src/client/dist/pwa/assets/{SplitWorkspacePage-WhQyX8fn.js → SplitWorkspacePage-DKCtOZO4.js} +1 -1
  101. package/src/client/dist/pwa/assets/TerminalPanel-BE_MSZF0.js +16 -0
  102. package/src/client/dist/pwa/assets/{ToolCallItem-DYubi-J0.js → ToolCallItem-BEYaOtgh.js} +4 -4
  103. package/src/client/dist/pwa/assets/{TouchPan-DDotyYLN.js → TouchPan-DeYoOjX5.js} +1 -1
  104. package/src/client/dist/pwa/assets/{TourReplayButton-kAnEMcy2.js → TourReplayButton-D5lMwIKt.js} +1 -1
  105. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-BHEAsIoo.js +1 -0
  106. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-v7ein__H.css +1 -0
  107. package/src/client/dist/pwa/assets/WorkspacePage-5_wsJPaJ.js +4 -0
  108. package/src/client/dist/pwa/assets/WorkspacePage-CtUXz0Cq.css +1 -0
  109. package/src/client/dist/pwa/assets/{browser-DVYLH8vl.js → browser-ogy_9LVv.js} +2 -2
  110. package/src/client/dist/pwa/assets/build-path-tree-CRXxaYkA.js +1 -0
  111. package/src/client/dist/pwa/assets/custom-sounds-iLTkCd_i.js +1 -0
  112. package/src/client/dist/pwa/assets/de-BqDU7iZH.js +17 -0
  113. package/src/client/dist/pwa/assets/detached-fullscreen-CHqMxB-8.js +1 -0
  114. package/src/client/dist/pwa/assets/dom-CRPVbmiy.js +2 -0
  115. package/src/client/dist/pwa/assets/ecl-94qehhXe.js +1 -0
  116. package/src/client/dist/pwa/assets/{editor.api-BC38eXAS.js → editor.api-Dx6TbfZG.js} +9 -9
  117. package/src/client/dist/pwa/assets/editor.worker-xrHNhPSq.js +33 -0
  118. package/src/client/dist/pwa/assets/efforts-DnJh2fW_.js +9 -0
  119. package/src/client/dist/pwa/assets/es-D4VMXQRk.js +17 -0
  120. package/src/client/dist/pwa/assets/expand-template-PUEVWny3.js +1 -0
  121. package/src/client/dist/pwa/assets/{format-OwxXBnDJ.js → format-yf9XM3dV.js} +48 -48
  122. package/src/client/dist/pwa/assets/{formatters-YgaCZcwJ.js → formatters-D0sXu9Oe.js} +1 -1
  123. package/src/client/dist/pwa/assets/fr-DIyaCFB3.js +17 -0
  124. package/src/client/dist/pwa/assets/{freemarker2-l7R42fI2.js → freemarker2-l_xIHxRf.js} +1 -1
  125. package/src/client/dist/pwa/assets/{handlebars-DFmPrgjH.js → handlebars-CYgq99yQ.js} +1 -1
  126. package/src/client/dist/pwa/assets/{html-CERIAlPM.js → html-C28GatN_.js} +1 -1
  127. package/src/client/dist/pwa/assets/i18n-2AmHIUy0.js +1 -0
  128. package/src/client/dist/pwa/assets/index-C0MApoXN.css +1 -0
  129. package/src/client/dist/pwa/assets/index-MMYMztJ_.js +20 -0
  130. package/src/client/dist/pwa/assets/it-CF6_4OS0.js +17 -0
  131. package/src/client/dist/pwa/assets/{javascript-BBYncplF.js → javascript-YCSueyyk.js} +1 -1
  132. package/src/client/dist/pwa/assets/{liquid-C1HqYyYU.js → liquid-CUBn90Gs.js} +1 -1
  133. package/src/client/dist/pwa/assets/{mdx-E74dsP22.js → mdx-C5WOHShJ.js} +1 -1
  134. package/src/client/dist/pwa/assets/monaco-contributions-DYwqbh7m.js +53 -0
  135. package/src/client/dist/pwa/assets/{monaco.contribution-DYdn9CwR.js → monaco.contribution-CoFzrPQl.js} +2 -2
  136. package/src/client/dist/pwa/assets/network-auth-BpJ6Noax.js +1 -0
  137. package/src/client/dist/pwa/assets/notify-theme-NPq4-Tup.js +1 -0
  138. package/src/client/dist/pwa/assets/permissionModes-Bbl901Hx.js +36 -0
  139. package/src/client/dist/pwa/assets/{private.use-form-DY1BkePL.js → private.use-form-BcspuzM9.js} +1 -1
  140. package/src/client/dist/pwa/assets/{project-color-_snXWYUp.js → project-color-gNyhKJlV.js} +1 -1
  141. package/src/client/dist/pwa/assets/{python-DNAAGBcX.js → python-lhKUZdPj.js} +1 -1
  142. package/src/client/dist/pwa/assets/{razor-CB3g5p_T.js → razor-Chi44rEL.js} +1 -1
  143. package/src/client/dist/pwa/assets/reactivity.esm-bundler-Dplx1ILy.js +1 -0
  144. package/src/client/dist/pwa/assets/render-chat-markdown-C9ihAYBt.js +67 -0
  145. package/src/client/dist/pwa/assets/runtime-core.esm-bundler-BAUgNzMK.js +1 -0
  146. package/src/client/dist/pwa/assets/{typescript-0kpz8bqP.js → typescript-CU2TXVm6.js} +1 -1
  147. package/src/client/dist/pwa/assets/{use-checkbox-v4aAbE6K.js → use-checkbox-DUxgXR4e.js} +1 -1
  148. package/src/client/dist/pwa/assets/{use-id-BrdYXce0.js → use-id-B7ieAx2m.js} +1 -1
  149. package/src/client/dist/pwa/assets/use-is-mobile-CHmaewI1.js +1 -0
  150. package/src/client/dist/pwa/assets/{use-search-index-status-D38yFOD_.js → use-search-index-status-CQ9S05G7.js} +1 -1
  151. package/src/client/dist/pwa/assets/use-slide-transition-BJh9xGMa.js +1 -0
  152. package/src/client/dist/pwa/assets/use-tours-BmrZbHjz.js +2 -0
  153. package/src/client/dist/pwa/assets/use-tours-CU5oA7cz.css +1 -0
  154. package/src/client/dist/pwa/assets/use-worktree-restore-DcucRlLh.js +1 -0
  155. package/src/client/dist/pwa/assets/{workspace-templates-D-lPJQ4G.js → workspace-templates-DaG42EEt.js} +1 -1
  156. package/src/client/dist/pwa/assets/{xml-BbOuqdUe.js → xml-CPO5LI6F.js} +1 -1
  157. package/src/client/dist/pwa/assets/{yaml-gasFQtfk.js → yaml-CoYs82jI.js} +1 -1
  158. package/src/client/dist/pwa/index.html +10 -10
  159. package/src/client/dist/pwa/sw.js +1 -1
  160. package/src/mcp-server/README.md +18 -6
  161. package/src/client/dist/pwa/assets/ActivityFeed-D58VS9o2.js +0 -2
  162. package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-CK3r_fVB.js +0 -1
  163. package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-Q-OlSQ1c.css +0 -1
  164. package/src/client/dist/pwa/assets/CreatePage-DasH1Uk4.js +0 -2
  165. package/src/client/dist/pwa/assets/CreatePage-DxOes_cF.css +0 -1
  166. package/src/client/dist/pwa/assets/DiffViewer-CncKlXne.js +0 -8
  167. package/src/client/dist/pwa/assets/GitPanel-WJlzy2VJ.js +0 -3
  168. package/src/client/dist/pwa/assets/GitPanel-yHvU38dp.css +0 -1
  169. package/src/client/dist/pwa/assets/HealthPage-Cnlhrn--.css +0 -1
  170. package/src/client/dist/pwa/assets/HealthPage-hJY5MurK.js +0 -1
  171. package/src/client/dist/pwa/assets/MainLayout-DgWElK7w.js +0 -2
  172. package/src/client/dist/pwa/assets/MemoryProposalList-kgFCm9zz.js +0 -1
  173. package/src/client/dist/pwa/assets/QBtn-BUSdPaf4.js +0 -1
  174. package/src/client/dist/pwa/assets/QSelect-DFWyDWCE.js +0 -1
  175. package/src/client/dist/pwa/assets/SettingsPage-CO3vIpPd.js +0 -9
  176. package/src/client/dist/pwa/assets/TerminalPanel-BY0lPq6k.js +0 -16
  177. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-B9LE8HtU.css +0 -1
  178. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-DiYt3rP3.js +0 -1
  179. package/src/client/dist/pwa/assets/WorkspacePage-BEBwwr81.css +0 -1
  180. package/src/client/dist/pwa/assets/WorkspacePage-K-1ce50d.js +0 -4
  181. package/src/client/dist/pwa/assets/build-path-tree-DEuOdIIk.js +0 -1
  182. package/src/client/dist/pwa/assets/custom-sounds-Ggw6V9iF.js +0 -1
  183. package/src/client/dist/pwa/assets/de-Bk3zQrin.js +0 -17
  184. package/src/client/dist/pwa/assets/detached-fullscreen-Du3TcYdX.js +0 -1
  185. package/src/client/dist/pwa/assets/dom-BtYTvLeN.js +0 -2
  186. package/src/client/dist/pwa/assets/ecl-D05T4iGw.js +0 -1
  187. package/src/client/dist/pwa/assets/editor.worker-BLJF_oQx.js +0 -33
  188. package/src/client/dist/pwa/assets/efforts-TGacUPcJ.js +0 -9
  189. package/src/client/dist/pwa/assets/es-f3xuAWA9.js +0 -17
  190. package/src/client/dist/pwa/assets/expand-template-DM8gq3Mo.js +0 -1
  191. package/src/client/dist/pwa/assets/fr-B6c21SG3.js +0 -17
  192. package/src/client/dist/pwa/assets/i18n-WaE4cZK9.js +0 -1
  193. package/src/client/dist/pwa/assets/index-C8zAZ-k-.css +0 -1
  194. package/src/client/dist/pwa/assets/index-CpWBGKdM.js +0 -20
  195. package/src/client/dist/pwa/assets/it-DUstDpC2.js +0 -17
  196. package/src/client/dist/pwa/assets/monaco-contributions-DHvm-kp5.js +0 -53
  197. package/src/client/dist/pwa/assets/network-auth-DTZUKbny.js +0 -1
  198. package/src/client/dist/pwa/assets/notify-theme-FuTL7HuS.js +0 -1
  199. package/src/client/dist/pwa/assets/permissionModes-D-Nexnoo.js +0 -36
  200. package/src/client/dist/pwa/assets/reactivity.esm-bundler-DY1JkAEA.js +0 -1
  201. package/src/client/dist/pwa/assets/render-chat-markdown-CafzCcmu.js +0 -69
  202. package/src/client/dist/pwa/assets/runtime-core.esm-bundler-Bqg71Vll.js +0 -1
  203. package/src/client/dist/pwa/assets/use-is-mobile-CDB_rzM9.js +0 -1
  204. package/src/client/dist/pwa/assets/use-slide-transition-B_Nu6u-t.js +0 -1
  205. package/src/client/dist/pwa/assets/use-tours-BWkHp34X.js +0 -2
  206. package/src/client/dist/pwa/assets/use-tours-CTZuBZOi.css +0 -1
  207. 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 and OpenAI Codex 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.
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 ≥ 24.15, Hono (HTTP), `ws` (WebSocket), better-sqlite3 (WAL mode), nanoid, `@modelcontextprotocol/sdk`. TypeScript throughout, `tsx` for dev, `tsc` for production build.
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 Codex. `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.
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 both engines on every
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
- Two engines live under `src/server/services/agent/engines/`, both implementing the `AgentEngine` contract in `types.ts`:
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 both engines. Gate stream/tool inactivity, background
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.** Both 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.
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 Plan review session with its own
620
- engine/model/effort/instructions. Only the active reviewer capability may submit
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, two engines, two sibling worktrees. `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).
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 this file.
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 Codex),
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 you can continue the current session or start a fresh one explicitly.
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 in Plan mode and returns to the exact
685
- working session with its original LLM settings and permissions.
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
- The setting lives in `settings.json` under `global` and has no UI control yet:
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 Codex read the same Kōbō scopes, so a fact saved in one engine can be available to the other. There is no background transcript extractor or extra LLM call: agents must deliberately use the memory tools to save useful knowledge.
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:24.19.0-slim` base:
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. Both share the same UI surface (chat feed, task panel, permission modes, sub-agent panel, quota footer, auto-loop).
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 Claude/Codex launch or resume captures
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, container count, logs** | The `.container/instances/*.env` convention + Docker | ❌ No, requires the convention below |
1706
-
1707
- Configured processes can be started and stopped. Docker status, a URL and logs
1708
- require a matching instance file and running containers. Without an instance,
1709
- runtime detection returns `unknown`; the HTTP route may show the saved process
1710
- status instead, but has no URL or container logs. Without a start command, the
1711
- route returns `not_configured`.
1712
-
1713
- > **Known limitation: Docker-coupled, for now.** Status detection, the URL, the container count, and the logs viewer are currently hard-wired to Docker and to the `.container/instances/*.env` convention described below. This is a deliberate, temporary state: it works today for Docker-instance projects, and the convention is documented here so you can adopt it. An **evolution is planned** to abstract this layer, making the URL/port configurable and the running-detection engine-agnostic (e.g. a TCP probe) so the panel works for any project, Docker or not, without imposing this file layout. Until that lands, follow the contract below.
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. Make the status panel light up — the `.container/instances` contract
1834
+ ### 2. Docker status — the `.container/instances` contract
1733
1835
 
1734
- For the **Running** badge, the URL, the container count, and the logs button to appear, your **start command must create an instance file**:
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` if an instance file exists and the start process remains tracked but no container is running; `stopped` otherwise; `unknown` if no instance file matched.
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
- Both are **Docker-only**. A plain Node process (`npm run dev`) does not produce a
1760
- running Docker status or container logs. Writing an instance file alone is not
1761
- enough to expose a URL: status responses only include the URL when matching
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. Open the project's URL yourself; the Docker status, URL and
1771
- logs contract does not provide general process health monitoring.
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; the panel uses the
1774
- saved status when available, otherwise `unknown`, with no URL or Docker logs.
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 both engines.
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. Review returns and handoff reports remain read-only, with only their scoped report and operational progress tools allowed. Plan approval does not change permissions; explicitly select an execution mode in Kōbō and start a new launch to implement.
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 Codex. Integration
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 ≥ 24.15. The repository's `.nvmrc` pins the tested version; run
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 Codex multi-agent orchestrator. Each "workspace" is a
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,