@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.
- package/AGENTS.md +59 -10
- package/CHANGELOG.md +16 -1
- package/CONFIGURATION.md +114 -14
- package/CONTRIBUTING.md +1 -1
- package/DESIGN.md +1 -1
- package/README.md +12 -9
- package/SECURITY.md +7 -2
- package/dist/server/db/memory-schema.js +5 -5
- package/dist/server/db/migrations.js +2 -0
- package/dist/server/db/mistral-memory-migration.js +40 -0
- package/dist/server/routes/engines.js +14 -0
- package/dist/server/routes/environment.js +1 -1
- package/dist/server/routes/health.js +14 -3
- package/dist/server/routes/settings.js +7 -1
- package/dist/server/routes/workspaces.js +116 -9
- package/dist/server/services/agent/engines/claude-code/capabilities.js +2 -0
- package/dist/server/services/agent/engines/claude-code/engine.js +3 -0
- package/dist/server/services/agent/engines/codex/capabilities.js +2 -0
- package/dist/server/services/agent/engines/codex/engine.js +3 -0
- package/dist/server/services/agent/engines/configuration.js +14 -0
- package/dist/server/services/agent/engines/mistral-vibe/capabilities.js +13 -0
- package/dist/server/services/agent/engines/mistral-vibe/client.js +64 -0
- package/dist/server/services/agent/engines/mistral-vibe/configuration.js +76 -0
- package/dist/server/services/agent/engines/mistral-vibe/engine.js +361 -0
- package/dist/server/services/agent/engines/mistral-vibe/event-mapper.js +297 -0
- package/dist/server/services/agent/engines/mistral-vibe/options-builder.js +35 -0
- package/dist/server/services/agent/engines/mistral-vibe/server-requests.js +278 -0
- package/dist/server/services/agent/engines/mistral-vibe/spawn.js +176 -0
- package/dist/server/services/agent/engines/registry.js +2 -0
- package/dist/server/services/agent/engines/types.js +6 -0
- package/dist/server/services/agent/orchestrator.js +88 -25
- package/dist/server/services/agent/session-controller.js +5 -0
- package/dist/server/services/auto-loop-final-review-service.js +10 -3
- package/dist/server/services/environment-check-service.js +6 -1
- package/dist/server/services/memory-service.js +1 -1
- package/dist/server/services/mistral-options-service.js +145 -0
- package/dist/server/services/pr-watcher-service.js +40 -11
- package/dist/server/services/review-service.js +33 -9
- package/dist/server/services/session-handoff-service.js +28 -2
- package/dist/server/services/settings-defaults.js +1 -0
- package/dist/server/services/settings-service.js +19 -1
- package/dist/server/services/workspace-creation-mcp-service.js +50 -8
- package/dist/server/services/workspace-dialogue-service.js +2 -0
- package/dist/server/services/workspace-message-service.js +19 -1
- package/dist/server/services/workspace-permission-policy-service.js +24 -0
- package/dist/server/utils/bounded-process.js +1 -1
- package/dist/shared/launch-instructions.js +18 -7
- package/dist/shared/memory.js +1 -1
- package/dist/shared/mistral-models.js +9 -0
- package/dist/shared/mistral-options.js +1 -0
- package/dist/shared/question-selections.js +16 -0
- package/dist/shared/workspace-creation-tools.js +8 -2
- package/dist/shared/workspace-dialogue-tools.js +15 -4
- package/docs/deployment-vps.md +10 -3
- package/docs/getting-started.md +3 -2
- package/docs/troubleshooting.md +1 -1
- package/package.json +7 -1
- package/src/client/dist/pwa/assets/ActivityFeed-C5stmHXP.js +2 -0
- package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-CIDSX32d.css +1 -0
- package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-DG32W_0G.js +1 -0
- package/src/client/dist/pwa/assets/{ChangelogPage-C5KjAOMG.js → ChangelogPage-_vItY8vA.js} +1 -1
- package/src/client/dist/pwa/assets/{ComparisonPanel-XXyzPEzW.js → ComparisonPanel-B3BMzQH0.js} +1 -1
- package/src/client/dist/pwa/assets/CreatePage-FlGrfmjX.js +2 -0
- package/src/client/dist/pwa/assets/CreatePage-oh8ihVC4.css +1 -0
- package/src/client/dist/pwa/assets/{DashboardPage-DyhUu26C.js → DashboardPage-lJGwWQYQ.js} +1 -1
- package/src/client/dist/pwa/assets/DiffViewer-DIaQH3lA.js +8 -0
- package/src/client/dist/pwa/assets/{DocumentsPanel-ItndGxeB.js → DocumentsPanel-Ct-nm4fX.js} +1 -1
- package/src/client/dist/pwa/assets/{DrawerToggleButton-DfzS_CD8.js → DrawerToggleButton-M5qv4Io-.js} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-BaHCgb3p.js +3 -0
- package/src/client/dist/pwa/assets/GitPanel-C8vw2qvW.css +1 -0
- package/src/client/dist/pwa/assets/HealthPage-DR3wa6iD.js +1 -0
- package/src/client/dist/pwa/assets/HealthPage-Dbn4J_DT.css +1 -0
- package/src/client/dist/pwa/assets/{MainLayout-DoAEgANU.css → MainLayout-CHi8qP1D.css} +1 -1
- package/src/client/dist/pwa/assets/MainLayout-WJabICsA.js +2 -0
- package/src/client/dist/pwa/assets/{MemoryPanel-CZzI7_nY.js → MemoryPanel-CRpWdfc0.js} +1 -1
- package/src/client/dist/pwa/assets/{MemoryProposalList-DqNTycY1.js → MemoryProposalList-DGz3lDbL.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnDropdown-D7ml7zHo.js → QBtnDropdown-tt8rUNNR.js} +1 -1
- package/src/client/dist/pwa/assets/{QExpansionItem-BVb067oc.js → QExpansionItem-BkrI3UPL.js} +1 -1
- package/src/client/dist/pwa/assets/{QScrollArea-CUDWkEHh.js → QScrollArea-BvgnY-oA.js} +1 -1
- package/src/client/dist/pwa/assets/QSelect-BtZB1wrB.js +1 -0
- package/src/client/dist/pwa/assets/{QTooltip-B5QJIU3p.js → QTooltip-CDH6p745.js} +1 -1
- package/src/client/dist/pwa/assets/{SchedulePanel-IJOcrHgk.js → SchedulePanel-C2rWlh7l.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-BpTRWtne.js → SearchPage-BFd4NQwJ.js} +1 -1
- package/src/client/dist/pwa/assets/{SettingsPage-B4rmd2WX.css → SettingsPage-Bm0TcarK.css} +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-DDQCgnjL.js +9 -0
- package/src/client/dist/pwa/assets/{SplitWorkspacePage-BZ8wN4ii.js → SplitWorkspacePage-DKCtOZO4.js} +1 -1
- package/src/client/dist/pwa/assets/{TerminalPanel-pY-RGBb6.js → TerminalPanel-BE_MSZF0.js} +4 -4
- package/src/client/dist/pwa/assets/{ToolCallItem-C9ksVseJ.js → ToolCallItem-BEYaOtgh.js} +3 -3
- package/src/client/dist/pwa/assets/{TouchPan-DRynDIve.js → TouchPan-DeYoOjX5.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-D4h1QR6C.js → TourReplayButton-D5lMwIKt.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-BHEAsIoo.js +1 -0
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-v7ein__H.css +1 -0
- package/src/client/dist/pwa/assets/WorkspacePage-5_wsJPaJ.js +4 -0
- package/src/client/dist/pwa/assets/WorkspacePage-CtUXz0Cq.css +1 -0
- package/src/client/dist/pwa/assets/{browser-BcOi2ES2.js → browser-ogy_9LVv.js} +1 -1
- package/src/client/dist/pwa/assets/{build-path-tree-mDco3pi7.js → build-path-tree-CRXxaYkA.js} +1 -1
- package/src/client/dist/pwa/assets/custom-sounds-iLTkCd_i.js +1 -0
- package/src/client/dist/pwa/assets/de-BqDU7iZH.js +17 -0
- package/src/client/dist/pwa/assets/{editor.api-CRrihXg2.js → editor.api-Dx6TbfZG.js} +1 -1
- package/src/client/dist/pwa/assets/{efforts-C-p9DzkL.js → efforts-DnJh2fW_.js} +2 -2
- package/src/client/dist/pwa/assets/es-D4VMXQRk.js +17 -0
- package/src/client/dist/pwa/assets/{expand-template-gIwrPbeS.js → expand-template-PUEVWny3.js} +1 -1
- package/src/client/dist/pwa/assets/{format-DeBnwmgW.js → format-yf9XM3dV.js} +1 -1
- package/src/client/dist/pwa/assets/{formatters-CxZZ_WTb.js → formatters-D0sXu9Oe.js} +1 -1
- package/src/client/dist/pwa/assets/fr-DIyaCFB3.js +17 -0
- package/src/client/dist/pwa/assets/{freemarker2-h7OLlqTn.js → freemarker2-l_xIHxRf.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-BCWmi1-q.js → handlebars-CYgq99yQ.js} +1 -1
- package/src/client/dist/pwa/assets/{html-MUMpfUBd.js → html-C28GatN_.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-2AmHIUy0.js +1 -0
- package/src/client/dist/pwa/assets/index-MMYMztJ_.js +20 -0
- package/src/client/dist/pwa/assets/it-CF6_4OS0.js +17 -0
- package/src/client/dist/pwa/assets/{javascript-CHDwijEy.js → javascript-YCSueyyk.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-dFrnLevt.js → liquid-CUBn90Gs.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-BHS7JVD4.js → mdx-C5WOHShJ.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco-contributions-DCWZe7nX.js → monaco-contributions-DYwqbh7m.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco.contribution-Dx0gcAn4.js → monaco.contribution-CoFzrPQl.js} +2 -2
- package/src/client/dist/pwa/assets/network-auth-BpJ6Noax.js +1 -0
- package/src/client/dist/pwa/assets/notify-theme-NPq4-Tup.js +1 -0
- package/src/client/dist/pwa/assets/permissionModes-Bbl901Hx.js +36 -0
- package/src/client/dist/pwa/assets/{project-color-DihsE4yN.js → project-color-gNyhKJlV.js} +1 -1
- package/src/client/dist/pwa/assets/{python-BtjZnK9y.js → python-lhKUZdPj.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-DBcOGz0a.js → razor-Chi44rEL.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-B320c7wU.js → typescript-CU2TXVm6.js} +1 -1
- package/src/client/dist/pwa/assets/{use-search-index-status-B95GPaJP.js → use-search-index-status-CQ9S05G7.js} +1 -1
- package/src/client/dist/pwa/assets/{use-tours-C_5R1Y5D.js → use-tours-BmrZbHjz.js} +2 -2
- package/src/client/dist/pwa/assets/use-worktree-restore-DcucRlLh.js +1 -0
- package/src/client/dist/pwa/assets/{workspace-templates-B9UETKER.js → workspace-templates-DaG42EEt.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-uK8LK4OB.js → xml-CPO5LI6F.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-B2D1l_tz.js → yaml-CoYs82jI.js} +1 -1
- package/src/client/dist/pwa/index.html +1 -1
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/mcp-server/README.md +18 -6
- package/src/client/dist/pwa/assets/ActivityFeed-CiTe2VUQ.js +0 -2
- package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-Q-OlSQ1c.css +0 -1
- package/src/client/dist/pwa/assets/AutoLoopFinalReviewSettings-v3jXoH_Q.js +0 -1
- package/src/client/dist/pwa/assets/CreatePage-DxOes_cF.css +0 -1
- package/src/client/dist/pwa/assets/CreatePage-MYCexRJu.js +0 -2
- package/src/client/dist/pwa/assets/DiffViewer-CvsmC9d5.js +0 -8
- package/src/client/dist/pwa/assets/GitPanel-C1ybi9bZ.js +0 -3
- package/src/client/dist/pwa/assets/GitPanel-yHvU38dp.css +0 -1
- package/src/client/dist/pwa/assets/HealthPage-C1u35ANL.js +0 -1
- package/src/client/dist/pwa/assets/HealthPage-Cnlhrn--.css +0 -1
- package/src/client/dist/pwa/assets/MainLayout-BEAGPqei.js +0 -2
- package/src/client/dist/pwa/assets/QSelect-DOnv_ry0.js +0 -1
- package/src/client/dist/pwa/assets/SettingsPage-CFaRN9Pk.js +0 -9
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-B9LE8HtU.css +0 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-Bkj2DhOn.js +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-BEBwwr81.css +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-BTJnap9a.js +0 -4
- package/src/client/dist/pwa/assets/custom-sounds-T5HKzrWh.js +0 -1
- package/src/client/dist/pwa/assets/de-suqWUSXa.js +0 -17
- package/src/client/dist/pwa/assets/es-Dcptbz5U.js +0 -17
- package/src/client/dist/pwa/assets/fr-Db70bqVq.js +0 -17
- package/src/client/dist/pwa/assets/i18n-DLprfNLs.js +0 -1
- package/src/client/dist/pwa/assets/index-DLoUeovT.js +0 -20
- package/src/client/dist/pwa/assets/it-Cloo58Nn.js +0 -17
- package/src/client/dist/pwa/assets/network-auth-DDMAzwYH.js +0 -1
- package/src/client/dist/pwa/assets/notify-theme-JuVT96rq.js +0 -1
- package/src/client/dist/pwa/assets/permissionModes-D-Nexnoo.js +0 -36
- 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
|
|
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
|
|
181
|
+
Kōbō memory is independent of provider chat history/native memory and shared by Claude Code, Codex and Mistral Vibe. `memoryMode` is a global setting defaulting to `hybrid`: Manual permits reads only; Hybrid applies workspace writes and proposes project/global writes; Automatic applies writes to the explicitly targeted scope. Mode is checked per operation, so a setting change affects existing agent sessions; pending/rejected proposals are never automatically approved or revived. Plan/review/report-only capabilities cannot write.
|
|
182
182
|
|
|
183
183
|
`memory_scopes` identify global, normalized configured project path, or durable workspace id. Project identity is not a display name, branch, or worktree path. Clear is transactional: it deletes entries and pending proposals only from the exact scope, increments generation, and writes content-free journal metadata. Every delayed writer supplies its expected generation. Workspace archive/purge preserves memory; workspace deletion cascades its own scope and launch records while leaving global/project scopes intact. Provenance FKs become null when the source session/workspace is deleted; saved memory remains in its scope until explicitly erased.
|
|
184
184
|
|
|
@@ -444,7 +444,7 @@ See the "Notion integration" section of the README for the end-user setup guide.
|
|
|
444
444
|
### Launch instructions
|
|
445
445
|
|
|
446
446
|
`src/shared/launch-instructions.ts` composes application-owned MCP discovery,
|
|
447
|
-
permissions, progress reporting and continuation rules for
|
|
447
|
+
permissions, progress reporting and continuation rules for all three engines on every
|
|
448
448
|
fresh/resumed launch. Prefer discovering the available tool schemas to embedding
|
|
449
449
|
a duplicate catalogue. Keep Plan conversation-only; template approval cannot
|
|
450
450
|
expand tool permissions. Initial writable auto-loop launches seed tasks and end;
|
|
@@ -493,11 +493,58 @@ through `ExitPlanMode`; a permission change requires a new launch.
|
|
|
493
493
|
|
|
494
494
|
### Agent engines
|
|
495
495
|
|
|
496
|
-
|
|
496
|
+
**Mistral Vibe** (`mistral-vibe/`, engine id `mistral-vibe`) uses ACP v1 through
|
|
497
|
+
SDK 2.0.1 and the server user's PATH-resolved `vibe-acp`. Native setup/authentication
|
|
498
|
+
belongs to that same user/environment, including Docker; Kōbō stores no Vibe key.
|
|
499
|
+
Model/thinking choices come from validated native ACP `configOptions`, including
|
|
500
|
+
model-specific thinking levels. `auto` omits setters; explicit launch selections
|
|
501
|
+
use public ACP setters and may persist native Vibe preferences. Discovery uses
|
|
502
|
+
child-only native environment overrides and session/new without prompts, setters,
|
|
503
|
+
provider requests or Kōbō MCP grants. Resolve workspace/project context server-side;
|
|
504
|
+
cache/coalesce only after confirmed native closure and retain failed shutdown slots.
|
|
505
|
+
Preflight explicit choices before mutations, then confirm mode → model → thinking
|
|
506
|
+
again on the actual new/load session before prompting. Static Auto catalogues are
|
|
507
|
+
fallbacks, never complete membership validators. Configured Auto must not acquire
|
|
508
|
+
an observed session-model override during resume or review return; explicit source
|
|
509
|
+
configuration may restore the observed source/brainstorm alias. Native review
|
|
510
|
+
return thinking comes from the pinned saved session, never the workspace iteration
|
|
511
|
+
effort. Auto-model resumes with explicit thinking defer catalogue membership to
|
|
512
|
+
the loaded native session because session/new defaults may use another model.
|
|
513
|
+
Fresh Vibe workspaces default to `interactive`;
|
|
514
|
+
`interactive`/`strict`/`bypass` select advertised native `ask`/`accept-edits`/
|
|
515
|
+
`auto-approve`. Native profiles/admin policy remain authoritative. Reject Plan,
|
|
516
|
+
readOnly and restricted handoff-summary launches before spawn or workspace mutations.
|
|
517
|
+
Manual Vibe reviews always use a fresh controlled launch, Interactive by default;
|
|
518
|
+
automatic final reviews are fixed Interactive. Native permissions do not enforce
|
|
519
|
+
filesystem read-only access: prompts forbid every modification and approvals may
|
|
520
|
+
pause the review. Kōbō MCP/memory grants and bootstrap remain read-only even in
|
|
521
|
+
Automatic memory mode. Returning/final reviewers derive this role from durable
|
|
522
|
+
state; no-return reviews use the private KOBO_REVIEW_ONLY launch marker.
|
|
523
|
+
Explicit native Plan requests still fail; only explicitly starting a native review
|
|
524
|
+
chooses its independent Interactive default. Ordinary saved Plan is never promoted.
|
|
525
|
+
|
|
526
|
+
No live steering, account/quota panel, managed skills or sub-agent cards/individual
|
|
527
|
+
stop. Queue messages until confirmed native closure, then resume; immediate sends
|
|
528
|
+
fail while busy. Normal task/memory/progress MCP and manual handoff destinations
|
|
529
|
+
remain supported. Shared memory migration v55 preserves existing facts and adds
|
|
530
|
+
Mistral provenance. Setup requests have 20-second initialize/30-second session
|
|
531
|
+
limits; prompts have no absolute deadline. Opt-in liveness uses 120 seconds
|
|
532
|
+
foreground silence or 30 minutes unresolved tools, paused for human input.
|
|
533
|
+
|
|
534
|
+
Native shutdown drains stdout, ends stdin and awaits actual exit and an empty
|
|
535
|
+
owned process group; a close ACK is insufficient. Allow 15 seconds for native EOF
|
|
536
|
+
cleanup before bounded signal fallback. Unconfirmed/abnormal exit retains ownership.
|
|
537
|
+
Do not claim arbitrary unmanaged descendant containment. Vibe 3.0.1 has passed the
|
|
538
|
+
real-adapter offline provider/MCP smoke on Linux; paid-provider compatibility is
|
|
539
|
+
still unverified. Health version detection proves executable availability only,
|
|
540
|
+
never authentication. See [setup](CONFIGURATION.md#mistral-vibe) and
|
|
541
|
+
[compatibility evidence](src/__tests__/fixtures/mistral-acp/README.md).
|
|
542
|
+
|
|
543
|
+
Three engines live under `src/server/services/agent/engines/`, implementing the `AgentEngine` contract in `types.ts`:
|
|
497
544
|
|
|
498
545
|
Global `agentWatchdogEnabled` is opt-in (false for fresh and existing installs;
|
|
499
546
|
settings migration v64). The orchestrator snapshots it into `StartOptions.watchdogEnabled`
|
|
500
|
-
on every launch/resume for
|
|
547
|
+
on every launch/resume for all three engines. Gate stream/tool inactivity, background
|
|
501
548
|
stall, compaction and failed-result-drain watchdogs; retain normal completion,
|
|
502
549
|
manual stop, protocol/startup deadlines and confirmed-dead-process cleanup.
|
|
503
550
|
The toggle is first in Settings → Agents and does not reconfigure active launches.
|
|
@@ -536,7 +583,7 @@ Background: the engine was migrated from `@openai/codex-sdk` (one-shot `codex ex
|
|
|
536
583
|
- **Permission mode vs collaboration mode are independent.** Sandbox + approvalPolicy control *what the agent may do at OS level* (read-only / workspace-write, never / on-request / unless-trusted). `collaborationMode` is a separate session-level flag that gates internal Codex behaviour (notably interactive Q&A). Kōbō hides both behind a single "permission mode" selector and maps them together.
|
|
537
584
|
- **Sub-agents map to `collabAgentToolCall`.** Codex's analogue of Claude's Task tool is `collabAgentToolCall` (`spawnAgent` / `sendInput` / `resumeAgent` / `wait` / `closeAgent`). The mapper emits **both** a `tool:call` named `Task` (chat card) and a `subagent:progress` event (right-hand panel) per call, the same dual-emission Claude does. See `event-mapper.ts` `handleItemStarted` / `handleItemCompleted` for the `collabAgentToolCall` branch.
|
|
538
585
|
- **`fileChange` items carry a unified-diff blob.** The protocol shape is `{ path, kind: PatchChangeKind, diff: string }` per change; `kind` is a discriminated union, not a string. The mapper flattens the first change into a Claude-style Edit input (`{ file_path, diff, change_kind, move_path? }`) so the existing `ToolCallItem` renderer picks it up. The client parses the unified diff into `DiffLine[]` via `parseUnifiedDiff` in `inline-diff.ts`.
|
|
539
|
-
- **Streaming bursts trip auto-scroll.**
|
|
586
|
+
- **Streaming bursts trip auto-scroll.** All three engines can emit token deltas; Claude enables SDK partial messages as well. The naive `eventCount` watcher in `ActivityFeed.vue` triggered an animated `scrollToBottom(180)` per event, causing stacked animations and visible jank. Scroll requests are coalesced through `requestAnimationFrame`; preserve burst handling when changing the feed.
|
|
540
587
|
- **`MCP tools` need `default_tools_approval_mode: 'auto'` in `config.mcp_servers`.** Without it Codex flags every MCP tool call as needing user approval ("user cancelled MCP tool call"). Kōbō trusts every tool it spawns, so the options-builder pre-approves the namespace.
|
|
541
588
|
|
|
542
589
|
## Workspace operations
|
|
@@ -616,8 +663,10 @@ never automatically resend a possibly delivered summary. Explicit user stop canc
|
|
|
616
663
|
the continuation. Errors retain recoverable intent and restore original settings.
|
|
617
664
|
|
|
618
665
|
`auto_loop_final_reviews` (migration v52) adds an optional final gate configured
|
|
619
|
-
before execution. Each pass starts a separate
|
|
620
|
-
engine/model/effort/instructions
|
|
666
|
+
before execution. Each pass starts a separate review session with its own
|
|
667
|
+
engine/model/effort/instructions: Plan for Claude Code/Codex, native Interactive
|
|
668
|
+
for Vibe. Kōbō grants allow only reads and scoped reports; native Vibe permissions
|
|
669
|
+
do not guarantee filesystem read-only access and may require human approval. Only the active reviewer capability may submit
|
|
621
670
|
the structured `kobo__submit_final_review` verdict. Findings become work tasks,
|
|
622
671
|
invalidate finalization, and return to the exact original working session for
|
|
623
672
|
automatic corrections under its original permissions. Repeat verification and a
|
|
@@ -716,7 +765,7 @@ global and project settings; keep this help and CONFIGURATION.md in sync.
|
|
|
716
765
|
|
|
717
766
|
Successful paired creation opens the existing `split` route with `left` and `right` workspace ids in creation order. A single successful creation keeps the normal workspace route, including when the second creation fails.
|
|
718
767
|
|
|
719
|
-
One task,
|
|
768
|
+
One task, Claude Code versus Codex, two sibling worktrees. Mistral Vibe is excluded from comparisons. `POST /api/workspaces` accepts a `comparisonId`; the client posts twice with the same one (sequentially — parallel creations contend on the git index lock), suffixing the name with the engine's display name and the branch with the engine id and giving the non-configured engine the model picked for it on the form and its own effort / permission defaults. `workspaces.comparison_id` (migration v40) groups them; `listComparisonMembers` reads them back, treating an empty id as no group rather than as a match against the NULL majority. `GET /api/workspaces/:id/comparison` returns each member with its cached git stats (`null`, never zeros, when nothing has been measured). `ComparisonPanel.vue` renders the table at the top of the Git tab, only for workspaces that belong to a comparison. See [CONFIGURATION.md → Comparing two engines on one task](CONFIGURATION.md#comparing-two-engines-on-one-task).
|
|
720
769
|
|
|
721
770
|
### Unanswered question reminder
|
|
722
771
|
|
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,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
|
|
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
|
|
657
|
+
The workspace's **Start review** dialog offers engine (Claude Code, Codex or Mistral Vibe),
|
|
657
658
|
model, reasoning effort and permission mode using the same catalogues as workspace
|
|
658
659
|
creation. The current workspace settings are selected initially. Changing any of
|
|
659
660
|
these settings automatically enables and locks **New session**; with unchanged
|
|
660
|
-
settings
|
|
661
|
+
settings Claude Code/Codex can continue the current session or start a fresh one explicitly.
|
|
662
|
+
Mistral Vibe reviews always use a fresh session and default to native **Interactive**
|
|
663
|
+
permissions. Their prompts forbid modifications, but they cannot guarantee filesystem
|
|
664
|
+
read-only access; Kōbō-managed tools remain restricted. See [Mistral Vibe](#mistral-vibe).
|
|
661
665
|
|
|
662
666
|
Enable **Return to the current session after the review** to resume the original
|
|
663
667
|
conversation with its original LLM settings and the reviewer's final summary.
|
|
@@ -681,8 +685,10 @@ also keeps a recoverable return instead of silently losing it.
|
|
|
681
685
|
Enable **Final review** in the creation form or the workspace's Auto-loop panel.
|
|
682
686
|
Configure the reviewer engine, model, reasoning effort and additional instructions
|
|
683
687
|
in advance. Workspace templates and remembered creation preferences retain these
|
|
684
|
-
settings. Each review uses a separate session
|
|
685
|
-
|
|
688
|
+
settings. Each review uses a separate session: Plan for Claude Code/Codex, native
|
|
689
|
+
Interactive for Vibe. Kōbō grants allow only reads and scoped reports; Vibe does not
|
|
690
|
+
guarantee filesystem read-only access and may pause for human approval. The review
|
|
691
|
+
returns to the exact working session with its original LLM settings and permissions.
|
|
686
692
|
|
|
687
693
|
After all work and final checks pass, Kōbō launches the reviewer. Its structured
|
|
688
694
|
findings become tasks for the original agent to correct automatically. The agent
|
|
@@ -870,7 +876,15 @@ capacity release and lifecycle-guard release reconsider waiting workspaces.
|
|
|
870
876
|
It emits `autoloop:waiting-for-slot` so the
|
|
871
877
|
interface can say so rather than looking stalled.
|
|
872
878
|
|
|
873
|
-
|
|
879
|
+
Change the limit in **Settings → Agents**. Saving applies immediately: increasing
|
|
880
|
+
it, or changing a finite limit to `0`, immediately reconsiders waiting auto-loop
|
|
881
|
+
iterations and review returns through the normal admission checks. Cron, wakeup
|
|
882
|
+
and quota retries retain their existing timers and deadlines; their next admission
|
|
883
|
+
check reads the new limit. Reducing it never interrupts active sessions; new
|
|
884
|
+
automatic sessions wait until capacity becomes available. Progress and retry state
|
|
885
|
+
are preserved.
|
|
886
|
+
|
|
887
|
+
The setting also lives in `settings.json` under `global`:
|
|
874
888
|
|
|
875
889
|
```json
|
|
876
890
|
{ "global": { "maxConcurrentAgents": 3 } }
|
|
@@ -985,7 +999,7 @@ arguments, ordering, retry behavior and update limits.
|
|
|
985
999
|
|
|
986
1000
|
## Persistent memory
|
|
987
1001
|
|
|
988
|
-
Kōbō stores deliberate, concise facts in SQLite, independently of Claude Code's native memory and provider chat history. Claude Code and
|
|
1002
|
+
Kōbō stores deliberate, concise facts in SQLite, independently of Claude Code's native memory and provider chat history. Claude Code, Codex and Mistral Vibe read the same Kōbō scopes, so facts can follow a mission across engines. The incremental v55 migration preserves existing entries/proposals while extending engine provenance. There is no background transcript extractor or extra LLM call: agents must deliberately use the memory tools to save useful knowledge.
|
|
989
1003
|
|
|
990
1004
|
Choose the global behavior in **Settings → Memory**. New and upgraded installations default to **Hybrid**:
|
|
991
1005
|
|
|
@@ -1336,7 +1350,7 @@ retrieved once — see [Token / login flow](#token--login-flow).
|
|
|
1336
1350
|
|
|
1337
1351
|
| Mount | RO/RW | Purpose |
|
|
1338
1352
|
|---|---|---|
|
|
1339
|
-
| `kobo-home:/root` (`vps.yml`, named volume) | RW | Independent Kōbō, Claude/Codex, Git and forge state. Authenticate inside the container; no PC credential files are required. |
|
|
1353
|
+
| `kobo-home:/root` (`vps.yml`, named volume) | RW | Independent Kōbō, Claude/Codex, optional Vibe native state, Git and forge state. Authenticate inside the container; no PC credential files are required. |
|
|
1340
1354
|
| `<name>-data:/root/.config/kobo` (named volume) | RW | Kōbō's own state — SQLite DB, `settings.json`, etc. Named (not bind-mounted) so it survives `docker compose down` without `-v`, and so it can be deliberately **shared** across compose files by reusing the same volume name (see the two local files, both `kobo-test-data`). |
|
|
1341
1355
|
| `${KOBO_PROJECTS_DIR:-./kobo-projects}:/projects` | RW | Your project repositories. Ensure the configured worktree directory is also persistent. For project Docker bind mounts, use the VPS example’s identical host/container paths; see the [path setup](./docs/deployment-vps.md#optional-project-docker-environments). |
|
|
1342
1356
|
| `${HOME}/.ssh:/root/.ssh` | RO | Git SSH auth — needed to push/pull over SSH remotes. |
|
|
@@ -1509,7 +1523,7 @@ An old image alone is not a complete rollback after database migrations.
|
|
|
1509
1523
|
|
|
1510
1524
|
## Agent runtimes
|
|
1511
1525
|
|
|
1512
|
-
Engines are selected per workspace at creation time.
|
|
1526
|
+
Engines are selected per workspace at creation time. All three share chat, task tracking, memory and auto-loop; available permissions and optional controls depend on each engine's capabilities.
|
|
1513
1527
|
|
|
1514
1528
|
### Claude Code
|
|
1515
1529
|
|
|
@@ -1544,7 +1558,7 @@ its dedicated auto-loop API.
|
|
|
1544
1558
|
|
|
1545
1559
|
**Settings → Agents → Enable agent inactivity watchdogs**, at the top of the tab,
|
|
1546
1560
|
controls the global `agentWatchdogEnabled` boolean. It is **off by default**, for
|
|
1547
|
-
both new and existing installations. Each
|
|
1561
|
+
both new and existing installations. Each engine launch or resume captures
|
|
1548
1562
|
the current value; saving the toggle does not interrupt or reconfigure an already
|
|
1549
1563
|
running agent. Stop and resume that agent to apply the new value.
|
|
1550
1564
|
|
|
@@ -1597,6 +1611,92 @@ When a Codex session is already working, **Send now** sends a queued chat messag
|
|
|
1597
1611
|
|
|
1598
1612
|
The selector reads [`src/shared/codex-models.ts`](./src/shared/codex-models.ts). This checkout lists GPT-6 Astra, GPT-5.6 Sol/Terra/Luna, GPT-5.5 and older variants; availability depends on your account and authentication. Kōbō exposes effort values `auto`, `none`, `low`, `medium`, `high`, `xhigh`, and `max`, as declared in the engine's capabilities. The runtime must support the selected model/effort combination. Both selectors switch when you change the engine.
|
|
1599
1613
|
|
|
1614
|
+
### Mistral Vibe
|
|
1615
|
+
|
|
1616
|
+
> Experimental. Target version: **Vibe 3.0.1**, ACP v1 with SDK 2.0.1.
|
|
1617
|
+
|
|
1618
|
+
Follow the official [native Vibe setup](https://docs.mistral.ai/vibe/code/cli/install-setup)
|
|
1619
|
+
and [Vibe 3.0.1 ACP instructions](https://github.com/mistralai/mistral-vibe/blob/v3.0.1/docs/acp-setup.md).
|
|
1620
|
+
Install Vibe separately; run `vibe` for its native authentication wizard (`vibe --setup`
|
|
1621
|
+
to repeat it). Run these as the **same OS user and in the same environment as the
|
|
1622
|
+
Kōbō server**. `vibe-acp` must be on that user's PATH. Kōbō inherits native provider
|
|
1623
|
+
configuration/authentication and does not store a Mistral key. Explicit native
|
|
1624
|
+
model/thinking selections can persist Vibe preferences as described below. In Docker, host installation/login is insufficient: install and
|
|
1625
|
+
configure Vibe inside the container and persist its native state; see
|
|
1626
|
+
[VPS setup](./docs/vps-projects-and-skills.md#use-mistral-vibe-inside-the-container).
|
|
1627
|
+
|
|
1628
|
+
The health diagnostic checks `vibe-acp --version` without contacting a provider.
|
|
1629
|
+
A detected executable/version is **not an authentication check**. If a launch
|
|
1630
|
+
reports authentication required, complete native setup in the server environment;
|
|
1631
|
+
check PATH/permissions for executable errors. Kōbō does not launch browser login,
|
|
1632
|
+
install or update Vibe for you.
|
|
1633
|
+
|
|
1634
|
+
Model and thinking **Auto** retain native selection and send no override. Native
|
|
1635
|
+
model aliases, display names and model-specific thinking levels are discovered
|
|
1636
|
+
from Vibe for the selected project/workspace and permission mode. Settings without
|
|
1637
|
+
a project use the server user's home. Discovery creates and closes a native session
|
|
1638
|
+
without sending a prompt, contacting a provider or changing configuration. It uses
|
|
1639
|
+
short-lived child environment overrides, never model/thinking setters. Discovery
|
|
1640
|
+
results are cached for 30 seconds; failed discovery leaves Auto available and keeps
|
|
1641
|
+
explicit saved choices visible. Use Retry to request the options again.
|
|
1642
|
+
|
|
1643
|
+
**Explicit model or thinking selections may persist in native Vibe preferences**
|
|
1644
|
+
through Vibe's public ACP setters, including preferences used outside Kōbō. At each
|
|
1645
|
+
actual launch, Kōbō confirms native mode, model and thinking in that order before
|
|
1646
|
+
sending the prompt. Native profiles/admin policy remain authoritative; unavailable
|
|
1647
|
+
or overridden selections fail explicitly instead of falling back to Auto. Project
|
|
1648
|
+
preflight cannot guarantee a future worktree or resumed session has identical
|
|
1649
|
+
options, so launch validation remains mandatory. Thinking values are native values
|
|
1650
|
+
(e.g. `off`, `low`, `medium`, `high`, `max` when advertised); `none` and `xhigh` are
|
|
1651
|
+
not translated. Brainstorming has independent model/thinking choices. On return
|
|
1652
|
+
from a review, native saved-session thinking is retained separately from the
|
|
1653
|
+
workspace iteration settings. An Auto-model resume validates explicit thinking
|
|
1654
|
+
against the loaded session, not a new session using potentially different defaults.
|
|
1655
|
+
|
|
1656
|
+
New Vibe workspaces visibly default to **Interactive**. Only these native execution
|
|
1657
|
+
modes are offered:
|
|
1658
|
+
|
|
1659
|
+
| Kōbō mode | Native Vibe mode |
|
|
1660
|
+
|---|---|
|
|
1661
|
+
| `interactive` | `ask` |
|
|
1662
|
+
| `strict` | `accept-edits` |
|
|
1663
|
+
| `bypass` | `auto-approve` |
|
|
1664
|
+
|
|
1665
|
+
These are native approval modes, not a Kōbō sandbox. Native profiles and admin
|
|
1666
|
+
policy may change effective permissions. Plan/read-only launches are rejected before spawning or changing the workspace. Existing Plan
|
|
1667
|
+
choices require an explicit supported mode; they are never promoted automatically.
|
|
1668
|
+
The comparison feature remains **Claude Code versus Codex**.
|
|
1669
|
+
|
|
1670
|
+
Native tools, approval/question panels, managed tasks/memory/progress MCP, resume
|
|
1671
|
+
and whole-session Stop are supported. Messages wait in the normal queue until
|
|
1672
|
+
the native process closes, then resume the conversation. Live steering and
|
|
1673
|
+
**Send now** are unavailable while Vibe is busy, including forced immediate
|
|
1674
|
+
messages and external MCP sends; rejected sends are not silently queued.
|
|
1675
|
+
Account/quota controls, managed skills and sub-agent cards/individual stop are
|
|
1676
|
+
excluded. Native tools/skills remain Vibe's own configuration.
|
|
1677
|
+
|
|
1678
|
+
A manual handoff can target Vibe with a supported execution mode. For a Vibe
|
|
1679
|
+
source, disable **Generate a handoff with the current agent** and use the existing
|
|
1680
|
+
mission/history handoff: Vibe cannot run the restricted read-only summary launch.
|
|
1681
|
+
Vibe is available for manual and automatic final reviews. Manual reviews always
|
|
1682
|
+
start a fresh session, defaulting to Interactive independently of source permissions;
|
|
1683
|
+
Accept edits and Bypass remain explicit manual choices. Automatic final reviews
|
|
1684
|
+
always use Interactive and may pause for human approval. Review instructions forbid
|
|
1685
|
+
all modifications, but native permissions provide no guaranteed filesystem read-only
|
|
1686
|
+
enforcement. Kōbō memory and managed MCP remain read/report-only, including under
|
|
1687
|
+
Automatic memory mode; final-verdict and progress grants stay scoped. Explicit
|
|
1688
|
+
review model/thinking choices use the same native catalogue and persistence rules.
|
|
1689
|
+
Other supported engines can also review Vibe's work. Stop/transfer waits for actual
|
|
1690
|
+
native exit; an ACP close acknowledgement alone does not release the worktree.
|
|
1691
|
+
|
|
1692
|
+
On **2026-10-23, Linux x64, Node 26.12.1**, the installed 3.0.1 passed the real
|
|
1693
|
+
Kōbō adapter smoke using an isolated loopback provider and synthetic stdio MCP:
|
|
1694
|
+
permissions, question, all three modes with MCP, native resume without duplicated
|
|
1695
|
+
history, renewed MCP environment and managed-job cleanup after confirmed exit.
|
|
1696
|
+
This made no paid call. **Real-provider end-to-end compatibility remains unverified**;
|
|
1697
|
+
its separately opt-in scenario has not been run. Commands and exact limits are in
|
|
1698
|
+
[the compatibility record](./src/__tests__/fixtures/mistral-acp/README.md).
|
|
1699
|
+
|
|
1600
1700
|
### Switch Claude Code and Codex accounts with ccswap
|
|
1601
1701
|
|
|
1602
1702
|
The usage popover in the chat footer can show the current **managed account**
|
|
@@ -1658,7 +1758,7 @@ credential-directory environment. See [VPS account setup](./docs/vps-projects-an
|
|
|
1658
1758
|
|
|
1659
1759
|
### Permission modes
|
|
1660
1760
|
|
|
1661
|
-
Claude Code uses SDK permission modes; Codex uses sandbox and approval flags. These controls differ by engine. A Git worktree itself is not a security boundary.
|
|
1761
|
+
Claude Code uses SDK permission modes; Codex uses sandbox and approval flags; [Mistral Vibe](#mistral-vibe) uses native execution modes and excludes Plan. These controls differ by engine. A Git worktree itself is not a security boundary.
|
|
1662
1762
|
|
|
1663
1763
|
**Claude Code** (controlled via SDK options):
|
|
1664
1764
|
|
|
@@ -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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
[](https://www.npmjs.com/package/@loicngr/kobo)
|
|
6
6
|
[](./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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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;
|