mixdog 1.3.5 → 1.4.1

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 (515) hide show
  1. package/NOTICE.md +2 -2
  2. package/README.md +2 -2
  3. package/package.json +2 -11
  4. package/scripts/check-voice-runtime-inputs.mjs +25 -0
  5. package/scripts/daemon-stub.mjs +1 -1
  6. package/scripts/gate-local.mjs +16 -5
  7. package/scripts/latest-guard.mjs +21 -9
  8. package/scripts/lib/isolated-test-env.mjs +10 -5
  9. package/scripts/lib/run-node-tests.mjs +37 -37
  10. package/scripts/lib/scoped-temp.d.mts +16 -0
  11. package/scripts/lib/scoped-temp.mjs +123 -0
  12. package/scripts/lib/stale-temp.mjs +44 -0
  13. package/scripts/native-release-status.mjs +2 -2
  14. package/scripts/post-release-check.mjs +1 -6
  15. package/scripts/pptx-kit-index.mjs +17 -4
  16. package/scripts/recall-history-cases.json +1 -1
  17. package/scripts/suite-health.mjs +20 -2
  18. package/scripts/test-data-dir.mjs +10 -7
  19. package/scripts/test.mjs +7 -11
  20. package/src/agents/reviewer/AGENT.md +7 -11
  21. package/src/agents/reviewer/agent.json +1 -1
  22. package/src/app.mjs +4 -0
  23. package/src/defaults/shipped-history.json +22 -1
  24. package/src/defaults/skills/browser-use/SKILL.md +62 -12
  25. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  26. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  27. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  28. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  29. package/src/defaults/skills/computer-use/SKILL.md +35 -9
  30. package/src/defaults/skills/setup/SKILL.md +22 -0
  31. package/src/defaults/skills/setup/references/actions.md +39 -5
  32. package/src/defaults/skills/setup/references/surfaces.md +11 -2
  33. package/src/defaults/skills/visualize/SKILL.md +2 -1
  34. package/src/lib/rules-builder.cjs +39 -20
  35. package/src/output-styles/common.md +2 -2
  36. package/src/output-styles/simple.md +1 -1
  37. package/src/rules/agent/AGENT.md +11 -10
  38. package/src/rules/lead/LEAD.md +23 -20
  39. package/src/rules/shared/05-tool-calls.md +5 -6
  40. package/src/rules/shared/10-tool-workflow.md +4 -0
  41. package/src/rules/shared/45-destructive.md +0 -2
  42. package/src/rules/shared/50-execution.md +2 -0
  43. package/src/rules/shared/60-verification.md +7 -5
  44. package/src/rules/shared/70-delivery.md +7 -9
  45. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
  46. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  47. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  48. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  49. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
  50. package/src/runtime/agent/orchestrator/config.mjs +17 -1
  51. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  52. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +73 -68
  53. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
  54. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  55. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
  56. package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
  57. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +5 -2
  58. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
  59. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
  60. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
  61. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
  62. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
  63. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
  65. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
  66. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  67. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  69. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
  70. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
  71. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  72. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
  73. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
  74. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  75. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
  76. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  77. package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
  78. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  79. package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
  80. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
  81. package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
  82. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
  83. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
  84. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
  85. package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
  86. package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
  87. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  88. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  89. package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
  90. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  91. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  92. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  93. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
  94. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
  95. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
  96. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
  97. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
  98. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
  99. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
  100. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
  101. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
  102. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
  103. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
  104. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
  105. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
  106. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
  107. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
  108. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +136 -5
  109. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  110. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  111. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  112. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  113. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +20 -12
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
  116. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
  117. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  118. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  119. package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -0
  120. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  121. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  122. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +49 -16
  123. package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
  124. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
  125. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
  126. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -6
  127. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  129. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  130. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -1
  131. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
  132. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
  133. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
  134. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
  136. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
  137. package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
  138. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +280 -45
  139. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  140. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  141. package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
  142. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
  143. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
  144. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
  145. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
  146. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +90 -22
  147. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
  148. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
  149. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
  150. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  151. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
  152. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +51 -25
  153. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -3
  154. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
  155. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
  156. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
  158. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +31 -3
  159. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
  160. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  161. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +5 -4
  162. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  163. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  164. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +49 -21
  165. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  166. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
  167. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  168. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  169. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  170. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
  171. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
  172. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  173. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  174. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +24 -14
  175. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  176. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  177. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +130 -0
  178. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
  179. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
  180. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  181. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
  182. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
  183. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  184. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
  185. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
  186. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  187. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
  188. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
  189. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
  190. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  191. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
  192. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
  193. package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
  194. package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
  195. package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
  196. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
  197. package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
  198. package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
  199. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
  200. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
  201. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
  202. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
  203. package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
  204. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
  205. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +16 -2
  206. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
  207. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
  208. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -3
  209. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  210. package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
  211. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  212. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  213. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +79 -3
  214. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  215. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  216. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  217. package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
  218. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  219. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  220. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
  221. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
  222. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  223. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
  224. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
  225. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
  226. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
  227. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
  228. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
  229. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
  230. package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
  231. package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
  232. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
  233. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
  234. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
  235. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
  236. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
  237. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  238. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
  239. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
  240. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  241. package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
  242. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +26 -4
  243. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  244. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  245. package/src/runtime/browser-bridge/client.mjs +73 -8
  246. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  247. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  248. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  249. package/src/runtime/channels/lib/config.mjs +6 -61
  250. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  251. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  252. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  253. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  254. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  255. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  256. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  257. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  258. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  259. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  260. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  261. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  262. package/src/runtime/channels/lib/scheduler.mjs +33 -147
  263. package/src/runtime/channels/lib/schedules-db.mjs +34 -11
  264. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  265. package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
  266. package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
  267. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  268. package/src/runtime/channels/lib/whisper-port.mjs +10 -1
  269. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  270. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  271. package/src/runtime/channels/lib/worker-main.mjs +10 -34
  272. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  273. package/src/runtime/computer-bridge/actions.mjs +9 -1
  274. package/src/runtime/computer-bridge/client.mjs +180 -8
  275. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  276. package/src/runtime/computer-bridge/error-recovery.mjs +28 -2
  277. package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
  278. package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
  279. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  280. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  281. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  282. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  283. package/src/runtime/connectors/google-mcp.mjs +10 -12
  284. package/src/runtime/local-provider/server-process.mjs +2 -1
  285. package/src/runtime/media/adapters/gemini-video.mjs +4 -1
  286. package/src/runtime/media/adapters/xai-media.mjs +2 -1
  287. package/src/runtime/memory/lib/embedding-worker.mjs +6 -3
  288. package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
  289. package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
  290. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  291. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  292. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  293. package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
  294. package/src/runtime/office/design/design-art-direction.mjs +29 -27
  295. package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
  296. package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
  297. package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
  298. package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
  299. package/src/runtime/office/quality/assurance-structure-docx.mjs +3 -1
  300. package/src/runtime/office/quality/design-review.mjs +1 -5
  301. package/src/runtime/office/quality/document-brief.mjs +1 -5
  302. package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
  303. package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
  304. package/src/runtime/session-search/session-search-db.mjs +73 -9
  305. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  306. package/src/runtime/shared/abort-race.mjs +89 -0
  307. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  308. package/src/runtime/shared/agent-kind.mjs +4 -3
  309. package/src/runtime/shared/bot-owned-work.mjs +56 -0
  310. package/src/runtime/shared/bounded-download.mjs +8 -3
  311. package/src/runtime/shared/config.mjs +2 -13
  312. package/src/runtime/shared/connector-accounts.mjs +20 -10
  313. package/src/runtime/shared/connector-catalog.d.mts +29 -0
  314. package/src/runtime/shared/connector-catalog.mjs +150 -0
  315. package/src/runtime/shared/connector-triggers.mjs +22 -19
  316. package/src/runtime/shared/defaults-separation.mjs +2 -17
  317. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  318. package/src/runtime/shared/err-text.mjs +24 -15
  319. package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
  320. package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
  321. package/src/runtime/shared/file-permissions.d.mts +0 -8
  322. package/src/runtime/shared/file-permissions.mjs +0 -11
  323. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  324. package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
  325. package/src/runtime/shared/handoff-artifacts.mjs +18 -8
  326. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  327. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  328. package/src/runtime/shared/idle-auto-clear-gate.mjs +126 -0
  329. package/src/runtime/shared/llm/cost.mjs +5 -1
  330. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  331. package/src/runtime/shared/loopback-listener.mjs +25 -2
  332. package/src/runtime/shared/mixy-presence.mjs +22 -0
  333. package/src/runtime/shared/model-route-chain.d.mts +7 -2
  334. package/src/runtime/shared/model-route-chain.mjs +22 -4
  335. package/src/runtime/shared/open-url.mjs +10 -0
  336. package/src/runtime/shared/orchestration.d.mts +2 -0
  337. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  338. package/src/runtime/shared/profile-config.cjs +1 -1
  339. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  340. package/src/runtime/shared/prompt-origin.mjs +21 -0
  341. package/src/runtime/shared/provider-accounts.mjs +7 -1
  342. package/src/runtime/shared/provider-display-name.mjs +29 -0
  343. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  344. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  345. package/src/runtime/shared/routine-trigger.mjs +10 -0
  346. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  347. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  348. package/src/runtime/shared/session-activity-signal.mjs +48 -1
  349. package/src/runtime/shared/session-scratch.mjs +37 -0
  350. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  351. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  352. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  353. package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
  354. package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
  355. package/src/runtime/shared/tool-result-summary.mjs +2 -15
  356. package/src/runtime/shared/tool-surface.mjs +3 -0
  357. package/src/runtime/shared/tool-work-units.mjs +2 -0
  358. package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
  359. package/src/runtime/shared/worktrees/contract.mjs +4 -1
  360. package/src/runtime/shared/worktrees/git.mjs +15 -0
  361. package/src/runtime/shared/worktrees/manager.mjs +87 -38
  362. package/src/runtime/shared/worktrees/test-support.mjs +14 -13
  363. package/src/runtime/terminal-bridge/client.mjs +10 -1
  364. package/src/runtime/visualize-bridge/client.mjs +29 -8
  365. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  366. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  367. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  368. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  369. package/src/session-runtime/agent-home-delivery.mjs +489 -185
  370. package/src/session-runtime/agent-task-sessions.mjs +467 -229
  371. package/src/session-runtime/agent-tool-routing.mjs +8 -41
  372. package/src/session-runtime/boot/apis.mjs +9 -0
  373. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  374. package/src/session-runtime/boot/providers.mjs +3 -0
  375. package/src/session-runtime/boot/tools.mjs +11 -2
  376. package/src/session-runtime/bot-status.mjs +12 -6
  377. package/src/session-runtime/bot-target.mjs +38 -0
  378. package/src/session-runtime/channel-config-api.mjs +6 -1
  379. package/src/session-runtime/config-lifecycle.mjs +6 -0
  380. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  381. package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
  382. package/src/session-runtime/conversation-import/discovery.mjs +271 -25
  383. package/src/session-runtime/conversation-import/service.mjs +26 -5
  384. package/src/session-runtime/handoff-attachments.mjs +82 -31
  385. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
  386. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
  387. package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
  388. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
  389. package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
  390. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  391. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  392. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  393. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  394. package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
  395. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  396. package/src/session-runtime/mixy-heartbeat.mjs +153 -33
  397. package/src/session-runtime/model-route/set-route.mjs +11 -2
  398. package/src/session-runtime/notification-bus.mjs +31 -117
  399. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  400. package/src/session-runtime/notification-listeners.mjs +76 -0
  401. package/src/session-runtime/owned-automation-run.mjs +2 -1
  402. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  403. package/src/session-runtime/provider-catalog-cache.mjs +82 -36
  404. package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
  405. package/src/session-runtime/provider-models.mjs +4 -2
  406. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  407. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  408. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  409. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  410. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  411. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  412. package/src/session-runtime/resource-recall-api.mjs +6 -1
  413. package/src/session-runtime/routine-owner.mjs +40 -9
  414. package/src/session-runtime/runtime-feature-gates.mjs +5 -1
  415. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  416. package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
  417. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
  418. package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
  419. package/src/session-runtime/services/agent-tool/render.mjs +71 -17
  420. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +13 -4
  421. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  422. package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
  423. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  424. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  425. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  426. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  427. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  428. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  429. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  430. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  431. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  432. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  433. package/src/session-runtime/services/channel-admin.mjs +7 -13
  434. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  435. package/src/session-runtime/services/provider-admin.mjs +2 -1
  436. package/src/session-runtime/services/seeds.mjs +0 -28
  437. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  438. package/src/session-runtime/session-create/session-options.mjs +1 -0
  439. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  440. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  441. package/src/session-runtime/settings-system-api.mjs +13 -1
  442. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  443. package/src/session-runtime/setup-tool/executor.mjs +145 -22
  444. package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
  445. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  446. package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
  447. package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
  448. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  449. package/src/session-runtime/tool-policy/policy-stage.mjs +17 -2
  450. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  451. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
  452. package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
  453. package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
  454. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  455. package/src/session-runtime/workspace/transitions.mjs +25 -0
  456. package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
  457. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  458. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  459. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  460. package/src/standalone/channel-transport.mjs +1 -1
  461. package/src/standalone/daemon-channels-loader.mjs +10 -8
  462. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  463. package/src/standalone/daemon-session-control/request.mjs +51 -0
  464. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  465. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  466. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  467. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  468. package/src/standalone/daemon-session-control.mjs +142 -190
  469. package/src/standalone/daemon.mjs +26 -3
  470. package/src/standalone/session-client.mjs +7 -3
  471. package/src/standalone/session-protocol.mjs +5 -0
  472. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  473. package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
  474. package/src/standalone/session-service/quota-resume.mjs +3 -0
  475. package/src/standalone/session-service/retention/busy.mjs +65 -1
  476. package/src/standalone/session-service/session-calls/session-action.mjs +30 -2
  477. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  478. package/src/standalone/session-tool-output.mjs +15 -7
  479. package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
  480. package/src/tui/app/app-view/floating-panel.jsx +7 -4
  481. package/src/tui/app/model-options.mjs +3 -28
  482. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
  483. package/src/tui/app/model-picker/route-selection.mjs +5 -6
  484. package/src/tui/app/provider-setup/oauth-actions.mjs +38 -20
  485. package/src/tui/app/provider-setup/provider-items.mjs +8 -2
  486. package/src/tui/app/provider-setup-picker.mjs +9 -5
  487. package/src/tui/components/QuestionPanel.jsx +13 -4
  488. package/src/tui/dist/index.mjs +133 -92
  489. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  490. package/src/tui/session/initial-state.mjs +3 -0
  491. package/src/tui/session/notice-surface.mjs +7 -1
  492. package/src/tui/session/queue-helpers.mjs +3 -42
  493. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  494. package/src/tui/session/session-api/routes-write.mjs +5 -1
  495. package/src/tui/session/session-api/routes.mjs +1 -0
  496. package/src/tui/session/session-api/settings.mjs +17 -1
  497. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  498. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  499. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  500. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  501. package/src/tui/session/session-flow/drain.mjs +118 -149
  502. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  503. package/src/tui/session/session-flow/queue/take-entries.mjs +16 -2
  504. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  505. package/src/tui/session/tool-approval-request.mjs +39 -0
  506. package/src/tui/session/tool-approval-settle.mjs +62 -0
  507. package/src/tui/session/tool-approval.mjs +69 -115
  508. package/src/tui/session/tui-steering-persist.mjs +8 -1
  509. package/src/tui/session/turn-stream.mjs +19 -2
  510. package/src/tui/session/turn.mjs +1 -0
  511. package/src/ui/statusline-agents.mjs +1 -3
  512. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  513. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  514. package/scripts/code-graph-description-contract.mjs +0 -188
  515. package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
@@ -0,0 +1,27 @@
1
+ // Keeps a live session's compaction settings on the saved global ones. One
2
+ // helper for every path that can leave a session behind the config: saving the
3
+ // settings, a shared-config reload, and adopting a resumed or swapped session.
4
+ import { normalizeCompactionConfig } from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
5
+ import { COMPACTION_CONFIG_KEYS } from '../runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs';
6
+
7
+ /** A headless caller injects its own isolated config: its sessions keep the
8
+ * compaction they were created with instead of following the profile on disk. */
9
+ export function usesInjectedConfig(params) {
10
+ return Boolean(params?.initialConfig) && typeof params.initialConfig === 'object';
11
+ }
12
+
13
+ /** Replace the live session's compaction fields with the saved (normalized) ones. */
14
+ export function adoptSessionCompaction(session, saved) {
15
+ if (!session) return;
16
+ const currentSessionCompaction = { ...(session.compaction || {}) };
17
+ // Anything outside the config-owned set (per-session thresholds, archive
18
+ // state, timing) is the session's own and survives.
19
+ for (const key of COMPACTION_CONFIG_KEYS) delete currentSessionCompaction[key];
20
+ session.compaction = { ...currentSessionCompaction, ...saved };
21
+ }
22
+
23
+ /** Follow `config.compaction` on a session; a config without the section leaves it alone. */
24
+ export function syncSessionCompaction(session, config) {
25
+ if (!config?.compaction || typeof config.compaction !== 'object') return;
26
+ adoptSessionCompaction(session, normalizeCompactionConfig(config.compaction));
27
+ }
@@ -33,6 +33,7 @@ function agentOwnedSessionFields(sessionProfile) {
33
33
  agentTag: sessionProfile?.agentTag || null,
34
34
  taskType: sessionProfile?.taskType || null,
35
35
  ...(sessionProfile?.routeFallbacks !== undefined ? { routeFallbacks: sessionProfile.routeFallbacks } : {}),
36
+ ...(sessionProfile?.routeFallbackSource ? { routeFallbackSource: sessionProfile.routeFallbackSource } : {}),
36
37
  permission: sessionProfile?.permission || undefined,
37
38
  permissionMode: sessionProfile?.permissionMode || undefined,
38
39
  schemaAllowedTools: Array.isArray(sessionProfile?.schemaAllowedTools)
@@ -96,6 +96,17 @@ export function createBuiltinToolSettings(
96
96
  saveConfigAndAdopt({ ...getConfig(), aiSessionTitles: enabled !== false });
97
97
  return this.getSessionTitleSettings();
98
98
  },
99
+ // Prompt-cache warming on/off (orchestrator session/cache-warm.mjs);
100
+ // default on. The warmer reads the saved value at each
101
+ // warm, so a change applies without a restart.
102
+ getCacheWarmingSettings() {
103
+ return { enabled: getConfig()?.promptCacheWarming !== false };
104
+ },
105
+ setCacheWarmingEnabled(enabled) {
106
+ if (typeof enabled !== 'boolean') throw new TypeError('cache warming must be on or off (a boolean)');
107
+ saveConfigAndAdopt({ ...getConfig(), promptCacheWarming: enabled });
108
+ return this.getCacheWarmingSettings();
109
+ },
99
110
  // The one pixel face every Lead row on the bot page wears, shared by every
100
111
  // device that follows this host. Only a mascot look counts; null (the
101
112
  // default grey pup) is stored as no key.
@@ -6,38 +6,8 @@ import {
6
6
  import { isAutoClearUnlimited } from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
7
7
  import { COMPACTION_SUMMARY_MODES } from '../runtime/agent/orchestrator/session/compact/summary-mode.mjs';
8
8
 
9
- // Every spelling of the main-context buffer budget; a new representation
10
- // replaces the previous one.
11
- const MAIN_BUFFER_KEYS = [
12
- 'mainBufferTokens',
13
- 'mainBuffer',
14
- 'mainBufferPercent',
15
- 'mainBufferPct',
16
- 'mainBufferRatio',
17
- 'mainBufferFraction',
18
- ];
19
- // Session-level compaction fields that the saved config owns from now on.
20
- const SESSION_COMPACTION_KEYS = [
21
- 'type',
22
- 'compactType',
23
- 'compact_type',
24
- 'semantic',
25
- 'semanticModel',
26
- 'prune',
27
- 'tailTurns',
28
- 'recallMemoryTimeoutMs',
29
- 'recallIngestLimit',
30
- 'recallChunkLimit',
31
- 'recallLimit',
32
- 'recallCycle1BatchSize',
33
- 'recallRowsPerSession',
34
- 'recallWindowSize',
35
- 'recallConcurrency',
36
- 'recallCycle1DeadlineMs',
37
- // Replaced by summaryMode.
38
- 'useMaintainer',
39
- ...MAIN_BUFFER_KEYS,
40
- ];
9
+ import { MAIN_BUFFER_KEYS } from '../runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs';
10
+ import { adoptSessionCompaction } from './session-compaction-sync.mjs';
41
11
 
42
12
  // Unlimited (never auto-clear) typed as a duration.
43
13
  const UNLIMITED_DURATION = /^(?:unlimited|never)$/i;
@@ -66,14 +36,6 @@ function applyCompactionInput(next, input, hasOwn) {
66
36
  return next;
67
37
  }
68
38
 
69
- /** Replace the live session's compaction fields with the saved config's. */
70
- function adoptSessionCompaction(session, saved) {
71
- if (!session) return;
72
- const currentSessionCompaction = { ...(session.compaction || {}) };
73
- for (const key of SESSION_COMPACTION_KEYS) delete currentSessionCompaction[key];
74
- session.compaction = { ...currentSessionCompaction, ...saved };
75
- }
76
-
77
39
  // Advanced picker shows only providers the user actually has enabled
78
40
  // (config.providers[*].enabled), plus the active route provider, any
79
41
  // provider with a custom override, and the 'default' fallback row —
@@ -1,5 +1,10 @@
1
1
  // Automation worker status, the system shell, self-update, Mixy's heartbeat
2
2
  // and bots' reactions settings.
3
+ import {
4
+ normalizeHeartbeatIntervalMinutes,
5
+ requireHeartbeatIntervalMinutes,
6
+ } from '../runtime/shared/heartbeat-interval.mjs';
7
+
3
8
  export function createSystemSettings({
4
9
  getConfig,
5
10
  saveConfigAndAdopt,
@@ -51,12 +56,19 @@ export function createSystemSettings({
51
56
  return this.getUpdateSettings();
52
57
  },
53
58
  getHeartbeatSettings() {
54
- return { heartbeat: getConfig()?.heartbeat !== false };
59
+ return {
60
+ heartbeat: getConfig()?.heartbeat !== false,
61
+ intervalMinutes: normalizeHeartbeatIntervalMinutes(getConfig()?.heartbeatIntervalMinutes),
62
+ };
55
63
  },
56
64
  setHeartbeatEnabled(enabled) {
57
65
  saveConfigAndAdopt({ ...getConfig(), heartbeat: enabled === true });
58
66
  return this.getHeartbeatSettings();
59
67
  },
68
+ setHeartbeatInterval(minutes) {
69
+ saveConfigAndAdopt({ ...getConfig(), heartbeatIntervalMinutes: requireHeartbeatIntervalMinutes(minutes) });
70
+ return this.getHeartbeatSettings();
71
+ },
60
72
  getReactionSettings() {
61
73
  return { reactions: getConfig()?.reactions !== false };
62
74
  },
@@ -0,0 +1,65 @@
1
+ /** Setup actions for per-agent and per-project switches and the bot roster:
2
+ * action permissions, connector switches, archived bots, bot order and
3
+ * prompt-cache warming. Each goes through the runtime method its settings
4
+ * surface uses. Permission and connector writes are made as a remote client's
5
+ * are (`noWiden`): a chat may take authority away, never give an agent more
6
+ * without asking — that stays with the person in the desktop app. */
7
+ import { agentPermissions, setAgentPermission } from '../../runtime/agent/orchestrator/session/human-gate/store.mjs';
8
+ import { clean } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
9
+
10
+ const NO_WIDEN = Object.freeze({ noWiden: true });
11
+
12
+ function requireText(value, label) {
13
+ const text = clean(value);
14
+ if (!text) throw new Error(`${label} is required`);
15
+ return text;
16
+ }
17
+
18
+ export const AGENT_SETTINGS_HANDLERS = {
19
+ async read_agent_settings(rt, args) {
20
+ const agent = requireText(args.agent, 'agent');
21
+ const [permissions, connectors, alwaysAllowedTools] = await Promise.all([
22
+ agentPermissions(agent),
23
+ rt.getAgentConnectors(agent),
24
+ rt.getAgentAlwaysAllowedTools(agent),
25
+ ]);
26
+ return { agent, permissions, connectors, alwaysAllowedTools };
27
+ },
28
+ read_project_connectors: async (rt, args) => {
29
+ const projectPath = requireText(args.projectPath, 'projectPath');
30
+ return { projectPath, connectors: await rt.getProjectConnectors(projectPath) };
31
+ },
32
+ async set_agent_permission(_rt, args) {
33
+ const agent = requireText(args.agent, 'agent');
34
+ return { agent, permissions: await setAgentPermission(agent, args.actionKind, args.permissionMode, NO_WIDEN) };
35
+ },
36
+ async set_agent_connector(rt, args) {
37
+ const agent = requireText(args.agent, 'agent');
38
+ const name = requireText(args.name, 'name');
39
+ return { agent, connectors: await rt.setAgentConnectorEnabled(agent, name, args.enabled, NO_WIDEN) };
40
+ },
41
+ async set_agent_connector_tool(rt, args) {
42
+ const agent = requireText(args.agent, 'agent');
43
+ const name = requireText(args.name, 'name');
44
+ const tool = requireText(args.tool, 'tool');
45
+ await rt.setAgentConnectorToolPermission(agent, name, tool, args.permission, NO_WIDEN);
46
+ return { agent, connector: name, tool, permission: args.permission };
47
+ },
48
+ async set_project_connector(rt, args) {
49
+ const projectPath = requireText(args.projectPath, 'projectPath');
50
+ const name = requireText(args.name, 'name');
51
+ return { projectPath, connectors: await rt.setProjectConnectorEnabled(projectPath, name, args.enabled, NO_WIDEN) };
52
+ },
53
+ async restore_definition(rt, args) {
54
+ if (args.definitionKind !== 'agent') {
55
+ throw new Error('Only an archived agent or bot can be restored; a deleted workflow is gone');
56
+ }
57
+ const name = requireText(args.name, 'name');
58
+ await rt.restoreAgentDefinition(name);
59
+ return { restored: name, note: 'Its chat is back; its routines stay off until they are turned on.' };
60
+ },
61
+ set_bot_order: (rt, args) => ({ botOrder: rt.setBotOrder(args.botOrder).order }),
62
+ set_cache_warming_enabled: (rt, args) => ({
63
+ promptCacheWarming: rt.setCacheWarmingEnabled(args.enabled).enabled,
64
+ }),
65
+ };
@@ -7,6 +7,10 @@ import { builtinFeatureActive } from '../../runtime/agent/orchestrator/runtime-c
7
7
  import { ORCHESTRATION_MODES } from '../../runtime/shared/orchestration.mjs';
8
8
  import { AUTO_EFFORT_BASES } from '../../runtime/agent/orchestrator/providers/auto-effort.mjs';
9
9
  import { INSTRUCTION_FILES_MODES } from '../../runtime/shared/instruction-files-mode.mjs';
10
+ import {
11
+ normalizeHeartbeatIntervalMinutes,
12
+ requireHeartbeatIntervalMinutes,
13
+ } from '../../runtime/shared/heartbeat-interval.mjs';
10
14
  import { MEDIA_KINDS } from '../../runtime/media/tool-defs.mjs';
11
15
  import { SETUP_DESKTOP_DOMAINS, SETUP_HANDOFFS } from './settings-contract.mjs';
12
16
  import { executeExtendedSetupAction, publicAutomation, publicHookRule, validateMcpInput } from './extended-actions.mjs';
@@ -30,8 +34,32 @@ import { schemaValueError } from '../../runtime/shared/schema-value-error.mjs';
30
34
  import { clean } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
31
35
  import { CONNECTOR_IDS, connectorById } from '../../runtime/shared/connector-catalog.mjs';
32
36
  import profileConfig from '../../runtime/shared/profile-config.cjs';
37
+ import { SESSION_ROUTE_HANDLERS, routePositionsStatus } from './session-route-actions.mjs';
38
+ import { AGENT_SETTINGS_HANDLERS } from './agent-settings-actions.mjs';
39
+ import {
40
+ routeFallbackPosition,
41
+ sessionChainSource,
42
+ sessionRoutePrimary,
43
+ } from '../../runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs';
44
+ import { sameRouteModel } from '../../runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs';
45
+
46
+ const AGENT_DEFINITION_ACTIONS = new Set([
47
+ 'create_definition',
48
+ 'save_definition',
49
+ 'delete_definition',
50
+ 'restore_definition',
51
+ ]);
52
+ // Actions on one agent's own settings: another agent's thread changes only its own.
53
+ const OWN_AGENT_ACTIONS = new Set([
54
+ 'set_agent_route',
55
+ 'set_agent_permission',
56
+ 'set_agent_connector',
57
+ 'set_agent_connector_tool',
58
+ ]);
33
59
 
34
- const AGENT_DEFINITION_ACTIONS = new Set(['create_definition', 'save_definition', 'delete_definition']);
60
+ // How a fallback chain edit reaches sessions that already run (route-fallback-chain.mjs).
61
+ const CHAIN_APPLIES =
62
+ 'a changed fallback chain reaches running sessions on that route from their next fallback hop ([] stops further hops at once; the turn ends with the provider error)';
35
63
 
36
64
  const PROFILE_VALUE_IDS = Object.freeze({
37
65
  language: profileConfig.PROFILE_LANGUAGES.map((entry) => entry.id),
@@ -39,8 +67,20 @@ const PROFILE_VALUE_IDS = Object.freeze({
39
67
  });
40
68
 
41
69
  const ACTION_APPLIES_TO = {
42
- set_agent_route:
43
- "the bot's chats from their next turn (a running turn finishes on the old model); an agent switched on or off reaches open conversations from their next turn as an agent list reminder",
70
+ set_route: `new sessions (an established conversation keeps its model); ${CHAIN_APPLIES}: Lead conversations and agents that inherit Main`,
71
+ set_agent_route: `the bot's chats from their next turn (a running turn finishes on the old model); ${CHAIN_APPLIES}: its chats and sub-agents; an agent switched on or off reaches open conversations from their next turn as an agent list reminder`,
72
+ reset_route_fallback:
73
+ 'each listed session from its next turn (a running turn finishes on its fallback model): it returns to its primary and its chain starts over',
74
+ continue_in_model: 'that session now; its stopped turn is not resent',
75
+ schedule_quota_resume: "that session's stopped turn, resent at the provider's reset time",
76
+ cancel_quota_resume: 'that session: its pending resume is dropped; the turn stays stopped',
77
+ set_cache_warming_enabled: 'the next prompt-cache warm of every session; no restart required',
78
+ set_agent_permission: "that agent's next action of the kind, in every session",
79
+ set_agent_connector: "that agent's next connector tool call, in every session",
80
+ set_agent_connector_tool: "that agent's next call of the tool, in every session",
81
+ set_project_connector: 'the next connector tool call of sessions in that Project',
82
+ restore_definition: 'now: the bot and its chat return; its routines stay off',
83
+ set_bot_order: 'the Bots page and the Sessions bot section on every device',
44
84
  set_orchestration_mode:
45
85
  "new sessions and an empty current one (the default mode); a conversation keeps its own mode until it is switched with the composer's mode selector",
46
86
  set_recap_enabled: 'background Memory cycles; no restart required',
@@ -48,7 +88,9 @@ const ACTION_APPLIES_TO = {
48
88
  set_ai_session_titles: 'titles generated from now on; existing titles are unchanged',
49
89
  set_quota_auto_resume: 'subsequent usage-limit stops; turning it off cancels pending resumes',
50
90
  set_model_preferences: 'the /model picker and model management lists',
51
- set_heartbeat_enabled: "Mixy's next heartbeat check (every 30 minutes); no restart required",
91
+ set_heartbeat_enabled: "Mixy's next heartbeat check; no restart required",
92
+ set_heartbeat_interval:
93
+ "Mixy's heartbeat from the next tick: the next check is due the new interval after the last one; no restart required",
52
94
  set_reactions_enabled:
53
95
  "bots' chats; while off a reaction is refused at once and new chats are not offered the tool; reactions already left stay visible",
54
96
  set_worktree_settings: 'new tasks and worktrees created afterwards; existing worktrees are unchanged',
@@ -124,6 +166,31 @@ function routeInput(source) {
124
166
  return next;
125
167
  }
126
168
 
169
+ /** A fallback chain edit's receipt: whether the calling conversation now
170
+ * follows the saved chain, and the position it reads it from. `owner` is
171
+ * whose route was edited: `{ kind: 'lead' }` (set_route) or `{ kind: 'bot',
172
+ * agent }` (set_agent_route); only a caller whose chain comes from that
173
+ * route's settings follows it. */
174
+ function chainReceipt(route, { caller, getConfig }, owner) {
175
+ if (!Object.hasOwn(route, 'fallbacks') || !caller?.agent) return {};
176
+ const config = getConfig();
177
+ const position = routeFallbackPosition(caller, config);
178
+ // Settings-sourced and still on that route's primary: a conversation left on
179
+ // a previous model follows no chain, whatever the saved one is.
180
+ const source = sessionChainSource(caller, config);
181
+ const followsEdited =
182
+ position.chainFrom === 'settings' &&
183
+ sameRouteModel(source, sessionRoutePrimary(caller)) &&
184
+ position.kind === owner.kind &&
185
+ (owner.kind !== 'bot' || position.agent === owner.agent);
186
+ const saved = route.fallbacks.map((entry) => `${entry.provider}/${entry.model}`);
187
+ const followed = position.fallbacks.map((entry) => `${entry.provider}/${entry.model}`);
188
+ return {
189
+ appliedToCurrentSession: followsEdited && saved.join('\n') === followed.join('\n'),
190
+ currentSession: position,
191
+ };
192
+ }
193
+
127
194
  function apiKeySource(row) {
128
195
  if (row.env) return `env:${row.envName}`;
129
196
  return row.stored ? 'keychain' : 'none';
@@ -232,6 +299,18 @@ function mcpRows(status) {
232
299
  error: server.error || null,
233
300
  ...(server.warnings?.length ? { warnings: server.warnings } : {}),
234
301
  scope: Array.isArray(server.scope) ? server.scope : null,
302
+ ...(server.connector ? { connector: server.connector } : {}),
303
+ // A multi-account connector's accounts: remove_mcp_server / sign-in take an account's name.
304
+ ...(Array.isArray(server.accounts)
305
+ ? {
306
+ accounts: server.accounts.map((account) => ({
307
+ name: account.name,
308
+ email: account.email || '',
309
+ ...(account.authRequired ? { authRequired: true } : {}),
310
+ ...(account.error ? { error: account.error } : {}),
311
+ })),
312
+ }
313
+ : {}),
235
314
  })),
236
315
  ...(status?.warnings?.length ? { warnings: status.warnings } : {}),
237
316
  ...(status?.declarationErrors?.length ? { declarationErrors: status.declarationErrors } : {}),
@@ -284,14 +363,20 @@ async function featureStatus(rt, getConfig) {
284
363
  browser: { active: builtinFeatureActive(config, 'browser') },
285
364
  computer: { active: builtinFeatureActive(config, 'computer') },
286
365
  terminal: { active: builtinFeatureActive(config, 'terminal') },
287
- heartbeat: { enabled: config?.heartbeat !== false },
366
+ heartbeat: {
367
+ enabled: config?.heartbeat !== false,
368
+ intervalMinutes: normalizeHeartbeatIntervalMinutes(config?.heartbeatIntervalMinutes),
369
+ },
288
370
  reactions: { enabled: config?.reactions !== false },
289
371
  voice: rt.getVoiceStatus ? voiceFeatureStatus(await rt.getVoiceStatus()) : null,
290
372
  };
291
373
  }
292
374
 
293
375
  async function mediaDefaults(rt) {
294
- const [pins, ...rows] = await Promise.all([rt.getMediaPins(), ...MEDIA_KINDS.map((kind) => rt.getMediaDefault(kind))]);
376
+ const [pins, ...rows] = await Promise.all([
377
+ rt.getMediaPins(),
378
+ ...MEDIA_KINDS.map((kind) => rt.getMediaDefault(kind)),
379
+ ]);
295
380
  const fieldsOf = (row, fields) => (row ? Object.fromEntries(fields.map((field) => [field, row[field]])) : null);
296
381
  return {
297
382
  // The default generator (Settings → Built-in → Media generation); null = Auto.
@@ -335,7 +420,7 @@ const SETUP_STATUS_READERS = {
335
420
  features: await featureStatus(rt, getConfig),
336
421
  onboarding: rt.getOnboardingStatus?.() || null,
337
422
  }),
338
- model: (rt) => ({
423
+ model: (rt, { getConfig, caller }) => ({
339
424
  route: {
340
425
  ...mainRoute(rt),
341
426
  autoEffort: rt.autoEffort !== false,
@@ -343,11 +428,16 @@ const SETUP_STATUS_READERS = {
343
428
  fallbacks: (rt.listPresets?.() || []).find((preset) => preset?.id === 'workflow-lead')?.fallbacks || [],
344
429
  },
345
430
  effortOptions: rt.effortOptions || [],
431
+ // Where this conversation and the other Lead conversations are on their chain.
432
+ ...routePositionsStatus({ caller, config: getConfig(), keep: (row) => row.kind === 'lead' }),
346
433
  }),
347
- agents: (rt) => ({
434
+ agents: (rt, { getConfig, caller }) => ({
348
435
  agents: rt.listAgents?.() || [],
349
436
  orchestrationMode: rt.getOrchestrationMode(),
350
437
  orchestrationModes: ORCHESTRATION_MODES,
438
+ ...(rt.getBotOrder ? { botOrder: rt.getBotOrder().order } : {}),
439
+ // Bot chats and sub-agents on their fallback chains.
440
+ sessions: routePositionsStatus({ caller, config: getConfig(), keep: (row) => row.kind !== 'lead' }).sessions,
351
441
  }),
352
442
  workflow: (rt) => ({ workflows: rt.listWorkflows?.() || [] }),
353
443
  websearch: (rt) => ({
@@ -366,7 +456,11 @@ const SETUP_STATUS_READERS = {
366
456
  };
367
457
  },
368
458
  autoclear: (rt) => rt.getAutoClear?.() || {},
369
- compaction: (rt) => ({ ...(rt.getCompactionSettings?.() || {}), ...(rt.getSessionTitleSettings?.() || {}) }),
459
+ compaction: (rt) => ({
460
+ ...(rt.getCompactionSettings?.() || {}),
461
+ ...(rt.getSessionTitleSettings?.() || {}),
462
+ ...(rt.getCacheWarmingSettings ? { promptCacheWarming: rt.getCacheWarmingSettings().enabled } : {}),
463
+ }),
370
464
  memory: (rt) => ({ ...(rt.getToolModuleSettings?.()?.memory || {}), recap: rt.getRecapSettings?.() || null }),
371
465
  'local-provider': (rt) => rt.getToolModuleSettings().localProvider,
372
466
  features: (rt, { getConfig }) => featureStatus(rt, getConfig),
@@ -496,22 +590,28 @@ const SETUP_INSTALLABLE_FEATURES = [
496
590
  // Action handlers: (rt, args, { requestDesktop, readStatus, openSurface }).
497
591
  // `rt` is null for `status` and `open`, which never touch the facade.
498
592
  const SETUP_ACTION_HANDLERS = {
499
- status: async (_rt, args, { readStatus, requestDesktop }) => {
593
+ status: async (_rt, args, { readStatus, requestDesktop, caller }) => {
500
594
  const domain = clean(args.domain) || 'summary';
501
595
  requireEnum(domain, SETUP_STATUS_DOMAINS, 'domain');
502
- return { domain, ...(await readStatus(domain, requestDesktop, args.detail === true)) };
596
+ return { domain, ...(await readStatus(domain, requestDesktop, args.detail === true, caller)) };
503
597
  },
504
598
  open: (_rt, args, { openSurface }) => openSurface(args.target),
505
- set_route: async (rt, args) => {
599
+ set_route: async (rt, args, context) => {
506
600
  const route = routeInput(args.route);
507
601
  const next = await rt.setRoute(route, { keepMainModel: false });
508
- return { route: next, appliesTo: 'next session (a conversation keeps its frozen route)' };
602
+ return { route: next, ...chainReceipt(args.route, context, { kind: 'lead' }) };
509
603
  },
510
- set_agent_route: async (rt, args) => {
604
+ set_agent_route: async (rt, args, context) => {
511
605
  const agent = requireText(args.agent, 'agent');
512
606
  const route = routeInput(args.route);
513
- return { agent, route: await rt.setAgentRoute(agent, route) };
607
+ return {
608
+ agent,
609
+ route: await rt.setAgentRoute(agent, route),
610
+ ...chainReceipt(args.route, context, { kind: 'bot', agent }),
611
+ };
514
612
  },
613
+ ...SESSION_ROUTE_HANDLERS,
614
+ ...AGENT_SETTINGS_HANDLERS,
515
615
  set_web_search_route: async (rt, args) => ({ route: await rt.setWebSearchRoute(routeInput(args.route)) }),
516
616
  set_workflow: (rt, args) => rt.setWorkflow(requireText(args.workflow, 'workflow')),
517
617
  set_output_style: async (rt, args) => {
@@ -621,14 +721,18 @@ const SETUP_ACTION_HANDLERS = {
621
721
  set_system_shell: (rt, args) => rt.setSystemShell({ command: clean(args.command) }),
622
722
  set_auto_update: (rt, args) => rt.setAutoUpdate(requireBoolean(args.enabled)),
623
723
  set_ai_session_titles: (rt, args) => rt.setAiSessionTitles(requireBoolean(args.enabled)),
624
- set_quota_auto_resume: async (rt, args) => ({ quotaAutoResume: await rt.setQuotaAutoResume(requireBoolean(args.enabled)) }),
724
+ set_quota_auto_resume: async (rt, args) => ({
725
+ quotaAutoResume: await rt.setQuotaAutoResume(requireBoolean(args.enabled)),
726
+ }),
625
727
  set_model_preferences: async (rt, args) => {
626
728
  const change = { model: requireText(args.model, 'model') };
627
- for (const key of ['hidden', 'favorite']) if (Object.hasOwn(args, key)) change[key] = requireBoolean(args[key], key);
729
+ for (const key of ['hidden', 'favorite'])
730
+ if (Object.hasOwn(args, key)) change[key] = requireBoolean(args[key], key);
628
731
  if (Object.keys(change).length === 1) throw new Error('hidden or favorite is required');
629
732
  return rt.setModelPreferences(requireText(args.provider, 'provider'), [change]);
630
733
  },
631
734
  set_heartbeat_enabled: (rt, args) => rt.setHeartbeatEnabled(requireBoolean(args.enabled)),
735
+ set_heartbeat_interval: (rt, args) => rt.setHeartbeatInterval(requireHeartbeatIntervalMinutes(args.minutes)),
632
736
  set_reactions_enabled: (rt, args) => rt.setReactionsEnabled(requireBoolean(args.enabled)),
633
737
  set_worktree_settings: (rt, args) => rt.setWorktreeSettings(args.worktree),
634
738
  forget_provider_auth: async (rt, args) => {
@@ -736,6 +840,8 @@ const READ_ONLY_SETUP_ACTIONS = new Set([
736
840
  'search_local_models',
737
841
  'inspect_hf_model',
738
842
  'local_model_details',
843
+ 'read_agent_settings',
844
+ 'read_project_connectors',
739
845
  ]);
740
846
  // Actions that start or steer work rather than saving a setting.
741
847
  const BACKGROUND_SETUP_ACTIONS = new Set([
@@ -744,6 +850,10 @@ const BACKGROUND_SETUP_ACTIONS = new Set([
744
850
  'cancel_local_installation',
745
851
  'reconnect_mcp',
746
852
  'run_automation',
853
+ 'reset_route_fallback',
854
+ 'continue_in_model',
855
+ 'schedule_quota_resume',
856
+ 'cancel_quota_resume',
747
857
  ]);
748
858
 
749
859
  function setupMutationReceipt(action, result) {
@@ -768,6 +878,7 @@ export function createSetupToolExecutor({
768
878
  getSessionId,
769
879
  getCallerSession,
770
880
  flushSettings,
881
+ executeSessionControl = null,
771
882
  }) {
772
883
  const desktop = createSetupUiRequests({ notifySessionUi, getSessionId });
773
884
  const api = () => {
@@ -776,11 +887,11 @@ export function createSetupToolExecutor({
776
887
  return facade;
777
888
  };
778
889
 
779
- async function readStatus(domain, requestDesktop, detail) {
890
+ async function readStatus(domain, requestDesktop, detail, caller = null) {
780
891
  const rt = api();
781
892
  if (SETUP_DESKTOP_DOMAINS.includes(domain)) return requestDesktop({ action: 'status', domain });
782
893
  if (!Object.hasOwn(SETUP_STATUS_READERS, domain)) throw new Error(`setup: unknown status domain "${domain}"`);
783
- return SETUP_STATUS_READERS[domain](rt, { domain, detail, getConfig: () => getConfig?.() || {} });
894
+ return SETUP_STATUS_READERS[domain](rt, { domain, detail, caller, getConfig: () => getConfig?.() || {} });
784
895
  }
785
896
 
786
897
  function openSurface(target) {
@@ -809,15 +920,16 @@ export function createSetupToolExecutor({
809
920
  // it never creates agents, definitions or automations, nor changes any
810
921
  // other setting. Hosts without session provenance (no getCallerSession)
811
922
  // skip this gate; automation actions still refuse an unknown caller.
923
+ let scope = null;
812
924
  if (getCallerSession && !READ_ONLY_SETUP_ACTIONS.has(action)) {
813
- const scope = scheduleCallerScope(caller);
925
+ scope = scheduleCallerScope(caller);
814
926
  assertInteractiveCaller(scope, action);
815
927
  // Agent definitions (contacts) change only from Mixy; another agent's
816
928
  // home changes only its own agent settings.
817
929
  if (AGENT_DEFINITION_ACTIONS.has(action) && args.definitionKind === 'agent') {
818
930
  assertAgentEditorAccess(scope, caller, action);
819
931
  }
820
- if (action === 'set_agent_route') assertOwnAgentSettings(scope, args.agent, action);
932
+ if (OWN_AGENT_ACTIONS.has(action)) assertOwnAgentSettings(scope, args.agent, action);
821
933
  }
822
934
  // Mixy's heartbeat session takes only its two routine actions, reads included.
823
935
  assertHeartbeatSetupAction(sessionId, action, args);
@@ -825,7 +937,18 @@ export function createSetupToolExecutor({
825
937
  if (!Object.hasOwn(SETUP_ACTION_HANDLERS, action)) {
826
938
  return executeExtendedSetupAction(rt, args, requestDesktop, { sessionId, caller });
827
939
  }
828
- return SETUP_ACTION_HANDLERS[action](rt, args, { requestDesktop, readStatus, openSurface });
940
+ return SETUP_ACTION_HANDLERS[action](rt, args, {
941
+ requestDesktop,
942
+ readStatus,
943
+ openSurface,
944
+ sessionId,
945
+ caller,
946
+ // The session-scoped actions authorize each target against it (session-route-actions.mjs).
947
+ scope,
948
+ getSession: getCallerSession,
949
+ getConfig: () => getConfig?.() || {},
950
+ executeSessionControl,
951
+ });
829
952
  }
830
953
 
831
954
  return {
@@ -71,7 +71,10 @@ function modelDetail(row) {
71
71
  defaultModelParameters: row.defaultModelParameters,
72
72
  supportsMaxMode: row.supportsMaxMode,
73
73
  };
74
- return { ...Object.fromEntries(Object.entries(detail).filter(([, value]) => isPresent(value))), ...modelPreferenceFields(row) };
74
+ return {
75
+ ...Object.fromEntries(Object.entries(detail).filter(([, value]) => isPresent(value))),
76
+ ...modelPreferenceFields(row),
77
+ };
75
78
  }
76
79
 
77
80
  function findModel(rows, id, provider) {
@@ -420,7 +423,7 @@ export const EXTENDED_SETUP_HANDLERS = Object.freeze({
420
423
  if (own(args, 'model') || own(args, 'accountId')) throw new Error('model and accountId need a lane');
421
424
  return { kind: args.kind, media: await rt.setMediaPin({ kind: args.kind, lane: '' }) };
422
425
  }
423
- const lane =(await rt.listMediaLanes()).find((row) => row.id === args.lane);
426
+ const lane = (await rt.listMediaLanes()).find((row) => row.id === args.lane);
424
427
  if (!lane) throw new Error(`Unknown media lane "${args.lane}"; list lanes with the media tool`);
425
428
  if (!lane.authenticated) throw new Error(`${lane.label} is not signed in; open providers first`);
426
429
  const spec = lane[args.kind];
@@ -431,7 +434,9 @@ export const EXTENDED_SETUP_HANDLERS = Object.freeze({
431
434
  if (own(args, 'accountId')) {
432
435
  if (lane.authType !== 'oauth') throw new Error(`${lane.id} signs in with an API key; it has no accounts`);
433
436
  if (!rt.getProviderAccounts(lane.authProvider).accounts.some((row) => row.id === args.accountId)) {
434
- throw new Error(`Unknown ${lane.authProvider} account "${args.accountId}"; list accounts with status providers`);
437
+ throw new Error(
438
+ `Unknown ${lane.authProvider} account "${args.accountId}"; list accounts with status providers`
439
+ );
435
440
  }
436
441
  }
437
442
  const pin = await rt.setMediaPin({ kind: args.kind, lane: args.lane, model: args.model, account: args.accountId });