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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "reviewer",
3
3
  "name": "Reviewer",
4
- "description": "Use once at the final check of non-trivial work: after the implementation is written and verified, before reporting completion, to independently verify correctness, regressions, risks, and acceptance criteria. Skip for low-difficulty work.",
4
+ "description": "Use only at the end, as the final check of non-trivial work: after the implementation is written and verified, before reporting completion, to independently verify correctness, regressions, risks, and acceptance criteria. Skip for low-difficulty work.",
5
5
  "entry": "AGENT.md"
6
6
  }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "agents": {
3
3
  "advisor": [
4
+ "6bd0318995f70547c162efda92795e79",
4
5
  "d3b4a7926c9484833fe8ddba70260f9d"
5
6
  ],
6
7
  "debugger": [
@@ -26,6 +27,7 @@
26
27
  "reviewer": [
27
28
  "07643b62440d3eba29b7360b8a33f09f",
28
29
  "25b44b46269490e26ca31c1852925171",
30
+ "a60ea68f9287d55489e92e5450432f62",
29
31
  "a61cb4557def4e7ed647d4bdacbb72e4",
30
32
  "de860d4111b61985f3b59eb1011fa421"
31
33
  ],
@@ -61,6 +63,7 @@
61
63
  "56355187d05762ef50579d6285636c71",
62
64
  "599d6b09954a3afb163091878d3b7040",
63
65
  "5fa8ddf4731b39cec5fa269d632cfcc4",
66
+ "627f69923f1b895e3ac5f95f9b2d766b",
64
67
  "660cc103947dd30b94c70bcd1f22cefe",
65
68
  "6bbd8bb9e7657bc642f7be02f36dfc6d",
66
69
  "7976531213723a66a7a53b9a1cf0f372",
@@ -98,6 +101,7 @@
98
101
  "outputStyles": {
99
102
  "common.md": [
100
103
  "4e6134d60ee5c54c2888e874653bcdad",
104
+ "4ecd89b0c07ad8a81aa1f84882cf1b00",
101
105
  "899529696b7d6d3373ae83a76976ab48",
102
106
  "8d343d0a406fd5817b7fd98a3ac47010",
103
107
  "a1b73ce404125d3ce0a5762e4a1e1555",
@@ -335,9 +339,11 @@
335
339
  "70c54f802c77b630863b9e17a16d8224",
336
340
  "81e979463e0066e7a45cf511a31c5d68",
337
341
  "8476c811b2f02da3a434bcb23a1c3d12",
342
+ "8af2b614e2a07b58dad6c0f1318d22e2",
338
343
  "9f90d3872b1ecd312977ce661b770b31",
339
344
  "ade615dd0f6ae6ed1601023e5b9cb692",
340
345
  "b4f9c79dcb08151e6275b5ee35c2bca4",
346
+ "c6db973f51166fc42814808ae0001797",
341
347
  "c8826387a65631b63e8023f55ef807a3",
342
348
  "cb6f66d14ba75b11e7470eb3fd5ec94c",
343
349
  "de9727a48e52673258bf5f9670564d56",
@@ -69,7 +69,8 @@ that a call returned without transport error.
69
69
  injection stays on regardless. `set_recap_enabled` changes only the
70
70
  background cycles. Core Memory entries
71
71
  are read and changed with the `memory` tool, not setup.
72
- - Built-ins have installation state separate from enabled state. Browser Use,
72
+ - Built-ins have installation state separate from enabled state; Visualize
73
+ is toggle-only (on by default, no install step). Browser Use,
73
74
  Computer Use actions require this conversation open in the local Desktop
74
75
  window; voice runs on the runtime and needs no Desktop.
75
76
  - Hook rules are before-tool policy, separate from MCP and plugins. Deleting a
@@ -94,6 +95,10 @@ that a call returned without transport error.
94
95
  - For an MCP failure, inspect the reported transport error before changing
95
96
  command, arguments, directory, environment, URL, headers, or enabled state.
96
97
  - MCP reads intentionally omit raw connection values that may contain secrets.
98
+ - An HTTP/SSE MCP server that needs OAuth waits for sign-in instead of
99
+ failing; setup rows then show it enabled, not connected, with no `error`.
100
+ Setup cannot sign in, and `reconnect_mcp` does not log in: hand off to
101
+ `open mcp` (Connect/Reconnect) or the TUI `/mcp login`.
97
102
  - For an unavailable built-in, distinguish not installed, installed but
98
103
  disabled, and bridge inactive.
99
104
  - Desktop requests require a single live claimant and a confirmed receipt.
@@ -4,11 +4,17 @@ Read this when choosing a `setup` mutation.
4
4
 
5
5
  ## Read and navigate
6
6
 
7
- - `status` reads one domain: summary, model, agents, workflow, websearch,
8
- output-style, profile, autoclear, compaction, memory, features, local-provider, shell,
9
- providers, mcp, skills, plugins, update, onboarding, worktree, capabilities, developer,
10
- desktop, appearance, projects, connection, schedules, webhooks, hooks, or
11
- media.
7
+ - `status` reads one domain from the schema enum; pick the narrowest.
8
+ - Results are compact JSON. `status providers` lists configured providers
9
+ only (`id`, `kind`, `authenticated`, `status`, `accounts` count); add
10
+ `detail: true` for every provider with key URLs, expiry and account ids.
11
+ - `list_models` narrows in steps: no `catalog` returns the provider index
12
+ (`provider`, `count`, `defaultModel?`); `catalog.provider` returns compact
13
+ rows (`id`, `display`, `context`, `efforts`, `fast?`, `vision?`) with
14
+ `total`/`page`/`pages`/`nextPage` (`page`, `limit` ≤ 100, default 25);
15
+ `catalog.model` (plus `provider` if several offer the id) returns that
16
+ model's full options. `webSearch` limits to native-search models; `refresh`
17
+ reloads the catalog.
12
18
  - `open` navigates to a supported UI surface. Read `surfaces.md` for targets and
13
19
  UI-only settings.
14
20
 
@@ -28,7 +34,7 @@ Read this when choosing a `setup` mutation.
28
34
  | Background memory cycles | `set_recap_enabled` |
29
35
  | Web Search tool exposure | `set_web_search_enabled` |
30
36
  | Which user instruction files (AGENTS.md / CLAUDE.md) new sessions load: all, agents, claude, or off | `set_instruction_files` |
31
- | Git, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, or voice enabled state | `set_builtin_enabled` |
37
+ | Git, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, voice, or Visualize enabled state | `set_builtin_enabled` |
32
38
  | Git, Memory, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, or voice preparation | `install_builtin` |
33
39
  | Managed local model installation | `install_local_model` |
34
40
  | Start or resume a background runtime/model download | `start_local_installation` |
@@ -44,7 +50,7 @@ Read this when choosing a `setup` mutation.
44
50
  | Automatic updates | `set_auto_update` |
45
51
  | Worktree defaults: new tasks on the current branch or a new worktree, branch prefix, large-repository warning size, automatic cleanup | `set_worktree_settings` |
46
52
  | Remove stored provider authentication (one OAuth account at a time) | `forget_provider_auth` |
47
- | Select, rename, reorder, or auto-switch OAuth accounts, or allow paid credits | `set_provider_account` |
53
+ | Select, rename, or reorder OAuth accounts, set the switching policy, or allow paid credits | `set_provider_account` |
48
54
  | Developer options such as risk-gated OAuth providers | `set_developer_option` |
49
55
  | Add an MCP server | `add_mcp_server` |
50
56
  | Edit or rename an MCP server | `save_mcp_server` |
@@ -58,7 +64,7 @@ Read this when choosing a `setup` mutation.
58
64
  | Enable or disable a plugin | `set_plugin_enabled` |
59
65
  | Remove a plugin | `remove_plugin` |
60
66
  | Turn back on and reconnect every MCP server a plugin declares | `enable_plugin_mcp` |
61
- | Available hosted models and their options; optionally one provider, native-search capable only, or a refreshed catalog | `list_models` |
67
+ | Hosted model catalog: provider index, one provider's paged model rows, or one model's full options | `list_models` |
62
68
  | Agent orchestration, independent of workflow instructions | `set_orchestration_mode` |
63
69
  | Safe MCP edit metadata, excluding raw connection/credential values | `get_mcp_server` |
64
70
  | Read a workflow, agent, or skill definition | `read_definition` |
@@ -69,7 +75,7 @@ Read this when choosing a `setup` mutation.
69
75
  | Delete an existing schedule/webhook | `delete_automation` |
70
76
  | Enable/disable a schedule/webhook | `set_automation_enabled` |
71
77
  | Webhook listener enabled state, port, or domain | `set_webhook_config` |
72
- | Desktop keep-awake, run in background after window close, turn-completion notifications, notification volume (Windows), usage pin, or Computer observe-only state | `set_desktop_settings` |
78
+ | Desktop keep-awake, run in background after window close, turn-completion notifications, notification volume (Windows), usage pin, usage rail short + long bars, or Computer observe-only state | `set_desktop_settings` |
73
79
  | Desktop theme, display language, side panels, markdown default view, link previews, or tool activity expansion | `set_appearance` |
74
80
  | Add a before-tool hook rule | `add_hook_rule` |
75
81
  | Enable or disable a hook rule by its `status hooks` index | `set_hook_rule_enabled` |
@@ -88,8 +94,14 @@ workflow` before changing the corresponding domain.
88
94
 
89
95
  - Main and agent routes also accept `modelParameters`, `contextPercent`, and
90
96
  `contextTokens` (an exact window in tokens that overrides `contextPercent`);
91
- agent routes accept `disabled`.
92
- Use the model catalog for actual available options, not remembered model ids.
97
+ agent routes accept `disabled`. Route `autoEffort` (Main and agent only)
98
+ turns Auto reasoning on/off for that route; the Auto Effort built-in toggle
99
+ is the machine-wide switch and must also be on and `ready`.
100
+ Before `set_route`, read `list_models` with `catalog.model` (and `provider`)
101
+ for the model's `effortOptions`, `defaultEffort`, `fastCapable`,
102
+ `serviceTiers`, `modelParameterOptions` and `parameterVariants`; take
103
+ `effort`, `fast` and `modelParameters` values only from it, never from
104
+ remembered model ids.
93
105
  - A Web Search route must support native web search; tool exposure is changed
94
106
  separately.
95
107
  - Definition actions use `definitionKind` (workflow, agent, skill).
@@ -102,12 +114,13 @@ workflow` before changing the corresponding domain.
102
114
 
103
115
  ## Providers and authentication
104
116
 
105
- Use `status providers` for authenticated state and source.
117
+ Use `status providers` for authenticated state; `detail: true` adds each API
118
+ key's source.
106
119
 
107
120
  - API-key and OAuth providers: `open providers`, then the user completes
108
121
  authentication in the visible UI.
109
122
  - Custom providers are registered, tested, and removed in the Providers UI;
110
- `status providers` lists them as API rows with `custom: true`.
123
+ `status providers` with `detail: true` lists them as API rows with `custom: true`.
111
124
  - Local Provider is installed and enabled as a Built-in. Its endpoint is
112
125
  Mixdog-managed and is never configured by the user.
113
126
  Use the `local-provider` skill for hardware checks, model selection, downloads,
@@ -115,10 +128,14 @@ Use `status providers` for authenticated state and source.
115
128
  the detail dialog lists installed models rather than the download catalog.
116
129
  - Forgetting authentication is destructive and requires explicit approval.
117
130
  It removes one OAuth account; a provider with several accounts requires
118
- `accountId` from the account list in `status providers`.
119
- - `set_provider_account` changes the selected account, automatic switching,
120
- paid-credit use after plan limits (`useCredits`), account order (every account id exactly once), or an account label. Sign-in
121
- for a new account still happens in the Providers UI.
131
+ `accountId` from the account list in `status providers` with `detail: true`.
132
+ - `set_provider_account` changes the selected account, paid-credit use after
133
+ plan limits (`useCredits`), account order (every account id exactly once),
134
+ an account label, or the switching `policy`: `manual` stays on the selected
135
+ account, `limit` switches when it hits a limit, `headroom` starts each new
136
+ session on the account with the most headroom. `status providers` with
137
+ `detail: true` returns the current `policy` when one is set. Sign-in for a new account still
138
+ happens in the Providers UI.
122
139
  - `status developer` lists developer options. An option with a `warning` is
123
140
  enabled only after the user explicitly accepts that warning, passed as
124
141
  `riskAccepted:true`; never assume acceptance.
@@ -159,7 +176,12 @@ markers are read with `status desktop`.
159
176
  reasoning effort with a local judge model downloaded in the background.
160
177
  Enabling or installing it fails on unsupported machines; `status features`
161
178
  reports `supported`, `installing` (judge download running) and `ready`.
179
+ - Visualize is toggle-only through `set_builtin_enabled` (on by default);
180
+ `install_builtin` does not accept it.
162
181
  - Terminal follows the live Desktop terminal bridge and has no toggle.
182
+ - Environment feature overrides (`MIXDOG_FEATURE_*`) win over these toggles;
183
+ they are diagnostics for headless or benchmark environments, not user
184
+ settings.
163
185
  - Browser Use and Computer Use installation/toggles use the same
164
186
  `install_builtin` and `set_builtin_enabled` actions through a live Desktop
165
187
  receipt. Computer Use runs on Windows, macOS, and Linux desktops. These
@@ -177,16 +199,12 @@ markers are read with `status desktop`.
177
199
  only as `hasArgumentEdit`; their contents are never returned. Indexes shift
178
200
  after a delete;
179
201
  re-read status before addressing another rule.
180
- - `add_hook_rule` takes `action` (allow, deny, block, modify, rewrite, ask)
181
- and optional `tool`, `match`, `cwd`, `reason`. modify/rewrite need exactly
182
- one of `patch` (merged into the arguments) or `args` (replaces them).
202
+ - `add_hook_rule` with modify/rewrite needs exactly one of `patch` or `args`.
183
203
  - `delete_hook_rule` is destructive and requires explicit approval for the
184
204
  named rule; disabling with `set_hook_rule_enabled` preserves it.
185
205
  - `status media` shows the remembered lane/model per kind. `set_media_default`
186
206
  accepts only a signed-in lane that offers the kind (and the model, when
187
207
  given) in the live media catalog; the media tool's `list` reads that catalog.
188
- - Environment feature overrides are diagnostics for headless or benchmark
189
- environments, not ordinary user settings.
190
208
 
191
209
  ## Skills, MCP, and plugins
192
210
 
@@ -201,6 +219,10 @@ markers are read with `status desktop`.
201
219
  transport. Raw credential fields are not accepted; `env_vars`,
202
220
  `bearer_token_env_var`, and `env_http_headers` reference existing environment
203
221
  variables without exposing their values.
222
+ - `startupTimeoutSec` (connect/handshake, default 30) and `toolTimeoutSec`
223
+ (per tool call, default 120) are positive seconds. Raise them for slow
224
+ servers instead of reconnecting repeatedly; a timed-out call is never
225
+ replayed.
204
226
  - Environment/header maps are partial patches. Omitted keys are preserved;
205
227
  `null` explicitly removes one key, including a stored credential.
206
228
  - Plugin enablement moves its contributed skills and MCP integrations together.
@@ -18,7 +18,7 @@ or requests a setting with no mutation action.
18
18
  | `profile` | User profile |
19
19
  | `autoclear` | Session lifecycle controls |
20
20
  | `memory` | Memory capability surface |
21
- | `mcp` | Extensions → Skill → MCP |
21
+ | `mcp` | Extensions → Skill → MCP, including OAuth Connect/Reconnect/Disconnect |
22
22
  | `skills` | Extensions → Skill → Skills |
23
23
  | `plugins` | Extensions → Plugin |
24
24
  | `update` | Update surface |
@@ -56,15 +56,15 @@ the user to Desktop.
56
56
 
57
57
  ## Desktop-backed settings
58
58
 
59
- Setup can read and change Desktop appearance (including markdown default
60
- view, link previews, and tool activity expansion), keep-awake, run in
61
- background, turn-completion notifications, notification volume (Windows),
62
- usage pin, activity rail pins, Computer observe-only, Browser/Computer
63
- installation and toggles, Projects, and linked-device revocation through the
64
- attached Desktop. A receipt identifies `scope:desktop-host`.
59
+ `set_desktop_settings`, `set_appearance`, `set_activity_rail_pins`,
60
+ `save_project`, `remove_project`, `revoke_linked_device`, and Browser/Computer
61
+ install or toggles run through the attached Desktop; the receipt identifies
62
+ `scope:desktop-host`.
65
63
 
66
64
  Computer observe-only and background Memory cycles (`set_recap_enabled`)
67
- have no settings control in either app; setup is their only supported route. Usage pin is the pin toggle on the activity rail usage card.
65
+ have no settings control in either app; setup is their only supported route.
66
+ Usage pin and the short + long rail bars live in the usage card's flyout menu
67
+ on the activity rail.
68
68
 
69
69
  Schedules/webhooks and workflow/agent/skill definitions use their runtime
70
70
  actions directly. These do not require clicking their Desktop rails.
@@ -74,6 +74,8 @@ actions directly. These do not require clicking their Desktop rails.
74
74
  The setup tool does not mutate:
75
75
 
76
76
  - API keys, OAuth, usage sign-in, and GitHub CLI connection;
77
+ - MCP server OAuth sign-in and sign-out (Desktop MCP list/editor, TUI
78
+ `/mcp login` and `/mcp logout`; remote windows paste the redirect address);
77
79
  - notification permission and subscription on the receiving device;
78
80
  - web-app pairing credentials and OS permission dialogs;
79
81
  - TUI-local theme palettes (use `/theme`; Desktop themes are separate).
@@ -437,19 +437,26 @@ async function createHeadlessSessionRuntime(boundary, { provider, model, cwd, we
437
437
  // hundred bytes and the write is atomic, so the cost is negligible and a
438
438
  // live run stays readable from outside.
439
439
  function headlessAskOptions({ stats, lifecycle, observedModels, writeUsage }) {
440
+ const recordUsage = (delta) => {
441
+ const observedModel = clean(delta?.model);
442
+ if (observedModel) observedModels.add(observedModel);
443
+ applyUsageDelta(stats, delta);
444
+ try {
445
+ writeUsage();
446
+ } catch {
447
+ // Telemetry must never break the session; the exit path reports.
448
+ }
449
+ };
440
450
  return {
441
451
  onTextReset: () => true,
442
452
  onUsageDelta: (delta) => {
443
- const observedModel = clean(delta?.model);
444
- if (observedModel) observedModels.add(observedModel);
445
- applyUsageDelta(stats, delta);
453
+ recordUsage(delta);
446
454
  lifecycle?.onUsageDelta(delta);
447
- try {
448
- writeUsage();
449
- } catch {
450
- // Telemetry must never break the session; the exit path reports.
451
- }
452
455
  },
456
+ // Native web search runs its own provider send; fold its spend into the
457
+ // run's totals. It is not a main-stream request, so the lifecycle's
458
+ // model-request events stay untouched.
459
+ onNativeWebSearchUsage: recordUsage,
453
460
  ...(lifecycle
454
461
  ? {
455
462
  onProviderSendStarted: () => lifecycle.onProviderSendStarted(),
@@ -282,7 +282,8 @@ function darwinSet(account, value) {
282
282
 
283
283
  function darwinDelete(account) {
284
284
  const r = darwinRun(['delete-generic-password', '-a', account, '-s', SERVICE]);
285
- if (r.status !== 0) throw new Error(`[keychain] security delete failed: ${r.stderr || r.stdout}`);
285
+ // Exit 44 is errSecItemNotFound: nothing stored, so nothing to delete.
286
+ if (r.status !== 0 && r.status !== 44) throw new Error(`[keychain] security delete failed: ${r.stderr || r.stdout}`);
286
287
  }
287
288
 
288
289
  // ---------------------------------------------------------------------------
@@ -983,9 +984,11 @@ function win32Set(account, value) {
983
984
  }
984
985
 
985
986
  function win32Delete(account) {
986
- const file = dpApiFile(account);
987
- if (!fs.existsSync(file)) throw new Error(`[keychain] secret not found: ${account}`);
988
- fs.unlinkSync(file);
987
+ try {
988
+ fs.unlinkSync(dpApiFile(account));
989
+ } catch (error) {
990
+ if (error?.code !== 'ENOENT') throw error;
991
+ }
989
992
  }
990
993
 
991
994
  // ---------------------------------------------------------------------------
@@ -7,13 +7,14 @@ partial: true
7
7
 
8
8
  ## Shared Output Format
9
9
 
10
- - Lead with the answer or action. Use natural, complete sentences and the
11
- reader's vocabulary; state each point once.
12
- - Choose structure for clarity, not a fixed template. Use GitHub-flavored
13
- Markdown, `$$…$$` for display math, and tables or code when alignment helps.
14
- - Distinguish facts, inference, and uncertainty. Preserve exact technical
15
- literals, useful links, and material risks, limitations, and scope.
16
- - Follow explicit requests for depth; never pad. Omit tangents, unsolicited
17
- advice or offers, raw dumps, and process recaps.
18
- - Apply the selected depth to substantive answers, not preambles or progress
19
- updates.
10
+ - Lead with the answer; no restated request or closing recap. Natural,
11
+ complete sentences in the reader's vocabulary, each point once; no arrow
12
+ chains or unexplained shorthand.
13
+ - Plain prose for simple questions; headings, lists, or tables only for real
14
+ structure. GitHub-flavored Markdown, `$$…$$` for display math.
15
+ - Distinguish facts, inference, and uncertainty; keep exact literals and
16
+ material risks. Caveats only when they change the reader's next step.
17
+ - Never pad: no tangents, unsolicited offers, raw dumps, or process recaps.
18
+ Explicit depth requests win; depth applies to substantive answers only.
19
+ - At every depth keep decision-relevant failures, security warnings, and
20
+ destructive-action confirmations; quote needed error text exactly.
@@ -3,6 +3,7 @@
3
3
  * to `ctx.out`; only `/exit` and `/quit` return 'exit'.
4
4
  */
5
5
  import { dim, green, red, yellow, colorEnabled } from '../runtime/shared/statusline/ansi.mjs';
6
+ import { switchesSessionModel } from '../session-runtime/model-route/model-switch-target.mjs';
6
7
  import { createSessionStats } from '../ui/session-stats.mjs';
7
8
  import { statuslineFor } from './turn-output.mjs';
8
9
 
@@ -65,7 +66,21 @@ async function setModel(ctx, arg) {
65
66
  return;
66
67
  }
67
68
  const runtime = await ctx.ensureRuntime();
68
- await runtime.setRoute({ model: arg });
69
+ const request = { model: arg };
70
+ // The user's model choice switches this conversation in place; with
71
+ // auto-compact on model change (default on) the history is compacted on the
72
+ // current model first. A failed compaction never blocks the switch.
73
+ if (switchesSessionModel(runtime, request) && runtime.getCompactionSettings?.()?.onModelChange !== false) {
74
+ // An invalid or unavailable selector is rejected before anything compacts.
75
+ await runtime.setRoute(request, { validateOnly: true });
76
+ out.write(`${dim('compacting conversation before the model change…')}\n`);
77
+ try {
78
+ await runtime.compact();
79
+ } catch {
80
+ /* next-turn auto-compaction fits the new window */
81
+ }
82
+ }
83
+ await runtime.setRoute(request, { switchEstablished: true });
69
84
  out.write(`${green(`✓ model → ${runtime.provider}/${runtime.model}`)}\n`);
70
85
  }
71
86
 
@@ -6,8 +6,8 @@
6
6
  unapproved destructive action, or a blocker.
7
7
  - Communicate in English. Call tools immediately, with no preamble or
8
8
  progress text.
9
- - Reporting: report once, when the work is done, as the handoff — outcome;
10
- changed files with the key functions or symbols; the tests and checks you ran for your
11
- own changes and their result; material risks, blockers, or unresolved tool
12
- failures. Never raw logs, process narration, or a restatement of the brief.
13
- Lead owns the independent review.
9
+ - Reporting: report once, when done, per your role's output contract;
10
+ otherwise done, partial, or blocked with the outcome, then only applicable
11
+ items: changed files with key symbols, checks run (passes in one line,
12
+ failures with decisive error text), material risks or blockers. No raw
13
+ logs, narration, or restated brief. Lead owns the independent review.
@@ -17,11 +17,11 @@
17
17
  <!-- tools: agent -->
18
18
  - Briefing an agent: it sees only the brief, never this conversation. The
19
19
  brief is written in English whatever language the user writes in, and
20
- holds exactly the task in the user's terms, the scope it owns (files or
21
- modules), the exact changes located by path plus function or symbol name
22
- or a quoted line, not line numbers, and the completion criteria — nothing
23
- else: no rationale, measurements, history, or rules the
24
- agent already has. A fresh or respawned agent gets the whole brief; a
20
+ holds only the task in the user's terms and its use; owned scope and
21
+ exclusions; changes located by path plus symbol or quoted line, not line
22
+ numbers; completion criteria; any return need beyond the role. No
23
+ background, rediscoverable detail, or known rules; large evidence by path.
24
+ A fresh or respawned agent gets the whole brief; a
25
25
  continuing agent gets only what changed. Never assign the same work twice;
26
26
  interrupt only to cancel.
27
27
  <!-- tools: agent -->
@@ -59,6 +59,25 @@ function assistantMessageText(content) {
59
59
  .join('\n');
60
60
  }
61
61
 
62
+ // Visible assistant text inside a providerReplay envelope. Item shapes by
63
+ // provider: anthropic `{type:'text',text}`; openai/xai responses
64
+ // `{type:'message',content:[{type:'output_text',text}]}`; gemini/antigravity
65
+ // parts `{text}` (reasoning is `{thought:true,text}`). Reasoning/thinking and
66
+ // tool items are skipped.
67
+ function replayItemText(item) {
68
+ if (!item || typeof item !== 'object') return '';
69
+ if (item.type === 'message') return assistantMessageText(item.content);
70
+ if (item.type === 'text' || item.type === 'output_text' || (item.type === undefined && item.thought !== true)) {
71
+ return typeof item.text === 'string' ? item.text : '';
72
+ }
73
+ return '';
74
+ }
75
+
76
+ function providerReplayText(replay) {
77
+ const items = Array.isArray(replay?.items) ? replay.items : [];
78
+ return items.map(replayItemText).filter(Boolean).join('\n');
79
+ }
80
+
62
81
  /** Message index at askSession start — salvage only assistant rows appended this run. */
63
82
  export function resolveHandoffMessageStartIndex(session) {
64
83
  const messages = Array.isArray(session?.messages) ? session.messages : [];
@@ -72,7 +91,8 @@ function collectSessionAssistantHandoffText(session, messageStartIndex = 0) {
72
91
  for (let i = start; i < messages.length; i += 1) {
73
92
  const m = messages[i];
74
93
  if (m?.role !== 'assistant') continue;
75
- const t = assistantMessageText(m.content).trim();
94
+ const contentText = assistantMessageText(m.content).trim();
95
+ const t = contentText || providerReplayText(m.providerReplay).trim();
76
96
  if (t && t !== '.') parts.push(t);
77
97
  }
78
98
  return parts.length ? parts.join('\n\n') : '';
@@ -80,9 +100,14 @@ function collectSessionAssistantHandoffText(session, messageStartIndex = 0) {
80
100
 
81
101
  export function watchdogPartialHandoffFromError(error, session, messageStartIndex = 0) {
82
102
  if (!isAgentProgressWatchdogAbortError(error)) return null;
83
- // A canonical agent turn cannot expose its live transcript here, so it
84
- // reads the text itself and carries it on the stall error.
85
- if (typeof error.partialHandoff === 'string') return error.partialHandoff;
103
+ return turnPartialHandoff(error, session, messageStartIndex);
104
+ }
105
+
106
+ /** Assistant text a stopped turn produced before it stopped. A canonical agent
107
+ * turn cannot expose its live transcript here, so it reads the text itself
108
+ * and carries it on the turn's error. */
109
+ export function turnPartialHandoff(error, session, messageStartIndex = 0) {
110
+ if (typeof error?.partialHandoff === 'string') return error.partialHandoff;
86
111
  return partialHandoffTextFromSession(session, messageStartIndex);
87
112
  }
88
113
 
@@ -210,6 +210,16 @@ export function resolveProviderCacheKey(opts, provider) {
210
210
  );
211
211
  }
212
212
 
213
+ /** A cache identity as a prompt_cache_key: kept as is up to the 64-char wire
214
+ * limit, a bounded hash identity beyond it, '' when empty. */
215
+ export function normalizeCacheKey(value) {
216
+ const text = String(value ?? '').trim();
217
+ if (!text) return '';
218
+ const wellFormed = text.toWellFormed();
219
+ if (wellFormed.length <= 64) return wellFormed;
220
+ return `pc_${createHash('sha256').update(wellFormed).digest('hex').slice(0, 32)}`;
221
+ }
222
+
213
223
  function shortHash(value, chars = 18) {
214
224
  return createHash('sha256').update(stableHashStringify(value)).digest('hex').slice(0, chars);
215
225
  }