mixdog 1.2.1 → 1.2.3

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 (557) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/gate-local.mjs +19 -3
  4. package/scripts/model-catalog-audit.mjs +1 -15
  5. package/scripts/provider-pingpong-live.mjs +509 -0
  6. package/src/agents/advisor/AGENT.md +1 -1
  7. package/src/agents/advisor/agent.json +1 -1
  8. package/src/agents/reviewer/AGENT.md +3 -3
  9. package/src/agents/reviewer/agent.json +1 -1
  10. package/src/defaults/shipped-history.json +6 -0
  11. package/src/defaults/skills/setup/SKILL.md +6 -1
  12. package/src/defaults/skills/setup/references/actions.md +44 -22
  13. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  14. package/src/headless-exec.mjs +15 -8
  15. package/src/lib/keychain-cjs.cjs +7 -4
  16. package/src/output-styles/common.md +11 -10
  17. package/src/repl/slash-commands.mjs +16 -1
  18. package/src/rules/agent/AGENT.md +5 -5
  19. package/src/rules/lead/LEAD.md +5 -5
  20. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -4
  21. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +10 -0
  22. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  23. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  24. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  25. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  26. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  27. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  28. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  29. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +36 -7
  30. package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +49 -10
  31. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +40 -3
  32. package/src/runtime/agent/orchestrator/mcp/client.mjs +230 -96
  33. package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +103 -0
  34. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +150 -0
  35. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +111 -0
  36. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +87 -0
  37. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +95 -0
  38. package/src/runtime/agent/orchestrator/mcp/oauth-request.mjs +122 -0
  39. package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +9 -0
  40. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +229 -0
  41. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +188 -29
  42. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +2 -1
  43. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  44. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +94 -31
  45. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +98 -0
  46. package/src/runtime/agent/orchestrator/providers/anthropic-fast-mode.mjs +39 -18
  47. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +55 -0
  48. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +48 -37
  49. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +10 -7
  50. package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +18 -4
  51. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +13 -1
  52. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  53. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +10 -1
  54. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +23 -9
  55. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +46 -20
  56. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +14 -9
  57. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +102 -45
  58. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +69 -0
  59. package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +4 -0
  60. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  61. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  62. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  63. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  65. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  66. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  67. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +10 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  69. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +40 -7
  70. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +30 -9
  71. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +7 -0
  72. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +88 -21
  73. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +30 -10
  74. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +106 -0
  75. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
  76. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +94 -15
  77. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
  79. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  80. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +75 -10
  81. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  82. package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +97 -2
  83. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +103 -23
  84. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
  85. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +103 -33
  86. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +32 -6
  87. package/src/runtime/agent/orchestrator/providers/cursor.mjs +27 -3
  88. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
  89. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -6
  90. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  91. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  92. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  93. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +80 -18
  94. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  95. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +46 -8
  96. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +273 -0
  97. package/src/runtime/agent/orchestrator/providers/gemini-family.mjs +9 -0
  98. package/src/runtime/agent/orchestrator/providers/gemini-history-signatures.mjs +9 -4
  99. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  100. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +3 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +180 -0
  102. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +369 -112
  103. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +3 -1
  104. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +140 -35
  105. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +70 -24
  106. package/src/runtime/agent/orchestrator/providers/gemini.mjs +80 -29
  107. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +3 -0
  109. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +69 -19
  110. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  111. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  112. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +246 -42
  113. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  114. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  115. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +388 -0
  116. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  117. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  118. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  119. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  120. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +48 -22
  121. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
  122. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  123. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +3 -0
  124. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +2 -1
  125. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  126. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  127. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +33 -1
  128. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +4 -9
  129. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
  130. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +123 -61
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +27 -2
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +37 -7
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +1 -0
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +50 -0
  138. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -2
  139. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  140. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  141. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +151 -0
  142. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +64 -23
  143. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +79 -33
  144. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  145. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +172 -0
  146. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +3 -2
  147. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +144 -15
  148. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +193 -0
  149. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +66 -2
  150. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +9 -2
  151. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  152. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +109 -26
  153. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +27 -6
  154. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +34 -20
  155. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +23 -4
  156. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +37 -28
  157. package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +274 -0
  158. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +72 -32
  159. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  160. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +43 -15
  161. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  162. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  163. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +5 -2
  164. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +2 -2
  165. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +7 -3
  166. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  167. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +2 -2
  168. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +1 -3
  169. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  170. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +37 -4
  171. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +12 -1
  172. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +22 -2
  173. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +12 -1
  174. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +76 -33
  175. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  176. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +44 -16
  177. package/src/runtime/agent/orchestrator/providers/openai-retry-policy.mjs +9 -0
  178. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
  179. package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +16 -8
  180. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  181. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -35
  182. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  183. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +1 -2
  184. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/policy.mjs +25 -14
  185. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  186. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  187. package/src/runtime/agent/orchestrator/providers/openai-ws-terminal.mjs +18 -11
  188. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +41 -22
  189. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
  190. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
  191. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
  192. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +720 -0
  193. package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
  194. package/src/runtime/agent/orchestrator/providers/retry-backoff.mjs +46 -7
  195. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +123 -219
  196. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -0
  197. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +148 -45
  198. package/src/runtime/agent/orchestrator/providers/retry-midstream.mjs +81 -16
  199. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  200. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  201. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +157 -0
  202. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -0
  203. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  204. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +183 -0
  205. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
  206. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +3 -0
  207. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
  208. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +0 -18
  210. package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +57 -28
  211. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +19 -16
  212. package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -97
  213. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  214. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  215. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +14 -3
  216. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  217. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  218. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  219. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +176 -71
  220. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
  221. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  222. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -1
  223. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  224. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
  225. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  226. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
  227. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  228. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  229. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -1
  230. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  231. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -1
  232. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  233. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  234. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  235. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -0
  236. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
  237. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
  238. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
  239. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
  240. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +104 -19
  241. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  242. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  243. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -4
  244. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  245. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
  246. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -2
  247. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +30 -2
  248. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +11 -2
  249. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
  250. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  251. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +57 -21
  252. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  253. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  254. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  255. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  256. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +5 -10
  257. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
  258. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +16 -4
  259. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
  260. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  261. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
  262. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
  263. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  264. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +18 -7
  265. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
  266. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  267. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +168 -29
  268. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  269. package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
  270. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
  271. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  272. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
  273. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +6 -3
  274. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
  275. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  276. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
  277. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
  278. package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +16 -0
  279. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +22 -10
  280. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  281. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +6 -0
  282. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +13 -0
  283. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +13 -1
  284. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +10 -2
  285. package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
  286. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
  287. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
  288. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  289. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  290. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  291. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +77 -0
  292. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +20 -1
  293. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  294. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
  295. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  296. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +12 -15
  297. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  298. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +5 -5
  299. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
  300. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
  301. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  302. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  303. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  304. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  305. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  306. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  307. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  308. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  309. package/src/runtime/computer-bridge/action-schema.mjs +44 -21
  310. package/src/runtime/github/tool.mjs +92 -2
  311. package/src/runtime/memory/index.mjs +1 -0
  312. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  313. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  314. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  315. package/src/runtime/memory/lib/pg/process.mjs +65 -50
  316. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  317. package/src/runtime/memory/lib/pg/supervisor.mjs +124 -16
  318. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  319. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  320. package/src/runtime/office/README.md +2 -2
  321. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  322. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  323. package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
  324. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  325. package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
  326. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  327. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  328. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  329. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  330. package/src/runtime/office/core/office-sessions.mjs +5 -0
  331. package/src/runtime/office/core/office-transactions.mjs +3 -0
  332. package/src/runtime/office/core/office-write-ledger.mjs +98 -0
  333. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  334. package/src/runtime/office/index.mjs +30 -0
  335. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  336. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  337. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  338. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  339. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  340. package/src/runtime/office/shared/values.mjs +0 -5
  341. package/src/runtime/shared/background-tasks.mjs +92 -14
  342. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  343. package/src/runtime/shared/bounded-line-diff.mjs +182 -0
  344. package/src/runtime/shared/buffered-appender.mjs +18 -0
  345. package/src/runtime/shared/config.mjs +78 -18
  346. package/src/runtime/shared/err-text.mjs +31 -0
  347. package/src/runtime/shared/error-presentation.mjs +159 -19
  348. package/src/runtime/shared/file-permissions.d.mts +6 -1
  349. package/src/runtime/shared/file-permissions.mjs +54 -6
  350. package/src/runtime/shared/llm/anthropic-betas.mjs +4 -3
  351. package/src/runtime/shared/llm/anthropic-effort.mjs +129 -134
  352. package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +50 -14
  353. package/src/runtime/shared/llm/model-catalog.mjs +53 -40
  354. package/src/runtime/shared/llm/openai-daybreak.mjs +4 -16
  355. package/src/runtime/shared/llm/provider-catalog-registry.mjs +11 -0
  356. package/src/runtime/shared/llm/provider-model-identities.mjs +13 -4
  357. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  358. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  359. package/src/runtime/shared/llm/usage-rollup.mjs +0 -1
  360. package/src/runtime/shared/loopback-listener.mjs +9 -0
  361. package/src/runtime/shared/model-display.mjs +13 -0
  362. package/src/runtime/shared/provider-api-key.mjs +2 -0
  363. package/src/runtime/shared/quota-resume-store.mjs +11 -0
  364. package/src/runtime/shared/review-diff.mjs +52 -0
  365. package/src/runtime/shared/session-baseline-store.mjs +960 -0
  366. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  367. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  368. package/src/runtime/shared/slow-span.mjs +114 -0
  369. package/src/runtime/shared/statusline/statusline-format.mjs +4 -4
  370. package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
  371. package/src/runtime/shared/task-notification-envelope.mjs +2 -2
  372. package/src/runtime/shared/tool-card-model/card-header.mjs +6 -1
  373. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  374. package/src/runtime/shared/tool-card-model.mjs +5 -2
  375. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  376. package/src/runtime/shared/tool-primitives.mjs +13 -0
  377. package/src/runtime/shared/tool-result-summary.mjs +8 -1
  378. package/src/runtime/shared/tool-surface.mjs +18 -3
  379. package/src/runtime/shared/tool-work-units.mjs +40 -4
  380. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  381. package/src/runtime/shared/transcript-writer.mjs +10 -2
  382. package/src/runtime/shared/turn-changes.mjs +670 -274
  383. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  384. package/src/runtime/shared/turn-snapshot-store.mjs +94 -2
  385. package/src/runtime/shared/turn-snapshot.mjs +986 -690
  386. package/src/runtime/shared/turn-worktree-snapshot.mjs +279 -262
  387. package/src/runtime/shared/user-data-guard.mjs +262 -49
  388. package/src/runtime/shared/worktrees/carry.mjs +531 -0
  389. package/src/runtime/shared/worktrees/contract.mjs +34 -24
  390. package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
  391. package/src/runtime/shared/worktrees/git-head.mjs +205 -0
  392. package/src/runtime/shared/worktrees/git.mjs +8 -3
  393. package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
  394. package/src/runtime/shared/worktrees/manager.mjs +156 -8
  395. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  396. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  397. package/src/runtime/shared/worktrees/test-support.mjs +19 -4
  398. package/src/runtime/terminal-bridge/client.mjs +44 -11
  399. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  400. package/src/runtime/tidy/apply.mjs +47 -2
  401. package/src/runtime/tidy/run-engines.mjs +11 -5
  402. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  403. package/src/session-runtime/boot/apis.mjs +19 -5
  404. package/src/session-runtime/boot/facade.mjs +1 -0
  405. package/src/session-runtime/boot/infrastructure.mjs +12 -1
  406. package/src/session-runtime/boot/session.mjs +0 -1
  407. package/src/session-runtime/boot/tools.mjs +4 -1
  408. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  409. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
  410. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  411. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
  412. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
  413. package/src/session-runtime/internal-tool-executor.mjs +6 -2
  414. package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
  415. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  416. package/src/session-runtime/lifecycle/session-catalog.mjs +14 -3
  417. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  418. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
  419. package/src/session-runtime/lifecycle/teardown.mjs +73 -8
  420. package/src/session-runtime/lifecycle-api.mjs +1 -0
  421. package/src/session-runtime/mcp-glue/connect.mjs +46 -14
  422. package/src/session-runtime/mcp-glue/server-catalog.mjs +20 -3
  423. package/src/session-runtime/mcp-glue.mjs +3 -0
  424. package/src/session-runtime/mcp-oauth-login.mjs +174 -0
  425. package/src/session-runtime/model-route/model-switch-target.mjs +34 -0
  426. package/src/session-runtime/model-route/set-route.mjs +85 -17
  427. package/src/session-runtime/model-route/web-search-route.mjs +1 -1
  428. package/src/session-runtime/native-web-search/routes.mjs +22 -3
  429. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  430. package/src/session-runtime/native-web-search.mjs +10 -1
  431. package/src/session-runtime/new-session-config.mjs +4 -2
  432. package/src/session-runtime/provider-auth/login.mjs +4 -0
  433. package/src/session-runtime/provider-models/model-meta.mjs +12 -3
  434. package/src/session-runtime/quick-model-rows/web-search-rows.mjs +13 -8
  435. package/src/session-runtime/quick-web-search-models.mjs +13 -38
  436. package/src/session-runtime/resource-extension-sync.mjs +4 -0
  437. package/src/session-runtime/resource-mcp-api.mjs +98 -2
  438. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  439. package/src/session-runtime/runtime-review-api.mjs +21 -2
  440. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  441. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +13 -1
  442. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +7 -2
  443. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  444. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  445. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +73 -7
  446. package/src/session-runtime/services/agent-tool/send-flow.mjs +22 -4
  447. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +2 -0
  448. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +22 -5
  449. package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
  450. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +8 -1
  451. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -2
  452. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  453. package/src/session-runtime/services/agent-tool/worker-index.mjs +46 -7
  454. package/src/session-runtime/services/agent-tool/worker-rows.mjs +17 -0
  455. package/src/session-runtime/services/agent-tool.mjs +3 -0
  456. package/src/session-runtime/services/channel-admin.mjs +19 -3
  457. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  458. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  459. package/src/session-runtime/services/provider-admin.mjs +81 -15
  460. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  461. package/src/session-runtime/session-turn-api.mjs +14 -5
  462. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
  463. package/src/session-runtime/settings-compaction-api.mjs +1 -0
  464. package/src/session-runtime/setup-tool/executor.mjs +36 -6
  465. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  466. package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
  467. package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
  468. package/src/session-runtime/skills-api.mjs +3 -5
  469. package/src/session-runtime/tool-surface.mjs +5 -1
  470. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  471. package/src/session-runtime/turn/session-ops.mjs +7 -5
  472. package/src/session-runtime/turn/side-question-ops.mjs +22 -0
  473. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
  474. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
  475. package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
  476. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  477. package/src/session-runtime/turn/turn-run.mjs +25 -9
  478. package/src/session-runtime/usage-stats-api.mjs +43 -11
  479. package/src/session-runtime/workspace/project-branches.mjs +7 -5
  480. package/src/session-runtime/workspace/transition-steps.mjs +129 -31
  481. package/src/session-runtime/workspace/transitions.mjs +190 -15
  482. package/src/standalone/daemon-agent-control.mjs +9 -1
  483. package/src/standalone/daemon-drain-policy.mjs +8 -0
  484. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  485. package/src/standalone/daemon-owner.mjs +17 -4
  486. package/src/standalone/daemon-pg-stop.mjs +51 -0
  487. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  488. package/src/standalone/daemon-stop-budget.mjs +18 -0
  489. package/src/standalone/daemon-stored-session-views.mjs +2 -0
  490. package/src/standalone/daemon-telemetry.mjs +74 -0
  491. package/src/standalone/daemon.mjs +64 -8
  492. package/src/standalone/desktop-service-registry.mjs +5 -0
  493. package/src/standalone/local-session-runtime.mjs +70 -19
  494. package/src/standalone/session-client.mjs +42 -0
  495. package/src/standalone/session-protocol.mjs +14 -0
  496. package/src/standalone/session-proxy/projection.mjs +41 -4
  497. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  498. package/src/standalone/session-runtime-inline-host.mjs +1 -0
  499. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +33 -2
  500. package/src/standalone/session-service/agent-tree/agent-turns.mjs +26 -10
  501. package/src/standalone/session-service/agent-tree.mjs +12 -0
  502. package/src/standalone/session-service/quota-resume.mjs +8 -0
  503. package/src/standalone/session-service/retention/busy.mjs +15 -1
  504. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  505. package/src/standalone/session-service-api.mjs +11 -1
  506. package/src/standalone/session-service.mjs +1 -0
  507. package/src/standalone/session-state-patch.d.mts +2 -1
  508. package/src/standalone/session-state-patch.mjs +41 -1
  509. package/src/tui/App.jsx +25 -0
  510. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  511. package/src/tui/app/app-view.jsx +1 -0
  512. package/src/tui/app/btw-controller.mjs +118 -0
  513. package/src/tui/app/create-app-pickers.mjs +6 -0
  514. package/src/tui/app/extension-pickers/mcp-login.mjs +107 -0
  515. package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +2 -1
  516. package/src/tui/app/extension-pickers.mjs +2 -1
  517. package/src/tui/app/model-options.mjs +11 -16
  518. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  519. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  520. package/src/tui/app/slash-commands.mjs +20 -5
  521. package/src/tui/app/slash-dispatch/panel-commands.mjs +16 -1
  522. package/src/tui/app/slash-dispatch/session-commands.mjs +19 -6
  523. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  524. package/src/tui/app/use-global-key-input.mjs +5 -12
  525. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  526. package/src/tui/components/BtwPanel.jsx +53 -0
  527. package/src/tui/components/QuestionPanel.jsx +275 -0
  528. package/src/tui/components/StatusLine.jsx +2 -0
  529. package/src/tui/components/question-panel-model.mjs +156 -0
  530. package/src/tui/components/status-line/local-line.mjs +5 -2
  531. package/src/tui/components/status-line/use-statusline-text.mjs +7 -1
  532. package/src/tui/dist/index.mjs +3221 -1500
  533. package/src/tui/session/context-state.mjs +4 -2
  534. package/src/tui/session/quota-resume.mjs +46 -14
  535. package/src/tui/session/session-api/commands.mjs +43 -24
  536. package/src/tui/session/session-api/controls.mjs +2 -2
  537. package/src/tui/session/session-api/extensions.mjs +22 -0
  538. package/src/tui/session/session-api/integrations.mjs +16 -2
  539. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  540. package/src/tui/session/session-api/lifecycle.mjs +7 -2
  541. package/src/tui/session/session-api/routes.mjs +71 -7
  542. package/src/tui/session/session-api/settings.mjs +11 -14
  543. package/src/tui/session/session-api.mjs +1 -0
  544. package/src/tui/session/session-flow/drain.mjs +7 -1
  545. package/src/tui/session/session-flow/failed-turn-rewind.mjs +10 -4
  546. package/src/tui/session/tool-approval.mjs +10 -7
  547. package/src/tui/session/transcript-spill.mjs +14 -7
  548. package/src/tui/session/turn-stream.mjs +174 -31
  549. package/src/tui/session/turn.mjs +46 -16
  550. package/src/tui/statusline-ansi-bridge.mjs +1 -1
  551. package/src/ui/statusline-agents.mjs +15 -4
  552. package/src/ui/statusline.mjs +7 -3
  553. package/src/ui/streaming-markdown-heal.mjs +34 -3
  554. package/src/vendor/statusline/src/gateway/claude-current.mjs +14 -4
  555. package/src/workflows/default/WORKFLOW.md +3 -1
  556. package/src/runtime/memory/lib/memory-session-merge.mjs +0 -32
  557. package/src/runtime/shared/llm/usage-session-history.mjs +0 -266
@@ -21,20 +21,21 @@ export function createCwdApply({
21
21
  updateCurrentCwdOverride,
22
22
  persistSession,
23
23
  onCwdChanged,
24
+ isProjectFolder,
24
25
  clean,
25
26
  resolve,
26
27
  statSync,
27
28
  }) {
28
29
  function resolveCwdPath(value) {
29
30
  const raw = clean(value);
30
- if (!raw) throw new Error('cwd: path is required for action=set');
31
+ if (!raw) throw new Error('session: path is required for action=set-project');
31
32
  const next = resolve(getCurrentCwd() || process.cwd(), raw);
32
33
  const stat = statSync(next);
33
34
  if (!stat.isDirectory()) throw new Error(`cwd: not a directory: ${next}`);
34
35
  return next;
35
36
  }
36
37
 
37
- function persistProjectSelection(session, currentCwd) {
38
+ function persistProjectSelection(session, currentCwd, classifyByMembership) {
38
39
  // A Lead in its worktree keeps the registered Project as projectPath; a
39
40
  // switch elsewhere leaves the worktree at a new workspace revision.
40
41
  const { workspace, projectPath } = workspaceForProjectSelection(session, currentCwd);
@@ -44,7 +45,13 @@ export function createCwdApply({
44
45
  }
45
46
  const desktop = getDesktopSession?.() || session?.desktopSession;
46
47
  if (desktop && typeof desktop === 'object') {
47
- const nextDesktop = { classification: 'project', projectPath };
48
+ // A desktop/remote move (classifyByMembership) names a registered
49
+ // Project or the task workspace: outside every registered Project it is
50
+ // a task again. The model's own set-project keeps any folder it picked.
51
+ const nextDesktop =
52
+ classifyByMembership && !isProjectFolder(projectPath)
53
+ ? { classification: 'task', projectPath: null }
54
+ : { classification: 'project', projectPath };
48
55
  setDesktopSession?.(nextDesktop);
49
56
  if (session) session.desktopSession = nextDesktop;
50
57
  }
@@ -59,7 +66,7 @@ export function createCwdApply({
59
66
  // message history. The live execution cwd is retargeted in place; the BP3
60
67
  // session snapshot remains the session-start environment. `onCwdChanged`
61
68
  // lets MCP reconnect only the plugin servers that run in the session cwd.
62
- function applyResolvedCwd(nextCwd, { persistProjectSelection: persist = false } = {}) {
69
+ function applyResolvedCwd(nextCwd, { persistProjectSelection: persist = false, classifyByMembership = false } = {}) {
63
70
  const resolved = resolve(nextCwd);
64
71
  const stat = statSync(resolved);
65
72
  if (!stat.isDirectory()) throw new Error(`cwd: not a directory: ${resolved}`);
@@ -70,7 +77,7 @@ export function createCwdApply({
70
77
  if (session) session.cwd = currentCwd;
71
78
  updateCurrentCwdOverride?.(currentCwd);
72
79
  writeLastSessionCwd(currentCwd, session?.clientHostPid);
73
- if (persist) persistProjectSelection(session, currentCwd);
80
+ if (persist) persistProjectSelection(session, currentCwd, classifyByMembership);
74
81
  // Lazy mode: before the first turn (e.g. the initial project-selection
75
82
  // cwd set), do NOT prewarm — that is exactly the post-first-frame freeze
76
83
  // we are avoiding. Once a turn has run, an in-session cwd switch DOES
@@ -0,0 +1,65 @@
1
+ // ask_user: put 1-4 multiple-choice questions to the user through the session's
2
+ // tool-approval hook (kind: 'question') and report the answers to the model.
3
+ import { validateAskUserQuestions, ASK_USER_MAX_TEXT } from '../../runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs';
4
+ import { createCallerContextResolvers } from './caller-context.mjs';
5
+
6
+ export const ASK_USER_TIMEOUT_MS = 30 * 60 * 1000;
7
+ export const APPROVAL_TIMED_OUT_REASON = 'approval timed out';
8
+
9
+ const NO_USER = 'No user is available to answer in this session. Proceed with your best judgment and state the choices you made.';
10
+ const DISMISSED =
11
+ 'User closed the questions without answering. Proceed with your best judgment; ask again only if something new depends on it.';
12
+ const TIMED_OUT = `User did not answer in time. ${DISMISSED}`;
13
+
14
+ /** Wire answers -> array aligned with questions; invalid entries become null. */
15
+ export function normalizeAskUserAnswers(answers, questions) {
16
+ const list = Array.isArray(answers) ? answers.slice(0, 4) : [];
17
+ return questions.map((q, i) => {
18
+ const entry = list[i];
19
+ if (!entry || typeof entry !== 'object') return null;
20
+ const labels = new Set(q.options.map((o) => o.label));
21
+ const rawSelected = entry.selected == null ? [] : entry.selected;
22
+ if (!Array.isArray(rawSelected) || !rawSelected.every((l) => typeof l === 'string' && labels.has(l))) return null;
23
+ if (entry.text != null && (typeof entry.text !== 'string' || entry.text.length > ASK_USER_MAX_TEXT)) return null;
24
+ const selected = q.multi_select === true ? [...new Set(rawSelected)] : rawSelected.slice(0, 1);
25
+ const text = typeof entry.text === 'string' ? entry.text.trim() : '';
26
+ if (!selected.length && !text) return null;
27
+ return text ? { selected, text } : { selected };
28
+ });
29
+ }
30
+
31
+ // Strings are JSON-quoted so a quote inside one cannot end it early; typed
32
+ // text stays apart from the picked labels (`"picked" + "typed" (typed)`).
33
+ export function formatAskUserAnswers(questions, answers) {
34
+ const quote = (text) => JSON.stringify(text);
35
+ const parts = questions.map((q, i) => {
36
+ const a = answers[i];
37
+ if (!a) return `${quote(q.question)}=(no answer)`;
38
+ const picked = a.selected.length ? quote(a.selected.join(', ')) : '';
39
+ const typed = a.text ? `${quote(a.text)} (typed)` : '';
40
+ return `${quote(q.question)}=${[picked, typed].filter(Boolean).join(' + ')}`;
41
+ });
42
+ return `User has answered your questions: ${parts.join('; ')}. You can now continue with these answers in mind.`;
43
+ }
44
+
45
+ export function createAskUserToolHandlers({ rt }) {
46
+ const { sessionIdFor } = createCallerContextResolvers(rt);
47
+ return {
48
+ ask_user: async (args, { callerCtx }) => {
49
+ const questions = validateAskUserQuestions(args);
50
+ const hook = callerCtx?.toolApprovalHook;
51
+ if (typeof hook !== 'function') return NO_USER;
52
+ const result = await hook({
53
+ name: 'ask_user',
54
+ kind: 'question',
55
+ args: { questions },
56
+ reason: '',
57
+ timeoutMs: ASK_USER_TIMEOUT_MS,
58
+ sessionId: sessionIdFor(callerCtx),
59
+ toolCallId: callerCtx?.toolCallId || null,
60
+ });
61
+ if (result?.approved === true) return formatAskUserAnswers(questions, normalizeAskUserAnswers(result.answers, questions));
62
+ return result?.reason === APPROVAL_TIMED_OUT_REASON ? TIMED_OUT : DISMISSED;
63
+ },
64
+ };
65
+ }
@@ -40,13 +40,15 @@ export function createBridgeToolHandlers({ rt }) {
40
40
  });
41
41
  };
42
42
 
43
- // Read-only: no approval hook, no working directory.
43
+ // `run` is gated by the exec policy; the elevation approval comes from the
44
+ // runtime's gate (callerCtx), never from the model's args.
44
45
  const terminal = async (args, { callerCtx }) => {
45
46
  if (environmentDisabled(callerCtx, 'MIXDOG_FEATURE_TERMINAL')) {
46
47
  throw new Error('the terminal tool is disabled in this environment');
47
48
  }
48
49
  return await executeTerminalTool(args, {
49
50
  sessionId: sessionIdFor(callerCtx),
51
+ elevationApproved: callerCtx?.elevationApproved === true,
50
52
  signal: signalFor(callerCtx),
51
53
  });
52
54
  };
@@ -1,6 +1,7 @@
1
1
  // Tools that read rather than act: web search/fetch, memory, the code graph,
2
2
  // the deferred tool catalog, and skill bodies.
3
3
  import { refreshDeferredMcpToolCatalog, renderToolSearch } from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
4
+ import { resolveDeferredSelectMode } from '../../runtime/agent/orchestrator/session/loop/deferred-call-through.mjs';
4
5
  import { dispatchWebSearchRuntimeTool, memoryToolArgsForCaller } from '../runtime-tool-routing.mjs';
5
6
  import { createCallerContextResolvers } from './caller-context.mjs';
6
7
 
@@ -31,10 +32,16 @@ export function createKnowledgeToolHandlers({
31
32
  return await memoryMod.handleToolCall(name, memoryToolArgsForCaller(args, callerCwd), signalFor(callerCtx));
32
33
  };
33
34
 
34
- const toolSearch = (args) => {
35
- const surface = activeToolSurface();
36
- refreshDeferredMcpToolCatalog(surface, rt.config);
37
- return renderToolSearch(args, surface, rt.mode, { mcpStatus });
35
+ // Catalog tools answer for the calling session's own scope, bridge or
36
+ // native: a worker sees its own catalog (its own allow/deny), never the
37
+ // lead's. Only a call that names no session uses the active surface.
38
+ const scopeSession = (callerCtx) => callerCtx?.callerSession || activeToolSurface();
39
+ const scopeMode = (session) => session?.deferredSurfaceMode || resolveDeferredSelectMode(session) || rt.mode;
40
+
41
+ const toolSearch = (args, { callerCtx } = {}) => {
42
+ const session = scopeSession(callerCtx);
43
+ refreshDeferredMcpToolCatalog(session, rt.config);
44
+ return renderToolSearch(args, session, scopeMode(session), { mcpStatus });
38
45
  };
39
46
 
40
47
  return {
@@ -3,26 +3,35 @@
3
3
  import { statSync } from 'node:fs';
4
4
  import { resolve } from 'node:path';
5
5
  import { listProjects } from '../../runtime/shared/projects.mjs';
6
+ import { applySessionSidebarChange } from '../../runtime/shared/session-sidebar-host.mjs';
6
7
  import { clean } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
7
8
 
9
+ const USER_TITLE_ERROR = 'session: the user already titled this session; the title was not changed';
10
+
8
11
  export function createWorkspaceToolHandlers({
9
12
  rt,
10
13
  goalRuntime,
11
14
  agentTool,
12
15
  notifyFnForSession,
13
- applyResolvedCwd,
14
16
  getWorkspaceApi = () => null,
17
+ getSessionManager = () => null,
18
+ getLifecycleApi = () => null,
15
19
  }) {
16
20
  // The Lead's own worktree, on the user's request: the same authority the
17
21
  // branch chip menu drives, tolerating the calling turn but nothing else
18
22
  // running (workers, background shells).
19
- const worktreeAction = async (action, args, callerCtx) => {
20
- const workspace = getWorkspaceApi();
21
- if (!workspace) throw new Error(`cwd: ${action} is unavailable in this runtime`);
23
+ const assertLead = (action, callerCtx) => {
22
24
  const callerSessionId = callerCtx?.callerSessionId || rt.session?.id || null;
23
25
  if (!rt.session?.id || callerSessionId !== rt.session.id) {
24
- throw new Error(`cwd: ${action} belongs to the Lead session`);
26
+ throw new Error(`session: ${action} belongs to the Lead session`);
25
27
  }
28
+ return rt.session.id;
29
+ };
30
+
31
+ const worktreeAction = async (action, args, callerCtx) => {
32
+ const workspace = getWorkspaceApi();
33
+ if (!workspace) throw new Error(`session: ${action} is unavailable in this runtime`);
34
+ assertLead(action, callerCtx);
26
35
  const result =
27
36
  action === 'merge-worktree'
28
37
  ? await workspace.mergeWorkspace({ confirmed: true }, { ownTurn: true })
@@ -35,12 +44,95 @@ export function createWorkspaceToolHandlers({
35
44
  };
36
45
 
37
46
  const WORKTREE_ACTIONS = new Set(['merge-worktree', 'remove-worktree', 'list-worktrees', 'prune-worktrees']);
47
+ const SIDEBAR_ACTIONS = new Set(['favorite', 'archive']);
38
48
 
39
- const cwd = async (args, { callerCtx, callerCwd }) => {
40
- const action = clean(args?.action || (args?.path ? 'set' : 'get')).toLowerCase();
49
+ // Sidebar flags only (the desktop's favorite/archive metadata).
50
+ const sidebarAction = async (action, args, callerCtx) => {
51
+ const sessionId = assertLead(action, callerCtx);
52
+ if (typeof args?.value !== 'boolean') throw new Error(`session: value (boolean) is required for action=${action}`);
53
+ const change = action === 'favorite' ? { favorite: args.value } : { archived: args.value };
54
+ try {
55
+ await applySessionSidebarChange(sessionId, change);
56
+ } catch (error) {
57
+ throw new Error(`session: ${action} failed (${error?.message || error})`);
58
+ }
59
+ return JSON.stringify({ action, sessionId, ...change }, null, 2);
60
+ };
61
+
62
+ const session = async (args, { callerCtx, callerCwd }) => {
63
+ const action = clean(args?.action || (args?.path ? 'set-project' : 'status')).toLowerCase();
41
64
  if (WORKTREE_ACTIONS.has(action)) return worktreeAction(action, args, callerCtx);
65
+ if (SIDEBAR_ACTIONS.has(action)) return sidebarAction(action, args, callerCtx);
42
66
  let currentCwd = callerCwd;
43
- if (action === 'list') {
67
+ if (action === 'status' || action === 'list-projects' || action === 'set-project') assertLead(action, callerCtx);
68
+ if (action === 'rename') {
69
+ const sessionId = assertLead(action, callerCtx);
70
+ if (rt.config?.aiSessionTitles === false) throw new Error('session: AI session titles are disabled in settings');
71
+ const title = clean(args?.title);
72
+ if (!title) throw new Error('session: title is required for action=rename');
73
+ const result = await getSessionManager()?.updateSessionAiTitle(sessionId, title);
74
+ if (!result?.ok) {
75
+ throw new Error(
76
+ result?.reason === 'user-title'
77
+ ? USER_TITLE_ERROR
78
+ : `session: rename failed (${result?.reason || 'unavailable'})`
79
+ );
80
+ }
81
+ // Mirror the store's truth onto the live session, never the AI title
82
+ // itself: a manual rename that landed while the save was awaited wins.
83
+ const stored = getSessionManager()?.getSession?.(sessionId);
84
+ if (stored && rt.session?.id === sessionId && stored !== rt.session) {
85
+ rt.session.title = stored.title;
86
+ rt.session.titleLocked = stored.titleLocked;
87
+ rt.session.titleSource = stored.titleSource;
88
+ rt.session.titleUpdatedAt = stored.titleUpdatedAt;
89
+ }
90
+ if (stored && stored.titleSource === 'user') throw new Error(USER_TITLE_ERROR);
91
+ return JSON.stringify({ action, sessionId, title: result.title }, null, 2);
92
+ }
93
+ if (action === 'compact') {
94
+ const sessionId = assertLead(action, callerCtx);
95
+ rt.pendingCompactSessionIds ??= new Set();
96
+ rt.pendingCompactSessionIds.add(sessionId);
97
+ return JSON.stringify(
98
+ { action, sessionId, scheduled: true, note: 'Compaction runs right after the current turn finishes.' },
99
+ null,
100
+ 2
101
+ );
102
+ }
103
+ if (action === 'fork') {
104
+ const sessionId = assertLead(action, callerCtx);
105
+ const lifecycle = getLifecycleApi();
106
+ if (typeof lifecycle?.inheritToNewSession !== 'function') {
107
+ throw new Error('session: fork is unavailable in this runtime');
108
+ }
109
+ const result = await lifecycle.inheritToNewSession(sessionId, {
110
+ compact: args?.compact === true,
111
+ titleSuffix: ' (Fork)',
112
+ });
113
+ return JSON.stringify(
114
+ { action, sourceSessionId: sessionId, sessionId: result.sessionId, compacted: result.compacted === true },
115
+ null,
116
+ 2
117
+ );
118
+ }
119
+ if (action === 'status') {
120
+ const current = rt.session;
121
+ return JSON.stringify(
122
+ {
123
+ sessionId: callerCtx?.callerSessionId || current?.id || null,
124
+ title: current?.title || null,
125
+ titleSource: current?.titleSource || null,
126
+ cwd: currentCwd,
127
+ project: current?.workspace?.projectPath || current?.desktopSession?.projectPath || currentCwd,
128
+ provider: current?.provider || null,
129
+ model: current?.model || null,
130
+ },
131
+ null,
132
+ 2
133
+ );
134
+ }
135
+ if (action === 'list-projects') {
44
136
  return JSON.stringify(
45
137
  {
46
138
  cwd: currentCwd,
@@ -50,18 +142,23 @@ export function createWorkspaceToolHandlers({
50
142
  2
51
143
  );
52
144
  }
53
- if (action === 'set') {
145
+ if (action === 'set-project') {
54
146
  const rawPath = clean(args?.path);
55
- if (!rawPath) throw new Error('cwd: path is required for action=set');
147
+ if (!rawPath) throw new Error('session: path is required for action=set-project');
56
148
  const nextCwd = resolve(callerCwd || process.cwd(), rawPath);
57
149
  const stat = statSync(nextCwd);
58
- if (!stat.isDirectory()) throw new Error(`cwd: not a directory: ${nextCwd}`);
59
- currentCwd =
60
- typeof callerCtx?.setCallerCwd === 'function'
61
- ? clean(await callerCtx.setCallerCwd(nextCwd)) || nextCwd
62
- : applyResolvedCwd(nextCwd, { persistProjectSelection: true });
63
- } else if (action !== 'get') {
64
- throw new Error(`cwd: unknown action "${action}"`);
150
+ if (!stat.isDirectory()) throw new Error(`session: not a directory: ${nextCwd}`);
151
+ // The Lead's own call: the runtime's Project switch authority admits it
152
+ // during the calling turn and refuses inside a managed worktree.
153
+ if (typeof callerCtx?.setCallerCwd === 'function') {
154
+ currentCwd = clean(await callerCtx.setCallerCwd(nextCwd)) || nextCwd;
155
+ } else {
156
+ const workspace = getWorkspaceApi();
157
+ if (!workspace) throw new Error('session: set-project is unavailable in this runtime');
158
+ currentCwd = await workspace.switchProject(nextCwd, { ownTurn: true });
159
+ }
160
+ } else {
161
+ throw new Error(`session: unknown action "${action}"`);
65
162
  }
66
163
  return JSON.stringify(
67
164
  {
@@ -74,7 +171,7 @@ export function createWorkspaceToolHandlers({
74
171
  };
75
172
 
76
173
  return {
77
- cwd,
174
+ session,
78
175
  goal: async (args, { name, callerCtx }) =>
79
176
  await goalRuntime.executeTool(name, args || {}, {
80
177
  callerSessionId: callerCtx?.callerSessionId || rt.session?.id || rt.reservedSessionId || null,
@@ -6,6 +6,7 @@
6
6
  * to channel tools.
7
7
  */
8
8
  import { clean } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
9
+ import { createAskUserToolHandlers } from './internal-tool-executor/ask-user-tool.mjs';
9
10
  import { createBridgeToolHandlers } from './internal-tool-executor/bridge-tools.mjs';
10
11
  import { createFeatureToolHandlers } from './internal-tool-executor/feature-tools.mjs';
11
12
  import { createKnowledgeToolHandlers } from './internal-tool-executor/knowledge-tools.mjs';
@@ -29,12 +30,14 @@ export function createInternalToolExecutor({
29
30
  runNativeWebSearch,
30
31
  activeToolSurface,
31
32
  mcpStatus,
32
- applyResolvedCwd,
33
33
  skillToolContent,
34
34
  getWorkspaceApi,
35
+ getSessionManager,
36
+ getLifecycleApi,
35
37
  }) {
36
38
  const handlers = {
37
39
  ...createBridgeToolHandlers({ rt }),
40
+ ...createAskUserToolHandlers({ rt }),
38
41
  ...createFeatureToolHandlers({ rt, setupTool, officeToolsEnabled, mediaToolEnabled, tidyToolEnabled }),
39
42
  ...createKnowledgeToolHandlers({
40
43
  rt,
@@ -52,8 +55,9 @@ export function createInternalToolExecutor({
52
55
  goalRuntime,
53
56
  agentTool,
54
57
  notifyFnForSession,
55
- applyResolvedCwd,
56
58
  getWorkspaceApi,
59
+ getSessionManager,
60
+ getLifecycleApi,
57
61
  }),
58
62
  };
59
63
 
@@ -0,0 +1,188 @@
1
+ /**
2
+ * src/session-runtime/lifecycle/cold-heir.mjs - the record of a heir that is
3
+ * NOT opened: a sibling of the source session on the same route, cwd and
4
+ * Project, persisted to the store and left cold for a later resume.
5
+ *
6
+ * The heir starts from the source's own record (same provider/model, tool
7
+ * surface, system layer, desktop classification) the way /clear's cold fork
8
+ * does, minus everything that belongs to the source alone: its conversation,
9
+ * in-flight turn, provider continuation, usage readings, title, worktree and
10
+ * ownership/lineage links — the heir is a root Lead of its own, linked to the
11
+ * source only through `inheritedFromSessionId`.
12
+ */
13
+ import {
14
+ ensureCodexWireSessionId,
15
+ mintSessionId,
16
+ } from '../../runtime/agent/orchestrator/session/manager/session-id.mjs';
17
+ import {
18
+ refreshSessionWorkspaceContext,
19
+ resetSessionBp3Environment,
20
+ } from '../../runtime/agent/orchestrator/session/manager/prompt-utils.mjs';
21
+ import { buildWorkspacePromptContext } from '../../runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs';
22
+ import {
23
+ invalidateContextUsageSnapshot,
24
+ invalidateProviderContextBaseline,
25
+ } from '../../runtime/agent/orchestrator/session/loop/compact-policy.mjs';
26
+ import { deleteSession, evictLiveSession, saveSessionAsync } from '../../runtime/agent/orchestrator/session/store.mjs';
27
+ import { projectWorkspace } from '../../runtime/shared/worktrees/contract.mjs';
28
+ import { writeStderrBestEffort } from '../../runtime/shared/best-effort-stderr.mjs';
29
+ import { replacementSessionCwd } from '../workspace/workspace-state.mjs';
30
+
31
+ // Per-turn and per-process state of the source: the in-flight turn, its
32
+ // transient serializer-stripped aliases, and one-shot pending work.
33
+ const SOURCE_RUNTIME_FIELDS = [
34
+ 'liveTurnMessages',
35
+ 'toolApprovalHook',
36
+ '_providerPrefixGuardState',
37
+ 'activeTurnCheckpoint',
38
+ 'remoteAttached',
39
+ 'deferredInitialRefreshPending',
40
+ 'pendingGoalReminder',
41
+ 'goalReminderRevision',
42
+ 'pendingCacheBreakIntent',
43
+ 'contextPressureUnanchoredAfterRestart',
44
+ 'contextPressureUnanchoredReason',
45
+ // Store read-back projections of the SOURCE file.
46
+ 'storageMtimeMs',
47
+ 'storageSize',
48
+ ];
49
+
50
+ // Identity the source owns: its title (the carry decides the heir's), import
51
+ // provenance (a dedupe key), its own inheritance link (the carry sets the
52
+ // heir's), Codex wire identity, lifecycle provenance (a 'cli-resume' detach
53
+ // hides a row from Recent), and every ownership / lineage / visibility link —
54
+ // a self-link copied from a recovered root Lead would point at the source and
55
+ // classify the heir as an agent-only child.
56
+ const SOURCE_IDENTITY_FIELDS = [
57
+ 'title',
58
+ 'titleLocked',
59
+ 'titleSource',
60
+ 'titleUpdatedAt',
61
+ 'importOrigin',
62
+ 'inheritedFromSessionId',
63
+ 'codexWireSessionId',
64
+ 'detachedReason',
65
+ 'sessionVisibility',
66
+ 'task_id',
67
+ 'taskId',
68
+ ];
69
+
70
+ // The heir is an ordinary, user-visible root Lead owned by nobody but itself,
71
+ // whatever the source's ownership history (same identity a new Lead session
72
+ // or an imported conversation gets).
73
+ const ROOT_LEAD_IDENTITY = Object.freeze({
74
+ owner: 'cli',
75
+ agent: 'lead',
76
+ lane: 'cli',
77
+ sourceType: 'lead',
78
+ sourceName: 'main',
79
+ parentSessionId: null,
80
+ ownerSessionId: null,
81
+ visibility: null,
82
+ agentTag: null,
83
+ taskType: null,
84
+ permissionMode: null,
85
+ scopeKey: null,
86
+ });
87
+
88
+ /**
89
+ * The source as of its last committed turn. Mid-turn, `messages` already
90
+ * holds the in-flight user prompt (pre-committed before the provider call)
91
+ * while `liveTurnMessages` holds the turn's working transcript; the prompt is
92
+ * not part of the conversation yet, so it does not travel. Never mutates.
93
+ */
94
+ export function committedSource(source) {
95
+ const messages = Array.isArray(source?.messages) ? source.messages : [];
96
+ const live = source?.liveTurnMessages;
97
+ if (!Array.isArray(live) || live === messages || messages.at(-1)?.role !== 'user') return source;
98
+ return { ...source, messages: messages.slice(0, -1) };
99
+ }
100
+
101
+ /** A fresh, empty heir record of `source` — system layer only, nothing saved. */
102
+ export function buildColdHeir(source, now = Date.now()) {
103
+ const heir = {
104
+ ...source,
105
+ id: mintSessionId(),
106
+ // The heir runs on the very route that built these blocks; copies, so
107
+ // the heir never shares a message object with the source.
108
+ messages: structuredClone((source.messages || []).filter((message) => message?.role === 'system')),
109
+ closed: false,
110
+ status: 'idle',
111
+ generation: 0,
112
+ createdAt: now,
113
+ updatedAt: now,
114
+ lastUsedAt: now,
115
+ lastHeartbeatAt: null,
116
+ mcpPid: process.pid,
117
+ clientHostPid: null,
118
+ providerState: undefined,
119
+ totalInputTokens: 0,
120
+ totalOutputTokens: 0,
121
+ totalToolCalls: 0,
122
+ reasoningUsage: null,
123
+ totalCachedReadTokens: 0,
124
+ totalCacheWriteTokens: 0,
125
+ tokensCumulative: 0,
126
+ lastInputTokens: 0,
127
+ lastOutputTokens: 0,
128
+ lastCachedReadTokens: 0,
129
+ lastCacheWriteTokens: 0,
130
+ lastContextTokens: 0,
131
+ lastContextTokensUpdatedAt: now,
132
+ lastContextTokensStaleAfterCompact: false,
133
+ ...ROOT_LEAD_IDENTITY,
134
+ };
135
+ for (const key of [...SOURCE_RUNTIME_FIELDS, ...SOURCE_IDENTITY_FIELDS]) delete heir[key];
136
+ ensureCodexWireSessionId(heir);
137
+ // The compaction archive sidecar is keyed by the source id.
138
+ if (heir.compaction?.archive) {
139
+ heir.compaction = { ...heir.compaction };
140
+ delete heir.compaction.archive;
141
+ }
142
+ // A worktree belongs to the session that created it: like /new, the heir
143
+ // starts in the Project folder instead of sharing (and on delete, removing)
144
+ // the source's worktree.
145
+ const projectFolder = replacementSessionCwd(source);
146
+ if (projectFolder) {
147
+ heir.cwd = projectFolder;
148
+ heir.workspace = projectWorkspace({ projectPath: projectFolder });
149
+ }
150
+ // The source's staged working-folder change (its prompt still rooted at an
151
+ // earlier folder) is the source's own: the heir's prompt is built for the
152
+ // folder it actually starts in. Project memory follows the Project, which a
153
+ // worktree shares, so the source's current memory slice carries over.
154
+ const pending = source.workspaceReroot;
155
+ delete heir.workspaceReroot;
156
+ if ((projectFolder || pending) && heir.cwd) {
157
+ refreshSessionWorkspaceContext(heir, {
158
+ cwd: heir.cwd,
159
+ ...buildWorkspacePromptContext(heir, heir.cwd),
160
+ coreMemoryContext: pending?.target?.coreMemoryContext,
161
+ });
162
+ }
163
+ invalidateContextUsageSnapshot(heir);
164
+ invalidateProviderContextBaseline(heir);
165
+ // The `# Session` block names the session it was stamped for; the heir's
166
+ // first turn stamps its own.
167
+ resetSessionBp3Environment(heir);
168
+ return heir;
169
+ }
170
+
171
+ /**
172
+ * Persist the heir durably, then drop it from the same-process live cache:
173
+ * it is a cold session until someone resumes it. A failed save removes the
174
+ * half-made record and rejects.
175
+ */
176
+ export async function persistColdHeir(heir) {
177
+ try {
178
+ await saveSessionAsync(heir);
179
+ } catch (error) {
180
+ try {
181
+ deleteSession(heir.id);
182
+ } catch (cleanupError) {
183
+ writeStderrBestEffort(`[inherit] cleanup of ${heir.id} failed: ${cleanupError?.message || cleanupError}\n`);
184
+ }
185
+ throw error;
186
+ }
187
+ evictLiveSession(heir.id);
188
+ }