@loicngr/kobo 2.1.29 → 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 (160) hide show
  1. package/AGENTS.md +59 -10
  2. package/CHANGELOG.md +16 -1
  3. package/CONFIGURATION.md +114 -14
  4. package/CONTRIBUTING.md +1 -1
  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/codex/capabilities.js +2 -0
  19. package/dist/server/services/agent/engines/codex/engine.js +3 -0
  20. package/dist/server/services/agent/engines/configuration.js +14 -0
  21. package/dist/server/services/agent/engines/mistral-vibe/capabilities.js +13 -0
  22. package/dist/server/services/agent/engines/mistral-vibe/client.js +64 -0
  23. package/dist/server/services/agent/engines/mistral-vibe/configuration.js +76 -0
  24. package/dist/server/services/agent/engines/mistral-vibe/engine.js +361 -0
  25. package/dist/server/services/agent/engines/mistral-vibe/event-mapper.js +297 -0
  26. package/dist/server/services/agent/engines/mistral-vibe/options-builder.js +35 -0
  27. package/dist/server/services/agent/engines/mistral-vibe/server-requests.js +278 -0
  28. package/dist/server/services/agent/engines/mistral-vibe/spawn.js +176 -0
  29. package/dist/server/services/agent/engines/registry.js +2 -0
  30. package/dist/server/services/agent/engines/types.js +6 -0
  31. package/dist/server/services/agent/orchestrator.js +88 -25
  32. package/dist/server/services/agent/session-controller.js +5 -0
  33. package/dist/server/services/auto-loop-final-review-service.js +10 -3
  34. package/dist/server/services/environment-check-service.js +6 -1
  35. package/dist/server/services/memory-service.js +1 -1
  36. package/dist/server/services/mistral-options-service.js +145 -0
  37. package/dist/server/services/pr-watcher-service.js +40 -11
  38. package/dist/server/services/review-service.js +33 -9
  39. package/dist/server/services/session-handoff-service.js +28 -2
  40. package/dist/server/services/settings-defaults.js +1 -0
  41. package/dist/server/services/settings-service.js +19 -1
  42. package/dist/server/services/workspace-creation-mcp-service.js +50 -8
  43. package/dist/server/services/workspace-dialogue-service.js +2 -0
  44. package/dist/server/services/workspace-message-service.js +19 -1
  45. package/dist/server/services/workspace-permission-policy-service.js +24 -0
  46. package/dist/server/utils/bounded-process.js +1 -1
  47. package/dist/shared/launch-instructions.js +18 -7
  48. package/dist/shared/memory.js +1 -1
  49. package/dist/shared/mistral-models.js +9 -0
  50. package/dist/shared/mistral-options.js +1 -0
  51. package/dist/shared/question-selections.js +16 -0
  52. package/dist/shared/workspace-creation-tools.js +8 -2
  53. package/dist/shared/workspace-dialogue-tools.js +15 -4
  54. package/docs/deployment-vps.md +10 -3
  55. package/docs/getting-started.md +3 -2
  56. package/docs/troubleshooting.md +1 -1
  57. package/package.json +7 -1
  58. package/src/client/dist/pwa/assets/ActivityFeed-C5stmHXP.js +2 -0
  59. package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-CIDSX32d.css +1 -0
  60. package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-DG32W_0G.js +1 -0
  61. package/src/client/dist/pwa/assets/{ChangelogPage-C5KjAOMG.js → ChangelogPage-_vItY8vA.js} +1 -1
  62. package/src/client/dist/pwa/assets/{ComparisonPanel-XXyzPEzW.js → ComparisonPanel-B3BMzQH0.js} +1 -1
  63. package/src/client/dist/pwa/assets/CreatePage-FlGrfmjX.js +2 -0
  64. package/src/client/dist/pwa/assets/CreatePage-oh8ihVC4.css +1 -0
  65. package/src/client/dist/pwa/assets/{DashboardPage-DyhUu26C.js → DashboardPage-lJGwWQYQ.js} +1 -1
  66. package/src/client/dist/pwa/assets/DiffViewer-DIaQH3lA.js +8 -0
  67. package/src/client/dist/pwa/assets/{DocumentsPanel-ItndGxeB.js → DocumentsPanel-Ct-nm4fX.js} +1 -1
  68. package/src/client/dist/pwa/assets/{DrawerToggleButton-DfzS_CD8.js → DrawerToggleButton-M5qv4Io-.js} +1 -1
  69. package/src/client/dist/pwa/assets/GitPanel-BaHCgb3p.js +3 -0
  70. package/src/client/dist/pwa/assets/GitPanel-C8vw2qvW.css +1 -0
  71. package/src/client/dist/pwa/assets/HealthPage-DR3wa6iD.js +1 -0
  72. package/src/client/dist/pwa/assets/HealthPage-Dbn4J_DT.css +1 -0
  73. package/src/client/dist/pwa/assets/{MainLayout-DoAEgANU.css → MainLayout-CHi8qP1D.css} +1 -1
  74. package/src/client/dist/pwa/assets/MainLayout-WJabICsA.js +2 -0
  75. package/src/client/dist/pwa/assets/{MemoryPanel-CZzI7_nY.js → MemoryPanel-CRpWdfc0.js} +1 -1
  76. package/src/client/dist/pwa/assets/{MemoryProposalList-DqNTycY1.js → MemoryProposalList-DGz3lDbL.js} +1 -1
  77. package/src/client/dist/pwa/assets/{QBtnDropdown-D7ml7zHo.js → QBtnDropdown-tt8rUNNR.js} +1 -1
  78. package/src/client/dist/pwa/assets/{QExpansionItem-BVb067oc.js → QExpansionItem-BkrI3UPL.js} +1 -1
  79. package/src/client/dist/pwa/assets/{QScrollArea-CUDWkEHh.js → QScrollArea-BvgnY-oA.js} +1 -1
  80. package/src/client/dist/pwa/assets/QSelect-BtZB1wrB.js +1 -0
  81. package/src/client/dist/pwa/assets/{QTooltip-B5QJIU3p.js → QTooltip-CDH6p745.js} +1 -1
  82. package/src/client/dist/pwa/assets/{SchedulePanel-IJOcrHgk.js → SchedulePanel-C2rWlh7l.js} +1 -1
  83. package/src/client/dist/pwa/assets/{SearchPage-BpTRWtne.js → SearchPage-BFd4NQwJ.js} +1 -1
  84. package/src/client/dist/pwa/assets/{SettingsPage-B4rmd2WX.css → SettingsPage-Bm0TcarK.css} +1 -1
  85. package/src/client/dist/pwa/assets/SettingsPage-DDQCgnjL.js +9 -0
  86. package/src/client/dist/pwa/assets/{SplitWorkspacePage-BZ8wN4ii.js → SplitWorkspacePage-DKCtOZO4.js} +1 -1
  87. package/src/client/dist/pwa/assets/{TerminalPanel-pY-RGBb6.js → TerminalPanel-BE_MSZF0.js} +4 -4
  88. package/src/client/dist/pwa/assets/{ToolCallItem-C9ksVseJ.js → ToolCallItem-BEYaOtgh.js} +3 -3
  89. package/src/client/dist/pwa/assets/{TouchPan-DRynDIve.js → TouchPan-DeYoOjX5.js} +1 -1
  90. package/src/client/dist/pwa/assets/{TourReplayButton-D4h1QR6C.js → TourReplayButton-D5lMwIKt.js} +1 -1
  91. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-BHEAsIoo.js +1 -0
  92. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-v7ein__H.css +1 -0
  93. package/src/client/dist/pwa/assets/WorkspacePage-5_wsJPaJ.js +4 -0
  94. package/src/client/dist/pwa/assets/WorkspacePage-CtUXz0Cq.css +1 -0
  95. package/src/client/dist/pwa/assets/{browser-BcOi2ES2.js → browser-ogy_9LVv.js} +1 -1
  96. package/src/client/dist/pwa/assets/{build-path-tree-mDco3pi7.js → build-path-tree-CRXxaYkA.js} +1 -1
  97. package/src/client/dist/pwa/assets/custom-sounds-iLTkCd_i.js +1 -0
  98. package/src/client/dist/pwa/assets/de-BqDU7iZH.js +17 -0
  99. package/src/client/dist/pwa/assets/{editor.api-CRrihXg2.js → editor.api-Dx6TbfZG.js} +1 -1
  100. package/src/client/dist/pwa/assets/{efforts-C-p9DzkL.js → efforts-DnJh2fW_.js} +2 -2
  101. package/src/client/dist/pwa/assets/es-D4VMXQRk.js +17 -0
  102. package/src/client/dist/pwa/assets/{expand-template-gIwrPbeS.js → expand-template-PUEVWny3.js} +1 -1
  103. package/src/client/dist/pwa/assets/{format-DeBnwmgW.js → format-yf9XM3dV.js} +1 -1
  104. package/src/client/dist/pwa/assets/{formatters-CxZZ_WTb.js → formatters-D0sXu9Oe.js} +1 -1
  105. package/src/client/dist/pwa/assets/fr-DIyaCFB3.js +17 -0
  106. package/src/client/dist/pwa/assets/{freemarker2-h7OLlqTn.js → freemarker2-l_xIHxRf.js} +1 -1
  107. package/src/client/dist/pwa/assets/{handlebars-BCWmi1-q.js → handlebars-CYgq99yQ.js} +1 -1
  108. package/src/client/dist/pwa/assets/{html-MUMpfUBd.js → html-C28GatN_.js} +1 -1
  109. package/src/client/dist/pwa/assets/i18n-2AmHIUy0.js +1 -0
  110. package/src/client/dist/pwa/assets/index-MMYMztJ_.js +20 -0
  111. package/src/client/dist/pwa/assets/it-CF6_4OS0.js +17 -0
  112. package/src/client/dist/pwa/assets/{javascript-CHDwijEy.js → javascript-YCSueyyk.js} +1 -1
  113. package/src/client/dist/pwa/assets/{liquid-dFrnLevt.js → liquid-CUBn90Gs.js} +1 -1
  114. package/src/client/dist/pwa/assets/{mdx-BHS7JVD4.js → mdx-C5WOHShJ.js} +1 -1
  115. package/src/client/dist/pwa/assets/{monaco-contributions-DCWZe7nX.js → monaco-contributions-DYwqbh7m.js} +1 -1
  116. package/src/client/dist/pwa/assets/{monaco.contribution-Dx0gcAn4.js → monaco.contribution-CoFzrPQl.js} +2 -2
  117. package/src/client/dist/pwa/assets/network-auth-BpJ6Noax.js +1 -0
  118. package/src/client/dist/pwa/assets/notify-theme-NPq4-Tup.js +1 -0
  119. package/src/client/dist/pwa/assets/permissionModes-Bbl901Hx.js +36 -0
  120. package/src/client/dist/pwa/assets/{project-color-DihsE4yN.js → project-color-gNyhKJlV.js} +1 -1
  121. package/src/client/dist/pwa/assets/{python-BtjZnK9y.js → python-lhKUZdPj.js} +1 -1
  122. package/src/client/dist/pwa/assets/{razor-DBcOGz0a.js → razor-Chi44rEL.js} +1 -1
  123. package/src/client/dist/pwa/assets/{typescript-B320c7wU.js → typescript-CU2TXVm6.js} +1 -1
  124. package/src/client/dist/pwa/assets/{use-search-index-status-B95GPaJP.js → use-search-index-status-CQ9S05G7.js} +1 -1
  125. package/src/client/dist/pwa/assets/{use-tours-C_5R1Y5D.js → use-tours-BmrZbHjz.js} +2 -2
  126. package/src/client/dist/pwa/assets/use-worktree-restore-DcucRlLh.js +1 -0
  127. package/src/client/dist/pwa/assets/{workspace-templates-B9UETKER.js → workspace-templates-DaG42EEt.js} +1 -1
  128. package/src/client/dist/pwa/assets/{xml-uK8LK4OB.js → xml-CPO5LI6F.js} +1 -1
  129. package/src/client/dist/pwa/assets/{yaml-B2D1l_tz.js → yaml-CoYs82jI.js} +1 -1
  130. package/src/client/dist/pwa/index.html +1 -1
  131. package/src/client/dist/pwa/sw.js +1 -1
  132. package/src/mcp-server/README.md +18 -6
  133. package/src/client/dist/pwa/assets/ActivityFeed-CiTe2VUQ.js +0 -2
  134. package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-Q-OlSQ1c.css +0 -1
  135. package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-v3jXoH_Q.js +0 -1
  136. package/src/client/dist/pwa/assets/CreatePage-DxOes_cF.css +0 -1
  137. package/src/client/dist/pwa/assets/CreatePage-MYCexRJu.js +0 -2
  138. package/src/client/dist/pwa/assets/DiffViewer-CvsmC9d5.js +0 -8
  139. package/src/client/dist/pwa/assets/GitPanel-C1ybi9bZ.js +0 -3
  140. package/src/client/dist/pwa/assets/GitPanel-yHvU38dp.css +0 -1
  141. package/src/client/dist/pwa/assets/HealthPage-C1u35ANL.js +0 -1
  142. package/src/client/dist/pwa/assets/HealthPage-Cnlhrn--.css +0 -1
  143. package/src/client/dist/pwa/assets/MainLayout-BEAGPqei.js +0 -2
  144. package/src/client/dist/pwa/assets/QSelect-DOnv_ry0.js +0 -1
  145. package/src/client/dist/pwa/assets/SettingsPage-CFaRN9Pk.js +0 -9
  146. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-B9LE8HtU.css +0 -1
  147. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-Bkj2DhOn.js +0 -1
  148. package/src/client/dist/pwa/assets/WorkspacePage-BEBwwr81.css +0 -1
  149. package/src/client/dist/pwa/assets/WorkspacePage-BTJnap9a.js +0 -4
  150. package/src/client/dist/pwa/assets/custom-sounds-T5HKzrWh.js +0 -1
  151. package/src/client/dist/pwa/assets/de-suqWUSXa.js +0 -17
  152. package/src/client/dist/pwa/assets/es-Dcptbz5U.js +0 -17
  153. package/src/client/dist/pwa/assets/fr-Db70bqVq.js +0 -17
  154. package/src/client/dist/pwa/assets/i18n-DLprfNLs.js +0 -1
  155. package/src/client/dist/pwa/assets/index-DLoUeovT.js +0 -20
  156. package/src/client/dist/pwa/assets/it-Cloo58Nn.js +0 -17
  157. package/src/client/dist/pwa/assets/network-auth-DDMAzwYH.js +0 -1
  158. package/src/client/dist/pwa/assets/notify-theme-JuVT96rq.js +0 -1
  159. package/src/client/dist/pwa/assets/permissionModes-D-Nexnoo.js +0 -36
  160. package/src/client/dist/pwa/assets/use-worktree-restore-Cj8eGE9s.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
 
@@ -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,22 @@
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.
6
21
 
7
22
  ## 2.1.29
8
23
 
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
 
@@ -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
 
@@ -2261,7 +2361,7 @@ Lets you bypass the bundled prompts entirely and write your own. The five `custo
2261
2361
 
2262
2362
  ## gbrain (companion MCP)
2263
2363
 
2264
- [`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.
2265
2365
 
2266
2366
  When gbrain is configured, the agent gets access to tools like:
2267
2367
 
@@ -2486,7 +2586,7 @@ as failures, with safe diagnostics; authentication/permission errors never justi
2486
2586
  modifying credentials or Kōbō storage to bypass the tools. Ambiguous mutation
2487
2587
  outcomes require checking available status/receipts before retrying.
2488
2588
 
2489
- 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.
2490
2590
 
2491
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.
2492
2592
 
@@ -2514,7 +2614,7 @@ the complete backend environment is not serialized into the agent configuration.
2514
2614
  Saving settings does not replace connections in an already-running engine. Stop
2515
2615
  that engine and resume, or start a fresh session, to apply changes. Disabling an
2516
2616
  integration removes its Kōbō-managed connection from subsequent launches; it does
2517
- 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
2518
2618
  credentials do not authorize the agent to modify remote data.
2519
2619
 
2520
2620
 
package/CONTRIBUTING.md CHANGED
@@ -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,
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Kōbō
2
2
 
3
- **Run a fleet of Claude Code and Codex agents in parallel — each in its own git worktree, all from one dashboard.**
3
+ **Run a fleet of Claude Code, Codex and Mistral Vibe agents in parallel — each in its own git worktree, all from one dashboard.**
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/@loicngr/kobo.svg)](https://www.npmjs.com/package/@loicngr/kobo)
6
6
  [![license](https://img.shields.io/npm/l/@loicngr/kobo.svg)](./LICENSE)
@@ -17,7 +17,7 @@ Kōbō (工房, "workshop") turns *one agent, one terminal* into a real workflow
17
17
 
18
18
  | | |
19
19
  |---|---|
20
- | **🗂️ Isolated worktrees, two engines** | Every workspace is its own git worktree and branch — parallel sessions never collide. Pick Claude Code or OpenAI Codex per workspace, and [continue in a fresh session](#fresh-sessions-and-llm-handoffs) with the same LLM or a different model/engine, preserving the worktree and mission history. |
20
+ | **🗂️ Isolated worktrees, three engines** | Every workspace is its own git worktree and branch — parallel sessions never collide. Pick Claude Code, OpenAI Codex or Mistral Vibe per workspace, and [continue in a fresh session](#fresh-sessions-and-llm-handoffs) with the same LLM or a different model/engine, preserving the worktree and mission history. |
21
21
  | **💬 Live chat, real diff review** | Streaming responses, inline Edit/Write diffs, a reasoning panel, and a Monaco diff viewer with **inline file editing**, conflict resolution, and one-click `Sync` / `Push` / `Open PR` / `Merge`. |
22
22
  | **🔁 Auto-loop, cron, wakeups** | Turn an agent loose on the task list: it works through tasks, retries on rate limits, and stops itself when there's nothing left, progress stalls, or it needs you. An optional [independent final review](CONFIGURATION.md#final-review-for-auto-loop) returns findings to the original session for automatic correction and repeats until none remain, with durable recovery after restart. Cron schedules and one-shot wakeups keep workspaces moving on their own timeline. |
23
23
  | **🔀 Create from a PR/MR, or from a ticket** | Pick an open pull/merge request from GitHub, GitLab, or Bitbucket and Kōbō resolves every local conflict for you before spinning up the workspace. Or start straight from a Notion page or a Sentry issue URL. |
@@ -28,13 +28,13 @@ Use [group messages](CONFIGURATION.md#group-workspace-messages) to send one inst
28
28
 
29
29
  ## Quick start
30
30
 
31
- Requires Node.js ≥ 26.12.1, Git, Bash and your own Claude Code **or** Codex authentication. No skill plugin or ticket integration is required. Kōbō is a local, single-user tool; each user installs their own instance.
31
+ Requires Node.js ≥ 26.12.1, Git, Bash and your own authentication for the chosen engine (Claude Code, Codex or Mistral Vibe). No skill plugin or ticket integration is required. Kōbō is a local, single-user tool; each user installs their own instance.
32
32
 
33
33
  ```bash
34
34
  npx @loicngr/kobo@latest
35
35
  ```
36
36
 
37
- Open <http://localhost:3000> and follow the first-run check. Use **Choose a folder** beside the project field to select a local Git repository; completing setup opens the mission form without launching an agent. New installs use the plugin-free **Standard** suite, **Plan** permissions, manual commit/push/publication preferences, and disabled optional integrations/audio. Existing preferences are preserved on upgrade.
37
+ Open <http://localhost:3000> and follow the first-run check. Use **Choose a folder** beside the project field to select a local Git repository; completing setup opens the mission form without launching an agent. New installs use the plugin-free **Standard** suite, **Plan** permissions for Claude Code/Codex (**Interactive** for Mistral Vibe), manual commit/push/publication preferences, and disabled optional integrations/audio. Existing preferences are preserved on upgrade.
38
38
 
39
39
  Follow [your first mission](./docs/getting-started.md), [troubleshooting](./docs/troubleshooting.md), or the [security and privacy model](./SECURITY.md).
40
40
 
@@ -69,11 +69,11 @@ Kōbō's production build is an installable PWA — use your browser's **Install
69
69
  - **Disk-space purge**: reclaim a merged workspace's `node_modules`/`vendor` weight without losing its chat history — see [`CONFIGURATION.md`](./CONFIGURATION.md#auto-purge-worktree-on-pr-merged).
70
70
  - **Lifecycle scripts**: shell scripts run on setup, cleanup, archive, session end, PR merge, or auto-loop stop, with output streamed into the chat.
71
71
  - **Observability**: a per-session timeline (duration, tools, tokens, errors) and a downloadable redacted diagnostic JSON.
72
- - **Optional integrations**: Notion (import missions) and Sentry (fix from issue URL), usable by both agent engines through saved connections, each independently toggled with a **Test connection** action; local voice transcription via `whisper.cpp`.
72
+ - **Optional integrations**: Notion (import missions) and Sentry (fix from issue URL), usable by all three agent engines through saved connections, each independently toggled with a **Test connection** action; local voice transcription via `whisper.cpp`.
73
73
 
74
74
  ### Persistent memory across engines
75
75
 
76
- Kōbō offers **Manual**, **Hybrid** (the default), and **Automatic** memory behavior in **Settings → Memory**. Global, project, and workspace scopes are shared by Claude Code and Codex but remain independently manageable. Hybrid applies workspace notes while asking for human approval before shared project/global changes. The workspace's right-hand **Memory** tab shows the current conversation's delivered context, pending proposals, and a provenance-aware operation journal. Memory has conservative per-response and per-conversation budgets; it cannot retract facts already transmitted into an agent or provider conversation. See the [persistent memory guide](./CONFIGURATION.md#persistent-memory) and [MCP memory tools](./src/mcp-server/README.md#persistent-memory-tools).
76
+ Kōbō offers **Manual**, **Hybrid** (the default), and **Automatic** memory behavior in **Settings → Memory**. Global, project, and workspace scopes are shared by Claude Code, Codex and Mistral Vibe but remain independently manageable. Hybrid applies workspace notes while asking for human approval before shared project/global changes. The workspace's right-hand **Memory** tab shows the current conversation's delivered context, pending proposals, and a provenance-aware operation journal. Memory has conservative per-response and per-conversation budgets; it cannot retract facts already transmitted into an agent or provider conversation. See the [persistent memory guide](./CONFIGURATION.md#persistent-memory) and [MCP memory tools](./src/mcp-server/README.md#persistent-memory-tools).
77
77
 
78
78
  ## Fresh sessions and LLM handoffs
79
79
 
@@ -83,6 +83,8 @@ Long conversation getting crowded? Use **Continue in a fresh session** at the bo
83
83
  2. Leave **Generate a handoff with the current agent** enabled to have the current conversation summarize the objective, constraints, decisions, verified progress, failed approaches and next action. Disable it when the old provider has no quota left: Kōbō builds context from the mission, tasks, Git state and source history without calling that LLM.
84
84
  3. Start the transfer. Kōbō interrupts the current work immediately, waits for confirmed shutdown, prepares the handoff and opens a fresh native conversation that continues the mission automatically.
85
85
 
86
+ Mistral Vibe can be a destination with a supported execution mode. When Vibe is the source, disable **Generate a handoff with the current agent**: its restricted summary launch is unsupported. Existing Plan selections are never silently promoted.
87
+
86
88
  The workspace, worktree, task list and conversation history remain available. The transfer links to its source session and a Markdown report in **Documents** (`.ai/handoffs/`, ignored by Git). Auto-loop keeps its intent and diagnostic budget; queued instructions retain their delivery state. Pending wakeups from the source conversation follow the fresh session once its startup is confirmed.
87
89
 
88
90
  If generation fails, choose **Retry**, **Continue without an LLM summary**, or **Cancel transfer**. Cancel and Stop leave the work stopped and restore the source conversation and LLM configuration, including when the destination failed to start. Failed attempts remain in history without being resumed automatically. If there was no source conversation, the next message starts a fresh one. A server restart preserves the transfer and report for an explicit recovery decision; it never automatically replays a potentially delivered prompt. Transfers are manual—conversation size does not trigger them automatically.
@@ -112,7 +114,7 @@ agents, while engine permissions remain a separate control.
112
114
  Notion and Sentry are optional. Save a **Direct connection** in the integration tab,
113
115
  enable it, save Settings, then use **Test connection**. Saved direct connections take
114
116
  priority over the Claude MCP selector, which is disabled while one exists. Enabled
115
- connections also reach Claude Code and Codex agents through `kobo-notion-*` and
117
+ connections also reach Claude Code, Codex and Mistral Vibe agents through `kobo-notion-*` and
116
118
  `kobo-sentry-*` MCP servers. Stop and resume a running agent to apply a connection
117
119
  change. See [managed integration MCPs](./CONFIGURATION.md#managed-integration-mcps-in-agent-sessions)
118
120
  for credential priority and native-configuration scope.
@@ -131,8 +133,9 @@ Kōbō binds to `127.0.0.1` only by default. Enabling **Settings → General →
131
133
 
132
134
  - **Claude Code**: authenticate once with `claude /login`. Kōbō calls the embedded SDK directly — no separately installed Claude CLI is required at runtime; the SDK supplies its runtime.
133
135
  - **OpenAI Codex**: run `codex login` or export `OPENAI_API_KEY`. Kōbō spawns a long-lived `codex app-server` subprocess per workspace.
136
+ - **Mistral Vibe** (experimental): install and authenticate native Vibe as the server user, with `vibe-acp` on that user's PATH. Kōbō uses ACP v1 and native model/thinking selection (Auto or discovered native values). [Setup, limits and compatibility evidence](./CONFIGURATION.md#mistral-vibe).
134
137
 
135
- Both engines share task tracking, permission modes, the sub-agent panel, and the quota footer. The mapping of Kōbō's four permission modes (`plan` / `bypass` / `strict` / `interactive`) to each engine's native sandbox semantics is in [`CONFIGURATION.md`](./CONFIGURATION.md#permission-modes).
138
+ All three engines share task tracking, memory and managed MCP. Permissions and available controls depend on the engine; Mistral Vibe offers fresh reviews under native permissions (Interactive by default; no guaranteed filesystem read-only access) and excludes Plan, live steering, account/quota controls, managed skills and sub-agent cards. The mapping of Kōbō's four permission modes (`plan` / `bypass` / `strict` / `interactive`) to each engine's native permission semantics is in [`CONFIGURATION.md`](./CONFIGURATION.md#permission-modes).
136
139
 
137
140
  ## Skill suites
138
141
 
@@ -147,7 +150,7 @@ Hono backend, Vue 3 + Quasar PWA, SQLite (WAL) for persistence, WebSocket for li
147
150
  ```
148
151
  src/
149
152
  ├── server/ # Hono backend (routes, services, db, agent orchestrator)
150
- │ ├── services/agent/engines/ # claude-code/ + codex/ engines
153
+ │ ├── services/agent/engines/ # claude-code/ + codex/ + mistral-vibe/ engines
151
154
  │ └── ...
152
155
  ├── client/ # Vue 3 + Quasar PWA
153
156
  ├── mcp-server/ # kobo-tasks MCP server, spawned per workspace
package/SECURITY.md CHANGED
@@ -50,11 +50,16 @@ capabilities. This tool boundary does not sandbox arbitrary code executed by an
50
50
  agent or other integrations running as the same OS account.
51
51
 
52
52
  Git workflow preferences express which automatic actions are wanted. They are not
53
- a sandbox for arbitrary shell commands or external MCP tools. Claude and Codex
54
- permission modes have different enforcement mechanisms; unrestricted access can
53
+ a sandbox for arbitrary shell commands or external MCP tools. Claude Code, Codex
54
+ and Mistral Vibe permission modes have different enforcement mechanisms; unrestricted access can
55
55
  modify files outside a worktree. Provider authentication is separate from Kōbō's
56
56
  network token.
57
57
 
58
+ Mistral Vibe uses native ACP execution modes and has no Plan/read-only mode.
59
+ Review prompts forbid modifications, but native permissions do not guarantee
60
+ filesystem read-only access. Kōbō-managed review tools and memory remain restricted
61
+ to reads, scoped reports and progress. See [Mistral Vibe](./CONFIGURATION.md#mistral-vibe).
62
+
58
63
  ## Data and credentials
59
64
 
60
65
  KOBO_HOME stores conversations, workspaces, backups and settings. Direct integration
@@ -44,7 +44,7 @@ export function initMemorySchema(db) {
44
44
  UNIQUE (scope_id, memory_key),
45
45
  CHECK (
46
46
  (actor_kind = 'human' AND source_workspace_id IS NULL AND source_session_id IS NULL AND source_engine IS NULL AND client_name IS NULL AND transport IS NULL) OR
47
- (actor_kind = 'internal-agent' AND source_engine IN ('claude-code', 'codex') AND client_name IS NULL AND transport IS NULL) OR
47
+ (actor_kind = 'internal-agent' AND source_engine IN ('claude-code', 'codex', 'mistral-vibe') AND client_name IS NULL AND transport IS NULL) OR
48
48
  (actor_kind = 'external-mcp' AND source_workspace_id IS NULL AND source_session_id IS NULL AND source_engine IS NULL AND client_name IS NOT NULL AND transport IN ('http', 'stdio'))
49
49
  )
50
50
  );
@@ -73,7 +73,7 @@ export function initMemorySchema(db) {
73
73
  CHECK ((target_entry_id IS NULL AND base_revision IS NULL) OR (target_entry_id IS NOT NULL AND base_revision IS NOT NULL)),
74
74
  CHECK (
75
75
  (actor_kind = 'human' AND source_workspace_id IS NULL AND source_session_id IS NULL AND source_engine IS NULL AND client_name IS NULL AND transport IS NULL) OR
76
- (actor_kind = 'internal-agent' AND source_engine IN ('claude-code', 'codex') AND client_name IS NULL AND transport IS NULL) OR
76
+ (actor_kind = 'internal-agent' AND source_engine IN ('claude-code', 'codex', 'mistral-vibe') AND client_name IS NULL AND transport IS NULL) OR
77
77
  (actor_kind = 'external-mcp' AND source_workspace_id IS NULL AND source_session_id IS NULL AND source_engine IS NULL AND client_name IS NOT NULL AND transport IN ('http', 'stdio'))
78
78
  )
79
79
  );
@@ -106,7 +106,7 @@ export function initMemorySchema(db) {
106
106
  CHECK (affected_proposals IS NULL OR affected_proposals >= 0),
107
107
  CHECK (
108
108
  (actor_kind = 'human' AND source_workspace_id IS NULL AND source_session_id IS NULL AND source_engine IS NULL AND client_name IS NULL AND transport IS NULL) OR
109
- (actor_kind = 'internal-agent' AND source_engine IN ('claude-code', 'codex') AND client_name IS NULL AND transport IS NULL) OR
109
+ (actor_kind = 'internal-agent' AND source_engine IN ('claude-code', 'codex', 'mistral-vibe') AND client_name IS NULL AND transport IS NULL) OR
110
110
  (actor_kind = 'external-mcp' AND source_workspace_id IS NULL AND source_session_id IS NULL AND source_engine IS NULL AND client_name IS NOT NULL AND transport IN ('http', 'stdio'))
111
111
  )
112
112
  );
@@ -122,7 +122,7 @@ export function initMemorySchema(db) {
122
122
  dispatch_id TEXT NOT NULL UNIQUE,
123
123
  budget_context_id TEXT REFERENCES memory_budget_contexts(id) ON DELETE SET NULL,
124
124
  budget_epoch INTEGER NOT NULL DEFAULT 0 CHECK (budget_epoch >= 0),
125
- engine TEXT NOT NULL CHECK (engine IN ('claude-code', 'codex')),
125
+ engine TEXT NOT NULL CHECK (engine IN ('claude-code', 'codex', 'mistral-vibe')),
126
126
  state TEXT NOT NULL CHECK (state IN ('prepared', 'submitted', 'initialized', 'failed', 'unknown')),
127
127
  entry_revisions_json TEXT NOT NULL,
128
128
  scope_generations_json TEXT NOT NULL,
@@ -144,7 +144,7 @@ export function initMemorySchema(db) {
144
144
  id TEXT PRIMARY KEY,
145
145
  kind TEXT NOT NULL CHECK (kind IN ('internal', 'external')),
146
146
  session_id TEXT REFERENCES agent_sessions(id) ON DELETE CASCADE,
147
- engine TEXT CHECK (engine IS NULL OR engine IN ('claude-code', 'codex')),
147
+ engine TEXT CHECK (engine IS NULL OR engine IN ('claude-code', 'codex', 'mistral-vibe')),
148
148
  conversation_key TEXT CHECK (conversation_key IS NULL OR length(trim(conversation_key)) > 0),
149
149
  native_conversation_id TEXT,
150
150
  external_context_id TEXT,
@@ -2,6 +2,7 @@ import { initAutoLoopFinalReviewSchema } from './auto-loop-final-review-schema.j
2
2
  import { initAutoLoopSchema } from './auto-loop-schema.js';
3
3
  import { initMcpMessageSchema } from './mcp-message-schema.js';
4
4
  import { migrateMemorySchema } from './memory-schema.js';
5
+ import { migrateMistralMemoryEngine } from './mistral-memory-migration.js';
5
6
  import { initProgressBarSchema } from './progress-bar-schema.js';
6
7
  import { initReviewReturnSchema, migrateDurableReviewReturns } from './review-return-schema.js';
7
8
  import { initSchema } from './schema.js';
@@ -812,6 +813,7 @@ export const migrations = [
812
813
  },
813
814
  { version: 53, name: 'workspace-group-message-receipts', migrate: initWorkspaceMessageBatchSchema },
814
815
  { version: 54, name: 'session-progress-bars', migrate: initProgressBarSchema },
816
+ { version: 55, name: 'mistral-vibe-memory-engine', migrate: migrateMistralMemoryEngine },
815
817
  ];
816
818
  /** Current schema version — always equals the highest migration version. */
817
819
  export const SCHEMA_VERSION = migrations.length > 0 ? migrations[migrations.length - 1].version : 1;