mixdog 0.9.174 → 1.0.0

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 (935) hide show
  1. package/README.md +11 -12
  2. package/package.json +2 -2
  3. package/scripts/agent-turn-trace-probe.mjs +1 -1
  4. package/scripts/build-ffmpeg-runtime.sh +16 -0
  5. package/scripts/build-runtime-linux.sh +8 -2
  6. package/scripts/build-runtime-macos.sh +8 -2
  7. package/scripts/computer-task-cost-report.mjs +1 -9
  8. package/scripts/context-renewal-live-check.mjs +2 -1
  9. package/scripts/graph-parity.mjs +78 -55
  10. package/scripts/lib/bench-sandbox.mjs +67 -0
  11. package/scripts/lib/bench-sandbox.test.mjs +54 -0
  12. package/scripts/lib/coverage.mjs +2 -4
  13. package/scripts/lib/run-node-tests.mjs +24 -1
  14. package/scripts/lib/session-bench-fmt.mjs +65 -0
  15. package/scripts/lib/session-bench-render.mjs +394 -0
  16. package/scripts/lib/smoke-loop-shared.mjs +28 -0
  17. package/scripts/lib/smoke-loop-shared.test.mjs +22 -0
  18. package/scripts/lib/trace-row.mjs +40 -0
  19. package/scripts/lib/trace-row.test.mjs +47 -0
  20. package/scripts/lib/trace-stats.mjs +7 -0
  21. package/scripts/lib/trace-stats.test.mjs +7 -1
  22. package/scripts/llm-trace-summary.mjs +2 -44
  23. package/scripts/memory-chunk-quality.mjs +1 -1
  24. package/scripts/memory-layer2-check.mjs +1 -1
  25. package/scripts/pg-memory-diet.mjs +1 -1
  26. package/scripts/plan-runtime-release-tag.mjs +57 -0
  27. package/scripts/prepare-native-assets.mjs +1 -1
  28. package/scripts/provider-contract-test-env.mjs +21 -0
  29. package/scripts/release-paths.mjs +1 -0
  30. package/scripts/routing-corpus.mjs +1 -11
  31. package/scripts/session-diag.mjs +2 -44
  32. package/scripts/smoke-runtime-negative.sh +7 -1
  33. package/scripts/test-data-dir.mjs +19 -0
  34. package/scripts/tidy/sync-engines-manifest.mjs +8 -10
  35. package/scripts/tool-efficiency-diag.mjs +1 -4
  36. package/scripts/voice-runtime-config.json +1 -1
  37. package/src/app.mjs +1 -1
  38. package/src/defaults/skills/code-tidy/SKILL.md +5 -2
  39. package/src/defaults/skills/pptx/SKILL.md +1 -1
  40. package/src/defaults/skills/pptx/references/pictures.md +1 -1
  41. package/src/defaults/skills/pptx/scripts/review-deck.mjs +13 -4
  42. package/src/defaults/skills/skill-creator/scripts/validate-skill.mjs +40 -40
  43. package/src/defaults/skills/xlsx/SKILL.md +1 -0
  44. package/src/headless-exec.mjs +4 -2
  45. package/src/headless-role.mjs +81 -68
  46. package/src/lib/keychain-cjs.cjs +26 -49
  47. package/src/lib/mixdog-debug.cjs +1 -1
  48. package/src/lib/rules-builder.cjs +4 -3
  49. package/src/mixdog-session-runtime.mjs +2 -2
  50. package/src/repl/slash-commands.mjs +1 -1
  51. package/src/repl/stream-sink.mjs +1 -1
  52. package/src/repl/turn-output.mjs +2 -2
  53. package/src/repl.mjs +1 -1
  54. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +1 -1
  55. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +20 -16
  56. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +0 -3
  57. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +23 -22
  58. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +2 -2
  59. package/src/runtime/{shared/llm/index.mjs → agent/orchestrator/maintenance-preset.mjs} +2 -2
  60. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +2 -1
  61. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +7 -36
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +28 -2
  63. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +6 -1
  65. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +1 -47
  66. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +1 -383
  67. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -59
  68. package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +32 -31
  69. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
  70. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +10 -1
  71. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +12 -61
  72. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +2 -1
  73. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +2 -0
  74. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +30 -67
  75. package/src/runtime/agent/orchestrator/providers/anthropic-recovery-guards.mjs +9 -12
  76. package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +3 -1
  77. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/leak-guard.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +20 -12
  79. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -2
  80. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +4 -3
  81. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +5 -1
  82. package/src/runtime/agent/orchestrator/providers/anthropic-sse-watchdogs.mjs +18 -10
  83. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +20 -16
  84. package/src/runtime/agent/orchestrator/providers/anthropic-thinking-contract.mjs +1 -26
  85. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +9 -13
  86. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +8 -3
  87. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +4 -8
  88. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +21 -30
  89. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +4 -2
  91. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +10 -8
  92. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +13 -10
  93. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +29 -0
  94. package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +0 -1
  95. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +10 -26
  96. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +2 -3
  97. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +7 -3
  98. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +9 -15
  99. package/src/runtime/agent/orchestrator/providers/cursor.mjs +31 -5
  100. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +1 -2
  101. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +1 -4
  102. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  103. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +48 -46
  104. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +18 -19
  105. package/src/runtime/agent/orchestrator/providers/gemini.mjs +3 -26
  106. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +41 -0
  107. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +5 -19
  108. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +16 -83
  109. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +26 -8
  110. package/src/runtime/agent/orchestrator/providers/lib/anthropic-models.mjs +8 -0
  111. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +30 -1
  112. package/src/runtime/agent/orchestrator/providers/lib/anthropic-stream-labels.mjs +6 -0
  113. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +17 -0
  114. package/src/runtime/agent/orchestrator/providers/{anthropic-leaked-toolcall.mjs → lib/leaked-toolcall.mjs} +7 -7
  115. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +44 -0
  116. package/src/runtime/agent/orchestrator/providers/lib/send-callbacks.mjs +12 -0
  117. package/src/runtime/agent/orchestrator/providers/lib/sse-framing.mjs +9 -8
  118. package/src/runtime/agent/orchestrator/providers/lib/transport-fallback-trace.mjs +25 -0
  119. package/src/runtime/agent/orchestrator/providers/model-catalog-projection.mjs +1 -181
  120. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +1 -796
  121. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +1 -71
  122. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +87 -0
  123. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +4 -5
  124. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +4 -5
  125. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +2 -21
  126. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +1 -1
  127. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +2 -3
  128. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +1 -2
  129. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +4 -8
  130. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +45 -32
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +2 -2
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +2 -2
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +6 -12
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +2 -2
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -2
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +14 -22
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +25 -34
  138. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +14 -14
  139. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +3 -1
  140. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +2 -2
  141. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +1 -1
  142. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +2 -13
  143. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +1 -1
  144. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +1 -1
  145. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +2 -2
  146. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +2 -44
  147. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -16
  148. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +6 -5
  149. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +4 -1
  150. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +3 -2
  151. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +2 -2
  152. package/src/runtime/agent/orchestrator/providers/openai-ws-text-relay.mjs +1 -1
  153. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +6 -4
  154. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +2 -1
  155. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +2 -2
  156. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -130
  157. package/src/runtime/agent/orchestrator/providers/registry.mjs +20 -16
  158. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +21 -20
  159. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +17 -17
  160. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +193 -0
  161. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +421 -0
  162. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-inspection.mjs +17 -17
  163. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-inspection.mjs +1 -1
  164. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-shape.mjs +3 -3
  165. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status.mjs +1 -1
  166. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +101 -0
  167. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +145 -0
  168. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/extension-scopes.mjs +5 -5
  169. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/fs-utils.mjs +1 -1
  170. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-control.mjs +2 -2
  171. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-mutations.mjs +2 -2
  172. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-reminder.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +326 -0
  174. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-storage.mjs +2 -2
  175. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +148 -0
  176. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-title.mjs +2 -2
  177. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +140 -0
  178. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-turns.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +140 -0
  180. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/orchestration.mjs +1 -1
  181. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/plugin-mcp.mjs +2 -2
  182. package/src/runtime/agent/orchestrator/runtime-core/session-id.mjs +2 -0
  183. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-route-policy.mjs +2 -2
  184. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-text.mjs +3 -3
  185. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-title.mjs +1 -2
  186. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/skill-tool-loading.mjs +1 -1
  187. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-catalog-schema.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +747 -0
  189. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +149 -0
  190. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/agents.mjs +11 -7
  191. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/context.mjs +6 -4
  192. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/packs.mjs +2 -3
  193. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow-ids.mjs +1 -1
  194. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +255 -0
  195. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +3 -4
  196. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +2 -4
  197. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +1 -1
  198. package/src/runtime/agent/orchestrator/session/context-identity-writer.mjs +162 -0
  199. package/src/runtime/agent/orchestrator/session/context-tool-pairs.mjs +2 -2
  200. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +87 -0
  201. package/src/runtime/agent/orchestrator/session/context-utils.mjs +3 -245
  202. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -3
  203. package/src/runtime/agent/orchestrator/session/eager-dispatch/mutation-paths.mjs +54 -0
  204. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +1 -1
  205. package/src/runtime/agent/orchestrator/session/lifecycle-scan.mjs +1 -16
  206. package/src/runtime/agent/orchestrator/session/loop/arg-schema-coerce.mjs +2 -2
  207. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +13 -1
  208. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +3 -3
  209. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +4 -4
  210. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +1 -1
  211. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +2 -2
  212. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/continuation.mjs +1 -1
  213. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +2 -3
  214. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +2 -2
  215. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +6 -3
  216. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +1 -1
  217. package/src/runtime/agent/orchestrator/session/loop/tool-exec/call-prep.mjs +3 -2
  218. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +6 -10
  219. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -2
  220. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +1 -1
  221. package/src/runtime/agent/orchestrator/session/loop.mjs +5 -6
  222. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +1 -1
  223. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +2 -2
  224. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -2
  225. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +5 -5
  226. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +40 -64
  227. package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +2 -2
  228. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +24 -16
  229. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  230. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +7 -13
  231. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +17 -2
  232. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +139 -0
  233. package/src/runtime/agent/orchestrator/session/manager/pending-spool-sweep.mjs +34 -14
  234. package/src/runtime/agent/orchestrator/session/manager/prefetch-bridge/file-prefetch.mjs +1 -1
  235. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +4 -18
  236. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +10 -18
  238. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +1 -1
  239. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -2
  240. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +1 -1
  241. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +2 -2
  242. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +6 -10
  243. package/src/runtime/agent/orchestrator/session/manager.mjs +1 -2
  244. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +11 -6
  245. package/src/runtime/agent/orchestrator/session/result-classification.mjs +1 -1
  246. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +194 -0
  247. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +6 -198
  248. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +7 -7
  249. package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +0 -19
  250. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +15 -8
  251. package/src/runtime/agent/orchestrator/session/store/listing.mjs +18 -29
  252. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +6 -36
  253. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +148 -0
  254. package/src/runtime/agent/orchestrator/session/store/save-fault.mjs +3 -3
  255. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +15 -142
  256. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +3 -3
  257. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +4 -2
  258. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +1 -1
  259. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +3 -2
  260. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +9 -22
  261. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +14 -6
  262. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +200 -52
  263. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +81 -0
  264. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +38 -4
  265. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +5 -2
  266. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +3 -5
  267. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +54 -0
  268. package/src/runtime/agent/orchestrator/session/store.mjs +5 -9
  269. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +19 -8
  270. package/src/runtime/agent/orchestrator/session/tool-batch/flush.mjs +1 -1
  271. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  272. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  273. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +489 -0
  274. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +419 -0
  275. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +358 -0
  276. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +157 -0
  277. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +2 -3
  278. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +32 -11
  279. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -31
  280. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/benign-exit.mjs +7 -3
  281. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +11 -3
  282. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -0
  283. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +13 -7
  284. package/src/runtime/agent/orchestrator/tools/builtin/binary-file.mjs +6 -3
  285. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +11 -5
  286. package/src/runtime/agent/orchestrator/tools/builtin/device-paths.mjs +1 -206
  287. package/src/runtime/agent/orchestrator/tools/builtin/find-files-tool.mjs +1 -1
  288. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +39 -3
  289. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +5 -7
  290. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-request.mjs +7 -25
  291. package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +27 -1
  292. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +37 -0
  293. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-insights.mjs +1 -1
  294. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +28 -18
  295. package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +6 -10
  296. package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +15 -17
  297. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +3 -3
  298. package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +1 -399
  299. package/src/runtime/agent/orchestrator/tools/builtin/read-line-collector.mjs +3 -2
  300. package/src/runtime/agent/orchestrator/tools/builtin/read-office-files.mjs +8 -15
  301. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +5 -8
  302. package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +3 -2
  303. package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +2 -2
  304. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -5
  305. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +50 -5
  306. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-render.mjs +1 -1
  307. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +2 -5
  308. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +11 -1
  309. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +1 -1
  310. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +3 -35
  311. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +0 -12
  312. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +50 -0
  313. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +9 -26
  314. package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +2 -1
  315. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +6 -5
  316. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +8 -3
  317. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +6 -14
  318. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-validation.mjs +3 -9
  319. package/src/runtime/agent/orchestrator/tools/builtin/tool-output-limit.mjs +1 -60
  320. package/src/runtime/agent/orchestrator/tools/builtin.mjs +10 -32
  321. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +2 -2
  322. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +3 -3
  323. package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +3 -7
  324. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +15 -10
  325. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +6 -10
  326. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +4 -0
  327. package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +3 -3
  328. package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +3 -7
  329. package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +1 -84
  330. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +11 -11
  331. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  332. package/src/runtime/agent/orchestrator/tools/io-trace.mjs +28 -0
  333. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +38 -5
  334. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +10 -4
  335. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +6 -26
  336. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/request.mjs +0 -3
  337. package/src/runtime/agent/orchestrator/tools/patch/dispatch/native-report.mjs +2 -1
  338. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +3 -10
  339. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +1 -1
  340. package/src/runtime/agent/orchestrator/tools/patch/mutation-output.mjs +6 -19
  341. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +5 -15
  342. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -3
  343. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +4 -0
  344. package/src/runtime/agent/orchestrator/tools/patch/sequence/run.mjs +1 -3
  345. package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +4 -10
  346. package/src/runtime/agent/orchestrator/tools/patch/sequence.mjs +1 -2
  347. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +5 -11
  348. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +1 -2
  349. package/src/runtime/agent/orchestrator/tools/patch-manifest-path.mjs +3 -0
  350. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +12 -12
  351. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +87 -12
  352. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +6 -3
  353. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +1 -1
  354. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +15 -25
  355. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  356. package/src/runtime/{shared/llm → agent/orchestrator}/usage-log.mjs +1 -1
  357. package/src/runtime/attachments/pdf-extract.mjs +32 -29
  358. package/src/runtime/attachments/store.mjs +2 -1
  359. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -2
  360. package/src/runtime/browser-bridge/client.mjs +30 -9
  361. package/src/runtime/channels/data/voice-runtime-manifest.json +21 -21
  362. package/src/runtime/channels/lib/config.mjs +4 -4
  363. package/src/runtime/channels/lib/event-pipeline.mjs +3 -3
  364. package/src/runtime/channels/lib/event-queue.mjs +1 -0
  365. package/src/runtime/channels/lib/executor.mjs +3 -25
  366. package/src/runtime/channels/lib/runtime-paths.mjs +36 -41
  367. package/src/runtime/channels/lib/scheduler.mjs +28 -44
  368. package/src/runtime/{shared → channels/lib}/schedules-db.mjs +3 -3
  369. package/src/runtime/channels/lib/tool-dispatch.mjs +3 -8
  370. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +19 -23
  371. package/src/runtime/channels/lib/voice-transcription.mjs +13 -9
  372. package/src/runtime/channels/lib/webhook/log.mjs +2 -29
  373. package/src/runtime/channels/lib/webhook/request-handler.mjs +4 -5
  374. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +8 -12
  375. package/src/runtime/channels/lib/webhook/signature.mjs +15 -19
  376. package/src/runtime/channels/lib/webhook/untrusted-fence.mjs +9 -0
  377. package/src/runtime/channels/lib/webhook.mjs +1 -1
  378. package/src/runtime/{shared → channels/lib}/webhooks-db.mjs +3 -3
  379. package/src/runtime/channels/lib/whisper-server.mjs +3 -2
  380. package/src/runtime/channels/lib/worker-bootstrap.mjs +19 -21
  381. package/src/runtime/channels/lib/worker-main.mjs +49 -58
  382. package/src/runtime/computer-bridge/client.mjs +7 -10
  383. package/src/runtime/computer-bridge/core-actions.mjs +1 -1
  384. package/src/runtime/computer-bridge/limits.d.mts +0 -1
  385. package/src/runtime/github/client.mjs +11 -6
  386. package/src/runtime/github/commands.mjs +4 -2
  387. package/src/runtime/github/contract.mjs +3 -1
  388. package/src/runtime/local-provider/hugging-face.mjs +3 -3
  389. package/src/runtime/local-provider/registered-models.mjs +3 -1
  390. package/src/runtime/local-provider/request-queue.mjs +24 -29
  391. package/src/runtime/local-provider/serial-chain.mjs +19 -0
  392. package/src/runtime/local-provider/server-process.mjs +2 -10
  393. package/src/runtime/media/adapters/antigravity-image.mjs +2 -2
  394. package/src/runtime/media/adapters/codex-image.mjs +2 -2
  395. package/src/runtime/media/adapters/gemini-image.mjs +2 -1
  396. package/src/runtime/media/adapters/gemini-video.mjs +3 -7
  397. package/src/runtime/media/adapters/xai-media.mjs +3 -7
  398. package/src/runtime/media/bounded-signal.mjs +13 -0
  399. package/src/runtime/media/store.mjs +9 -3
  400. package/src/runtime/memory/data/runtime-manifest.json +11 -11
  401. package/src/runtime/memory/index.mjs +6 -21
  402. package/src/runtime/memory/lib/core-memory-file.mjs +1 -1
  403. package/src/runtime/memory/lib/cycle-scheduler/backlog-probe.mjs +2 -1
  404. package/src/runtime/memory/lib/cycle1/cycle1-plan.mjs +1 -1
  405. package/src/runtime/memory/lib/embedding-idle-lease.mjs +18 -0
  406. package/src/runtime/memory/lib/embedding-provider.mjs +13 -0
  407. package/src/runtime/memory/lib/embedding-worker.mjs +12 -1
  408. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +1 -1
  409. package/src/runtime/memory/lib/http-router/session-routes.mjs +1 -1
  410. package/src/runtime/memory/lib/ingest/transcript-discovery.mjs +1 -1
  411. package/src/runtime/memory/lib/memory-action-handlers/manage-actions.mjs +1 -1
  412. package/src/runtime/memory/lib/memory-cycle1.mjs +24 -1
  413. package/src/runtime/memory/lib/memory-cycle2-quarantine.mjs +99 -0
  414. package/src/runtime/memory/lib/memory-cycle2-review.mjs +8 -2
  415. package/src/runtime/memory/lib/memory-cycle2.mjs +49 -9
  416. package/src/runtime/memory/lib/memory-embed.mjs +3 -2
  417. package/src/runtime/memory/lib/memory-extraction.mjs +1 -2
  418. package/src/runtime/memory/lib/memory-fingerprint.mjs +1 -1
  419. package/src/runtime/memory/lib/memory-ops-policy.mjs +18 -2
  420. package/src/runtime/memory/lib/memory-retrievers.mjs +2 -2
  421. package/src/runtime/memory/lib/memory-text-utils.mjs +1 -1
  422. package/src/runtime/memory/lib/pg/adapter.mjs +3 -3
  423. package/src/runtime/memory/lib/pg/process.mjs +2 -2
  424. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -2
  425. package/src/runtime/memory/lib/query-ranking.mjs +2 -2
  426. package/src/runtime/memory/lib/query-search-plan.mjs +1 -1
  427. package/src/runtime/memory/lib/recall-format.mjs +3 -4
  428. package/src/runtime/memory/lib/runtime-fetcher.mjs +94 -23
  429. package/src/runtime/memory/lib/session-ingest-runtime.mjs +1 -1
  430. package/src/runtime/memory/lib/trace-store.mjs +6 -2
  431. package/src/runtime/office/authoring/pptx-author-action.mjs +8 -3
  432. package/src/runtime/office/authoring/pptx-brief.mjs +3 -3
  433. package/src/runtime/office/authoring/pptx-html-build.mjs +109 -37
  434. package/src/runtime/office/authoring/pptx-html-geometry.mjs +188 -46
  435. package/src/runtime/office/authoring/pptx-html-measure.mjs +60 -21
  436. package/src/runtime/office/authoring/pptx-html-runner.mjs +83 -29
  437. package/src/runtime/office/authoring/pptx-script-normalize.mjs +156 -16
  438. package/src/runtime/office/bench/polish-benchmark.mjs +204 -201
  439. package/src/runtime/office/bench/quality-live-benchmark.mjs +8 -4
  440. package/src/runtime/office/capabilities-catalog.mjs +12 -1
  441. package/src/runtime/office/capabilities-signatures.mjs +31 -11
  442. package/src/runtime/office/capabilities.mjs +39 -20
  443. package/src/runtime/office/com/com-adapter.mjs +16 -14
  444. package/src/runtime/office/com/office-com-host.ps1 +118 -140
  445. package/src/runtime/office/core/excel-snapshot-normalize.mjs +149 -0
  446. package/src/runtime/office/core/office-actions-batch.mjs +4 -7
  447. package/src/runtime/office/core/office-actions-inspect.mjs +17 -14
  448. package/src/runtime/office/core/office-actions-open.mjs +1 -6
  449. package/src/runtime/office/core/office-core.mjs +107 -49
  450. package/src/runtime/office/core/office-finalize/review-stage.mjs +4 -1
  451. package/src/runtime/office/core/office-qa/design-review-stage.mjs +2 -9
  452. package/src/runtime/office/core/office-qa/review-assembly.mjs +9 -7
  453. package/src/runtime/office/core/office-sessions.mjs +10 -149
  454. package/src/runtime/office/design/composition-system.mjs +5 -10
  455. package/src/runtime/office/design/design-system.mjs +1 -2
  456. package/src/runtime/office/design/docx/design-docx/section.mjs +1 -1
  457. package/src/runtime/office/design/docx/design-docx-components.mjs +2 -1
  458. package/src/runtime/office/design/docx/design-docx.mjs +2 -2
  459. package/src/runtime/office/design/xlsx/design-xlsx.mjs +6 -2
  460. package/src/runtime/office/pdf/pdf-analysis.mjs +39 -32
  461. package/src/runtime/office/pdf/pdf-batch-content.mjs +1 -1
  462. package/src/runtime/office/pdf/pdf-writer.mjs +26 -22
  463. package/src/runtime/office/portable/docx-tracked-edits.mjs +6 -6
  464. package/src/runtime/office/portable/font-provisioner.mjs +37 -11
  465. package/src/runtime/office/portable/portable-cells.mjs +2 -6
  466. package/src/runtime/office/portable/portable-chart.mjs +6 -6
  467. package/src/runtime/office/portable/portable-docx-edits.mjs +4 -9
  468. package/src/runtime/office/portable/portable-docx-operations.mjs +16 -13
  469. package/src/runtime/office/portable/portable-docx-parts.mjs +7 -2
  470. package/src/runtime/office/portable/portable-docx-xml.mjs +36 -28
  471. package/src/runtime/office/portable/portable-opc.mjs +11 -13
  472. package/src/runtime/office/portable/portable-package.mjs +3 -4
  473. package/src/runtime/office/portable/portable-pivot.mjs +7 -3
  474. package/src/runtime/office/portable/portable-pptx-charts.mjs +59 -42
  475. package/src/runtime/office/portable/portable-pptx-core.mjs +14 -4
  476. package/src/runtime/office/portable/portable-pptx-package.mjs +5 -4
  477. package/src/runtime/office/portable/portable-pptx-shapes.mjs +25 -8
  478. package/src/runtime/office/portable/portable-sheet-audits.mjs +4 -8
  479. package/src/runtime/office/portable/portable-sheet-page.mjs +2 -2
  480. package/src/runtime/office/portable/portable-sheet-xml.mjs +1 -1
  481. package/src/runtime/office/portable/portable-snapshot-docx.mjs +2 -3
  482. package/src/runtime/office/portable/portable-snapshot-pptx.mjs +3 -1
  483. package/src/runtime/office/portable/portable-soffice.mjs +27 -22
  484. package/src/runtime/office/portable/portable-validation-package.mjs +1 -2
  485. package/src/runtime/office/portable/portable-validation.mjs +9 -3
  486. package/src/runtime/office/portable/portable-xlsx-operations.mjs +2 -49
  487. package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +10 -5
  488. package/src/runtime/office/portable/portable-xlsx-range-layout.mjs +3 -2
  489. package/src/runtime/office/portable/portable-xlsx-reference-shift.mjs +189 -98
  490. package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +26 -6
  491. package/src/runtime/office/portable/portable-xml.mjs +1 -4
  492. package/src/runtime/office/portable/text-metrics.mjs +14 -17
  493. package/src/runtime/office/portable/xlsx-contract.mjs +37 -3
  494. package/src/runtime/office/portable/xlsx-formula-engine.mjs +7 -1
  495. package/src/runtime/office/quality/assurance-checklist.mjs +1 -1
  496. package/src/runtime/office/quality/assurance-rendered.mjs +1 -1
  497. package/src/runtime/office/quality/assurance-structure-pptx.mjs +17 -8
  498. package/src/runtime/office/quality/assurance-structure.mjs +0 -2
  499. package/src/runtime/office/quality/design-aesthetics.mjs +2 -9
  500. package/src/runtime/office/quality/design-deck-diversity.mjs +2 -9
  501. package/src/runtime/office/quality/design-review.mjs +3 -3
  502. package/src/runtime/office/quality/pptx-slide-roles.mjs +3 -3
  503. package/src/runtime/office/shared/line-breaks.mjs +3 -1
  504. package/src/runtime/office/tool-defs.mjs +2 -2
  505. package/src/runtime/shared/async-log-appender.mjs +83 -0
  506. package/src/runtime/shared/automation-presence.mjs +9 -0
  507. package/src/runtime/shared/buffered-appender.mjs +10 -7
  508. package/src/runtime/shared/child-spawn-gate.mjs +2 -37
  509. package/src/runtime/shared/code-graph-state.mjs +84 -0
  510. package/src/runtime/shared/config.mjs +71 -89
  511. package/src/runtime/shared/context-inspection.mjs +56 -0
  512. package/src/runtime/shared/context-measurement.mjs +83 -0
  513. package/src/runtime/shared/device-paths.mjs +206 -0
  514. package/src/{standalone → runtime/shared}/fair-call-scheduler/owner-groups.mjs +1 -1
  515. package/src/runtime/shared/fair-call-scheduler.mjs +198 -0
  516. package/src/runtime/shared/file-lock.mjs +85 -55
  517. package/src/runtime/shared/http-request-body.mjs +3 -1
  518. package/src/runtime/shared/llm/anthropic-betas.mjs +46 -0
  519. package/src/runtime/shared/llm/anthropic-effort.mjs +378 -0
  520. package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +29 -0
  521. package/src/runtime/shared/llm/cost.mjs +19 -10
  522. package/src/runtime/shared/llm/model-catalog-projection.mjs +182 -0
  523. package/src/runtime/shared/llm/model-catalog.mjs +799 -0
  524. package/src/runtime/shared/llm/model-pricing-rates.mjs +78 -0
  525. package/src/runtime/shared/llm/provider-catalog-cache.mjs +130 -0
  526. package/src/runtime/shared/llm/usage-accounting.mjs +12 -11
  527. package/src/runtime/shared/llm/usage-context.mjs +7 -0
  528. package/src/runtime/shared/llm/usage-ledger-import.mjs +14 -3
  529. package/src/runtime/shared/llm/usage-ledger-quota.mjs +97 -37
  530. package/src/runtime/shared/llm/usage-ledger-repair.mjs +3 -1
  531. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +6 -10
  532. package/src/runtime/shared/llm/usage-ledger.mjs +6 -7
  533. package/src/runtime/shared/llm/usage-pricing-refresh.mjs +1 -1
  534. package/src/runtime/shared/llm/usage-rollup.mjs +0 -1
  535. package/src/runtime/shared/model-display.mjs +178 -0
  536. package/src/runtime/shared/notify-trace.mjs +14 -3
  537. package/src/runtime/shared/owner-fair-gate.mjs +1 -1
  538. package/src/runtime/shared/pending-json-projection.mjs +17 -0
  539. package/src/runtime/shared/pristine-execution.mjs +4 -3
  540. package/src/runtime/shared/process-lifecycle.mjs +18 -7
  541. package/src/runtime/shared/read-image-resize.mjs +399 -0
  542. package/src/runtime/shared/schedule-model-ref.mjs +2 -2
  543. package/src/runtime/shared/staged-update.mjs +7 -36
  544. package/src/runtime/shared/statusline/ansi.mjs +161 -0
  545. package/src/{ui → runtime/shared/statusline}/statusline-format.mjs +5 -5
  546. package/src/{ui → runtime/shared/statusline}/statusline-segments.mjs +54 -50
  547. package/src/runtime/shared/tool-card-model/background-task.mjs +1 -1
  548. package/src/runtime/shared/tool-card-model/card-detail.mjs +2 -2
  549. package/src/runtime/shared/tool-card-model/card-status.mjs +7 -5
  550. package/src/runtime/shared/tool-card-model/git-result.mjs +10 -0
  551. package/src/runtime/shared/tool-card-model/terminal-status.mjs +6 -2
  552. package/src/runtime/shared/tool-card-model.golden-cases.mjs +2 -1
  553. package/src/runtime/shared/tool-output-limit.mjs +60 -0
  554. package/src/runtime/shared/tool-primitives.mjs +1 -1
  555. package/src/runtime/shared/tool-result-summary.mjs +1 -0
  556. package/src/runtime/shared/tool-status.mjs +35 -2
  557. package/src/runtime/shared/transcript-metadata.mjs +1 -1
  558. package/src/runtime/shared/transcript-writer/transcript-file.mjs +1 -2
  559. package/src/runtime/shared/turn-snapshot-store.mjs +23 -17
  560. package/src/runtime/shared/turn-worktree-snapshot.mjs +8 -4
  561. package/src/runtime/shared/update-checker.mjs +1 -3
  562. package/src/runtime/tidy/apply.mjs +2 -2
  563. package/src/runtime/tidy/function-length.mjs +63 -0
  564. package/src/runtime/tidy/report.mjs +6 -3
  565. package/src/runtime/tidy/runners/shared.mjs +1 -0
  566. package/src/runtime/tidy/runners/shellcheck.mjs +1 -1
  567. package/src/runtime/tidy/tool.mjs +10 -3
  568. package/src/runtime/web-search/index.mjs +6 -17
  569. package/src/runtime/web-search/lib/cache.mjs +8 -54
  570. package/src/runtime/web-search/lib/config.mjs +2 -6
  571. package/src/runtime/web-search/lib/debounced-json-writer.mjs +62 -0
  572. package/src/runtime/web-search/lib/http-fetch.mjs +24 -112
  573. package/src/runtime/web-search/lib/package-version.mjs +10 -0
  574. package/src/runtime/web-search/lib/ssrf-guard.mjs +34 -28
  575. package/src/runtime/web-search/lib/state.mjs +8 -53
  576. package/src/runtime/web-search/lib/web-tools.mjs +5 -5
  577. package/src/session-runtime/agent-tool-routing.mjs +3 -9
  578. package/src/{runtime/shared → session-runtime}/automation-workflow.mjs +4 -4
  579. package/src/session-runtime/boot/apis.mjs +4 -5
  580. package/src/session-runtime/boot/begin.mjs +1 -1
  581. package/src/session-runtime/boot/config.mjs +2 -2
  582. package/src/session-runtime/boot/facade.mjs +2 -2
  583. package/src/session-runtime/boot/infrastructure.mjs +4 -4
  584. package/src/session-runtime/boot/providers.mjs +6 -6
  585. package/src/session-runtime/boot/session.mjs +1 -1
  586. package/src/session-runtime/boot/shared.mjs +5 -7
  587. package/src/session-runtime/boot/tools.mjs +6 -6
  588. package/src/session-runtime/bridge-first-use-gate.mjs +1 -1
  589. package/src/session-runtime/builtin-features.mjs +1 -193
  590. package/src/session-runtime/channel-config-api.mjs +3 -3
  591. package/src/session-runtime/config-helpers.mjs +1 -420
  592. package/src/session-runtime/config-lifecycle.mjs +2 -2
  593. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -2
  594. package/src/session-runtime/cwd-plugins/plugin-status.mjs +1 -1
  595. package/src/session-runtime/deferred-tool-delta.mjs +1 -101
  596. package/src/session-runtime/effort.mjs +1 -145
  597. package/src/session-runtime/goal-facade-api.mjs +1 -1
  598. package/src/session-runtime/goal-state.mjs +1 -325
  599. package/src/session-runtime/goal-tasks.mjs +1 -137
  600. package/src/session-runtime/goal-tool-defs.mjs +1 -140
  601. package/src/session-runtime/hook-payload.mjs +4 -5
  602. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -3
  603. package/src/session-runtime/internal-tool-executor/caller-context.mjs +8 -0
  604. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +3 -2
  605. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -6
  606. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +2 -2
  607. package/src/session-runtime/internal-tool-executor.mjs +1 -1
  608. package/src/session-runtime/lifecycle/inheritance.mjs +1 -1
  609. package/src/session-runtime/lifecycle/session-catalog.mjs +3 -3
  610. package/src/session-runtime/lifecycle/session-switch/resume.mjs +2 -2
  611. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +1 -1
  612. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  613. package/src/session-runtime/lifecycle/shared.mjs +1 -1
  614. package/src/session-runtime/mcp-glue/connect.mjs +1 -1
  615. package/src/session-runtime/mcp-glue/server-catalog.mjs +1 -1
  616. package/src/session-runtime/mcp-glue/server-input.mjs +1 -1
  617. package/src/session-runtime/model-capabilities.mjs +1 -140
  618. package/src/session-runtime/model-recency.mjs +1 -1
  619. package/src/session-runtime/model-route/route-persist.mjs +2 -2
  620. package/src/session-runtime/model-route/route-tuning.mjs +3 -3
  621. package/src/session-runtime/model-route/set-route.mjs +6 -6
  622. package/src/session-runtime/model-route/web-search-route.mjs +5 -5
  623. package/src/session-runtime/model-route-api.mjs +1 -1
  624. package/src/session-runtime/native-web-search/routes.mjs +1 -1
  625. package/src/session-runtime/native-web-search/tool-shape.mjs +2 -2
  626. package/src/session-runtime/output-styles.mjs +2 -2
  627. package/src/session-runtime/prewarm/channel-start.mjs +1 -0
  628. package/src/session-runtime/provider-auth/accounts.mjs +7 -2
  629. package/src/session-runtime/provider-auth/login.mjs +1 -1
  630. package/src/session-runtime/provider-auth-api.mjs +1 -1
  631. package/src/session-runtime/provider-models/model-meta.mjs +1 -1
  632. package/src/session-runtime/provider-models/row-hydration.mjs +3 -3
  633. package/src/session-runtime/provider-usage.mjs +2 -2
  634. package/src/session-runtime/quick-model-rows/model-meta.mjs +1 -1
  635. package/src/session-runtime/quick-model-rows/provider-rows.mjs +1 -1
  636. package/src/session-runtime/quick-model-rows/web-search-rows.mjs +2 -2
  637. package/src/session-runtime/resource-api.mjs +2 -2
  638. package/src/session-runtime/resource-mcp-api.mjs +3 -3
  639. package/src/session-runtime/resource-plugins-api.mjs +3 -3
  640. package/src/session-runtime/resource-recall-api.mjs +2 -2
  641. package/src/session-runtime/resource-scope-decorate.mjs +2 -2
  642. package/src/session-runtime/route-resolution.mjs +3 -3
  643. package/src/session-runtime/route-state.mjs +4 -4
  644. package/src/session-runtime/runtime-bootstrap.mjs +1 -1
  645. package/src/session-runtime/runtime-facade.mjs +1 -1
  646. package/src/session-runtime/runtime-feature-gates.mjs +2 -2
  647. package/src/session-runtime/runtime-modules.mjs +3 -3
  648. package/src/session-runtime/runtime-paths.mjs +6 -2
  649. package/src/session-runtime/runtime-tool-routing.mjs +2 -2
  650. package/src/{runtime/shared → session-runtime}/schedule-session-run.mjs +5 -5
  651. package/src/{standalone → session-runtime/services}/agent-task-status.mjs +1 -1
  652. package/src/{standalone → session-runtime/services}/agent-tool/close-flow/close-all.mjs +2 -2
  653. package/src/{standalone → session-runtime/services}/agent-tool/close-flow.mjs +1 -1
  654. package/src/{standalone → session-runtime/services}/agent-tool/execute.mjs +1 -1
  655. package/src/{standalone → session-runtime/services}/agent-tool/helpers.mjs +6 -6
  656. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +209 -0
  657. package/src/{standalone → session-runtime/services}/agent-tool/job-task-reconcile.mjs +2 -2
  658. package/src/{standalone → session-runtime/services}/agent-tool/job-views/job-lookup.mjs +5 -1
  659. package/src/{standalone → session-runtime/services}/agent-tool/job-views/job-render.mjs +1 -1
  660. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +101 -0
  661. package/src/{standalone → session-runtime/services}/agent-tool/job-views/spawn-meta.mjs +1 -1
  662. package/src/session-runtime/services/agent-tool/job-views.mjs +59 -0
  663. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +48 -0
  664. package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/row-settlement.mjs +3 -3
  665. package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index.mjs +10 -2
  666. package/src/{standalone → session-runtime/services}/agent-tool/notify/early-completion.mjs +2 -2
  667. package/src/{standalone → session-runtime/services}/agent-tool/notify.mjs +4 -4
  668. package/src/{standalone → session-runtime/services}/agent-tool/render.mjs +2 -2
  669. package/src/{standalone → session-runtime/services}/agent-tool/send-flow.mjs +6 -2
  670. package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/job-start.mjs +2 -2
  671. package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-plan.mjs +3 -3
  672. package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-prep.mjs +3 -3
  673. package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-run.mjs +3 -3
  674. package/src/{standalone → session-runtime/services}/agent-tool/spawn-preset.mjs +1 -1
  675. package/src/session-runtime/services/agent-tool/tag-registry.mjs +121 -0
  676. package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/reap-timers.mjs +1 -1
  677. package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/scan-admission.mjs +1 -1
  678. package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/stale-rows.mjs +1 -1
  679. package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/tombstones.mjs +5 -2
  680. package/src/session-runtime/services/agent-tool/tool-def.mjs +60 -0
  681. package/src/{standalone → session-runtime/services}/agent-tool/turn-review.mjs +1 -1
  682. package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-liveness.mjs +1 -1
  683. package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-store.mjs +46 -20
  684. package/src/{standalone → session-runtime/services}/agent-tool/worker-index.mjs +8 -1
  685. package/src/{standalone → session-runtime/services}/agent-tool/worker-rows.mjs +1 -1
  686. package/src/session-runtime/services/agent-tool.mjs +151 -0
  687. package/src/{standalone → session-runtime/services}/agent-watchdog-registry.mjs +1 -1
  688. package/src/{standalone → session-runtime/services}/channel-admin.mjs +8 -10
  689. package/src/{standalone → session-runtime/services}/channel-client.mjs +1 -1
  690. package/src/{standalone → session-runtime/services}/channel-session-router.mjs +1 -1
  691. package/src/{standalone → session-runtime/services}/channel-worker/client-heartbeat.mjs +1 -1
  692. package/src/{standalone → session-runtime/services}/channel-worker/daemon-attach.mjs +1 -1
  693. package/src/{standalone → session-runtime/services}/channel-worker/daemon-spawn.mjs +5 -5
  694. package/src/session-runtime/services/channel-worker.mjs +140 -0
  695. package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +189 -0
  696. package/src/{standalone → session-runtime/services}/daemon-crash-capture/retention.mjs +1 -1
  697. package/src/{standalone → session-runtime/services}/daemon-crash-capture/spawn-capture.mjs +12 -1
  698. package/src/{standalone → session-runtime/services}/daemon-crash-capture.mjs +6 -0
  699. package/src/{standalone → session-runtime/services}/hook-bus/command-handler.mjs +1 -1
  700. package/src/{standalone → session-runtime/services}/hook-bus/event-runner.mjs +1 -1
  701. package/src/{standalone → session-runtime/services}/hook-bus/handler-dispatch.mjs +1 -1
  702. package/src/{standalone → session-runtime/services}/hook-bus/handlers.mjs +5 -4
  703. package/src/{standalone → session-runtime/services}/hook-bus/rule-file.mjs +2 -2
  704. package/src/{standalone → session-runtime/services}/hook-bus/tool-gate.mjs +1 -1
  705. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/client-registry.mjs +1 -1
  706. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/daemon-spawn.mjs +4 -4
  707. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/discovery.mjs +5 -5
  708. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/owner-claim.mjs +2 -2
  709. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/rpc.mjs +0 -4
  710. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/start.mjs +1 -1
  711. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/tool-wire.mjs +1 -1
  712. package/src/session-runtime/services/memory-runtime-proxy.mjs +130 -0
  713. package/src/{standalone → session-runtime/services}/plugin-admin.mjs +6 -6
  714. package/src/session-runtime/services/provider-admin.mjs +576 -0
  715. package/src/{standalone → session-runtime/services}/seeds.mjs +3 -3
  716. package/src/{standalone → session-runtime/services}/usage-dashboard-model.mjs +1 -1
  717. package/src/session-runtime/services/usage-dashboard.mjs +278 -0
  718. package/src/{standalone → session-runtime/services}/usage-stats-hours.mjs +1 -1
  719. package/src/session-runtime/services/usage-stats-model.mjs +657 -0
  720. package/src/session-runtime/services/usage-stats-period.mjs +178 -0
  721. package/src/session-runtime/session-create/materialize.mjs +3 -3
  722. package/src/session-runtime/session-create/session-options.mjs +14 -7
  723. package/src/session-runtime/session-lifecycle.mjs +2 -2
  724. package/src/session-runtime/settings-builtin-tools-api.mjs +1 -1
  725. package/src/session-runtime/setup-tool/executor.mjs +2 -2
  726. package/src/session-runtime/skills-api.mjs +2 -2
  727. package/src/session-runtime/statusline-route.mjs +1 -1
  728. package/src/session-runtime/tool-catalog.mjs +1 -753
  729. package/src/session-runtime/tool-defs.mjs +1 -149
  730. package/src/session-runtime/tool-policy-refresh.mjs +7 -5
  731. package/src/session-runtime/tool-surface.mjs +5 -5
  732. package/src/session-runtime/turn/agent-ops.mjs +2 -2
  733. package/src/session-runtime/turn/session-ops.mjs +2 -2
  734. package/src/session-runtime/turn/share-ops.mjs +4 -3
  735. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +1 -1
  736. package/src/session-runtime/turn/turn-run/turn-settle.mjs +4 -4
  737. package/src/session-runtime/usage-stats-api.mjs +18 -2
  738. package/src/session-runtime/warmup/statusline-usage-warmup.mjs +2 -2
  739. package/src/{runtime/shared → session-runtime}/webhook-session-run.mjs +5 -5
  740. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +2 -2
  741. package/src/session-runtime/workflow-agents-api/agent-route.mjs +4 -4
  742. package/src/session-runtime/workflow-agents-api/onboarding.mjs +2 -2
  743. package/src/session-runtime/workflow-agents-api/shared.mjs +4 -6
  744. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +1 -1
  745. package/src/session-runtime/workflow.mjs +1 -255
  746. package/src/standalone/agent-tool/job-views/session-progress.mjs +1 -101
  747. package/src/standalone/agent-tool/job-views.mjs +1 -59
  748. package/src/standalone/agent-tool/tag-registry.mjs +1 -121
  749. package/src/standalone/agent-tool/tool-def.mjs +1 -60
  750. package/src/standalone/agent-tool.mjs +1 -151
  751. package/src/standalone/channel-worker.mjs +1 -140
  752. package/src/standalone/daemon-agent-control.mjs +1 -1
  753. package/src/standalone/daemon-desktop-runtime.mjs +2 -2
  754. package/src/standalone/daemon-stored-session-views.mjs +1 -1
  755. package/src/standalone/daemon.mjs +38 -5
  756. package/src/standalone/fair-call-scheduler.mjs +1 -198
  757. package/src/standalone/folder-dialog.mjs +12 -8
  758. package/src/standalone/memory-runtime-proxy.mjs +1 -130
  759. package/src/standalone/provider-admin.mjs +1 -576
  760. package/src/standalone/session-client/frame-stream.mjs +1 -1
  761. package/src/standalone/session-client.mjs +2 -2
  762. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -1
  763. package/src/standalone/session-service/projection/transcript-window.mjs +2 -2
  764. package/src/standalone/usage-dashboard.mjs +1 -278
  765. package/src/standalone/usage-stats-model.mjs +1 -653
  766. package/src/standalone/usage-stats-period.mjs +1 -178
  767. package/src/tui/App.jsx +107 -256
  768. package/src/tui/app/app-view/floating-panel.jsx +3 -12
  769. package/src/tui/app/app-view/welcome-banner.jsx +36 -0
  770. package/src/tui/app/app-view.jsx +18 -45
  771. package/src/tui/app/create-app-pickers.mjs +1 -1
  772. package/src/tui/app/doctor.mjs +15 -1
  773. package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +7 -3
  774. package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +5 -8
  775. package/src/tui/app/model-options.mjs +2 -3
  776. package/src/tui/app/model-picker/model-footer.mjs +1 -1
  777. package/src/tui/app/model-picker/route-selection.mjs +1 -3
  778. package/src/tui/app/mouse-input/button-gestures.mjs +13 -31
  779. package/src/tui/app/mouse-input/wheel-router.mjs +22 -32
  780. package/src/tui/app/picker-enter-latch.mjs +21 -0
  781. package/src/tui/app/picker-index-mode.mjs +34 -0
  782. package/src/tui/app/shell-layout/panel-transition.mjs +7 -12
  783. package/src/tui/app/shell-layout/row-budgets.mjs +4 -9
  784. package/src/tui/app/slash-palette.mjs +31 -0
  785. package/src/tui/app/text-layout.mjs +1 -1
  786. package/src/tui/app/theme-effort-pickers.mjs +1 -1
  787. package/src/tui/app/transcript-window.mjs +1 -5
  788. package/src/tui/app/usage-context-panels/context-model.mjs +1 -1
  789. package/src/tui/app/use-global-key-input.mjs +0 -1
  790. package/src/tui/app/use-interaction-refs.mjs +55 -0
  791. package/src/tui/app/use-onboarding-start.mjs +45 -0
  792. package/src/tui/app/use-panel-transition.mjs +40 -0
  793. package/src/tui/app/use-prompt-draft-flow.mjs +4 -13
  794. package/src/tui/app/use-prompt-layout-rows.mjs +39 -0
  795. package/src/tui/app/use-prompt-queue-history/prompt-history.mjs +1 -1
  796. package/src/tui/app/use-prompt-state.mjs +40 -0
  797. package/src/tui/app/use-selection-paint.mjs +9 -5
  798. package/src/tui/app/use-transcript-scroll-state.mjs +61 -0
  799. package/src/tui/app/use-transcript-window.mjs +0 -1
  800. package/src/tui/app/use-ui-open-request.mjs +18 -0
  801. package/src/tui/app/use-workflow-tab-cycle.mjs +39 -0
  802. package/src/tui/components/ContextInspector.jsx +1 -1
  803. package/src/tui/components/ContextPanel.jsx +1 -1
  804. package/src/tui/components/Picker.jsx +41 -322
  805. package/src/tui/components/PromptInput.jsx +34 -468
  806. package/src/tui/components/StatusLine.jsx +8 -555
  807. package/src/tui/components/TextEntryPanel.jsx +25 -211
  808. package/src/tui/components/ToolExecution.jsx +43 -328
  809. package/src/tui/components/UsagePanel.jsx +1 -1
  810. package/src/tui/components/picker/PickerItemRow.jsx +85 -0
  811. package/src/tui/components/picker/picker-layout.mjs +46 -0
  812. package/src/tui/components/picker/use-picker-input.mjs +165 -0
  813. package/src/tui/components/picker/use-picker-selection.mjs +67 -0
  814. package/src/tui/components/prompt-input/edit-chords.mjs +87 -0
  815. package/src/tui/components/prompt-input/edit-helpers.mjs +15 -12
  816. package/src/tui/components/prompt-input/escape-key.mjs +87 -0
  817. package/src/tui/components/prompt-input/key-handler.mjs +364 -0
  818. package/src/tui/components/status-line/boot-schedule.mjs +83 -0
  819. package/src/tui/components/status-line/local-line.mjs +213 -0
  820. package/src/tui/components/status-line/use-statusline-text.mjs +319 -0
  821. package/src/tui/components/statusline-module-loader.mjs +21 -0
  822. package/src/tui/components/text-entry-layout.mjs +104 -0
  823. package/src/tui/components/text-entry-value.jsx +47 -0
  824. package/src/tui/components/tool-execution/aggregate-card.jsx +141 -0
  825. package/src/tui/components/tool-execution/pending-placeholder.jsx +24 -0
  826. package/src/tui/components/tool-execution/standard-card.jsx +229 -0
  827. package/src/tui/components/tool-output-format.mjs +3 -5
  828. package/src/tui/dist/index.mjs +3616 -3022
  829. package/src/tui/index.jsx +85 -66
  830. package/src/tui/markdown/format-token.mjs +3 -3
  831. package/src/tui/paste-attachments.mjs +1 -1
  832. package/src/tui/prompt-history-store.mjs +17 -6
  833. package/src/tui/session/agent-envelope.mjs +1 -489
  834. package/src/tui/session/context-state.mjs +2 -2
  835. package/src/tui/session/goal-continuation/continuation-queue.mjs +1 -1
  836. package/src/tui/session/goal-continuation/deadline-delivery.mjs +1 -1
  837. package/src/tui/session/goal-continuation/goal-visibility.mjs +1 -1
  838. package/src/tui/session/initial-state.mjs +1 -1
  839. package/src/tui/session/live-share/wire.mjs +3 -0
  840. package/src/tui/session/oauth-flows.mjs +1 -7
  841. package/src/tui/session/session-api/commands.mjs +5 -3
  842. package/src/tui/session/session-api/controls.mjs +1 -1
  843. package/src/tui/session/session-api/intake/submission.mjs +8 -3
  844. package/src/tui/session/session-api/integrations.mjs +1 -1
  845. package/src/tui/session/session-api/routes.mjs +9 -8
  846. package/src/tui/session/session-api/settings.mjs +24 -23
  847. package/src/tui/session/session-api/shared.mjs +13 -2
  848. package/src/tui/session/session-api-ext.mjs +7 -415
  849. package/src/tui/session/session-flow/drain.mjs +86 -82
  850. package/src/tui/session/session-flow/queue.mjs +3 -1
  851. package/src/tui/session/tool-result-status.mjs +1 -354
  852. package/src/tui/session/tool-result-text.mjs +1 -157
  853. package/src/tui/session/transcript-intake.mjs +1 -1
  854. package/src/tui/session/transcript-spill/spill-dir.mjs +4 -1
  855. package/src/tui/session/transcript-spill/spill-writer.mjs +1 -1
  856. package/src/tui/session/tui-steering-persist.mjs +44 -86
  857. package/src/tui/session-local.mjs +8 -5
  858. package/src/tui/statusline-ansi-bridge.mjs +1 -1
  859. package/src/tui/theme.mjs +1 -1
  860. package/src/ui/ansi.mjs +1 -161
  861. package/src/ui/context-inspection.mjs +1 -56
  862. package/src/ui/context-measurement.mjs +1 -83
  863. package/src/ui/markdown.mjs +3 -3
  864. package/src/ui/model-display.mjs +1 -173
  865. package/src/ui/statusline-agents.mjs +22 -21
  866. package/src/ui/statusline.mjs +21 -24
  867. package/src/ui/stream-finalize.mjs +1 -1
  868. package/src/ui/tool-card.mjs +1 -1
  869. package/src/vendor/statusline/src/gateway/route-meta.mjs +157 -29
  870. package/scripts/fixtures/spawn-lease-child-harness.mjs +0 -8
  871. package/scripts/fixtures/spawn-lease-fixture-worker.mjs +0 -37
  872. package/src/runtime/agent/orchestrator/activity-bus.mjs +0 -31
  873. package/src/runtime/shared/child-spawn-remote.mjs +0 -210
  874. package/src/runtime/shared/session-runtime-health.mjs +0 -201
  875. package/src/standalone/agent-tool/lead-worker-index/index-file.mjs +0 -45
  876. package/src/standalone/session-runtime-agent-control-client.mjs +0 -117
  877. package/src/standalone/session-runtime-agent-control.mjs +0 -85
  878. package/src/standalone/session-runtime-host-factory.mjs +0 -22
  879. package/src/standalone/session-runtime-host.mjs +0 -742
  880. package/src/standalone/session-runtime-provider-cooldown.mjs +0 -78
  881. package/src/standalone/session-runtime-proxy.mjs +0 -164
  882. package/src/standalone/session-runtime-record.mjs +0 -18
  883. package/src/standalone/session-runtime-shard-router.mjs +0 -151
  884. package/src/standalone/session-runtime-spawn-leases.mjs +0 -82
  885. package/src/standalone/session-runtime-worker.mjs +0 -678
  886. package/src/standalone/session-runtime-workload.mjs +0 -98
  887. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-cache.mjs +0 -0
  888. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/deferred-tool-availability.mjs +0 -0
  889. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-deadlines.mjs +0 -0
  890. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-runtime.mjs +0 -0
  891. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-store.mjs +0 -0
  892. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-text.mjs +0 -0
  893. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-tool-exec.mjs +0 -0
  894. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/provider-request-snapshot.mjs +0 -0
  895. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/provider-request-tools.mjs +0 -0
  896. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-catalog-data.mjs +0 -0
  897. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-profile.mjs +0 -0
  898. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/shared-scan-cache.mjs +0 -0
  899. /package/src/{standalone → runtime/shared}/fair-call-scheduler/queue-item.mjs +0 -0
  900. /package/src/runtime/{agent/orchestrator/providers → shared/llm}/provider-model-identities.mjs +0 -0
  901. /package/src/{standalone → runtime/shared}/projects.mjs +0 -0
  902. /package/src/{standalone → session-runtime/services}/agent-tool/execute-send.mjs +0 -0
  903. /package/src/{standalone → session-runtime/services}/agent-tool/execute-spawn.mjs +0 -0
  904. /package/src/{standalone → session-runtime/services}/agent-tool/job-views/agent-list.mjs +0 -0
  905. /package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/lead-rows.mjs +0 -0
  906. /package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/reap-timers.mjs +0 -0
  907. /package/src/{standalone → session-runtime/services}/agent-tool/provider-init.mjs +0 -0
  908. /package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/deferred-spawn.mjs +0 -0
  909. /package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow.mjs +0 -0
  910. /package/src/{standalone → session-runtime/services}/agent-tool/tag-maps.mjs +0 -0
  911. /package/src/{standalone → session-runtime/services}/agent-tool/tag-registry/tag-lookup.mjs +0 -0
  912. /package/src/{standalone → session-runtime/services}/agent-tool/tag-registry/tag-refresh.mjs +0 -0
  913. /package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/row-helpers.mjs +0 -0
  914. /package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper.mjs +0 -0
  915. /package/src/{standalone → session-runtime/services}/agent-tool/terminal-trace.mjs +0 -0
  916. /package/src/{standalone → session-runtime/services}/agent-tool/worker-index/mutation-batch.mjs +0 -0
  917. /package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-shape.mjs +0 -0
  918. /package/src/{standalone → session-runtime/services}/channel-client/daemon-request.mjs +0 -0
  919. /package/src/{standalone → session-runtime/services}/channel-client/notify-stream.mjs +0 -0
  920. /package/src/{standalone → session-runtime/services}/channel-client/reconnect.mjs +0 -0
  921. /package/src/{standalone → session-runtime/services}/channel-client/registration.mjs +0 -0
  922. /package/src/{standalone → session-runtime/services}/daemon-candidate.mjs +0 -0
  923. /package/src/{standalone → session-runtime/services}/daemon-crash-capture/paths.mjs +0 -0
  924. /package/src/{standalone → session-runtime/services}/hook-bus/config-loader.mjs +0 -0
  925. /package/src/{standalone → session-runtime/services}/hook-bus/config.mjs +0 -0
  926. /package/src/{standalone → session-runtime/services}/hook-bus/constants.mjs +0 -0
  927. /package/src/{standalone → session-runtime/services}/hook-bus/event-log.mjs +0 -0
  928. /package/src/{standalone → session-runtime/services}/hook-bus/handler-timeout.mjs +0 -0
  929. /package/src/{standalone → session-runtime/services}/hook-bus/payload.mjs +0 -0
  930. /package/src/{standalone → session-runtime/services}/hook-bus/rule-store.mjs +0 -0
  931. /package/src/{standalone → session-runtime/services}/hook-bus/rules.mjs +0 -0
  932. /package/src/{standalone → session-runtime/services}/hook-bus.mjs +0 -0
  933. /package/src/{standalone → session-runtime/services}/memory-runtime-proxy/calls.mjs +0 -0
  934. /package/src/{standalone → session-runtime/services}/memory-runtime-proxy/state.mjs +0 -0
  935. /package/src/{standalone → session-runtime/services}/sse-frames.mjs +0 -0
@@ -0,0 +1,747 @@
1
+ // Deferred-tool catalog: measured-usage ordering, kind/bucket classification,
2
+ // tool_search ranking + auto-selection, and the session tool-surface
3
+ // application/selection logic. Pure module (session objects passed in).
4
+ import { clean } from './session-text.mjs';
5
+ import { mergePendingDeferredToolDelta } from './deferred-tool-delta.mjs';
6
+ import { applyInitialDeferredToolManifestToBp2, stripDeferredToolManifestBlock } from '../context/collect.mjs';
7
+ import { getMcpServerInstructionsMap, getMcpTools } from '../mcp/client.mjs';
8
+ import { filterMcpToolsForSession } from './extension-scopes.mjs';
9
+ import { isDeferredToolAvailable } from './deferred-tool-availability.mjs';
10
+ import { isResponsesFreeformTool, toResponsesCustomTool } from '../providers/custom-tool-wire.mjs';
11
+ import {
12
+ DEFERRED_DEFAULT_FULL_TOOLS,
13
+ DEFERRED_DEFAULT_LEAD_TOOLS,
14
+ DEFERRED_DEFAULT_READONLY_TOOLS,
15
+ DEFERRED_SELECT_ALIASES,
16
+ MEASURED_TOOL_USAGE,
17
+ READONLY_TOOL_NAMES,
18
+ } from './tool-catalog-data.mjs';
19
+ import {
20
+ toolKind,
21
+ measuredToolUsage,
22
+ parseToolSelection,
23
+ routeToolRank,
24
+ sortedCatalogByMeasuredUsage,
25
+ activeToolForSurface,
26
+ deferredProviderMode,
27
+ nativeProviderFamily,
28
+ } from './tool-catalog-schema.mjs';
29
+ import { filterModelEditTools } from '../../../shared/edit-tool-dialect.mjs';
30
+ export {
31
+ toolKind,
32
+ toolSchemaBucket,
33
+ estimateToolSchemaBreakdown,
34
+ measuredToolUsage,
35
+ parseToolSelection,
36
+ sortedCatalogByMeasuredUsage,
37
+ } from './tool-catalog-schema.mjs';
38
+ export { snapshotProviderRequestTools } from './provider-request-snapshot.mjs';
39
+ export {
40
+ DEFERRED_DEFAULT_FULL_TOOLS,
41
+ DEFERRED_DEFAULT_LEAD_TOOLS,
42
+ DEFERRED_DEFAULT_READONLY_TOOLS,
43
+ MEASURED_TOOL_USAGE,
44
+ } from './tool-catalog-data.mjs';
45
+
46
+ // Provider modes whose whole catalog is the active surface (no deferred pool).
47
+ const FIXED_SURFACE_MODES = new Set(['full', 'manifest', 'canonical']);
48
+
49
+ function isMcpToolName(name) {
50
+ return typeof name === 'string' && name.startsWith('mcp__');
51
+ }
52
+
53
+ function toolParameters(tool) {
54
+ if (tool?.inputSchema && typeof tool.inputSchema === 'object') return tool.inputSchema;
55
+ return { type: 'object', properties: {} };
56
+ }
57
+
58
+ // The rendered BP2 manifest text, or '' when no system message carries one.
59
+ function renderedDeferredManifest(session) {
60
+ const system = session.messages?.find(
61
+ (message) =>
62
+ message?.role === 'system' &&
63
+ typeof message.content === 'string' &&
64
+ message.content.includes('<available-deferred-tools>')
65
+ );
66
+ return system?.content ?? '';
67
+ }
68
+
69
+ export function filterDisallowedTools(tools, disallowed = []) {
70
+ // Old session catalogs must not resurrect the separate staging schema.
71
+ const deny = new Set(['git_stage', ...(Array.isArray(disallowed) ? disallowed : [])].map(clean).filter(Boolean));
72
+ return (tools || []).filter((tool) => !deny.has(clean(tool?.name)));
73
+ }
74
+
75
+ export function sortedNamesByMeasuredUsage(names) {
76
+ // Canonical route order first; measured usage orders the unrouted tail.
77
+ return [...(names || [])].sort((a, b) => {
78
+ const ar = routeToolRank(a);
79
+ const br = routeToolRank(b);
80
+ if (ar !== br) return ar - br;
81
+ const au = measuredToolUsage(a);
82
+ const bu = measuredToolUsage(b);
83
+ if (bu !== au) return bu - au;
84
+ return String(a).localeCompare(String(b));
85
+ });
86
+ }
87
+
88
+ export function defaultDeferredToolNames(catalog, mode) {
89
+ const available = new Set((catalog || []).map((tool) => clean(tool?.name)).filter(Boolean));
90
+ if (mode === 'lead') {
91
+ return new Set(DEFERRED_DEFAULT_LEAD_TOOLS.filter((name) => available.has(name)));
92
+ }
93
+ if (mode === 'readonly') {
94
+ return new Set(DEFERRED_DEFAULT_READONLY_TOOLS.filter((name) => available.has(name)));
95
+ }
96
+ return new Set(DEFERRED_DEFAULT_FULL_TOOLS.filter((name) => available.has(name)));
97
+ }
98
+
99
+ export function compactToolSearchDescription(value, max = 220) {
100
+ const text = clean(value).replace(/\s+/g, ' ');
101
+ return text.length > max ? `${text.slice(0, max - 1)}…` : text;
102
+ }
103
+
104
+ // Late-announcement lines stay skill-manifest shaped but much tighter than the
105
+ // BP1 pool (first sentence, hard 80-char cap): the reminder is transient
106
+ // discovery only — the full description/schema arrives when the tool loads.
107
+ function lateAnnouncementDescription(value) {
108
+ const text = clean(value).replace(/\s+/g, ' ');
109
+ const sentence = text.split(/(?<=[.!?])\s+/, 1)[0] || text;
110
+ return sentence.length > 80 ? `${sentence.slice(0, 79)}…` : sentence;
111
+ }
112
+
113
+ export function toolRow(tool, activeNames = new Set()) {
114
+ const name = clean(tool?.name);
115
+ return {
116
+ name,
117
+ kind: toolKind(tool),
118
+ usage: measuredToolUsage(name),
119
+ active: activeNames.has(name),
120
+ description: compactToolSearchDescription(tool?.description),
121
+ };
122
+ }
123
+
124
+ function providerSupportsResponsesCustomTools(provider) {
125
+ const p = clean(provider).toLowerCase();
126
+ if (!p) return true;
127
+ return p === 'openai' || p === 'openai-oauth';
128
+ }
129
+
130
+ function openAILoadableToolSpec(tool, provider = '') {
131
+ if (providerSupportsResponsesCustomTools(provider) && isResponsesFreeformTool(tool))
132
+ return toResponsesCustomTool(tool);
133
+ return {
134
+ type: 'function',
135
+ name: clean(tool?.name),
136
+ description: clean(tool?.description),
137
+ defer_loading: true,
138
+ parameters: toolParameters(tool),
139
+ };
140
+ }
141
+
142
+ export function toolSearchNativePayload(catalog, names, provider = '') {
143
+ const selected = new Set((names || []).map(clean).filter(Boolean));
144
+ if (!selected.size) return null;
145
+ const tools = [];
146
+ const refs = [];
147
+ for (const tool of catalog || []) {
148
+ const name = clean(tool?.name);
149
+ if (!name || !selected.has(name)) continue;
150
+ refs.push(name);
151
+ tools.push(openAILoadableToolSpec(tool, provider));
152
+ }
153
+ if (!refs.length) return null;
154
+ return {
155
+ provider: clean(provider).toLowerCase(),
156
+ toolReferences: refs,
157
+ openaiTools: tools,
158
+ summary: `Loaded deferred tools: ${refs.join(', ')}`,
159
+ };
160
+ }
161
+
162
+ // Schemas for tools that are ALREADY active. They are deliberately NOT added
163
+ // to toolReferences/openaiTools: re-announcing them would rewrite the request
164
+ // tools array and break the cached prefix. The caller only ever sees names
165
+ // otherwise, so the parameter contract (enums, limits) rides in the RESULT.
166
+ function activeToolSchemas(catalog, session, names) {
167
+ const wanted = new Set((names || []).map(clean).filter(Boolean));
168
+ if (!wanted.size) return [];
169
+ const seen = new Set();
170
+ const specs = [];
171
+ for (const pool of [Array.isArray(session?.tools) ? session.tools : [], catalog || []]) {
172
+ for (const tool of pool) {
173
+ const name = clean(tool?.name);
174
+ if (!name || !wanted.has(name) || seen.has(name)) continue;
175
+ seen.add(name);
176
+ specs.push({ name, description: clean(tool?.description), parameters: toolParameters(tool) });
177
+ }
178
+ }
179
+ return specs;
180
+ }
181
+
182
+ // Plain case-insensitive substring filter over name + description. No scores,
183
+ // no aliases, no auto-selection: tool_search only lists and (via select)
184
+ // loads. Empty query matches every row.
185
+ export function toolSearchMatches(row, query) {
186
+ const raw = clean(query).toLowerCase();
187
+ if (!raw) return true;
188
+ const haystack = `${clean(row?.name)} ${clean(row?.description)}`.toLowerCase();
189
+ return haystack.includes(raw);
190
+ }
191
+
192
+ function expandSelectionNames(names) {
193
+ const out = [];
194
+ for (const raw of names || []) {
195
+ const key = clean(raw);
196
+ if (!key) continue;
197
+ const alias = DEFERRED_SELECT_ALIASES[key.toLowerCase()];
198
+ if (alias) out.push(...alias);
199
+ else out.push(key);
200
+ }
201
+ return [...new Set(out)];
202
+ }
203
+
204
+ function storedDeferredToolNames(session) {
205
+ for (const source of [session?.deferredDiscoveredTools, session?.deferredSelectedTools]) {
206
+ const names = parseToolSelection(source);
207
+ if (names.length) return names;
208
+ }
209
+ return [];
210
+ }
211
+
212
+ function canonicalDeferredToolNames(catalog, names) {
213
+ const byName = new Map();
214
+ for (const tool of catalog || []) {
215
+ const name = clean(tool?.name);
216
+ if (!name) continue;
217
+ byName.set(name, name);
218
+ byName.set(name.toLowerCase(), name);
219
+ }
220
+ const out = [];
221
+ for (const raw of expandSelectionNames(names)) {
222
+ const name = clean(raw);
223
+ const canonical = byName.get(name) || byName.get(name.toLowerCase());
224
+ if (canonical) out.push(canonical);
225
+ }
226
+ return sortedNamesByMeasuredUsage(new Set(out));
227
+ }
228
+
229
+ function setDeferredToolState(session, names) {
230
+ if (!session) return [];
231
+ const selected = sortedNamesByMeasuredUsage(new Set(parseToolSelection(names)));
232
+ session.deferredDiscoveredTools = selected;
233
+ session.deferredSelectedTools = selected;
234
+ return selected;
235
+ }
236
+
237
+ function deferredPoolToolNames(session) {
238
+ if (!session || FIXED_SURFACE_MODES.has(session.deferredProviderMode)) return [];
239
+ const catalog = Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : [];
240
+ const active = new Set([
241
+ ...(session.tools || []).map((tool) => clean(tool?.name)).filter(Boolean),
242
+ ...parseToolSelection(session.deferredCallableTools),
243
+ ]);
244
+ const out = [];
245
+ for (const tool of catalog) {
246
+ const name = clean(tool?.name);
247
+ if (name && !active.has(name)) out.push(name);
248
+ }
249
+ return sortedNamesByMeasuredUsage(out);
250
+ }
251
+
252
+ // Definition history combines the boot catalog with refreshed MCP definitions.
253
+ // Selection separately checks current availability. Native request snapshots
254
+ // expose only discovered definitions; the union never eagerly exposes the pool.
255
+ export function deferredCatalogUnion(session) {
256
+ const boot = filterDisallowedTools(
257
+ Array.isArray(session?.deferredToolCatalog) ? session.deferredToolCatalog : [],
258
+ session?.disallowedTools
259
+ );
260
+ const late = filterDisallowedTools(
261
+ Array.isArray(session?.deferredLateToolCatalog) ? session.deferredLateToolCatalog : [],
262
+ session?.disallowedTools
263
+ );
264
+ if (!late.length) return boot;
265
+ const byName = new Map();
266
+ // Refreshed definitions win same-name collisions without rewriting boot
267
+ // metadata. Only selected, available schemas reach the next native request.
268
+ for (const tool of boot) {
269
+ const name = clean(tool?.name);
270
+ if (name && !byName.has(name)) byName.set(name, tool);
271
+ }
272
+ for (const tool of late) {
273
+ const name = clean(tool?.name);
274
+ if (name) byName.set(name, tool);
275
+ }
276
+ return [...byName.values()];
277
+ }
278
+
279
+ export function isReadonlySelectable(tool) {
280
+ const name = clean(tool?.name);
281
+ if (READONLY_TOOL_NAMES.has(name)) return true;
282
+ const annotations = tool?.annotations || {};
283
+ if (annotations.destructiveHint === true) return false;
284
+ if (annotations.readOnlyHint === true) return true;
285
+ return false;
286
+ }
287
+
288
+ export function applyDeferredToolSurface(session, mode, extraTools = [], options = {}) {
289
+ if (!session || !Array.isArray(session.tools)) return session;
290
+ const providerMode = deferredProviderMode(options.provider || session.provider);
291
+ const byName = new Map();
292
+ // Rebuild from the full catalog, not just its eager projection. Current
293
+ // definitions still take precedence over retained definitions.
294
+ const candidates = filterDisallowedTools(
295
+ filterModelEditTools(
296
+ [...session.tools, ...(extraTools || []), ...deferredCatalogUnion(session)],
297
+ options.model || session.model
298
+ ),
299
+ [...(session.disallowedTools || []), ...(options.disallowed || [])]
300
+ );
301
+ for (const tool of candidates) {
302
+ const name = clean(tool?.name);
303
+ if (!name || byName.has(name)) continue;
304
+ byName.set(name, activeToolForSurface(tool));
305
+ }
306
+ const catalog = sortedCatalogByMeasuredUsage([...byName.values()]);
307
+ const defaultNames = defaultDeferredToolNames(catalog, mode);
308
+ const storedNames = providerMode === 'native' ? [] : storedDeferredToolNames(session);
309
+ const fixedSurface = FIXED_SURFACE_MODES.has(providerMode);
310
+ let selectedNames = fixedSurface
311
+ ? sortedNamesByMeasuredUsage(catalog.map((tool) => clean(tool?.name)).filter(Boolean))
312
+ : [];
313
+ if (!fixedSurface) {
314
+ selectedNames = storedNames.length ? canonicalDeferredToolNames(catalog, storedNames) : [];
315
+ if (!selectedNames.length || providerMode === 'native') selectedNames = sortedNamesByMeasuredUsage(defaultNames);
316
+ }
317
+ const selected = new Set(selectedNames);
318
+ session.deferredToolCatalog = catalog;
319
+ session.deferredToolUsage = MEASURED_TOOL_USAGE;
320
+ session.deferredDefaultTools = sortedNamesByMeasuredUsage(defaultNames);
321
+ session.deferredProviderMode = providerMode;
322
+ session.deferredNativeTools = providerMode === 'native';
323
+ session.deferredSurfaceMode = mode;
324
+ session.tools.length = 0;
325
+ const active = [];
326
+ for (const tool of catalog) {
327
+ if (!selected.has(clean(tool?.name))) continue;
328
+ if (mode === 'readonly' && !isReadonlySelectable(tool)) continue;
329
+ session.tools.push(tool);
330
+ active.push(clean(tool?.name));
331
+ }
332
+ session.deferredCallableTools = sortedNamesByMeasuredUsage(active);
333
+ if (providerMode === 'native') {
334
+ const discovered = canonicalDeferredToolNames(catalog, session.deferredDiscoveredTools || []);
335
+ session.deferredSelectedTools = active;
336
+ session.deferredDiscoveredTools = discovered.filter((name) => !selected.has(name));
337
+ } else {
338
+ setDeferredToolState(session, active);
339
+ }
340
+ if (!session.deferredToolBp2Applied && session.messages?.some((m) => m?.role === 'system')) {
341
+ if (!session.mcpServerInstructions || typeof session.mcpServerInstructions !== 'object') {
342
+ session.mcpServerInstructions = getMcpServerInstructionsMap(session.mcpScopeId);
343
+ }
344
+ applyInitialDeferredToolManifestToBp2(session, deferredPoolToolNames(session));
345
+ }
346
+ if (!Array.isArray(session.deferredAnnouncedTools) && session.deferredToolBp2Applied) {
347
+ // Seed the announced set with everything already advertised in the BP2
348
+ // manifest, so the turn-boundary MCP delta (reconcileDeferredMcpToolCatalog)
349
+ // only announces genuinely new, late-connecting tools and never re-announces
350
+ // the startup pool.
351
+ session.deferredAnnouncedTools = deferredPoolToolNames(session);
352
+ }
353
+ return session;
354
+ }
355
+
356
+ export function rebuildDeferredToolSurfaceForProvider(session, provider) {
357
+ if (!session || !Array.isArray(session.tools)) return session;
358
+ const previousMode = session.deferredProviderMode;
359
+ const previousFamily = nativeProviderFamily(session.provider);
360
+ const nextFamily = nativeProviderFamily(provider);
361
+ const preserveNativeState = previousFamily && previousFamily === nextFamily;
362
+ const discovered = preserveNativeState
363
+ ? canonicalDeferredToolNames(deferredCatalogUnion(session), session.deferredDiscoveredTools || [])
364
+ : [];
365
+ const catalog = deferredCatalogUnion(session).slice();
366
+ session.deferredDiscoveredTools = discovered;
367
+ applyDeferredToolSurface(session, session.deferredSurfaceMode || 'lead', catalog, { provider });
368
+ if (session.deferredProviderMode === 'native' && discovered.length) {
369
+ session.deferredDiscoveredTools = discovered;
370
+ session.deferredCallableTools = sortedNamesByMeasuredUsage(
371
+ new Set([...(session.deferredCallableTools || []), ...discovered])
372
+ );
373
+ session.deferredSelectedTools = session.deferredCallableTools.slice();
374
+ }
375
+ if (previousMode && previousMode !== session.deferredProviderMode) {
376
+ if (session.deferredProviderMode === 'native') {
377
+ session.mcpServerInstructions = getMcpServerInstructionsMap(session.mcpScopeId);
378
+ applyInitialDeferredToolManifestToBp2(session, deferredPoolToolNames(session), { rebuild: true });
379
+ const rendered = renderedDeferredManifest(session);
380
+ session.deferredAnnouncedTools = deferredPoolToolNames(session).filter((name) => rendered.includes(name));
381
+ } else if (previousMode === 'native') {
382
+ for (const system of session.messages?.filter((message) => message?.role === 'system') || []) {
383
+ if (typeof system.content === 'string') system.content = stripDeferredToolManifestBlock(system.content);
384
+ }
385
+ session.messages = session.messages.filter(
386
+ (message) => message?.role !== 'system' || String(message.content || '').trim()
387
+ );
388
+ session.deferredAnnouncedTools = [];
389
+ session.deferredToolBp2Applied = true;
390
+ delete session.deferredToolBp1Applied;
391
+ }
392
+ }
393
+ return session;
394
+ }
395
+
396
+ // FIRST-TURN deferred-surface refresh (turn-time deferred manifest).
397
+ // An MCP server may finish its handshake BETWEEN session-create and the first
398
+ // user send. Fold those LIVE MCP tools into the boot deferred catalog + the
399
+ // provider-visible first-turn surface. Native providers rebuild the initial BP2
400
+ // <available-deferred-tools> manifest IN PLACE and pre-mark names announced.
401
+ // Manifest/canonical providers update their active fixed surface directly; the
402
+ // canonical path never emits a deferred manifest or late reminder. Fully sync
403
+ // and idempotent: no genuinely-new MCP name => no-op / no mutation.
404
+ export function refreshInitialDeferredMcpSurface(session, liveMcpTools) {
405
+ if (!session || !Array.isArray(session.messages)) return false;
406
+ if (session.deferredProviderMode === 'full') return false;
407
+ const live = filterDisallowedTools(Array.isArray(liveMcpTools) ? liveMcpTools : [], session.disallowedTools);
408
+ const byName = new Map();
409
+ for (const tool of Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : []) {
410
+ const name = clean(tool?.name);
411
+ if (name && !byName.has(name)) byName.set(name, tool);
412
+ }
413
+ let added = false;
414
+ for (const tool of live) {
415
+ const name = clean(tool?.name);
416
+ if (!name || !isMcpToolName(name) || byName.has(name)) continue;
417
+ byName.set(name, activeToolForSurface(tool));
418
+ added = true;
419
+ }
420
+ if (!added) return false;
421
+ session.deferredToolCatalog = sortedCatalogByMeasuredUsage([...byName.values()]);
422
+ if (session.deferredProviderMode === 'manifest' || session.deferredProviderMode === 'canonical') {
423
+ const next = session.deferredToolCatalog.filter(
424
+ (tool) => session.deferredSurfaceMode !== 'readonly' || isReadonlySelectable(tool)
425
+ );
426
+ session.tools.splice(0, session.tools.length, ...next);
427
+ session.deferredCallableTools = next.map((tool) => clean(tool?.name)).filter(Boolean);
428
+ if (session.deferredProviderMode === 'canonical') {
429
+ setDeferredToolState(session, session.deferredCallableTools);
430
+ }
431
+ session.updatedAt = Date.now();
432
+ return true;
433
+ }
434
+ // Refresh MCP server instructions so a newly-connected server's block is
435
+ // included when BP2 is re-rendered below.
436
+ session.mcpServerInstructions = getMcpServerInstructionsMap(session.mcpScopeId);
437
+ const applied = applyInitialDeferredToolManifestToBp2(session, deferredPoolToolNames(session), { rebuild: true });
438
+ if (!applied) return false;
439
+ // Pre-mark ONLY the names that ACTUALLY landed in the rebuilt BP2 manifest as
440
+ // announced; anything the manifest could not advertise stays un-announced so
441
+ // the turn-boundary late reminder can still surface it.
442
+ const rendered = renderedDeferredManifest(session);
443
+ session.deferredAnnouncedTools = deferredPoolToolNames(session).filter((name) => rendered.includes(name));
444
+ session.updatedAt = Date.now();
445
+ return true;
446
+ }
447
+
448
+ /**
449
+ * Request-boundary reconciliation (full snapshot + delta).
450
+ * Merge currently-connected MCP tools into session.deferredLateToolCatalog (a
451
+ * SEPARATE pool from the boot-frozen session.deferredToolCatalog) so tools from
452
+ * servers that finished their handshake AFTER this session was created become
453
+ * reachable through loading and direct-call discovery. Native boot metadata
454
+ * stays unchanged; discovered schemas travel through native search history or
455
+ * deferred request definitions, never by promotion into the eager prefix.
456
+ * Late additions/removals are merged into one persistent typed delta. The ask
457
+ * boundary attaches that delta to the next real prompt and acknowledges it only
458
+ * after the provider accepts the turn; a catalog change never creates a turn.
459
+ * Loaded definitions survive a disconnect for replay, but are not availability
460
+ * grants. The current scoped names separately govern loading and dispatch.
461
+ * Returns the announced names, or null when nothing was announced.
462
+ */
463
+ export function reconcileDeferredMcpToolCatalog(session, liveMcpTools) {
464
+ if (!session || !Array.isArray(session.tools)) return null;
465
+ const live = filterDisallowedTools(Array.isArray(liveMcpTools) ? liveMcpTools : [], session.disallowedTools);
466
+ const hadSnapshot = Array.isArray(session.deferredMcpToolNames);
467
+ const previousNames = new Set(
468
+ hadSnapshot
469
+ ? session.deferredMcpToolNames
470
+ : [...(session.deferredToolCatalog || []), ...(session.deferredLateToolCatalog || [])]
471
+ .map((tool) => clean(tool?.name))
472
+ .filter(isMcpToolName)
473
+ );
474
+ session.deferredMcpToolNames = [...new Set(live.map((tool) => clean(tool?.name)).filter(isMcpToolName))];
475
+ if (FIXED_SURFACE_MODES.has(session.deferredProviderMode)) {
476
+ const byName = new Map();
477
+ for (const tool of Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : []) {
478
+ const name = clean(tool?.name);
479
+ if (name && !isMcpToolName(name)) byName.set(name, tool);
480
+ }
481
+ for (const tool of live) {
482
+ const name = clean(tool?.name);
483
+ if (name && isMcpToolName(name)) byName.set(name, activeToolForSurface(tool));
484
+ }
485
+ const catalog = sortedCatalogByMeasuredUsage([...byName.values()]);
486
+ const next = catalog.filter((tool) => session.deferredSurfaceMode !== 'readonly' || isReadonlySelectable(tool));
487
+ const before = JSON.stringify((session.tools || []).map((tool) => activeToolForSurface(tool)));
488
+ const after = JSON.stringify(next);
489
+ session.deferredToolCatalog = catalog;
490
+ session.tools.splice(0, session.tools.length, ...next);
491
+ session.deferredCallableTools = next.map((tool) => clean(tool?.name)).filter(Boolean);
492
+ if (before !== after) session.updatedAt = Date.now();
493
+ return before === after ? null : session.deferredCallableTools;
494
+ }
495
+ const lateCatalog = Array.isArray(session.deferredLateToolCatalog) ? session.deferredLateToolCatalog : [];
496
+ const active = new Set([
497
+ ...(session.tools || []).map((tool) => clean(tool?.name)).filter(Boolean),
498
+ ...parseToolSelection(session.deferredCallableTools),
499
+ ...parseToolSelection(session.deferredDiscoveredTools),
500
+ ]);
501
+
502
+ const liveMcpByName = new Map();
503
+ for (const tool of live) {
504
+ const name = clean(tool?.name);
505
+ if (!name || !isMcpToolName(name) || liveMcpByName.has(name)) continue;
506
+ liveMcpByName.set(name, activeToolForSurface(tool));
507
+ }
508
+
509
+ // Rebuild the LATE pool only (boot catalog stays frozen). It holds live MCP
510
+ // tools — INCLUDING ones whose name also exists in the boot catalog, so a
511
+ // reconnect's fresher schema is reachable via deferredCatalogUnion (which
512
+ // prefers the late entry). Keep an entry only while its server is still
513
+ // connected OR the tool is already loaded, including native history-only
514
+ // discoveries. Availability is determined by deferredMcpToolNames, not this pool.
515
+ const nextByName = new Map();
516
+ for (const tool of lateCatalog) {
517
+ const name = clean(tool?.name);
518
+ if (!name || nextByName.has(name)) continue;
519
+ if (!liveMcpByName.has(name) && !active.has(name)) continue;
520
+ nextByName.set(name, tool);
521
+ }
522
+ for (const [name, tool] of liveMcpByName) nextByName.set(name, tool);
523
+ session.deferredLateToolCatalog = sortedCatalogByMeasuredUsage([...nextByName.values()]);
524
+
525
+ // A promoted (active) MCP tool survives its server disconnecting; on reconnect
526
+ // re-link the active session.tools entry to the fresh server tool so its
527
+ // schema/handler track the live connection. Swap ONLY when the serialized
528
+ // surface actually changed, so a steady reconnect never perturbs the tools
529
+ // request param or its cache hash.
530
+ for (let i = 0; i < session.tools.length; i += 1) {
531
+ const name = clean(session.tools[i]?.name);
532
+ if (!name || !isMcpToolName(name) || !liveMcpByName.has(name)) continue;
533
+ const freshTool = liveMcpByName.get(name);
534
+ if (JSON.stringify(freshTool) !== JSON.stringify(session.tools[i])) session.tools[i] = freshTool;
535
+ }
536
+
537
+ const nextNames = new Set(session.deferredMcpToolNames);
538
+ const startupNames = new Set(Array.isArray(session.deferredAnnouncedTools) ? session.deferredAnnouncedTools : []);
539
+ const added = [];
540
+ for (const tool of liveMcpByName.values()) {
541
+ const name = clean(tool?.name);
542
+ if (!name || !isMcpToolName(name)) continue;
543
+ if (previousNames.has(name) || (!hadSnapshot && (active.has(name) || startupNames.has(name)))) continue;
544
+ added.push({ name, description: lateAnnouncementDescription(tool?.description) });
545
+ }
546
+ const removed = [];
547
+ for (const name of previousNames) {
548
+ if (nextNames.has(name)) continue;
549
+ removed.push(name);
550
+ }
551
+ if (!added.length && !removed.length) return null;
552
+ mergePendingDeferredToolDelta(session, { added, removed });
553
+ session.updatedAt = Date.now();
554
+ return [...added.map((entry) => entry.name), ...removed];
555
+ }
556
+
557
+ export function scopedMcpToolsFor(session, config = null) {
558
+ return filterMcpToolsForSession(getMcpTools(session?.mcpScopeId), session?.cwd || null, config);
559
+ }
560
+
561
+ export function refreshDeferredMcpToolCatalog(session, config = null) {
562
+ if (!session?.deferredProviderMode) return null;
563
+ return reconcileDeferredMcpToolCatalog(session, scopedMcpToolsFor(session, config));
564
+ }
565
+
566
+ export function selectDeferredTools(session, names, mode, { exact = false } = {}) {
567
+ // Resolve against the union of the boot-frozen catalog and the late-connected
568
+ // MCP catalog so load_tool can load a late tool. Native providers register it
569
+ // independently; canonical fallback providers already expose the full array.
570
+ const catalog = resolvableCatalog(session);
571
+ const surfaceActive = new Set((session?.tools || []).map((tool) => clean(tool?.name)).filter(Boolean));
572
+ const active = new Set([...surfaceActive, ...parseToolSelection(session?.deferredCallableTools)]);
573
+ const native = session?.deferredProviderMode === 'native' || session?.deferredNativeTools === true;
574
+ const discovered = new Set(Array.isArray(session?.deferredDiscoveredTools) ? session.deferredDiscoveredTools : []);
575
+ const activateOnSurface = !native;
576
+ const byName = new Map();
577
+ for (const tool of catalog) {
578
+ const name = clean(tool?.name);
579
+ if (!name) continue;
580
+ byName.set(name, tool);
581
+ byName.set(name.toLowerCase(), tool);
582
+ }
583
+ const added = [];
584
+ const already = [];
585
+ const blocked = [];
586
+ const missing = [];
587
+ for (const rawName of exact ? [...new Set(names)] : expandSelectionNames(names)) {
588
+ const requestedName = clean(rawName);
589
+ const tool = byName.get(requestedName) || byName.get(requestedName.toLowerCase());
590
+ const name = clean(tool?.name);
591
+ if (!tool || !isDeferredToolAvailable(session, name)) {
592
+ missing.push(requestedName);
593
+ continue;
594
+ }
595
+ if (mode === 'readonly' && !isReadonlySelectable(tool)) {
596
+ blocked.push({ name, reason: 'readonly mode' });
597
+ continue;
598
+ }
599
+ if (active.has(name) || (!activateOnSurface && discovered.has(name))) {
600
+ already.push(name);
601
+ continue;
602
+ }
603
+ if (activateOnSurface) {
604
+ session.tools.push(tool);
605
+ active.add(name);
606
+ discovered.delete(name);
607
+ } else {
608
+ discovered.add(name);
609
+ active.add(name);
610
+ }
611
+ added.push(name);
612
+ }
613
+ if (native) {
614
+ session.deferredCallableTools = sortedNamesByMeasuredUsage(active);
615
+ session.deferredDiscoveredTools = sortedNamesByMeasuredUsage([...discovered]);
616
+ session.deferredSelectedTools = sortedNamesByMeasuredUsage(active);
617
+ } else {
618
+ setDeferredToolState(session, active);
619
+ }
620
+ return { added, already, blocked, missing, native };
621
+ }
622
+
623
+ // Split live MCP servers into "still connecting" (pending) and "failed" so the
624
+ // loader can tell the model to retry next turn instead of treating a missing
625
+ // tool as a permanent zero result. `mcpStatus` is a getter plumbed from the
626
+ // runtime; absent in unit tests, where these lists are simply empty.
627
+ function pendingAndFailedMcpServers(mcpStatus) {
628
+ const empty = { pending: [], failed: [] };
629
+ let status = null;
630
+ try {
631
+ status = typeof mcpStatus === 'function' ? mcpStatus() : mcpStatus;
632
+ } catch {
633
+ return empty;
634
+ }
635
+ const servers = Array.isArray(status?.servers) ? status.servers : [];
636
+ const pending = [];
637
+ const failed = [];
638
+ for (const row of servers) {
639
+ const name = clean(row?.name);
640
+ if (!name) continue;
641
+ if (row?.status === 'disconnected') pending.push(name);
642
+ else if (row?.status === 'failed') failed.push(name);
643
+ }
644
+ return { pending: [...new Set(pending)].sort(), failed: [...new Set(failed)].sort() };
645
+ }
646
+
647
+ /** The deferred catalog union, or the session's own allowed tools when nothing is deferred. */
648
+ function resolvableCatalog(session) {
649
+ const union = deferredCatalogUnion(session);
650
+ if (union.length) return union;
651
+ return filterDisallowedTools(Array.isArray(session?.tools) ? session.tools : [], session?.disallowedTools);
652
+ }
653
+
654
+ // Pure loader. Input is exact deferred-tool names/aliases; output reports
655
+ // loaded / already-active / missing / blocked tools PLUS pending/failed MCP
656
+ // servers. No listing, no ranking, no substring filter. `options.mcpStatus` is
657
+ // the runtime getter for per-server status.
658
+ export function renderToolSearch(args = {}, session, mode = 'full', options = {}) {
659
+ const catalog = resolvableCatalog(session);
660
+ const requestedNames = parseToolSelection(args.names);
661
+ const { pending: pendingMcpServers, failed: failedMcpServers } = pendingAndFailedMcpServers(options?.mcpStatus);
662
+ const mcpFields = {
663
+ ...(pendingMcpServers.length ? { pendingMcpServers } : {}),
664
+ ...(failedMcpServers.length ? { failedMcpServers } : {}),
665
+ };
666
+
667
+ if (!requestedNames.length) {
668
+ const strayQuery = clean(args.query || args.q || args.text);
669
+ return JSON.stringify(
670
+ {
671
+ error: strayQuery
672
+ ? `load_tool is a loader, not a search: "${strayQuery}" is not an exact tool name. Pass names:["exact_tool_name", ...] (deferred tool names/aliases). No keyword search.`
673
+ : 'load_tool requires names:["exact_tool_name", ...] (deferred tool names/aliases).',
674
+ loaded: [],
675
+ alreadyActive: [],
676
+ missing: [],
677
+ ...mcpFields,
678
+ activeTools: sortedNamesByMeasuredUsage(
679
+ (session?.tools || []).map((tool) => clean(tool?.name)).filter(Boolean)
680
+ ),
681
+ discoveredTools: sortedNamesByMeasuredUsage(session?.deferredDiscoveredTools || []),
682
+ },
683
+ null,
684
+ 2
685
+ );
686
+ }
687
+
688
+ // Native loads update only the callable registry and provider-native history
689
+ // payload. Canonical fallback providers already carry the complete array.
690
+ const toolSelection = selectDeferredTools(session, requestedNames, mode);
691
+ const nextActiveNames = new Set([
692
+ ...(session?.tools || []).map((tool) => clean(tool?.name)).filter(Boolean),
693
+ ...parseToolSelection(session?.deferredCallableTools),
694
+ ]);
695
+ const loaded = toolSelection.added || [];
696
+ const alreadyActive = toolSelection.already || [];
697
+ const missing = toolSelection.missing || [];
698
+ const blocked = toolSelection.blocked || [];
699
+ // Native discovery is history-driven: an explicit re-selection must emit
700
+ // the tool reference/spec again even when the callable registry already has
701
+ // the name. Other agent runtimes treat repeated selection as a
702
+ // harmless reference refresh; suppressing it leaves declaration-gated
703
+ // harnesses with "already active" text but no callable schema.
704
+ const nativeToolSearchBase = toolSelection.native
705
+ ? toolSearchNativePayload(catalog, [...loaded, ...alreadyActive], session?.provider) || {
706
+ provider: clean(session?.provider).toLowerCase(),
707
+ toolReferences: [],
708
+ openaiTools: [],
709
+ summary: '',
710
+ }
711
+ : null;
712
+ const alreadyActiveSchemas = toolSelection.native ? [] : activeToolSchemas(catalog, session, alreadyActive);
713
+ const nativeSummary = [
714
+ ...(loaded.length ? [`Loaded deferred tools: ${loaded.join(', ')}`] : []),
715
+ ...(alreadyActive.length ? [`Already active: ${alreadyActive.join(', ')}`] : []),
716
+ ].join('\n');
717
+ const nativeToolSearch = nativeToolSearchBase
718
+ ? { ...nativeToolSearchBase, summary: nativeSummary || nativeToolSearchBase.summary }
719
+ : null;
720
+ const notes = [];
721
+ if (missing.length && pendingMcpServers.length) {
722
+ notes.push('Some requested names may belong to an MCP server still connecting — retry next turn.');
723
+ }
724
+ if (missing.length && failedMcpServers.length) {
725
+ notes.push('Some requested names may belong to a failed MCP server; those tools are unavailable.');
726
+ }
727
+ return JSON.stringify(
728
+ {
729
+ // `selected` retained for back-compat consumers (mode is always 'select').
730
+ selected: { mode: 'select', tools: toolSelection },
731
+ ...(nativeToolSearch ? { nativeToolSearch } : {}),
732
+ loaded,
733
+ alreadyActive,
734
+ ...(alreadyActiveSchemas.length ? { alreadyActiveSchemas } : {}),
735
+ missing,
736
+ ...(blocked.length ? { blocked } : {}),
737
+ ...mcpFields,
738
+ activeTools: sortedNamesByMeasuredUsage(
739
+ [...nextActiveNames].filter((name) => isDeferredToolAvailable(session, name))
740
+ ),
741
+ discoveredTools: sortedNamesByMeasuredUsage(session?.deferredDiscoveredTools || []),
742
+ ...(notes.length ? { note: notes.join(' ') } : {}),
743
+ },
744
+ null,
745
+ 2
746
+ );
747
+ }