mixdog 1.2.2 → 1.2.4

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 (692) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/gate-local.mjs +6 -4
  4. package/scripts/lib/gate-scheduler.mjs +29 -11
  5. package/scripts/probe-provider-catalog.mjs +31 -0
  6. package/scripts/provider-pingpong-live.mjs +599 -0
  7. package/scripts/session-sweep.mjs +5 -25
  8. package/src/agents/advisor/AGENT.md +1 -1
  9. package/src/agents/advisor/agent.json +1 -1
  10. package/src/agents/maintainer/AGENT.md +1 -1
  11. package/src/agents/maintainer/agent.json +1 -1
  12. package/src/agents/reviewer/AGENT.md +2 -4
  13. package/src/agents/security/AGENT.md +1 -2
  14. package/src/agents/writer/AGENT.md +2 -3
  15. package/src/defaults/shipped-history.json +11 -1
  16. package/src/defaults/skills/image/SKILL.md +21 -23
  17. package/src/defaults/skills/setup/SKILL.md +6 -1
  18. package/src/defaults/skills/setup/references/actions.md +44 -22
  19. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  20. package/src/headless-exec.mjs +15 -8
  21. package/src/lib/keychain-cjs.cjs +20 -15
  22. package/src/output-styles/common.md +11 -10
  23. package/src/rules/agent/AGENT.md +6 -4
  24. package/src/rules/lead/LEAD.md +7 -9
  25. package/src/rules/shared/45-destructive.md +4 -0
  26. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
  27. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
  28. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
  29. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  30. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  31. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  32. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  33. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  34. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  35. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  36. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
  37. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
  38. package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
  39. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  40. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +3 -1
  41. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
  42. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -9
  43. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
  45. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +31 -15
  46. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  47. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  48. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  49. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  50. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  51. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  52. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  53. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
  54. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  55. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +10 -0
  56. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
  57. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
  58. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +131 -9
  59. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
  60. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +125 -8
  61. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +12 -62
  62. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +117 -41
  63. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
  65. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  66. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +39 -5
  67. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  68. package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
  69. package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
  70. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
  71. package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
  72. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +42 -11
  73. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +109 -6
  74. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +17 -4
  75. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -2
  76. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +73 -7
  77. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +75 -6
  78. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  79. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  80. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  81. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +29 -5
  82. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  83. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +36 -13
  84. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +101 -11
  85. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  86. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
  87. package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
  88. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +19 -14
  89. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +371 -41
  90. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
  91. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +97 -49
  92. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +81 -10
  93. package/src/runtime/agent/orchestrator/providers/gemini.mjs +35 -8
  94. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
  96. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  97. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  98. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +253 -42
  99. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  100. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  101. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +392 -0
  102. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  103. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  104. package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
  105. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  106. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  107. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +50 -22
  108. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +133 -21
  109. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  110. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
  111. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  112. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  113. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +92 -16
  114. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -13
  115. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  116. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +133 -62
  117. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  118. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
  119. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +39 -7
  120. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  121. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
  122. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
  123. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +84 -2
  124. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  125. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  126. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +155 -0
  127. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +40 -24
  128. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
  129. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  130. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +183 -0
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +87 -6
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
  138. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +17 -2
  139. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
  140. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
  141. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  142. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +28 -5
  143. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  144. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  145. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
  146. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
  147. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  148. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  149. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
  150. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
  151. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
  152. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +72 -24
  153. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  154. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +50 -16
  155. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -19
  156. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  157. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -36
  158. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  159. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  160. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  161. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -9
  162. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +181 -0
  163. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +78 -70
  164. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +74 -0
  165. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +150 -10
  166. package/src/runtime/agent/orchestrator/providers/registry.mjs +13 -2
  167. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +7 -1
  168. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  169. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  170. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +164 -0
  171. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +522 -0
  172. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  173. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +195 -0
  174. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +104 -0
  175. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
  176. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +24 -0
  177. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  178. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
  179. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
  180. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
  181. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  182. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  183. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +16 -3
  184. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
  185. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  186. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  187. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  188. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +178 -71
  189. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +102 -12
  190. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  191. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
  192. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
  193. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
  194. package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
  195. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
  196. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -11
  197. package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
  198. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  199. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +16 -93
  200. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
  201. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  202. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +148 -0
  203. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  204. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  205. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  206. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
  207. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
  208. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +3 -2
  209. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  210. package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
  211. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
  212. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +89 -1
  213. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  214. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  215. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  216. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -27
  217. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
  218. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
  219. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
  220. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +24 -10
  221. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +135 -0
  222. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +31 -4
  223. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
  224. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
  225. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +10 -10
  226. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  227. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
  228. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  229. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +29 -5
  230. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  231. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +147 -0
  232. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -5
  233. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
  234. package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
  235. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +23 -2
  236. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  237. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +54 -13
  238. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
  239. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  240. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +11 -0
  241. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +22 -0
  242. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
  243. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  244. package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
  245. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
  246. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  247. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +231 -16
  248. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
  249. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
  250. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +47 -17
  251. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +26 -4
  252. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  253. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +36 -35
  254. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
  255. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +6 -3
  256. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  257. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
  258. package/src/runtime/agent/orchestrator/session/manager.mjs +4 -10
  259. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  260. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
  261. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +17 -1
  262. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  263. package/src/runtime/agent/orchestrator/session/side-question.mjs +197 -0
  264. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +22 -15
  265. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
  266. package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
  267. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  269. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
  270. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
  271. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
  272. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +44 -37
  273. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  274. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
  275. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
  276. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
  277. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -21
  278. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
  279. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
  280. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
  281. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +4 -2
  282. package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
  283. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
  284. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  285. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +53 -115
  286. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
  287. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
  288. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
  289. package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
  290. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +17 -10
  291. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
  292. package/src/runtime/agent/orchestrator/session/store.mjs +22 -19
  293. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +12 -12
  294. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +38 -14
  295. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
  296. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  297. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  298. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  299. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +79 -0
  300. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
  301. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
  302. package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
  303. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  304. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  305. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
  306. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
  307. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  308. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +218 -20
  309. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
  310. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
  311. package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
  312. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
  313. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
  314. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
  315. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
  316. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +247 -49
  317. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
  318. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
  319. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  320. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
  321. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
  322. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  323. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  324. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  325. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
  326. package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
  327. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
  328. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
  329. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
  330. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
  331. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
  332. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  333. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  334. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  335. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  336. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  337. package/src/runtime/attachments/store.d.mts +9 -0
  338. package/src/runtime/attachments/store.mjs +80 -9
  339. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
  340. package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
  341. package/src/runtime/computer-bridge/action-schema.mjs +219 -196
  342. package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
  343. package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
  344. package/src/runtime/effort-judge/judge-client.mjs +21 -4
  345. package/src/runtime/effort-judge/judge-worker.mjs +4 -1
  346. package/src/runtime/github/tool.mjs +208 -17
  347. package/src/runtime/media/adapters/codex-image.mjs +140 -21
  348. package/src/runtime/media/catalog.mjs +4 -4
  349. package/src/runtime/media/chatgpt-usage.mjs +55 -0
  350. package/src/runtime/media/defaults.mjs +37 -0
  351. package/src/runtime/media/jobs.mjs +12 -2
  352. package/src/runtime/media/lanes.mjs +12 -0
  353. package/src/runtime/media/tool-defs.mjs +15 -4
  354. package/src/runtime/media/tool.mjs +41 -12
  355. package/src/runtime/media/upstream-error.mjs +72 -6
  356. package/src/runtime/memory/index.mjs +1 -0
  357. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  358. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  359. package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
  360. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  361. package/src/runtime/memory/lib/pg/process.mjs +36 -33
  362. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  363. package/src/runtime/memory/lib/pg/supervisor.mjs +112 -4
  364. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  365. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  366. package/src/runtime/office/README.md +1 -1
  367. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  368. package/src/runtime/office/authoring/html-browser.mjs +18 -8
  369. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  370. package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
  371. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  372. package/src/runtime/office/authoring/pptx-html-measure.mjs +3 -1
  373. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  374. package/src/runtime/office/authoring/xlsx-html-runner.mjs +3 -1
  375. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  376. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  377. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  378. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  379. package/src/runtime/office/core/office-sessions.mjs +5 -0
  380. package/src/runtime/office/core/office-transactions.mjs +3 -0
  381. package/src/runtime/office/core/office-write-ledger.mjs +94 -0
  382. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  383. package/src/runtime/office/index.mjs +29 -0
  384. package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
  385. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  386. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  387. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  388. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  389. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  390. package/src/runtime/session-search/session-search-ingest.mjs +1 -1
  391. package/src/runtime/shared/agent-reap-state.mjs +13 -0
  392. package/src/runtime/shared/atomic-file.d.mts +1 -1
  393. package/src/runtime/shared/background-tasks.mjs +6 -1
  394. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  395. package/src/runtime/shared/bounded-line-diff.mjs +191 -0
  396. package/src/runtime/shared/browser-launch.mjs +15 -0
  397. package/src/runtime/shared/buffered-appender.mjs +18 -0
  398. package/src/runtime/shared/config.mjs +78 -18
  399. package/src/runtime/shared/err-text.mjs +48 -4
  400. package/src/runtime/shared/file-lock.mjs +6 -5
  401. package/src/runtime/shared/file-permissions.d.mts +6 -1
  402. package/src/runtime/shared/file-permissions.mjs +54 -6
  403. package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
  404. package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
  405. package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
  406. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  407. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  408. package/src/runtime/shared/loopback-listener.mjs +9 -0
  409. package/src/runtime/shared/model-route-chain.d.mts +8 -0
  410. package/src/runtime/shared/model-route-chain.mjs +48 -0
  411. package/src/runtime/shared/model-route-fallback.mjs +22 -0
  412. package/src/runtime/shared/pid-liveness.mjs +12 -0
  413. package/src/runtime/shared/provider-api-key.mjs +8 -0
  414. package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
  415. package/src/runtime/shared/quiet-progress.d.mts +35 -0
  416. package/src/runtime/shared/quiet-progress.mjs +101 -0
  417. package/src/runtime/shared/quota-resume-store.mjs +32 -1
  418. package/src/runtime/shared/read-row-numbers.mjs +44 -0
  419. package/src/runtime/shared/remote-intent.mjs +2 -42
  420. package/src/runtime/shared/review-diff.mjs +52 -0
  421. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  422. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  423. package/src/runtime/shared/slow-span.mjs +121 -0
  424. package/src/runtime/shared/statusline/statusline-segments.mjs +52 -6
  425. package/src/runtime/shared/tool-card-model/card-header.mjs +7 -1
  426. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  427. package/src/runtime/shared/tool-card-model.mjs +5 -2
  428. package/src/runtime/shared/tool-output-budget.mjs +2 -0
  429. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  430. package/src/runtime/shared/tool-primitives.mjs +13 -0
  431. package/src/runtime/shared/tool-result-summary.mjs +22 -1
  432. package/src/runtime/shared/tool-status.mjs +3 -2
  433. package/src/runtime/shared/tool-surface.mjs +20 -6
  434. package/src/runtime/shared/tool-work-units.mjs +54 -11
  435. package/src/runtime/shared/transcript-metadata.mjs +49 -1
  436. package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
  437. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  438. package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
  439. package/src/runtime/shared/transcript-writer.mjs +24 -6
  440. package/src/runtime/shared/turn-changes.mjs +269 -100
  441. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  442. package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
  443. package/src/runtime/shared/turn-snapshot.mjs +865 -683
  444. package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
  445. package/src/runtime/shared/user-data-guard.mjs +262 -49
  446. package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
  447. package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
  448. package/src/runtime/shared/worktrees/carry.mjs +533 -0
  449. package/src/runtime/shared/worktrees/contract.mjs +60 -0
  450. package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
  451. package/src/runtime/shared/worktrees/file-recovery.mjs +84 -0
  452. package/src/runtime/shared/worktrees/git-head.mjs +214 -0
  453. package/src/runtime/shared/worktrees/git.mjs +8 -3
  454. package/src/runtime/shared/worktrees/include.mjs +125 -7
  455. package/src/runtime/shared/worktrees/lock.mjs +1 -1
  456. package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
  457. package/src/runtime/shared/worktrees/manager.mjs +525 -31
  458. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  459. package/src/runtime/shared/worktrees/owner.mjs +2 -1
  460. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  461. package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
  462. package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
  463. package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
  464. package/src/runtime/terminal-bridge/client.mjs +57 -20
  465. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  466. package/src/runtime/tidy/apply.mjs +47 -2
  467. package/src/runtime/tidy/run-engines.mjs +11 -5
  468. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  469. package/src/session-runtime/boot/apis.mjs +20 -6
  470. package/src/session-runtime/boot/config.mjs +2 -0
  471. package/src/session-runtime/boot/facade.mjs +4 -0
  472. package/src/session-runtime/boot/infrastructure.mjs +6 -1
  473. package/src/session-runtime/boot/session.mjs +3 -3
  474. package/src/session-runtime/boot/tools.mjs +7 -1
  475. package/src/session-runtime/conversation-import/service.mjs +1 -1
  476. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  477. package/src/session-runtime/goal-facade-api.mjs +2 -2
  478. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +91 -0
  479. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  480. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +15 -5
  481. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +137 -26
  482. package/src/session-runtime/internal-tool-executor.mjs +8 -2
  483. package/src/session-runtime/lifecycle/cold-heir.mjs +187 -0
  484. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  485. package/src/session-runtime/lifecycle/session-catalog.mjs +25 -18
  486. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  487. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +36 -48
  488. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  489. package/src/session-runtime/lifecycle/shared.mjs +5 -6
  490. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
  491. package/src/session-runtime/lifecycle/teardown.mjs +70 -14
  492. package/src/session-runtime/lifecycle-api.mjs +1 -0
  493. package/src/session-runtime/mcp-glue/connect.mjs +17 -5
  494. package/src/session-runtime/media-api.mjs +8 -0
  495. package/src/session-runtime/model-route/route-ownership.mjs +60 -0
  496. package/src/session-runtime/model-route/route-persist.mjs +3 -2
  497. package/src/session-runtime/model-route/set-route.mjs +116 -36
  498. package/src/session-runtime/model-route/web-search-route.mjs +7 -2
  499. package/src/session-runtime/model-route-api.mjs +4 -2
  500. package/src/session-runtime/native-web-search/routes.mjs +37 -24
  501. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  502. package/src/session-runtime/native-web-search.mjs +19 -9
  503. package/src/session-runtime/new-session-config.mjs +4 -2
  504. package/src/session-runtime/provider-auth/login.mjs +4 -0
  505. package/src/session-runtime/provider-auth/setup.mjs +4 -0
  506. package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
  507. package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
  508. package/src/session-runtime/provider-models.mjs +1 -0
  509. package/src/session-runtime/provider-usage.mjs +4 -0
  510. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  511. package/src/session-runtime/route-resolution.mjs +3 -1
  512. package/src/session-runtime/runtime-core.mjs +4 -0
  513. package/src/session-runtime/runtime-facade.mjs +6 -0
  514. package/src/session-runtime/runtime-review-api.mjs +8 -2
  515. package/src/session-runtime/services/agent-task-status.mjs +2 -0
  516. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
  517. package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
  518. package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
  519. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
  520. package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
  521. package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
  522. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  523. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
  524. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
  525. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  526. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  527. package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
  528. package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
  529. package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
  530. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +82 -13
  531. package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
  532. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
  533. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
  534. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
  535. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
  536. package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
  537. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
  538. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
  539. package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
  540. package/src/session-runtime/services/agent-tool/tag-registry.mjs +18 -10
  541. package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
  542. package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
  543. package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
  544. package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
  545. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  546. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
  547. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
  548. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  549. package/src/session-runtime/services/agent-tool/worker-index.mjs +74 -15
  550. package/src/session-runtime/services/agent-tool.mjs +7 -0
  551. package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
  552. package/src/session-runtime/services/channel-admin.mjs +19 -3
  553. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  554. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  555. package/src/session-runtime/services/provider-admin.mjs +158 -15
  556. package/src/session-runtime/session-create/session-options.mjs +7 -5
  557. package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
  558. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  559. package/src/session-runtime/session-transcript.mjs +4 -5
  560. package/src/session-runtime/session-turn-api.mjs +17 -14
  561. package/src/session-runtime/settings-builtin-tools-api.mjs +18 -6
  562. package/src/session-runtime/setup-tool/executor.mjs +57 -9
  563. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  564. package/src/session-runtime/setup-tool/settings-contract.mjs +18 -3
  565. package/src/session-runtime/setup-tool/tool-defs.mjs +25 -4
  566. package/src/session-runtime/skills-api.mjs +3 -5
  567. package/src/session-runtime/tool-policy-refresh.mjs +83 -32
  568. package/src/session-runtime/tool-surface.mjs +5 -1
  569. package/src/session-runtime/turn/agent-ops.mjs +49 -2
  570. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  571. package/src/session-runtime/turn/session-ops.mjs +7 -5
  572. package/src/session-runtime/turn/side-question-ops.mjs +19 -0
  573. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +7 -1
  574. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +12 -3
  575. package/src/session-runtime/turn/turn-run/turn-settle.mjs +18 -2
  576. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  577. package/src/session-runtime/turn/turn-run.mjs +26 -45
  578. package/src/session-runtime/usage-stats-api.mjs +46 -11
  579. package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
  580. package/src/session-runtime/workspace/admission-gate.mjs +44 -15
  581. package/src/session-runtime/workspace/project-branches.mjs +35 -41
  582. package/src/session-runtime/workspace/transition-steps.mjs +215 -116
  583. package/src/session-runtime/workspace/transitions.mjs +428 -73
  584. package/src/standalone/channel-transport.mjs +3 -4
  585. package/src/standalone/daemon-agent-control.mjs +9 -1
  586. package/src/standalone/daemon-desktop-runtime.mjs +32 -1
  587. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  588. package/src/standalone/daemon-owner.mjs +17 -4
  589. package/src/standalone/daemon-pg-stop.mjs +49 -0
  590. package/src/standalone/daemon-session-control.mjs +88 -0
  591. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  592. package/src/standalone/daemon-stop-budget.mjs +18 -0
  593. package/src/standalone/daemon-stored-session-views.mjs +25 -3
  594. package/src/standalone/daemon-telemetry.mjs +19 -0
  595. package/src/standalone/daemon.mjs +63 -1
  596. package/src/standalone/desktop-service-registry.mjs +5 -0
  597. package/src/standalone/local-session-runtime.mjs +80 -30
  598. package/src/standalone/session-client.mjs +42 -0
  599. package/src/standalone/session-protocol.mjs +14 -0
  600. package/src/standalone/session-proxy/projection.mjs +41 -4
  601. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  602. package/src/standalone/session-runtime-inline-host.mjs +3 -0
  603. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
  604. package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
  605. package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
  606. package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
  607. package/src/standalone/session-service/agent-tree.mjs +28 -2
  608. package/src/standalone/session-service/entries/session-loads.mjs +16 -5
  609. package/src/standalone/session-service/entries.mjs +1 -0
  610. package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
  611. package/src/standalone/session-service/quota-resume.mjs +28 -13
  612. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  613. package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
  614. package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
  615. package/src/standalone/session-service-api.mjs +6 -1
  616. package/src/standalone/session-state-patch.d.mts +2 -1
  617. package/src/standalone/session-state-patch.mjs +41 -1
  618. package/src/standalone/session-tool-output.mjs +82 -0
  619. package/src/tui/App.jsx +25 -0
  620. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  621. package/src/tui/app/app-view.jsx +2 -1
  622. package/src/tui/app/btw-controller.mjs +118 -0
  623. package/src/tui/app/create-app-pickers.mjs +2 -0
  624. package/src/tui/app/provider-setup/provider-items.mjs +8 -0
  625. package/src/tui/app/provider-setup-picker.mjs +15 -3
  626. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  627. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  628. package/src/tui/app/slash-commands.mjs +19 -3
  629. package/src/tui/app/slash-dispatch/session-commands.mjs +68 -6
  630. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  631. package/src/tui/app/use-global-key-input.mjs +5 -12
  632. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  633. package/src/tui/components/BtwPanel.jsx +53 -0
  634. package/src/tui/components/QuestionPanel.jsx +275 -0
  635. package/src/tui/components/Spinner.jsx +4 -0
  636. package/src/tui/components/SpinnerByline.jsx +21 -2
  637. package/src/tui/components/question-panel-model.mjs +156 -0
  638. package/src/tui/components/status-line/local-line.mjs +10 -2
  639. package/src/tui/dist/index.mjs +2897 -1722
  640. package/src/tui/session/active-tool-summary.mjs +1 -1
  641. package/src/tui/session/context-state.mjs +4 -5
  642. package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
  643. package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
  644. package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
  645. package/src/tui/session/quota-resume.mjs +140 -61
  646. package/src/tui/session/session-api/commands.mjs +14 -10
  647. package/src/tui/session/session-api/controls.mjs +14 -2
  648. package/src/tui/session/session-api/integrations.mjs +9 -2
  649. package/src/tui/session/session-api/lifecycle/dispose.mjs +3 -9
  650. package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
  651. package/src/tui/session/session-api/lifecycle.mjs +14 -11
  652. package/src/tui/session/session-api/media.mjs +2 -0
  653. package/src/tui/session/session-api/routes.mjs +81 -57
  654. package/src/tui/session/session-api/settings.mjs +9 -3
  655. package/src/tui/session/session-api/worktree.mjs +3 -2
  656. package/src/tui/session/session-api.mjs +1 -0
  657. package/src/tui/session/session-flow/auto-clear.mjs +1 -3
  658. package/src/tui/session/session-flow/drain.mjs +6 -4
  659. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
  660. package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
  661. package/src/tui/session/session-flow/queue.mjs +1 -1
  662. package/src/tui/session/tool-approval.mjs +20 -8
  663. package/src/tui/session/transcript-spill.mjs +14 -7
  664. package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
  665. package/src/tui/session/tui-steering-persist.mjs +3 -5
  666. package/src/tui/session/turn-quiet.mjs +53 -0
  667. package/src/tui/session/turn-stream.mjs +179 -32
  668. package/src/tui/session/turn.mjs +50 -36
  669. package/src/tui/session/worktree-setup-notice.mjs +38 -0
  670. package/src/tui/spinner-meta.mjs +10 -0
  671. package/src/tui/spinner-verbs.mjs +3 -0
  672. package/src/ui/statusline.mjs +13 -3
  673. package/src/workflows/default/WORKFLOW.md +3 -1
  674. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
  675. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
  676. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
  677. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -246
  678. package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
  679. package/src/session-runtime/turn/share-ops.mjs +0 -77
  680. package/src/tui/session/cross-surface-share.mjs +0 -406
  681. package/src/tui/session/live-share/delta.mjs +0 -153
  682. package/src/tui/session/live-share/mirror.mjs +0 -106
  683. package/src/tui/session/live-share/owner.mjs +0 -254
  684. package/src/tui/session/live-share/retry.mjs +0 -54
  685. package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
  686. package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
  687. package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
  688. package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
  689. package/src/tui/session/live-share/viewer.mjs +0 -99
  690. package/src/tui/session/live-share/wire.mjs +0 -44
  691. package/src/tui/session/live-share.mjs +0 -154
  692. package/src/tui/session/shared-dir-watch.mjs +0 -69
@@ -1,13 +1,13 @@
1
1
  // Committed-but-unsealed text segments of one user turn.
2
2
  //
3
- // Max-output recovery parts plus (Lead/TUI only) text-only continuation
3
+ // Max-output recovery parts plus text-only continuation
4
4
  // segments (provider pause_turn / terminal steering / stop hook). The terminal
5
5
  // response returns content = parts + terminal so the UI row that accumulated
6
6
  // every streamed segment is not overwritten down to only the last segment;
7
7
  // historyContent keeps persistence single-copy.
8
8
  import { buildIntermediateAssistantMessage, commitAssistantMessage } from '../assistant-commit.mjs';
9
9
 
10
- export function createTurnSegments({ messages, opts, suppressMidTurnText }) {
10
+ export function createTurnSegments({ messages, opts }) {
11
11
  const parts = [];
12
12
  return {
13
13
  parts,
@@ -18,15 +18,9 @@ export function createTurnSegments({ messages, opts, suppressMidTurnText }) {
18
18
  return true;
19
19
  },
20
20
  // Record a mid-turn segment for the caller-facing aggregate and surface it
21
- // live. A suppressed sub-agent session neither surfaces nor accumulates
22
- // text — except on the max-output ladder, whose parts must still rebuild
23
- // the complete answer the caller receives (keepWhenSuppressed).
21
+ // live for every session.
24
22
  // `committed: true` marks text that is the just-committed message's own.
25
- record(text, { keepWhenSuppressed = false, committed = false } = {}) {
26
- if (suppressMidTurnText) {
27
- if (keepWhenSuppressed) parts.push(text);
28
- return;
29
- }
23
+ record(text, { committed = false } = {}) {
30
24
  parts.push(text);
31
25
  try {
32
26
  opts.onAssistantText?.(text, { committed });
@@ -19,15 +19,8 @@ import { resolveRefusal } from './no-tool-turn/refusal.mjs';
19
19
  import { resumeContinuation } from './no-tool-turn/continuation.mjs';
20
20
  import { nudgeEmptyTurn } from './no-tool-turn/empty-nudge.mjs';
21
21
 
22
- export function createNoToolTurnResolver({
23
- messages,
24
- opts,
25
- sessionId,
26
- sessionAgent,
27
- suppressMidTurnText,
28
- drainSteering,
29
- }) {
30
- const segments = createTurnSegments({ messages, opts, suppressMidTurnText });
22
+ export function createNoToolTurnResolver({ messages, opts, sessionId, sessionAgent, drainSteering }) {
23
+ const segments = createTurnSegments({ messages, opts });
31
24
  // Per-turn recovery counters shared by the ladders.
32
25
  const state = {
33
26
  maxOutputRecoveryCount: 0,
@@ -13,8 +13,12 @@
13
13
  // registry knows its name.
14
14
  import { isAgentOwner } from '../../agent-owner.mjs';
15
15
  import { isOffReadonlySurface } from './deferred-call-through.mjs';
16
+ import { BRIDGE_CALL_TOOL_NAME, bridgeErrorText, isToolBridgeEnabled } from '../../runtime-core/tool-bridge.mjs';
17
+ import { sessionAllowlistExcludes, sessionDisallows } from '../../runtime-core/deferred-tool-availability.mjs';
18
+ import { providerToolExclusionReason } from './provider-tool-exclusions.mjs';
16
19
 
17
- const WORKER_DENIED_TOOLS = new Set(['agent']);
20
+ const WORKER_DENIED_TOOLS = new Set(['agent', 'ask_user', 'session']);
21
+ const BRIDGE_DISCOVERY_TOOL_NAMES = new Set(['load_tool']);
18
22
 
19
23
  const IMAGE_PATH_RE = /\.(?:png|jpe?g|gif|webp)(?:$|[?#])/i;
20
24
  const COMPACTED_PATCH_LINE_RE = /^\s*\[mixdog compacted\b[^\]\n]*\]/;
@@ -95,17 +99,27 @@ export function routeWebFetchCall(call) {
95
99
  export function preDispatchDenyForSession(sessionRef, call) {
96
100
  const name = call?.name;
97
101
  if (typeof name !== 'string' || !name) return null;
102
+ // A call_tool request that could not be projected onto its target answers
103
+ // its wire id with the projection error; call_tool itself never dispatches.
104
+ if (typeof call.bridgeError === 'string') return call.bridgeError;
105
+ if (name === BRIDGE_CALL_TOOL_NAME && isToolBridgeEnabled(sessionRef)) {
106
+ return bridgeErrorText(
107
+ 'BRIDGE_RECURSION',
108
+ 'call_tool runs one tool named in its arguments and cannot be dispatched itself.'
109
+ );
110
+ }
98
111
  const schemaName = String(call?.schemaName || name);
99
- if (Array.isArray(sessionRef?.schemaAllowedTools)) {
100
- const allowed = new Set(sessionRef.schemaAllowedTools.map((toolName) => String(toolName).toLowerCase()));
101
- if (!allowed.has(schemaName.toLowerCase())) {
102
- return `Error: tool "${name}" is not available on this session's schema allowlist.`;
103
- }
112
+ // A tool the provider left out of this request still exists in the session;
113
+ // a call to it is answered with why it is unavailable.
114
+ const excluded = providerToolExclusionReason(sessionRef, schemaName);
115
+ if (excluded) return `Error: ${excluded}`;
116
+ // The bridge's discovery tools grant no authority (every call_tool target
117
+ // is judged here under its own name), so an allowlist never strands them.
118
+ const bridgeDiscovery = isToolBridgeEnabled(sessionRef) && BRIDGE_DISCOVERY_TOOL_NAMES.has(schemaName);
119
+ if (!bridgeDiscovery && sessionAllowlistExcludes(sessionRef, schemaName)) {
120
+ return `Error: tool "${name}" is not available on this session's schema allowlist.`;
104
121
  }
105
- if (
106
- Array.isArray(sessionRef?.disallowedTools) &&
107
- sessionRef.disallowedTools.some((toolName) => String(toolName).toLowerCase() === schemaName.toLowerCase())
108
- ) {
122
+ if (sessionDisallows(sessionRef, schemaName)) {
109
123
  return `Error: tool "${name}" is not available in this session.`;
110
124
  }
111
125
  if (isOffReadonlySurface(sessionRef, schemaName)) {
@@ -0,0 +1,135 @@
1
+ // Tools a provider left out of a request because it cannot accept their input
2
+ // schema even after the wire's normalization (a schema with an unknown type
3
+ // name, an unresolvable $ref, a non-object root), or that the provider
4
+ // rejected with an HTTP 400 naming the schema (dropped for the session).
5
+ // The user is told once per session and tool on the turn's display-only stage
6
+ // channel (stage 'notice'); a call the model still makes to such a tool is
7
+ // answered with the reason instead of running it.
8
+ import { geminiToolExclusion } from '../../providers/gemini-schema.mjs';
9
+ import { isGeminiFamilyModel } from '../../providers/gemini-family.mjs';
10
+ import { anthropicToolExclusion } from '../../providers/lib/anthropic-request-utils.mjs';
11
+ import { claudeBridgeInputSchema, wireInputSchema } from '../../providers/lib/claude-bridge-schema.mjs';
12
+ import { actionInputUnionFor } from '../../providers/lib/action-input-contract.mjs';
13
+ import { isAntigravityClaude } from '../../providers/antigravity-request.mjs';
14
+ import { isResponsesFreeformTool } from '../../providers/custom-tool-wire.mjs';
15
+ import { ANTHROPIC_NATIVE_PROVIDERS } from '../../runtime-core/tool-catalog-schema.mjs';
16
+ import {
17
+ finalizeProviderRequestTools,
18
+ providerNativeToolPrefixCount,
19
+ } from '../../runtime-core/provider-request-tools.mjs';
20
+
21
+ const sessions = new WeakMap();
22
+
23
+ function exclusionsFor(sessionRef) {
24
+ let state = sessions.get(sessionRef);
25
+ if (!state) {
26
+ state = { noticed: new Set(), current: new Map(), dropped: new Map() };
27
+ sessions.set(sessionRef, state);
28
+ }
29
+ return state;
30
+ }
31
+
32
+ const isSessionRef = (value) => value !== null && typeof value === 'object';
33
+
34
+ /** A new provider request: exclusions describe the latest request only. */
35
+ export function beginProviderToolExclusions(sessionRef) {
36
+ if (isSessionRef(sessionRef)) sessions.get(sessionRef)?.current.clear();
37
+ }
38
+
39
+ export function excludedToolNoticeText({ name, pointer, reason }) {
40
+ return `Tool "${name}" was excluded from this session's requests: its input schema is invalid at ${pointer || '/'} (${reason}). Fix the tool's schema or disable the tool.`;
41
+ }
42
+
43
+ /** Record `exclusion` ({ name, pointer, reason }) for the session's current
44
+ * request and raise the user notice the first time this tool is excluded. */
45
+ export function recordProviderToolExclusion(sessionRef, exclusion, onStageChange) {
46
+ const name = String(exclusion?.name || '');
47
+ if (!name || !isSessionRef(sessionRef)) return;
48
+ const state = exclusionsFor(sessionRef);
49
+ state.current.set(name, exclusion);
50
+ if (state.noticed.has(name)) return;
51
+ state.noticed.add(name);
52
+ try {
53
+ onStageChange?.('notice', { tone: 'warn', message: excludedToolNoticeText(exclusion) });
54
+ } catch {
55
+ /* display-only */
56
+ }
57
+ }
58
+
59
+ const unavailableText = (exclusion) =>
60
+ `tool "${exclusion.name}" is unavailable with the current model: the provider rejected its input schema at ${exclusion.pointer || '/'} (${exclusion.reason}), so it was left out of the request; no call was sent. Use another tool, or ask the user to fix the tool's schema or disable it.`;
61
+
62
+ /** Why `name` cannot be called in the session's current request, or null. */
63
+ export function providerToolExclusionReason(sessionRef, name) {
64
+ if (!isSessionRef(sessionRef)) return null;
65
+ const state = sessions.get(sessionRef);
66
+ const key = String(name || '');
67
+ const exclusion = state?.current.get(key) || state?.dropped.get(key);
68
+ return exclusion ? unavailableText(exclusion) : null;
69
+ }
70
+
71
+ /** The provider rejected `exclusion.name`'s schema with an HTTP 400: leave the
72
+ * tool out of every later request of the session and tell the user once. */
73
+ export function dropSessionTool(sessionRef, exclusion, onStageChange) {
74
+ if (!isSessionRef(sessionRef)) return;
75
+ exclusionsFor(sessionRef).dropped.set(exclusion.name, exclusion);
76
+ recordProviderToolExclusion(sessionRef, exclusion, onStageChange);
77
+ }
78
+
79
+ /** The request's tool surface without the tools dropped for the session
80
+ * ({ sendTools, requestToolScope }, the same objects when none apply). */
81
+ export function withoutDroppedTools(sessionRef, { sendTools, requestToolScope }) {
82
+ const dropped = isSessionRef(sessionRef) ? sessions.get(sessionRef)?.dropped : null;
83
+ if (!dropped?.size) return { sendTools, requestToolScope };
84
+ const prefix = providerNativeToolPrefixCount(sendTools);
85
+ const kept = sendTools.filter((tool, index) => index < prefix || !dropped.has(tool?.name));
86
+ if (kept.length === sendTools.length) return { sendTools, requestToolScope };
87
+ const next = finalizeProviderRequestTools(kept, prefix);
88
+ return { sendTools: next, requestToolScope: { ...requestToolScope, requestTools: next } };
89
+ }
90
+
91
+ // The schema rule of the wire a session's requests use: 'gemini', 'anthropic'
92
+ // (Messages), 'antigravity-claude' (Anthropic bridge behind Antigravity) or
93
+ // 'openai' (Responses, Codex and every OpenAI-compatible chat route).
94
+ function routeSchemaFamily(session) {
95
+ const provider = String(session?.provider || '').toLowerCase();
96
+ const wire = session?.wireRoute?.wire;
97
+ if (provider === 'antigravity-oauth' && isAntigravityClaude(session?.model)) return 'antigravity-claude';
98
+ if (provider === 'gemini' || isGeminiFamilyModel(session?.model)) return 'gemini';
99
+ if (ANTHROPIC_NATIVE_PROVIDERS.has(provider) || wire === 'messages') return 'anthropic';
100
+ return 'openai';
101
+ }
102
+
103
+ function wireExclusion(tool, result) {
104
+ return result.schema ? null : { name: tool.name, pointer: result.pointer || '/', reason: result.reason };
105
+ }
106
+
107
+ // The same normalization + validation the wire applies to `tool`, as
108
+ // { name, pointer, reason } when the route leaves it out of its requests.
109
+ function schemaExclusion(session, family, tool) {
110
+ switch (family) {
111
+ case 'gemini':
112
+ return geminiToolExclusion(tool);
113
+ case 'anthropic':
114
+ return anthropicToolExclusion(tool, String(session?.provider || 'anthropic').toLowerCase());
115
+ case 'antigravity-claude':
116
+ return wireExclusion(tool, claudeBridgeInputSchema(actionInputUnionFor(tool.inputSchema)));
117
+ default:
118
+ if (tool.inputSchema == null) return null;
119
+ if (/^openai(-oauth)?$/.test(String(session?.provider || '')) && isResponsesFreeformTool(tool)) return null;
120
+ return wireExclusion(tool, wireInputSchema(tool.inputSchema, 'openai'));
121
+ }
122
+ }
123
+
124
+ /** Why `tool` is left out of every request on the session's route, or null.
125
+ * Validation is a pure function of the tool's schema and the route's wire, so
126
+ * this holds before the tool was ever sent and stays stable across turns; a
127
+ * tool the provider rejected with a 400 is dropped for the session. Built-in
128
+ * tools are never excluded by the schema rule. */
129
+ export function routeToolExclusionReason(session, tool) {
130
+ if (!tool) return null;
131
+ const dropped = isSessionRef(session) ? sessions.get(session)?.dropped.get(String(tool.name || '')) : null;
132
+ if (dropped) return unavailableText(dropped);
133
+ const exclusion = schemaExclusion(session, routeSchemaFamily(session), tool);
134
+ return exclusion ? unavailableText(exclusion) : null;
135
+ }
@@ -5,15 +5,16 @@
5
5
  import { repairTranscriptBeforeProviderSend } from './transcript-repair.mjs';
6
6
  import { messagesArrayChanged } from './tool-helpers.mjs';
7
7
  import { runPreSendCompactPass } from '../pre-send-compact.mjs';
8
- import {
9
- refreshDeferredMcpToolCatalog,
10
- snapshotProviderRequestTools,
11
- } from '../../runtime-core/tool-catalog.mjs';
8
+ import { refreshDeferredMcpToolCatalog, snapshotProviderRequestTools } from '../../runtime-core/tool-catalog.mjs';
12
9
  import {
13
10
  finalizeProviderRequestTools,
14
11
  providerNativeToolPrefixCount,
15
12
  runWithProviderRequestToolsScope,
16
13
  } from '../../runtime-core/provider-request-tools.mjs';
14
+ import { TOOL_SURFACE_MIGRATION_INTENT } from '../../runtime-core/tool-exposure.mjs';
15
+ import { migrateToolExposureAtBoundary } from './tool-exposure-migration.mjs';
16
+ import { fixedRequestOverhead, fixedRequestOverheadInputs, resolveWorkerCompactPolicy } from './compact-policy.mjs';
17
+ import { toolSurfaceExceedsContextError } from './context-overflow.mjs';
17
18
 
18
19
  const isDynamicTool = (tool) =>
19
20
  tool.deferLoading === true || tool.defer_loading === true || String(tool.name || '').startsWith('mcp__');
@@ -61,6 +62,18 @@ export async function prepareProviderRequest(state) {
61
62
  let compactChanged;
62
63
  let sendTools;
63
64
  let requestToolScope;
65
+ // Fixed inputs of the last passing overhead verdict in this boundary.
66
+ let passedOverheadInputs;
67
+ // A session persisted with another tool exposure migrates here, once, at a
68
+ // boundary with no pending calls: new surface and fixed guidance, a fresh
69
+ // tool snapshot and provider state, and a tagged cache break.
70
+ if (migrateToolExposureAtBoundary(sessionRef, messages)) {
71
+ fixedProviderToolSurface = null;
72
+ providerState = undefined;
73
+ providerStateCleared = true;
74
+ delete sessionRef.pendingCacheBreakIntent;
75
+ opts.cacheBreakIntent = TOOL_SURFACE_MIGRATION_INTENT;
76
+ }
64
77
  refreshDeferredMcpToolCatalog(sessionRef);
65
78
  do {
66
79
  // Provider-history normalization is part of the request boundary:
@@ -90,6 +103,20 @@ export async function prepareProviderRequest(state) {
90
103
  requestTools: sendTools,
91
104
  nativePrefixCount: providerNativeToolPrefixCount(sendTools),
92
105
  };
106
+ // A request whose fixed overhead alone leaves no room for history fails
107
+ // here with an actionable error: no compaction could make it fit. A
108
+ // passing verdict holds while its fixed inputs (tool schemas, protected
109
+ // system context, headroom, boundary) are unchanged — a later pass whose
110
+ // compaction only removed history (and the provider reading with it) is
111
+ // not re-judged — but adopted MCP schema changes or a re-rooted system
112
+ // prompt are.
113
+ const overheadPolicy = resolveWorkerCompactPolicy(sessionRef, sendTools);
114
+ const overheadInputs = fixedRequestOverheadInputs(overheadPolicy, messages);
115
+ if (overheadInputs === null || overheadInputs !== passedOverheadInputs) {
116
+ const overhead = fixedRequestOverhead(overheadPolicy, messages, sendTools, sessionRef);
117
+ if (overhead) throw toolSurfaceExceedsContextError({ sessionId, sessionRef, model, overhead });
118
+ passedOverheadInputs = overheadInputs;
119
+ }
93
120
  const pass = await runWithProviderRequestToolsScope(requestToolScope, () =>
94
121
  runPreSendCompactPass({
95
122
  provider,
@@ -0,0 +1,76 @@
1
+ import { canFallbackRoute } from '../../../../shared/model-route-fallback.mjs';
2
+ import { getProvider, initProviders } from '../../providers/registry.mjs';
3
+ import { loadConfig } from '../../config.mjs';
4
+ import { ensureProviderEnabled } from '../../runtime-core/config-helpers.mjs';
5
+ import { updateSessionRoute } from '../manager/session-lifecycle.mjs';
6
+ import { pinSessionWireRoute } from '../../providers/wire-route.mjs';
7
+ import { buildRequestSendOptions } from '../manager/ask-turn-loop-options.mjs';
8
+ import { prepareTurnEffortConfiguration } from '../../providers/effort-configuration.mjs';
9
+ import { resolveSessionContextMeta } from '../manager/context-meta.mjs';
10
+
11
+ export async function advanceAgentRoute(state, error) {
12
+ const session = state.sessionRef;
13
+ const index = session?.routeFallbackIndex || 0;
14
+ const next = session?.routeFallbacks?.[index];
15
+ const committed = state.toolCallsTotal > 0 || state.response != null;
16
+ if (!session?.agent || !next || !canFallbackRoute(error, { signal: state.signal, committed })) return false;
17
+ state.throwIfAborted();
18
+ const config = ensureProviderEnabled(loadConfig(), next.provider);
19
+ await initProviders(config.providers, { signal: state.signal });
20
+ state.throwIfAborted();
21
+ const provider = getProvider(next.provider);
22
+ if (!provider) throw new Error(`Provider "${next.provider}" not available`);
23
+ const oldOptions = buildRequestSendOptions({
24
+ sessionId: state.sessionId,
25
+ session,
26
+ signal: state.signal,
27
+ });
28
+ const updated = updateSessionRoute(
29
+ session.id,
30
+ {
31
+ ...next,
32
+ effort: next.effort || null,
33
+ fast: next.fast === true,
34
+ autoEffort: next.autoEffort !== false,
35
+ modelParameters: next.modelParameters || {},
36
+ contextPercent: next.contextPercent,
37
+ contextTokens: next.contextTokens,
38
+ selectedContextWindow: resolveSessionContextMeta(provider, next.model, next).rawContextWindow,
39
+ },
40
+ { crossProvider: true }
41
+ );
42
+ if (!updated) throw new Error('agent session closed during model fallback');
43
+ updated.routeFallbackIndex = index + 1;
44
+ await pinSessionWireRoute(updated, provider);
45
+ state.throwIfAborted();
46
+ state.messages.splice(0, state.messages.length, ...updated.messages);
47
+ updated.liveTurnMessages = state.messages;
48
+ state.sessionRef = updated;
49
+ state.provider = provider;
50
+ state.model = updated.model;
51
+ state.tools = updated.tools;
52
+ state.providerState = undefined;
53
+ state.providerStateUpdated = true;
54
+ state.prefixGuardState = null;
55
+ state.fixedProviderToolSurface = null;
56
+ state.cacheBreakTraceKeys.clear();
57
+ state.transportRetriesUsed = 0;
58
+ state.transportRetryMax = 0;
59
+ for (const key of Object.keys(oldOptions)) delete state.opts[key];
60
+ Object.assign(
61
+ state.opts,
62
+ buildRequestSendOptions({
63
+ sessionId: state.sessionId,
64
+ session: updated,
65
+ turnEffort: updated.effort,
66
+ effortConfiguration: prepareTurnEffortConfiguration(updated, provider),
67
+ signal: state.signal,
68
+ })
69
+ );
70
+ state.opts.onStageChange?.('connecting', {
71
+ provider: updated.provider,
72
+ model: updated.model,
73
+ reason: 'model-fallback',
74
+ });
75
+ return true;
76
+ }
@@ -17,6 +17,14 @@ import { stripInlineImages } from '../image-strip-recovery.mjs';
17
17
  import { runWithProviderRequestToolsScope } from '../../runtime-core/provider-request-tools.mjs';
18
18
  import { REPEAT_FAIL_LIMIT } from './loop-state.mjs';
19
19
  import { createToolCallIdResolver } from './tool-call-ids.mjs';
20
+ import { captureSideQuestionRequest } from '../side-question-store.mjs';
21
+ import { advanceAgentRoute } from './route-fallback.mjs';
22
+ import {
23
+ beginProviderToolExclusions,
24
+ dropSessionTool,
25
+ recordProviderToolExclusion,
26
+ withoutDroppedTools,
27
+ } from './provider-tool-exclusions.mjs';
20
28
 
21
29
  /**
22
30
  * Open an iteration: refresh the live cwd, drain queued steering after a
@@ -73,6 +81,8 @@ export async function beginIteration(state) {
73
81
  loopUsageMetricsTurnId: state.usageMetricsTurnId,
74
82
  loopUsageMetricsEpoch: state.usageMetricsEpoch,
75
83
  });
84
+ // A tool the provider rejected with a schema 400 stays out of the session.
85
+ Object.assign(boundary, withoutDroppedTools(sessionRef, boundary));
76
86
  state.iterations = boundary.iterations;
77
87
  state.lastUsage = boundary.lastUsage;
78
88
  state.firstTurnUsage = boundary.firstTurnUsage;
@@ -92,6 +102,10 @@ export async function beginIteration(state) {
92
102
  // callers omit the flag and retain legacy live deferred resolution.
93
103
  opts.providerToolSnapshotAuthoritative = true;
94
104
  opts.providerNativeToolPrefixCount = boundary.requestToolScope.nativePrefixCount;
105
+ // A tool the provider leaves out of this request (a schema it cannot
106
+ // accept) is noticed once per session and refused if the model calls it.
107
+ beginProviderToolExclusions(sessionRef);
108
+ opts.onToolExcluded = (exclusion) => recordProviderToolExclusion(sessionRef, exclusion, opts.onStageChange);
95
109
  state.lastSendTools = boundary.sendTools;
96
110
  // Eager-dispatch queue (see ../eager-dispatch.mjs): read-only tools start
97
111
  // the instant the provider streams a tool-call event; writes and unknown
@@ -156,26 +170,47 @@ export async function sendProviderRequest(state, round) {
156
170
  try {
157
171
  opts.onProviderSendStarted?.();
158
172
  } catch {}
159
- const result = await runWithProviderRequestToolsScope(round.requestToolScope, () =>
160
- sendWithRecovery({
161
- provider,
162
- messages: providerMessages,
163
- recoveryMessages: messageSource,
164
- model,
165
- sendTools: round.sendTools,
166
- tools: round.sendTools,
167
- opts,
168
- sessionId,
169
- sessionRef,
170
- nextIteration: round.nextIteration,
171
- contextOverflowRetryUsed: state.contextOverflowRetryUsed,
172
- transportRetriesUsed: state.transportRetriesUsed,
173
- transportRetryMax: state.transportRetryMax,
174
- imageStripUsed: state.imageStripUsed,
175
- thinkingReplayRepairUsed: state.thinkingReplayRepairUsed,
176
- signal: state.signal,
177
- })
178
- );
173
+ // The request a /btw side question forks: kept while it is in flight, with
174
+ // its reply once it proceeds, and dropped again if it fails.
175
+ const sideQuestion = captureSideQuestionRequest({
176
+ sessionId,
177
+ sessionRef,
178
+ provider,
179
+ model,
180
+ messages: providerMessages,
181
+ tools: round.sendTools,
182
+ opts,
183
+ });
184
+ let result;
185
+ try {
186
+ result = await runWithProviderRequestToolsScope(round.requestToolScope, () =>
187
+ sendWithRecovery({
188
+ provider,
189
+ messages: providerMessages,
190
+ recoveryMessages: messageSource,
191
+ model,
192
+ sendTools: round.sendTools,
193
+ tools: round.sendTools,
194
+ opts,
195
+ sessionId,
196
+ sessionRef,
197
+ nextIteration: round.nextIteration,
198
+ contextOverflowRetryUsed: state.contextOverflowRetryUsed,
199
+ transportRetriesUsed: state.transportRetriesUsed,
200
+ transportRetryMax: state.transportRetryMax,
201
+ imageStripUsed: state.imageStripUsed,
202
+ thinkingReplayRepairUsed: state.thinkingReplayRepairUsed,
203
+ toolSchemaDropUsed: state.toolSchemaDropUsed,
204
+ signal: state.signal,
205
+ })
206
+ );
207
+ } catch (error) {
208
+ sideQuestion?.discard();
209
+ if (!(await advanceAgentRoute(state, error))) throw error;
210
+ result = { action: 'retry_route' };
211
+ }
212
+ if (result.action === 'proceed') sideQuestion?.settle(result.response);
213
+ else sideQuestion?.discard();
179
214
  return {
180
215
  result,
181
216
  providerMessages,
@@ -200,6 +235,8 @@ function appendRecoveryNotice(state, notice) {
200
235
  * instead of processing a response. */
201
236
  export function applyRetryAction(state, result) {
202
237
  switch (result.action) {
238
+ case 'retry_route':
239
+ return true;
203
240
  case 'retry':
204
241
  // Keep opts.cacheBreakIntent: the failed send never consumed the tag,
205
242
  // and the reactive-compact retry that follows IS the tagged transition.
@@ -217,6 +254,16 @@ export function applyRetryAction(state, result) {
217
254
  // transport budget is consumed: nothing was generated.
218
255
  state.thinkingReplayRepairUsed = true;
219
256
  return true;
257
+ case 'retry_tool_schema_drop':
258
+ // The provider named a tool whose schema it rejects: the session drops
259
+ // it (with the notice) and the turn is rebuilt without it, once. The
260
+ // frozen tool surface and provider state are rebuilt around the change.
261
+ state.toolSchemaDropUsed = true;
262
+ dropSessionTool(state.sessionRef, result.exclusion, state.opts.onStageChange);
263
+ state.fixedProviderToolSurface = null;
264
+ state.providerState = undefined;
265
+ state.providerStateUpdated = true;
266
+ return true;
220
267
  case 'retry_image_strip':
221
268
  state.transportRetriesUsed += 1;
222
269
  state.imageStripUsed = true;
@@ -16,20 +16,19 @@
16
16
  import { resolveAutoEffort } from '../../providers/auto-effort.mjs';
17
17
  import { isCustomProviderName, resolveCustomReasoning } from '../../providers/custom-reasoning.mjs';
18
18
  import { autoEffortModel, stepEffortConfiguration } from '../../providers/effort-configuration.mjs';
19
- import { effortOptionsFor } from '../../runtime-core/effort.mjs';
19
+ import { effortOptionsFor, warnEmptyAutoEffortLadder } from '../../runtime-core/effort.mjs';
20
20
  import { judgeTurn, recordEffortDecision } from '../../../../effort-judge/judge-client.mjs';
21
21
  import { stepResultWindow } from '../../../../effort-judge/judge-input.mjs';
22
22
 
23
23
  const TEXT_BLOCKS = new Set(['text', 'input_text', 'output_text']);
24
- const textOf = (content) =>
25
- typeof content === 'string'
26
- ? content
27
- : Array.isArray(content)
28
- ? content
29
- .filter((block) => block && TEXT_BLOCKS.has(block.type))
30
- .map((block) => block.text)
31
- .join('\n')
32
- : '';
24
+ function textOf(content) {
25
+ if (typeof content === 'string') return content;
26
+ if (!Array.isArray(content)) return '';
27
+ return content
28
+ .filter((block) => block && TEXT_BLOCKS.has(block.type))
29
+ .map((block) => block.text)
30
+ .join('\n');
31
+ }
33
32
  // Same argument text the training data was built from (head 600 code points).
34
33
  const argText = (args) =>
35
34
  Array.from(typeof args === 'string' ? args : JSON.stringify(args ?? {}))
@@ -174,6 +173,7 @@ function stepResult({ auto, snapshot, step, provider, model, providerClient, ses
174
173
  ms: judged.ms,
175
174
  probs: judged.probs.map((value) => Number(value.toFixed(3))),
176
175
  });
176
+ if (!resolved) warnEmptyAutoEffortLadder(provider, model, auto.base);
177
177
  if (isCustomProviderName(provider)) {
178
178
  const level =
179
179
  resolved &&
@@ -0,0 +1,95 @@
1
+ // Execution-call projection for the fixed tool bridge. A wire call
2
+ // `call_tool {name: T, arguments: A}` (id X) becomes the execution call
3
+ // `{ id: X, name: T, arguments: A, wireCall }` before eager admission and
4
+ // classification, so every policy, ordering, cache, hook, approval and audit
5
+ // layer sees the target itself. The tool result still answers wire id X and
6
+ // the transcript keeps the original wire call (`wireCall`, an immutable copy).
7
+ // Non-bridge sessions and every other call pass through unchanged.
8
+ import { formatInvalidToolArgsResult, isInvalidToolArgsMarker } from '../../providers/lib/openai-tool-args.mjs';
9
+ import {
10
+ BRIDGE_CALL_TOOL_NAME,
11
+ bridgeErrorText,
12
+ isToolBridgeEnabled,
13
+ resolveBridgeTarget,
14
+ } from '../../runtime-core/tool-bridge.mjs';
15
+
16
+ const CALL_TOOL_KEYS = new Set(['name', 'arguments']);
17
+
18
+ const isPlainObject = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
19
+
20
+ function deepFreeze(value) {
21
+ if (value && typeof value === 'object' && !Object.isFrozen(value)) {
22
+ Object.freeze(value);
23
+ for (const key of Object.keys(value)) deepFreeze(value[key]);
24
+ }
25
+ return value;
26
+ }
27
+
28
+ function projectionFailure(wireCall, wire, text) {
29
+ return { id: wireCall.id, name: wireCall.name, arguments: wireCall.arguments, wireCall: wire, bridgeError: text };
30
+ }
31
+
32
+ /**
33
+ * @returns the execution call for `wireCall`: the projected target call, a
34
+ * call carrying `bridgeError` (answered with that error, never executed),
35
+ * or `wireCall` itself when no projection applies. Idempotent.
36
+ */
37
+ export function resolveExecutionToolCall(wireCall, session) {
38
+ if (!wireCall || wireCall.name !== BRIDGE_CALL_TOOL_NAME || wireCall.wireCall || !isToolBridgeEnabled(session)) {
39
+ return wireCall;
40
+ }
41
+ const wire = deepFreeze(structuredClone(wireCall));
42
+ const args = wireCall.arguments;
43
+ if (isInvalidToolArgsMarker(args)) return projectionFailure(wireCall, wire, formatInvalidToolArgsResult(wireCall));
44
+ if (!isPlainObject(args)) {
45
+ return projectionFailure(
46
+ wireCall,
47
+ wire,
48
+ bridgeErrorText('INVALID_ARGUMENTS', 'call_tool requires {name, arguments}.')
49
+ );
50
+ }
51
+ const extra = Object.keys(args).filter((key) => !CALL_TOOL_KEYS.has(key));
52
+ if (extra.length) {
53
+ return projectionFailure(
54
+ wireCall,
55
+ wire,
56
+ bridgeErrorText('INVALID_ARGUMENTS', `call_tool does not accept: ${extra.join(', ')}.`)
57
+ );
58
+ }
59
+ if (!isPlainObject(args.arguments)) {
60
+ return projectionFailure(
61
+ wireCall,
62
+ wire,
63
+ bridgeErrorText('INVALID_ARGUMENTS', 'call_tool arguments must be an object of the target tool arguments.')
64
+ );
65
+ }
66
+ const target = resolveBridgeTarget(session, args.name);
67
+ if (target.error) return projectionFailure(wireCall, wire, bridgeErrorText(target.error.code, target.error.message));
68
+ const call = { id: wireCall.id, name: target.name, arguments: structuredClone(args.arguments), wireCall: wire };
69
+ // The target definition drives read-only classification of the call; it is
70
+ // never serialized with the call.
71
+ Object.defineProperty(call, 'bridgeTool', { value: target.tool, enumerable: false });
72
+ return call;
73
+ }
74
+
75
+ export function resolveExecutionToolCalls(calls, session) {
76
+ return Array.isArray(calls) ? calls.map((call) => resolveExecutionToolCall(call, session)) : calls;
77
+ }
78
+
79
+ /**
80
+ * The classification tool list for `calls`: `tools` plus the definitions of
81
+ * bridged targets that are not on it, so a bridged target is classified
82
+ * (read-only, dedup, stale-read invalidation) exactly like a direct call.
83
+ */
84
+ export function bridgeClassificationTools(tools, calls) {
85
+ const base = Array.isArray(tools) ? tools : [];
86
+ const seen = new Set(base.map((tool) => tool?.name));
87
+ const extra = [];
88
+ for (const call of calls || []) {
89
+ const definition = call?.bridgeTool;
90
+ if (!definition || seen.has(definition.name)) continue;
91
+ seen.add(definition.name);
92
+ extra.push(definition);
93
+ }
94
+ return extra.length ? [...base, ...extra] : tools;
95
+ }
@@ -14,6 +14,12 @@ export function _stripMcpPrefix(name) {
14
14
  export function _isReadTool(name) {
15
15
  return _stripMcpPrefix(name) === 'read';
16
16
  }
17
+
18
+ // Cursor's native file protocol needs source content, not a receipt saying
19
+ // the model has already seen it. Keep actual read caching and permissions.
20
+ export function requiresReadBody(name, sessionRef) {
21
+ return name === 'read' && (sessionRef?.provider === 'cursor-oauth' || sessionRef?.provider === 'cursor-api');
22
+ }
17
23
  export function _isMutationTool(name, args = null) {
18
24
  const n = String(_stripMcpPrefix(name) || '').toLowerCase();
19
25
  return n === 'apply_patch' || n === 'edit' || _isGitMutationTool(name, args);