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
@@ -7,7 +7,7 @@ import { getProvider } from '../../providers/registry.mjs';
7
7
  import { invalidateContextUsageSnapshot, invalidateProviderContextBaseline } from '../loop/compact-policy.mjs';
8
8
  import { saveSession, saveSessionAsync, saveSessionAsyncDeferred, loadSession, setLiveSession } from '../store.mjs';
9
9
  import { _liveSessions } from '../store/live-state.mjs';
10
- import { _isActivelyOwnedElsewhere, _recoverTurnCheckpointDurably } from './session-owner-liveness.mjs';
10
+ import { _recoverTurnCheckpointDurably } from './turn-checkpoint-recovery.mjs';
11
11
  import { isAgentOwner } from '../../agent-owner.mjs';
12
12
  import { getHiddenAgent } from '../../internal-agents.mjs';
13
13
  import { loadConfig } from '../../config.mjs';
@@ -37,13 +37,15 @@ import { getAgentRuntimeSync, warnAgentRuntimeResolveFailureOnce } from './agent
37
37
  import { ensureCodexWireSessionId, mintSessionId } from './session-id.mjs';
38
38
  import { providerCacheKey } from './provider-cache-key.mjs';
39
39
  import { buildSessionRecord, normalizeDesktopSessionMetadata, sessionOriginFields } from './session-record.mjs';
40
- import { refreshSessionBp3Environment } from './prompt-utils.mjs';
40
+ import { normalizeWorkflowRoute } from '../../runtime-core/workflow.mjs';
41
+ import { applyPendingWorkspaceReroot, refreshSessionBp3Environment } from './prompt-utils.mjs';
41
42
  import { isWorktreeBound } from '../../../../shared/worktrees/contract.mjs';
43
+ import { applyAgentToolExposure } from '../loop/tool-exposure-migration.mjs';
44
+ import { prewarmSessionAutoEffort } from './ask-turn-auto-effort.mjs';
42
45
 
43
- // Owner liveness (attach-on-resume guard) and the durable turn-checkpoint
44
- // recovery it gates; re-exported so prior importers of this module stay
45
- // unchanged.
46
- export { isSessionOwnerGone, recoverSessionAfterProcessRestart } from './session-owner-liveness.mjs';
46
+ // Durable turn-checkpoint recovery; re-exported so prior importers of this
47
+ // module stay unchanged.
48
+ export { recoverSessionAfterProcessRestart } from './turn-checkpoint-recovery.mjs';
47
49
  // Prepared-surface cache warmers (desktop hover prefetch, pane projection);
48
50
  // re-exported so prior importers of this module stay unchanged.
49
51
  export { prefetchSession, prepareSessionProjection } from './prepared-resume-cache.mjs';
@@ -210,6 +212,11 @@ export function createSession(opts) {
210
212
  const { profile } = resolved;
211
213
  const route = resolveSessionRoute(opts, presetObj, profile);
212
214
  const { providerName, modelName, provider, toolPreset, id } = route;
215
+ const routeFallbacks = normalizeWorkflowRoute({
216
+ provider: providerName,
217
+ model: modelName,
218
+ fallbacks: Object.hasOwn(opts, 'routeFallbacks') ? opts.routeFallbacks : presetObj?.fallbacks,
219
+ })?.fallbacks;
213
220
  // Provider cache strategy — agentRuntime.resolveSync() above is a
214
221
  // best-effort injection point (setAgentRuntime() has no live caller
215
222
  // today, so that branch never fires); build it directly here so every
@@ -217,11 +224,7 @@ export function createSession(opts) {
217
224
  // 'lead', or no agent at all — raw/CLI callers) get their BP4 message
218
225
  // tail TTL linked to the user's autoClear idle-sweep config; hidden and
219
226
  // public agents keep the flat 5m default (see cache-strategy.mjs docs).
220
- // Scoped to explicit-breakpoint (Anthropic-family) providers only — the
221
- // non-Anthropic branches of buildProviderCacheOpts (e.g. the 'openai'
222
- // cacheRetention:'24h' shape) were never exercised by createSession
223
- // before this change, and are left untouched to avoid altering live
224
- // OpenAI/other-provider request shape as a side effect of this fix.
227
+ // Scoped to explicit-breakpoint (Anthropic-family) providers only.
225
228
  const providerCacheOpts = resolved.providerCacheOpts || buildSessionProviderCacheOpts(providerName, id, opts.agent);
226
229
  const surface = resolveSessionToolSurface(opts, { profile, toolPreset, modelName });
227
230
  const prompt = composeSessionSystem(opts, { profile, providerName, modelName, surface });
@@ -243,11 +246,15 @@ export function createSession(opts) {
243
246
  origin: sessionOriginFields(opts, { profile, presetObj, providerCacheOpts, surface }),
244
247
  });
245
248
  session.providerCacheOptsOverride = Boolean(resolved.providerCacheOpts);
249
+ if (routeFallbacks?.length) session.routeFallbacks = routeFallbacks;
250
+ // A non-native agent sends core + bridge, built from its filtered tools.
251
+ applyAgentToolExposure(session);
246
252
  refreshSessionBp3Environment(session, opts.cwd);
247
253
  // In-process registry + async debounced save: same-process create → load
248
254
  // reads live memory; disk flush is for cross-process / restart durability.
249
255
  setLiveSession(session);
250
256
  saveSession(session);
257
+ prewarmSessionAutoEffort(session, provider);
251
258
  return session;
252
259
  }
253
260
 
@@ -367,6 +374,11 @@ function resetSessionForRouteChange(id, session, previousModel, previousProvider
367
374
  session.lastContextTokensUpdatedAt = Date.now();
368
375
  session.lastContextTokensStaleAfterCompact = false;
369
376
  session.providerState = undefined;
377
+ // The previous route's prefix snapshot measured another prompt (model line,
378
+ // stripped replay); the new chain baselines on its first send.
379
+ delete session._providerPrefixGuardState;
380
+ // The new route resolves its own wire before its first request.
381
+ session.wireRoute = null;
370
382
  const prepared = _prepareResumeTools(session, session.preset || 'full');
371
383
  session.tools = prepared.tools;
372
384
  session.toolSpec = prepared.toolSpec;
@@ -384,6 +396,7 @@ function resetSessionForRouteChange(id, session, previousModel, previousProvider
384
396
  ]) {
385
397
  if (Array.isArray(session[key])) session[key] = filterModelEditToolNames(session[key], session.model);
386
398
  }
399
+ applyAgentToolExposure(session, { existing: true });
387
400
  _refreshSessionRuleVariantsForModel(session, previousModel, previousProvider);
388
401
  _forgetPreparedResume(id);
389
402
  }
@@ -436,6 +449,9 @@ export function updateSessionRoute(id, route = {}, options = {}) {
436
449
  // route and set sessionStartMetaInjected, so the ask-time refresh guard
437
450
  // skips it and an empty-session route change would otherwise keep the old
438
451
  // model line in the system prompt (model self-identity confusion).
452
+ // A new route starts a cold cache: a staged working-folder change re-roots
453
+ // the prompt now instead of riding a notice.
454
+ if (routeChanged) applyPendingWorkspaceReroot(session);
439
455
  refreshSessionBp3Environment(session, session.cwd);
440
456
  session.updatedAt = Date.now();
441
457
  setLiveSession(session);
@@ -448,9 +464,8 @@ export function updateSessionRoute(id, route = {}, options = {}) {
448
464
  }
449
465
 
450
466
  // --- resume (reload tools for a stored session) ---
451
- // Whether another live process is driving the session (and therefore whether
452
- // this resume attaches as a viewer) is decided by session-owner-liveness.mjs;
453
- // the prepared tool surface it consumes is cached in prepared-resume-cache.mjs.
467
+ // Interrupted-turn recovery lives in turn-checkpoint-recovery.mjs; the
468
+ // prepared tool surface it consumes is cached in prepared-resume-cache.mjs.
454
469
 
455
470
  // Desktop callers pass their selected durable classification as a
456
471
  // capability check. Refuse a stale/tampered cross-class resume before any
@@ -484,25 +499,6 @@ function _applyDesktopResumeScope(session, options) {
484
499
  return true;
485
500
  }
486
501
 
487
- // ATTACH (viewer mode, zero ownership): hand back the live transcript
488
- // under the SAME id, flagged remoteAttached. No tool refresh, no save,
489
- // no generation claim — the session file remains exclusively the
490
- // owner's. session-turn-api routes this surface's submits into the
491
- // shared pending spool instead of running a local turn.
492
- function _attachViewerSession(session, sessionId) {
493
- const attached = { ...session, remoteAttached: true };
494
- delete attached.liveTurnMessages;
495
- delete attached.toolApprovalHook;
496
- if (process.env.MIXDOG_DEBUG_SESSION_LOG) {
497
- try {
498
- process.stderr.write(`[session] attach-on-resume: ${sessionId} is live elsewhere → viewer attach\n`);
499
- } catch {
500
- /* best-effort */
501
- }
502
- }
503
- return attached;
504
- }
505
-
506
502
  // Refreshes the session's tool surface from the prepared resume when it still
507
503
  // matches, warning about tools the preset no longer offers.
508
504
  function _refreshResumedTools(session, sessionId, preset) {
@@ -513,7 +509,12 @@ function _refreshResumedTools(session, sessionId, preset) {
513
509
  // Keep the persisted tool mode in sync on resume (see createSession note).
514
510
  session.toolSpec = prepared.toolSpec;
515
511
  session.tools = prepared.tools;
516
- const missing = oldTools.filter((t) => !session.tools.find((n) => n.name === t.name));
512
+ applyAgentToolExposure(session, { existing: true });
513
+ // A bridge surface keeps the rest of its tools in the catalog.
514
+ const available = new Set(
515
+ [...session.tools, ...(session.deferredToolCatalog || [])].map((tool) => tool?.name).filter(Boolean)
516
+ );
517
+ const missing = oldTools.filter((t) => !available.has(t.name));
517
518
  if (missing.length) {
518
519
  process.stderr.write(
519
520
  `[session] Warning: ${missing.length} tools no longer available: ${missing.map((t) => t.name).join(', ')}\n`
@@ -534,7 +535,6 @@ export async function resumeSession(sessionId, preset, options = {}) {
534
535
  if (Object.hasOwn(options, 'mcpScopeId')) {
535
536
  session.mcpScopeId = String(options.mcpScopeId || '').trim() || null;
536
537
  }
537
- if (_isActivelyOwnedElsewhere(session, sessionId)) return _attachViewerSession(session, sessionId);
538
538
  _recoverTurnCheckpointDurably(session, sessionId);
539
539
  _refreshResumedTools(session, sessionId, preset);
540
540
  refreshSessionProviderCacheOpts(session);
@@ -546,5 +546,6 @@ export async function resumeSession(sessionId, preset, options = {}) {
546
546
  process.stderr.write(`[session] resume save failed: ${err?.message || err}\n`);
547
547
  } catch {}
548
548
  });
549
+ prewarmSessionAutoEffort(session, session.provider ? getProvider(session.provider) : null);
549
550
  return session;
550
551
  }
@@ -18,6 +18,7 @@ import {
18
18
  } from '../../tools/builtin/runtime-capabilities.mjs';
19
19
  import { captureOriginalUserCwd } from '../../../../shared/user-cwd.mjs';
20
20
  import { delegationDisabled } from './session-tool-surface.mjs';
21
+ import { contextAckMessage } from '../compact/user-message-kind.mjs';
21
22
 
22
23
  // Preserve the exact pre-layout environment payload: Lead carried the
23
24
  // shell preference in Profile Preferences, while any routing surface with
@@ -89,6 +90,23 @@ export function buildWorkspacePromptContext(session, cwd) {
89
90
 
90
91
  // BP1/BP2/BP3 rule blocks plus the volatile environment, composed into the
91
92
  // four system blocks; environmentTailContext is the persisted env tail.
93
+ export function sessionRolePromptFields(identity, { ownerIsAgent, toolFreeRole, delegationFree }) {
94
+ const skipRules = identity.skipAgentRules || toolFreeRole;
95
+ let roleRules = '';
96
+ if (!skipRules) {
97
+ roleRules = ownerIsAgent
98
+ ? _buildAgentRules(identity.agentRulesProfile)
99
+ : _buildLeadRules({ includeLeadBrief: !delegationFree });
100
+ }
101
+ return {
102
+ roleRules,
103
+ userPrompt: identity.systemPrompt,
104
+ skipRoleCatalog: !ownerIsAgent,
105
+ agent: identity.agent,
106
+ profile: { skip: identity.profileSkip },
107
+ };
108
+ }
109
+
92
110
  export function composeSessionSystem(opts, { profile, providerName, modelName, surface }) {
93
111
  const { ownerIsAgent, resolvedAgent, skills } = surface;
94
112
  // A tool-free hidden role (a one-shot classifier or title writer) carries
@@ -105,12 +123,14 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
105
123
  model: modelName,
106
124
  });
107
125
  const delegationFree = delegationDisabled(opts, ownerIsAgent);
108
- let roleRules = '';
109
- if (!skipAgentRules) {
110
- roleRules = ownerIsAgent
111
- ? _buildAgentRules(surface.agentRulesProfile)
112
- : _buildLeadRules({ includeLeadBrief: !delegationFree });
113
- }
126
+ const promptIdentity = {
127
+ systemPrompt: opts.systemPrompt || '',
128
+ skipAgentRules: opts.skipAgentRules === true,
129
+ profileSkip: { ...profile?.skip },
130
+ agent: resolvedAgent,
131
+ agentRulesProfile: surface.agentRulesProfile,
132
+ };
133
+ const roleFields = sessionRolePromptFields(promptIdentity, { ownerIsAgent, toolFreeRole, delegationFree });
114
134
  const leadOnly = !skipAgentRules && !ownerIsAgent;
115
135
  const metaContext = leadOnly ? _buildLeadMetaContext() : '';
116
136
  // Lead-only response language; closes the environment block so no English
@@ -132,14 +152,10 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
132
152
  ? ''
133
153
  : loadInstructionFilesContext({ mode: configuredInstructionFilesMode(), cwd: opts.cwd });
134
154
  const composed = composeSystemPrompt({
135
- userPrompt: opts.systemPrompt,
155
+ ...roleFields,
136
156
  agentRules: injectedRules || undefined,
137
- roleRules: roleRules || undefined,
138
157
  metaContext: metaContext || undefined,
139
158
  languageContext: languageContext || undefined,
140
- skipRoleCatalog: !ownerIsAgent,
141
- profile: profile || undefined,
142
- agent: resolvedAgent,
143
159
  workflowContext: opts.workflowContext || null,
144
160
  coreMemoryContext: opts.coreMemoryContext || null,
145
161
  instructionFilesContext: instructionFilesContext || null,
@@ -147,7 +163,7 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
147
163
  environmentContext: shellEnvironmentContext,
148
164
  provider: providerName || null,
149
165
  });
150
- return { ...composed, environmentTailContext };
166
+ return { ...composed, environmentTailContext, promptIdentity };
151
167
  }
152
168
 
153
169
  // 4-BP layout (see composeSystemPrompt docs):
@@ -188,7 +204,7 @@ export function seedSessionMessages({ baseRules, stableSystemContext, sessionMar
188
204
  if (files?.length) {
189
205
  const fileContext = files.map((f) => `### ${f.path}\n\`\`\`\n${f.content}\n\`\`\``).join('\n\n');
190
206
  messages.push({ role: 'user', content: `Reference files:\n\n${fileContext}` });
191
- messages.push({ role: 'assistant', content: '.' });
207
+ messages.push(contextAckMessage());
192
208
  }
193
209
  return messages;
194
210
  }
@@ -109,6 +109,9 @@ export function buildSessionRecord({ opts, route, presetObj, surface, prompt, me
109
109
  codexWireSessionId: providerName === 'openai-oauth' ? mintUuidV7() : null,
110
110
  provider: providerName,
111
111
  model: modelName,
112
+ // Resolved and pinned before the first request (wire-route.mjs). null —
113
+ // not absent — marks a session created under the per-model wire table.
114
+ wireRoute: null,
112
115
  messages,
113
116
  contextWindow: contextMeta.contextWindow,
114
117
  rawContextWindow: contextMeta.rawContextWindow,
@@ -135,6 +138,8 @@ export function buildSessionRecord({ opts, route, presetObj, surface, prompt, me
135
138
  agent: opts.agent,
136
139
  owner: opts.owner || 'user',
137
140
  bp3CoreContext: prompt.sessionMarkerCore,
141
+ promptIdentity: prompt.promptIdentity,
142
+ callerDisallowedTools: [...(opts.callerDisallowedTools ?? opts.disallowedTools ?? [])],
138
143
  bp3EnvironmentContext: prompt.environmentTailContext,
139
144
  // BP3 core and the volatile environment live in SEPARATE system
140
145
  // blocks (cacheTier 'tier3' vs 'env'). Legacy persisted sessions
@@ -159,9 +164,7 @@ export function buildSessionRecord({ opts, route, presetObj, surface, prompt, me
159
164
  totalInputTokens: 0,
160
165
  totalOutputTokens: 0,
161
166
  totalToolCalls: 0,
162
- // Refreshed on each completed ask() — surfaced by agent type=list for
163
- // debugging + consumed by store.mjs's idle-sweep to reclaim stalled
164
- // agent sessions past RUNNING_STALL_MS.
167
+ // Refreshed on each completed ask() — surfaced by agent type=list.
165
168
  lastUsedAt: Date.now(),
166
169
  tokensCumulative: 0,
167
170
  ...origin,
@@ -48,6 +48,9 @@ const SESSION_ROUTE_TOOL_RANK = new Map(
48
48
  const FILESYSTEM_TOOL_NAMES = new Set(['code_graph', 'find', 'glob', 'list', 'grep', 'read', 'edit', 'apply_patch']);
49
49
  const READONLY_FS_TOOL_NAMES = new Set(['code_graph', 'find', 'glob', 'list', 'grep', 'read']);
50
50
 
51
+ // Lead-only control tools: never part of a worker/sub-agent session surface.
52
+ export const AGENT_WORKER_DENIED_TOOLS = Object.freeze(new Set(['agent', 'ask_user', 'session']));
53
+
51
54
  export function finalizeSessionToolList(
52
55
  tools,
53
56
  { schemaAllowedTools = null, disallowedTools = null, ownerIsAgent = false } = {}
@@ -64,7 +67,7 @@ export function finalizeSessionToolList(
64
67
  out = out.filter((t) => !denySet.has(String(t?.name || '').toLowerCase()));
65
68
  }
66
69
  if (ownerIsAgent) {
67
- out = out.filter((t) => String(t?.name || '').toLowerCase() !== 'agent');
70
+ out = out.filter((t) => !AGENT_WORKER_DENIED_TOOLS.has(String(t?.name || '').toLowerCase()));
68
71
  out = orderSessionTools(out);
69
72
  }
70
73
  return out;
@@ -0,0 +1,45 @@
1
+ // manager/turn-checkpoint-recovery.mjs
2
+ // Durable recovery of a turn interrupted by a process restart: an interrupted
3
+ // turn checkpoint is committed as interrupted on resume. Every session runs in
4
+ // the daemon, so a turn is live while this process runs it or while another
5
+ // live process owns the daemon; reads never recover a live turn.
6
+ import { join } from 'node:path';
7
+ import { readSingletonOwner } from '../../../../shared/singleton-owner.mjs';
8
+ import { loadSession, saveSession } from '../store.mjs';
9
+ import { dataDir } from '../store-summary-locations.mjs';
10
+ import { runtimeState, isTurnInFlight } from './runtime-state.mjs';
11
+ import { clearTurnCheckpoint, recoverTurnCheckpoint } from './turn-checkpoint.mjs';
12
+
13
+ /** Whether this session's turn may still be running: in flight in this
14
+ * process, or owned by another live process holding the daemon record. */
15
+ export function isSessionTurnLive(sessionId) {
16
+ if (isTurnInFlight(runtimeState.get(sessionId))) return true;
17
+ const { owner, alive } = readSingletonOwner(join(dataDir(), 'daemon-owner.json'));
18
+ return alive && Number(owner.pid) !== process.pid;
19
+ }
20
+
21
+ export function _recoverTurnCheckpointDurably(session, sessionId) {
22
+ const recovery = recoverTurnCheckpoint(session);
23
+ if (!recovery.changed) return recovery;
24
+ // Recovery is a durable reconnect boundary, not a renderer-only view.
25
+ // Persist before removing the checkpoint so a second crash leaves at
26
+ // least one complete copy of the interrupted turn.
27
+ saveSession(session, {
28
+ sync: true,
29
+ expectedGeneration: session.generation,
30
+ });
31
+ if (recovery.turnToken) {
32
+ clearTurnCheckpoint(sessionId, recovery.turnToken);
33
+ }
34
+ return recovery;
35
+ }
36
+
37
+ // Reconnect-safe historical read used by desktop pane peeks. Unlike a normal
38
+ // read-only load, it resolves a dead owner's durable turn checkpoint before
39
+ // returning the transcript; a live turn is returned untouched.
40
+ export function recoverSessionAfterProcessRestart(sessionId) {
41
+ const session = loadSession(sessionId);
42
+ if (!session || session.closed === true || isSessionTurnLive(sessionId)) return session || null;
43
+ _recoverTurnCheckpointDurably(session, sessionId);
44
+ return session;
45
+ }
@@ -2,7 +2,7 @@
2
2
  // Thin facade over the split session-manager modules in ./manager/.
3
3
  //
4
4
  // Module map:
5
- // manager/runtime-liveness.mjs — in-memory stage/heartbeat + accessors
5
+ // manager/runtime-liveness.mjs — in-memory stage/progress + accessors
6
6
  // manager/tool-resolution.mjs — tool policy resolution/narrowing
7
7
  // manager/context-meta.mjs — context-window / compact-trigger meta
8
8
  // manager/prompt-utils.mjs — prompt content shaping helpers
@@ -45,6 +45,7 @@ export {
45
45
  markSessionError,
46
46
  markSessionCancelled,
47
47
  getSessionRuntime,
48
+ isSessionTurnInFlight,
48
49
  isSessionCompactionBlocked,
49
50
  getSessionProgressSnapshot,
50
51
  forEachSessionRuntime,
@@ -59,19 +60,12 @@ export { previewSessionTools } from './manager/tool-resolution.mjs';
59
60
  export {
60
61
  _mergePendingMessageEntries,
61
62
  enqueuePendingMessage,
62
- enqueueRemotePendingMessage,
63
- drainForeignUserInjections,
64
63
  drainPendingMessages,
65
64
  // Shutdown drain so buffered/in-flight spool writes are never abandoned.
66
65
  settlePendingMessageWrites,
67
66
  markCompletionEntry,
68
67
  COMPLETION_NOTIFICATION_KIND,
69
- pendingMessagesSpoolPath,
70
68
  } from './manager/pending-messages.mjs';
71
- // Interactive-presence sidecar (idle-open ownership signal for the
72
- // attach-on-resume guard) — resolved through the manager facade so the
73
- // session-runtime turn API reaches it as mgr.publishSessionPresence.
74
- export { publishSessionPresence, deleteSessionPresence } from './store.mjs';
75
69
 
76
70
  // ── Usage-metrics surface — re-exported unchanged so loop.mjs / smoke scripts
77
71
  // keep resolving these through the facade. ────────────────────────────────
@@ -105,7 +99,6 @@ export {
105
99
  prefetchSession,
106
100
  prepareSessionProjection,
107
101
  resumeSession,
108
- isSessionOwnerGone,
109
102
  recoverSessionAfterProcessRestart,
110
103
  } from './manager/session-lifecycle.mjs';
111
104
  export { askSession, _api_call_with_interrupt } from './manager/ask-session.mjs';
@@ -123,9 +116,10 @@ export {
123
116
  updateSessionStatus,
124
117
  updateSessionGeneratedTitle,
125
118
  updateSessionManualTitle,
119
+ updateSessionAiTitle,
126
120
  flushSessionMetrics,
127
121
  } from './manager/session-crud.mjs';
128
- export { deleteSession, listOwnedAgentSessionIds } from './store.mjs';
122
+ export { deleteSession, listOwnedAgentSessionIds, fenceSessionWrites } from './store.mjs';
129
123
  // Read-only parsed-session access (desktop pane peek): no resume, no
130
124
  // ownership, no liveness side effects.
131
125
  export { loadSession } from './store.mjs';
@@ -31,6 +31,8 @@ import { bumpUsageMetricsEpoch } from './manager/usage-metrics.mjs';
31
31
  import { resetReadStateAfterCompaction } from './read-dedup.mjs';
32
32
  import { scheduleCompactionArchive, stampCompactionMessageIds } from './compaction-archive-capture.mjs';
33
33
  import { writeStderrBestEffort } from '../../../shared/best-effort-stderr.mjs';
34
+ import { applyPendingWorkspaceReroot } from './manager/prompt-utils.mjs';
35
+ import { backfillFallbackSessionTitle } from './manager/session-fallback-title.mjs';
34
36
  import {
35
37
  acknowledgePendingGoalReminder,
36
38
  markPendingGoalReminder,
@@ -378,6 +380,7 @@ function adoptCompactedTranscript(ctx, run) {
378
380
  const { state } = ctx;
379
381
  const { messages, sessionRef, sessionId, opts } = state;
380
382
  const replaced = messages.slice();
383
+ if (sessionRef) backfillFallbackSessionTitle(sessionRef, replaced);
381
384
  messages.length = 0;
382
385
  messages.push(...run.compacted);
383
386
  // Display-only archive of the dropped conversation; the projection and the
@@ -388,6 +391,9 @@ function adoptCompactedTranscript(ctx, run) {
388
391
  ctx.droppedMessages = archived?.dropped ?? 0;
389
392
  ctx.droppedIdentities = archived?.identities ?? null;
390
393
  acknowledgeGoalReminder(sessionRef, run);
394
+ // The compacted transcript breaks the cache anyway: a staged working-folder
395
+ // change re-roots the system prompt now and needs no notice any more.
396
+ if (sessionRef) applyPendingWorkspaceReroot(sessionRef, messages);
391
397
  resetReadStateAfterCompaction(sessionId);
392
398
  // Cross-turn receipts reference tool results that compaction just removed
393
399
  // from context; a stub for them would point at nothing. Clear in place so
@@ -3,6 +3,7 @@
3
3
  // wrappers are installed on the caller's opts in place for ONE send, and the
4
4
  // returned restore unwinds only our own wrappers.
5
5
  import { isVisibleStreamProgress } from '../../../shared/stream-progress.mjs';
6
+ import { MODEL_THINKING_STAGE } from '../../../shared/quiet-progress.mjs';
6
7
 
7
8
  // Bench-only turn timing (MIXDOG_TURN_TIMING=1): one stderr line per
8
9
  // provider request — TTFT (first visible model progress) and total stream
@@ -61,7 +62,7 @@ function retryVisibilityWrappers(opts, timedOpts, retryAttemptNumber, retryMaxFo
61
62
  if (!(retryAttemptNumber > 0 && prevOnStageChange)) return wrappers;
62
63
  let progressObserved = false;
63
64
  wrappers.onStageChange = (stage, detail) => {
64
- if (!progressObserved && (stage === 'requesting' || stage === 'streaming')) {
65
+ if (!progressObserved && (stage === 'requesting' || stage === 'streaming' || stage === MODEL_THINKING_STAGE)) {
65
66
  return prevOnStageChange('reconnecting', {
66
67
  ...(detail && typeof detail === 'object' ? detail : {}),
67
68
  attempt: retryAttemptNumber,
@@ -37,13 +37,14 @@ import {
37
37
  isThinkingReplayRejection,
38
38
  repairThinkingReplayInPlace,
39
39
  } from './thinking-replay-recovery.mjs';
40
- import { readStreamOutcome } from '../providers/lib/stream-outcome.mjs';
40
+ import { readStreamOutcome, stampStreamOutcome } from '../providers/lib/stream-outcome.mjs';
41
41
  import { cloneProviderReplay } from '../providers/lib/provider-replay.mjs';
42
42
  import { resolveWorkerCompactPolicy } from './loop/compact-policy.mjs';
43
43
  import { agentContextOverflowError } from './loop/context-overflow.mjs';
44
44
  import { estimateMessagesTokensSafe } from './loop/compact-debug.mjs';
45
45
  import { isOutputLimitStopReason } from './loop/termination.mjs';
46
46
  import { instrumentSendCallbacks } from './send-instrumentation.mjs';
47
+ import { rejectedToolSchema } from './tool-schema-rejection.mjs';
47
48
 
48
49
  function normalizedIncompleteUsage(raw) {
49
50
  if (!raw || typeof raw !== 'object') return undefined;
@@ -259,6 +260,7 @@ export async function sendWithRecovery(ctx) {
259
260
  hooks.logTurnTiming('ok');
260
261
  } catch (sendErr) {
261
262
  hooks.logTurnTiming(`err:${sendErr?.code || sendErr?.name || 'unknown'}`);
263
+ stampStreamOutcome(sendErr, hooks.relayWitness);
262
264
  return await recoverFromSendError(sendErr, { ...ctx, relayWitness: hooks.relayWitness });
263
265
  }
264
266
  return { action: 'proceed', response };
@@ -405,6 +407,7 @@ async function recoverFromSendError(sendErr, state) {
405
407
  transportRetriesUsed = 0,
406
408
  imageStripUsed = false,
407
409
  thinkingReplayRepairUsed = false,
410
+ toolSchemaDropUsed = false,
408
411
  relayWitness,
409
412
  } = state;
410
413
  const outcome = readStreamOutcome(sendErr, relayWitness);
@@ -446,6 +449,19 @@ async function recoverFromSendError(sendErr, state) {
446
449
  ) {
447
450
  return retryTransport(sendErr, state);
448
451
  }
452
+ // A 400 naming one tool's input schema: the session drops that tool (with
453
+ // the notice) and the turn is replayed once without it. Nothing was
454
+ // generated, and the same body would fail every later turn.
455
+ if (toolSchemaDropUsed !== true) {
456
+ const exclusion = rejectedToolSchema(sendErr, state);
457
+ if (exclusion) {
458
+ logLoop(
459
+ `[loop] provider rejected tool schema "${exclusion.name}" (${loopTag(state)}); dropping it and replaying once`
460
+ );
461
+ traceLoop(state, 'tool_schema_drop', { tool: exclusion.name });
462
+ return { action: 'retry_tool_schema_drop', exclusion };
463
+ }
464
+ }
449
465
  // Anthropic replay-shape refusal: the latest assistant turn carries
450
466
  // thinking blocks the API will not accept back (a thinking run it did not
451
467
  // produce, or an empty text block). This is deterministic — the same body
@@ -0,0 +1,96 @@
1
+ // side-question-store.mjs — the in-memory state behind /btw side questions:
2
+ // per session, the latest provider request the main loop sent (the request a
3
+ // side question forks) and the side question in flight. It holds live
4
+ // provider/tool objects, so it never reaches the session record or disk.
5
+ import { isAgentOwner } from '../agent-owner.mjs';
6
+
7
+ // sessionId -> { provider, model, messages, tools, opts, response }
8
+ const requests = new Map();
9
+ // sessionId -> AbortController of the side question in flight.
10
+ const inFlight = new Map();
11
+
12
+ // Send options that steer the live loop rather than shape the request: its
13
+ // abort signal, a one-shot cache-break trace tag and the per-request stall
14
+ // budget. A forced tool choice is dropped too (a side question must be able
15
+ // to answer in text); the hard-cap `none` choice is kept.
16
+ const LOOP_ONLY_OPTIONS = new Set(['signal', 'cacheBreakIntent', '_stallRetryBudget', 'toolChoice']);
17
+
18
+ function requestOptions(opts) {
19
+ const out = {};
20
+ for (const [key, value] of Object.entries(opts || {})) {
21
+ if (typeof value === 'function' || LOOP_ONLY_OPTIONS.has(key)) continue;
22
+ out[key] = value;
23
+ }
24
+ if (opts?.toolChoice === 'none') out.toolChoice = 'none';
25
+ return out;
26
+ }
27
+
28
+ /** A request in the stored shape: its own message list and only the send
29
+ * options a fork may reuse. `response` is null until the reply settles. */
30
+ export function sideQuestionRequestSnapshot({ provider, model, messages, tools, opts }) {
31
+ return {
32
+ provider,
33
+ model,
34
+ messages: [...messages],
35
+ tools: Array.isArray(tools) ? tools : [],
36
+ opts: requestOptions(opts),
37
+ response: null,
38
+ };
39
+ }
40
+
41
+ /**
42
+ * Record a provider request the main loop is sending as the session's latest
43
+ * one. Agent sessions record nothing (/btw is a Lead command). The handle
44
+ * attaches the reply once the send proceeds, or puts the previous request
45
+ * back when this one fails, so only a successfully sent request is kept.
46
+ */
47
+ export function captureSideQuestionRequest({ sessionId, sessionRef, provider, model, messages, tools, opts }) {
48
+ if (!sessionId || !provider || isAgentOwner(sessionRef)) return null;
49
+ const previous = requests.get(sessionId);
50
+ const request = sideQuestionRequestSnapshot({ provider, model, messages, tools, opts });
51
+ requests.set(sessionId, request);
52
+ return {
53
+ settle(response) {
54
+ request.response = response || null;
55
+ },
56
+ discard() {
57
+ if (requests.get(sessionId) !== request) return;
58
+ if (previous) requests.set(sessionId, previous);
59
+ else requests.delete(sessionId);
60
+ },
61
+ };
62
+ }
63
+
64
+ export function sideQuestionRequest(sessionId) {
65
+ return (sessionId && requests.get(sessionId)) || null;
66
+ }
67
+
68
+ /** Start the session's side question, aborting the one still in flight. */
69
+ export function beginSideQuestion(sessionId) {
70
+ cancelSideQuestion(sessionId);
71
+ const controller = new AbortController();
72
+ inFlight.set(sessionId, controller);
73
+ return {
74
+ signal: controller.signal,
75
+ end() {
76
+ if (inFlight.get(sessionId) === controller) inFlight.delete(sessionId);
77
+ },
78
+ };
79
+ }
80
+
81
+ export function cancelSideQuestion(sessionId) {
82
+ const controller = sessionId ? inFlight.get(sessionId) : null;
83
+ if (!controller) return false;
84
+ inFlight.delete(sessionId);
85
+ controller.abort(new Error('Side question canceled.'));
86
+ return true;
87
+ }
88
+
89
+ /** The transcript the saved request carried is gone (clear, rewind): a later
90
+ * side question waits for the next request. `cancel` also aborts the side
91
+ * question in flight (session close / runtime unload). */
92
+ export function forgetSideQuestion(sessionId, { cancel = false } = {}) {
93
+ if (!sessionId) return;
94
+ requests.delete(sessionId);
95
+ if (cancel) cancelSideQuestion(sessionId);
96
+ }