mixdog 1.3.1 → 1.3.3

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 (468) hide show
  1. package/README.md +8 -4
  2. package/package.json +8 -8
  3. package/scripts/native-release-status.mjs +238 -0
  4. package/scripts/verify-runtime-dependency-versions.mjs +158 -0
  5. package/src/agents/reviewer/AGENT.md +5 -7
  6. package/src/agents/reviewer/agent.json +1 -1
  7. package/src/defaults/shipped-history.json +9 -1
  8. package/src/defaults/skills/browser-use/SKILL.md +6 -3
  9. package/src/defaults/skills/local-provider/SKILL.md +33 -6
  10. package/src/defaults/skills/pptx/scripts/qc-pages.mjs +3 -2
  11. package/src/defaults/skills/setup/SKILL.md +23 -1
  12. package/src/defaults/skills/setup/references/actions.md +50 -3
  13. package/src/defaults/skills/setup/references/surfaces.md +23 -3
  14. package/src/defaults/skills/setup-guide/SKILL.md +7 -3
  15. package/src/defaults/skills/visualize/SKILL.md +9 -6
  16. package/src/defaults/skills/visualize/references/craft.md +8 -1
  17. package/src/help.mjs +1 -1
  18. package/src/lib/keychain-cjs.cjs +4 -1
  19. package/src/lib/rules-builder.cjs +14 -7
  20. package/src/rules/agent-mode/AGENT_MODE.md +8 -5
  21. package/src/rules/agent-mode/MIXY.md +6 -8
  22. package/src/rules/lead/LEAD.md +7 -10
  23. package/src/rules/shared/10-tool-workflow.md +4 -0
  24. package/src/rules/shared/20-research.md +2 -0
  25. package/src/rules/shared/45-destructive.md +5 -1
  26. package/src/rules/shared/60-verification.md +6 -4
  27. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +5 -0
  28. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +8 -0
  29. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -1
  30. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +114 -26
  31. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +8 -0
  32. package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +5 -4
  33. package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -0
  34. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +4 -0
  35. package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
  36. package/src/runtime/agent/orchestrator/config-storage.mjs +10 -3
  37. package/src/runtime/agent/orchestrator/config.mjs +11 -0
  38. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -2
  39. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +97 -5
  40. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +6 -10
  41. package/src/runtime/agent/orchestrator/mcp/client.mjs +7 -4
  42. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +84 -32
  43. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +38 -11
  44. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +15 -3
  45. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +1 -1
  46. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  47. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +84 -42
  48. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -0
  49. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +14 -1
  50. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +6 -2
  51. package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +27 -8
  52. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  53. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +31 -4
  54. package/src/runtime/agent/orchestrator/providers/cursor.mjs +4 -1
  55. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +14 -1
  56. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +11 -8
  57. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  58. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -0
  59. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +16 -0
  60. package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +13 -0
  61. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -1
  62. package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +3 -1
  63. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +1 -0
  64. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +5 -5
  65. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +9 -5
  66. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +9 -1
  67. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +2 -1
  68. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +30 -3
  69. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +1 -1
  70. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +3 -1
  71. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +61 -8
  72. package/src/runtime/agent/orchestrator/providers/registry.mjs +19 -0
  73. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +13 -1
  74. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +90 -24
  75. package/src/runtime/agent/orchestrator/runtime-core/fs-utils.mjs +8 -1
  76. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +1 -1
  77. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +5 -0
  78. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +68 -22
  79. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +10 -1
  81. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +4 -6
  82. package/src/runtime/agent/orchestrator/runtime-core/route-context-state.mjs +81 -0
  83. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -1
  84. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +52 -6
  85. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +35 -13
  86. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +7 -6
  87. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/runtime-core/workflow/packs.mjs +8 -4
  89. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +8 -3
  90. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -1
  91. package/src/runtime/agent/orchestrator/session/agent-mode.mjs +0 -6
  92. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +1 -1
  93. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +22 -4
  94. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -2
  95. package/src/runtime/agent/orchestrator/session/agent-room.mjs +196 -45
  96. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +80 -0
  97. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  98. package/src/runtime/agent/orchestrator/session/compact/continuation.mjs +15 -6
  99. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +45 -19
  100. package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +3 -0
  101. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +44 -0
  102. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +185 -37
  103. package/src/runtime/agent/orchestrator/session/compact/summary-mode.mjs +16 -0
  104. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +87 -0
  105. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +2 -0
  106. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +6 -2
  107. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +4 -1
  108. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  109. package/src/runtime/agent/orchestrator/session/context-utils.mjs +41 -10
  110. package/src/runtime/agent/orchestrator/session/human-gate/delegation.mjs +240 -0
  111. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +102 -35
  112. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +20 -0
  113. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +19 -9
  114. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +73 -0
  115. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +55 -27
  116. package/src/runtime/agent/orchestrator/session/human-gate/unattended-port.mjs +15 -0
  117. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +4 -1
  118. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +199 -109
  119. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +5 -0
  120. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/continuation.mjs +2 -0
  121. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/empty-nudge.mjs +1 -1
  122. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +62 -13
  123. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +22 -6
  124. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +6 -2
  125. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +5 -5
  126. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +10 -0
  127. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -0
  128. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +33 -8
  129. package/src/runtime/agent/orchestrator/session/loop/tool-exec/call-prep.mjs +5 -0
  130. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +27 -0
  131. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -1
  132. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +12 -0
  133. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +11 -5
  134. package/src/runtime/agent/orchestrator/session/manager/agent-listing-notice.mjs +102 -0
  135. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +2 -0
  136. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +13 -1
  137. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +13 -2
  138. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +27 -14
  139. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +14 -0
  140. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  141. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +1 -0
  142. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +44 -18
  143. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +32 -1
  144. package/src/runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs +115 -0
  145. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +42 -0
  146. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +6 -0
  147. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +3 -9
  148. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +1 -1
  149. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +5 -3
  150. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +36 -0
  151. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +40 -1
  152. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +12 -0
  153. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +20 -0
  154. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +28 -9
  155. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +55 -27
  156. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +4 -9
  157. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +14 -1
  158. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +7 -3
  159. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +6 -15
  160. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +24 -8
  161. package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +94 -13
  162. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +52 -11
  163. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +21 -3
  164. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +18 -3
  165. package/src/runtime/agent/orchestrator/session/routine-result.mjs +126 -12
  166. package/src/runtime/agent/orchestrator/session/runtime-user-context.mjs +3 -1
  167. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +16 -3
  168. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +3 -1
  169. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +41 -7
  170. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +10 -2
  171. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +14 -2
  172. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +15 -1
  173. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +5 -4
  174. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +140 -0
  175. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +5 -0
  176. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +15 -5
  177. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +49 -1
  178. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +80 -1
  179. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +40 -5
  180. package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +47 -2
  181. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +33 -1
  182. package/src/runtime/agent/orchestrator/session/store-summary-visibility.d.mts +5 -0
  183. package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +37 -0
  184. package/src/runtime/agent/orchestrator/session/store.mjs +1 -0
  185. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +125 -0
  186. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +4 -0
  187. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +78 -43
  188. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +35 -5
  189. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +42 -2
  190. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +47 -14
  191. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +25 -5
  192. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +6 -3
  193. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +13 -14
  194. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/transport-artifacts.mjs +9 -0
  195. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +19 -14
  196. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -1
  197. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +127 -20
  198. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +557 -0
  199. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +10 -12
  200. package/src/runtime/agent/orchestrator/tools/builtin/pdf-test-fixtures.mjs +5 -3
  201. package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +4 -2
  202. package/src/runtime/agent/orchestrator/tools/builtin/read-single-media.mjs +47 -2
  203. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +264 -87
  204. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +10 -4
  205. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +42 -23
  206. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -4
  207. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +9 -30
  208. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +24 -12
  209. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +3 -2
  210. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -2
  211. package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +2 -1
  212. package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +4 -2
  213. package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +33 -2
  214. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +13 -13
  215. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -3
  216. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +3 -1
  217. package/src/runtime/attachments/attachment-reference.mjs +155 -0
  218. package/src/runtime/attachments/legacy-office.mjs +110 -0
  219. package/src/runtime/attachments/limits.mjs +5 -1
  220. package/src/runtime/attachments/office-extract.mjs +3 -6
  221. package/src/runtime/attachments/pdf-extract.mjs +84 -10
  222. package/src/runtime/attachments/prompt-restore.mjs +70 -0
  223. package/src/runtime/attachments/store.mjs +109 -33
  224. package/src/runtime/browser-bridge/client.mjs +73 -20
  225. package/src/runtime/channels/lib/runtime-paths.mjs +1 -1
  226. package/src/runtime/channels/lib/scheduler.mjs +14 -7
  227. package/src/runtime/channels/lib/state-file.mjs +15 -15
  228. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +14 -13
  229. package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +22 -18
  230. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +14 -36
  231. package/src/runtime/channels/lib/worker-main.mjs +3 -2
  232. package/src/runtime/effort-judge/compact-tokenizer.mjs +8 -2
  233. package/src/runtime/effort-judge/judge-client.mjs +66 -16
  234. package/src/runtime/effort-judge/model-install.mjs +47 -7
  235. package/src/runtime/local-provider/asset-installer.mjs +10 -4
  236. package/src/runtime/local-provider/catalog.mjs +5 -2
  237. package/src/runtime/local-provider/registered-models.mjs +64 -27
  238. package/src/runtime/local-provider/server.mjs +2 -3
  239. package/src/runtime/media/adapters/image-api.mjs +89 -0
  240. package/src/runtime/media/auth.mjs +64 -1
  241. package/src/runtime/media/catalog.mjs +66 -4
  242. package/src/runtime/media/jobs.mjs +4 -0
  243. package/src/runtime/media/lanes.mjs +46 -5
  244. package/src/runtime/media/media-usage.mjs +17 -0
  245. package/src/runtime/media/renditions.mjs +15 -15
  246. package/src/runtime/media/store.mjs +36 -35
  247. package/src/runtime/media/tool.mjs +8 -1
  248. package/src/runtime/memory/lib/cycle-scheduler/health-ledger.mjs +8 -2
  249. package/src/runtime/memory/lib/embedding-model-files.mjs +30 -7
  250. package/src/runtime/memory/lib/ingest/transcript-tail.mjs +16 -7
  251. package/src/runtime/memory/lib/memory-chunk-quality.mjs +14 -2
  252. package/src/runtime/memory/lib/pg/process.mjs +8 -4
  253. package/src/runtime/memory/lib/project-id-resolver.mjs +5 -1
  254. package/src/runtime/memory/lib/runtime-fetcher.mjs +6 -1
  255. package/src/runtime/office/core/journal.mjs +7 -14
  256. package/src/runtime/office/design/library/design-library-core.mjs +4 -16
  257. package/src/runtime/office/pdf/ocr-engine-worker.mjs +37 -0
  258. package/src/runtime/office/pdf/ocr-engine.mjs +146 -0
  259. package/src/runtime/office/pdf/pdf-ocr.mjs +51 -21
  260. package/src/runtime/office/pdf/pdf-render.mjs +30 -18
  261. package/src/runtime/office/portable/ooxml-validator.mjs +2 -2
  262. package/src/runtime/office/portable/portable-soffice.mjs +135 -29
  263. package/src/runtime/shared/agent-avatar-sprites.mjs +23 -8
  264. package/src/runtime/shared/agent-avatar.mjs +3 -2
  265. package/src/runtime/shared/agent-kind-migration.mjs +200 -0
  266. package/src/runtime/shared/agent-message-envelope.d.mts +6 -0
  267. package/src/runtime/shared/agent-message-envelope.mjs +44 -0
  268. package/src/runtime/shared/agent-reap-state.d.mts +4 -0
  269. package/src/runtime/shared/agent-room-host.d.mts +31 -0
  270. package/src/runtime/shared/agent-room-host.mjs +58 -0
  271. package/src/runtime/shared/agent-store.mjs +24 -7
  272. package/src/runtime/shared/agent-task-starts.mjs +27 -0
  273. package/src/runtime/shared/atomic-file.d.mts +50 -0
  274. package/src/runtime/shared/atomic-file.mjs +394 -132
  275. package/src/runtime/shared/background-tasks.mjs +7 -4
  276. package/src/runtime/shared/bot-hops.mjs +35 -0
  277. package/src/runtime/shared/bot-split-migration.mjs +1 -1
  278. package/src/runtime/shared/bounded-download.mjs +4 -2
  279. package/src/runtime/shared/config.mjs +39 -9
  280. package/src/runtime/shared/defaults-separation.mjs +6 -2
  281. package/src/runtime/shared/delegated-approval-host.mjs +74 -0
  282. package/src/runtime/shared/err-text.mjs +4 -0
  283. package/src/runtime/shared/error-presentation.mjs +22 -4
  284. package/src/runtime/shared/file-has-data.mjs +28 -0
  285. package/src/runtime/shared/llm/usage-ledger-import.mjs +37 -18
  286. package/src/runtime/shared/pending-agent-work.mjs +54 -0
  287. package/src/runtime/shared/process-lifecycle.mjs +8 -12
  288. package/src/runtime/shared/projects.mjs +50 -41
  289. package/src/runtime/shared/provider-accounts.mjs +17 -12
  290. package/src/runtime/shared/redact-directories.mjs +18 -0
  291. package/src/runtime/shared/remove-directory.mjs +28 -0
  292. package/src/runtime/shared/routine-trigger.d.mts +6 -1
  293. package/src/runtime/shared/routine-trigger.mjs +14 -6
  294. package/src/runtime/shared/run-child.d.mts +3 -0
  295. package/src/runtime/shared/run-child.mjs +24 -3
  296. package/src/runtime/shared/session-baseline-store.mjs +8 -2
  297. package/src/runtime/shared/session-sidebar-host.d.mts +11 -2
  298. package/src/runtime/shared/session-sidebar-host.mjs +16 -3
  299. package/src/runtime/shared/singleton-owner.mjs +7 -6
  300. package/src/runtime/shared/skill-tool-dependencies.mjs +4 -10
  301. package/src/runtime/shared/staged-update.mjs +4 -2
  302. package/src/runtime/shared/statusline/statusline-segments.mjs +4 -15
  303. package/src/runtime/shared/tool-execution-contract.mjs +10 -0
  304. package/src/runtime/shared/tool-work-units.mjs +12 -9
  305. package/src/runtime/shared/transcript-metadata.mjs +28 -3
  306. package/src/runtime/shared/transcript-writer/session-record.mjs +7 -6
  307. package/src/runtime/shared/turn-snapshot-store.mjs +5 -4
  308. package/src/runtime/shared/turn-snapshot.mjs +277 -124
  309. package/src/runtime/shared/user-cwd.mjs +9 -4
  310. package/src/runtime/shared/user-data-guard.mjs +92 -61
  311. package/src/runtime/shared/utf8-cut.mjs +10 -0
  312. package/src/runtime/shared/worktrees/activity-gate.mjs +251 -61
  313. package/src/runtime/shared/worktrees/contract.mjs +11 -3
  314. package/src/runtime/shared/worktrees/maintenance.mjs +11 -2
  315. package/src/runtime/shared/worktrees/manager.mjs +419 -52
  316. package/src/runtime/shared/worktrees/registry.mjs +29 -27
  317. package/src/runtime/shared/worktrees/tool-host.mjs +39 -0
  318. package/src/runtime/tidy/core-install.mjs +26 -4
  319. package/src/runtime/tidy/install.mjs +91 -23
  320. package/src/runtime/tidy/process.mjs +41 -8
  321. package/src/runtime/tidy/resolve.mjs +10 -7
  322. package/src/runtime/web-search/lib/config.mjs +4 -16
  323. package/src/session-runtime/agent-home-delivery.mjs +542 -204
  324. package/src/session-runtime/agent-profile-changes.mjs +16 -0
  325. package/src/session-runtime/agent-room-delivery.mjs +81 -35
  326. package/src/session-runtime/agent-task-sessions.mjs +811 -179
  327. package/src/session-runtime/agent-tool-routing.mjs +1 -0
  328. package/src/session-runtime/boot/apis.mjs +48 -24
  329. package/src/session-runtime/boot/config.mjs +1 -0
  330. package/src/session-runtime/boot/facade.mjs +16 -7
  331. package/src/session-runtime/boot/infrastructure.mjs +14 -2
  332. package/src/session-runtime/boot/providers.mjs +2 -2
  333. package/src/session-runtime/boot/shared.mjs +12 -6
  334. package/src/session-runtime/boot/tools.mjs +23 -3
  335. package/src/session-runtime/bot-status.mjs +432 -0
  336. package/src/session-runtime/config-lifecycle/lead-route-sync.mjs +29 -0
  337. package/src/session-runtime/config-lifecycle.mjs +60 -55
  338. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -4
  339. package/src/session-runtime/held-requests.mjs +31 -33
  340. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +10 -1
  341. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -2
  342. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +24 -26
  343. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  344. package/src/session-runtime/lifecycle/teardown.mjs +11 -3
  345. package/src/session-runtime/mcp-glue/connect.mjs +100 -186
  346. package/src/session-runtime/mcp-glue/initial-connect-gate.mjs +57 -0
  347. package/src/session-runtime/mcp-glue/server-connection.mjs +71 -0
  348. package/src/session-runtime/media-api.mjs +5 -2
  349. package/src/session-runtime/model-recency.mjs +1 -0
  350. package/src/session-runtime/model-route/route-tuning.mjs +4 -1
  351. package/src/session-runtime/model-route/set-route.mjs +61 -1
  352. package/src/session-runtime/owned-automation-run.mjs +8 -1
  353. package/src/session-runtime/provider-models/row-hydration.mjs +8 -1
  354. package/src/session-runtime/quick-model-rows/model-meta.mjs +2 -0
  355. package/src/session-runtime/quick-model-rows/provider-rows.mjs +7 -1
  356. package/src/session-runtime/route-resolution.mjs +16 -8
  357. package/src/session-runtime/route-state.mjs +1 -59
  358. package/src/session-runtime/routine-home-turn.mjs +5 -3
  359. package/src/session-runtime/runtime-bootstrap.mjs +5 -3
  360. package/src/session-runtime/runtime-paths.mjs +11 -5
  361. package/src/session-runtime/runtime-review-api.mjs +4 -1
  362. package/src/session-runtime/runtime-tunables.mjs +6 -0
  363. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +11 -2
  364. package/src/session-runtime/services/agent-tool/close-flow.mjs +4 -2
  365. package/src/session-runtime/services/agent-tool/execute-send.mjs +1 -0
  366. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +1 -0
  367. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +34 -19
  368. package/src/session-runtime/services/agent-tool/restart-notify.mjs +10 -0
  369. package/src/session-runtime/services/agent-tool/send-flow.mjs +25 -21
  370. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +7 -0
  371. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +6 -3
  372. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +8 -5
  373. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +22 -2
  374. package/src/session-runtime/services/agent-tool/worker-index.mjs +4 -6
  375. package/src/session-runtime/services/agent-tool.mjs +6 -0
  376. package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +1 -1
  377. package/src/session-runtime/services/daemon-crash-capture/retention.mjs +4 -3
  378. package/src/session-runtime/services/hook-bus/config-loader.mjs +14 -5
  379. package/src/session-runtime/services/hook-bus/rule-file.mjs +49 -11
  380. package/src/session-runtime/services/plugin-admin.mjs +26 -26
  381. package/src/session-runtime/services/provider-admin.mjs +26 -6
  382. package/src/session-runtime/services/schedule-access.mjs +33 -4
  383. package/src/session-runtime/services/seeds.mjs +4 -3
  384. package/src/session-runtime/services/usage-dashboard.mjs +1 -1
  385. package/src/session-runtime/services/usage-stats-model.mjs +2 -1
  386. package/src/session-runtime/services/worktree-access.mjs +27 -0
  387. package/src/session-runtime/session-create/materialize.mjs +2 -3
  388. package/src/session-runtime/session-create/session-options.mjs +15 -2
  389. package/src/session-runtime/session-hooks.mjs +9 -17
  390. package/src/session-runtime/settings-builtin-tools-api.mjs +65 -1
  391. package/src/session-runtime/settings-compaction-api.mjs +86 -39
  392. package/src/session-runtime/setup-tool/executor.mjs +12 -2
  393. package/src/session-runtime/setup-tool/settings-contract.mjs +34 -1
  394. package/src/session-runtime/setup-tool/tool-defs.mjs +20 -3
  395. package/src/session-runtime/skills-api.mjs +12 -5
  396. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +349 -0
  397. package/src/session-runtime/tool-policy/mode-switch.mjs +54 -0
  398. package/src/session-runtime/tool-policy/pending-switches.mjs +59 -0
  399. package/src/session-runtime/tool-policy/policy-stage.mjs +183 -0
  400. package/src/session-runtime/tool-policy/session-switches.mjs +169 -0
  401. package/src/session-runtime/tool-policy/surface-helpers.mjs +114 -0
  402. package/src/session-runtime/tool-policy/workflow-overlay.mjs +145 -0
  403. package/src/session-runtime/tool-policy-refresh.mjs +48 -369
  404. package/src/session-runtime/tool-surface.mjs +10 -4
  405. package/src/session-runtime/turn/session-ops.mjs +8 -0
  406. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +95 -88
  407. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  408. package/src/session-runtime/turn/turn-run.mjs +7 -2
  409. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +54 -7
  410. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +527 -333
  411. package/src/session-runtime/workflow-agents-api/agent-route.mjs +85 -63
  412. package/src/session-runtime/workflow-agents-api/shared.mjs +5 -1
  413. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +14 -1
  414. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -3
  415. package/src/session-runtime/workspace/transition-steps.mjs +1 -18
  416. package/src/session-runtime/workspace/transitions.mjs +279 -67
  417. package/src/session-runtime/workspace/workspace-state.mjs +7 -6
  418. package/src/session-runtime/workspace/worktree-tool.mjs +194 -0
  419. package/src/standalone/daemon-agent-control.mjs +4 -1
  420. package/src/standalone/daemon-lag-profiler.mjs +3 -1
  421. package/src/standalone/daemon-session-control.mjs +173 -15
  422. package/src/standalone/daemon-telemetry.mjs +9 -0
  423. package/src/standalone/daemon.mjs +33 -10
  424. package/src/standalone/local-session-runtime.mjs +33 -16
  425. package/src/standalone/session-client.mjs +7 -2
  426. package/src/standalone/session-protocol.mjs +8 -0
  427. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +2 -0
  428. package/src/standalone/session-service/agent-route-follow.mjs +69 -0
  429. package/src/standalone/session-service/session-calls/session-turns.mjs +33 -4
  430. package/src/standalone/session-service.mjs +21 -0
  431. package/src/standalone/session-state-projection.mjs +19 -9
  432. package/src/standalone/session-tool-output.mjs +36 -9
  433. package/src/standalone/staged-import.mjs +47 -0
  434. package/src/tui/App.jsx +2 -0
  435. package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +19 -13
  436. package/src/tui/app/message-selector.mjs +15 -2
  437. package/src/tui/app/model-options.mjs +16 -2
  438. package/src/tui/app/model-picker.mjs +2 -1
  439. package/src/tui/app/route-pickers.mjs +3 -1
  440. package/src/tui/app/settings-picker/settings-rows.mjs +2 -2
  441. package/src/tui/app/slash-commands.mjs +1 -1
  442. package/src/tui/app/usage-context-panels/context-model.mjs +8 -2
  443. package/src/tui/dist/index.mjs +617 -369
  444. package/src/tui/paste-attachments.mjs +0 -1
  445. package/src/tui/paste-text-policy.mjs +4 -5
  446. package/src/tui/prompt-history-store.mjs +16 -21
  447. package/src/tui/session/agent-job-feed/execution-delivery.mjs +4 -1
  448. package/src/tui/session/context-state.mjs +4 -0
  449. package/src/tui/session/notice-surface.mjs +3 -0
  450. package/src/tui/session/session-api/intake/abort.mjs +52 -18
  451. package/src/tui/session/session-api/intake/rewind.mjs +39 -4
  452. package/src/tui/session/session-api/media.mjs +2 -1
  453. package/src/tui/session/session-api/routes-agent-definitions.mjs +76 -0
  454. package/src/tui/session/session-api/routes-write.mjs +203 -0
  455. package/src/tui/session/session-api/routes.mjs +23 -247
  456. package/src/tui/session/session-api/settings.mjs +14 -1
  457. package/src/tui/session/session-flow/drain.mjs +28 -3
  458. package/src/tui/session/session-flow/failed-turn-rewind.mjs +4 -2
  459. package/src/tui/session/session-flow/queue/take-entries.mjs +8 -0
  460. package/src/tui/session/session-flow/steering.mjs +8 -3
  461. package/src/tui/session/tool-approval.mjs +142 -14
  462. package/src/tui/session/transcript-intake.mjs +2 -0
  463. package/src/tui/session/turn.mjs +23 -14
  464. package/src/tui/transcript-tool-failures.mjs +8 -2
  465. package/src/vendor/statusline/src/gateway/route-meta.mjs +7 -8
  466. package/src/vendor/statusline/src/gateway/session-routes.mjs +6 -7
  467. package/src/rules/agent-mode/ROUTINE.md +0 -6
  468. package/src/session-runtime/room-member-gate.mjs +0 -48
@@ -4,88 +4,20 @@
4
4
  * definitions, output style and orchestration mode.
5
5
  */
6
6
  import {
7
- modelSwitchItem,
7
+ orchestrationModeSwitchItem,
8
8
  workflowSwitchItem,
9
9
  } from '../../../runtime/agent/orchestrator/session/transcript-restore/restore.mjs';
10
- import { selectedModel } from '../../../session-runtime/model-route/model-switch-target.mjs';
10
+ import { createAgentDefinitionApi } from './routes-agent-definitions.mjs';
11
+ import { createRouteWrite } from './routes-write.mjs';
11
12
  import { createApiHelpers } from './shared.mjs';
12
13
 
13
- // Optimistic route preview: the requested provider/model/effort/fast are
14
- // published before the runtime write settles. What is NOT previewed about the
15
- // route (effort options, Fast capability, context window) is provider
16
- // metadata the runtime resolves while the preview is already on screen.
17
- const ROUTE_PREVIEW_KEYS = [
18
- 'provider',
19
- 'model',
20
- 'effort',
21
- 'fast',
22
- 'autoEffort',
23
- 'modelParameters',
24
- 'contextPercent',
25
- 'contextTokens',
26
- ];
14
+ export { publishModelSwitch } from './routes-write.mjs';
27
15
 
28
- /**
29
- * The patch that publishes a requested route before the runtime write settles.
30
- * Returns null when the request carries nothing previewable.
31
- */
32
- function optimisticRoutePatch(requested = {}, current = {}) {
33
- const route = requested && typeof requested === 'object' ? requested : {};
34
- const has = (key) => Object.hasOwn(route, key);
35
- const patch = {};
36
- for (const key of ROUTE_PREVIEW_KEYS) {
37
- if (has(key)) patch[key] = route[key];
38
- }
39
- if (!has('provider') && !has('model')) {
40
- return Object.keys(patch).length > 0 ? patch : null;
41
- }
42
- const sameModel =
43
- String(patch.provider ?? current.provider ?? '') === String(current.provider ?? '') &&
44
- String(patch.model ?? current.model ?? '') === String(current.model ?? '');
45
- // A different model carries none of the previous model's tuning: an omitted
46
- // key means "this model has no such control", not "keep the old value".
47
- if (!sameModel) {
48
- if (!has('effort')) patch.effort = null;
49
- if (!has('fast')) patch.fast = false;
50
- if (!has('modelParameters')) patch.modelParameters = {};
51
- }
52
- return patch;
53
- }
54
-
55
- const SESSION_ONLY_KEYS = new Set(['provider', 'model', 'effort', 'fast', 'autoEffort']);
56
-
57
- /**
58
- * A session-only request (an agent child's route) may name just the model, just
59
- * the tuning, or both. Completed here, inside the serialized route write,
60
- * against the latest selected route — so a Fast-only change keeps the effort a
61
- * previous write selected. `unchanged` when it asks for nothing the selected
62
- * route does not already have.
63
- */
64
- function completeSessionOnlyRequest(request, selected) {
65
- const named = Boolean(request.provider || request.model);
66
- const target = named ? request : { ...request, provider: selected.provider, model: selected.model };
67
- const sameModel = target.provider === selected.provider && target.model === selected.model;
68
- if (!sameModel) return { request: target, unchanged: false };
69
- const unchanged =
70
- Object.keys(request).every((key) => SESSION_ONLY_KEYS.has(key)) &&
71
- (request.effort === undefined || request.effort === selected.effort) &&
72
- (request.fast === undefined || request.fast === (selected.fast === true)) &&
73
- (request.autoEffort === undefined || request.autoEffort === (selected.autoEffort !== false));
74
- return {
75
- unchanged,
76
- request: {
77
- ...(selected.effort ? { effort: selected.effort } : {}),
78
- fast: selected.fast === true,
79
- autoEffort: selected.autoEffort !== false,
80
- ...target,
81
- },
82
- };
83
- }
84
-
85
- /** The live divider of an in-place model switch (restored from message meta
86
- * after a reload); every switch path publishes it the same way. */
87
- export function publishModelSwitch(bag, modelSwitch) {
88
- if (modelSwitch) bag.pushItem(modelSwitchItem(bag.nextId(), modelSwitch));
16
+ /** The live dividers of a conversation's orchestration mode and workflow
17
+ * switches (made now, or chosen during a turn and applied at the next). */
18
+ export function publishSessionSwitches(bag, { orchestrationModeSwitch, workflowSwitch } = {}) {
19
+ if (orchestrationModeSwitch) bag.pushItem(orchestrationModeSwitchItem(bag.nextId(), orchestrationModeSwitch));
20
+ if (workflowSwitch) bag.pushItem(workflowSwitchItem(bag.nextId(), workflowSwitch));
89
21
  }
90
22
 
91
23
  export function createSessionRouteApi(bag) {
@@ -106,117 +38,15 @@ export function createSessionRouteApi(bag) {
106
38
  routeState,
107
39
  syncContextStats,
108
40
  });
109
- let routeWrite = null;
110
- let routeSequence = 0;
111
- // Whether this API (not another command) is the one holding commandBusy.
112
- let routeLocked = false;
113
-
114
- // A preset selector previews as the preset's model, never as its id.
115
- const previewedRequest = (routeOpts) => {
116
- if (routeOpts.provider || !routeOpts.model) return routeOpts;
117
- const target = selectedModel(runtime, routeOpts, '', '');
118
- return target.provider ? { ...routeOpts, ...target } : routeOpts;
119
- };
120
-
121
- const setRoute = async (opts) => {
122
- const routeOpts = opts && typeof opts === 'object' ? opts : {};
123
- // All model pickers save a selection for the conversation's next turn; a
124
- // running turn keeps the session model it started on. A selection is never
125
- // refused: another command's lock neither blocks it nor is released by it.
126
- const token = ++routeSequence;
127
- const previousWrite = routeWrite;
128
- // The session generation this selection was made under. The write below
129
- // waits behind earlier ones, so "current" is never read later: the runtime
130
- // validates this token before every route side effect, and `settle` below
131
- // is the only place the display is touched once the write has started.
132
- const originGeneration = runtime.sessionGeneration;
133
- const owned = () => runtime.sessionGeneration === originGeneration;
134
- // A conditional fill (only when the route is still empty) may not apply, so
135
- // it never previews: the runtime's answer is what gets published.
136
- const onlyIfEmpty = routeOpts.onlyIfEmpty === true;
137
- const preview = onlyIfEmpty ? null : optimisticRoutePatch(previewedRequest(routeOpts), getState());
138
- // Preview immediately, serialize persistence without dropping a later
139
- // click. Earlier completions cannot replace the newest visible choice.
140
- if (!getState().commandBusy) routeLocked = true;
141
- set({ ...(routeLocked ? { commandBusy: true } : {}), ...(preview || {}) });
142
- flushEmitImmediate();
143
- const write = (async () => {
144
- if (previousWrite) await previousWrite.catch(() => {});
145
- const previousRoute = routeState();
146
- // A stale selection only republishes the route that is actually
147
- // selected; it never restores or announces its own session's state.
148
- const settle = ({ failed = false, sync = false, modelSwitch = null } = {}) => {
149
- const stillOwned = owned();
150
- if (stillOwned) publishModelSwitch(bag, modelSwitch);
151
- // A newer selection publishes the final route itself.
152
- if (token !== routeSequence) return;
153
- if (stillOwned && failed) {
154
- if (preview) set({ ...previousRoute, stats: { ...getState().stats } });
155
- return;
156
- }
157
- if (stillOwned && sync) syncContextStats({ allowEstimated: true });
158
- publishRoute();
159
- };
160
- try {
161
- // Keep the durable session address while deferring route application.
162
- const applyToCurrentSession = routeOpts.applyToCurrentSession === true;
163
- const keepMainModel = routeOpts.keepMainModel !== false;
164
- const sessionOnly = routeOpts.sessionOnly === true;
165
- const {
166
- applyToCurrentSession: _drop,
167
- keepMainModel: _keep,
168
- sessionOnly: _scope,
169
- onlyIfEmpty: _fill,
170
- ...requested
171
- } = routeOpts;
172
- let nextRoute = requested;
173
- if (sessionOnly) {
174
- const completed = completeSessionOnlyRequest(requested, previousRoute);
175
- if (completed.unchanged) {
176
- // An earlier failed write skipped its rollback because this one is
177
- // newer, so the shown route may still be that write's preview.
178
- settle();
179
- return previousRoute;
180
- }
181
- nextRoute = completed.request;
182
- }
183
- const resolvedRoute = await runtime.setRoute(nextRoute, {
184
- applyToCurrentSession,
185
- keepMainModel,
186
- ...(sessionOnly ? { sessionOnly } : {}),
187
- ...(onlyIfEmpty ? { onlyIfEmpty } : {}),
188
- ...(originGeneration !== undefined ? { originGeneration } : {}),
189
- switchEstablished: true,
190
- deferUntilNextTurn: true,
191
- });
192
- settle({
193
- sync: applyToCurrentSession || Boolean(resolvedRoute?.modelSwitch),
194
- modelSwitch: resolvedRoute?.modelSwitch,
195
- });
196
- return resolvedRoute;
197
- } catch (error) {
198
- settle({ failed: true });
199
- throw error;
200
- } finally {
201
- if (token === routeSequence) {
202
- if (routeLocked) set({ commandBusy: false });
203
- routeLocked = false;
204
- // Publish the resolved route (or rollback) before an RPC reply
205
- // reads getState(), even while the display-frame clock is busy.
206
- flushEmitImmediate();
207
- }
208
- }
209
- })();
210
- routeWrite = write;
211
- try {
212
- return await write;
213
- } finally {
214
- if (routeWrite === write) routeWrite = null;
215
- }
216
- };
217
- // The settings surface's setModel (/model, presets) is the same user
218
- // model choice and runs through this one path.
219
- bag.setSessionRoute = setRoute;
41
+ const setRoute = createRouteWrite(bag, {
42
+ runtime,
43
+ getState,
44
+ set,
45
+ flushEmitImmediate,
46
+ routeState,
47
+ syncContextStats,
48
+ publishRoute,
49
+ });
220
50
 
221
51
  const setWebSearchRoute = async (opts) => {
222
52
  if (getState().commandBusy) return null;
@@ -272,62 +102,7 @@ export function createSessionRouteApi(bag) {
272
102
  return runtime.listWebSearchModels?.(options) || [];
273
103
  },
274
104
  setWebSearchRoute,
275
- listAgents: () => {
276
- return runtime.listAgents?.() || [];
277
- },
278
- listWorkflows: () => {
279
- return runtime.listWorkflows?.() || [];
280
- },
281
- // Workflow pack editing (desktop Workflows page): direct passthroughs —
282
- // the runtime owns validation, user-pack persistence, and delete guards.
283
- getWorkflowPack: (workflowId) => runtime.getWorkflowPack?.(workflowId) ?? null,
284
- saveWorkflowPack: async (payload) => runtime.saveWorkflowPack?.(payload) ?? null,
285
- createWorkflow: async (payload) => runtime.createWorkflow?.(payload) ?? null,
286
- deleteWorkflow: async (workflowId) => runtime.deleteWorkflow?.(workflowId) ?? null,
287
- getAgentDefinition: (agentId) => runtime.getAgentDefinition?.(agentId) ?? null,
288
- getAgentAvatarImage: (agentId) => runtime.getAgentAvatarImage?.(agentId) ?? null,
289
- getAgentConnectors: (agentId) => runtime.getAgentConnectors?.(agentId) ?? [],
290
- listConnectors: () => runtime.listConnectors?.() ?? [],
291
- listConnectorTools: (connectorId) => runtime.listConnectorTools?.(connectorId) ?? [],
292
- setAgentConnectors: async (agentId, connectors) => runtime.setAgentConnectors?.(agentId, connectors) ?? null,
293
- setAgentConnectorEnabled: async (agentId, connectorId, enabled) =>
294
- runtime.setAgentConnectorEnabled?.(agentId, connectorId, enabled) ?? [],
295
- getProjectConnectors: (projectPath) => runtime.getProjectConnectors?.(projectPath) ?? [],
296
- setProjectConnectorEnabled: async (projectPath, connectorId, enabled) =>
297
- runtime.setProjectConnectorEnabled?.(projectPath, connectorId, enabled) ?? [],
298
- setAgentConnectorToolPermission: async (agentId, connectorId, toolName, permission) =>
299
- runtime.setAgentConnectorToolPermission?.(agentId, connectorId, toolName, permission) ?? null,
300
- // Per-agent action-kind permissions (ask / allow / block) for the profile.
301
- getAgentPermissions: async (agentId) =>
302
- (await import('../../../runtime/agent/orchestrator/session/human-gate/store.mjs')).agentPermissions(agentId),
303
- setAgentPermission: async (agentId, action, mode) =>
304
- (await import('../../../runtime/agent/orchestrator/session/human-gate/store.mjs')).setAgentPermission(
305
- agentId,
306
- action,
307
- mode
308
- ),
309
- getLeadPersona: () => runtime.getLeadPersona?.() ?? '',
310
- saveLeadPersona: async (text) => runtime.saveLeadPersona?.(text) ?? '',
311
- getLeadAgentBody: () => runtime.getLeadAgentBody?.() ?? '',
312
- saveLeadAgentBody: async (text) => runtime.saveLeadAgentBody?.(text) ?? '',
313
- getLeadStatus: () =>
314
- runtime.getLeadStatus?.() ?? { created: null, name: '', avatar: null, homeChatted: false, route: null },
315
- saveLeadIdentity: async (payload) => runtime.saveLeadIdentity?.(payload) ?? null,
316
- setLeadCreated: async (created, description) => runtime.setLeadCreated?.(created, description) ?? null,
317
- saveAgentDefinition: async (payload) => runtime.saveAgentDefinition?.(payload) ?? null,
318
- deleteAgentDefinition: async (agentId) => runtime.deleteAgentDefinition?.(agentId) ?? null,
319
- agentDefinitionPresence: (agentIds) => runtime.agentDefinitionPresence?.(agentIds) ?? null,
320
- restoreAgentDefinition: async (agentId) => runtime.restoreAgentDefinition?.(agentId) ?? null,
321
- purgeAgentDefinition: async (agentId) => runtime.purgeAgentDefinition?.(agentId) ?? null,
322
- archivedAgentIdentities: (agentIds) => runtime.archivedAgentIdentities?.(agentIds) ?? null,
323
- // Group-room rows posted by the desktop host into a room's log session.
324
- appendRoomRows: async (sessionId, rows) =>
325
- (await import('../../../session-runtime/agent-room-delivery.mjs')).appendRoomRows(sessionId, rows),
326
- // One group-room supervisor step on the Maintainer route.
327
- decideRoomTurn: async (input) =>
328
- (await import('../../../runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs')).decideRoomTurn(
329
- input
330
- ),
105
+ ...createAgentDefinitionApi(runtime),
331
106
  getOutputStyle: () => {
332
107
  return runtime.getOutputStyle?.() || runtime.listOutputStyles?.() || null;
333
108
  },
@@ -348,13 +123,14 @@ export function createSessionRouteApi(bag) {
348
123
  setWorkflow: withCommandLock(async (workflowId, options) => {
349
124
  const result = await runtime.setWorkflow?.(workflowId, options);
350
125
  // A switch of this conversation leaves a divider (restored from message meta).
351
- if (result?.workflowSwitch) bag.pushItem(workflowSwitchItem(bag.nextId(), result.workflowSwitch));
126
+ publishSessionSwitches(bag, { workflowSwitch: result?.workflowSwitch });
352
127
  publishRoute();
353
128
  return result;
354
129
  }),
355
130
  getOrchestrationMode: () => runtime.getOrchestrationMode(),
356
- setOrchestrationMode: withCommandLock(async (mode) => {
357
- const result = await runtime.setOrchestrationMode(mode);
131
+ setOrchestrationMode: withCommandLock(async (mode, options) => {
132
+ const result = await runtime.setOrchestrationMode(mode, options);
133
+ publishSessionSwitches(bag, { orchestrationModeSwitch: result?.orchestrationModeSwitch });
358
134
  publishRoute();
359
135
  return result;
360
136
  }),
@@ -112,6 +112,18 @@ export function createSessionSettingsApi(bag) {
112
112
  setAiSessionTitles: withCommandLock(async (enabled) => {
113
113
  return await runtime.setAiSessionTitles?.(enabled);
114
114
  }),
115
+ getLeadAppearance: () => {
116
+ return runtime.getLeadAppearance?.() || { avatar: null };
117
+ },
118
+ setLeadAppearance: withCommandLock(async (avatar) => {
119
+ return await runtime.setLeadAppearance?.(avatar);
120
+ }),
121
+ getBotOrder: () => {
122
+ return runtime.getBotOrder?.() || { order: [] };
123
+ },
124
+ setBotOrder: withCommandLock(async (order) => {
125
+ return await runtime.setBotOrder?.(order);
126
+ }),
115
127
  getToolModuleSettings: () => {
116
128
  return (
117
129
  runtime.getToolModuleSettings?.() || {
@@ -130,9 +142,10 @@ export function createSessionSettingsApi(bag) {
130
142
  setWorktreeSettings: lockedRuntimeCall((patch) => runtime.setWorktreeSettings(patch)),
131
143
  setWebSearchEnabled: lockedRuntimeCall((enabled) => runtime.setWebSearchEnabled?.(enabled)),
132
144
  setInstructionFiles: lockedRuntimeCall((mode) => runtime.setInstructionFiles?.(mode)),
145
+ setAutoEffortBase: lockedRuntimeCall((level) => runtime.setAutoEffortBase?.(level)),
133
146
  setMemoryToolsEnabled: lockedRuntimeCall((enabled) => runtime.setMemoryToolsEnabled?.(enabled)),
134
147
  setBuiltinToolEnabled: lockedRuntimeCall((name, enabled) => runtime.setBuiltinToolEnabled?.(name, enabled)),
135
- installBuiltinFeature: lockedRuntimeCall((name) => runtime.installBuiltinFeature?.(name)),
148
+ installBuiltinFeature: lockedRuntimeCall((name, options) => runtime.installBuiltinFeature?.(name, options)),
136
149
  installLocalProviderModel: lockedRuntimeCall((modelId) => runtime.installLocalProviderModel?.(modelId)),
137
150
  // Background installs return promptly; cancellation must remain usable
138
151
  // even while a legacy blocking install owns commandBusy.
@@ -63,8 +63,13 @@ function renderBatchItems(batch, pushUserOrSyntheticItem) {
63
63
  .trim()
64
64
  .toLowerCase();
65
65
  const device = typeof entry.transcriptMeta?.device === 'string' ? entry.transcriptMeta.device : '';
66
- const attribution = { ...(sender ? { sender } : {}), ...(device ? { device } : {}) };
67
- let itemExtras = sender || device ? attribution : null;
66
+ const fromAgent = typeof entry.transcriptMeta?.fromAgent === 'string' ? entry.transcriptMeta.fromAgent : '';
67
+ const attribution = {
68
+ ...(sender ? { sender } : {}),
69
+ ...(device ? { device } : {}),
70
+ ...(fromAgent ? { fromAgent } : {}),
71
+ };
72
+ let itemExtras = sender || device || fromAgent ? attribution : null;
68
73
  if (Array.isArray(entry.images) && entry.images.length) {
69
74
  itemExtras = { images: entry.images, ...attribution };
70
75
  }
@@ -84,6 +89,23 @@ function batchPromptSource(batch) {
84
89
  return undefined;
85
90
  }
86
91
 
92
+ /** The batch's transcript metadata; a batch of completion wakes also records
93
+ * the execution ids it delivers (`consumedExecutionIds`, from each entry's
94
+ * execution or resume keys; null for one with neither), the structured
95
+ * provenance a task session's report follows (agent-task-sessions.mjs). */
96
+ function completionWakeTranscriptMeta(batch) {
97
+ const meta = batch[0]?.transcriptMeta || null;
98
+ if (batchPromptSource(batch) !== 'task-notification') return meta;
99
+ const consumed = batch.flatMap((entry) => {
100
+ if (entry?.execution?.id) return [String(entry.execution.id)];
101
+ const keys = (Array.isArray(entry?.resumeCompletionKeys) ? entry.resumeCompletionKeys : []).map(String);
102
+ return keys.length
103
+ ? keys.map((key) => (key.startsWith('execution:') ? key.slice('execution:'.length) : null))
104
+ : [null];
105
+ });
106
+ return { ...(meta || {}), consumedExecutionIds: consumed };
107
+ }
108
+
87
109
  export function turnOptionsForBatch(batch, steering) {
88
110
  const nonEditable = batch.filter((entry) => !isQueuedEntryEditable(entry));
89
111
  // A completion resume is owned by the completion that woke it. Esc
@@ -106,13 +128,16 @@ export function turnOptionsForBatch(batch, steering) {
106
128
  pastedTexts: mergePastedTexts(batch),
107
129
  submittedAt: earliestSubmittedAt(batch),
108
130
  onCommitted: () => steering.commitSteeringQueueEntries(batch),
131
+ // Cancelling typed input consumes its queue copy with or without draft
132
+ // restoration, without signalling successful delivery to onCommitted.
133
+ onAborted: () => steering.releaseSteeringQueueEntries(batch),
109
134
  submittedIds: [...new Set(batch.map((e) => e.id))],
110
135
  restorable: nonEditable.length === 0,
111
136
  requeueOnAbort: nonEditable.filter((entry) => !discardOnAbort.includes(entry)),
112
137
  discardExecutionPendingResumeKeys: discardOnAbort.flatMap((entry) =>
113
138
  Array.isArray(entry?.resumeCompletionKeys) ? entry.resumeCompletionKeys : []
114
139
  ),
115
- transcriptMeta: batch[0]?.transcriptMeta || null,
140
+ transcriptMeta: completionWakeTranscriptMeta(batch),
116
141
  // Only a routine turn names its selection text (never its payload).
117
142
  ...(batch[0]?.mode === 'routine' && typeof batch[0].skillSelection === 'string'
118
143
  ? { skillSelection: batch[0].skillSelection }
@@ -6,8 +6,10 @@
6
6
  const TURN_CHROME_KINDS = new Set(['user', 'turndone', 'notice']);
7
7
 
8
8
  // An in-place model switch made after the stop (the quota "switch model"
9
- // path) is not the failed turn's output and outlives its rewind.
10
- const isModelSwitchDivider = (item) => item?.kind === 'statusdone' && item.status === 'model-switched';
9
+ // path), or a model, workflow or orchestration mode switch applied at the
10
+ // failed turn's start, is not the turn's output and outlives its rewind.
11
+ const SWITCH_DIVIDERS = new Set(['model-switched', 'workflow-switched', 'orchestration-mode-switched']);
12
+ const isModelSwitchDivider = (item) => item?.kind === 'statusdone' && SWITCH_DIVIDERS.has(item.status);
11
13
 
12
14
  /** The items with the trailing failed, output-less turn removed (a later
13
15
  * model switch divider kept), or null when nothing qualifies. */
@@ -13,6 +13,12 @@ import {
13
13
  import { hydratePastedAttachments, hydrateRestorableFileParts } from '../../../../runtime/attachments/store.mjs';
14
14
  import { dropTuiSteeringPersist } from '../../tui-steering-persist.mjs';
15
15
 
16
+ /** Who an entry's words are attributed to (its `sender`, sending bot and chain hop). */
17
+ const attributionOf = (entry) =>
18
+ `${String(entry?.transcriptMeta?.sender || '').toLowerCase()}|${entry?.transcriptMeta?.fromAgent || ''}|${
19
+ entry?.transcriptMeta?.hop || 0
20
+ }`;
21
+
16
22
  export function createTakeEntriesOps({ pending, pendingNotificationKeys, removeQueuedEntries, leadSessionId }) {
17
23
  function dequeueQueueBatch(maxPriority = 'later', options = {}) {
18
24
  if (pending.length === 0) return [];
@@ -40,6 +46,8 @@ export function createTakeEntriesOps({ pending, pendingNotificationKeys, removeQ
40
46
  queuePriorityValue(entry.priority) === bestPriority
41
47
  ) {
42
48
  if (batch.length > 0 && entry.retryTurnId) break;
49
+ // One turn records one sender: a bot's message never merges with the user's.
50
+ if (batch.length > 0 && attributionOf(entry) !== attributionOf(batch[0])) break;
43
51
  batch.push(entry);
44
52
  pending.splice(i, 1);
45
53
  if (entry.mode === 'task-notification' && entry.key) pendingNotificationKeys.delete(entry.key);
@@ -127,12 +127,16 @@ export function createSteeringOps(bag, { queue, submissions }) {
127
127
  return isQueuedEntryEditable(entry) && !isSlashQueuedEntry(entry);
128
128
  }
129
129
 
130
- function commitSteeringQueueEntries(entries) {
131
- callCommitCallbacks(entries);
130
+ function releaseSteeringQueueEntries(entries) {
132
131
  const mirrored = (Array.isArray(entries) ? entries : []).filter(
133
132
  (entry) => shouldMirrorSteeringEntry(entry) && entry.steeringPersistId
134
133
  );
135
- if (mirrored.length > 0) dropTuiSteeringPersist(leadSessionId(), mirrored);
134
+ if (mirrored.length > 0) return dropTuiSteeringPersist(leadSessionId(), mirrored);
135
+ }
136
+
137
+ function commitSteeringQueueEntries(entries) {
138
+ callCommitCallbacks(entries);
139
+ releaseSteeringQueueEntries(entries);
136
140
  }
137
141
 
138
142
  function canDeliverSteeringEntry(entry) {
@@ -291,6 +295,7 @@ export function createSteeringOps(bag, { queue, submissions }) {
291
295
  return {
292
296
  leadSessionId,
293
297
  shouldMirrorSteeringEntry,
298
+ releaseSteeringQueueEntries,
294
299
  commitSteeringQueueEntries,
295
300
  settleSteeredSubmissions,
296
301
  hasPendingSteering,