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
@@ -69,9 +69,12 @@ export function QuestionPanel({ questions, columns = 80, rows, onSubmit, onDismi
69
69
  if (text) commit({ ...s, buf: appendCapped(s.buf, text) });
70
70
  };
71
71
 
72
- usePaste((text) => {
73
- if (ref.current.typing) typeInto(text);
74
- }, { isActive: isRawModeSupported });
72
+ usePaste(
73
+ (text) => {
74
+ if (ref.current.typing) typeInto(text);
75
+ },
76
+ { isActive: isRawModeSupported }
77
+ );
75
78
 
76
79
  useInput(
77
80
  (input, key) => {
@@ -232,7 +235,13 @@ export function QuestionPanel({ questions, columns = 80, rows, onSubmit, onDismi
232
235
  }
233
236
  if (plan.below > 0) out.push(moreRow('below', `↓ ${plan.below} more`));
234
237
 
235
- const help = questionHelp({ multi, typing: state.typing, last: state.qi >= last, count: n, questionCount: questions.length });
238
+ const help = questionHelp({
239
+ multi,
240
+ typing: state.typing,
241
+ last: state.qi >= last,
242
+ count: n,
243
+ questionCount: questions.length,
244
+ });
236
245
 
237
246
  return (
238
247
  <Box flexDirection="column" flexShrink={0} width="100%">
@@ -24385,6 +24385,12 @@ var init_file_has_data = __esm({
24385
24385
  }
24386
24386
  });
24387
24387
 
24388
+ // src/runtime/shared/abort-race.mjs
24389
+ var init_abort_race = __esm({
24390
+ "src/runtime/shared/abort-race.mjs"() {
24391
+ }
24392
+ });
24393
+
24388
24394
  // src/runtime/shared/bounded-download.mjs
24389
24395
  import { createWriteStream, rmSync as rmSync2 } from "node:fs";
24390
24396
  import { Transform as Transform2 } from "node:stream";
@@ -24458,7 +24464,7 @@ async function streamResponseToFile(response, destPath, { maxBytes, expectedByte
24458
24464
  var MAX_NATIVE_BINARY_DOWNLOAD_BYTES;
24459
24465
  var init_bounded_download = __esm({
24460
24466
  "src/runtime/shared/bounded-download.mjs"() {
24461
- init_sleep();
24467
+ init_abort_race();
24462
24468
  MAX_NATIVE_BINARY_DOWNLOAD_BYTES = 256 * 1024 * 1024;
24463
24469
  }
24464
24470
  });
@@ -40971,16 +40977,7 @@ function summarizeCodeGraphResult({ text, translate }) {
40971
40977
  if (looksLikeZeroResultText(text)) return translate("No results", "No results");
40972
40978
  return null;
40973
40979
  }
40974
- function summarizeFetchResult({ text, trimmed, args, normalized, translate }) {
40975
- if (normalized === "fetch") {
40976
- const a = parseToolArgs(args);
40977
- const isChannelFetch = !firstText(a.url, a.uri) && Boolean(firstText(a.channel, a.channelId, a.chatId, a.messageId) || a.limit != null);
40978
- if (isChannelFetch) {
40979
- const n = countNonEmptyLines(text);
40980
- if (trimmed && looksLineOriented(text) && n > 0) return countLabel(translate, n, "message");
40981
- return summarizeGenericResult(text, translate);
40982
- }
40983
- }
40980
+ function summarizeFetchResult({ text }) {
40984
40981
  const status = /(?:HTTP[\s/]*\d?\.?\d?\s*|status[:\s]+)([1-5]\d{2})\b/i.exec(text) || /\b([1-5]\d{2})\s+(?:OK|Not\s+Found|Forbidden|Moved|Found|Created|No\s+Content|Bad\s+Request|Unauthorized|Internal)/.exec(
40985
40982
  text
40986
40983
  );
@@ -41079,7 +41076,7 @@ var summarizeAskUserResult = ({ text, translate }) => {
41079
41076
  };
41080
41077
  var TOOL_RESULT_SUMMARIZERS = new Map(
41081
41078
  [
41082
- [["ask_user"], summarizeAskUserResult],
41079
+ [["ask_user", "handoff_user"], summarizeAskUserResult],
41083
41080
  [["read", "view_image", "read_mcp_resource"], summarizeReadResult],
41084
41081
  [["apply_patch"], summarizePatchResult],
41085
41082
  [["grep"], summarizeGrepResult],
@@ -41243,6 +41240,7 @@ var TOOL_CATEGORY = /* @__PURE__ */ new Map([
41243
41240
  ["goal", "Setup"],
41244
41241
  ["request_user_input", "Setup"],
41245
41242
  ["ask_user", "Setup"],
41243
+ ["handoff_user", "Setup"],
41246
41244
  ["update_plan", "Setup"],
41247
41245
  ["skill", "Skill"],
41248
41246
  ["skill_execute", "Skill"],
@@ -41818,6 +41816,7 @@ var TOOL_UNITS = /* @__PURE__ */ new Map([
41818
41816
  ["code_graph", codeGraphUnit],
41819
41817
  ["request_user_input", () => unitDescriptor("Setup", { active: "Asking", done: "Asked", noun: "user" })],
41820
41818
  ["ask_user", () => unitDescriptor("Setup", { active: "Asking", done: "Asked", noun: "user" })],
41819
+ ["handoff_user", () => unitDescriptor("Setup", { active: "Asking", done: "Asked", noun: "user" })],
41821
41820
  ["update_plan", () => unitDescriptor("Setup", { active: "Updating", done: "Updated", noun: "plan" })],
41822
41821
  ["list_mcp_resources", () => unitDescriptor("Setup", { active: "Listing", done: "Listed", noun: "MCP resource" })],
41823
41822
  [
@@ -41915,6 +41914,7 @@ function displayToolName(name, args = {}) {
41915
41914
  case "request_user_input":
41916
41915
  return "Ask User";
41917
41916
  case "ask_user":
41917
+ case "handoff_user":
41918
41918
  return "Question";
41919
41919
  case "update_plan":
41920
41920
  return "Plan";
@@ -41997,6 +41997,8 @@ function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}) {
41997
41997
  return summarizeGithub(a, max);
41998
41998
  case "goal":
41999
41999
  return compactParts([String(a.action || ""), truncateToolText(a.objective, max)]);
42000
+ case "handoff_user":
42001
+ return "";
42000
42002
  case "ask_user":
42001
42003
  return truncateToolText(
42002
42004
  (Array.isArray(a.questions) ? a.questions : []).map((q) => String(q?.header || q?.question || "").trim()).filter(Boolean).join(", "),
@@ -42494,6 +42496,22 @@ function transportErrorText(error) {
42494
42496
  return `${TRANSPORT_SENTENCES[verdict.kind]}${detail ? ` (${detail})` : ""}.`;
42495
42497
  }
42496
42498
 
42499
+ // src/runtime/shared/provider-timeout-phase.mjs
42500
+ var TIMEOUT_PHASE = Object.freeze({
42501
+ // The response headers did not arrive in the first-byte window.
42502
+ HEADERS: "headers",
42503
+ // The headers arrived, the first chunk did not.
42504
+ FIRST_CHUNK: "first-chunk",
42505
+ // A stream that already produced output went silent.
42506
+ IDLE: "idle",
42507
+ // A sign-in token refresh did not answer: an auth problem, not a slow model.
42508
+ AUTH: "auth"
42509
+ });
42510
+ function isFirstByteTimeout(err) {
42511
+ const phase = err?.timeoutPhase;
42512
+ return phase === TIMEOUT_PHASE.HEADERS || phase === TIMEOUT_PHASE.FIRST_CHUNK;
42513
+ }
42514
+
42497
42515
  // src/runtime/agent/orchestrator/providers/provider-error-kind.mjs
42498
42516
  var PROVIDER_ERROR_KINDS = Object.freeze([
42499
42517
  "overloaded",
@@ -43341,20 +43359,6 @@ function describeError(value) {
43341
43359
  };
43342
43360
  }
43343
43361
 
43344
- // src/runtime/shared/provider-timeout-phase.mjs
43345
- var TIMEOUT_PHASE = Object.freeze({
43346
- // The response headers did not arrive in the first-byte window.
43347
- HEADERS: "headers",
43348
- // The headers arrived, the first chunk did not.
43349
- FIRST_CHUNK: "first-chunk",
43350
- // A stream that already produced output went silent.
43351
- IDLE: "idle"
43352
- });
43353
- function isFirstByteTimeout(err) {
43354
- const phase = err?.timeoutPhase;
43355
- return phase === TIMEOUT_PHASE.HEADERS || phase === TIMEOUT_PHASE.FIRST_CHUNK;
43356
- }
43357
-
43358
43362
  // src/runtime/shared/err-text.mjs
43359
43363
  function errorHttpStatus(err) {
43360
43364
  return Number(err?.httpStatus || err?.status || err?.response?.status || 0) || 0;
@@ -43512,16 +43516,16 @@ function hasTypedEvidence(error) {
43512
43516
  if (!error || typeof error !== "object") return false;
43513
43517
  return Boolean(error.errorKind?.kind) || errorHttpStatus(error) > 0 || Boolean(error.code) || Boolean(error.retryAfterMs);
43514
43518
  }
43515
- var timedOutMs = (text) => Number(/timed out after (\d+)ms/i.exec(text)?.[1]) || 0;
43516
- function stillThinkingText(error, text) {
43519
+ var timedOutMs = (text) => Number(/(?:timed out after|within) (\d+)ms/i.exec(text)?.[1]) || 0;
43520
+ function stillThinkingText(error, text, providerLabel) {
43517
43521
  const ms = Number(error.waitedMs) || timedOutMs(text);
43518
- const provider = typeof error.providerLabel === "string" && error.providerLabel ? error.providerLabel : "the provider";
43522
+ const provider = typeof providerLabel === "string" && providerLabel ? providerLabel : "the provider";
43519
43523
  const attempts = Number(error.attempts) > 0 ? `; attempts: ${Math.floor(Number(error.attempts))}` : "";
43520
43524
  return `Model still thinking: no output in ${formatDurationMs(ms)}; ${provider} sent nothing yet${attempts}.`;
43521
43525
  }
43522
- function typedStreamFailureText(error, text) {
43526
+ function typedStreamFailureText(error, text, providerLabel) {
43523
43527
  if (!error || typeof error !== "object") return null;
43524
- if (isFirstByteTimeout(error)) return stillThinkingText(error, text);
43528
+ if (isFirstByteTimeout(error)) return stillThinkingText(error, text, providerLabel);
43525
43529
  if (error.timeoutPhase === TIMEOUT_PHASE.IDLE) {
43526
43530
  const ms = timedOutMs(text);
43527
43531
  return ms > 0 ? `No progress ${formatDurationMs(ms)}.` : "No progress.";
@@ -43558,7 +43562,7 @@ function presentErrorText(error, options = {}) {
43558
43562
  if (embeddedError) text = embeddedError;
43559
43563
  text = oneLine(stripErrorPrefix(text));
43560
43564
  if (!text) return "Unknown error";
43561
- const streamFailure = typedStreamFailureText(error, text);
43565
+ const streamFailure = typedStreamFailureText(error, text, options.providerLabel);
43562
43566
  if (streamFailure) return streamFailure;
43563
43567
  if (code === "PROVIDER_PREFIX_MUTATION" || name === "ProviderPrefixMutationError") {
43564
43568
  return "Session state changed unexpectedly.";
@@ -44283,7 +44287,15 @@ function resolveDisplayedResult(base, { normalizedName, parsedArgs }, translate)
44283
44287
  }
44284
44288
 
44285
44289
  // src/runtime/shared/tool-card-model/card-status.mjs
44286
- var ENVELOPE_STATUS_TOOLS = /* @__PURE__ */ new Set(["agent", "bridge", "task", "web_search", "search_query", "image_query", "web_search_call"]);
44290
+ var ENVELOPE_STATUS_TOOLS = /* @__PURE__ */ new Set([
44291
+ "agent",
44292
+ "bridge",
44293
+ "task",
44294
+ "web_search",
44295
+ "search_query",
44296
+ "image_query",
44297
+ "web_search_call"
44298
+ ]);
44287
44299
  function shellFragments(base, display, isShellSurface) {
44288
44300
  if (!isShellSurface) return { shellStatus: "", shellElapsed: "" };
44289
44301
  const { pending, failedCount, exitFailedCount, isError, elapsed } = base;
@@ -54507,9 +54519,12 @@ function QuestionPanel({ questions, columns = 80, rows: rows2, onSubmit, onDismi
54507
54519
  const text = cleanTyped(input);
54508
54520
  if (text) commit({ ...s, buf: appendCapped(s.buf, text) });
54509
54521
  };
54510
- use_paste_default((text) => {
54511
- if (ref.current.typing) typeInto(text);
54512
- }, { isActive: isRawModeSupported });
54522
+ use_paste_default(
54523
+ (text) => {
54524
+ if (ref.current.typing) typeInto(text);
54525
+ },
54526
+ { isActive: isRawModeSupported }
54527
+ );
54513
54528
  use_input_default(
54514
54529
  (input, key) => {
54515
54530
  const s = ref.current;
@@ -54644,7 +54659,13 @@ function QuestionPanel({ questions, columns = 80, rows: rows2, onSubmit, onDismi
54644
54659
  else optionRow(item.index);
54645
54660
  }
54646
54661
  if (plan.below > 0) out.push(moreRow("below", `\u2193 ${plan.below} more`));
54647
- const help = questionHelp({ multi, typing: state.typing, last: state.qi >= last, count: n, questionCount: questions.length });
54662
+ const help = questionHelp({
54663
+ multi,
54664
+ typing: state.typing,
54665
+ last: state.qi >= last,
54666
+ count: n,
54667
+ questionCount: questions.length
54668
+ });
54648
54669
  return /* @__PURE__ */ jsx11(Box_default, { flexDirection: "column", flexShrink: 0, width: "100%", children: /* @__PURE__ */ jsxs9(Box_default, { flexDirection: "column", borderStyle: "round", borderColor: theme.promptBorder, paddingX: 1, width: "100%", children: [
54649
54670
  /* @__PURE__ */ jsxs9(Box_default, { flexDirection: "row", justifyContent: "space-between", children: [
54650
54671
  /* @__PURE__ */ jsx11(Box_default, { flexShrink: 1, children: /* @__PURE__ */ jsxs9(Text, { wrap: "truncate", children: [
@@ -56468,7 +56489,15 @@ function renderFloatingPanel(ctx) {
56468
56489
  );
56469
56490
  }
56470
56491
  if (btwPanel) {
56471
- return /* @__PURE__ */ jsx21(BtwPanel, { panel: btwPanel, columns: frameColumns, panelRows: floatingPanelRows, themeEpoch: ctx.state?.themeEpoch || 0 });
56492
+ return /* @__PURE__ */ jsx21(
56493
+ BtwPanel,
56494
+ {
56495
+ panel: btwPanel,
56496
+ columns: frameColumns,
56497
+ panelRows: floatingPanelRows,
56498
+ themeEpoch: ctx.state?.themeEpoch || 0
56499
+ }
56500
+ );
56472
56501
  }
56473
56502
  return null;
56474
56503
  }
@@ -59516,6 +59545,34 @@ function isRollingModelAlias(id) {
59516
59545
  return /-latest$/i.test(String(id || "").trim());
59517
59546
  }
59518
59547
 
59548
+ // src/runtime/shared/provider-display-name.mjs
59549
+ var PROVIDER_DISPLAY_NAMES = /* @__PURE__ */ new Map([
59550
+ ["openai-oauth", "OpenAI OAuth"],
59551
+ ["anthropic-oauth", "Anthropic OAuth"],
59552
+ ["grok-oauth", "Grok OAuth"],
59553
+ ["muse-code-oauth", "Muse Code"],
59554
+ ["command-code-oauth", "Command Code"],
59555
+ ["mimo-oauth", "MiMo"],
59556
+ ["cursor-oauth", "Cursor OAuth"],
59557
+ ["devin-oauth", "Devin"],
59558
+ ["antigravity-oauth", "Antigravity OAuth"],
59559
+ ["openai", "OpenAI API"],
59560
+ ["openai-api", "OpenAI API"],
59561
+ ["anthropic", "Anthropic API"],
59562
+ ["anthropic-api", "Anthropic API"],
59563
+ ["gemini", "Gemini API"],
59564
+ ["gemini-api", "Gemini API"],
59565
+ ["xai", "xAI API"],
59566
+ ["xai-api", "xAI API"],
59567
+ ["deepseek", "DeepSeek API"],
59568
+ ["deepseek-api", "DeepSeek API"],
59569
+ ["opencode-go-oauth", "OpenCode Go OAuth"],
59570
+ ["openrouter", "OpenRouter"],
59571
+ ["mixdog-local", "Local Provider"],
59572
+ ["default", "Default"]
59573
+ ]);
59574
+ var providerDisplayName = (provider) => PROVIDER_DISPLAY_NAMES.get(String(provider || "").toLowerCase()) ?? (provider || "Provider");
59575
+
59519
59576
  // src/runtime/shared/llm/openai-daybreak.mjs
59520
59577
  var DAYBREAK_PROVIDER = "openai-oauth";
59521
59578
  var DAYBREAK_PARAMETER_ID = "daybreak";
@@ -59663,32 +59720,6 @@ var normalizeModelOptions = (models) => {
59663
59720
  }
59664
59721
  return normalized;
59665
59722
  };
59666
- var PROVIDER_DISPLAY_NAMES = /* @__PURE__ */ new Map([
59667
- ["openai-oauth", "OpenAI OAuth"],
59668
- ["anthropic-oauth", "Anthropic OAuth"],
59669
- ["grok-oauth", "Grok OAuth"],
59670
- ["muse-code-oauth", "Muse Code"],
59671
- ["command-code-oauth", "Command Code"],
59672
- ["mimo-oauth", "MiMo"],
59673
- ["cursor-oauth", "Cursor OAuth"],
59674
- ["devin-oauth", "Devin"],
59675
- ["antigravity-oauth", "Antigravity OAuth"],
59676
- ["openai", "OpenAI API"],
59677
- ["openai-api", "OpenAI API"],
59678
- ["anthropic", "Anthropic API"],
59679
- ["anthropic-api", "Anthropic API"],
59680
- ["gemini", "Gemini API"],
59681
- ["gemini-api", "Gemini API"],
59682
- ["xai", "xAI API"],
59683
- ["xai-api", "xAI API"],
59684
- ["deepseek", "DeepSeek API"],
59685
- ["deepseek-api", "DeepSeek API"],
59686
- ["opencode-go-oauth", "OpenCode Go OAuth"],
59687
- ["openrouter", "OpenRouter"],
59688
- ["mixdog-local", "Local Provider"],
59689
- ["default", "Default"]
59690
- ]);
59691
- var providerDisplayName = (provider) => PROVIDER_DISPLAY_NAMES.get(String(provider || "").toLowerCase()) ?? (provider || "Provider");
59692
59723
  var resolveProviderDisplayName = (provider, providerNames = null) => String(provider || "").trim().startsWith("custom-") && providerNames?.[String(provider).trim()] || providerDisplayName(provider);
59693
59724
  var loadProviderDisplayNames = async (store) => {
59694
59725
  let setup = null;
@@ -60257,6 +60288,11 @@ var hiddenSpawnOpts = Object.freeze({
60257
60288
  });
60258
60289
 
60259
60290
  // src/runtime/shared/open-url.mjs
60291
+ function canOpenBrowser(env4 = process.env, platform2 = process.platform, wsl = isWSL()) {
60292
+ if (env4.SSH_TTY || env4.SSH_CONNECTION) return false;
60293
+ if (platform2 !== "linux" || wsl) return true;
60294
+ return Boolean(env4.DISPLAY || env4.WAYLAND_DISPLAY);
60295
+ }
60260
60296
  function openInBrowser(url) {
60261
60297
  const u = String(url);
60262
60298
  let candidates;
@@ -60471,7 +60507,7 @@ function showOAuthProgress(flow, providerItem, message, onBack) {
60471
60507
  value: "waiting",
60472
60508
  label: "Waiting for login",
60473
60509
  meta: "Running",
60474
- description: "finish the browser/OAuth prompt",
60510
+ description: "finish the sign-in shown above",
60475
60511
  _action: "waiting"
60476
60512
  },
60477
60513
  {
@@ -60513,6 +60549,20 @@ function showOAuthResult(flow, providerItem, ok, message = "") {
60513
60549
  onCancel: leave
60514
60550
  });
60515
60551
  }
60552
+ function oauthCodeHint(manualUrl, loginUrl, providerName) {
60553
+ if (manualUrl) return "If the browser callback does not finish, open the URL below manually and paste code#state.";
60554
+ if (loginUrl) {
60555
+ return `Open the URL below to sign in, then paste the authorization code or full redirect URL for ${providerName}.`;
60556
+ }
60557
+ return `Paste the authorization code or full redirect URL for ${providerName}.`;
60558
+ }
60559
+ function pollingLoginMessage(userCode, loginUrl, opened) {
60560
+ if (userCode) return `Enter code ${userCode} at:
60561
+ ${loginUrl}${opened}`;
60562
+ if (loginUrl) return `Open this URL to sign in:
60563
+ ${loginUrl}${opened}`;
60564
+ return "Finish signing in for this provider.";
60565
+ }
60516
60566
  function beginInteractiveOAuthLogin(flow, providerItem, login) {
60517
60567
  let handled = false;
60518
60568
  const providerName = providerItem._providerName || providerItem._providerId || "OAuth";
@@ -60531,20 +60581,21 @@ function beginInteractiveOAuthLogin(flow, providerItem, login) {
60531
60581
  message || (ok ? `${providerName} login complete.` : `${providerName} login failed.`)
60532
60582
  );
60533
60583
  };
60534
- void flow.store.beginOAuthProviderLogin(providerItem._providerId).then((started) => {
60584
+ const openBrowser = canOpenBrowser();
60585
+ void flow.store.beginOAuthProviderLogin(providerItem._providerId, { openBrowser }).then((started) => {
60586
+ const loginUrl = started?.manualUrl || started?.url || "";
60535
60587
  if (typeof started?.completeCode === "function") {
60536
60588
  if (!flow.ownsSurface()) return;
60537
60589
  flow.releaseSurface();
60538
- const manualUrl = started?.manualUrl || "";
60539
60590
  flow.setProviderPrompt({
60540
60591
  kind: "oauth-code",
60541
60592
  providerId: providerItem._providerId,
60542
60593
  providerName,
60543
60594
  label: `${providerName} OAuth code`,
60544
- hint: manualUrl ? "If the browser callback does not finish, open the URL below manually and paste code#state." : `Paste the authorization code or full redirect URL for ${providerName}.`,
60595
+ hint: oauthCodeHint(started?.manualUrl, loginUrl, providerName),
60545
60596
  // Shown inside the live panel only — never written to the
60546
60597
  // transcript, so it cannot linger in scrollback after the flow.
60547
- detail: manualUrl,
60598
+ detail: loginUrl,
60548
60599
  login: started,
60549
60600
  afterSave: flow.returnTo,
60550
60601
  successReturn: () => {
@@ -60558,16 +60609,12 @@ function beginInteractiveOAuthLogin(flow, providerItem, login) {
60558
60609
  }
60559
60610
  });
60560
60611
  flow.store.pushNotice(
60561
- `browser opened for ${providerName}; paste code/redirect here if callback does not finish`,
60562
- "info"
60563
- );
60564
- } else if (started?.userCode) {
60565
- flow.store.pushNotice(
60566
- `${providerName}: enter code ${started.userCode} in the browser to finish signing in`,
60612
+ openBrowser ? `browser opened for ${providerName}; paste code/redirect here if callback does not finish` : `open the URL shown to sign in to ${providerName}, then paste the code/redirect here`,
60567
60613
  "info"
60568
60614
  );
60569
- } else {
60570
- flow.store.pushNotice(`browser opened for ${providerName}; finish signing in there`, "info");
60615
+ } else if (!login.backedOut && flow.ownsSurface()) {
60616
+ const opened = openBrowser ? " (browser opened)" : "";
60617
+ showOAuthProgress(flow, providerItem, pollingLoginMessage(started?.userCode, loginUrl, opened), login.onBack);
60571
60618
  }
60572
60619
  started.waitForCallback?.then((result) => {
60573
60620
  if (result && !flow.oauthSubmitRef.current) finish(true, `${providerName} login complete`);
@@ -60594,11 +60641,14 @@ function runLegacyOAuthLogin(flow, providerItem, login) {
60594
60641
  });
60595
60642
  }
60596
60643
  function startOAuthLogin(flow, providerItem) {
60597
- const login = { backedOut: false };
60598
- showOAuthProgress(flow, providerItem, "Opening login flow. Complete it in the browser if prompted.", () => {
60599
- login.backedOut = true;
60600
- openOAuthProviderActions(flow, providerItem);
60601
- });
60644
+ const login = {
60645
+ backedOut: false,
60646
+ onBack: () => {
60647
+ login.backedOut = true;
60648
+ openOAuthProviderActions(flow, providerItem);
60649
+ }
60650
+ };
60651
+ showOAuthProgress(flow, providerItem, "Starting login flow\u2026", login.onBack);
60602
60652
  if (typeof flow.store.beginOAuthProviderLogin === "function") {
60603
60653
  beginInteractiveOAuthLogin(flow, providerItem, login);
60604
60654
  return;
@@ -61102,9 +61152,7 @@ function createFastParameterSelection({ state, currentRoute, isCurrentRoute, isS
61102
61152
  return true;
61103
61153
  };
61104
61154
  const cycleThinking = (model) => {
61105
- const definition = (model.modelParameterOptions || []).find(
61106
- (parameter) => TOGGLE_PARAMETER_IDS.has(parameter.id)
61107
- );
61155
+ const definition = (model.modelParameterOptions || []).find((parameter) => TOGGLE_PARAMETER_IDS.has(parameter.id));
61108
61156
  if (!definition?.options?.length) return false;
61109
61157
  const wanted = definition.id;
61110
61158
  const parameters = modelParametersFor(model);
@@ -62368,13 +62416,6 @@ function canonicalizeStoredChannelsConfig(value = {}) {
62368
62416
  const next = isPlainObject(value) ? { ...value } : {};
62369
62417
  delete next.promptInjection;
62370
62418
  delete next.schedules;
62371
- delete next.nonInteractive;
62372
- delete next.interactive;
62373
- delete next.backend;
62374
- delete next.provider;
62375
- delete next.discord;
62376
- delete next.telegram;
62377
- delete next.channel;
62378
62419
  return next;
62379
62420
  }
62380
62421
  function canonicalizeUnifiedConfig(value = {}) {
@@ -1,4 +1,5 @@
1
1
  import { readImageAttachmentFromPath } from '../../paste-attachments.mjs';
2
+ import { PROMPT_ORIGIN_CHANNEL } from '../../../runtime/agent/orchestrator/session/manager/pending-message-entry.mjs';
2
3
 
3
4
  // Channel inbound images arrive as a JSON-array-of-paths meta value (stringified
4
5
  // across the notify IPC boundary). Parse defensively; a malformed value simply
@@ -44,6 +45,8 @@ export function createModelNotificationEnqueue({ chain, enqueue, getState, getDi
44
45
  priority: 'later',
45
46
  key: notificationKey || undefined,
46
47
  displayText: delivery.displayText || text,
48
+ // Its provenance (an inbound channel message) rides beside the mode.
49
+ ...(event?.origin === PROMPT_ORIGIN_CHANNEL ? { origin: PROMPT_ORIGIN_CHANNEL } : {}),
47
50
  };
48
51
  // Image load failed or overran its budget: still deliver the text body so
49
52
  // the notification is never silently lost.
@@ -26,6 +26,9 @@ export function createInitialSessionState({ runtime, runtimeCwd, baseRouteState
26
26
  queued: [],
27
27
  thinking: null,
28
28
  toolApproval: null,
29
+ // Approvals waiting behind the shown one (its own, and copies of sessions
30
+ // it delegated or handed work to): the dock's "1/N".
31
+ toolApprovalsWaiting: 0,
29
32
  // How the last approval ended and from which device, so every device can
30
33
  // say who answered ({ id, approved, device, at }).
31
34
  toolApprovalResult: null,
@@ -40,6 +40,8 @@ export function createNoticeSurface({ getState, set, isDisposed, pushItem, repla
40
40
  : polishNoticeText(text);
41
41
  if (!value && !options.room) return null;
42
42
  const forceTranscript = options.transcript === true;
43
+ // A message posted from the stored record keeps its stored time.
44
+ const storedAt = Number.isFinite(options.at) ? options.at : null;
43
45
  if (!forceTranscript) return pushToast(value, tone, options.ttlMs, options);
44
46
  // The agent's own message posted outside a turn (agent-home-delivery.mjs):
45
47
  // its reply row, as the stored message restores.
@@ -50,8 +52,9 @@ export function createNoticeSurface({ getState, set, isDisposed, pushItem, repla
50
52
  id,
51
53
  text: value,
52
54
  streaming: false,
53
- at: Date.now(),
55
+ at: storedAt ?? Date.now(),
54
56
  ...(options.messageId ? { messageId: options.messageId } : {}),
57
+ ...(options.posted ? { posted: true } : {}),
55
58
  });
56
59
  return id;
57
60
  }
@@ -85,6 +88,9 @@ export function createNoticeSurface({ getState, set, isDisposed, pushItem, repla
85
88
  // A held request of an unattended run (human-gate/held-message.mjs).
86
89
  ...(options.heldRequest ? { heldRequest: options.heldRequest } : {}),
87
90
  ...(options.messageId ? { messageId: options.messageId } : {}),
91
+ ...(storedAt !== null ? { at: storedAt } : {}),
92
+ // Posted outside any turn: its own turn key (transcript-turn-keys.mjs).
93
+ ...(options.posted ? { posted: true } : {}),
88
94
  });
89
95
  return id;
90
96
  };
@@ -4,7 +4,8 @@
4
4
  * flattening, session activity timestamps, and batch merging.
5
5
  */
6
6
  import { agentJobResultText, parseAgentJob, parseSyntheticAgentMessage } from './agent-envelope.mjs';
7
- import { attachmentTextForPart, isAttachmentReference } from '../../runtime/attachments/store.mjs';
7
+ import { isAttachmentReference } from '../../runtime/attachments/store.mjs';
8
+ import { promptContentText, sessionActivityTimestamp } from '../../runtime/shared/idle-auto-clear-gate.mjs';
8
9
  import { recognisedSlashToken } from '../app/slash-commands.mjs';
9
10
 
10
11
  const QUEUE_PRIORITY = { now: 0, next: 1, later: 2 };
@@ -82,47 +83,7 @@ export function notificationDisplayText(text) {
82
83
  return firstQueueLine(synthetic?.result || result || text) || 'agent notification';
83
84
  }
84
85
 
85
- export function promptContentText(content) {
86
- if (typeof content === 'string') return content;
87
- if (Array.isArray(content)) {
88
- return content
89
- .map((part) => {
90
- if (typeof part === 'string') return part;
91
- if (part?.type === 'text') return isAttachmentReference(part) ? attachmentTextForPart(part) : part.text || '';
92
- if (part?.type === 'image') return '[Image]';
93
- if (part?.type === 'file') return '[File]';
94
- return part?.text || '';
95
- })
96
- .filter(Boolean)
97
- .join('\n');
98
- }
99
- return String(content ?? '');
100
- }
101
-
102
- function timestampMs(value) {
103
- if (value == null || value === '') return 0;
104
- const n = Number(value);
105
- if (Number.isFinite(n) && n > 0) return n;
106
- const parsed = Date.parse(String(value));
107
- return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
108
- }
109
-
110
- function hasModelVisibleConversation(session) {
111
- const messages = Array.isArray(session?.messages) ? session.messages : [];
112
- return messages.some((message) => {
113
- const role = message?.role;
114
- if (role !== 'user' && role !== 'assistant' && role !== 'tool') return false;
115
- const text = promptContentText(message.content).trim();
116
- if (role === 'user' && text.startsWith('<system-reminder>')) return false;
117
- if (role === 'assistant' && text === '.' && !Array.isArray(message.toolCalls)) return false;
118
- return !!text || role === 'assistant' || role === 'tool';
119
- });
120
- }
121
-
122
- export function sessionActivityTimestamp(session, fallback = 0) {
123
- if (!hasModelVisibleConversation(session)) return 0;
124
- return timestampMs(session?.lastUsedAt) || timestampMs(session?.updatedAt) || timestampMs(fallback);
125
- }
86
+ export { promptContentText, sessionActivityTimestamp };
126
87
 
127
88
  export function promptDisplayText(content, options = {}) {
128
89
  if (typeof options.displayText === 'string' && options.displayText.trim()) return options.displayText;
@@ -2,6 +2,16 @@
2
2
  * routes-agent-definitions.mjs — the session route surface's passthroughs to
3
3
  * the runtime's agent, workflow-pack, connector and lead-identity services.
4
4
  */
5
+
6
+ /** Mixy's status with `exists`, the one rule (mixy-presence.mjs) the desktop
7
+ * answers from (main/mixy-first.ts). null when her routines cannot be read:
8
+ * the status still serves readers of her name. */
9
+ async function withMixyExists(status) {
10
+ if (!status || typeof status !== 'object') return status;
11
+ const { readMixyExists } = await import('../../../session-runtime/routine-owner.mjs');
12
+ return { ...status, exists: await readMixyExists(status).catch(() => null) };
13
+ }
14
+
5
15
  export function createAgentDefinitionApi(runtime) {
6
16
  return {
7
17
  listAgents: () => {
@@ -53,8 +63,10 @@ export function createAgentDefinitionApi(runtime) {
53
63
  saveLeadPersona: async (text) => runtime.saveLeadPersona?.(text) ?? '',
54
64
  getLeadAgentBody: () => runtime.getLeadAgentBody?.() ?? '',
55
65
  saveLeadAgentBody: async (text) => runtime.saveLeadAgentBody?.(text) ?? '',
56
- getLeadStatus: () =>
57
- runtime.getLeadStatus?.() ?? { created: null, name: '', avatar: null, homeChatted: false, route: null },
66
+ getLeadStatus: async () =>
67
+ withMixyExists(
68
+ runtime.getLeadStatus?.() ?? { created: null, name: '', avatar: null, homeChatted: false, route: null }
69
+ ),
58
70
  getLeadHomeRoute: () => runtime.getLeadHomeRoute?.() ?? null,
59
71
  saveLeadIdentity: async (payload) => runtime.saveLeadIdentity?.(payload) ?? null,
60
72
  setLeadCreated: async (created, description) => runtime.setLeadCreated?.(created, description) ?? null,
@@ -54,14 +54,18 @@ const SESSION_ONLY_KEYS = new Set(['provider', 'model', 'effort', 'fast', 'autoE
54
54
  * the tuning, or both. Completed here, inside the serialized route write,
55
55
  * against the latest selected route — so a Fast-only change keeps the effort a
56
56
  * previous write selected. `unchanged` when it asks for nothing the selected
57
- * route does not already have.
57
+ * route does not already have and the session itself already runs that model
58
+ * (a fallback hop moves the session, not the selected route).
58
59
  */
59
60
  function completeSessionOnlyRequest(request, selected) {
60
61
  const named = Boolean(request.provider || request.model);
61
62
  const target = named ? request : { ...request, provider: selected.provider, model: selected.model };
62
63
  const sameModel = target.provider === selected.provider && target.model === selected.model;
63
64
  if (!sameModel) return { request: target, unchanged: false };
65
+ const sessionOnTarget =
66
+ !selected.sessionModel || (selected.sessionProvider === target.provider && selected.sessionModel === target.model);
64
67
  const unchanged =
68
+ sessionOnTarget &&
65
69
  Object.keys(request).every((key) => SESSION_ONLY_KEYS.has(key)) &&
66
70
  (request.effort === undefined || request.effort === selected.effort) &&
67
71
  (request.fast === undefined || request.fast === (selected.fast === true)) &&
@@ -128,6 +128,7 @@ export function createSessionRouteApi(bag) {
128
128
  return result;
129
129
  }),
130
130
  getOrchestrationMode: () => runtime.getOrchestrationMode(),
131
+ getConfiguredOrchestrationMode: () => runtime.getConfiguredOrchestrationMode(),
131
132
  setOrchestrationMode: withCommandLock(async (mode, options) => {
132
133
  const result = await runtime.setOrchestrationMode(mode, options);
133
134
  publishSessionSwitches(bag, { orchestrationModeSwitch: result?.orchestrationModeSwitch });
@@ -112,12 +112,28 @@ export function createSessionSettingsApi(bag) {
112
112
  setAiSessionTitles: withCommandLock(async (enabled) => {
113
113
  return await runtime.setAiSessionTitles?.(enabled);
114
114
  }),
115
+ getCacheWarmingSettings: () => {
116
+ return runtime.getCacheWarmingSettings?.() || { enabled: true };
117
+ },
118
+ setCacheWarmingEnabled: withCommandLock(async (enabled) => {
119
+ return await runtime.setCacheWarmingEnabled?.(enabled);
120
+ }),
115
121
  getHeartbeatSettings: () => {
116
- return runtime.getHeartbeatSettings?.() || { heartbeat: true };
122
+ return runtime.getHeartbeatSettings?.() || { heartbeat: true, intervalMinutes: 60 };
117
123
  },
118
124
  setHeartbeatEnabled: withCommandLock(async (enabled) => {
119
125
  return await runtime.setHeartbeatEnabled?.(enabled);
120
126
  }),
127
+ setHeartbeatInterval: withCommandLock(async (minutes) => {
128
+ return await runtime.setHeartbeatInterval?.(minutes);
129
+ }),
130
+ // The desktop app reports the user's latest in-app input time: Mixy's
131
+ // heartbeat waits for 30 quiet minutes (mixy-heartbeat.mjs noteUserInput).
132
+ noteUserInput: async (at) => {
133
+ const { noteUserInput } = await import('../../../session-runtime/mixy-heartbeat.mjs');
134
+ noteUserInput(at);
135
+ return { ok: true };
136
+ },
121
137
  getReactionSettings: () => {
122
138
  return runtime.getReactionSettings?.() || { reactions: true };
123
139
  },