mixdog 1.3.1 → 1.3.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 (377) hide show
  1. package/README.md +8 -4
  2. package/package.json +2 -2
  3. package/scripts/native-release-status.mjs +238 -0
  4. package/src/defaults/shipped-history.json +5 -1
  5. package/src/defaults/skills/pptx/scripts/qc-pages.mjs +3 -2
  6. package/src/defaults/skills/setup/SKILL.md +23 -1
  7. package/src/defaults/skills/setup/references/actions.md +50 -3
  8. package/src/defaults/skills/setup/references/surfaces.md +23 -3
  9. package/src/defaults/skills/setup-guide/SKILL.md +7 -3
  10. package/src/defaults/skills/visualize/SKILL.md +9 -6
  11. package/src/defaults/skills/visualize/references/craft.md +8 -1
  12. package/src/help.mjs +1 -1
  13. package/src/lib/keychain-cjs.cjs +4 -1
  14. package/src/lib/rules-builder.cjs +14 -7
  15. package/src/rules/agent-mode/AGENT_MODE.md +8 -5
  16. package/src/rules/agent-mode/MIXY.md +6 -8
  17. package/src/rules/lead/LEAD.md +2 -2
  18. package/src/rules/shared/10-tool-workflow.md +4 -0
  19. package/src/rules/shared/20-research.md +2 -0
  20. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +5 -0
  21. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +8 -0
  22. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -1
  23. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +114 -26
  24. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +8 -0
  25. package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +5 -4
  26. package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -0
  27. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +4 -0
  28. package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
  29. package/src/runtime/agent/orchestrator/config-storage.mjs +10 -3
  30. package/src/runtime/agent/orchestrator/config.mjs +11 -0
  31. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -2
  32. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +97 -5
  33. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +6 -10
  34. package/src/runtime/agent/orchestrator/mcp/client.mjs +7 -4
  35. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +80 -31
  36. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +1 -1
  37. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  38. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +67 -38
  39. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -0
  40. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +6 -2
  41. package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +27 -8
  42. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +31 -4
  43. package/src/runtime/agent/orchestrator/providers/cursor.mjs +4 -1
  44. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +11 -8
  45. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -0
  46. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +16 -0
  47. package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +13 -0
  48. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -1
  49. package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +3 -1
  50. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +1 -0
  51. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +5 -5
  52. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +9 -5
  53. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +9 -1
  54. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +2 -1
  55. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +30 -3
  56. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +1 -1
  57. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +3 -1
  58. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +61 -8
  59. package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -0
  60. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +90 -24
  61. package/src/runtime/agent/orchestrator/runtime-core/fs-utils.mjs +8 -1
  62. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +1 -1
  63. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +68 -22
  64. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -1
  65. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +4 -6
  66. package/src/runtime/agent/orchestrator/runtime-core/route-context-state.mjs +81 -0
  67. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -1
  68. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +12 -1
  69. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -5
  70. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +7 -6
  71. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/runtime-core/workflow/packs.mjs +8 -4
  73. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +2 -0
  74. package/src/runtime/agent/orchestrator/session/agent-mode.mjs +0 -6
  75. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +1 -1
  76. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +22 -4
  77. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +17 -2
  78. package/src/runtime/agent/orchestrator/session/agent-room.mjs +133 -38
  79. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +80 -0
  80. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  81. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +14 -11
  82. package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +3 -0
  83. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +68 -18
  84. package/src/runtime/agent/orchestrator/session/compact/summary-mode.mjs +16 -0
  85. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +87 -0
  86. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +2 -0
  87. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +5 -1
  88. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/session/context-utils.mjs +41 -10
  91. package/src/runtime/agent/orchestrator/session/human-gate/delegation.mjs +230 -0
  92. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +136 -32
  93. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +20 -0
  94. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +21 -9
  95. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +73 -0
  96. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +55 -27
  97. package/src/runtime/agent/orchestrator/session/human-gate/unattended-port.mjs +15 -0
  98. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +4 -1
  99. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +189 -105
  100. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +6 -2
  101. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +5 -5
  102. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +3 -0
  103. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -0
  104. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +38 -5
  105. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +21 -0
  106. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -1
  107. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +12 -0
  108. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +11 -5
  109. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +13 -2
  110. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +4 -0
  111. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  112. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  113. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +44 -18
  114. package/src/runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs +99 -0
  115. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +42 -0
  116. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +3 -9
  117. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +1 -1
  118. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +5 -3
  119. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +40 -1
  120. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +12 -0
  121. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +20 -0
  122. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +55 -27
  123. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +3 -8
  124. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +12 -1
  125. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +6 -15
  126. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +24 -8
  127. package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +94 -13
  128. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +42 -10
  129. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +21 -3
  130. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +18 -3
  131. package/src/runtime/agent/orchestrator/session/routine-result.mjs +120 -9
  132. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -1
  133. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +3 -1
  134. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +41 -7
  135. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +10 -2
  136. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +14 -2
  137. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +15 -1
  138. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +8 -3
  139. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +36 -1
  140. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -1
  141. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +40 -5
  142. package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +47 -2
  143. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +125 -0
  144. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +4 -0
  145. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +78 -43
  146. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +35 -5
  147. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +42 -2
  148. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +35 -13
  149. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +25 -5
  150. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -3
  151. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +13 -14
  152. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/transport-artifacts.mjs +9 -0
  153. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +19 -14
  154. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -1
  155. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +6 -14
  156. package/src/runtime/agent/orchestrator/tools/builtin/pdf-test-fixtures.mjs +5 -3
  157. package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +4 -2
  158. package/src/runtime/agent/orchestrator/tools/builtin/read-single-media.mjs +47 -2
  159. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +264 -87
  160. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +10 -4
  161. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +34 -21
  162. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -4
  163. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +9 -30
  164. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +24 -12
  165. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +3 -2
  166. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -2
  167. package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +2 -1
  168. package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +4 -2
  169. package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +33 -2
  170. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +13 -13
  171. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -3
  172. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +3 -1
  173. package/src/runtime/attachments/attachment-reference.mjs +155 -0
  174. package/src/runtime/attachments/limits.mjs +5 -1
  175. package/src/runtime/attachments/office-extract.mjs +3 -6
  176. package/src/runtime/attachments/pdf-extract.mjs +84 -10
  177. package/src/runtime/attachments/store.mjs +49 -30
  178. package/src/runtime/browser-bridge/client.mjs +73 -20
  179. package/src/runtime/channels/lib/runtime-paths.mjs +1 -1
  180. package/src/runtime/channels/lib/scheduler.mjs +14 -7
  181. package/src/runtime/channels/lib/state-file.mjs +15 -15
  182. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +14 -13
  183. package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +22 -18
  184. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +14 -36
  185. package/src/runtime/channels/lib/worker-main.mjs +3 -2
  186. package/src/runtime/effort-judge/compact-tokenizer.mjs +8 -2
  187. package/src/runtime/effort-judge/judge-client.mjs +5 -2
  188. package/src/runtime/effort-judge/model-install.mjs +16 -8
  189. package/src/runtime/local-provider/asset-installer.mjs +10 -4
  190. package/src/runtime/local-provider/catalog.mjs +5 -2
  191. package/src/runtime/local-provider/registered-models.mjs +64 -27
  192. package/src/runtime/local-provider/server.mjs +2 -3
  193. package/src/runtime/media/adapters/image-api.mjs +89 -0
  194. package/src/runtime/media/auth.mjs +64 -1
  195. package/src/runtime/media/catalog.mjs +66 -4
  196. package/src/runtime/media/jobs.mjs +4 -0
  197. package/src/runtime/media/lanes.mjs +46 -5
  198. package/src/runtime/media/media-usage.mjs +17 -0
  199. package/src/runtime/media/renditions.mjs +15 -15
  200. package/src/runtime/media/store.mjs +36 -35
  201. package/src/runtime/media/tool.mjs +8 -1
  202. package/src/runtime/memory/lib/cycle-scheduler/health-ledger.mjs +8 -2
  203. package/src/runtime/memory/lib/embedding-model-files.mjs +30 -7
  204. package/src/runtime/memory/lib/ingest/transcript-tail.mjs +16 -7
  205. package/src/runtime/memory/lib/pg/process.mjs +8 -4
  206. package/src/runtime/memory/lib/project-id-resolver.mjs +5 -1
  207. package/src/runtime/memory/lib/runtime-fetcher.mjs +6 -1
  208. package/src/runtime/office/core/journal.mjs +7 -14
  209. package/src/runtime/office/design/library/design-library-core.mjs +4 -16
  210. package/src/runtime/office/pdf/ocr-engine-worker.mjs +37 -0
  211. package/src/runtime/office/pdf/ocr-engine.mjs +146 -0
  212. package/src/runtime/office/pdf/pdf-ocr.mjs +51 -21
  213. package/src/runtime/office/pdf/pdf-render.mjs +30 -18
  214. package/src/runtime/office/portable/ooxml-validator.mjs +2 -2
  215. package/src/runtime/office/portable/portable-soffice.mjs +4 -0
  216. package/src/runtime/shared/agent-kind-migration.mjs +200 -0
  217. package/src/runtime/shared/agent-message-envelope.d.mts +6 -0
  218. package/src/runtime/shared/agent-message-envelope.mjs +44 -0
  219. package/src/runtime/shared/agent-reap-state.d.mts +4 -0
  220. package/src/runtime/shared/agent-store.mjs +24 -7
  221. package/src/runtime/shared/agent-task-starts.mjs +27 -0
  222. package/src/runtime/shared/atomic-file.d.mts +50 -0
  223. package/src/runtime/shared/atomic-file.mjs +394 -132
  224. package/src/runtime/shared/background-tasks.mjs +7 -4
  225. package/src/runtime/shared/bot-hops.mjs +30 -0
  226. package/src/runtime/shared/bot-split-migration.mjs +1 -1
  227. package/src/runtime/shared/bounded-download.mjs +4 -2
  228. package/src/runtime/shared/config.mjs +39 -9
  229. package/src/runtime/shared/defaults-separation.mjs +6 -2
  230. package/src/runtime/shared/delegated-approval-host.mjs +74 -0
  231. package/src/runtime/shared/err-text.mjs +4 -0
  232. package/src/runtime/shared/error-presentation.mjs +22 -4
  233. package/src/runtime/shared/file-has-data.mjs +28 -0
  234. package/src/runtime/shared/llm/usage-ledger-import.mjs +37 -18
  235. package/src/runtime/shared/pending-agent-work.mjs +54 -0
  236. package/src/runtime/shared/process-lifecycle.mjs +8 -12
  237. package/src/runtime/shared/projects.mjs +50 -41
  238. package/src/runtime/shared/provider-accounts.mjs +17 -12
  239. package/src/runtime/shared/routine-trigger.d.mts +6 -1
  240. package/src/runtime/shared/routine-trigger.mjs +14 -6
  241. package/src/runtime/shared/run-child.d.mts +3 -0
  242. package/src/runtime/shared/run-child.mjs +24 -3
  243. package/src/runtime/shared/session-baseline-store.mjs +8 -2
  244. package/src/runtime/shared/singleton-owner.mjs +7 -6
  245. package/src/runtime/shared/skill-tool-dependencies.mjs +4 -10
  246. package/src/runtime/shared/staged-update.mjs +4 -2
  247. package/src/runtime/shared/statusline/statusline-segments.mjs +4 -15
  248. package/src/runtime/shared/tool-execution-contract.mjs +6 -0
  249. package/src/runtime/shared/transcript-metadata.mjs +28 -3
  250. package/src/runtime/shared/transcript-writer/session-record.mjs +7 -6
  251. package/src/runtime/shared/turn-snapshot-store.mjs +5 -4
  252. package/src/runtime/shared/turn-snapshot.mjs +44 -2
  253. package/src/runtime/shared/user-cwd.mjs +9 -4
  254. package/src/runtime/shared/user-data-guard.mjs +41 -42
  255. package/src/runtime/shared/utf8-cut.mjs +10 -0
  256. package/src/runtime/shared/worktrees/activity-gate.mjs +269 -61
  257. package/src/runtime/shared/worktrees/registry.mjs +26 -26
  258. package/src/runtime/tidy/core-install.mjs +26 -4
  259. package/src/runtime/tidy/install.mjs +91 -23
  260. package/src/runtime/web-search/lib/config.mjs +4 -16
  261. package/src/session-runtime/agent-home-delivery.mjs +555 -199
  262. package/src/session-runtime/agent-room-delivery.mjs +143 -36
  263. package/src/session-runtime/agent-task-sessions.mjs +667 -165
  264. package/src/session-runtime/agent-tool-routing.mjs +1 -0
  265. package/src/session-runtime/boot/apis.mjs +45 -24
  266. package/src/session-runtime/boot/config.mjs +1 -0
  267. package/src/session-runtime/boot/facade.mjs +11 -1
  268. package/src/session-runtime/boot/infrastructure.mjs +14 -2
  269. package/src/session-runtime/boot/providers.mjs +2 -2
  270. package/src/session-runtime/boot/shared.mjs +12 -6
  271. package/src/session-runtime/boot/tools.mjs +2 -2
  272. package/src/session-runtime/bot-status.mjs +432 -0
  273. package/src/session-runtime/config-lifecycle/lead-route-sync.mjs +29 -0
  274. package/src/session-runtime/config-lifecycle.mjs +60 -55
  275. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -4
  276. package/src/session-runtime/held-requests.mjs +36 -33
  277. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +10 -1
  278. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -2
  279. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +19 -4
  280. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  281. package/src/session-runtime/lifecycle/teardown.mjs +11 -3
  282. package/src/session-runtime/mcp-glue/connect.mjs +100 -186
  283. package/src/session-runtime/mcp-glue/initial-connect-gate.mjs +57 -0
  284. package/src/session-runtime/mcp-glue/server-connection.mjs +71 -0
  285. package/src/session-runtime/media-api.mjs +5 -2
  286. package/src/session-runtime/model-route/route-tuning.mjs +4 -1
  287. package/src/session-runtime/model-route/set-route.mjs +61 -1
  288. package/src/session-runtime/owned-automation-run.mjs +8 -1
  289. package/src/session-runtime/room-member-gate.mjs +16 -3
  290. package/src/session-runtime/route-resolution.mjs +16 -8
  291. package/src/session-runtime/route-state.mjs +1 -59
  292. package/src/session-runtime/routine-home-turn.mjs +5 -3
  293. package/src/session-runtime/runtime-bootstrap.mjs +5 -3
  294. package/src/session-runtime/runtime-paths.mjs +11 -5
  295. package/src/session-runtime/runtime-tunables.mjs +6 -0
  296. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +11 -2
  297. package/src/session-runtime/services/agent-tool/close-flow.mjs +4 -2
  298. package/src/session-runtime/services/agent-tool/execute-send.mjs +1 -0
  299. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +1 -0
  300. package/src/session-runtime/services/agent-tool/restart-notify.mjs +10 -0
  301. package/src/session-runtime/services/agent-tool/send-flow.mjs +25 -21
  302. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -0
  303. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +6 -3
  304. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +8 -5
  305. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +22 -2
  306. package/src/session-runtime/services/agent-tool/worker-index.mjs +4 -6
  307. package/src/session-runtime/services/agent-tool.mjs +6 -0
  308. package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +1 -1
  309. package/src/session-runtime/services/daemon-crash-capture/retention.mjs +4 -3
  310. package/src/session-runtime/services/hook-bus/config-loader.mjs +14 -5
  311. package/src/session-runtime/services/hook-bus/rule-file.mjs +49 -11
  312. package/src/session-runtime/services/plugin-admin.mjs +26 -26
  313. package/src/session-runtime/services/provider-admin.mjs +14 -4
  314. package/src/session-runtime/services/schedule-access.mjs +33 -4
  315. package/src/session-runtime/services/seeds.mjs +4 -3
  316. package/src/session-runtime/services/usage-dashboard.mjs +1 -1
  317. package/src/session-runtime/services/usage-stats-model.mjs +2 -1
  318. package/src/session-runtime/session-create/materialize.mjs +2 -3
  319. package/src/session-runtime/session-create/session-options.mjs +15 -2
  320. package/src/session-runtime/settings-builtin-tools-api.mjs +63 -1
  321. package/src/session-runtime/settings-compaction-api.mjs +86 -39
  322. package/src/session-runtime/setup-tool/executor.mjs +8 -2
  323. package/src/session-runtime/setup-tool/settings-contract.mjs +31 -1
  324. package/src/session-runtime/setup-tool/tool-defs.mjs +20 -3
  325. package/src/session-runtime/skills-api.mjs +12 -5
  326. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +265 -0
  327. package/src/session-runtime/tool-policy/mode-switch.mjs +54 -0
  328. package/src/session-runtime/tool-policy/pending-switches.mjs +59 -0
  329. package/src/session-runtime/tool-policy/policy-stage.mjs +165 -0
  330. package/src/session-runtime/tool-policy/session-switches.mjs +169 -0
  331. package/src/session-runtime/tool-policy/surface-helpers.mjs +114 -0
  332. package/src/session-runtime/tool-policy/workflow-overlay.mjs +145 -0
  333. package/src/session-runtime/tool-policy-refresh.mjs +47 -369
  334. package/src/session-runtime/tool-surface.mjs +5 -3
  335. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +95 -88
  336. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  337. package/src/session-runtime/turn/turn-run.mjs +2 -1
  338. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +54 -7
  339. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +519 -333
  340. package/src/session-runtime/workflow-agents-api/agent-route.mjs +46 -46
  341. package/src/session-runtime/workflow-agents-api/shared.mjs +5 -1
  342. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +14 -1
  343. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -3
  344. package/src/session-runtime/workspace/workspace-state.mjs +7 -6
  345. package/src/standalone/daemon-agent-control.mjs +4 -1
  346. package/src/standalone/daemon-session-control.mjs +51 -10
  347. package/src/standalone/daemon.mjs +28 -10
  348. package/src/standalone/local-session-runtime.mjs +22 -14
  349. package/src/standalone/session-client.mjs +7 -2
  350. package/src/standalone/session-protocol.mjs +7 -0
  351. package/src/standalone/session-service.mjs +11 -0
  352. package/src/standalone/session-state-projection.mjs +19 -9
  353. package/src/standalone/session-tool-output.mjs +35 -9
  354. package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +19 -13
  355. package/src/tui/app/settings-picker/settings-rows.mjs +2 -2
  356. package/src/tui/app/slash-commands.mjs +1 -1
  357. package/src/tui/app/usage-context-panels/context-model.mjs +8 -2
  358. package/src/tui/dist/index.mjs +529 -333
  359. package/src/tui/prompt-history-store.mjs +16 -21
  360. package/src/tui/session/context-state.mjs +4 -0
  361. package/src/tui/session/session-api/intake/abort.mjs +19 -1
  362. package/src/tui/session/session-api/media.mjs +2 -1
  363. package/src/tui/session/session-api/routes-agent-definitions.mjs +75 -0
  364. package/src/tui/session/session-api/routes-write.mjs +203 -0
  365. package/src/tui/session/session-api/routes.mjs +23 -247
  366. package/src/tui/session/session-api/settings.mjs +14 -1
  367. package/src/tui/session/session-flow/drain.mjs +28 -3
  368. package/src/tui/session/session-flow/failed-turn-rewind.mjs +4 -2
  369. package/src/tui/session/session-flow/queue/take-entries.mjs +8 -0
  370. package/src/tui/session/session-flow/steering.mjs +8 -3
  371. package/src/tui/session/tool-approval.mjs +185 -20
  372. package/src/tui/session/transcript-intake.mjs +2 -0
  373. package/src/tui/session/turn.mjs +23 -14
  374. package/src/tui/transcript-tool-failures.mjs +8 -2
  375. package/src/vendor/statusline/src/gateway/route-meta.mjs +7 -8
  376. package/src/vendor/statusline/src/gateway/session-routes.mjs +6 -7
  377. package/src/rules/agent-mode/ROUTINE.md +0 -6
@@ -1,125 +1,14 @@
1
1
  // Refresh the empty Lead session's model-facing tool surface and BP1/BP3
2
2
  // layers after workflow or search/memory settings change. Conversation
3
3
  // sessions keep their frozen schema; the next new session picks up the
4
- // updated policy. The one exception is a workflow switch made in the session
5
- // itself (switchSessionWorkflow), which rebuilds that conversation's policy.
4
+ // updated policy. The exceptions are a workflow or orchestration mode switch
5
+ // made in the session itself (switchSessionWorkflow,
6
+ // switchSessionOrchestrationMode), which that conversation takes as an overlay.
6
7
  import { sessionHasConversationMessages } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
7
- import { toSessionWorkflowMeta } from '../runtime/agent/orchestrator/runtime-core/workflow.mjs';
8
- import {
9
- applyDeferredToolSurface,
10
- filterDisallowedTools,
11
- } from '../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
12
- import { deferredSurfaceModeForLead } from '../runtime/agent/orchestrator/runtime-core/effort.mjs';
13
- import {
14
- applyInitialDeferredToolManifestToBp2,
15
- composeSystemPrompt,
16
- } from '../runtime/agent/orchestrator/context/collect.mjs';
17
- import { _buildBaseRules } from '../runtime/agent/orchestrator/session/manager/rules-cache.mjs';
18
- import { sessionRolePromptFields } from '../runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs';
19
- import {
20
- delegationDisabled,
21
- honoredSchemaAllowlist,
22
- } from '../runtime/agent/orchestrator/session/manager/session-tool-surface.mjs';
23
- import { finalizeSessionToolList } from '../runtime/agent/orchestrator/session/manager/tool-resolution.mjs';
24
- import { isAgentOwner } from '../runtime/agent/orchestrator/agent-owner.mjs';
25
- import {
26
- AGENT_MODE,
27
- isRoutineSource,
28
- resolveSessionMode,
29
- sessionModeOf,
30
- } from '../runtime/agent/orchestrator/session/agent-mode.mjs';
31
- import { unusedModelEditToolName } from '../runtime/shared/edit-tool-dialect.mjs';
32
- import { MIXY_AGENT_ID } from '../runtime/agent/orchestrator/session/agent-home.mjs';
33
- import {
34
- refreshSessionBp3Environment,
35
- withPresentedWorkspaceSlices,
36
- } from '../runtime/agent/orchestrator/session/manager/prompt-utils.mjs';
37
- import { stageWorkflowSwitchNotice } from '../runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs';
38
- import { markToolSurfaceMigrated } from '../runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs';
39
- import { agentProfileRevision, leadRosterRevision } from '../runtime/agent/orchestrator/context/role-instructions.mjs';
40
- import { recordTranscriptBoundary } from './model-route/set-route.mjs';
41
-
42
- const WORKFLOW_SWITCH_BUSY = 'The session is running a turn; wait for it to finish.';
43
- const AGENT_PROFILE_INTENT = 'agent_profile';
44
-
45
- function toolNames(list) {
46
- return (Array.isArray(list) ? list : [])
47
- .map((item) => (typeof item === 'string' ? item : item?.name))
48
- .filter(Boolean);
49
- }
50
-
51
- function replaceMessageContent(messages, target, content) {
52
- const index = messages.indexOf(target);
53
- if (index < 0) return false;
54
- messages[index] = { ...target, content };
55
- return true;
56
- }
57
-
58
- function rewriteSystemHeading(session, heading, nextContent) {
59
- if (!nextContent) return;
60
- const messages = Array.isArray(session.messages) ? session.messages : [];
61
- const target = messages.find(
62
- (message) =>
63
- message?.role === 'system' && typeof message.content === 'string' && message.content.startsWith(heading)
64
- );
65
- if (target) replaceMessageContent(messages, target, nextContent);
66
- }
67
-
68
- function bp3Message(session) {
69
- const messages = Array.isArray(session.messages) ? session.messages : [];
70
- return (
71
- messages.find((message) => message?.role === 'system' && message.cacheTier === 'tier3') ||
72
- messages.find(
73
- (message) =>
74
- message?.role === 'system' &&
75
- typeof message.content === 'string' &&
76
- message.content.startsWith('# Active Workflow:')
77
- )
78
- );
79
- }
80
-
81
- // The BP3 core the session's prompt carries now (split layout: the whole
82
- // tier3 block; combined: the stored core beside the environment).
83
- function presentedBp3Core(session) {
84
- return session.bp3EnvSplit === true ? bp3Message(session)?.content : session.bp3CoreContext;
85
- }
86
-
87
- function rewriteBp3Core(session, nextCore) {
88
- const messages = Array.isArray(session.messages) ? session.messages : [];
89
- const bp3 = bp3Message(session);
90
- if (!bp3 || typeof bp3.content !== 'string') return;
91
- if (session.bp3EnvSplit === true) {
92
- // Split layout: the environment lives in its own cacheTier:'env' system
93
- // block — the tier3 block carries the core only.
94
- replaceMessageContent(messages, bp3, nextCore || '');
95
- session.bp3CoreContext = nextCore || '';
96
- return;
97
- }
98
- const env = session.bp3EnvironmentContext || '';
99
- replaceMessageContent(messages, bp3, [nextCore, env].filter((part) => String(part || '').trim()).join('\n\n---\n\n'));
100
- session.bp3CoreContext = nextCore || '';
101
- }
102
-
103
- // A Lead's workflow slices (orchestration, agent and contact catalogs) for its
104
- // mode, Mixy's with the contacts.
105
- function leadPartsFor(session, leadPromptParts) {
106
- return leadPromptParts({
107
- agentMode: sessionModeOf(session) === AGENT_MODE,
108
- mixy: resolveSessionMode({ session }).agentId === MIXY_AGENT_ID,
109
- });
110
- }
111
-
112
- // A conversation keeps its `# Session` block: the legacy combined layout
113
- // rebuilds the tier3 block from the new core (rooted where it was).
114
- function rewriteConversationBp3Core(session, nextCore) {
115
- if (session.bp3EnvSplit !== true && typeof session.bp3CoreContext === 'string') {
116
- const previous = session.bp3CoreContext;
117
- session.bp3CoreContext = nextCore;
118
- if (refreshSessionBp3Environment(session, session.cwd)) return;
119
- session.bp3CoreContext = previous;
120
- }
121
- rewriteBp3Core(session, nextCore);
122
- }
8
+ import { createAgentProfileFold } from './tool-policy/agent-profile-fold.mjs';
9
+ import { createPolicyStage } from './tool-policy/policy-stage.mjs';
10
+ import { createSessionSwitches } from './tool-policy/session-switches.mjs';
11
+ import { rewriteBp3Core } from './tool-policy/surface-helpers.mjs';
123
12
 
124
13
  export function createToolPolicyRefresh({
125
14
  getSession,
@@ -134,41 +23,18 @@ export function createToolPolicyRefresh({
134
23
  loadInstructionFilesContext,
135
24
  activeWorkflowContext,
136
25
  invalidatePreSessionToolSurface,
26
+ persistSession,
137
27
  }) {
138
- // Denied tools leave every surface, then the deferred surface is rebuilt
139
- // for the lead's current mode.
140
- function applyToolDenials(session, denied, schemaAllowedTools, ownerIsAgent) {
141
- session.disallowedTools = denied;
142
- session.tools = filterDisallowedTools(session.tools, denied);
143
- if (Array.isArray(session.deferredToolCatalog)) {
144
- session.deferredToolCatalog = filterDisallowedTools(session.deferredToolCatalog, denied);
145
- }
146
- const catalogTools = finalizeSessionToolList(modelStandaloneTools(), {
147
- schemaAllowedTools,
148
- disallowedTools: denied,
149
- ownerIsAgent,
150
- });
151
- session.tools = finalizeSessionToolList(session.tools, {
152
- schemaAllowedTools,
153
- disallowedTools: denied,
154
- ownerIsAgent,
155
- });
156
- applyDeferredToolSurface(session, deferredSurfaceModeForLead(getMode()), catalogTools, {
157
- provider: getRoute()?.provider,
158
- });
159
- const catalog = Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : [];
160
- const active = new Set(toolNames(session.tools).concat(toolNames(session.deferredCallableTools)));
161
- const pool = catalog.map((tool) => String(tool?.name || '')).filter((name) => name && !active.has(name));
162
- applyInitialDeferredToolManifestToBp2(session, pool, { rebuild: true });
163
- }
164
-
165
- async function leadCoreMemoryContext() {
166
- try {
167
- return await loadCoreMemoryContext();
168
- } catch {
169
- return '';
170
- }
171
- }
28
+ const { liveDeniedTools, stagePolicy, applyPolicy } = createPolicyStage({
29
+ getRoute,
30
+ getMode,
31
+ getDataDir,
32
+ modelStandaloneTools,
33
+ featureDisallowedTools,
34
+ loadCoreMemoryContext,
35
+ loadInstructionFilesContext,
36
+ activeWorkflowContext,
37
+ });
172
38
 
173
39
  // A turn is executing from the moment it opens until it settles, even when
174
40
  // its transcript holds only notifications (which are not conversation
@@ -189,84 +55,6 @@ export function createToolPolicyRefresh({
189
55
  );
190
56
  }
191
57
 
192
- // The policy `config` gives `session`, computed without touching the
193
- // session, so a turn that starts during the async rebuild cannot lose tools
194
- // to it. `conversation`: the rebuilt BP3 core keeps the instruction files
195
- // and core memory the prompt presents now (withPresentedWorkspaceSlices).
196
- async function stagePolicy(session, identity, config, { conversation = false } = {}) {
197
- const ownerIsAgent = isAgentOwner(session);
198
- const schemaAllowedTools = honoredSchemaAllowlist(session.schemaAllowedTools, {
199
- ownerIsAgent,
200
- agent: identity.agent,
201
- });
202
- const toolFreeRole = ownerIsAgent && schemaAllowedTools?.length === 0;
203
-
204
- const {
205
- summary: workflow,
206
- leadPromptParts,
207
- packContext: workflowContext,
208
- orchestrationMode,
209
- } = activeWorkflowContext(config, getDataDir());
210
- const sessionMode = sessionModeOf(session);
211
- const agentMode = sessionMode === AGENT_MODE;
212
- const leadWorkflowParts = ownerIsAgent ? {} : leadPartsFor(session, leadPromptParts);
213
- const denied = [
214
- ...session.callerDisallowedTools,
215
- ...featureDisallowedTools(),
216
- ...(workflow?.delegatesAgents === false ? ['agent'] : []),
217
- ]
218
- .map((name) => String(name || ''))
219
- .filter(Boolean);
220
-
221
- const baseRules =
222
- identity.skipAgentRules || toolFreeRole
223
- ? ''
224
- : _buildBaseRules({
225
- omitTools: [...denied, unusedModelEditToolName(getRoute()?.model)],
226
- allowTools: schemaAllowedTools,
227
- provider: getRoute()?.provider,
228
- model: getRoute()?.model,
229
- });
230
- const coreMemoryContext = conversation ? '' : await leadCoreMemoryContext();
231
- const { sessionMarkerCore } = composeSystemPrompt({
232
- ...sessionRolePromptFields(identity, {
233
- ownerIsAgent,
234
- toolFreeRole,
235
- delegationFree: delegationDisabled(session, ownerIsAgent),
236
- sessionMode,
237
- routine: isRoutineSource(session.sourceType),
238
- }),
239
- provider: getRoute()?.provider,
240
- workflowContext,
241
- ...leadWorkflowParts,
242
- coreMemoryContext,
243
- // The rebuilt core keeps (or newly applies) the instruction-files
244
- // setting; agent mode carries none.
245
- instructionFilesContext:
246
- conversation || toolFreeRole || agentMode ? null : loadInstructionFilesContext?.(session) || null,
247
- });
248
- return {
249
- workflow,
250
- orchestrationMode,
251
- sessionMode,
252
- denied,
253
- schemaAllowedTools,
254
- ownerIsAgent,
255
- baseRules,
256
- core: conversation ? withPresentedWorkspaceSlices(session, sessionMarkerCore) : sessionMarkerCore,
257
- };
258
- }
259
-
260
- // Apply a staged policy synchronously; the BP3 core is the caller's.
261
- function applyPolicy(session, staged) {
262
- session.workflow = toSessionWorkflowMeta(staged.workflow);
263
- session.orchestrationMode = staged.orchestrationMode;
264
- session.sessionMode = staged.sessionMode;
265
- applyToolDenials(session, staged.denied, staged.schemaAllowedTools, staged.ownerIsAgent);
266
- rewriteSystemHeading(session, '# Tool Use', staged.baseRules);
267
- session.updatedAt = Date.now();
268
- }
269
-
270
58
  async function refreshEmptySessionToolPolicy() {
271
59
  invalidatePreSessionToolSurface?.();
272
60
  const session = getSession?.();
@@ -284,144 +72,34 @@ export function createToolPolicyRefresh({
284
72
  return { appliedToCurrentSession: true };
285
73
  }
286
74
 
287
- /**
288
- * Switch the current coding session's workflow mid-conversation (the
289
- * composer's workflow selector): its prompt (BP3 core and `# Tool Use`) and
290
- * tool/delegation surface are rebuilt now for `workflowId` with the current
291
- * orchestration mode and agents, so its next turn runs on them, and that
292
- * turn carries a one-time notice (manager/workflow-switch-notice.mjs). The
293
- * provider prompt cache is rebuilt once. Refused while a turn runs, like a
294
- * working-folder change. The configured workflow (the default for new
295
- * sessions) is the caller's and stays as it is.
296
- *
297
- * Running work is untouched: agents and workers the session started under
298
- * the old workflow are separate sessions with their own prompts and tools,
299
- * so they keep running as they are (unlike a working-folder change, running
300
- * agents never refuse this); only delegation made from the next turn on
301
- * uses the new surface.
302
- *
303
- * Returns null when the session has no conversation (the caller applies the
304
- * configured workflow to an empty session as before), else
305
- * `{ appliedToCurrentSession: true, workflow, workflowSwitch }` where
306
- * `workflowSwitch` is the transcript boundary (null when unchanged).
307
- */
308
- async function switchSessionWorkflow(workflowId) {
309
- const session = getSession?.();
310
- if (!session?.id) return null;
311
- const conversation = () =>
312
- sessionHasConversationMessages(session) || sessionHasConversationMessages({ messages: session.liveTurnMessages });
313
- if (!conversation()) return null;
314
- if (isAgentOwner(session) || sessionModeOf(session) === AGENT_MODE) {
315
- throw new Error('Only a coding session has a workflow.');
316
- }
317
- const identity = session.promptIdentity;
318
- if (!identity) throw new Error('This session is too old to switch its workflow; start a new task.');
319
- const busy = () => getSession?.() !== session || turnInFlight(session);
320
- if (busy()) throw new Error(WORKFLOW_SWITCH_BUSY);
321
- const config = getConfig();
322
- const staged = await stagePolicy(
323
- session,
324
- identity,
325
- { ...config, workflow: { ...(config?.workflow || {}), active: workflowId } },
326
- { conversation: true }
327
- );
328
- if (busy()) throw new Error(WORKFLOW_SWITCH_BUSY);
329
- const before = session.workflow;
330
- const from = before?.id ? before : null;
331
- applyPolicy(session, staged);
332
- rewriteConversationBp3Core(session, staged.core);
333
- // The request prefix changed: drop provider replay state and the context
334
- // baseline, and tag the next send's expected cache break.
335
- markToolSurfaceMigrated(session, 'workflow_switch');
336
- stageWorkflowSwitchNotice(session, from, session.workflow);
337
- let workflowSwitch = null;
338
- if (from?.id !== session.workflow.id) {
339
- workflowSwitch = {
340
- fromId: from?.id || '',
341
- from: from?.name || from?.id || '',
342
- toId: session.workflow.id,
343
- to: session.workflow.name,
344
- at: Date.now(),
345
- };
346
- // Two switches can land in the same millisecond (A→B→A): the same
347
- // switch is a repeat only when its direction matches too.
348
- recordTranscriptBoundary(
349
- session,
350
- 'workflowSwitches',
351
- workflowSwitch,
352
- (entry) =>
353
- entry?.at === workflowSwitch.at &&
354
- entry?.fromId === workflowSwitch.fromId &&
355
- entry?.toId === workflowSwitch.toId
356
- );
357
- }
358
- return { appliedToCurrentSession: true, workflow: session.workflow, workflowSwitch };
359
- }
360
-
361
- // An agent profile edit that met a running turn: the next turn applies it.
362
- let agentProfilePending = false;
363
-
364
- /**
365
- * Bring a Lead session's prompt to the saved bots — its own agent's
366
- * persona, AGENT.md and name, and the bot roster its catalogs list — after
367
- * a bot was saved, created, renamed, archived or restored
368
- * (agent-profile-changes.mjs), on resume, or at the start of the turn after
369
- * one that ran through the change (`trigger`: 'save' | 'resume' | 'turn').
370
- * Two stamps (agentProfileRevision, agentRosterRevision) tell whether
371
- * anything it embeds changed; a delegated worker keeps its prompt. The core
372
- * is rebuilt like a workflow switch's (the session's own workflow, the
373
- * workspace slices the model was told) and replaces the stored one, so the
374
- * next turn sends it with one provider cache break; nothing is re-read per
375
- * turn. Tools are untouched. Returns true when the prompt changed.
376
- */
377
- async function refreshAgentProfile({ trigger = 'save' } = {}) {
378
- const session = getSession?.();
379
- const identity = session?.promptIdentity;
380
- const agent = identity?.agent;
381
- if (!session?.id || !agent || isAgentOwner(session)) return false;
382
- // Only Mixy's own (agent-mode) thread embeds Mixy's profile.
383
- const revision = agentProfileRevision(agent, { mixy: sessionModeOf(session) === AGENT_MODE });
384
- const config = getConfig();
385
- const workflowId = session.workflow?.id;
386
- const workflowConfig = workflowId
387
- ? { ...config, workflow: { ...(config?.workflow || {}), active: workflowId } }
388
- : config;
389
- const roster = leadRosterRevision(
390
- leadPartsFor(session, activeWorkflowContext(workflowConfig, getDataDir()).leadPromptParts)
391
- );
392
- if (session.agentProfileRevision === revision && session.agentRosterRevision === roster) return false;
393
- // A coding session from before profile stamps keeps its prompt when it
394
- // is reopened; a saved edit still reaches it.
395
- if (session.agentProfileRevision === undefined && trigger === 'resume' && sessionModeOf(session) !== AGENT_MODE) {
396
- return false;
397
- }
398
- // At a turn's start its own turn is the one counted; nothing runs yet.
399
- const busy = () => getSession?.() !== session || (trigger !== 'turn' && turnInFlight(session));
400
- if (busy()) {
401
- agentProfilePending = true;
402
- return false;
403
- }
404
- const staged = await stagePolicy(session, identity, workflowConfig, { conversation: true });
405
- if (busy()) {
406
- agentProfilePending = true;
407
- return false;
408
- }
409
- session.agentProfileRevision = revision;
410
- session.agentRosterRevision = roster;
411
- session.updatedAt = Date.now();
412
- if (staged.core === presentedBp3Core(session)) return false;
413
- rewriteConversationBp3Core(session, staged.core);
414
- // The request prefix changed: one cache break, tagged on the next send.
415
- markToolSurfaceMigrated(session, AGENT_PROFILE_INTENT);
416
- return true;
417
- }
418
-
419
- /** Turn start: apply an edit that arrived while the previous turn ran. */
420
- async function applyPendingAgentProfile() {
421
- if (!agentProfilePending) return false;
422
- agentProfilePending = false;
423
- return refreshAgentProfile({ trigger: 'turn' });
424
- }
75
+ const switches = createSessionSwitches({
76
+ getSession,
77
+ getConfig,
78
+ getDataDir,
79
+ modelStandaloneTools,
80
+ activeWorkflowContext,
81
+ persistSession,
82
+ liveDeniedTools,
83
+ turnInFlight,
84
+ });
85
+ const profile = createAgentProfileFold({
86
+ getSession,
87
+ getConfig,
88
+ getDataDir,
89
+ modelStandaloneTools,
90
+ activeWorkflowContext,
91
+ liveDeniedTools,
92
+ stagePolicy,
93
+ applyPolicy,
94
+ turnInFlight,
95
+ });
425
96
 
426
- return { refreshEmptySessionToolPolicy, switchSessionWorkflow, refreshAgentProfile, applyPendingAgentProfile };
97
+ return {
98
+ refreshEmptySessionToolPolicy,
99
+ switchSessionWorkflow: switches.switchSessionWorkflow,
100
+ switchSessionOrchestrationMode: switches.switchSessionOrchestrationMode,
101
+ applyPendingSessionSwitches: switches.applyPendingSessionSwitches,
102
+ refreshAgentProfile: profile.refreshAgentProfile,
103
+ applyPendingAgentProfile: profile.applyPendingAgentProfile,
104
+ };
427
105
  }
@@ -15,6 +15,7 @@ import {
15
15
  filterModelToolsForProfile,
16
16
  } from '../runtime/agent/orchestrator/runtime-core/tool-profile.mjs';
17
17
  import { workflowDisallowsAgentTool } from '../runtime/agent/orchestrator/runtime-core/workflow.mjs';
18
+ import { promptWorkflowOf } from '../runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs';
18
19
  import { configuredOrchestrationMode } from '../runtime/shared/orchestration.mjs';
19
20
 
20
21
  export function createToolSurface({
@@ -35,12 +36,13 @@ export function createToolSurface({
35
36
  }) {
36
37
  let preSessionSurface = null;
37
38
 
38
- // A live session keeps its frozen capability; a new session uses current
39
- // agents. Solo still offers the tool (deferred) for explicit user requests.
39
+ // A live session keeps its frozen capability (the workflow its prompt was
40
+ // built with, even after a mid-conversation switch); a new session uses
41
+ // current agents. Solo still offers the tool (deferred) for explicit user requests.
40
42
  function workflowAllowsAgents() {
41
43
  const session = getSession();
42
44
  if (session?.id || session?.workflow || session?.orchestrationMode) {
43
- return !workflowDisallowsAgentTool(session?.workflow);
45
+ return !workflowDisallowsAgentTool(promptWorkflowOf(session));
44
46
  }
45
47
  return (delegatableAgentIds?.(getConfig(), cfgMod.getPluginData?.() || dataDir).length ?? 1) > 0;
46
48
  }