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
@@ -7,6 +7,7 @@
7
7
  import { getProvider } from '../../providers/registry.mjs';
8
8
  import { pinSessionWireRoute } from '../../providers/wire-route.mjs';
9
9
  import { notifySkillsApplied, prepareExplicitSkills, recordAppliedSkills } from '../explicit-skills.mjs';
10
+ import { appendSkillUpdateNotices } from '../skill-update-notice.mjs';
10
11
  import { prepareTurnEffortConfiguration } from '../../providers/effort-configuration.mjs';
11
12
  import { resolveTurnAutoEffort, turnStepAutoEffort } from './ask-turn-auto-effort.mjs';
12
13
  import { saveSessionAsync } from '../store.mjs';
@@ -22,6 +23,128 @@ import { _api_call_with_interrupt } from './ask-call-interrupt.mjs';
22
23
  import { backfillFallbackSessionTitle } from './session-fallback-title.mjs';
23
24
  import { stampTurnHop } from '../../../../shared/bot-hops.mjs';
24
25
 
26
+ function turnPromptSourceFor(input) {
27
+ if (!(input.promptOrigin || input.retryProvenance)) return input.promptSource;
28
+ return {
29
+ ...(input.promptSource || {}),
30
+ ...(input.promptOrigin ? { origin: input.promptOrigin } : {}),
31
+ ...(input.retryProvenance ? { provenance: input.retryProvenance } : {}),
32
+ };
33
+ }
34
+
35
+ // A retried failed turn resubmits its retained user message over the history
36
+ // before it: the message keeps its input and records the failed completion.
37
+ function retainedUserTurn(session, retained, transcriptMeta, currentAgents) {
38
+ const historyMessages = filterModelVisibleSessionMessages(session.messages.slice(0, retained.index));
39
+ const { completion, ...previousTranscript } = retained.message.meta.transcript;
40
+ // The retained message keeps its input; agents enabled or switched
41
+ // off since it was built ride its runtime context.
42
+ const userTurnMessage = withAgentListingNotice(
43
+ session,
44
+ retained.index,
45
+ {
46
+ ...retained.message,
47
+ meta: {
48
+ ...retained.message.meta,
49
+ transcript: {
50
+ ...previousTranscript,
51
+ ...transcriptMeta,
52
+ messageId: previousTranscript.messageId,
53
+ previousCompletions: [
54
+ ...(previousTranscript.previousCompletions || []),
55
+ { ...completion, at: completion.at ?? previousTranscript.at },
56
+ ],
57
+ },
58
+ },
59
+ },
60
+ currentAgents
61
+ );
62
+ return { historyMessages, userTurnMessage, outgoing: [...historyMessages, userTurnMessage] };
63
+ }
64
+
65
+ // The turn's user message: the retained one of a retried failed turn, or a
66
+ // newly built one (a promise).
67
+ function pendingUserTurn({ session, input, retained, turnSignal, transcriptMeta, currentAgents }) {
68
+ if (retained) return retainedUserTurn(session, retained, transcriptMeta, currentAgents);
69
+ return buildUserTurn({
70
+ session,
71
+ prompt: input.prompt,
72
+ context: input.context,
73
+ explicitPrefetch: input.explicitPrefetch,
74
+ turnSignal,
75
+ transcriptMeta,
76
+ // The stored message keeps an inbound channel's provenance and, for
77
+ // a rebuilt retry (the resubmitted prompt or a continuation prompt),
78
+ // the failed turn's, which a later retry reads back
79
+ // (cache-warm.mjs failedTurnProvenance).
80
+ turnPromptSource: turnPromptSourceFor(input),
81
+ effortConfiguration: null,
82
+ currentAgents,
83
+ });
84
+ }
85
+
86
+ // Stamp the turn's effort on the user message (same meta order as when it
87
+ // was built with it: before the runtime-context provenance).
88
+ function stampTurnEffort(userTurnMessage, effortConfiguration) {
89
+ const { runtimeUserContext, ...meta } = userTurnMessage.meta || {};
90
+ userTurnMessage.meta = {
91
+ ...meta,
92
+ effortConfiguration,
93
+ ...(runtimeUserContext ? { runtimeUserContext } : {}),
94
+ };
95
+ }
96
+
97
+ // Expose the in-flight working transcript so contextStatus() can
98
+ // estimate the LIVE context footprint mid-turn. agentLoop mutates
99
+ // `outgoing` in place (user turn + tool calls/results + compaction),
100
+ // so the statusline context gauge climbs as the turn accumulates
101
+ // tool output instead of freezing at the pre-turn snapshot. Cleared
102
+ // on turn commit and in the ask finally.
103
+ //
104
+ // Also commit the user turn to the live session BEFORE the provider
105
+ // call. Previously the prompt only reached session.messages after
106
+ // agentLoop returned. If a worker/lead session was closed or aborted
107
+ // before first response, closeSession() wrote a tombstone from the
108
+ // still-system-only session and the handoff brief vanished forever
109
+ // (agent row showed messages=2). Pre-committing makes cancellation,
110
+ // close, and post-mortem files retain the exact user task; completion
111
+ // overwrites this provisional transcript with the fully mutated
112
+ // outgoing history and appends the assistant result, so no duplicate
113
+ // user turn is introduced.
114
+ function precommitUserTurn(session, outgoing, historyMessages, input) {
115
+ session.messages = filterModelVisibleSessionMessages(outgoing);
116
+ session.liveTurnMessages = outgoing;
117
+ // Name a titleless session from its first human prompt before the first
118
+ // save, so the title outlives any later compaction of the transcript. The
119
+ // earliest human turn already in the history wins; this turn's prompt is the
120
+ // fallback (runtime-injected turns carrying a promptSource never name it).
121
+ backfillFallbackSessionTitle(session, [
122
+ ...historyMessages,
123
+ ...(input.promptSource ? [] : [{ role: 'user', content: input.prompt }]),
124
+ ]);
125
+ }
126
+
127
+ // Mark the turn active and persist the pre-committed session before the
128
+ // provider runs.
129
+ function persistTurnPreflight(session, { turnToken, startedAt, checkpoint, askGeneration }) {
130
+ session.activeTurnCheckpoint = {
131
+ version: 1,
132
+ turnToken,
133
+ startedAt,
134
+ };
135
+ // The sidecar lands synchronously before provider execution. Even
136
+ // if the async canonical-session preflight save has not reached its
137
+ // worker when the process is killed, recovery still has the prompt.
138
+ checkpoint.schedule(true);
139
+ saveSessionAsync(session, { expectedGeneration: askGeneration }).catch((err) => {
140
+ try {
141
+ process.stderr.write(`[session] preflight user-turn save failed: ${err?.message || err}\n`);
142
+ } catch {
143
+ // stderr may be closed; the save failure is only reported
144
+ }
145
+ });
146
+ }
147
+
25
148
  /** Resolves the provider, builds the user turn and pre-commits it; returns
26
149
  * what the loop and the commit need from this preparation. */
27
150
  export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, transcriptMeta, currentAgents }) {
@@ -68,45 +191,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
68
191
  });
69
192
  const [autoEffort, userTurn] = await Promise.all([
70
193
  autoEffortPending,
71
- retained
72
- ? (() => {
73
- const historyMessages = filterModelVisibleSessionMessages(session.messages.slice(0, retained.index));
74
- const { completion, ...previousTranscript } = retained.message.meta.transcript;
75
- // The retained message keeps its input; agents enabled or switched
76
- // off since it was built ride its runtime context.
77
- const userTurnMessage = withAgentListingNotice(
78
- session,
79
- retained.index,
80
- {
81
- ...retained.message,
82
- meta: {
83
- ...retained.message.meta,
84
- transcript: {
85
- ...previousTranscript,
86
- ...transcriptMeta,
87
- messageId: previousTranscript.messageId,
88
- previousCompletions: [
89
- ...(previousTranscript.previousCompletions || []),
90
- { ...completion, at: completion.at ?? previousTranscript.at },
91
- ],
92
- },
93
- },
94
- },
95
- currentAgents
96
- );
97
- return { historyMessages, userTurnMessage, outgoing: [...historyMessages, userTurnMessage] };
98
- })()
99
- : buildUserTurn({
100
- session,
101
- prompt: input.prompt,
102
- context: input.context,
103
- explicitPrefetch: input.explicitPrefetch,
104
- turnSignal,
105
- transcriptMeta,
106
- turnPromptSource: input.promptSource,
107
- effortConfiguration: null,
108
- currentAgents,
109
- }),
194
+ pendingUserTurn({ session, input, retained, turnSignal, transcriptMeta, currentAgents }),
110
195
  wireRoutePending,
111
196
  ]);
112
197
  const turnEffort = autoEffort?.applied ? autoEffort.effort : session.effort || null;
@@ -118,60 +203,12 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
118
203
  // Auto effort also judges every tool-result step of the turn when the
119
204
  // installed judge was trained on steps (session/loop/step-auto-effort.mjs).
120
205
  const stepAutoEffort = turnStepAutoEffort(autoEffort, effortConfiguration);
121
- if (effortConfiguration) {
122
- // Stamp the turn's effort on the user message (same meta order as when it
123
- // was built with it: before the runtime-context provenance).
124
- const { runtimeUserContext, ...meta } = userTurn.userTurnMessage.meta || {};
125
- userTurn.userTurnMessage.meta = {
126
- ...meta,
127
- effortConfiguration,
128
- ...(runtimeUserContext ? { runtimeUserContext } : {}),
129
- };
130
- }
206
+ if (effortConfiguration) stampTurnEffort(userTurn.userTurnMessage, effortConfiguration);
131
207
  const { historyMessages, outgoing } = userTurn;
132
208
  turn.userTurnContent = userTurn.userTurnMessage.content;
133
209
  turn.outgoing = outgoing;
134
- // Expose the in-flight working transcript so contextStatus() can
135
- // estimate the LIVE context footprint mid-turn. agentLoop mutates
136
- // `outgoing` in place (user turn + tool calls/results + compaction),
137
- // so the statusline context gauge climbs as the turn accumulates
138
- // tool output instead of freezing at the pre-turn snapshot. Cleared
139
- // on turn commit and in the ask finally.
140
- //
141
- // Also commit the user turn to the live session BEFORE the provider
142
- // call. Previously the prompt only reached session.messages after
143
- // agentLoop returned. If a worker/lead session was closed or aborted
144
- // before first response, closeSession() wrote a tombstone from the
145
- // still-system-only session and the handoff brief vanished forever
146
- // (agent row showed messages=2). Pre-committing makes cancellation,
147
- // close, and post-mortem files retain the exact user task; completion
148
- // overwrites this provisional transcript with the fully mutated
149
- // outgoing history and appends the assistant result, so no duplicate
150
- // user turn is introduced.
151
- session.messages = filterModelVisibleSessionMessages(outgoing);
152
- session.liveTurnMessages = outgoing;
153
- // Name a titleless session from its first human prompt before the first
154
- // save, so the title outlives any later compaction of the transcript. The
155
- // earliest human turn already in the history wins; this turn's prompt is the
156
- // fallback (runtime-injected turns carrying a promptSource never name it).
157
- backfillFallbackSessionTitle(session, [
158
- ...historyMessages,
159
- ...(input.promptSource ? [] : [{ role: 'user', content: input.prompt }]),
160
- ]);
161
- session.activeTurnCheckpoint = {
162
- version: 1,
163
- turnToken,
164
- startedAt,
165
- };
166
- // The sidecar lands synchronously before provider execution. Even
167
- // if the async canonical-session preflight save has not reached its
168
- // worker when the process is killed, recovery still has the prompt.
169
- checkpoint.schedule(true);
170
- saveSessionAsync(session, { expectedGeneration: askGeneration }).catch((err) => {
171
- try {
172
- process.stderr.write(`[session] preflight user-turn save failed: ${err?.message || err}\n`);
173
- } catch {}
174
- });
210
+ precommitUserTurn(session, outgoing, historyMessages, input);
211
+ persistTurnPreflight(session, { turnToken, startedAt, checkpoint, askGeneration });
175
212
  traceTurnContext({
176
213
  sessionId,
177
214
  session,
@@ -237,6 +274,12 @@ export async function runAskAgentLoop({
237
274
  checkpoint.schedule(true);
238
275
  notifySkillsApplied(askOpts?.onSkillsApplied, applied, userMessage);
239
276
  }
277
+ // Every turn (any session, any prompt source): a loaded skill that changed
278
+ // since it was loaded is announced once, after the history.
279
+ if (appendSkillUpdateNotices(outgoing, effectiveCwd).length) {
280
+ session.messages = filterModelVisibleSessionMessages(outgoing);
281
+ checkpoint.schedule(true);
282
+ }
240
283
  return await _api_call_with_interrupt(sessionId, (signal) =>
241
284
  agentLoop(
242
285
  provider,
@@ -231,9 +231,9 @@ export function buildAgentLoopOptions({
231
231
  },
232
232
  onStreamDelta: (kind = 'semantic') => {
233
233
  markSessionStreamDelta(sessionId, kind).catch(() => {});
234
- // Raw transport is an internal health signal, not model progress.
235
- // Preserve the public callback's historical semantic-only contract.
236
- if (kind !== 'transport') relay(askOpts?.onStreamDelta, kind);
234
+ // Raw transport and keepalives are internal health signals, not model
235
+ // progress. Preserve the public callback's historical semantic-only contract.
236
+ if (kind !== 'transport' && kind !== 'keepalive') relay(askOpts?.onStreamDelta, kind);
237
237
  },
238
238
  };
239
239
  }
@@ -225,7 +225,9 @@ export function publishAskTurn({ sessionId, opened, terminalResultPreview, askOp
225
225
  // (which inspects entry.emptyFinal first) classifies the
226
226
  // terminal state correctly even if it ticks during unwind.
227
227
  const isEmptyFinal =
228
- !terminalResultPreview.content && !terminalResultPreview.reasoningContent && !terminalResultPreview.reactionCompleted;
228
+ !terminalResultPreview.content &&
229
+ !terminalResultPreview.reasoningContent &&
230
+ !terminalResultPreview.reactionCompleted;
229
231
  if (isEmptyFinal) {
230
232
  markSessionEmptyFinal(sessionId);
231
233
  }
@@ -4,6 +4,9 @@
4
4
  // canonicalizes the transcript when the turn is interrupted.
5
5
  import { captureTurnCheckpointContextState, createTurnCheckpointRecorder } from './turn-checkpoint.mjs';
6
6
  import { finalizeTurnInterruptionSnapshot } from './turn-interruption.mjs';
7
+ import { onSensitiveValuesMarked } from '../sensitive-values.mjs';
8
+ import { saveSessionAsync } from '../store.mjs';
9
+ import { ingestSessionTurn } from '../../../../session-search/session-search-ingest.mjs';
7
10
 
8
11
  // Coalescing window for streaming-delta flushes. Each flush journals only the
9
12
  // delta since the previous one, so the window just bounds syscalls.
@@ -50,11 +53,36 @@ export function createTurnCheckpointScheduler({ sessionId, generation, turnToken
50
53
  warned = true;
51
54
  try {
52
55
  process.stderr.write(`[turn-checkpoint] write failed session=${sessionId}: ${error?.message || error}\n`);
53
- } catch {}
56
+ } catch {
57
+ // stderr may be closed; the checkpoint failure is only reported
58
+ }
54
59
  }
55
60
  return false;
56
61
  }
57
62
  };
63
+ const flushNow = () => {
64
+ if (timer) clearTimeout(timer);
65
+ timer = null;
66
+ flush();
67
+ };
68
+ // A value marked sensitive while the turn runs (sensitive-values.mjs) —
69
+ // before the call that carries it executes: every stored copy that may hold
70
+ // it is written again with it replaced. The checkpoint is rewritten in full
71
+ // now (the recorder sees the new version); the session file gets a full
72
+ // save (store/save-delta.mjs resyncs on the version) and the search rows a
73
+ // transactional replacement (session-search-ingest.mjs).
74
+ const stopMarks = onSensitiveValuesMarked(sessionId, () => {
75
+ if (stopped) return;
76
+ if (turn.outgoing) flushNow();
77
+ saveSessionAsync(turn.session, { expectedGeneration: generation }).catch((err) => {
78
+ try {
79
+ process.stderr.write(`[session] sensitive-value save failed session=${sessionId}: ${err?.message || err}\n`);
80
+ } catch {
81
+ // stderr may be closed; the save failure is only reported
82
+ }
83
+ });
84
+ ingestSessionTurn(turn.session);
85
+ });
58
86
  return {
59
87
  refreshContextState() {
60
88
  contextState = captureTurnCheckpointContextState(turn.session, turn.outgoing, turn.userTurnContent);
@@ -62,9 +90,7 @@ export function createTurnCheckpointScheduler({ sessionId, generation, turnToken
62
90
  schedule(immediate = false) {
63
91
  if (stopped || !turn.outgoing) return;
64
92
  if (immediate || Date.now() - lastAt >= TURN_CHECKPOINT_THROTTLE_MS) {
65
- if (timer) clearTimeout(timer);
66
- timer = null;
67
- flush();
93
+ flushNow();
68
94
  return;
69
95
  }
70
96
  if (timer) return;
@@ -77,6 +103,7 @@ export function createTurnCheckpointScheduler({ sessionId, generation, turnToken
77
103
  },
78
104
  stop() {
79
105
  stopped = true;
106
+ stopMarks();
80
107
  if (timer) clearTimeout(timer);
81
108
  timer = null;
82
109
  recorder.stop();
@@ -15,6 +15,7 @@ import {
15
15
  } from '../context-utils.mjs';
16
16
  import { previewFreshContextCompaction, runFreshContextCompact } from '../loop/fresh-context.mjs';
17
17
  import { positiveInt } from '../../../../shared/numbers.mjs';
18
+ import { withLiveCompactionConfig } from '../../runtime-core/compaction-config-keys.mjs';
18
19
  import { writeStderrBestEffort } from '../../../../shared/best-effort-stderr.mjs';
19
20
  import { traceAgentCompact, messagePrefixHash } from '../../agent-trace.mjs';
20
21
  import { uncachedInputTokensForProvider } from './usage-metrics.mjs';
@@ -36,7 +37,7 @@ import {
36
37
  shouldCompactForRequestMedia,
37
38
  } from '../loop/compact-policy.mjs';
38
39
  import { snapshotProviderRequestTools } from '../../runtime-core/tool-catalog.mjs';
39
- import { scheduleCompactionArchive, stampCompactionMessageIds } from '../compaction-archive-capture.mjs';
40
+ import { prepareCompactionArchive, stampCompactionMessageIds } from '../compaction-archive-capture.mjs';
40
41
 
41
42
  // 'compacting' is a transient in-flight stage written just before Compact
42
43
  // runs. If the process crashes or only partially
@@ -263,11 +264,12 @@ function compactionResult(plan, outcome, after, tail) {
263
264
  };
264
265
  }
265
266
 
267
+ // The commit writes only its own outcome telemetry; config-owned fields stay
268
+ // the live ones (withLiveCompactionConfig).
266
269
  function compactionRecord(plan, { stage, after, now, reserve, outcome }) {
267
- const { session, mode } = plan;
268
- return {
269
- ...withoutLegacyCompactFields(session.compaction),
270
- auto: mode === 'auto' ? true : session.compaction?.auto !== false,
270
+ const { session } = plan;
271
+ const live = withoutLegacyCompactFields(session.compaction);
272
+ return withLiveCompactionConfig(live, {
271
273
  boundaryTokens: plan.boundary,
272
274
  triggerTokens: plan.triggerTokens,
273
275
  bufferTokens: plan.bufferTokens,
@@ -282,7 +284,7 @@ function compactionRecord(plan, { stage, after, now, reserve, outcome }) {
282
284
  currentEstimatedTokens: after.tokens,
283
285
  lastCheckedAt: now,
284
286
  ...outcome,
285
- };
287
+ });
286
288
  }
287
289
 
288
290
  // compact_meta parity with the loop's pre-send pass: the out-of-loop
@@ -659,6 +661,26 @@ async function commitSessionCompaction(plan, run, compactStartedAt) {
659
661
  // Older titleless sessions: keep a name before the transcript that carries
660
662
  // the first prompt is replaced.
661
663
  if (changed) backfillFallbackSessionTitle(session, messages);
664
+ // Write-ahead: what this compaction drops is durable (pending sidecar)
665
+ // before the shortened transcript is adopted, since any later save persists
666
+ // it. A sidecar that cannot be written keeps the old transcript.
667
+ let archive = null;
668
+ if (changed && plan.archive) {
669
+ try {
670
+ archive = prepareCompactionArchive({
671
+ session,
672
+ sessionId: resolvedSessionId,
673
+ before: messages,
674
+ after: transcript,
675
+ at: now,
676
+ });
677
+ } catch (archiveError) {
678
+ writeStderrBestEffort(
679
+ `[session] compaction not applied (sess=${resolvedSessionId || 'unknown'}): ${archiveError?.message || archiveError}\n`
680
+ );
681
+ return recordFailedCompaction(plan, { compactError: archiveError, freshContextError: null }, compactStartedAt);
682
+ }
683
+ }
662
684
  session.messages = transcript;
663
685
  // The compacted transcript breaks the cache anyway: a staged working-folder
664
686
  // change re-roots the system prompt now and needs no notice any more.
@@ -677,18 +699,8 @@ async function commitSessionCompaction(plan, run, compactStartedAt) {
677
699
  outcome: compactionOutcome(session, freshContextResult, changed, now),
678
700
  });
679
701
  // Display-only: the dropped conversation stays readable above the divider.
680
- // Only the selection and the segment number happen here; the projection and
681
- // the write run later, off this commit.
682
- const archived =
683
- changed && plan.archive
684
- ? scheduleCompactionArchive({
685
- session,
686
- sessionId: resolvedSessionId,
687
- before: messages,
688
- after: transcript,
689
- at: now,
690
- })
691
- : null;
702
+ // The publication runs later, off this commit.
703
+ const archived = archive ? { ...archive, written: archive.start() } : null;
692
704
  if (changed) {
693
705
  invalidateProviderContextBaseline(session);
694
706
  if (postCompactPolicy) {
@@ -8,35 +8,45 @@
8
8
  // The chain applies only while the session runs on the owner's configured
9
9
  // primary model. A session the user put on another model (composer picker,
10
10
  // New Task) is a deliberate choice and gets none. Route changes recompute it
11
- // (updateSessionRoute `routeFallbacks`); a fallback hop does not.
11
+ // (updateSessionRoute `routeFallbacks`); a fallback hop reads it from the
12
+ // owner's route at that moment (route-fallback-chain.mjs).
12
13
  import { loadConfig } from '../../config.mjs';
13
14
  import { findPreset } from '../../runtime-core/config-helpers.mjs';
14
15
  import { normalizeWorkflowRoute } from '../../runtime-core/workflow.mjs';
15
- import { canonicalRouteProvider } from '../../../../shared/model-route-chain.mjs';
16
+ import { canonicalRouteProvider, executionFallbacks } from '../../../../shared/model-route-chain.mjs';
16
17
  import { storedBotRoute } from '../../../../shared/agent-store.mjs';
17
18
  import { configuredAgentRouteCandidates } from '../../../../shared/agent-route-config.mjs';
18
19
  import { CODING_MODE } from '../agent-mode.mjs';
19
20
 
20
- export function ownerRouteFallbacks({ sessionMode, agentId, provider, model, config = null }) {
21
- if (!agentId) return [];
21
+ /** Whether two routes name the same model (provider aliases folded). */
22
+ export const sameRouteModel = (a, b) =>
23
+ Boolean(a?.provider && a?.model) &&
24
+ canonicalRouteProvider(a.provider) === canonicalRouteProvider(b?.provider) &&
25
+ String(a.model) === String(b?.model);
26
+
27
+ /** The owner's stored route (primary plus `fallbacks`), normalized; null when
28
+ * the owner has none or it cannot be read. */
29
+ export function ownerConfiguredRoute({ sessionMode, agentId, config = null }) {
30
+ if (!agentId) return null;
22
31
  const cfg = () => config || loadConfig({ secrets: false });
23
32
  let stored;
24
33
  if (sessionMode === CODING_MODE) {
25
- stored = findPreset(cfg(), cfg()?.default);
34
+ const loaded = cfg();
35
+ stored = findPreset(loaded, loaded?.default);
26
36
  } else {
27
37
  // Before the bot split a bot's route is still in the config (Mixy's never).
28
38
  stored = storedBotRoute(agentId) || (agentId === 'lead' ? null : configuredAgentRouteCandidates(cfg(), agentId)[0]);
29
39
  }
30
- if (!stored?.fallbacks?.length) return [];
31
- let route;
40
+ if (!stored) return null;
32
41
  try {
33
- route = normalizeWorkflowRoute(stored);
42
+ return normalizeWorkflowRoute(stored) || null;
34
43
  } catch {
35
- return [];
44
+ return null;
36
45
  }
37
- const onPrimary =
38
- route &&
39
- canonicalRouteProvider(route.provider) === canonicalRouteProvider(provider) &&
40
- String(route.model) === String(model);
41
- return onPrimary ? route.fallbacks || [] : [];
46
+ }
47
+
48
+ export function ownerRouteFallbacks({ sessionMode, agentId, provider, model, config = null }) {
49
+ const route = ownerConfiguredRoute({ sessionMode, agentId, config });
50
+ if (!route?.fallbacks?.length) return [];
51
+ return sameRouteModel(route, { provider, model }) ? executionFallbacks(route) : [];
42
52
  }
@@ -4,6 +4,7 @@ import { isDeliveredCompletion, logDuplicateSkip } from './delivered-completions
4
4
  import { promptContentText } from './prompt-utils.mjs';
5
5
  import { parseTaskNotification, taskNotificationId } from '../../../../shared/task-notification-envelope.mjs';
6
6
  import { hopOf } from '../../../../shared/bot-hops.mjs';
7
+ import { PROMPT_ORIGIN_CHANNEL } from '../../../../shared/prompt-origin.mjs';
7
8
 
8
9
  const STALE_USER_INJECTION_TTL_MS = 30 * 60 * 1000;
9
10
  const PENDING_PROCESS_START_MS = Date.now();
@@ -12,6 +13,8 @@ const LIFECYCLE_TOKEN = Symbol('pendingLifecycleToken');
12
13
  export const COMPLETION_NOTIFICATION_KIND = 'completion_notification';
13
14
  export const PENDING_MODE_PROMPT = 'prompt';
14
15
  export const PENDING_MODE_TASK_NOTIFICATION = 'task-notification';
16
+ // Prompt provenance apart from the presentation mode (shared/prompt-origin.mjs).
17
+ export { PROMPT_ORIGIN_AGENT_REPORT, PROMPT_ORIGIN_CHANNEL } from '../../../../shared/prompt-origin.mjs';
15
18
 
16
19
  export function stampLifecycleToken(entry, token) {
17
20
  if (!entry || typeof entry !== 'object' || !token) return entry;
@@ -169,9 +172,14 @@ export function lateDeliveryText(text, entry, now = Date.now()) {
169
172
  // A non-completion entry may be queued explicitly as a task notification (a
170
173
  // runtime/channel notice, never the user typing): the mode survives
171
174
  // normalization and the durable spool so the drain stores it as one and it
172
- // never drives explicit skill selection.
175
+ // never drives explicit skill selection. A channel's inbound message keeps
176
+ // its provenance beside the mode (PROMPT_ORIGIN_CHANNEL).
173
177
  function explicitModeField(entry) {
174
- return entry?.mode === PENDING_MODE_TASK_NOTIFICATION ? { mode: PENDING_MODE_TASK_NOTIFICATION } : {};
178
+ if (entry?.mode !== PENDING_MODE_TASK_NOTIFICATION) return {};
179
+ return {
180
+ mode: PENDING_MODE_TASK_NOTIFICATION,
181
+ ...(entry.origin === PROMPT_ORIGIN_CHANNEL ? { origin: PROMPT_ORIGIN_CHANNEL } : {}),
182
+ };
175
183
  }
176
184
 
177
185
  function normalizePendingMessageEntry(entry) {
@@ -343,6 +351,7 @@ export function _groupPendingMessageEntries(entries) {
343
351
  mode: PENDING_MODE_TASK_NOTIFICATION,
344
352
  ...(normalized.execution ? { execution: normalized.execution } : {}),
345
353
  ...(normalized.hop ? { hop: normalized.hop } : {}),
354
+ ...(normalized.origin ? { origin: normalized.origin } : {}),
346
355
  ids: idsOf([entry]),
347
356
  entries: [entry],
348
357
  });
@@ -33,6 +33,19 @@ function plainToolCalls(toolCalls) {
33
33
  });
34
34
  }
35
35
 
36
+ /** The provider-native replay state `message` carries — its replay fields'
37
+ * values and its tool calls' signatures — or null when it carries none. */
38
+ export function providerReplayState(message) {
39
+ if (!message || typeof message !== 'object') return null;
40
+ const state = PROVIDER_REPLAY_FIELDS.filter((field) => field in message).map((field) => message[field]);
41
+ for (const call of Array.isArray(message.toolCalls) ? message.toolCalls : []) {
42
+ if (call && typeof call === 'object') {
43
+ for (const field of TOOL_CALL_SIGNATURE_FIELDS) if (field in call) state.push(call[field]);
44
+ }
45
+ }
46
+ return state.length ? state : null;
47
+ }
48
+
36
49
  /** `message` without provider-native replay state; the same object when it carries none. */
37
50
  export function stripProviderReplayMessage(message) {
38
51
  if (!message || typeof message !== 'object') return message;