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
@@ -0,0 +1,388 @@
1
+ // Claude tool input schemas on the Antigravity gateway.
2
+ //
3
+ // The gateway's Claude bridge forwards `parametersJsonSchema` as an Anthropic
4
+ // `custom.input_schema`: JSON Schema draft 2020-12 with an object root and no
5
+ // root anyOf/oneOf/allOf/not. Following the MCP spec, a schema without
6
+ // `$schema` is 2020-12 and a declared dialect is honoured: draft-07 is
7
+ // translated to 2020-12 by the standard keyword mapping only (tuple `items` ->
8
+ // `prefixItems`, `additionalItems` -> `items`, `definitions` -> `$defs` with
9
+ // local refs rewritten, `dependencies` -> dependentRequired/dependentSchemas,
10
+ // keywords beside `$ref` dropped as draft-07 ignores them);
11
+ // any other dialect is unsupported. The result is checked with Ajv's 2020-12
12
+ // meta-schema and ref resolution, then against the provider's root rule. A
13
+ // schema that fails is invalid: nothing is rewritten to make it fit.
14
+ import Ajv2020 from 'ajv/dist/2020.js';
15
+
16
+ const DRAFT07 = { dropRefSiblings: true, renameDefs: true };
17
+ const MAP_KEYS = ['properties', 'patternProperties', '$defs', 'definitions', 'dependentSchemas'];
18
+ const NODE_KEYS = [
19
+ 'items',
20
+ 'additionalProperties',
21
+ 'unevaluatedItems',
22
+ 'unevaluatedProperties',
23
+ 'contains',
24
+ 'propertyNames',
25
+ 'not',
26
+ 'if',
27
+ 'then',
28
+ 'else',
29
+ 'contentSchema',
30
+ ];
31
+ const LIST_KEYS = ['prefixItems', 'allOf', 'anyOf', 'oneOf'];
32
+ const ROOT_FORBIDDEN_KEYS = ['anyOf', 'oneOf', 'allOf', 'not'];
33
+
34
+ const isPlainObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
35
+ export const escapePointer = (segment) => String(segment).replace(/~/g, '~0').replace(/\//g, '~1');
36
+ const put = (target, key, value) => {
37
+ Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
38
+ };
39
+
40
+ class SchemaProblem extends Error {
41
+ constructor(pointer, reason) {
42
+ super(reason);
43
+ this.pointer = pointer;
44
+ }
45
+ }
46
+
47
+ // ---- dialect -----------------------------------------------------------------
48
+
49
+ function dialectOf(schema) {
50
+ if (schema.$schema === undefined) return '2020-12';
51
+ const declared =
52
+ typeof schema.$schema === 'string' ? schema.$schema.replace(/^https?:\/\//, '').replace(/#$/, '') : '';
53
+ if (declared === 'json-schema.org/draft/2020-12/schema') return '2020-12';
54
+ if (declared === 'json-schema.org/draft-07/schema') return 'draft-07';
55
+ throw new SchemaProblem(
56
+ '/$schema',
57
+ `unsupported JSON Schema dialect ${JSON.stringify(schema.$schema)} (supported: 2020-12, draft-07)`
58
+ );
59
+ }
60
+
61
+ // ---- draft-07 -> 2020-12 -------------------------------------------------------
62
+
63
+ const isResourceId = (node) => typeof node.$id === 'string' && !node.$id.startsWith('#');
64
+ const rewriteRef = (ref) =>
65
+ ref.replace('#/definitions', (match, offset, whole) => {
66
+ const next = whole[offset + match.length];
67
+ return next === undefined || next === '/' ? '#/$defs' : match;
68
+ });
69
+
70
+ function translateMap(map, ptr, ctx) {
71
+ const out = {};
72
+ for (const [name, child] of Object.entries(map))
73
+ put(out, name, translateDraft07(child, `${ptr}/${escapePointer(name)}`, false, ctx));
74
+ return out;
75
+ }
76
+
77
+ function translateDraft07(node, ptr, isRoot, ctx) {
78
+ if (!isPlainObject(node)) return structuredClone(node);
79
+ const resource = isRoot || isResourceId(node);
80
+ const tuple = Array.isArray(node.items);
81
+ const out = {};
82
+ let legacyDefs;
83
+ // Draft-07 ignores every keyword beside `$ref`; 2020-12 evaluates them. Only
84
+ // the reference (and `definitions`, which a pointer ref may still resolve
85
+ // into) is kept, so the translated schema accepts what the original did.
86
+ const isRef = ctx.dropRefSiblings && typeof node.$ref === 'string';
87
+ for (const [key, value] of Object.entries(node)) {
88
+ if (isRef && key !== '$ref' && key !== 'definitions') continue;
89
+ const at = `${ptr}/${escapePointer(key)}`;
90
+ // Draft-04 boolean bounds: `minimum: n, exclusiveMinimum: true` is
91
+ // 2020-12's `exclusiveMinimum: n`; `false` is the default.
92
+ if ((key === 'exclusiveMinimum' || key === 'exclusiveMaximum') && typeof value === 'boolean') {
93
+ const bound = key === 'exclusiveMinimum' ? 'minimum' : 'maximum';
94
+ if (value && typeof node[bound] === 'number') put(out, key, node[bound]);
95
+ continue;
96
+ }
97
+ if (
98
+ typeof value === 'number' &&
99
+ ((key === 'minimum' && node.exclusiveMinimum === true) || (key === 'maximum' && node.exclusiveMaximum === true))
100
+ ) {
101
+ continue;
102
+ }
103
+ if (key === 'items' && tuple) {
104
+ if (Object.hasOwn(node, 'prefixItems'))
105
+ throw new SchemaProblem(at, 'tuple "items" array conflicts with "prefixItems"');
106
+ put(
107
+ out,
108
+ 'prefixItems',
109
+ value.map((child, i) => translateDraft07(child, `${at}/${i}`, false, ctx))
110
+ );
111
+ } else if (key === 'additionalItems' && tuple) {
112
+ put(out, 'items', translateDraft07(value, at, false, ctx));
113
+ } else if (key === 'dependencies' && isPlainObject(value)) {
114
+ if (Object.hasOwn(node, 'dependentRequired') || Object.hasOwn(node, 'dependentSchemas')) {
115
+ throw new SchemaProblem(at, '"dependencies" conflicts with dependentRequired/dependentSchemas');
116
+ }
117
+ for (const [name, dep] of Object.entries(value)) {
118
+ const target = Array.isArray(dep) ? 'dependentRequired' : 'dependentSchemas';
119
+ if (!Object.hasOwn(out, target)) put(out, target, {});
120
+ put(
121
+ out[target],
122
+ name,
123
+ Array.isArray(dep) ? structuredClone(dep) : translateDraft07(dep, `${at}/${escapePointer(name)}`, false, ctx)
124
+ );
125
+ }
126
+ } else if (key === 'definitions' && resource && ctx.renameDefs && isPlainObject(value)) {
127
+ legacyDefs = { value: translateMap(value, at, ctx), at };
128
+ } else if (key === '$ref' && typeof value === 'string') {
129
+ put(out, key, ctx.renameDefs ? rewriteRef(value) : value);
130
+ } else if (MAP_KEYS.includes(key) && isPlainObject(value)) {
131
+ put(out, key, translateMap(value, at, ctx));
132
+ } else if (NODE_KEYS.includes(key)) {
133
+ put(out, key, translateDraft07(value, at, false, ctx));
134
+ } else if (LIST_KEYS.includes(key) && Array.isArray(value)) {
135
+ put(
136
+ out,
137
+ key,
138
+ value.map((child, i) => translateDraft07(child, `${at}/${i}`, false, ctx))
139
+ );
140
+ } else {
141
+ put(out, key, structuredClone(value));
142
+ }
143
+ }
144
+ if (legacyDefs) {
145
+ if (Object.hasOwn(out, '$defs'))
146
+ throw new SchemaProblem(legacyDefs.at, '"definitions" and "$defs" are both present');
147
+ put(out, '$defs', legacyDefs.value);
148
+ }
149
+ return out;
150
+ }
151
+
152
+ // ---- validation ----------------------------------------------------------------
153
+
154
+ // Where a `$ref` the validator could not resolve is written (diagnostics only).
155
+ function refPointer(node, matches, ptr = '') {
156
+ if (Array.isArray(node)) {
157
+ for (const [i, child] of node.entries()) {
158
+ const found = refPointer(child, matches, `${ptr}/${i}`);
159
+ if (found !== undefined) return found;
160
+ }
161
+ } else if (isPlainObject(node)) {
162
+ if (typeof node.$ref === 'string' && matches(node.$ref)) return `${ptr}/$ref`;
163
+ for (const [key, child] of Object.entries(node)) {
164
+ const found = refPointer(child, matches, `${ptr}/${escapePointer(key)}`);
165
+ if (found !== undefined) return found;
166
+ }
167
+ }
168
+ return undefined;
169
+ }
170
+
171
+ function assertValidDraft202012(schema) {
172
+ const ajv = new Ajv2020({ strict: false, validateFormats: false, validateSchema: false });
173
+ // Draft-04 `id` is an annotation providers ignore; Ajv would refuse it.
174
+ ajv.removeKeyword('id');
175
+ ajv.addKeyword('id');
176
+ if (!ajv.validateSchema(schema)) {
177
+ const [error] = ajv.errors;
178
+ throw new SchemaProblem(error.instancePath, `not a valid JSON Schema 2020-12 schema: ${error.message}`);
179
+ }
180
+ try {
181
+ ajv.compile(schema);
182
+ } catch (error) {
183
+ if (!error.missingRef) throw new SchemaProblem('', error.message);
184
+ const pointer = refPointer(schema, (ref) => error.missingRef === ref || error.missingRef.endsWith(ref)) ?? '';
185
+ throw new SchemaProblem(pointer, `unresolvable $ref "${error.missingRef}"`);
186
+ }
187
+ }
188
+
189
+ // `rule`: 'anthropic' (object root, no root combinators), 'openai' (object
190
+ // root) or 'gemini' (object root, or no type at all).
191
+ function assertObjectRoot(schema, rule) {
192
+ const label = rule === 'anthropic' ? 'Anthropic input_schema root' : 'the input schema root';
193
+ if (rule === 'gemini' && schema.type === undefined) return;
194
+ if (schema.type !== 'object') throw new SchemaProblem('/type', `${label} must have type "object"`);
195
+ if (rule !== 'anthropic') return;
196
+ for (const key of ROOT_FORBIDDEN_KEYS) {
197
+ if (Object.hasOwn(schema, key)) {
198
+ throw new SchemaProblem(`/${key}`, `Anthropic input_schema does not allow a root "${key}"`);
199
+ }
200
+ }
201
+ }
202
+
203
+ function buildSchema(inputSchema) {
204
+ if (!isPlainObject(inputSchema)) throw new SchemaProblem('', 'the input schema must be a JSON object schema');
205
+ const { $schema, ...rest } = inputSchema;
206
+ const schema = dialectOf(inputSchema) === 'draft-07' ? translateDraft07(rest, '', true, DRAFT07) : structuredClone(rest);
207
+ assertValidDraft202012(schema);
208
+ assertObjectRoot(schema, 'anthropic');
209
+ return schema;
210
+ }
211
+
212
+ // ---- per-wire normalization -----------------------------------------------------
213
+ //
214
+ // A schema the wire accepts as written is sent as written (byte-identical, so
215
+ // the prompt cache holds). Only a schema that fails validation is repaired --
216
+ // draft-07/04 constructs lowered to 2020-12 (tuple `items`, `definitions`,
217
+ // `dependencies`, boolean exclusive bounds, keywords beside `$ref`), a missing
218
+ // root `type` filled in -- and re-validated; what still fails is excluded.
219
+
220
+ function repairRoot(schema) {
221
+ const { type } = schema;
222
+ if (Array.isArray(type) && type.includes('object')) return { ...schema, type: 'object' };
223
+ if (type !== undefined || Object.hasOwn(schema, '$ref')) return schema;
224
+ const out = { type: 'object', ...schema };
225
+ if (!Object.hasOwn(out, 'properties') && !ROOT_FORBIDDEN_KEYS.some((k) => Object.hasOwn(out, k)))
226
+ out.properties = {};
227
+ return out;
228
+ }
229
+
230
+ // Whether any `$ref` points into a draft-07 `#/definitions` table.
231
+ function refsIntoDefinitions(node) {
232
+ if (Array.isArray(node)) return node.some(refsIntoDefinitions);
233
+ if (!isPlainObject(node)) return false;
234
+ return Object.entries(node).some(
235
+ ([key, value]) => (key === '$ref' && typeof value === 'string' && /^#\/definitions(\/|$)/.test(value)) || refsIntoDefinitions(value)
236
+ );
237
+ }
238
+
239
+ // Only a schema that declares draft-07/04 gets draft-07 `$ref` semantics
240
+ // (keywords beside `$ref` ignored); otherwise siblings are real constraints.
241
+ const declaresLegacyDraft = ($schema) => typeof $schema === 'string' && /draft-0[4-7]/.test($schema);
242
+
243
+ /** The lowered copy of a tool input schema for `rule`, or null when it cannot
244
+ * be lowered. Fixes only what validation rejects: tuple `items`, boolean
245
+ * exclusive bounds, `dependencies`, draft-07 `definitions` refs and the root
246
+ * `type`. Never mutates `inputSchema`. */
247
+ export function repairedToolInputSchema(inputSchema, rule) {
248
+ if (!isPlainObject(inputSchema)) return null;
249
+ const { $schema, ...rest } = inputSchema;
250
+ try {
251
+ const lowered = translateDraft07(rest, '', true, {
252
+ dropRefSiblings: declaresLegacyDraft($schema),
253
+ renameDefs: refsIntoDefinitions(rest),
254
+ });
255
+ return rule === 'gemini' ? lowered : repairRoot(lowered);
256
+ } catch (error) {
257
+ if (error instanceof SchemaProblem) return null;
258
+ throw error;
259
+ }
260
+ }
261
+
262
+ const wireProblems = new Map();
263
+
264
+ /** Why `schema` is not accepted as written on a `rule` wire, as `{ pointer,
265
+ * reason }`, or null. `$schema` is not validated against (the provider reads
266
+ * the keywords, not the dialect). */
267
+ function wireProblem(schema, rule) {
268
+ let key;
269
+ try {
270
+ key = `${rule}\0${JSON.stringify(schema) ?? 'undefined'}`;
271
+ } catch {
272
+ key = null;
273
+ }
274
+ if (key !== null && wireProblems.has(key)) return wireProblems.get(key);
275
+ let problem = null;
276
+ try {
277
+ if (!isPlainObject(schema)) throw new SchemaProblem('', 'the input schema must be a JSON object schema');
278
+ const { $schema, ...rest } = schema;
279
+ assertValidDraft202012(rest);
280
+ assertObjectRoot(rest, rule);
281
+ } catch (error) {
282
+ if (!(error instanceof SchemaProblem)) throw error;
283
+ problem = { pointer: error.pointer, reason: error.message };
284
+ }
285
+ if (key !== null) {
286
+ if (wireProblems.size >= CACHE_LIMIT) wireProblems.clear();
287
+ wireProblems.set(key, problem);
288
+ }
289
+ return problem;
290
+ }
291
+
292
+ /** The schema to send for a tool on a `rule` wire: `{ schema }` (the same
293
+ * object when it is accepted as written, else its lowered copy), or `{
294
+ * pointer, reason }` when it is broken even after lowering. */
295
+ export function wireInputSchema(inputSchema, rule) {
296
+ const problem = wireProblem(inputSchema, rule);
297
+ if (!problem) return { schema: inputSchema };
298
+ const repaired = repairedToolInputSchema(inputSchema, rule);
299
+ const remaining = repaired ? wireProblem(repaired, rule) : problem;
300
+ return remaining || { schema: repaired };
301
+ }
302
+
303
+ /** `tools` with each unacceptable one left out (reported through
304
+ * `onToolExcluded`) and each repairable one carrying its lowered schema; the
305
+ * same array when nothing changed. A tool without a schema is sent as
306
+ * written, as is any tool `isExempt` names (no JSON schema on the wire). */
307
+ export function acceptedWireTools(tools, rule, onToolExcluded, source, isExempt = () => false) {
308
+ let changed = false;
309
+ const out = [];
310
+ tools.forEach((tool, index) => {
311
+ const schema = tool?.inputSchema;
312
+ if (schema == null || isExempt(tool)) {
313
+ out.push(tool);
314
+ return;
315
+ }
316
+ const result = wireInputSchema(schema, rule);
317
+ if (!result.schema) {
318
+ reportInvalidTool(tool.name, index, result, onToolExcluded, source);
319
+ changed = true;
320
+ } else if (result.schema !== schema) {
321
+ out.push({ ...tool, inputSchema: result.schema });
322
+ changed = true;
323
+ } else out.push(tool);
324
+ });
325
+ return changed ? out : tools;
326
+ }
327
+
328
+ const cache = new Map();
329
+ const CACHE_LIMIT = 256;
330
+
331
+ /** The draft 2020-12 `parametersJsonSchema` for a Claude tool declaration:
332
+ * `{ schema }`, or `{ pointer, reason }` (a JSON pointer into the tool's own
333
+ * input schema) when the schema is invalid under its dialect or for the
334
+ * provider. Never mutates `inputSchema`. */
335
+ export function claudeBridgeInputSchema(inputSchema) {
336
+ let key;
337
+ try {
338
+ key = JSON.stringify(inputSchema) ?? 'undefined';
339
+ } catch {
340
+ key = null;
341
+ }
342
+ let result = key === null ? undefined : cache.get(key);
343
+ if (!result) {
344
+ try {
345
+ result = { schema: buildSchema(inputSchema) };
346
+ } catch (error) {
347
+ if (!(error instanceof SchemaProblem)) throw error;
348
+ // Not valid as written: lower undeclared draft-07/04 constructs and
349
+ // fill the root type; only a schema still broken is excluded.
350
+ const repaired = repairedToolInputSchema(inputSchema, 'anthropic');
351
+ result = repaired && !wireProblem(repaired, 'anthropic') ? { schema: repaired } : { pointer: error.pointer, reason: error.message };
352
+ }
353
+ if (key !== null) {
354
+ if (cache.size >= CACHE_LIMIT) cache.clear();
355
+ cache.set(key, result);
356
+ }
357
+ }
358
+ return result.schema ? { schema: structuredClone(result.schema) } : result;
359
+ }
360
+
361
+ /** Why `schema` is not a valid Gemini `parametersJsonSchema` (a JSON Schema
362
+ * 2020-12 schema with an object root), as `{ pointer, reason }` into the
363
+ * schema, or null when it is valid. Never mutates `schema`. */
364
+ export const geminiJsonSchemaProblem = (schema) => wireProblem(schema, 'gemini');
365
+
366
+ const warned = new Set();
367
+
368
+ /** An invalid tool is left out of the request and reported with its name,
369
+ * index, pointer and reason: to `onToolExcluded({ name, index, pointer,
370
+ * reason, message })` when given (the agent loop records it for the session),
371
+ * otherwise once per distinct problem on console.warn. `source` prefixes the
372
+ * console message (which route and kind of tool). */
373
+ export function reportInvalidTool(
374
+ toolName,
375
+ index,
376
+ { pointer, reason },
377
+ onToolExcluded,
378
+ source = '[antigravity] Claude tool'
379
+ ) {
380
+ const at = pointer || '/';
381
+ const message = `${source} "${toolName}" (tools[${index}]) excluded: invalid input schema at "${at}": ${reason}`;
382
+ if (typeof onToolExcluded === 'function') {
383
+ return onToolExcluded({ name: toolName, index, pointer: at, reason, message });
384
+ }
385
+ if (warned.has(message)) return undefined;
386
+ warned.add(message);
387
+ return console.warn(message);
388
+ }
@@ -0,0 +1,54 @@
1
+ // Anthropic Messages usage reports input EXCLUDING cache read/write. A gateway
2
+ // provider whose ledger convention is inclusive input (OpenCode Go, Command
3
+ // Code, OpenRouter, DeepSeek — registry inputExcludesCache:false) reports its
4
+ // Messages route in that inclusive form, so every wire of one provider counts
5
+ // prompt volume the same way.
6
+ import { currentUsageContext } from '../../../../shared/llm/usage-context.mjs';
7
+
8
+ // Usage objects already converted to the inclusive convention; a converted
9
+ // object passing through another normalization (nested send) stays as is,
10
+ // and one source object always converts to the same object, so an abandoned
11
+ // attempt and the error that later carries it stay one record.
12
+ const inclusiveUsage = new WeakSet();
13
+ const convertedUsage = new WeakMap();
14
+
15
+ export function toInclusiveUsage(usage) {
16
+ if (!usage || inclusiveUsage.has(usage)) return usage;
17
+ if (convertedUsage.has(usage)) return convertedUsage.get(usage);
18
+ const input = Number(usage.inputTokens) || 0;
19
+ const cached = Number(usage.cachedTokens) || 0;
20
+ const cacheWrite = Number(usage.cacheWriteTokens) || 0;
21
+ const inclusiveInput = input + cached + cacheWrite;
22
+ const converted = {
23
+ ...usage,
24
+ inputTokens: inclusiveInput,
25
+ promptTokens: Math.max(Number(usage.promptTokens) || 0, inclusiveInput),
26
+ };
27
+ inclusiveUsage.add(converted);
28
+ convertedUsage.set(usage, converted);
29
+ return converted;
30
+ }
31
+
32
+ export function toInclusiveUsageError(error) {
33
+ if (error && typeof error === 'object') {
34
+ if (error.usage) error.usage = toInclusiveUsage(error.usage);
35
+ if (error.partialUsage) error.partialUsage = toInclusiveUsage(error.partialUsage);
36
+ }
37
+ return error;
38
+ }
39
+
40
+ /**
41
+ * Run one Messages-wire send of an inclusive-input provider: the success
42
+ * usage, a failure's usage/partial usage and every abandoned attempt the
43
+ * inner Anthropic transport notes are all reported inclusive.
44
+ */
45
+ export async function withInclusiveUsage(send) {
46
+ const identity = currentUsageContext();
47
+ if (identity) identity.normalizeAbandonedUsage = toInclusiveUsage;
48
+ try {
49
+ const result = await send();
50
+ return result?.usage ? { ...result, usage: toInclusiveUsage(result.usage) } : result;
51
+ } catch (error) {
52
+ throw toInclusiveUsageError(error);
53
+ }
54
+ }
@@ -0,0 +1,16 @@
1
+ // A fetch bound to one gateway origin: anything outside `origin` is refused
2
+ // before the credential leaves the process, and redirects are never followed
3
+ // (any 3xx is an error), so a gateway credential can only reach its gateway.
4
+ export function originBoundFetch(origin, fetchImpl, label) {
5
+ return async (input, init) => {
6
+ const url = new URL(String(input?.url ?? input));
7
+ if (url.origin !== origin) {
8
+ throw new Error(`[${label}] refusing to send the API key to ${url.host}`);
9
+ }
10
+ const res = await (fetchImpl || globalThis.fetch)(input, { ...init, redirect: 'manual' });
11
+ if (res.status >= 300 && res.status < 400) {
12
+ throw new Error(`[${label}] refusing to follow a redirect from ${url.host}`);
13
+ }
14
+ return res;
15
+ };
16
+ }
@@ -23,6 +23,17 @@ export function incompleteReasonFromEvent(event) {
23
23
  return String(reasonObj?.reason || event?.response?.status || 'incomplete');
24
24
  }
25
25
 
26
+ // A function/custom/tool_search call item the server cut off (status
27
+ // 'incomplete'): its arguments or input are truncated, so it is never a call
28
+ // to run or replay. The stream keeps it tracked as a tool still in flight, so
29
+ // the terminal frame reads as a pending-tool cutoff.
30
+ export function isIncompleteToolItem(item) {
31
+ return (
32
+ item?.status === 'incomplete' &&
33
+ (item.type === 'function_call' || item.type === 'custom_tool_call' || item.type === 'tool_search_call')
34
+ );
35
+ }
36
+
26
37
  export function isMaxOutputIncompleteReason(reason) {
27
38
  return /^(?:max_output_tokens|max_tokens|length|output_token_limit)$/i.test(String(reason || '').trim());
28
39
  }
@@ -19,6 +19,14 @@ export function round(value, digits = 4) {
19
19
  return Math.round(n * scale) / scale;
20
20
  }
21
21
 
22
+ // Provider-reported USD cost. null/empty/non-finite/negative is "not
23
+ // reported" (undefined), never a reported $0.
24
+ export function reportedCostUsd(value) {
25
+ if (value == null || (typeof value === 'string' && value.trim() === '')) return undefined;
26
+ const n = Number(value);
27
+ return Number.isFinite(n) && n >= 0 ? n : undefined;
28
+ }
29
+
22
30
  export function cleanString(value) {
23
31
  const s = typeof value === 'string' ? value.trim() : '';
24
32
  return s || null;
@@ -25,10 +25,19 @@ function isObject(value) {
25
25
  return value !== null && typeof value === 'object' && !Array.isArray(value);
26
26
  }
27
27
 
28
+ // A server-executed tool search (execution:'server', or call_id null) is
29
+ // answered by the server inside the same response. It is never a client call
30
+ // awaiting a client output, so the guard neither pairs nor synthesizes it.
31
+ function isServerToolSearch(item) {
32
+ return (item.type === 'tool_search_call' || item.type === 'tool_search_output') &&
33
+ (item.execution === 'server' || item.call_id === null);
34
+ }
35
+
28
36
  function responsesCallId(item) {
29
37
  if (!isObject(item)) return null;
30
38
  if (item.type !== 'function_call' && item.type !== 'custom_tool_call' && item.type !== 'tool_search_call')
31
39
  return null;
40
+ if (isServerToolSearch(item)) return null;
32
41
  const id = item.call_id || item.id || '';
33
42
  return typeof id === 'string' && id ? id : null;
34
43
  }
@@ -41,6 +50,7 @@ function responsesOutputId(item) {
41
50
  item.type !== 'tool_search_output'
42
51
  )
43
52
  return null;
53
+ if (isServerToolSearch(item)) return null;
44
54
  const id = item.call_id || item.id || '';
45
55
  return typeof id === 'string' && id ? id : null;
46
56
  }
@@ -50,7 +60,6 @@ function syntheticResponsesOutput(call) {
50
60
  return {
51
61
  type: 'custom_tool_call_output',
52
62
  call_id: call.call_id || call.id || '',
53
- ...(typeof call.name === 'string' && call.name ? { name: call.name } : {}),
54
63
  output: WIRE_PAIRING_STUB,
55
64
  };
56
65
  }
@@ -117,33 +126,50 @@ function chatResultId(message) {
117
126
  }
118
127
 
119
128
  /**
120
- * Ensure every chat assistant `tool_calls` entry has a following tool
121
- * message. Returns the original array when already paired, otherwise a new
122
- * array with synthetic tool messages inserted right after their assistant
123
- * message (providers require the results to follow the call message).
129
+ * Ensure every chat assistant `tool_calls` entry is answered by a tool
130
+ * message in the run immediately following that assistant message (OpenAI
131
+ * function calling / Meta chat contract), and that no tool message exists
132
+ * anywhere else. A result after an intervening user/assistant message, or one
133
+ * answering another occurrence of the same id, does not pair the call; the
134
+ * call gets a synthetic stub right after its assistant message and the
135
+ * misplaced tool message is DROPPED (Chat Completions rejects a tool message
136
+ * that does not follow its tool_calls block; a late result is not relocated).
137
+ * Within the run, results for ids the block did not call and repeated results
138
+ * for one id are dropped too. Returns the original array when already valid.
124
139
  */
125
140
  export function ensureChatToolPairs(messages) {
126
141
  if (!Array.isArray(messages) || messages.length === 0) return messages;
127
- const resultIds = new Set();
128
- for (const message of messages) {
129
- const id = chatResultId(message);
130
- if (id) resultIds.add(id);
131
- }
132
- let missing = 0;
133
- for (const message of messages) {
134
- for (const id of chatToolCallIds(message)) {
135
- if (!resultIds.has(id)) missing += 1;
136
- }
137
- }
138
- if (missing === 0) return messages;
139
142
  const out = [];
140
- for (const message of messages) {
143
+ let changed = false;
144
+ for (let i = 0; i < messages.length; i += 1) {
145
+ const message = messages[i];
146
+ if (isObject(message) && message.role === 'tool') {
147
+ changed = true;
148
+ continue;
149
+ }
141
150
  out.push(message);
142
- for (const id of chatToolCallIds(message)) {
143
- if (resultIds.has(id)) continue;
151
+ const callIds = chatToolCallIds(message);
152
+ if (!callIds.length) continue;
153
+ let end = i + 1;
154
+ while (end < messages.length && isObject(messages[end]) && messages[end].role === 'tool') end += 1;
155
+ const answered = new Set();
156
+ const kept = [];
157
+ for (const result of messages.slice(i + 1, end)) {
158
+ const id = chatResultId(result);
159
+ if (id && callIds.includes(id) && !answered.has(id)) {
160
+ answered.add(id);
161
+ kept.push(result);
162
+ } else {
163
+ changed = true;
164
+ }
165
+ }
166
+ for (const id of callIds) {
167
+ if (answered.has(id)) continue;
168
+ changed = true;
144
169
  out.push({ role: 'tool', tool_call_id: id, content: WIRE_PAIRING_STUB });
145
- resultIds.add(id);
146
170
  }
171
+ out.push(...kept);
172
+ i = end - 1;
147
173
  }
148
- return out;
174
+ return changed ? out : messages;
149
175
  }