mixdog 1.4.1 → 1.4.2

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 (326) hide show
  1. package/package.json +3 -2
  2. package/scripts/build-shipped-history.mjs +115 -33
  3. package/scripts/gate-local.mjs +172 -61
  4. package/scripts/lib/gate-scheduler.mjs +138 -32
  5. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  6. package/scripts/lib/run-node-tests.mjs +54 -29
  7. package/scripts/lib/scoped-temp.mjs +1 -0
  8. package/scripts/lib/test-failure-records.mjs +14 -1
  9. package/scripts/lib/test-failure-summary.mjs +16 -4
  10. package/scripts/lib/test-spawn-ledger.mjs +12 -3
  11. package/scripts/pptx-kit-index.mjs +5 -6
  12. package/scripts/suite-health.mjs +110 -28
  13. package/scripts/test.mjs +9 -14
  14. package/src/agents/advisor/AGENT.md +4 -4
  15. package/src/agents/advisor/agent.json +1 -1
  16. package/src/agents/explore/AGENT.md +22 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/cli.mjs +7 -0
  19. package/src/defaults/agents.json +7 -0
  20. package/src/defaults/shipped-history.json +18 -2
  21. package/src/defaults/skills/browser-use/SKILL.md +4 -1
  22. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  23. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  24. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  25. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  26. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  27. package/src/defaults/skills/computer-use/SKILL.md +12 -2
  28. package/src/defaults/skills/goal-management/SKILL.md +1 -1
  29. package/src/defaults/skills/setup/references/actions.md +12 -6
  30. package/src/defaults/skills/setup/references/surfaces.md +2 -2
  31. package/src/defaults/skills/setup-guide/SKILL.md +5 -2
  32. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  33. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  34. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  35. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  36. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  37. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  38. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  39. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  40. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  41. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  42. package/src/defaults/skills/visualize/SKILL.md +6 -2
  43. package/src/lib/rules-builder.cjs +6 -30
  44. package/src/rules/lead/LEAD.md +3 -3
  45. package/src/rules/shared/20-research.md +3 -6
  46. package/src/rules/shared/40-editing.md +1 -0
  47. package/src/rules/shared/60-verification.md +10 -9
  48. package/src/rules/shared/70-delivery.md +4 -3
  49. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  50. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -1
  51. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +130 -21
  52. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -0
  53. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  54. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  55. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
  56. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
  57. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  58. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +122 -12
  59. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +5 -3
  60. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +13 -2
  61. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +152 -58
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +51 -18
  63. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
  64. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
  65. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
  66. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
  67. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  69. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  70. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  71. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  73. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  74. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  75. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  76. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  77. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  78. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  79. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  80. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
  81. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  82. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  83. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  84. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  85. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  86. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
  88. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
  89. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
  90. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  91. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  92. package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
  93. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  94. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  95. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  96. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +567 -0
  97. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
  98. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +2 -1
  99. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  100. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -0
  101. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +14 -5
  102. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  103. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  104. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  105. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
  106. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +3 -3
  107. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +10 -5
  108. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +5 -5
  109. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
  110. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  111. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -6
  112. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
  113. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +21 -2
  114. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +2 -0
  115. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  116. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  117. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +50 -28
  118. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
  119. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +3 -4
  120. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
  121. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +7 -0
  122. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  123. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +25 -14
  124. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +17 -14
  125. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  126. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  127. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -3
  128. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +47 -29
  129. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  130. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +11 -5
  131. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
  132. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
  133. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  134. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +164 -4
  135. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  136. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  137. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +36 -26
  138. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +3 -5
  139. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  140. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  141. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +96 -20
  142. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  143. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  144. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  145. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  146. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +103 -13
  147. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  148. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  149. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  150. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +34 -10
  151. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
  152. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  153. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -2
  154. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  155. package/src/runtime/channels/lib/whisper-port.mjs +19 -10
  156. package/src/runtime/channels/lib/whisper-server.mjs +10 -1
  157. package/src/runtime/connectors/connector-accounts-mcp.mjs +236 -103
  158. package/src/runtime/connectors/gmail-app-password.mjs +3 -3
  159. package/src/runtime/explore/explorer.mjs +93 -0
  160. package/src/runtime/explore/tool-defs.mjs +35 -0
  161. package/src/runtime/explore/tool.mjs +123 -0
  162. package/src/runtime/memory/index.mjs +4 -0
  163. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  164. package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
  165. package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
  166. package/src/runtime/shared/agent-route-config.mjs +17 -2
  167. package/src/runtime/shared/atomic-file.mjs +103 -2
  168. package/src/runtime/shared/background-tasks.mjs +15 -6
  169. package/src/runtime/shared/connector-accounts.mjs +5 -5
  170. package/src/runtime/shared/connector-catalog.d.mts +11 -4
  171. package/src/runtime/shared/connector-catalog.mjs +60 -52
  172. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  173. package/src/runtime/shared/file-has-data.mjs +26 -2
  174. package/src/runtime/shared/file-lock.mjs +13 -15
  175. package/src/runtime/shared/git-launch.d.mts +9 -0
  176. package/src/runtime/shared/git-launch.mjs +213 -0
  177. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  178. package/src/runtime/shared/llm/cost.mjs +6 -1
  179. package/src/runtime/shared/llm/http-agent.mjs +313 -29
  180. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  181. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  182. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  183. package/src/runtime/shared/llm/system-proxy.mjs +452 -0
  184. package/src/runtime/shared/provider-accounts.mjs +52 -2
  185. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  186. package/src/runtime/shared/staged-update.mjs +47 -2
  187. package/src/runtime/shared/tool-surface.mjs +110 -36
  188. package/src/runtime/shared/tool-work-units.mjs +4 -0
  189. package/src/runtime/shared/turn-worktree-snapshot.mjs +414 -54
  190. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  191. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  192. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  193. package/src/runtime/shared/worktrees/branch-management.mjs +9 -3
  194. package/src/runtime/shared/worktrees/git.mjs +57 -0
  195. package/src/runtime/shared/worktrees/manager.mjs +205 -137
  196. package/src/runtime/tidy/install.mjs +95 -15
  197. package/src/runtime/tidy/languages.mjs +17 -15
  198. package/src/runtime/tidy/process.mjs +7 -4
  199. package/src/runtime/tidy/resolve.mjs +19 -16
  200. package/src/runtime/tidy/runners/biome.mjs +3 -3
  201. package/src/runtime/tidy/tool.mjs +1 -1
  202. package/src/runtime/tidy/worktree.mjs +10 -6
  203. package/src/runtime/visualize-bridge/client.mjs +4 -1
  204. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  205. package/src/runtime/web-search/index.mjs +1 -1
  206. package/src/session-runtime/agent-task-sessions.mjs +410 -353
  207. package/src/session-runtime/boot/tools.mjs +2 -0
  208. package/src/session-runtime/bot-status.mjs +103 -103
  209. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  210. package/src/session-runtime/conversation-import/discovery.mjs +159 -40
  211. package/src/session-runtime/conversation-import/service.mjs +9 -3
  212. package/src/session-runtime/handoff-attachments.mjs +1 -1
  213. package/src/session-runtime/held-requests.mjs +3 -1
  214. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -0
  215. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  216. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +143 -116
  217. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -1
  218. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  219. package/src/session-runtime/mcp-glue/server-catalog.mjs +16 -10
  220. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  221. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  222. package/src/session-runtime/provider-auth/login.mjs +2 -2
  223. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  224. package/src/session-runtime/resource-mcp-connector-accounts.mjs +44 -31
  225. package/src/session-runtime/resource-mcp-secrets.mjs +28 -11
  226. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  227. package/src/session-runtime/services/agent-tool/send-flow.mjs +10 -2
  228. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  229. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +4 -1
  230. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  231. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  232. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  233. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  234. package/src/session-runtime/services/plugin-admin.mjs +10 -6
  235. package/src/session-runtime/services/provider-admin.mjs +281 -10
  236. package/src/session-runtime/session-turn-api.mjs +2 -0
  237. package/src/session-runtime/settings-builtin-tools-api.mjs +4 -1
  238. package/src/session-runtime/settings-system-api.mjs +1 -1
  239. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  240. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  241. package/src/session-runtime/setup-tool/executor.mjs +6 -2
  242. package/src/session-runtime/setup-tool/tool-defs.mjs +2 -1
  243. package/src/session-runtime/turn/agent-ops.mjs +23 -0
  244. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +49 -11
  245. package/src/session-runtime/workflow-agents-api/agent-route.mjs +10 -1
  246. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  247. package/src/session-runtime/workspace/session-view.mjs +149 -0
  248. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  249. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  250. package/src/session-runtime/workspace/transitions.mjs +108 -1066
  251. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  252. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  253. package/src/session-runtime/workspace/worktree-maintenance.mjs +80 -0
  254. package/src/session-runtime/workspace/worktree-setup.mjs +85 -0
  255. package/src/session-runtime/workspace/worktree-tool.mjs +54 -54
  256. package/src/standalone/daemon-desktop-runtime.mjs +2 -0
  257. package/src/standalone/daemon-session-control.mjs +151 -136
  258. package/src/standalone/daemon.mjs +7 -0
  259. package/src/standalone/desktop-service-registry.mjs +9 -0
  260. package/src/standalone/local-session-runtime.mjs +5 -1
  261. package/src/standalone/session-client/daemon-unavailable.mjs +3 -0
  262. package/src/standalone/session-client.mjs +5 -1
  263. package/src/standalone/session-frame-stream.mjs +83 -11
  264. package/src/standalone/session-protocol.mjs +4 -0
  265. package/src/standalone/session-service/agent-tree.mjs +45 -9
  266. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  267. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  268. package/src/standalone/session-service/stored-reader.mjs +127 -40
  269. package/src/tui/App.jsx +154 -164
  270. package/src/tui/app/app-view/floating-panel.jsx +3 -0
  271. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  272. package/src/tui/app/clipboard.mjs +21 -10
  273. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  274. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  275. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  276. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  277. package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
  278. package/src/tui/app/provider-setup-picker.mjs +20 -13
  279. package/src/tui/app/shell-layout/row-budgets.mjs +12 -10
  280. package/src/tui/app/slash-commands.mjs +1 -0
  281. package/src/tui/app/slash-dispatch/session-commands.mjs +46 -0
  282. package/src/tui/app/slash-dispatch.mjs +1 -1
  283. package/src/tui/app/use-btw-panel.mjs +29 -0
  284. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  285. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  286. package/src/tui/app/use-mouse-input.mjs +11 -0
  287. package/src/tui/app/use-onboarding-start.mjs +8 -3
  288. package/src/tui/app/use-panel-transition.mjs +10 -1
  289. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  290. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  291. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  292. package/src/tui/app/use-prompt-queue-history.mjs +3 -2
  293. package/src/tui/app/use-selection-focus.mjs +11 -2
  294. package/src/tui/app/use-selection-geometry.mjs +18 -9
  295. package/src/tui/app/use-selection-paint.mjs +4 -4
  296. package/src/tui/app/use-selection-stitch.mjs +3 -3
  297. package/src/tui/app/use-slash-palette.mjs +62 -0
  298. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  299. package/src/tui/app/use-transcript-activity.mjs +47 -32
  300. package/src/tui/app/use-transcript-follow.mjs +12 -4
  301. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  302. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  303. package/src/tui/app/use-transcript-window/geometry.mjs +19 -5
  304. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  305. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  306. package/src/tui/app/use-transcript-window.mjs +21 -11
  307. package/src/tui/app/use-tui-ready.mjs +18 -0
  308. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  309. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  310. package/src/tui/components/Picker.jsx +27 -3
  311. package/src/tui/components/SignInUrl.jsx +68 -0
  312. package/src/tui/components/TextEntryPanel.jsx +76 -46
  313. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  314. package/src/tui/dist/index.mjs +1896 -1341
  315. package/src/tui/session/goal-turn-state.mjs +6 -2
  316. package/src/tui/session/session-api/controls.mjs +4 -0
  317. package/src/tui/session/session-api/extensions.mjs +8 -0
  318. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  319. package/src/tui/session/session-api/intake.mjs +2 -0
  320. package/src/tui/session/session-api/integrations.mjs +2 -2
  321. package/src/tui/session/session-api/routes-agent-definitions.mjs +1 -0
  322. package/src/tui/session/session-api/settings.mjs +2 -2
  323. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  324. package/src/tui/session/transcript-spill.mjs +92 -4
  325. package/src/tui/session/transcript-store.mjs +2 -0
  326. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
@@ -22,6 +22,7 @@ import { TOOL_DEFS as OFFICE_TOOL_DEFS } from '../../runtime/office/tool-defs.mj
22
22
  import { TOOL_DEFS as MEDIA_TOOL_DEFS } from '../../runtime/media/tool-defs.mjs';
23
23
  import { TOOL_DEFS as TIDY_TOOL_DEFS } from '../../runtime/tidy/tool-defs.mjs';
24
24
  import { TOOL_DEFS as VISUALIZE_BRIDGE_TOOL_DEFS } from '../../runtime/visualize-bridge/tool-defs.mjs';
25
+ import { TOOL_DEFS as EXPLORE_TOOL_DEFS } from '../../runtime/explore/tool-defs.mjs';
25
26
  import {
26
27
  ASK_USER_TOOL_DEFS,
27
28
  HANDOFF_USER_TOOL_DEFS,
@@ -172,6 +173,7 @@ function wireToolSurface(boot) {
172
173
  mediaToolDefs: MEDIA_TOOL_DEFS,
173
174
  tidyToolDefs: TIDY_TOOL_DEFS,
174
175
  visualizeToolDefs: VISUALIZE_BRIDGE_TOOL_DEFS,
176
+ exploreToolDefs: EXPLORE_TOOL_DEFS,
175
177
  setupToolDefs: SETUP_TOOL_DEFS,
176
178
  askUserToolDefs: ASK_USER_TOOL_DEFS,
177
179
  handoffUserToolDefs: HANDOFF_USER_TOOL_DEFS,
@@ -204,6 +204,109 @@ function routineDetail(routine, now) {
204
204
  return cut(`${routine.kind} ${quotedText(routine.name, 64)}: ${parts.join(', ')}`, 240);
205
205
  }
206
206
 
207
+ /** Everything known about one bot, from the gathered state. */
208
+ function botState(bot, ctx) {
209
+ const homeId = agentHomeSessionId(bot.id);
210
+ const owned = ctx.owned.get(bot.id) || [];
211
+ const home = ctx.rows.get(homeId) || null;
212
+ // Work this bot sent that is running now: a session working with the bot's
213
+ // send in flight (`handedBy`, bot-owned-work.mjs). A turn the user typed
214
+ // in the bot's task session is the user's, not the bot working.
215
+ const sentWork = (row) => isWorking(row) && row.handedBy?.includes(bot.id);
216
+ // Running task sessions: a turn whose report is still owed, or the bot's
217
+ // work running now.
218
+ const tasks = new Map();
219
+ const addTask = (id, title, at) => {
220
+ const known = tasks.get(id);
221
+ if (!known) tasks.set(id, { id, title, at });
222
+ else if (at && (!known.at || at < known.at)) known.at = at;
223
+ };
224
+ for (const watch of ctx.watches) {
225
+ if (watch.agentId !== bot.id || watch.target === 'session' || !watch.taskSessionId) continue;
226
+ addTask(watch.taskSessionId, watch.title, Number(watch.at) || 0);
227
+ }
228
+ for (const row of owned) {
229
+ if (row.id === homeId || roomMemberOfSession(row.id) || !sentWork(row)) continue;
230
+ addTask(row.id, row.title, Number(row.createdAt) || 0);
231
+ }
232
+ const running = [...tasks.values()].sort((left, right) => left.at - right.at || (left.id < right.id ? -1 : 1));
233
+ const held = ctx.held.filter((entry) => entry.agentId === bot.id);
234
+ const approvals = held.length + [homeId, ...running.map((task) => task.id)].filter(ctx.awaitingApproval).length;
235
+ const routines = ctx.routines.rows
236
+ .filter((routine) => (routine.owner || MIXY_AGENT_ID) === bot.id)
237
+ .sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
238
+ const flags = [];
239
+ if (approvals) flags.push(`${plural(approvals, 'approval')} waiting`);
240
+ for (const routine of routines) {
241
+ const trouble = routineTrouble(routine);
242
+ if (trouble.length) flags.push(`${quotedText(routine.name, 20)} ${trouble.join(', ')}`);
243
+ }
244
+ if (bot.disabled) flags.push('disabled');
245
+ return {
246
+ bot,
247
+ homeId,
248
+ home,
249
+ owned,
250
+ running,
251
+ held,
252
+ approvals,
253
+ routines,
254
+ flags,
255
+ working: isWorking(home) || running.some((task) => sentWork(ctx.rows.get(task.id))),
256
+ lastAt: activityOf(home),
257
+ };
258
+ }
259
+
260
+ function botLine(state, now) {
261
+ const { bot } = state;
262
+ const parts = [`${quotedText(bot.name, 40)} (${bot.id})`, `chat ${state.homeId}`];
263
+ if (bot.self) parts.push('you');
264
+ parts.push(state.working ? 'working' : 'idle');
265
+ if (state.flags.length) parts.push(`attention: ${state.flags.join('; ')}`);
266
+ parts.push(state.lastAt ? `last ${ago(state.lastAt, now)}` : 'no chat yet');
267
+ if (state.running.length) {
268
+ const [first] = state.running;
269
+ const more = state.running.length > 1 ? ` +${state.running.length - 1}` : '';
270
+ const count = state.running.length > 1 ? `${state.running.length} tasks:` : 'task';
271
+ parts.push(`${count} "${quotedText(first.title, 24)}"${first.at ? ` ${span(now - first.at)}` : ''}${more}`);
272
+ }
273
+ if (state.routines.length) {
274
+ const next = state.routines
275
+ .filter((routine) => routine.enabled !== false && epoch(routine.nextFireAt))
276
+ .sort((left, right) => epoch(left.nextFireAt) - epoch(right.nextFireAt))[0];
277
+ parts.push(
278
+ `${plural(state.routines.length, 'routine')}${next ? `, next ${quotedText(next.name, 20)} ${until(epoch(next.nextFireAt), now)}` : ''}`
279
+ );
280
+ }
281
+ const fixed = parts.join(' · ');
282
+ const preview = oneLine(state.home?.lastMessagePreview || state.home?.preview);
283
+ const room = BOT_LINE_LIMIT - fixed.length - 5;
284
+ return cut(preview && room >= MIN_PREVIEW ? `${fixed} · "${quotedText(preview, room)}"` : fixed, BOT_LINE_LIMIT);
285
+ }
286
+
287
+ const mixyBot = (ctx) => ({ id: MIXY_AGENT_ID, name: ctx.mixy, self: true });
288
+
289
+ /** The bots the caller sees: every bot then Mixy when she has something to
290
+ * show, or just the caller's own bot. */
291
+ function visibleStates(ctx) {
292
+ if (ctx.own) {
293
+ const bot = ctx.own === MIXY_AGENT_ID ? mixyBot(ctx) : ctx.bots[0];
294
+ return bot ? [botState(bot, ctx)] : [];
295
+ }
296
+ const states = ctx.bots
297
+ .map((bot) => botState(bot, ctx))
298
+ .sort(
299
+ (left, right) =>
300
+ Number(right.flags.length > 0) - Number(left.flags.length > 0) ||
301
+ Number(right.working) - Number(left.working) ||
302
+ right.lastAt - left.lastAt ||
303
+ (left.bot.id < right.bot.id ? -1 : 1)
304
+ );
305
+ const mixy = botState(mixyBot(ctx), ctx);
306
+ if (mixy.routines.length || mixy.running.length || mixy.approvals) states.push(mixy);
307
+ return states;
308
+ }
309
+
207
310
  export function createBotStatus({
208
311
  getSessionService,
209
312
  listBots = defaultListBots,
@@ -260,109 +363,6 @@ export function createBotStatus({
260
363
  };
261
364
  }
262
365
 
263
- /** Everything known about one bot, from the gathered state. */
264
- function botState(bot, ctx) {
265
- const homeId = agentHomeSessionId(bot.id);
266
- const owned = ctx.owned.get(bot.id) || [];
267
- const home = ctx.rows.get(homeId) || null;
268
- // Work this bot sent that is running now: a session working with the bot's
269
- // send in flight (`handedBy`, bot-owned-work.mjs). A turn the user typed
270
- // in the bot's task session is the user's, not the bot working.
271
- const sentWork = (row) => isWorking(row) && row.handedBy?.includes(bot.id) === true;
272
- // Running task sessions: a turn whose report is still owed, or the bot's
273
- // work running now.
274
- const tasks = new Map();
275
- const addTask = (id, title, at) => {
276
- const known = tasks.get(id);
277
- if (!known) tasks.set(id, { id, title, at });
278
- else if (at && (!known.at || at < known.at)) known.at = at;
279
- };
280
- for (const watch of ctx.watches) {
281
- if (watch.agentId !== bot.id || watch.target === 'session' || !watch.taskSessionId) continue;
282
- addTask(watch.taskSessionId, watch.title, Number(watch.at) || 0);
283
- }
284
- for (const row of owned) {
285
- if (row.id === homeId || roomMemberOfSession(row.id) || !sentWork(row)) continue;
286
- addTask(row.id, row.title, Number(row.createdAt) || 0);
287
- }
288
- const running = [...tasks.values()].sort((left, right) => left.at - right.at || (left.id < right.id ? -1 : 1));
289
- const held = ctx.held.filter((entry) => entry.agentId === bot.id);
290
- const approvals = held.length + [homeId, ...running.map((task) => task.id)].filter(ctx.awaitingApproval).length;
291
- const routines = ctx.routines.rows
292
- .filter((routine) => (routine.owner || MIXY_AGENT_ID) === bot.id)
293
- .sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
294
- const flags = [];
295
- if (approvals) flags.push(`${plural(approvals, 'approval')} waiting`);
296
- for (const routine of routines) {
297
- const trouble = routineTrouble(routine);
298
- if (trouble.length) flags.push(`${quotedText(routine.name, 20)} ${trouble.join(', ')}`);
299
- }
300
- if (bot.disabled) flags.push('disabled');
301
- return {
302
- bot,
303
- homeId,
304
- home,
305
- owned,
306
- running,
307
- held,
308
- approvals,
309
- routines,
310
- flags,
311
- working: isWorking(home) || running.some((task) => sentWork(ctx.rows.get(task.id))),
312
- lastAt: activityOf(home),
313
- };
314
- }
315
-
316
- function botLine(state, now) {
317
- const { bot } = state;
318
- const parts = [`${quotedText(bot.name, 40)} (${bot.id})`, `chat ${state.homeId}`];
319
- if (bot.self) parts.push('you');
320
- parts.push(state.working ? 'working' : 'idle');
321
- if (state.flags.length) parts.push(`attention: ${state.flags.join('; ')}`);
322
- parts.push(state.lastAt ? `last ${ago(state.lastAt, now)}` : 'no chat yet');
323
- if (state.running.length) {
324
- const [first] = state.running;
325
- const more = state.running.length > 1 ? ` +${state.running.length - 1}` : '';
326
- const count = state.running.length > 1 ? `${state.running.length} tasks:` : 'task';
327
- parts.push(`${count} "${quotedText(first.title, 24)}"${first.at ? ` ${span(now - first.at)}` : ''}${more}`);
328
- }
329
- if (state.routines.length) {
330
- const next = state.routines
331
- .filter((routine) => routine.enabled !== false && epoch(routine.nextFireAt))
332
- .sort((left, right) => epoch(left.nextFireAt) - epoch(right.nextFireAt))[0];
333
- parts.push(
334
- `${plural(state.routines.length, 'routine')}${next ? `, next ${quotedText(next.name, 20)} ${until(epoch(next.nextFireAt), now)}` : ''}`
335
- );
336
- }
337
- const fixed = parts.join(' · ');
338
- const preview = oneLine(state.home?.lastMessagePreview || state.home?.preview);
339
- const room = BOT_LINE_LIMIT - fixed.length - 5;
340
- return cut(preview && room >= MIN_PREVIEW ? `${fixed} · "${quotedText(preview, room)}"` : fixed, BOT_LINE_LIMIT);
341
- }
342
-
343
- const mixyBot = (ctx) => ({ id: MIXY_AGENT_ID, name: ctx.mixy, self: true });
344
-
345
- /** The bots the caller sees: every bot then Mixy when she has something to
346
- * show, or just the caller's own bot. */
347
- function visibleStates(ctx) {
348
- if (ctx.own) {
349
- const bot = ctx.own === MIXY_AGENT_ID ? mixyBot(ctx) : ctx.bots[0];
350
- return bot ? [botState(bot, ctx)] : [];
351
- }
352
- const states = ctx.bots
353
- .map((bot) => botState(bot, ctx))
354
- .sort(
355
- (left, right) =>
356
- Number(right.flags.length > 0) - Number(left.flags.length > 0) ||
357
- Number(right.working) - Number(left.working) ||
358
- right.lastAt - left.lastAt ||
359
- (left.bot.id < right.bot.id ? -1 : 1)
360
- );
361
- const mixy = botState(mixyBot(ctx), ctx);
362
- if (mixy.routines.length || mixy.running.length || mixy.approvals) states.push(mixy);
363
- return states;
364
- }
365
-
366
366
  async function overview(own) {
367
367
  const ctx = await gather(own);
368
368
  const states = visibleStates(ctx);
@@ -1,6 +1,6 @@
1
- // After the multi-account connector merge (connector-catalog.mjs
2
- // mergeConnectorAccountServers) `gmail-2`, `google-calendar-2`… are accounts of
3
- // one server, no longer servers. Every store of ours that keys a setting by
1
+ // After the connector merge (connector-catalog.mjs mergeConnectorAccountServers)
2
+ // `gmail-2`, `notion-2`, `postgres-2`… are accounts of their connector's one
3
+ // server, no longer servers. Every store of ours that keys a setting by
4
4
  // MCP server name must name the surviving server instead:
5
5
  // agents/<id>/agent.json, bots/<id>/agent.json connectors.off / connectors.tools
6
6
  // (a legacy allow list too)
@@ -11,14 +11,15 @@
11
11
  // name models, not servers.) Project and plugin hook files are the user's or
12
12
  // the plugin's own and are never rewritten here.
13
13
  //
14
- // Rule: the merged connector is OFF for an agent/project only when EVERY
15
- // merged server was off (the same rule as the merged server's `enabled`: one
16
- // working account keeps the connector usable). Per-tool permissions move to
17
- // the surviving name; where two merged servers disagree on a tool the MORE
18
- // PERMISSIVE permission wins, as "on beats off" does at server level. Entries
19
- // of a server that was off are dormant and are dropped when the connector
20
- // stays on, so they never become live. A setting that names no merged-away
21
- // server is never touched, which makes every run after the first a no-op.
14
+ // Rule: differences are ignored and the topmost server decides. The merged
15
+ // connector is on or off for an agent/project as the surviving server was
16
+ // there when the setting names it, else as the lowest-numbered merged server
17
+ // it names (so a switched-off `-N` server never becomes reachable through the
18
+ // merge). Per-tool permissions move to the surviving name; where merged
19
+ // servers disagree on a tool the surviving server's own entry wins, else the
20
+ // first merged server's. Entries of a server that was off are dormant and
21
+ // dropped when the connector stays on. A setting that names no merged-away
22
+ // server is never touched, so every run after the first is a no-op.
22
23
  //
23
24
  // The merge is saved to the config once, so the rename mapping outlives it:
24
25
  // `<data>/connector-merge-pending.json` ({ merged: [{ name, from }] }) is
@@ -35,7 +36,6 @@ import { readdirSync, readFileSync, rmSync } from 'node:fs';
35
36
  import { join } from 'node:path';
36
37
  import { normalizeRules, standardConfigReport } from './services/hook-bus/config.mjs';
37
38
  import {
38
- PERMISSION_RANK,
39
39
  PROJECT_CONNECTORS_FILE,
40
40
  connectorEnabled,
41
41
  parseConnectorPolicy,
@@ -56,7 +56,8 @@ function mapMergedConnectorPolicy(policy, merged) {
56
56
  current.off.includes(server) || current.allow?.includes(server) || Object.hasOwn(current.tools, server);
57
57
  if (!gone.some(named)) continue;
58
58
  const live = from.filter((server) => connectorEnabled(current, server));
59
- const on = live.length > 0;
59
+ // `from` lists the surviving server first, then the others lowest-numbered first.
60
+ const on = connectorEnabled(current, from.find(named));
60
61
  const off = current.off.filter((server) => !from.includes(server));
61
62
  const allow = current.allow?.filter((server) => !from.includes(server));
62
63
  if (allow && on) allow.push(name);
@@ -64,9 +65,11 @@ function mapMergedConnectorPolicy(policy, merged) {
64
65
  const tools = { ...current.tools };
65
66
  for (const server of from) delete tools[server];
66
67
  const moved = {};
67
- for (const server of on ? live : from) {
68
+ const sources = on ? live : from;
69
+ for (const server of [name, ...sources.filter((id) => id !== name)]) {
70
+ if (!sources.includes(server)) continue;
68
71
  for (const [tool, permission] of Object.entries(current.tools[server] || {})) {
69
- if (!(tool in moved) || PERMISSION_RANK[permission] > PERMISSION_RANK[moved[tool]]) moved[tool] = permission;
72
+ if (!(tool in moved)) moved[tool] = permission;
70
73
  }
71
74
  }
72
75
  if (Object.keys(moved).length) tools[name] = moved;