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
@@ -274,7 +274,7 @@ function* walkContentParts(content) {
274
274
  * beforehand by preparePdfTextForProvider, so one reaching here is a bug.
275
275
  * Null when the part is not a file at all.
276
276
  */
277
- export function textFormOfFilePart(part) {
277
+ function textFormOfFilePart(part) {
278
278
  if (part?.type !== 'file' && part?.type !== 'document') return null;
279
279
  try {
280
280
  const file = fileInfo(part);
@@ -840,6 +840,56 @@ function partCarriesLiveMedia(part) {
840
840
  return Array.isArray(part.content) && contentCarriesLiveMedia(part.content);
841
841
  }
842
842
 
843
+ /** An image part in any spelling the providers use: inline, URL, file id or
844
+ * URI, Gemini inline data. */
845
+ function isImagePart(part) {
846
+ return Boolean(
847
+ part.type === 'image' ||
848
+ part.type === 'image_url' ||
849
+ part.type === 'input_image' ||
850
+ imageUrlFromPart(part) ||
851
+ imageFileIdFromPart(part) ||
852
+ imageFileUriFromPart(part) ||
853
+ geminiInlineInfo(part)
854
+ );
855
+ }
856
+
857
+ function mapPartText(part, mapText) {
858
+ if (typeof part === 'string') return mapText(part);
859
+ if (!part || typeof part !== 'object') return part;
860
+ // Media and attachment references are encodings, never text.
861
+ if (isAttachmentReference(part) || isImagePart(part) || fileInfo(part)) return part;
862
+ for (const key of ['text', 'content']) {
863
+ if (typeof part[key] === 'string') {
864
+ const next = mapText(part[key]);
865
+ return next === part[key] ? part : { ...part, [key]: next };
866
+ }
867
+ }
868
+ if (Array.isArray(part.content)) {
869
+ const nextContent = mapContentText(part.content, mapText);
870
+ if (nextContent !== part.content) return { ...part, content: nextContent };
871
+ }
872
+ return part;
873
+ }
874
+
875
+ /** `content` with `mapText` applied to its text and nothing else: a string,
876
+ * the text a text part or a part's string content carries (textFromPart),
877
+ * and nested part content; media parts and attachment references stay as
878
+ * they are. The same value when nothing changed. */
879
+ export function mapContentText(content, mapText) {
880
+ if (typeof content === 'string') return mapText(content);
881
+ const parts = contentParts(content);
882
+ if (!parts) return content;
883
+ let changed = false;
884
+ const out = parts.map((part) => {
885
+ const next = mapPartText(part, mapText);
886
+ if (next !== part) changed = true;
887
+ return next;
888
+ });
889
+ if (!changed) return content;
890
+ return Array.isArray(content) ? out : { ...content, content: out };
891
+ }
892
+
843
893
  function sanitizePartForStoredHistory(part) {
844
894
  if (typeof part === 'string') return part;
845
895
  if (!part || typeof part !== 'object') return part;
@@ -849,15 +899,7 @@ function sanitizePartForStoredHistory(part) {
849
899
  // reloading the session keeps the provider prompt cache intact.
850
900
  const storedImage = part.type === 'image' ? storedImagePart(part) : null;
851
901
  if (storedImage) return storedImage;
852
- if (
853
- part.type === 'image' ||
854
- part.type === 'image_url' ||
855
- part.type === 'input_image' ||
856
- imageUrlFromPart(part) ||
857
- imageFileIdFromPart(part) ||
858
- imageFileUriFromPart(part) ||
859
- geminiInlineInfo(part)
860
- ) {
902
+ if (isImagePart(part)) {
861
903
  return { type: 'text', text: storedHistoryImagePlaceholder(part) };
862
904
  }
863
905
  const file = fileInfo(part);
@@ -2,6 +2,7 @@
2
2
  // X25519 public key we send in the authorize URL; the reply (loopback redirect
3
3
  // or a pasted code) carries `u` = ephemeralPub(32) | nonce(12) | ciphertext | tag(16).
4
4
  import { createServer } from 'node:http';
5
+ import { listenOn } from './lib/listen-on.mjs';
5
6
  import { lookup } from 'node:dns/promises';
6
7
  import { createDecipheriv, createHash, createPublicKey, diffieHellman, generateKeyPairSync } from 'node:crypto';
7
8
  import { openLoginUrl } from './lib/open-login-url.mjs';
@@ -112,16 +113,6 @@ async function loopbackAddresses() {
112
113
  return ['127.0.0.1'];
113
114
  }
114
115
 
115
- function listenOn(server, port, host) {
116
- return new Promise((resolve, reject) => {
117
- server.once('error', reject);
118
- server.listen(port, host, () => {
119
- server.off('error', reject);
120
- resolve();
121
- });
122
- });
123
- }
124
-
125
116
  export async function beginOAuthLogin({
126
117
  openBrowser = true,
127
118
  timeoutMs = LOGIN_TIMEOUT_MS,
@@ -5,7 +5,14 @@ export const MODEL_PROXY_OPERATIONS: Readonly<{
5
5
  resolve: 'modelProxyResolve';
6
6
  heartbeat: 'modelProxyHeartbeat';
7
7
  }>;
8
- export type ModelProxyMethod = 'send' | 'listModels' | 'refreshModels' | 'isAvailable' | 'resolveWireRoute' | 'providerConfig';
8
+ export type ModelProxyMethod =
9
+ | 'send'
10
+ | 'listModels'
11
+ | 'refreshModels'
12
+ | 'isAvailable'
13
+ | 'quotaUsable'
14
+ | 'resolveWireRoute'
15
+ | 'providerConfig';
9
16
  export const MODEL_PROXY_METHODS: ReadonlyArray<ModelProxyMethod>;
10
17
  export const MODEL_PROXY_HEARTBEAT_MS: number;
11
18
  export const MODEL_PROXY_LEASE_MS: number;
@@ -34,6 +34,7 @@ export const MODEL_PROXY_METHODS = Object.freeze([
34
34
  'listModels',
35
35
  'refreshModels',
36
36
  'isAvailable',
37
+ 'quotaUsable',
37
38
  'resolveWireRoute',
38
39
  'providerConfig',
39
40
  ]);
@@ -8,6 +8,7 @@
8
8
  // so a new process (or an offline one) starts from the newest version this
9
9
  // machine has seen rather than from a floor that only moves with a release.
10
10
 
11
+ import { runAbortable } from '../../../shared/abort-race.mjs';
11
12
  import { readLastKnownVersion, rememberLastKnownVersion } from './client-version-store.mjs';
12
13
 
13
14
  const SEMVER = /^\d+\.\d+\.\d+$/;
@@ -41,11 +42,18 @@ export async function parseNpmLatest(res) {
41
42
  return SEMVER.test(v) ? v : null;
42
43
  }
43
44
 
44
- /** One GET of `url` parsed to a version; null when offline, slow, or unrecognised. */
45
+ /** One GET of `url` parsed to a version; null when offline, slow, or unrecognised.
46
+ * The deadline settles the lookup itself instead of relying on the request
47
+ * and its body read to honour the abort: a send awaits this lookup, and its
48
+ * timer is unref'd, so once the abort tears the socket down nothing else is
49
+ * left to wake a read that missed it. */
45
50
  export async function fetchRemoteVersion(url, parse, timeoutMs = TIMEOUT_MS) {
51
+ const signal = AbortSignal.timeout(timeoutMs);
46
52
  try {
47
- const res = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });
48
- return res.ok ? (await parse(res)) || null : null;
53
+ return await runAbortable(signal, async () => {
54
+ const res = await fetch(url, { signal });
55
+ return res.ok ? (await parse(res)) || null : null;
56
+ });
49
57
  } catch {
50
58
  return null;
51
59
  }
@@ -5,6 +5,7 @@ import { resolvePluginData } from '../../../shared/plugin-paths.mjs';
5
5
  import { boundProviderAuthPath } from '../../../shared/provider-auth-binding.mjs';
6
6
  import { cursorTokenExpiry } from './cursor-auth.mjs';
7
7
  import { describeDevinOAuthCredentials } from './devin-auth.mjs';
8
+ import { isSignedInTokenDocument } from './lib/oauth-token-utils.mjs';
8
9
  import { isValidMuseCredentialDocument } from './muse-code-oauth-tokens.mjs';
9
10
  import { isValidOpenCodeGoCredentialDocument } from './opencode-go-oauth-tokens.mjs';
10
11
  import { developerOptionEnabled, developerOptionForProvider } from '../../../shared/developer-options.mjs';
@@ -152,7 +153,7 @@ function openAIOAuthState() {
152
153
  join(resolvePluginData(), 'openai-oauth.json'),
153
154
  ];
154
155
  return memoProbe('openai-oauth', paths, () =>
155
- resolveProbeState(paths, (docs) => docs.some((raw) => !!(raw?.access_token && raw?.refresh_token)))
156
+ resolveProbeState(paths, (docs) => docs.some((raw) => isSignedInTokenDocument(raw)))
156
157
  );
157
158
  }
158
159
 
@@ -184,6 +184,7 @@ export async function sendCompatChat(provider, messages, useModel, tools, opts)
184
184
  signal: attemptSignal,
185
185
  label: provider.name,
186
186
  providerName: provider.name,
187
+ sessionId: opts.sessionId,
187
188
  onStreamDelta: opts.onStreamDelta,
188
189
  onToolCall: opts.onToolCall,
189
190
  onTextDelta: opts.onTextDelta,
@@ -5,7 +5,14 @@
5
5
  */
6
6
  import { mergeToolCallDelta } from './tool-call-acc.mjs';
7
7
  import { reportStreamItemStart } from '../lib/send-callbacks.mjs';
8
- import { appendText, drainLeakedCalls, relayText, reportProgress, reportTransport } from './stream-state.mjs';
8
+ import {
9
+ appendText,
10
+ drainLeakedCalls,
11
+ relayText,
12
+ reportLifecycle,
13
+ reportProgress,
14
+ reportTransport,
15
+ } from './stream-state.mjs';
9
16
  import { chatContentParts } from '../openai-compat-reasoning-field.mjs';
10
17
 
11
18
  function appendReasoning(state, text, source) {
@@ -50,7 +57,7 @@ export function applyCompatChunk(state, chunk) {
50
57
  const choice = chunk?.choices?.[0];
51
58
  const delta = choice?.delta;
52
59
  if (typeof delta?.role === 'string' && delta.role) {
53
- reportProgress(state, 'semantic');
60
+ reportLifecycle(state, 'semantic');
54
61
  }
55
62
  const contentParts = chatContentParts(delta?.content);
56
63
  if (contentParts) applyContentParts(state, contentParts);
@@ -70,6 +70,13 @@ export function reportProgress(state, kind) {
70
70
  } catch {}
71
71
  }
72
72
 
73
+ /** Chunk metadata without output (a role-only delta): progress once the
74
+ * model has produced output; before that it neither ends the first-output
75
+ * phase nor starts the semantic idle (the chunk already reported transport). */
76
+ export function reportLifecycle(state, kind) {
77
+ if (state.semanticIdleDeadlineAt > 0) reportProgress(state, kind);
78
+ }
79
+
73
80
  /** Text the model exposed: accumulate, refresh the idle deadline, relay live. */
74
81
  export function appendText(state, text) {
75
82
  state.content += text;
@@ -10,6 +10,7 @@ import {
10
10
  PROVIDER_SSE_IDLE_WATCHDOG_ENABLED,
11
11
  PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS,
12
12
  createTimeoutSignal,
13
+ providerFirstOutputTimeoutMs,
13
14
  } from '../stall-policy.mjs';
14
15
  import { TIMEOUT_PHASE } from '../../../shared/provider-timeout-phase.mjs';
15
16
  import {
@@ -28,6 +29,7 @@ import {
28
29
  toolWorkStarted,
29
30
  } from './openai-compat-chat-stream/stream-state.mjs';
30
31
  import { applyCompatChunk } from './openai-compat-chat-stream/chunk-events.mjs';
32
+ import { streamFirstOutputWindow } from './lib/first-output-window.mjs';
31
33
  import { incompleteStreamError, settleCompatStream } from './openai-compat-chat-stream/stream-result.mjs';
32
34
 
33
35
  export async function consumeCompatChatCompletionStream(
@@ -45,11 +47,20 @@ export async function consumeCompatChatCompletionStream(
45
47
  semanticIdleTimeoutMs,
46
48
  firstByteTimeoutMs,
47
49
  leakedToolCallRecovery = true,
50
+ sessionId = null,
48
51
  } = {}
49
52
  ) {
50
53
  const idleOverrideEnabled = Number.isFinite(Number(semanticIdleTimeoutMs)) && Number(semanticIdleTimeoutMs) > 0;
51
54
  const idleEnabled = idleOverrideEnabled || PROVIDER_SSE_IDLE_WATCHDOG_ENABLED;
52
55
  const idleMs = idleOverrideEnabled ? Number(semanticIdleTimeoutMs) : PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS;
56
+ // Until the first semantic output the logical request's first-output window
57
+ // bounds the stream; a request that already had output runs under the
58
+ // semantic idle from the stream's opening.
59
+ const firstOutput = streamFirstOutputWindow({
60
+ sessionId,
61
+ onStreamDelta,
62
+ timeoutMs: providerFirstOutputTimeoutMs(idleMs),
63
+ });
53
64
  const state = createCompatStreamState({
54
65
  providerName,
55
66
  knownToolNames,
@@ -60,6 +71,7 @@ export async function consumeCompatChatCompletionStream(
60
71
  onStreamItemStart,
61
72
  leakedToolCallRecovery,
62
73
  });
74
+ if (firstOutput.outputSeen) state.semanticIdleDeadlineAt = Date.now() + idleMs;
63
75
  reportTransport(state);
64
76
  const iterator = stream[Symbol.asyncIterator]();
65
77
  let iteratorDone = false;
@@ -72,9 +84,8 @@ export async function consumeCompatChatCompletionStream(
72
84
  while (true) {
73
85
  const { value: chunk, done } = await nextAsyncWithWatchdog(iterator, {
74
86
  signal: state.sawFirstEvent ? signal : firstByteTimeout.signal,
75
- idleMs,
76
- idleDeadlineAt: state.semanticIdleDeadlineAt,
77
- idleEnabled: state.sawFirstEvent && idleEnabled && state.semanticIdleDeadlineAt > 0,
87
+ ...firstOutput.idleWatch(state.semanticIdleDeadlineAt, idleMs),
88
+ idleEnabled: state.sawFirstEvent && idleEnabled,
78
89
  idleLabel: `${label} SSE idle`,
79
90
  streamLabel: label,
80
91
  emittedToolCall: () => toolWorkStarted(state),
@@ -147,7 +147,8 @@ function settleMaxOutputIncomplete(event, state, ctx, reason) {
147
147
  function onCreated(event, state, ctx) {
148
148
  if (event.response?.model) state.model = event.response.model;
149
149
  if (event.response?.id) state.responseId = event.response.id;
150
- signal(ctx, 'semantic');
150
+ // Metadata, not output: progress only once the stream has seen output.
151
+ ctx.onLifecycle?.('semantic');
151
152
  }
152
153
 
153
154
  function onOutputTextDelta(event, state, ctx) {
@@ -196,7 +197,8 @@ function onOutputItemAdded(event, state, ctx) {
196
197
  state.toolInFlight = true;
197
198
  }
198
199
  reportStreamItemStart(ctx.onStreamItemStart, responsesItemStart(event.item));
199
- signal(ctx, state.toolInFlight ? 'tool' : 'semantic');
200
+ if (state.toolInFlight) signal(ctx, 'tool');
201
+ else ctx.onLifecycle?.('semantic');
200
202
  }
201
203
 
202
204
  // A tool call's args (or custom-tool input) are streaming — mark tool work
@@ -241,6 +241,7 @@ async function streamCompatResponses({ provider, params, label, signal, opts, he
241
241
  return await consumeCompatResponsesStream(stream, {
242
242
  signal: attemptSignal,
243
243
  label,
244
+ sessionId: opts.sessionId,
244
245
  onStreamDelta: opts.onStreamDelta,
245
246
  onToolCall: opts.onToolCall,
246
247
  onTextDelta: opts.onTextDelta,
@@ -168,9 +168,11 @@ export async function nextAsyncWithWatchdog(
168
168
  }
169
169
  // The SDK JSON-decodes each frame inside next(): a SyntaxError here is a
170
170
  // malformed wire frame, typed at this boundary and nowhere else.
171
- iterator.next().then(resolve, (error) =>
172
- reject(error instanceof SyntaxError ? malformedCompatStreamError(streamLabel || idleLabel, error) : error)
173
- );
171
+ iterator
172
+ .next()
173
+ .then(resolve, (error) =>
174
+ reject(error instanceof SyntaxError ? malformedCompatStreamError(streamLabel || idleLabel, error) : error)
175
+ );
174
176
  });
175
177
  } catch (err) {
176
178
  if (idleTimedOut)
@@ -7,6 +7,7 @@ import {
7
7
  PROVIDER_SSE_IDLE_WATCHDOG_ENABLED,
8
8
  PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS,
9
9
  createTimeoutSignal,
10
+ providerFirstOutputTimeoutMs,
10
11
  } from '../stall-policy.mjs';
11
12
  import {
12
13
  closeCompatStream,
@@ -23,6 +24,7 @@ import {
23
24
  parseCompletedToolCallArgumentsJson,
24
25
  } from './lib/openai-tool-args.mjs';
25
26
  import { handleCompatResponsesStreamEvent } from './openai-compat-responses-events.mjs';
27
+ import { streamFirstOutputWindow } from './lib/first-output-window.mjs';
26
28
  import {
27
29
  attachPartialState,
28
30
  createResponsesLeakRelay,
@@ -56,6 +58,7 @@ export async function consumeCompatResponsesStream(
56
58
  responseOutputText,
57
59
  knownToolNames,
58
60
  semanticIdleTimeoutMs,
61
+ sessionId = null,
59
62
  } = {}
60
63
  ) {
61
64
  try {
@@ -68,13 +71,23 @@ export async function consumeCompatResponsesStream(
68
71
  const idleEnabled = idleOverrideEnabled || PROVIDER_SSE_IDLE_WATCHDOG_ENABLED;
69
72
  // Per-event (last-event-relative) SEMANTIC idle — see the Chat path note.
70
73
  const idleMs = idleOverrideEnabled ? Number(semanticIdleTimeoutMs) : PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS;
74
+ // Until the first semantic output the logical request's first-output window
75
+ // bounds the stream; a request that already had output runs under the
76
+ // semantic idle from the stream's opening.
77
+ const firstOutput = streamFirstOutputWindow({
78
+ sessionId,
79
+ onStreamDelta,
80
+ timeoutMs: providerFirstOutputTimeoutMs(idleMs),
81
+ });
71
82
  const state = createResponsesStreamState();
83
+ if (firstOutput.outputSeen) state.semanticIdleDeadlineAt = Date.now() + idleMs;
72
84
  const reportProgress = (kind) => {
73
85
  if (kind !== 'transport') state.semanticIdleDeadlineAt = Date.now() + idleMs;
74
86
  try {
75
87
  onStreamDelta?.(kind);
76
88
  } catch {}
77
89
  };
90
+ const reportLifecycle = (kind) => reportProgress(state.semanticIdleDeadlineAt > 0 ? kind : 'transport');
78
91
  let sawFirstEvent = false;
79
92
  const { relayLeakText, flushLeak, leakedCalls } = createResponsesLeakRelay({
80
93
  state,
@@ -88,6 +101,7 @@ export async function consumeCompatResponsesStream(
88
101
  parseResponsesToolCalls,
89
102
  responseOutputText,
90
103
  onStreamDelta: reportProgress,
104
+ onLifecycle: reportLifecycle,
91
105
  onToolCall,
92
106
  onTextDelta,
93
107
  onStreamItemStart,
@@ -98,9 +112,8 @@ export async function consumeCompatResponsesStream(
98
112
  while (true) {
99
113
  const { value: event, done } = await nextAsyncWithWatchdog(iterator, {
100
114
  signal: sawFirstEvent ? signal : firstByteTimeout.signal,
101
- idleMs,
102
- idleDeadlineAt: state.semanticIdleDeadlineAt,
103
- idleEnabled: sawFirstEvent && idleEnabled && state.semanticIdleDeadlineAt > 0,
115
+ ...firstOutput.idleWatch(state.semanticIdleDeadlineAt, idleMs),
116
+ idleEnabled: sawFirstEvent && idleEnabled,
104
117
  idleLabel: `${label} SSE idle`,
105
118
  streamLabel: label,
106
119
  // Unsafe-to-retry once any tool call (native or recovered-leaked)
@@ -131,6 +131,7 @@ export async function sendXaiResponses(provider, messages, useModel, tools, opts
131
131
  return await consumeCompatResponsesStream(stream, {
132
132
  signal: attemptSignal,
133
133
  label: 'xai:responses',
134
+ sessionId: opts.sessionId,
134
135
  onStreamDelta: opts.onStreamDelta,
135
136
  onToolCall: opts.onToolCall,
136
137
  onTextDelta: opts.onTextDelta,
@@ -15,7 +15,7 @@ function outputItemKind(item) {
15
15
  return 'semantic';
16
16
  }
17
17
 
18
- export function createOutputItemEvents({ state, items, meaningful }) {
18
+ export function createOutputItemEvents({ state, items, meaningful, lifecycle }) {
19
19
  const { toolTracker } = state;
20
20
 
21
21
  const onOutputItemAdded = (item) => {
@@ -52,7 +52,10 @@ export function createOutputItemEvents({ state, items, meaningful }) {
52
52
  toolTracker.mark(item);
53
53
  state.toolInFlight = true;
54
54
  }
55
- meaningful(state.toolInFlight ? 'tool' : 'semantic');
55
+ // A tool call starting is model output; an empty reasoning or message
56
+ // item is lifecycle (the silent thinking follows it).
57
+ if (state.toolInFlight) meaningful('tool');
58
+ else lifecycle('semantic');
56
59
  };
57
60
 
58
61
  const onToolInputDelta = (itemId) => {
@@ -7,18 +7,28 @@ import { createOutputItemEvents } from './response-events/output-items.mjs';
7
7
  import { createTerminalFrameEvents } from './response-events/terminal-frames.mjs';
8
8
  import { reportStreamItemStart, responsesItemStart } from '../lib/send-callbacks.mjs';
9
9
 
10
- export function createResponseEvents({ state, items, text, outcome, meaningful, onServerEvent, onStreamItemStart }) {
11
- const output = createOutputItemEvents({ state, items, meaningful });
10
+ export function createResponseEvents({
11
+ state,
12
+ items,
13
+ text,
14
+ outcome,
15
+ meaningful,
16
+ lifecycle,
17
+ onServerEvent,
18
+ onStreamItemStart,
19
+ }) {
20
+ const output = createOutputItemEvents({ state, items, meaningful, lifecycle });
12
21
  const terminal = createTerminalFrameEvents({ state, items, text, outcome, meaningful });
13
22
 
14
23
  const handleEvent = (event) => {
15
24
  if (!event || typeof event.type !== 'string') return;
16
25
  onServerEvent();
17
26
  switch (event.type) {
27
+ // The server's ack is metadata, not model output: it satisfies only the
28
+ // first-server-event deadline (onServerEvent above).
18
29
  case 'response.created':
19
30
  if (event.response?.model) state.model = event.response.model;
20
31
  if (event.response?.id) state.responseId = event.response.id;
21
- meaningful('semantic');
22
32
  break;
23
33
  case 'response.output_text.delta':
24
34
  text.relayLeakText(event.delta || '');
@@ -24,7 +24,8 @@ import { createResponseEvents } from './openai-http-sse-response-state/response-
24
24
  * @param {(call: object) => void} [deps.onToolCall]
25
25
  * @param {(text: string) => void} [deps.onTextDelta]
26
26
  * @param {(kind: string) => void} deps.meaningful semantic progress (re-arms the idle watchdog)
27
- * @param {() => void} deps.onServerEvent first-event → semantic-idle handover
27
+ * @param {(kind: string) => void} [deps.lifecycle] item lifecycle without output: progress only after semantic output
28
+ * @param {() => void} deps.onServerEvent any parsed server event (satisfies the first-server-event deadline)
28
29
  * @param {(detail: object) => void} [deps.onStreamItemStart] a tool call or phased message started
29
30
  */
30
31
  export function createHttpSseResponseState({
@@ -33,6 +34,7 @@ export function createHttpSseResponseState({
33
34
  onTextDelta,
34
35
  onStreamItemStart = null,
35
36
  meaningful,
37
+ lifecycle = () => {},
36
38
  onServerEvent,
37
39
  label,
38
40
  }) {
@@ -40,7 +42,16 @@ export function createHttpSseResponseState({
40
42
  const outcome = createResponseOutcome({ state });
41
43
  const items = createResponseItems({ state, onToolCall });
42
44
  const text = createTextRelay({ state, body, onTextDelta, meaningful, emitToolCall: items.emitToolCall });
43
- const events = createResponseEvents({ state, items, text, outcome, meaningful, onServerEvent, onStreamItemStart });
45
+ const events = createResponseEvents({
46
+ state,
47
+ items,
48
+ text,
49
+ outcome,
50
+ meaningful,
51
+ lifecycle,
52
+ onServerEvent,
53
+ onStreamItemStart,
54
+ });
44
55
 
45
56
  return {
46
57
  handleEvent: events.handleEvent,