mixdog 1.2.2 → 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 (415) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/provider-pingpong-live.mjs +509 -0
  4. package/src/agents/advisor/AGENT.md +1 -1
  5. package/src/agents/advisor/agent.json +1 -1
  6. package/src/defaults/shipped-history.json +5 -0
  7. package/src/defaults/skills/setup/SKILL.md +6 -1
  8. package/src/defaults/skills/setup/references/actions.md +44 -22
  9. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  10. package/src/headless-exec.mjs +15 -8
  11. package/src/lib/keychain-cjs.cjs +7 -4
  12. package/src/output-styles/common.md +11 -10
  13. package/src/rules/agent/AGENT.md +5 -5
  14. package/src/rules/lead/LEAD.md +5 -5
  15. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  16. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  17. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  18. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  19. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  20. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  21. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  22. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  23. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +2 -0
  24. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
  25. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +7 -6
  26. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  27. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +29 -10
  28. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  29. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  30. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  31. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  32. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  33. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  34. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  35. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
  36. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  37. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +6 -0
  38. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +58 -7
  39. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
  40. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +16 -3
  41. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
  42. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +12 -6
  43. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +114 -72
  45. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  46. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +37 -5
  47. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  48. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +1 -0
  49. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
  50. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +3 -0
  51. package/src/runtime/agent/orchestrator/providers/cursor.mjs +9 -2
  52. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
  53. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -6
  54. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  55. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  56. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  57. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +3 -1
  58. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  59. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +25 -8
  60. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +87 -5
  61. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  62. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +13 -13
  63. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +355 -37
  64. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
  65. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +93 -47
  66. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +55 -10
  67. package/src/runtime/agent/orchestrator/providers/gemini.mjs +26 -8
  68. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  69. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
  70. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  71. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  72. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +246 -42
  73. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  74. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  75. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +388 -0
  76. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  77. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  78. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  79. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  80. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +48 -22
  81. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
  82. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  83. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  84. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  85. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +33 -1
  86. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  88. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +121 -61
  89. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  90. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
  91. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +37 -7
  92. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  93. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -2
  95. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  96. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  97. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +151 -0
  98. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +42 -24
  99. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
  100. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  101. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +172 -0
  102. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +53 -5
  103. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
  104. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  105. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
  106. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
  107. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
  108. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +6 -1
  109. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
  110. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  111. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +25 -4
  112. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  113. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  114. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
  115. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
  116. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  117. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  118. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
  119. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
  120. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
  121. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +71 -24
  122. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  123. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +44 -16
  124. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
  125. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  126. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -35
  127. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  128. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  129. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  130. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +11 -3
  131. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
  132. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
  133. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
  134. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +147 -8
  135. package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
  136. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +5 -0
  137. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  138. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  139. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +157 -0
  140. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -0
  141. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  142. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +183 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
  145. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  146. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  147. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  148. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +14 -3
  149. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  150. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  151. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  152. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +176 -71
  153. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
  154. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  155. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -1
  156. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  157. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
  158. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  159. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
  160. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  161. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  162. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -1
  163. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  164. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -1
  165. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  166. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  167. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  168. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -0
  169. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
  170. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
  171. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
  172. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +63 -20
  173. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +2 -1
  174. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  175. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  176. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -4
  177. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  178. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
  179. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +4 -1
  180. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
  181. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  182. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +16 -0
  183. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  184. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  185. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  186. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  187. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
  188. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +15 -3
  189. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
  190. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  191. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
  192. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
  193. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  194. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
  195. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  196. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +13 -0
  197. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  198. package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
  199. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
  200. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  201. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
  202. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
  203. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  204. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
  205. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
  206. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  207. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
  208. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
  209. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
  210. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +10 -2
  211. package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
  212. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
  213. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
  214. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  215. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  216. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  217. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +77 -0
  218. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  219. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  220. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  221. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
  222. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
  223. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  224. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  225. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  226. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  227. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  228. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  229. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  230. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  231. package/src/runtime/computer-bridge/action-schema.mjs +44 -21
  232. package/src/runtime/github/tool.mjs +92 -2
  233. package/src/runtime/memory/index.mjs +1 -0
  234. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  235. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  236. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  237. package/src/runtime/memory/lib/pg/process.mjs +31 -26
  238. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  239. package/src/runtime/memory/lib/pg/supervisor.mjs +108 -3
  240. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  241. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  242. package/src/runtime/office/README.md +1 -1
  243. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  244. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  245. package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
  246. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  247. package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
  248. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  249. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  250. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  251. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  252. package/src/runtime/office/core/office-sessions.mjs +5 -0
  253. package/src/runtime/office/core/office-transactions.mjs +3 -0
  254. package/src/runtime/office/core/office-write-ledger.mjs +98 -0
  255. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  256. package/src/runtime/office/index.mjs +30 -0
  257. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  258. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  259. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  260. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  261. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  262. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  263. package/src/runtime/shared/bounded-line-diff.mjs +182 -0
  264. package/src/runtime/shared/buffered-appender.mjs +18 -0
  265. package/src/runtime/shared/config.mjs +78 -18
  266. package/src/runtime/shared/err-text.mjs +6 -0
  267. package/src/runtime/shared/file-permissions.d.mts +6 -1
  268. package/src/runtime/shared/file-permissions.mjs +54 -6
  269. package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
  270. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  271. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  272. package/src/runtime/shared/loopback-listener.mjs +9 -0
  273. package/src/runtime/shared/provider-api-key.mjs +2 -0
  274. package/src/runtime/shared/review-diff.mjs +52 -0
  275. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  276. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  277. package/src/runtime/shared/slow-span.mjs +114 -0
  278. package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
  279. package/src/runtime/shared/tool-card-model/card-header.mjs +6 -1
  280. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  281. package/src/runtime/shared/tool-card-model.mjs +5 -2
  282. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  283. package/src/runtime/shared/tool-primitives.mjs +13 -0
  284. package/src/runtime/shared/tool-result-summary.mjs +8 -1
  285. package/src/runtime/shared/tool-surface.mjs +18 -3
  286. package/src/runtime/shared/tool-work-units.mjs +40 -4
  287. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  288. package/src/runtime/shared/transcript-writer.mjs +10 -2
  289. package/src/runtime/shared/turn-changes.mjs +268 -100
  290. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  291. package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
  292. package/src/runtime/shared/turn-snapshot.mjs +857 -683
  293. package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
  294. package/src/runtime/shared/user-data-guard.mjs +262 -49
  295. package/src/runtime/shared/worktrees/carry.mjs +531 -0
  296. package/src/runtime/shared/worktrees/contract.mjs +34 -0
  297. package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
  298. package/src/runtime/shared/worktrees/git-head.mjs +205 -0
  299. package/src/runtime/shared/worktrees/git.mjs +8 -3
  300. package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
  301. package/src/runtime/shared/worktrees/manager.mjs +156 -8
  302. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  303. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  304. package/src/runtime/terminal-bridge/client.mjs +44 -11
  305. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  306. package/src/runtime/tidy/apply.mjs +47 -2
  307. package/src/runtime/tidy/run-engines.mjs +11 -5
  308. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  309. package/src/session-runtime/boot/apis.mjs +13 -5
  310. package/src/session-runtime/boot/facade.mjs +1 -0
  311. package/src/session-runtime/boot/infrastructure.mjs +6 -1
  312. package/src/session-runtime/boot/session.mjs +0 -1
  313. package/src/session-runtime/boot/tools.mjs +4 -1
  314. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  315. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
  316. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  317. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
  318. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
  319. package/src/session-runtime/internal-tool-executor.mjs +6 -2
  320. package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
  321. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  322. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -3
  323. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  324. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
  325. package/src/session-runtime/lifecycle/teardown.mjs +72 -7
  326. package/src/session-runtime/lifecycle-api.mjs +1 -0
  327. package/src/session-runtime/mcp-glue/connect.mjs +17 -5
  328. package/src/session-runtime/model-route/set-route.mjs +2 -2
  329. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  330. package/src/session-runtime/native-web-search.mjs +10 -1
  331. package/src/session-runtime/new-session-config.mjs +4 -2
  332. package/src/session-runtime/provider-auth/login.mjs +4 -0
  333. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  334. package/src/session-runtime/runtime-review-api.mjs +8 -2
  335. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  336. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  337. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  338. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +73 -7
  339. package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
  340. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  341. package/src/session-runtime/services/agent-tool/worker-index.mjs +46 -7
  342. package/src/session-runtime/services/agent-tool.mjs +3 -0
  343. package/src/session-runtime/services/channel-admin.mjs +19 -3
  344. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  345. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  346. package/src/session-runtime/services/provider-admin.mjs +81 -15
  347. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  348. package/src/session-runtime/session-turn-api.mjs +14 -5
  349. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
  350. package/src/session-runtime/setup-tool/executor.mjs +36 -6
  351. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  352. package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
  353. package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
  354. package/src/session-runtime/skills-api.mjs +3 -5
  355. package/src/session-runtime/tool-surface.mjs +5 -1
  356. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  357. package/src/session-runtime/turn/session-ops.mjs +7 -5
  358. package/src/session-runtime/turn/side-question-ops.mjs +22 -0
  359. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
  360. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
  361. package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
  362. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  363. package/src/session-runtime/turn/turn-run.mjs +25 -9
  364. package/src/session-runtime/usage-stats-api.mjs +43 -11
  365. package/src/session-runtime/workspace/project-branches.mjs +7 -5
  366. package/src/session-runtime/workspace/transition-steps.mjs +129 -31
  367. package/src/session-runtime/workspace/transitions.mjs +190 -15
  368. package/src/standalone/daemon-agent-control.mjs +9 -1
  369. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  370. package/src/standalone/daemon-owner.mjs +17 -4
  371. package/src/standalone/daemon-pg-stop.mjs +51 -0
  372. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  373. package/src/standalone/daemon-stop-budget.mjs +18 -0
  374. package/src/standalone/daemon-stored-session-views.mjs +2 -0
  375. package/src/standalone/daemon-telemetry.mjs +19 -0
  376. package/src/standalone/daemon.mjs +61 -1
  377. package/src/standalone/desktop-service-registry.mjs +5 -0
  378. package/src/standalone/local-session-runtime.mjs +70 -19
  379. package/src/standalone/session-client.mjs +42 -0
  380. package/src/standalone/session-protocol.mjs +7 -0
  381. package/src/standalone/session-proxy/projection.mjs +41 -4
  382. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  383. package/src/standalone/session-runtime-inline-host.mjs +1 -0
  384. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  385. package/src/standalone/session-service-api.mjs +6 -1
  386. package/src/standalone/session-state-patch.d.mts +2 -1
  387. package/src/standalone/session-state-patch.mjs +41 -1
  388. package/src/tui/App.jsx +25 -0
  389. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  390. package/src/tui/app/btw-controller.mjs +118 -0
  391. package/src/tui/app/create-app-pickers.mjs +2 -0
  392. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  393. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  394. package/src/tui/app/slash-commands.mjs +13 -3
  395. package/src/tui/app/slash-dispatch/session-commands.mjs +19 -6
  396. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  397. package/src/tui/app/use-global-key-input.mjs +5 -12
  398. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  399. package/src/tui/components/BtwPanel.jsx +53 -0
  400. package/src/tui/components/QuestionPanel.jsx +275 -0
  401. package/src/tui/components/question-panel-model.mjs +156 -0
  402. package/src/tui/dist/index.mjs +2413 -1465
  403. package/src/tui/session/context-state.mjs +4 -2
  404. package/src/tui/session/session-api/commands.mjs +10 -0
  405. package/src/tui/session/session-api/controls.mjs +2 -2
  406. package/src/tui/session/session-api/integrations.mjs +9 -2
  407. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  408. package/src/tui/session/session-api/lifecycle.mjs +2 -1
  409. package/src/tui/session/session-api/settings.mjs +6 -0
  410. package/src/tui/session/session-api.mjs +1 -0
  411. package/src/tui/session/tool-approval.mjs +10 -7
  412. package/src/tui/session/transcript-spill.mjs +14 -7
  413. package/src/tui/session/turn-stream.mjs +174 -31
  414. package/src/tui/session/turn.mjs +12 -5
  415. package/src/workflows/default/WORKFLOW.md +3 -1
@@ -19,7 +19,7 @@ function cloneNativeBlock(block) {
19
19
  }
20
20
  }
21
21
 
22
- export function createContentBlockStart({ turn, blocks, state, progress }) {
22
+ export function createContentBlockStart({ turn, blocks, state, progress, seedText }) {
23
23
  const seedThinkingBlock = (index, block) => {
24
24
  if (block.type === 'redacted_thinking') {
25
25
  // Opaque redacted payload: real reasoning content, exposed as a block.
@@ -61,9 +61,16 @@ export function createContentBlockStart({ turn, blocks, state, progress }) {
61
61
  });
62
62
  }
63
63
  if (block?.type === 'text') {
64
- // Seed the ordered text slot (a text block may open with a non-empty
65
- // `text` before any delta).
66
- blocks.appendText(index, typeof block.text === 'string' ? block.text : '');
64
+ // Seed the ordered text slot. An empty block still needs its slot (it
65
+ // separates thinking runs); a non-empty opening `text` is model output
66
+ // and is routed exactly like a text_delta so it reaches the returned and
67
+ // live content once.
68
+ const initialText = typeof block.text === 'string' ? block.text : '';
69
+ if (initialText) seedText(index, initialText);
70
+ else blocks.appendText(index, '');
71
+ if (Array.isArray(block.citations)) {
72
+ for (const citation of block.citations) blocks.appendCitation(index, citation);
73
+ }
67
74
  }
68
75
  if (NATIVE_SERVER_TOOL_CALL_BLOCK_TYPES.has(block?.type)) {
69
76
  // Verbatim seed; `input` is completed from the streamed
@@ -26,6 +26,9 @@ export function createMessageEvents({ turn, blocks, state }) {
26
26
  if (event.delta && (event.delta.stop_details != null || event.delta.category != null)) {
27
27
  turn.stopDetails = stopDetailsFrom(event.delta);
28
28
  }
29
+ if (event.delta?.stop_sequence != null) {
30
+ turn.stopSequence = event.delta.stop_sequence;
31
+ }
29
32
  if (event.usage) updateTurnUsage(turn.usage, event.usage);
30
33
  // A terminal stop_reason while ANY tool input is still streaming ends the
31
34
  // turn truncated, immediately: the model declared it stopped sampling, so
@@ -21,18 +21,25 @@ export function createTurnEvents({
21
21
  labels,
22
22
  }) {
23
23
  const { onMessageStart, onMessageDelta, onMessageStop } = createMessageEvents({ turn, blocks, state });
24
+ const onContentBlockDelta = createContentBlockDelta({
25
+ turn,
26
+ blocks,
27
+ state,
28
+ leak,
29
+ relayText,
30
+ progress,
31
+ relayProgressUpdates,
32
+ });
24
33
  return {
25
34
  onMessageStart,
26
- onContentBlockStart: createContentBlockStart({ turn, blocks, state, progress }),
27
- onContentBlockDelta: createContentBlockDelta({
35
+ onContentBlockStart: createContentBlockStart({
28
36
  turn,
29
37
  blocks,
30
38
  state,
31
- leak,
32
- relayText,
33
39
  progress,
34
- relayProgressUpdates,
40
+ seedText: onContentBlockDelta.seedText,
35
41
  }),
42
+ onContentBlockDelta,
36
43
  onContentBlockStop: createContentBlockStop({ turn, blocks, state, leak, progress, onToolCall, labels }),
37
44
  onMessageDelta,
38
45
  onMessageStop,
@@ -138,6 +138,7 @@ export function createTurnOutcome({ turn, blocks, state, labels = OAUTH_STREAM_L
138
138
  usage: turn.usage,
139
139
  stopReason: turn.stopReason,
140
140
  stopDetails: turn.stopDetails,
141
+ ...(turn.stopSequence != null ? { stopSequence: turn.stopSequence } : {}),
141
142
  hasThinkingContent: turn.hasThinkingContent,
142
143
  contentBlockTypes: Array.from(turn.contentBlockTypes),
143
144
  // Ordered extended-thinking blocks (verbatim thinking text + signature)
@@ -5,6 +5,8 @@
5
5
  * module of the turn reads and writes this one object; nothing about the
6
6
  * turn's progress is hidden in a closure.
7
7
  */
8
+ import { reportedCostUsd } from '../lib/usage-primitives.mjs';
9
+ import { normalizeServerToolUse } from '../lib/anthropic-server-tool-usage.mjs';
8
10
 
9
11
  export function createAnthropicTurnState() {
10
12
  return {
@@ -16,6 +18,9 @@ export function createAnthropicTurnState() {
16
18
  usage: { inputTokens: 0, outputTokens: 0, cachedTokens: 0, cacheWriteTokens: 0, raw: null },
17
19
  stopReason: null,
18
20
  stopDetails: undefined,
21
+ // The custom stop sequence that ended the turn (message_delta
22
+ // delta.stop_sequence); stays undefined unless the API reports one.
23
+ stopSequence: undefined,
19
24
  fallbackEvents: [],
20
25
  // Set when a terminal frame (message_delta stop_reason / message_stop)
21
26
  // arrived while tool input was still in flight — used only to word the
@@ -35,6 +40,15 @@ export function updateTurnUsage(usage, raw) {
35
40
  if (raw.cache_creation?.ephemeral_1h_input_tokens != null) {
36
41
  usage.cacheWrite1hTokens = raw.cache_creation.ephemeral_1h_input_tokens;
37
42
  }
43
+ // A gateway's reported cost (OpenRouter puts `cost` on the final usage). It
44
+ // rides the turn usage itself, so a success, an abandoned attempt and a
45
+ // failure's partial usage all carry it to the provider-boundary ledger.
46
+ const costUsd = reportedCostUsd(raw.cost);
47
+ if (costUsd !== undefined) usage.costUsd = costUsd;
48
+ // Server-tool counters are cumulative in message_delta; a later report
49
+ // replaces the earlier one, an absent one preserves it.
50
+ const serverToolUse = normalizeServerToolUse(raw);
51
+ if (serverToolUse) usage.serverToolUse = serverToolUse;
38
52
  usage.raw = { ...(usage.raw || {}), ...raw };
39
53
  // Input excludes cache; all three slots contribute to prompt volume.
40
54
  usage.promptTokens = usage.inputTokens + usage.cachedTokens + usage.cacheWriteTokens;
@@ -75,9 +75,11 @@ const ANTHROPIC_SSE_ERROR_TYPE_STATUS = new Map([
75
75
  ['authentication_error', 401],
76
76
  ['permission_error', 403],
77
77
  ['not_found_error', 404],
78
+ ['conflict_error', 409],
78
79
  ['request_too_large', 413],
79
80
  ['rate_limit_error', 429],
80
81
  ['api_error', 500],
82
+ ['timeout_error', 504],
81
83
  ['overloaded_error', 529],
82
84
  ]);
83
85
 
@@ -10,6 +10,7 @@
10
10
  * account for usage identically.
11
11
  */
12
12
  import { traceAgentUsage } from '../agent-trace.mjs';
13
+ import { reportedCostUsd } from './lib/usage-primitives.mjs';
13
14
 
14
15
  /**
15
16
  * @param {object} parseResult the assembled turn (streaming or normalized non-streaming)
@@ -26,6 +27,7 @@ export function buildAnthropicTurnResult(parseResult, { provider, useModel, opts
26
27
  const output = parseResult.usage?.outputTokens || 0;
27
28
  const promptTokens = parseResult.usage?.promptTokens ?? input + cacheRead + cacheWrite;
28
29
  const liveModel = parseResult.model || useModel;
30
+ const costUsd = parseResult.usage?.costUsd ?? reportedCostUsd(usageRaw?.cost);
29
31
 
30
32
  if (usageRaw || input || output || cacheRead || cacheWrite) {
31
33
  traceAgentUsage({
@@ -53,6 +55,8 @@ export function buildAnthropicTurnResult(parseResult, { provider, useModel, opts
53
55
  model: liveModel,
54
56
  toolCalls: parseResult.toolCalls,
55
57
  stopReason: parseResult.stopReason || null,
58
+ ...(parseResult.stopDetails != null ? { stopDetails: parseResult.stopDetails } : {}),
59
+ ...(parseResult.stopSequence != null ? { stopSequence: parseResult.stopSequence } : {}),
56
60
  hasThinkingContent: !!parseResult.hasThinkingContent,
57
61
  contentBlockTypes: Array.isArray(parseResult.contentBlockTypes) ? parseResult.contentBlockTypes : [],
58
62
  // Round-trip adaptive-thinking blocks (verbatim thinking +
@@ -84,6 +88,11 @@ export function buildAnthropicTurnResult(parseResult, { provider, useModel, opts
84
88
  cacheWriteTokens: cacheWrite,
85
89
  ...(parseResult.usage?.cacheWrite1hTokens ? { cacheWrite1hTokens: parseResult.usage.cacheWrite1hTokens } : {}),
86
90
  promptTokens,
91
+ // A gateway-reported cost (OpenRouter `usage.cost`), when the turn has one.
92
+ ...(costUsd !== undefined ? { costUsd } : {}),
93
+ ...(parseResult.usage?.serverToolUse ? { serverToolUse: parseResult.usage.serverToolUse } : {}),
94
+ // Raw provider usage (incl. server_tool_use counters), as on the OAuth path.
95
+ ...(usageRaw ? { raw: usageRaw } : {}),
87
96
  },
88
97
  };
89
98
  }
@@ -83,6 +83,11 @@ export class AnthropicProvider {
83
83
  maxRetries: 0,
84
84
  });
85
85
  }
86
+ // The model id capability lookups (output cap, thinking/effort shape) read;
87
+ // a gateway engine maps its routing slug to the Claude id it stands for.
88
+ _capabilityModel(model) {
89
+ return model;
90
+ }
86
91
  reloadApiKey() {
87
92
  try {
88
93
  const newKey = reloadProviderApiKey(this.name, this.config);
@@ -149,6 +154,7 @@ export class AnthropicProvider {
149
154
  fastModeLatched: this.fastModeBetaHeaderLatched,
150
155
  // Custom providers carry per-model reasoning settings on their own rows.
151
156
  modelInfo: isCustomProviderName(this.name) ? this.getCachedModelInfo?.(useModel) || null : null,
157
+ capabilityModel: this._capabilityModel(useModel),
152
158
  });
153
159
  this.fastModeBetaHeaderLatched = fastModeLatched;
154
160
 
@@ -15,6 +15,12 @@ export function isAntigravityClaude(model) {
15
15
  return /^claude-/i.test(String(model || ''));
16
16
  }
17
17
 
18
+ // Claude declarations are validated for the gateway's Anthropic bridge in
19
+ // toGeminiTools (claudeBridge: true); a tool with an invalid schema is left
20
+ // out of the request and reported through `onToolExcluded` / console.warn.
21
+ const claudeRequestTools = (tools, nativeTools, onToolExcluded) =>
22
+ toGeminiRequestTools(tools, nativeTools, { claudeBridge: true, onToolExcluded });
23
+
18
24
  // Default function-calling mode when the caller sets no toolChoice. VALIDATED
19
25
  // (schema-constrained function calls) is what the Antigravity client sends;
20
26
  // MIXDOG_ANTIGRAVITY_FC_MODE=AUTO|ANY|VALIDATED overrides it for A/B runs.
@@ -35,14 +41,52 @@ function replayFamilyMatches(message, model) {
35
41
  return isAntigravityClaude(recorded) === isAntigravityClaude(model);
36
42
  }
37
43
 
44
+ // The stream records empty text parts around Claude tool calls; Cloud Code's
45
+ // Claude bridge rejects them on replay ("text.text: Field required").
46
+ const isEmptyPlainTextPart = (part) =>
47
+ part?.text === '' && part.thought !== true && typeof part.thoughtSignature !== 'string';
48
+
49
+ // Streamed Claude thinking arrives as many thought deltas with the signature
50
+ // on the closing (often empty) delta; the bridge turns every part into its own
51
+ // thinking block and rejects the unsigned ones ("thinking.signature: Field
52
+ // required"). Rejoin each run into one block that ends at its signature.
53
+ function coalesceClaudeThoughts(parts) {
54
+ const out = [];
55
+ let open = null;
56
+ for (const part of parts) {
57
+ if (part?.thought !== true) {
58
+ if (open) out.push(open);
59
+ open = null;
60
+ out.push(part);
61
+ continue;
62
+ }
63
+ open = open
64
+ ? { ...open, ...part, text: `${open.text}${typeof part.text === 'string' ? part.text : ''}` }
65
+ : { ...part, text: typeof part.text === 'string' ? part.text : '' };
66
+ if (typeof part.thoughtSignature === 'string') {
67
+ out.push(open);
68
+ open = null;
69
+ }
70
+ }
71
+ if (open) out.push(open);
72
+ return out;
73
+ }
74
+
38
75
  function signatureSafeMessages(messages, model) {
39
- return messages.map((message) => {
40
- if (message?.role !== 'assistant') return message;
76
+ const claude = isAntigravityClaude(model);
77
+ return messages.flatMap((message) => {
78
+ if (message?.role !== 'assistant') return [message];
41
79
  const ownParts = replayFamilyMatches(message, model) ? providerReplayItems(message, 'antigravity') : undefined;
42
80
  // Repair tool signatures only after the complete history establishes
43
81
  // the active turn, not while normalizing an isolated older message.
44
- const parts = ownParts || toGeminiContents([message], model, { repairToolSignatures: false })[0]?.parts;
45
- if (!parts?.length) return message;
82
+ const sourceParts = ownParts || toGeminiContents([message], model, { repairToolSignatures: false })[0]?.parts;
83
+ const parts =
84
+ claude && sourceParts
85
+ ? coalesceClaudeThoughts(sourceParts.filter((part) => !isEmptyPlainTextPart(part)))
86
+ : sourceParts;
87
+ // A turn that held only empty parts is omitted, not sent as parts:[].
88
+ if (sourceParts?.length && !parts.length) return [];
89
+ if (!parts?.length) return [message];
46
90
  for (const part of parts) {
47
91
  if (!part || typeof part !== 'object') continue;
48
92
  if (part.thought === true || typeof part.thoughtSignature === 'string') {
@@ -52,7 +96,7 @@ function signatureSafeMessages(messages, model) {
52
96
  if (!ownParts || !part.thoughtSignature) part.thoughtSignature = THOUGHT_SIGNATURE_SENTINEL;
53
97
  }
54
98
  }
55
- return { ...message, providerReplay: createProviderReplay('antigravity', parts) };
99
+ return [{ ...message, providerReplay: createProviderReplay('antigravity', parts) }];
56
100
  });
57
101
  }
58
102
 
@@ -121,9 +165,16 @@ export function buildAntigravityRequest(messages, model, tools, opts = {}, proje
121
165
  };
122
166
  const request = { contents };
123
167
  if (systemText) request.systemInstruction = { role: 'user', parts: [{ text: systemText }] };
124
- const requestTools = toGeminiRequestTools(tools, opts.nativeTools);
168
+ const requestTools = claude
169
+ ? claudeRequestTools(tools, opts.nativeTools, opts.onToolExcluded)
170
+ : toGeminiRequestTools(tools, opts.nativeTools, {
171
+ onToolExcluded: opts.onToolExcluded,
172
+ // Other families (GPT-OSS) keep the plain conversion.
173
+ validate: isGeminiFamilyModel(model),
174
+ });
125
175
  if (requestTools.length) request.tools = requestTools;
126
- if (tools?.length) {
176
+ // Tool config only accompanies function declarations that were kept.
177
+ if (requestTools.some((entry) => entry.functionDeclarations?.length)) {
127
178
  request.toolConfig = toGeminiToolConfig(opts.toolChoice) || {
128
179
  functionCallingConfig: { mode: antigravityFunctionCallingMode() },
129
180
  };
@@ -8,13 +8,20 @@
8
8
  */
9
9
  import { traceAgentUsage } from '../agent-trace.mjs';
10
10
  import { createProviderReplay } from './lib/provider-replay.mjs';
11
- import { parseToolCalls, collectGeminiGroundingSources, parseGeminiTextPartMetadata } from './gemini-schema.mjs';
12
- import { geminiPolicyFinishCode } from './gemini-error-contract.mjs';
11
+ import {
12
+ parseToolCalls,
13
+ emitGeminiToolCalls,
14
+ collectGeminiGroundingSources,
15
+ parseGeminiTextPartMetadata,
16
+ } from './gemini-schema.mjs';
17
+ import { geminiFinishErrorFields, geminiPolicyFinishCode } from './gemini-error-contract.mjs';
13
18
 
14
19
  // Pure usageMetadata normalization shared by the success path and a failed
15
20
  // stream's partialUsage.
16
21
  export function normalizeAntigravityUsage(um) {
17
- const inputTokens = um.promptTokenCount || um.prompt_token_count || 0;
22
+ const inputTokens =
23
+ (um.promptTokenCount || um.prompt_token_count || 0) +
24
+ (um.toolUsePromptTokenCount || um.tool_use_prompt_token_count || 0);
18
25
  const cachedTokens = um.cachedContentTokenCount || um.cached_content_token_count || 0;
19
26
  const outputTokens =
20
27
  (um.candidatesTokenCount || um.candidates_token_count || 0) +
@@ -28,7 +35,7 @@ export function normalizeAntigravityUsage(um) {
28
35
  * @param {ReturnType<import('./antigravity-stream.mjs').createAntigravityStreamCollector>} deps.collector
29
36
  * @param {string} deps.useModel wire model id
30
37
  * @param {object} deps.opts send options (session/iteration/providerState)
31
- * @param {Function|null} deps.onToolCall set when calls were streamed live
38
+ * @param {Function|null} deps.onToolCall receives the turn's calls after a clean finish
32
39
  */
33
40
  export function finalizeAntigravityTurn({ response, collector, useModel, opts, onToolCall }) {
34
41
  const textLeakGuard = collector.leakGuard;
@@ -46,10 +53,8 @@ export function finalizeAntigravityTurn({ response, collector, useModel, opts, o
46
53
  // Thought signatures are only valid for the model family that minted
47
54
  // them; the request builder consults this when the route changes.
48
55
  if (providerReplay) providerReplay.requestContext = { model: useModel };
49
- let nativeToolCalls;
50
- if (!onToolCall) nativeToolCalls = parseToolCalls(responseParts);
51
- else if (collector.streamedNativeToolCalls.length) nativeToolCalls = collector.streamedNativeToolCalls;
52
- if (!onToolCall && textLeakGuard?.enabled) nativeToolCalls = textLeakGuard.filterNativeToolCalls(nativeToolCalls);
56
+ let nativeToolCalls = parseToolCalls(responseParts);
57
+ if (textLeakGuard?.enabled) nativeToolCalls = textLeakGuard.filterNativeToolCalls(nativeToolCalls);
53
58
  let toolCalls = nativeToolCalls;
54
59
  if (leakedToolCalls.length) {
55
60
  toolCalls = toolCalls?.length ? [...toolCalls, ...leakedToolCalls] : leakedToolCalls;
@@ -80,7 +85,17 @@ export function finalizeAntigravityTurn({ response, collector, useModel, opts, o
80
85
  });
81
86
  }
82
87
 
83
- if (finishReason && normalizedFinish !== 'STOP') {
88
+ // A MAX_TOKENS cut that still delivered whole native functionCall parts is
89
+ // a tool-use turn: the calls arrived intact, only trailing output was cut.
90
+ // Every other non-STOP finish fails the turn, and so does a cut whose text
91
+ // also leaked a call (that call may be as truncated as the text around it).
92
+ const completeNativeCalls =
93
+ normalizedFinish === 'MAX_TOKENS' &&
94
+ String(candidate?.finishReason || '').replace(/^FINISH_REASON_/, '') === 'MAX_TOKENS' &&
95
+ !leakedToolCalls.length &&
96
+ !!nativeToolCalls?.length &&
97
+ nativeToolCalls.every((call) => typeof call?.name === 'string' && call.name !== '');
98
+ if (finishReason && normalizedFinish !== 'STOP' && !completeNativeCalls) {
84
99
  throw Object.assign(new Error(`Antigravity response incomplete: finishReason=${finishReason}`), {
85
100
  name: 'ProviderIncompleteError',
86
101
  code: geminiPolicyFinishCode(finishReason) || 'PROVIDER_INCOMPLETE',
@@ -93,10 +108,14 @@ export function finalizeAntigravityTurn({ response, collector, useModel, opts, o
93
108
  model: useModel,
94
109
  rawUsage: response.usageMetadata || null,
95
110
  ...(usage ? { partialUsage: usage, partialModel: useModel } : {}),
96
- ...(collector.emittedToolCount ? { emittedToolCall: true, unsafeToRetry: true } : {}),
111
+ ...geminiFinishErrorFields(response),
97
112
  });
98
113
  }
99
114
 
115
+ // Terminal status first: a failed turn never runs its tool calls.
116
+ textLeakGuard?.releaseDeferredToolCalls();
117
+ emitGeminiToolCalls(nativeToolCalls, onToolCall);
118
+
100
119
  return {
101
120
  content,
102
121
  model: useModel,
@@ -4,7 +4,8 @@
4
4
  *
5
5
  * capacity (429/503/529, MODEL_CAPACITY_EXHAUSTED, "server busy"): retried on
6
6
  * the SAME account and host with 1s → 2s → 4s (8s cap) ±10% jitter, three
7
- * retries, whatever wait the server names, then the failure surfaces.
7
+ * retries, waiting at least the server's RetryInfo delay; advice that
8
+ * would push total waiting past 60s surfaces the error (with resetAt).
8
9
  * Endpoint: the reference falls back to its next endpoint after a failure;
9
10
  * generation here deliberately stays on the single daily host and never
10
11
  * walks an endpoint list (a spent ladder surfaces to the account layer).
@@ -23,6 +24,8 @@ export const ANTIGRAVITY_CAPACITY_RETRIES = 3;
23
24
  export const ANTIGRAVITY_CAPACITY_BASE_MS = 1000;
24
25
  export const ANTIGRAVITY_CAPACITY_MAX_MS = 8000;
25
26
  export const ANTIGRAVITY_CAPACITY_JITTER_RATIO = 0.1;
27
+ // Total time capacity retries may spend waiting on server-advised delays.
28
+ export const ANTIGRAVITY_CAPACITY_BUDGET_MS = 60_000;
26
29
  export const ANTIGRAVITY_QUICK_RETRY_MS = 1000;
27
30
  export const ANTIGRAVITY_QUICK_RETRY_MAX_ADVICE_MS = 60_000;
28
31
 
@@ -60,10 +63,20 @@ export function antigravity429WaitMs(err, state) {
60
63
  if (DETERMINISTIC_KINDS.has(kind) || err.code === 'quota_exhausted' || err.quotaScope === 'day' || err.quotaScope === 'plan') {
61
64
  return null;
62
65
  }
63
- // Capacity follows the local schedule whatever wait the server names.
66
+ // Capacity waits at least the advised RetryInfo delay (the local schedule
67
+ // is the floor). Total advised waiting stays within the retry budget; an
68
+ // advice that does not fit surfaces with its reset time rather than
69
+ // retrying early.
64
70
  if (capacity) {
65
71
  if (state.capacityRetries >= ANTIGRAVITY_CAPACITY_RETRIES) return null;
66
- return antigravityCapacityDelayMs(state.capacityRetries++);
72
+ const spent = state.capacityWaitedMs ?? 0;
73
+ if (retryAfterMs != null && spent + retryAfterMs > ANTIGRAVITY_CAPACITY_BUDGET_MS) {
74
+ err.resetAt ??= Date.now() + retryAfterMs;
75
+ return null;
76
+ }
77
+ const wait = Math.max(antigravityCapacityDelayMs(state.capacityRetries++), retryAfterMs ?? 0);
78
+ state.capacityWaitedMs = spent + wait;
79
+ return wait;
67
80
  }
68
81
  // An RPM hit gets one quick retry; advice up to a minute is honored in
69
82
  // full, a longer wait surfaces so the account pool can rotate.
@@ -1,18 +1,15 @@
1
1
  /**
2
2
  * antigravity-stream.mjs — what one Antigravity SSE turn accumulates while it
3
3
  * streams: the live text mirror a retirement notice is recognised from, the
4
- * ordered parts of every chunk, the native tool calls parsed per chunk with
5
- * their id dedup, the leak guard that recovers calls the model wrote as text,
6
- * the first terminal finishReason, and the exposure marks a failed stream must
7
- * carry (emittedToolCall / unsafeToRetry / partial calls + partial replay).
4
+ * leak guard that recovers calls the model wrote as text (held back, like the
5
+ * native calls, until the turn finishes cleanly), and the first terminal
6
+ * finishReason. Nothing is dispatched while streaming.
8
7
  *
9
8
  * The transport (antigravity-transport.mjs) owns the socket and the retry
10
9
  * policy; the projection (antigravity-response.mjs) reads this record after
11
10
  * the turn settles.
12
11
  */
13
- import { createProviderReplay } from './lib/provider-replay.mjs';
14
12
  import { createGeminiTextLeakGuard, consumeGeminiRestStreamResponse } from './gemini-stream.mjs';
15
- import { parseToolCalls, emitGeminiToolCalls } from './gemini-schema.mjs';
16
13
  import { normalizeAntigravityUsage } from './antigravity-response.mjs';
17
14
 
18
15
  // A retired wire id answers with one plain-text notice and no finishReason.
@@ -46,10 +43,6 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
46
43
  // Streamed text is kept so a retirement notice can be told apart from
47
44
  // a truncated stream when the gateway omits the finishReason.
48
45
  let streamedText = '';
49
- let streamedParts = [];
50
- let streamedNativeToolCalls = [];
51
- const seenNativeToolIds = new Set();
52
- const emittedToolIds = new Set();
53
46
 
54
47
  const relayText = onTextDelta
55
48
  ? (text) => {
@@ -57,15 +50,9 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
57
50
  onTextDelta(text);
58
51
  }
59
52
  : null;
60
- const dispatchToolCall = onToolCall
61
- ? (call) => {
62
- // A failure already observed in this chunk must win over both
63
- // native calls and calls recovered from its text.
64
- if (terminalFailure || emittedToolIds.has(call.id)) return;
65
- emittedToolIds.add(call.id);
66
- onToolCall(call);
67
- }
68
- : null;
53
+ // Tool calls (native and text-recovered) are never dispatched while the
54
+ // stream runs: the turn's terminal verdict decides, and
55
+ // finalizeAntigravityTurn releases them only after a clean finish.
69
56
  const onChunk = (chunk) => {
70
57
  const candidate = chunk?.candidates?.[0];
71
58
  const finishReason =
@@ -74,37 +61,20 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
74
61
  if (finishReason && String(finishReason).replace(/^FINISH_REASON_/, '') !== 'STOP') {
75
62
  terminalFailure ||= finishReason;
76
63
  }
77
- if (!onToolCall) return;
78
- const parts = candidate?.content?.parts ?? [];
79
- streamedParts.push(...parts);
80
- if (terminalFailure || !parts.some((part) => part?.functionCall)) return;
81
- // Parse against the turn's parts so anonymous call IDs keep the
82
- // same ordinal as final parsing, even across separate SSE chunks.
83
- const fresh = (parseToolCalls(streamedParts) || []).filter((call) => {
84
- if (seenNativeToolIds.has(call.id)) return false;
85
- seenNativeToolIds.add(call.id);
86
- return true;
87
- });
88
- const calls = textLeakGuard?.enabled ? textLeakGuard.filterNativeToolCalls(fresh) : fresh;
89
- if (calls?.length) streamedNativeToolCalls.push(...calls);
90
- emitGeminiToolCalls(calls, dispatchToolCall);
91
64
  };
92
65
 
93
66
  // Each attempt starts from an empty record: a replayed request must not
94
- // inherit the dead attempt's text, parts or dispatched-call ids.
67
+ // inherit the dead attempt's text or failure.
95
68
  const beginAttempt = () => {
96
69
  textLeakGuard = createGeminiTextLeakGuard({
97
70
  knownToolNames: tools?.map((t) => t.name).filter(Boolean) ?? [],
98
71
  onTextDelta: relayText,
99
- onToolCall: dispatchToolCall,
72
+ onToolCall,
100
73
  onStreamDelta,
74
+ deferToolCalls: true,
101
75
  });
102
76
  streamedText = '';
103
77
  terminalFailure = null;
104
- streamedParts = [];
105
- streamedNativeToolCalls = [];
106
- seenNativeToolIds.clear();
107
- emittedToolIds.clear();
108
78
  };
109
79
  const releaseGuard = () => {
110
80
  textLeakGuard = null;
@@ -125,22 +95,7 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
125
95
  unwrapChunk: (chunk) => (chunk && typeof chunk === 'object' && chunk.response ? chunk.response : chunk),
126
96
  });
127
97
  } catch (streamErr) {
128
- const error = retiredModelError(streamErr, streamedText, useModel) || streamErr;
129
- // Native calls now run before EOF. Preserve
130
- // their history and prohibit resampling after
131
- // a tool callback.
132
- if (emittedToolIds.size) {
133
- error.emittedToolCall = true;
134
- error.unsafeToRetry = true;
135
- const leaked = textLeakGuard.getLeakedToolCalls();
136
- error.partialToolCalls = [...streamedNativeToolCalls, ...leaked];
137
- const replay = createProviderReplay('antigravity', leaked.length ? [] : streamedParts);
138
- if (replay) {
139
- replay.requestContext = { model: useModel };
140
- error.partialProviderReplay = replay;
141
- }
142
- }
143
- throw error;
98
+ throw retiredModelError(streamErr, streamedText, useModel) || streamErr;
144
99
  }
145
100
  };
146
101
 
@@ -155,11 +110,5 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
155
110
  get terminalFailure() {
156
111
  return terminalFailure;
157
112
  },
158
- get streamedNativeToolCalls() {
159
- return streamedNativeToolCalls;
160
- },
161
- get emittedToolCount() {
162
- return emittedToolIds.size;
163
- },
164
113
  };
165
114
  }
@@ -70,13 +70,19 @@ export function antigravityError(res, text, endpoint) {
70
70
  // Account verification is terminal and actionable: surface the URL Google
71
71
  // returns instead of a raw API body the user cannot act on.
72
72
  // Google puts the link in the error details, not the message text.
73
- const validationDetail = Array.isArray(detail?.details)
74
- ? detail.details.find(
75
- (entry) => entry?.reason === 'VALIDATION_REQUIRED' && typeof entry.metadata?.validation_url === 'string'
76
- )
77
- : null;
73
+ // Order: google.rpc.Help.links, metadata.validation_url, metadata.validation_link.
74
+ const detailEntries = Array.isArray(detail?.details) ? detail.details : [];
75
+ const helpUrl = detailEntries
76
+ .flatMap((entry) => (Array.isArray(entry?.links) ? entry.links : []))
77
+ .map((link) => link?.url)
78
+ .find((url) => typeof url === 'string' && url.length > 0);
79
+ const metadataUrl = (key) =>
80
+ detailEntries.find((entry) => entry?.reason === 'VALIDATION_REQUIRED' && typeof entry.metadata?.[key] === 'string' && entry.metadata[key])
81
+ ?.metadata[key];
78
82
  const validationUrl =
79
- validationDetail?.metadata.validation_url ||
83
+ helpUrl ||
84
+ metadataUrl('validation_url') ||
85
+ metadataUrl('validation_link') ||
80
86
  /https:\/\/\S*(?:accounts|console)\.google\.com\/\S+/.exec(message || '')?.[0] ||
81
87
  '';
82
88
  if (res.status === 403 && /VALIDATION_REQUIRED/i.test(text || '')) {
@@ -20,7 +20,7 @@ import { createNpmVersionSource, maxSemver } from './npm-cli-version.mjs';
20
20
  // version (gpt-6.1-sol requires >= 0.159.0, measured 2026-10-09), so the
21
21
  // release workflow raises this to the published CLI version on every release
22
22
  // (scripts/sync-client-version-floors.mjs).
23
- export const CODEX_CLIENT_VERSION_FLOOR = '0.162.1';
23
+ export const CODEX_CLIENT_VERSION_FLOOR = '0.163.0';
24
24
  export const CODEX_CLI_NPM_PACKAGE = '@openai/codex';
25
25
  const live = createNpmVersionSource(CODEX_CLI_NPM_PACKAGE, { persistKey: 'codex-cli' });
26
26