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
@@ -0,0 +1,148 @@
1
+ // Classification of role:'user' messages: the human's own instruction versus
2
+ // compact summaries and runtime-injected turns. Import-light on purpose (no
3
+ // context-utils graph) so the session store can count real human turns;
4
+ // compact/messages.mjs re-exports everything here.
5
+ import { SUMMARY_PREFIX_ANCHOR } from './summary-anchor.mjs';
6
+ import { isImportedMessage } from '../imported-message.mjs';
7
+ import {
8
+ isInternalRuntimeNotificationText,
9
+ isModelVisibleToolCompletionWrapper,
10
+ } from '../../../../shared/tool-execution-contract.mjs';
11
+
12
+ // A compact summary message is a synthetic role:'user' message carrying the
13
+ // SUMMARY_PREFIX anchor. It is NOT a real user turn: it must be excluded from
14
+ // real user-turn boundary calculations and treated as merge input, otherwise
15
+ // an old summary can sit in the preserved tail as a live user message,
16
+ // duplicate, or fail to merge across repeated compaction.
17
+ export function isSummaryMessage(m) {
18
+ return (
19
+ m?.role === 'user' &&
20
+ !isImportedMessage(m) &&
21
+ (String(m?.meta?.source || '') === 'compact-summary' ||
22
+ (typeof m.content === 'string' &&
23
+ m.content.startsWith(SUMMARY_PREFIX_ANCHOR) &&
24
+ /\nmessages=\d+\s+(?:sha256=|compact_type=)/.test(m.content)))
25
+ );
26
+ }
27
+
28
+ export function isProtectedContextUserMessage(m) {
29
+ if (m?.role !== 'user' || typeof m.content !== 'string' || isImportedMessage(m)) return false;
30
+ let content = m.content.trim();
31
+ if (!content.toLowerCase().startsWith('<system-reminder>')) return false;
32
+ const closingTag = '</system-reminder>';
33
+ // A runtime turn may carry several reminders (Goal, clock, tool delta).
34
+ // Only text outside those envelopes is a human instruction. Keep this
35
+ // compatible with stored turns that predate explicit source metadata.
36
+ while (content.toLowerCase().startsWith('<system-reminder>')) {
37
+ const closingIndex = content.toLowerCase().indexOf(closingTag);
38
+ if (closingIndex < 0) return true;
39
+ content = content.slice(closingIndex + closingTag.length).trim();
40
+ }
41
+ return content === '';
42
+ }
43
+
44
+ // An injected Skill-body user message (the general newMessages channel carries
45
+ // the full SKILL.md body as a role:'user' message after the Skill tool_result).
46
+ // Like isSummaryMessage / isProtectedContextUserMessage, it is detected by
47
+ // content prefix (the `<skill>` envelope from buildSkillResultEnvelope) so the
48
+ // check survives even if the synthetic `meta` field is dropped during a tail
49
+ // rebuild. It is NOT the human's latest prompt and must be excluded from
50
+ // "latest human request" selection (deriveCurrentRequest). The `meta:'skill'`
51
+ // marker is also honoured.
52
+ export function isInjectedSkillBodyMessage(m) {
53
+ if (m?.role !== 'user' || isImportedMessage(m)) return false;
54
+ if (m.meta === 'skill') return true;
55
+ return typeof m.content === 'string' && m.content.trimStart().startsWith('<skill>');
56
+ }
57
+
58
+ const CONTEXT_ACK_SOURCE = 'context-ack';
59
+
60
+ /** The assistant `.` that closes an injected context turn (compact summary,
61
+ * reminder, reference files) so the next prompt stays its own message. It is
62
+ * model context only and never displayed. */
63
+ export function contextAckMessage() {
64
+ return { role: 'assistant', content: '.', meta: { source: CONTEXT_ACK_SOURCE } };
65
+ }
66
+
67
+ /** Whether `message` is a context ack: marked, or (stored before the marker
68
+ * existed) a bare `.` right after injected context (`previous`). */
69
+ export function isContextAckMessage(message, previous = null) {
70
+ if (
71
+ message?.role !== 'assistant' ||
72
+ typeof message.content !== 'string' ||
73
+ message.content.trim() !== '.' ||
74
+ Array.isArray(message.toolCalls)
75
+ ) {
76
+ return false;
77
+ }
78
+ if (message.meta?.source === CONTEXT_ACK_SOURCE) return true;
79
+ return (
80
+ isSummaryMessage(previous) ||
81
+ isProtectedContextUserMessage(previous) ||
82
+ (previous?.role === 'user' && /^Reference files:\s*/i.test(userMessageText(previous).trimStart()))
83
+ );
84
+ }
85
+
86
+ const SYNTHETIC_USER_SOURCES = new Set([
87
+ 'goal-continuation',
88
+ 'goal-closeout',
89
+ 'compact-context',
90
+ 'compact-active-turn-continuation',
91
+ 'compact-execution-recovery',
92
+ 'max-output-recovery',
93
+ 'refusal-recovery',
94
+ 'stream-cut-recovery',
95
+ ]);
96
+ const SYNTHETIC_USER_CONTROL_RE =
97
+ /^(?:\[mixdog-runtime\]|\[request interrupted(?: by user(?: for tool use)?| by process restart)?\])(?:\s|$)/i;
98
+
99
+ function userMessageText(message) {
100
+ if (typeof message?.content === 'string') return message.content;
101
+ if (!Array.isArray(message?.content)) return '';
102
+ return message.content.map((block) => (typeof block === 'string' ? block : block?.text || '')).join('');
103
+ }
104
+
105
+ export function isActualUserInstructionMessage(message) {
106
+ if (
107
+ message?.role !== 'user' ||
108
+ isSummaryMessage(message) ||
109
+ isProtectedContextUserMessage(message) ||
110
+ isInjectedSkillBodyMessage(message)
111
+ ) {
112
+ return false;
113
+ }
114
+ const text = userMessageText(message);
115
+ // Imported prose is the user's own words whatever it looks like.
116
+ if (isImportedMessage(message)) return text.trim().length > 0;
117
+ if (/^Reference files:\s*/i.test(text.trimStart())) return false;
118
+ if (
119
+ SYNTHETIC_USER_CONTROL_RE.test(text.trimStart()) ||
120
+ isInternalRuntimeNotificationText(text) ||
121
+ isModelVisibleToolCompletionWrapper(text) ||
122
+ SYNTHETIC_USER_SOURCES.has(String(message?.meta?.source || ''))
123
+ ) {
124
+ return false;
125
+ }
126
+ return text.trim().length > 0 || (Array.isArray(message.content) && message.content.length > 0);
127
+ }
128
+
129
+ // Control rows the runtime writes as user turns when a turn is cut short.
130
+ // isActualUserInstructionMessage deliberately keeps treating "[truncated]" as
131
+ // an instruction (compaction tail selection depends on it), so the real-turn
132
+ // predicate below recognizes it on its own.
133
+ const CONTROL_MARKER_RE = /^\[(?:truncated|request interrupted(?: by user(?: for tool use)?| by process restart)?)\]$/i;
134
+
135
+ /** Whether a message stands for real human conversation: a compact summary
136
+ * (it replaced earlier human turns), imported prose, or the user's own
137
+ * instruction without runtime provenance (`meta.source`/`meta.synthetic`,
138
+ * `internal`/`synthetic` flags) or a recognized control marker. Used to tell
139
+ * a real conversation from a synthetic-only transcript in catalog rows. */
140
+ export function isRealTurnMessage(message) {
141
+ if (isSummaryMessage(message)) return true;
142
+ if (!isActualUserInstructionMessage(message)) return false;
143
+ if (isImportedMessage(message)) return true;
144
+ if (message.internal === true || message.synthetic === true) return false;
145
+ const meta = message.meta;
146
+ if (meta && typeof meta === 'object' && (meta.synthetic === true || meta.source)) return false;
147
+ return !CONTROL_MARKER_RE.test(userMessageText(message).trim());
148
+ }
@@ -25,7 +25,7 @@ import { renameWithRetrySync } from '../../../shared/atomic-file.mjs';
25
25
  import { writeStderrBestEffort } from '../../../shared/best-effort-stderr.mjs';
26
26
 
27
27
  import { sanitizeContentForStoredHistory } from '../providers/media-normalization.mjs';
28
- import { getStoreDir } from './store/paths-heartbeat.mjs';
28
+ import { getStoreDir } from './store/session-paths.mjs';
29
29
  import { forgetSessionSaveBaseline } from './store/save-worker.mjs';
30
30
  import { messageIdOf, stampMessageIds } from './message-ids.mjs';
31
31
  import { restoreTranscriptItems } from './transcript-restore/restore.mjs';
@@ -8,6 +8,13 @@ import {
8
8
  } from '../runtime-core/provider-request-tools.mjs';
9
9
 
10
10
  const toolSchemaAnalysisMemo = new WeakMap();
11
+ // Token cost by schema signature. Every new session builds its own tools array
12
+ // with the same schemas; re-estimating the whole serialization (tens of ms,
13
+ // synchronous) per first turn blocked the event loop during session creation.
14
+ // The signature hashes the full serialization, deferred flags included, so it
15
+ // determines the metered text exactly.
16
+ const toolSchemaTokensBySignature = new Map();
17
+ const TOOL_SCHEMA_TOKENS_LIMIT = 32;
11
18
 
12
19
  function isDeferredToolSchema(tool) {
13
20
  return tool?.deferLoading === true || tool?.defer_loading === true;
@@ -58,8 +65,16 @@ function analyzeToolSchemas(tools) {
58
65
  // full weight inflated the request reserve. The SIGNATURE keeps hashing
59
66
  // the full serialization (a deferred tool joining/leaving must still
60
67
  // re-fingerprint the surface); only the token cost drops deferred entries.
61
- const meterText = list.some(isDeferredToolSchema) ? serializeToolSchemas(list, { excludeDeferred: true }) : text;
62
- const analysis = { signature, tokens: estimateTokens(meterText) };
68
+ let tokens = toolSchemaTokensBySignature.get(signature);
69
+ if (tokens === undefined) {
70
+ const meterText = list.some(isDeferredToolSchema) ? serializeToolSchemas(list, { excludeDeferred: true }) : text;
71
+ tokens = estimateTokens(meterText);
72
+ if (toolSchemaTokensBySignature.size >= TOOL_SCHEMA_TOKENS_LIMIT) {
73
+ toolSchemaTokensBySignature.delete(toolSchemaTokensBySignature.keys().next().value);
74
+ }
75
+ toolSchemaTokensBySignature.set(signature, tokens);
76
+ }
77
+ const analysis = { signature, tokens };
63
78
  if (Array.isArray(tools)) toolSchemaAnalysisMemo.set(tools, analysis);
64
79
  return analysis;
65
80
  }
@@ -225,10 +225,14 @@ function messageTextTokens(m, precomputedText = null, precomputedReplay = null)
225
225
  m?.role === 'assistant' && Array.isArray(m.providerReplay?.items) && m.providerReplay.items.length
226
226
  ? m.providerReplay.items
227
227
  : null;
228
- const fullTokens = estimateTokens(text);
229
- if (!replayItems) return fullTokens;
230
- const replayTokens = estimateTokens(precomputedReplay ?? nativeBlocksEstimateText(replayItems));
231
- return Math.max(fullTokens - replayTokens, replayTokens);
228
+ if (!replayItems) return estimateTokens(text);
229
+ // With visible replay items the text is exactly `${base}\n${replay}`. Meter
230
+ // each half on its own: the estimator's minimum-cost floors apply to the
231
+ // joined string, so subtracting est(replay) from est(base + replay)
232
+ // overstates base.
233
+ const replay = precomputedReplay ?? nativeBlocksEstimateText(replayItems);
234
+ const base = text.slice(0, text.length - replay.length - 1);
235
+ return Math.max(estimateTokens(base), estimateTokens(replay));
232
236
  }
233
237
  function imageDescriptorAllowance(descriptor) {
234
238
  if (descriptor.width && descriptor.height) {
@@ -176,9 +176,3 @@ export function createClaudeReducer() {
176
176
  },
177
177
  };
178
178
  }
179
-
180
- export function convertClaudeRecords(records) {
181
- const reducer = createClaudeReducer();
182
- for (const record of records) reducer.push(record);
183
- return reducer.result();
184
- }
@@ -113,12 +113,6 @@ export function createCodexReducer() {
113
113
  };
114
114
  }
115
115
 
116
- export function convertCodexRecords(records) {
117
- const reducer = createCodexReducer();
118
- for (const record of records) reducer.push(record);
119
- return reducer.result();
120
- }
121
-
122
116
  /** id/cwd of a `session_meta` first line cut off by a bounded prefix read. */
123
117
  export function codexMetaFromTruncatedLine(line) {
124
118
  const text = String(line || '');
@@ -12,6 +12,7 @@ import {
12
12
  } from '../loop/tool-classify.mjs';
13
13
  import { isSingleCallPerTurnTool, isToolCallDedupEligible } from '../loop/tool-helpers.mjs';
14
14
  import { lookupToolResultReuse } from '../cache/tool-result-reuse.mjs';
15
+ import { bridgeClassificationTools } from '../loop/tool-call-resolution.mjs';
15
16
 
16
17
  export function createEagerAdmission({ tools, cwd, sessionId, sessionRef, repeatFailLimit }) {
17
18
  // Streaming-time intra-turn dedup. When the LLM emits two
@@ -63,7 +64,7 @@ export function createEagerAdmission({ tools, cwd, sessionId, sessionRef, repeat
63
64
  // Authorization precedes cache lookup and dedup, not just IO.
64
65
  if (preDispatchDenyForSession(sessionRef, call) !== null) return null;
65
66
  const sig = _intraTurnSig(call.name, call.arguments);
66
- const dedupEligible = isToolCallDedupEligible(call.name, tools);
67
+ const dedupEligible = isToolCallDedupEligible(call.name, bridgeClassificationTools(tools, [call]));
67
68
  if (dedupEligible && _eagerInFlightSigs.has(sig)) return null;
68
69
  // Repeat-failure guard also gates eager dispatch (reviewer-flagged):
69
70
  // streaming onToolCall / startEagerRun would otherwise re-run an
@@ -75,7 +76,7 @@ export function createEagerAdmission({ tools, cwd, sessionId, sessionRef, repeat
75
76
  // The same cache policy authorizes both serial cache hits and short
76
77
  // cross-turn references. Recheck there: an entry can expire or be
77
78
  // invalidated between streaming admission and serial consumption.
78
- if (lookupToolResultReuse({ sessionId, call, cwd, touch: false }) !== null) return null;
79
+ if (lookupToolResultReuse({ sessionId, call, cwd, touch: false, sessionRef }) !== null) return null;
79
80
  return { sig, dedupEligible };
80
81
  }
81
82
 
@@ -10,6 +10,7 @@ import { createEagerBarriers } from './eager-dispatch/barriers.mjs';
10
10
  import { createEagerEntry, runEagerEntry } from './eager-dispatch/entry.mjs';
11
11
  import { executeTool } from './loop/tool-exec.mjs';
12
12
  import { isParallelDispatchable } from './loop/tool-helpers.mjs';
13
+ import { resolveExecutionToolCall } from './loop/tool-call-resolution.mjs';
13
14
 
14
15
  export function createEagerDispatcher({
15
16
  tools,
@@ -45,9 +46,13 @@ export function createEagerDispatcher({
45
46
  iteration: getNextIteration(),
46
47
  localSearchTelemetry: entry.localSearchTelemetry,
47
48
  resultTelemetry: entry.resultTelemetry,
49
+ ...(call.wireCall ? { bridgeWireCall: call.wireCall } : {}),
48
50
  });
49
51
 
50
- const startEagerTool = (call) => {
52
+ const startEagerTool = (wireCall) => {
53
+ // Streamed call_tool requests are admitted, ordered and executed as their
54
+ // targets; a projection error is answered by the serial batch instead.
55
+ const call = resolveExecutionToolCall(wireCall, sessionRef);
51
56
  if (!call?.id || pending.has(call.id) || !isParallelDispatchable(call.name)) return null;
52
57
  const admitted = admission.admit(call);
53
58
  if (!admitted) return null;
@@ -0,0 +1,10 @@
1
+ // Named sessions no longer receive automatic tombstones. Ownerless legacy
2
+ // records still follow idle retention, so their closures are not historical.
3
+ export function isHistoricalAutomaticClosure(session) {
4
+ return (
5
+ typeof session?.owner === 'string' &&
6
+ session.owner.length > 0 &&
7
+ (session?.closed === true || session?.status === 'closed') &&
8
+ (session.closedReason === 'idle-sweep' || session.closedReason === 'terminal-reap')
9
+ );
10
+ }
@@ -100,15 +100,12 @@ export function buildIntermediateAssistantMessage(resp, opts) {
100
100
  // recovery, and interruption; deferBodies keeps mutation bodies verbatim for
101
101
  // the rest of the session (collapsing them later rewrote an already-cached
102
102
  // prefix and re-billed the request uncached).
103
- export function buildToolCallAssistantMessage(response, { calls, suppressMidTurnText, opts }) {
103
+ export function buildToolCallAssistantMessage(response, { calls, opts }) {
104
104
  return attachAssistantTranscriptMetadata(
105
105
  {
106
106
  role: 'assistant',
107
107
  createdAt: Date.now(),
108
- // Sub-agent tool-call turns carry only mid-turn preamble in
109
- // response.content (the real result rides the later final-answer
110
- // turn). Blank it so it never accumulates as input tokens.
111
- content: suppressMidTurnText ? '' : response.content || '',
108
+ content: response.content || '',
112
109
  toolCalls: compactToolCallsForHistory(calls, { deferBodies: true }),
113
110
  ...assistantEchoFields(assistantEchoPayloads(response, { keepAssistantBlocks: true })),
114
111
  },
@@ -7,6 +7,7 @@ import {
7
7
  contextMessagesSignature,
8
8
  estimateMessagesTokens,
9
9
  estimateRequestReserveTokens,
10
+ estimateToolSchemaTokens,
10
11
  providerTokenCalibration,
11
12
  resolveSessionCompactPolicy,
12
13
  toolSchemaSignature,
@@ -18,6 +19,7 @@ import { positiveInt } from '../../../../shared/numbers.mjs';
18
19
  import { isAgentOwner } from '../../agent-owner.mjs';
19
20
  import { providerInputExcludesCache, providerNativePdf } from '../../providers/registry.mjs';
20
21
  import { contentMediaBytes, contentMediaCount } from '../../providers/media-normalization.mjs';
22
+ import { splitProtectedContext } from '../compact/messages.mjs';
21
23
 
22
24
  // Unified context-share rule (compact/constants.mjs CONTEXT_SHARE_RATIO): the
23
25
  // post-compaction target is 25% of the boundary/context window. One
@@ -589,6 +591,93 @@ export function compactTargetBudget(policy) {
589
591
  const singleShot = policy?.singleShot === true || (rawTrigger > 0 && reserve >= rawTrigger);
590
592
  return compactTargetBudgetForTrigger(rawBoundary, rawTarget, reserve, rawTrigger, singleShot, policy?.force === true);
591
593
  }
594
+ const OVERHEAD_TOP_TOOLS = 5;
595
+
596
+ /**
597
+ * The per-request overhead no compaction can shrink — the finalized wire tool
598
+ * schemas (policy.requestReserveTokens), the protected system/fixed prompt
599
+ * every compaction keeps verbatim, and the configured operator headroom — in
600
+ * the provider-scale units of the compact boundary (calibrated estimates, the
601
+ * configured headroom as configured). Only that fixed estimate can justify a
602
+ * refusal; a provider reading aligned to this prefix and these tool schemas
603
+ * can only withdraw one (it includes compactable history). Null unless the
604
+ * fixed part reaches the boundary: kind 'fixed_overhead' when schemas +
605
+ * system alone do, 'configured_reserve' when the configured headroom pushes
606
+ * the fixed part there.
607
+ */
608
+ export function fixedRequestOverhead(policy, messages, tools, sessionRef = null) {
609
+ if (!policy?.auto) return null;
610
+ const boundary = positiveInt(policy.boundaryTokens);
611
+ if (!boundary) return null;
612
+ const calibration = policyTokenCalibration(policy);
613
+ const toProviderScale = (raw) => Math.ceil(Math.max(0, raw) * calibration);
614
+ const toolTokens = toProviderScale(policyRequestReserveTokens(policy));
615
+ const systemTokens = toProviderScale(estimateMessagesTokens(splitProtectedContext(messages || []).protectedPrefix));
616
+ const configuredReserve = Math.max(0, Number(policy.configuredReserveTokens) || 0);
617
+ const fixed = toolTokens + systemTokens;
618
+ // A provider reading of this very prefix with these very tools measured
619
+ // the whole request, compactable history included: an upper bound of the
620
+ // fixed part, never proof of it. When it is not above the estimate, the
621
+ // estimate is known to overstate the fixed part by an unknown amount, so
622
+ // nothing here can show that compaction is futile.
623
+ const measuredRequestTokens = measuredFixedRequestTokens(sessionRef, messages, policy);
624
+ if (measuredRequestTokens !== null && measuredRequestTokens <= fixed) return null;
625
+ // Refuse only when the fixed part itself (plus the headroom, for the
626
+ // reserve kind) reaches the boundary — never on a near miss of a heuristic
627
+ // estimate: those requests compact or go out, and the provider's own
628
+ // overflow handling decides.
629
+ let kind = null;
630
+ if (fixed >= boundary) kind = 'fixed_overhead';
631
+ else if (configuredReserve > 0 && fixed + configuredReserve >= boundary) kind = 'configured_reserve';
632
+ if (!kind) return null;
633
+ const counted = (Array.isArray(tools) ? tools : []).filter(
634
+ (tool) => tool?.deferLoading !== true && tool?.defer_loading !== true
635
+ );
636
+ const largestTools = counted
637
+ .map((tool) => ({
638
+ name: String(tool?.name || tool?.type || 'tool'),
639
+ tokens: toProviderScale(estimateToolSchemaTokens([tool])),
640
+ }))
641
+ .sort((a, b) => b.tokens - a.tokens || a.name.localeCompare(b.name))
642
+ .slice(0, OVERHEAD_TOP_TOOLS);
643
+ return {
644
+ kind,
645
+ contextWindowTokens: positiveInt(policy.contextWindow) || boundary,
646
+ boundaryTokens: boundary,
647
+ toolCount: counted.length,
648
+ toolTokens,
649
+ systemTokens,
650
+ configuredReserveTokens: configuredReserve,
651
+ measuredRequestTokens,
652
+ largestTools,
653
+ };
654
+ }
655
+
656
+ /**
657
+ * Identity of the fixed inputs fixedRequestOverhead judges: the wire tool
658
+ * schemas, the protected system context, the configured headroom and the
659
+ * boundary. A verdict holds while this is unchanged; the provider reading is
660
+ * deliberately not part of it (compaction clears it, fixed overhead stays).
661
+ */
662
+ export function fixedRequestOverheadInputs(policy, messages) {
663
+ if (!policy?.auto) return null;
664
+ return JSON.stringify([
665
+ policy.toolSchemaSignature || '',
666
+ contextMessagesSignature(splitProtectedContext(messages || []).protectedPrefix),
667
+ Math.max(0, Number(policy.configuredReserveTokens) || 0),
668
+ positiveInt(policy.boundaryTokens) || 0,
669
+ ]);
670
+ }
671
+
672
+ // The provider-measured size of the last request when it still describes
673
+ // this transcript prefix and was sent with the same tool schemas; else null.
674
+ function measuredFixedRequestTokens(sessionRef, messages, policy) {
675
+ if (!sessionRef || !Array.isArray(messages)) return null;
676
+ const aligned = providerBaselineCoverage(sessionRef, messages);
677
+ if (!aligned?.toolSignature || aligned.toolSignature !== policy?.toolSchemaSignature) return null;
678
+ return aligned.tokens;
679
+ }
680
+
592
681
  // Anthropic refuses a request body over 32 MB (HTTP 413) however few tokens it
593
682
  // holds, and inline media is what gets there: an image is priced at no more
594
683
  // than ~1.6k tokens yet carries up to 5 MB of base64. Tool-result media is the
@@ -707,7 +796,6 @@ function compactionTelemetryRecord(sessionRef, policy, meta, prev) {
707
796
  return {
708
797
  ...prev,
709
798
  auto: policy.auto !== false,
710
- reservedTokens: policy.configuredReserveTokens || prev.reservedTokens || null,
711
799
  requestReserveTokens: policy.requestReserveTokens || 0,
712
800
  reserveTokens: policy.reserveTokens || 0,
713
801
  boundaryTokens: policy.boundaryTokens || null,
@@ -37,7 +37,7 @@ export function crossTurnSignature(name, args) {
37
37
  // they must not reset the escalation ladder's "zero edit" condition. Skill /
38
38
  // recall / agent / task / cwd / load_tool are exploration/meta plumbing.
39
39
  // (tool_search kept as legacy alias for old transcripts.)
40
- const NON_PROGRESS_TOOLS = new Set(['Skill', 'recall', 'agent', 'task', 'cwd', 'load_tool', 'tool_search']);
40
+ const NON_PROGRESS_TOOLS = new Set(['Skill', 'recall', 'agent', 'task', 'cwd', 'session', 'load_tool', 'tool_search']);
41
41
 
42
42
  // True when a successfully-executed tool represents real edit/progress. A tool
43
43
  // counts as progress only if its def lacks readOnlyHint (not eager) AND it is
@@ -46,6 +46,62 @@ export function agentContextOverflowError(
46
46
  );
47
47
  }
48
48
 
49
+ export const TOOL_SURFACE_EXCEEDS_CONTEXT = 'TOOL_SURFACE_EXCEEDS_CONTEXT';
50
+
51
+ const tokens = (value) => `${Number(value || 0).toLocaleString('en-US')} tokens`;
52
+
53
+ // Distinct from AgentContextOverflowError: the request's FIXED overhead (tool
54
+ // definitions, protected system context, configured headroom) leaves no room
55
+ // for any history, so compacting the history cannot help and is not tried.
56
+ // The wording avoids provider context-overflow phrasing on purpose: this is
57
+ // not a "conversation too long" refusal and must not be routed as one.
58
+ export class ToolSurfaceExceedsContextError extends Error {
59
+ constructor({ sessionId, provider, model, overhead }) {
60
+ const target = [provider, model].filter(Boolean).join('/') || 'this model';
61
+ const reserve = overhead.kind === 'configured_reserve';
62
+ const headline = reserve
63
+ ? 'The configured compaction headroom leaves no room for conversation history'
64
+ : 'Tool definitions and system context leave no room for conversation history';
65
+ const fewerReservedHint =
66
+ overhead.configuredReserveTokens > 0 ? ', or configure fewer reserved tokens (compaction.reservedTokens)' : '';
67
+ const remedy = reserve
68
+ ? 'Lower the configured headroom (compaction.reservedTokens or MIXDOG_AGENT_COMPACT_RESERVED_TOKENS), or use a model with a larger context window.'
69
+ : `Use a model with a larger context window, or send a smaller eager tool surface (disable MCP servers or custom tools this session does not need)${fewerReservedHint}.`;
70
+ const largest = overhead.largestTools.map((tool) => `${tool.name} (${tokens(tool.tokens)})`).join(', ');
71
+ super(
72
+ [
73
+ `${headline} (${TOOL_SURFACE_EXCEEDS_CONTEXT}).`,
74
+ `${target}: context window ${tokens(overhead.contextWindowTokens)}, compaction boundary ${tokens(overhead.boundaryTokens)}.`,
75
+ `Fixed per-request overhead: tool definitions ${tokens(overhead.toolTokens)} (${overhead.toolCount} tools), ` +
76
+ `protected system context ${tokens(overhead.systemTokens)}, configured headroom ${tokens(overhead.configuredReserveTokens)}; ` +
77
+ 'nothing remains for conversation history.',
78
+ ...(overhead.measuredRequestTokens
79
+ ? [`The provider measured the last request at ${tokens(overhead.measuredRequestTokens)}.`]
80
+ : []),
81
+ 'Compacting the conversation history cannot reduce these.',
82
+ remedy,
83
+ ...(largest ? [`Largest tool definitions: ${largest}.`] : []),
84
+ ].join('\n')
85
+ );
86
+ this.name = 'ToolSurfaceExceedsContextError';
87
+ this.code = TOOL_SURFACE_EXCEEDS_CONTEXT;
88
+ this.sessionId = sessionId || null;
89
+ this.provider = provider || null;
90
+ this.model = model || null;
91
+ this.overheadKind = overhead.kind;
92
+ this.overhead = overhead;
93
+ }
94
+ }
95
+
96
+ export function toolSurfaceExceedsContextError({ sessionId, sessionRef, model, overhead }) {
97
+ return new ToolSurfaceExceedsContextError({
98
+ sessionId,
99
+ provider: sessionRef?.provider || null,
100
+ model: sessionRef?.model || model || null,
101
+ overhead,
102
+ });
103
+ }
104
+
49
105
  // Distinct from AgentContextOverflowError: the compaction pipeline itself
50
106
  // failed (handoff-summary error, dead Memory runtime,
51
107
  // etc.). This is NOT "latest turn cannot fit the context budget" — masking it
@@ -1,12 +1,10 @@
1
1
  // Deferred catalog call-through: inactive catalog tool_use → discovery bookkeeping
2
2
  // then normal executeTool routing (runtime errors only; no pre-dispatch schema).
3
3
  import { clean } from '../../runtime-core/session-text.mjs';
4
- import {
5
- deferredCatalogUnion,
6
- isReadonlySelectable,
7
- selectDeferredTools,
8
- } from '../../runtime-core/tool-catalog.mjs';
4
+ import { deferredCatalogUnion, isReadonlySelectable, selectDeferredTools } from '../../runtime-core/tool-catalog.mjs';
9
5
  import { isDeferredToolAvailable } from '../../runtime-core/deferred-tool-availability.mjs';
6
+ import { routeToolExclusionReason } from './provider-tool-exclusions.mjs';
7
+ import { isBridgeReadonlySession, isToolBridgeEnabled } from '../../runtime-core/tool-bridge.mjs';
10
8
 
11
9
  /** Skill-list plumbing only; mutation/MCP/builtins must use the catalog+mode gate. */
12
10
  const INACTIVE_INFRA_BYPASS = new Set(['skills_list', 'skill_view']);
@@ -41,7 +39,7 @@ function toolExecutesWhenInactive(name) {
41
39
  return INACTIVE_INFRA_BYPASS.has(name);
42
40
  }
43
41
 
44
- function resolveDeferredSelectMode(session) {
42
+ export function resolveDeferredSelectMode(session) {
45
43
  const spec = session?.toolSpec;
46
44
  if (spec == null || spec === '') return null;
47
45
  if (spec === 'readonly') return 'readonly';
@@ -89,20 +87,32 @@ export function prepareDeferredToolCallThrough(sessionRef, name) {
89
87
  }
90
88
  const tool = lookupDeferredCatalogTool(sessionRef, name);
91
89
  if (!tool) return null;
90
+ const routeExclusion = isToolBridgeEnabled(sessionRef) ? null : routeToolExclusionReason(sessionRef, tool);
91
+ if (routeExclusion) return denyDeferredCallThrough(`Error: ${routeExclusion}`);
92
92
  if (isActiveSessionTool(sessionRef, name)) return null;
93
93
  if (toolExecutesWhenInactive(name)) return null;
94
94
 
95
95
  const toolLabel = clean(tool.name) || clean(name) || 'tool';
96
+ const bridge = isToolBridgeEnabled(sessionRef);
96
97
  const resolvedMode = resolveDeferredSelectMode(sessionRef);
98
+ // Whatever the exposure, a deferred mutating tool never runs without a
99
+ // resolved tool mode, and never in a read-only one.
97
100
  if (resolvedMode === null) {
98
101
  if (!isReadonlySelectable(tool)) {
102
+ const remedy = bridge ? 'no call was sent.' : `load it with load_tool names:["${toolLabel}"].`;
99
103
  return denyDeferredCallThrough(
100
- `Error: tool "${toolLabel}" is deferred and cannot be auto-loaded without a resolved tool mode; load it with load_tool names:["${toolLabel}"].`
104
+ `Error: tool "${toolLabel}" is deferred and cannot be auto-loaded without a resolved tool mode; ${remedy}`
101
105
  );
102
106
  }
103
- } else if (resolvedMode === 'readonly' && !isReadonlySelectable(tool)) {
107
+ } else if (
108
+ (resolvedMode === 'readonly' || (bridge && isBridgeReadonlySession(sessionRef))) &&
109
+ !isReadonlySelectable(tool)
110
+ ) {
104
111
  return denyDeferredCallThrough(`Error: tool "${toolLabel}" is not available in readonly mode`);
105
112
  }
113
+ // Bridge sessions reach deferred tools through call_tool: the fixed
114
+ // provider surface is never extended.
115
+ if (bridge) return null;
106
116
 
107
117
  const selectMode = resolvedMode === null ? 'readonly' : resolvedMode;
108
118
  selectDeferredTools(sessionRef, [toolLabel], selectMode);
@@ -3,7 +3,6 @@
3
3
  * request-loop bookkeeping, plus the
4
4
  * helpers every phase shares (abort check, steering drain, no-tool resolver).
5
5
  */
6
- import { isAgentOwner } from '../../agent-owner.mjs';
7
6
  import { SessionClosedError } from '../manager/session-errors.mjs';
8
7
  import { resolveLiveToolCwd } from './tool-exec.mjs';
9
8
  import { createSteeringDrain } from './steering.mjs';
@@ -20,19 +19,6 @@ export const REPEAT_FAIL_LIMIT = 3;
20
19
  // (drop-oldest / insertion order).
21
20
  export const CROSS_TURN_CAP = 500;
22
21
 
23
- // Agent mid-turn text is suppressed unless THIS send explicitly requested a
24
- // live projection. The request is a send-opt (`liveProjection`) — never a
25
- // durable session field — so a transient Agent pane cannot leak into later
26
- // silent dispatches or stored session JSON. The standalone surface still
27
- // flips `interactiveSessionSurface` on the in-memory session; honor that
28
- // in-process hint without treating it as something dispatch should persist.
29
- export function shouldSuppressAgentMidTurnText(sessionRef, opts = {}) {
30
- if (!isAgentOwner(sessionRef)) return false;
31
- if (opts?.liveProjection === true) return false;
32
- if (sessionRef?.interactiveSessionSurface === true) return false;
33
- return true;
34
- }
35
-
36
22
  export function createLoopState({ provider, messages, model, tools, cwd, sendOpts }) {
37
23
  const opts = sendOpts || {};
38
24
  const sessionId = opts.sessionId || null;
@@ -44,17 +30,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
44
30
  if (sessionRef && Object.hasOwn(sessionRef, '_providerToolSurfaceSnapshot')) {
45
31
  delete sessionRef._providerToolSurfaceSnapshot;
46
32
  }
47
- // Sub-agent (worker/heavy-worker/reviewer/…) sessions drop mid-turn
48
- // assistant preamble text outright. Only the final <final-answer> reply is
49
- // consumed by Lead, so any "Now let me…" prose that precedes a tool call is
50
- // pure noise — for live surfacing AND for the agent's own history (where it
51
- // re-enters context as input tokens on every later turn):
52
- // - streaming : opts.onTextDelta suppressed (token-by-token preamble)
53
- // - buffered : opts.onAssistantText skipped (response.content)
54
- // - history : tool-call turn content blanked before messages.push
55
- // Reasoning/thinking deltas, tool calls, and the final answer are kept.
56
- const suppressMidTurnText = shouldSuppressAgentMidTurnText(sessionRef, opts);
57
- if (suppressMidTurnText) opts.onTextDelta = undefined;
58
33
  // Out-of-loop transcript mutations (post-turn/manual compaction in
59
34
  // manager/compaction-runner.mjs) run where no send opts exist; they park a
60
35
  // one-shot intent on the session so the FIRST send of the next turn tags
@@ -74,7 +49,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
74
49
  sessionRef,
75
50
  sessionAgent: opts.session?.agent,
76
51
  forcedFirstTool: opts.forcedFirstTool ?? null,
77
- suppressMidTurnText,
78
52
  // sessionRef.cwd is the live SSOT. The legacy positional cwd is only the
79
53
  // turn-start snapshot and becomes stale after an in-turn cwd tool call.
80
54
  cwd: resolveLiveToolCwd(cwd, sessionRef),
@@ -114,6 +88,7 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
114
88
  // One-shot repair of an assistant turn whose stored reasoning replay the
115
89
  // API refuses to take back (see thinking-replay-recovery.mjs).
116
90
  thinkingReplayRepairUsed: false,
91
+ toolSchemaDropUsed: false,
117
92
  // Pending image-strip retry: identities of the images every attempt leaves
118
93
  // out until a send succeeds, and whether to heal them from history then.
119
94
  imageStrip: null,
@@ -156,7 +131,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
156
131
  opts,
157
132
  sessionId,
158
133
  sessionAgent: state.sessionAgent,
159
- suppressMidTurnText,
160
134
  drainSteering: state.drainSteering,
161
135
  });
162
136
  return state;
@@ -20,7 +20,7 @@ function resumePrompt(response, attempt) {
20
20
  }
21
21
 
22
22
  export function resolveOutputLimit(response, { state, segments, messages }) {
23
- segments.record(response.content, { keepWhenSuppressed: true });
23
+ segments.record(response.content);
24
24
  if (state.maxOutputRecoveryCount < MAX_OUTPUT_RECOVERY_LIMIT) {
25
25
  // The partial assistant turn must be visible to the model so it can
26
26
  // resume at the exact cutoff instead of reconstructing or repeating