mixdog 1.4.1 → 1.4.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 (630) hide show
  1. package/package.json +4 -3
  2. package/scripts/build-shipped-history.mjs +125 -33
  3. package/scripts/gate-local.mjs +220 -63
  4. package/scripts/graph-parity.mjs +8 -3
  5. package/scripts/lib/gate-scheduler.mjs +139 -32
  6. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  7. package/scripts/lib/run-node-tests.mjs +71 -34
  8. package/scripts/lib/scoped-temp.mjs +1 -0
  9. package/scripts/lib/test-failure-records.mjs +14 -1
  10. package/scripts/lib/test-failure-summary.mjs +9 -4
  11. package/scripts/lib/test-spawn-ledger.mjs +43 -3
  12. package/scripts/post-release-check.mjs +26 -16
  13. package/scripts/pptx-kit-index.mjs +5 -6
  14. package/scripts/provider-pingpong-live.mjs +1 -1
  15. package/scripts/prune-embedding-runtime.mjs +3 -1
  16. package/scripts/release-paths.mjs +7 -1
  17. package/scripts/suite-health.mjs +110 -28
  18. package/scripts/test.mjs +9 -14
  19. package/src/agents/advisor/AGENT.md +4 -4
  20. package/src/agents/advisor/agent.json +1 -1
  21. package/src/agents/explore/AGENT.md +22 -0
  22. package/src/agents/explore/agent.json +6 -0
  23. package/src/cli.mjs +7 -0
  24. package/src/defaults/agents.json +7 -0
  25. package/src/defaults/shipped-history.json +38 -2
  26. package/src/defaults/skills/browser-use/SKILL.md +4 -1
  27. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  28. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  29. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  30. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  31. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  32. package/src/defaults/skills/computer-use/SKILL.md +12 -2
  33. package/src/defaults/skills/setup/SKILL.md +2 -2
  34. package/src/defaults/skills/setup/references/actions.md +28 -9
  35. package/src/defaults/skills/setup/references/surfaces.md +5 -2
  36. package/src/defaults/skills/setup-guide/SKILL.md +11 -3
  37. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  38. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  39. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  40. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  41. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  42. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  43. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  44. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  45. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  46. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  47. package/src/defaults/skills/visualize/SKILL.md +6 -2
  48. package/src/lib/instruction-text.cjs +36 -0
  49. package/src/lib/rules-builder.cjs +40 -50
  50. package/src/orchestration/balanced.md +23 -0
  51. package/src/orchestration/focused.md +22 -0
  52. package/src/orchestration/none.md +5 -0
  53. package/src/orchestration/swarm.md +24 -0
  54. package/src/rules/agent-mode/AGENT_MODE.md +3 -1
  55. package/src/rules/agent-mode/MIXY.md +2 -2
  56. package/src/rules/lead/LEAD.md +3 -3
  57. package/src/rules/shared/20-research.md +3 -6
  58. package/src/rules/shared/40-editing.md +1 -0
  59. package/src/rules/shared/60-verification.md +10 -9
  60. package/src/rules/shared/70-delivery.md +4 -3
  61. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  62. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
  63. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
  64. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
  65. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
  66. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
  67. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
  69. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  70. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  71. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
  72. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
  73. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  74. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
  75. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
  76. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
  77. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
  78. package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
  79. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
  81. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
  82. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
  83. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
  84. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
  85. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
  86. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
  87. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  89. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
  90. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  91. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  92. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  95. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  96. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  97. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  98. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  99. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
  102. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
  103. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  104. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  105. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  106. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  107. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  109. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
  110. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
  111. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
  112. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
  113. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
  116. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  118. package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
  119. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  120. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  121. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  122. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
  123. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
  124. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
  125. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
  126. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
  127. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
  129. package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
  130. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
  131. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
  132. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
  133. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
  134. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
  136. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
  137. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
  138. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
  139. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
  140. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
  141. package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
  142. package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
  145. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
  146. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
  147. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
  148. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  149. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
  150. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
  151. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  152. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  153. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
  154. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
  155. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
  156. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
  158. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
  159. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
  160. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
  161. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
  162. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
  163. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
  164. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
  165. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
  166. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  167. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
  169. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
  170. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
  172. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
  174. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
  175. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
  176. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
  177. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
  178. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
  180. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
  181. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
  182. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
  183. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
  184. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  185. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  186. package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
  187. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
  189. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
  190. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
  191. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
  192. package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
  193. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
  194. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
  195. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
  196. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
  197. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
  198. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  199. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
  200. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
  201. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
  202. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
  203. package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
  204. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
  205. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
  206. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
  207. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
  208. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
  210. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
  211. package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
  212. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
  213. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
  214. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  215. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  216. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
  217. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
  218. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
  219. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
  220. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
  221. package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
  222. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
  223. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  224. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
  225. package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
  226. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
  227. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
  228. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
  229. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
  230. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
  231. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
  232. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
  233. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
  234. package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
  235. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
  236. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
  238. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  239. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
  240. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  241. package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
  242. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
  243. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
  244. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
  245. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
  246. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
  247. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
  248. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
  249. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  250. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
  251. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  252. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
  253. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
  254. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
  255. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
  256. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
  257. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  258. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  259. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
  260. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  261. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
  262. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
  263. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  264. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
  265. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
  266. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  267. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
  269. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
  270. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
  271. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
  272. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  273. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  274. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  275. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
  276. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  277. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  278. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  279. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
  280. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
  281. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  282. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
  283. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
  284. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  285. package/src/runtime/attachments/attachment-reference.mjs +1 -1
  286. package/src/runtime/attachments/pdf-extract.mjs +1 -1
  287. package/src/runtime/attachments/store.d.mts +1 -0
  288. package/src/runtime/attachments/store.mjs +2 -2
  289. package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
  290. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
  291. package/src/runtime/channels/lib/scheduler.mjs +33 -0
  292. package/src/runtime/channels/lib/schedules-db.mjs +11 -4
  293. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
  294. package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
  295. package/src/runtime/channels/lib/whisper-port.mjs +19 -10
  296. package/src/runtime/channels/lib/whisper-server.mjs +22 -13
  297. package/src/runtime/channels/lib/worker-main.mjs +9 -31
  298. package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
  299. package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
  300. package/src/runtime/connectors/gmail-app-password.mjs +4 -4
  301. package/src/runtime/connectors/google-mcp.mjs +1 -1
  302. package/src/runtime/effort-judge/judge-client.mjs +2 -2
  303. package/src/runtime/effort-judge/judge-input.mjs +4 -4
  304. package/src/runtime/explore/explorer.mjs +88 -0
  305. package/src/runtime/explore/tool-defs.mjs +35 -0
  306. package/src/runtime/explore/tool.mjs +123 -0
  307. package/src/runtime/local-provider/hardware.mjs +1 -1
  308. package/src/runtime/media/adapters/codex-image.mjs +3 -3
  309. package/src/runtime/media/adapters/gemini-video.mjs +1 -1
  310. package/src/runtime/media/media-usage.mjs +1 -1
  311. package/src/runtime/media/store.mjs +1 -1
  312. package/src/runtime/memory/index.mjs +15 -1
  313. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  314. package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
  315. package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
  316. package/src/runtime/memory/lib/memory-embed.mjs +83 -14
  317. package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
  318. package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
  319. package/src/runtime/memory/lib/memory.mjs +17 -0
  320. package/src/runtime/memory/lib/pg/process.mjs +1 -1
  321. package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
  322. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
  323. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  324. package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
  325. package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
  326. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  327. package/src/runtime/office/capabilities.mjs +1 -1
  328. package/src/runtime/office/core/office-core.mjs +1 -1
  329. package/src/runtime/office/design/content-model.mjs +3 -3
  330. package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
  331. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
  332. package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
  333. package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
  334. package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
  335. package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
  336. package/src/runtime/office/portable/portable-soffice.mjs +8 -6
  337. package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
  338. package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
  339. package/src/runtime/shared/agent-route-config.mjs +17 -2
  340. package/src/runtime/shared/atomic-file.d.mts +8 -0
  341. package/src/runtime/shared/atomic-file.mjs +103 -2
  342. package/src/runtime/shared/background-tasks.mjs +37 -10
  343. package/src/runtime/shared/background-wait.mjs +66 -0
  344. package/src/runtime/shared/child-guardian.mjs +17 -7
  345. package/src/runtime/shared/config.mjs +313 -16
  346. package/src/runtime/shared/connector-accounts.mjs +5 -5
  347. package/src/runtime/shared/connector-catalog.d.mts +14 -8
  348. package/src/runtime/shared/connector-catalog.mjs +70 -52
  349. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  350. package/src/runtime/shared/file-has-data.mjs +26 -2
  351. package/src/runtime/shared/file-lock.mjs +21 -18
  352. package/src/runtime/shared/git-launch.d.mts +9 -0
  353. package/src/runtime/shared/git-launch.mjs +213 -0
  354. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  355. package/src/runtime/shared/git-runner.mjs +7 -2
  356. package/src/runtime/shared/idle-gc.mjs +30 -7
  357. package/src/runtime/shared/llm/cost.mjs +6 -1
  358. package/src/runtime/shared/llm/http-agent.mjs +316 -29
  359. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  360. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  361. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  362. package/src/runtime/shared/llm/system-proxy.mjs +453 -0
  363. package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
  364. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
  365. package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
  366. package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
  367. package/src/runtime/shared/maintenance-schedule.mjs +109 -0
  368. package/src/runtime/shared/process-runner.mjs +8 -4
  369. package/src/runtime/shared/provider-accounts.mjs +52 -2
  370. package/src/runtime/shared/routine-trigger.d.mts +13 -0
  371. package/src/runtime/shared/routine-trigger.mjs +34 -0
  372. package/src/runtime/shared/run-child.d.mts +2 -1
  373. package/src/runtime/shared/run-child.mjs +70 -18
  374. package/src/runtime/shared/session-scratch.mjs +14 -2
  375. package/src/runtime/shared/shipped-definitions.mjs +7 -1
  376. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  377. package/src/runtime/shared/staged-update.mjs +47 -2
  378. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  379. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  380. package/src/runtime/shared/tool-surface.mjs +110 -36
  381. package/src/runtime/shared/tool-work-units.mjs +35 -6
  382. package/src/runtime/shared/turn-snapshot.mjs +26 -4
  383. package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
  384. package/src/runtime/shared/worker-requests.mjs +17 -3
  385. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  386. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  387. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  388. package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
  389. package/src/runtime/shared/worktrees/contract.mjs +16 -6
  390. package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
  391. package/src/runtime/shared/worktrees/disk.mjs +79 -2
  392. package/src/runtime/shared/worktrees/git.mjs +97 -7
  393. package/src/runtime/shared/worktrees/include.mjs +6 -4
  394. package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
  395. package/src/runtime/shared/worktrees/manager.mjs +962 -197
  396. package/src/runtime/shared/worktrees/settings.mjs +33 -7
  397. package/src/runtime/shared/worktrees/test-support.mjs +5 -1
  398. package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
  399. package/src/runtime/tidy/install.mjs +95 -15
  400. package/src/runtime/tidy/languages.mjs +17 -15
  401. package/src/runtime/tidy/process.mjs +9 -5
  402. package/src/runtime/tidy/resolve.mjs +19 -16
  403. package/src/runtime/tidy/runners/biome.mjs +3 -3
  404. package/src/runtime/tidy/tool.mjs +1 -1
  405. package/src/runtime/tidy/worktree.mjs +10 -6
  406. package/src/runtime/visualize-bridge/client.mjs +4 -1
  407. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  408. package/src/runtime/web-search/index.mjs +4 -23
  409. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  410. package/src/runtime/web-search/tool-defs.mjs +17 -26
  411. package/src/session-runtime/agent-profile-changes.mjs +55 -4
  412. package/src/session-runtime/agent-task-sessions.mjs +410 -353
  413. package/src/session-runtime/boot/apis.mjs +27 -4
  414. package/src/session-runtime/boot/begin.mjs +2 -0
  415. package/src/session-runtime/boot/config.mjs +10 -1
  416. package/src/session-runtime/boot/facade.mjs +1 -0
  417. package/src/session-runtime/boot/providers.mjs +70 -3
  418. package/src/session-runtime/boot/session.mjs +2 -0
  419. package/src/session-runtime/boot/tools.mjs +71 -25
  420. package/src/session-runtime/bot-status.mjs +103 -103
  421. package/src/session-runtime/channel-config-api.mjs +1 -0
  422. package/src/session-runtime/config-change-effects.mjs +179 -0
  423. package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
  424. package/src/session-runtime/config-lifecycle.mjs +160 -24
  425. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  426. package/src/session-runtime/conversation-import/discovery.mjs +245 -47
  427. package/src/session-runtime/conversation-import/service.mjs +12 -5
  428. package/src/session-runtime/goal-facade-api.mjs +49 -3
  429. package/src/session-runtime/handoff-attachments.mjs +1 -1
  430. package/src/session-runtime/held-requests.mjs +3 -1
  431. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
  432. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
  433. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
  434. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  435. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
  436. package/src/session-runtime/internal-tool-executor.mjs +12 -19
  437. package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
  438. package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
  439. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
  440. package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
  441. package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
  442. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  443. package/src/session-runtime/lifecycle-api.mjs +1 -0
  444. package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
  445. package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
  446. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  447. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  448. package/src/session-runtime/model-route/set-route.mjs +40 -7
  449. package/src/session-runtime/native-web-search/routes.mjs +3 -3
  450. package/src/session-runtime/provider-auth/login.mjs +2 -2
  451. package/src/session-runtime/provider-auth/refresh.mjs +6 -3
  452. package/src/session-runtime/provider-auth/setup.mjs +1 -1
  453. package/src/session-runtime/provider-readiness.mjs +53 -4
  454. package/src/session-runtime/resource-api.mjs +1 -1
  455. package/src/session-runtime/resource-extension-sync.mjs +4 -8
  456. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  457. package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
  458. package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
  459. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  460. package/src/session-runtime/resource-plugins-api.mjs +4 -0
  461. package/src/session-runtime/routine-executor.mjs +152 -0
  462. package/src/session-runtime/routine-home-turn.mjs +46 -5
  463. package/src/session-runtime/runtime-facade.mjs +5 -0
  464. package/src/session-runtime/runtime-feature-gates.mjs +2 -11
  465. package/src/session-runtime/schedule-session-run.mjs +1 -0
  466. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
  467. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
  468. package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
  469. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
  470. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
  471. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  472. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
  473. package/src/session-runtime/services/agent-tool.mjs +51 -1
  474. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  475. package/src/session-runtime/services/channel-admin.mjs +18 -0
  476. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  477. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  478. package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
  479. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  480. package/src/session-runtime/services/plugin-admin.mjs +14 -6
  481. package/src/session-runtime/services/provider-admin.mjs +281 -10
  482. package/src/session-runtime/services/seeds.mjs +7 -0
  483. package/src/session-runtime/services/usage-stats-model.mjs +32 -11
  484. package/src/session-runtime/session-create/materialize.mjs +4 -2
  485. package/src/session-runtime/session-create/session-options.mjs +2 -0
  486. package/src/session-runtime/session-turn-api.mjs +2 -0
  487. package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
  488. package/src/session-runtime/settings-system-api.mjs +1 -1
  489. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  490. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  491. package/src/session-runtime/setup-tool/executor.mjs +14 -3
  492. package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
  493. package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
  494. package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
  495. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
  496. package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
  497. package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
  498. package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
  499. package/src/session-runtime/tool-policy-refresh.mjs +182 -5
  500. package/src/session-runtime/tool-surface.mjs +38 -1
  501. package/src/session-runtime/turn/agent-ops.mjs +33 -2
  502. package/src/session-runtime/turn/session-ops.mjs +2 -0
  503. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
  504. package/src/session-runtime/turn/turn-run.mjs +1 -1
  505. package/src/session-runtime/webhook-session-run.mjs +2 -0
  506. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
  507. package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
  508. package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
  509. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
  510. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
  511. package/src/session-runtime/workflow-agents-api.mjs +2 -0
  512. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  513. package/src/session-runtime/workspace/project-branches.mjs +1 -1
  514. package/src/session-runtime/workspace/session-view.mjs +149 -0
  515. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  516. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  517. package/src/session-runtime/workspace/transitions.mjs +128 -1070
  518. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  519. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  520. package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
  521. package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
  522. package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
  523. package/src/standalone/daemon-agent-control.mjs +25 -8
  524. package/src/standalone/daemon-desktop-runtime.mjs +8 -2
  525. package/src/standalone/daemon-lag-profiler.mjs +7 -7
  526. package/src/standalone/daemon-session-control.mjs +151 -136
  527. package/src/standalone/daemon.mjs +61 -2
  528. package/src/standalone/desktop-service-registry.mjs +9 -0
  529. package/src/standalone/local-session-runtime.mjs +21 -1
  530. package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
  531. package/src/standalone/session-client.mjs +5 -1
  532. package/src/standalone/session-frame-stream.mjs +83 -11
  533. package/src/standalone/session-protocol.mjs +15 -0
  534. package/src/standalone/session-service/agent-route-follow.mjs +23 -20
  535. package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
  536. package/src/standalone/session-service/agent-tree.mjs +45 -9
  537. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  538. package/src/standalone/session-service/quota-resume.mjs +9 -0
  539. package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
  540. package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
  541. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  542. package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
  543. package/src/standalone/session-service/session-calls.mjs +2 -1
  544. package/src/standalone/session-service/stored-reader.mjs +127 -40
  545. package/src/tui/App.jsx +162 -164
  546. package/src/tui/app/app-view/floating-panel.jsx +3 -0
  547. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  548. package/src/tui/app/clipboard.mjs +22 -11
  549. package/src/tui/app/create-app-pickers.mjs +2 -0
  550. package/src/tui/app/doctor.mjs +2 -2
  551. package/src/tui/app/panel-signature.mjs +1 -1
  552. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  553. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  554. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  555. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  556. package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
  557. package/src/tui/app/provider-setup-picker.mjs +20 -13
  558. package/src/tui/app/settings-picker.mjs +53 -8
  559. package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
  560. package/src/tui/app/slash-commands.mjs +2 -1
  561. package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
  562. package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
  563. package/src/tui/app/slash-dispatch.mjs +1 -1
  564. package/src/tui/app/use-btw-panel.mjs +29 -0
  565. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  566. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  567. package/src/tui/app/use-mouse-input.mjs +11 -0
  568. package/src/tui/app/use-onboarding-start.mjs +8 -3
  569. package/src/tui/app/use-panel-transition.mjs +10 -1
  570. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  571. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  572. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  573. package/src/tui/app/use-prompt-queue-history.mjs +5 -4
  574. package/src/tui/app/use-selection-focus.mjs +11 -2
  575. package/src/tui/app/use-selection-geometry.mjs +18 -9
  576. package/src/tui/app/use-selection-paint.mjs +4 -4
  577. package/src/tui/app/use-selection-stitch.mjs +3 -3
  578. package/src/tui/app/use-slash-palette.mjs +62 -0
  579. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  580. package/src/tui/app/use-transcript-activity.mjs +48 -33
  581. package/src/tui/app/use-transcript-follow.mjs +12 -4
  582. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  583. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  584. package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
  585. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  586. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  587. package/src/tui/app/use-transcript-window.mjs +21 -11
  588. package/src/tui/app/use-tui-ready.mjs +18 -0
  589. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  590. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  591. package/src/tui/components/Picker.jsx +27 -3
  592. package/src/tui/components/SignInUrl.jsx +68 -0
  593. package/src/tui/components/TextEntryPanel.jsx +76 -46
  594. package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
  595. package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
  596. package/src/tui/components/question-panel-model.mjs +4 -4
  597. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  598. package/src/tui/components/tool-execution/standard-card.jsx +3 -4
  599. package/src/tui/components/user-message-skills.mjs +1 -1
  600. package/src/tui/dist/index.mjs +2205 -1371
  601. package/src/tui/markdown/render-ansi.mjs +1 -1
  602. package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
  603. package/src/tui/session/agent-job-feed.mjs +2 -0
  604. package/src/tui/session/context-state.mjs +3 -0
  605. package/src/tui/session/goal-turn-state.mjs +6 -2
  606. package/src/tui/session/quota-resume.mjs +1 -1
  607. package/src/tui/session/session-api/controls.mjs +4 -0
  608. package/src/tui/session/session-api/extensions.mjs +8 -0
  609. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  610. package/src/tui/session/session-api/intake.mjs +2 -0
  611. package/src/tui/session/session-api/integrations.mjs +2 -2
  612. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  613. package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
  614. package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
  615. package/src/tui/session/session-api/settings.mjs +2 -2
  616. package/src/tui/session/session-api/worktree.mjs +13 -1
  617. package/src/tui/session/session-flow/drain.mjs +11 -14
  618. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  619. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  620. package/src/tui/session/transcript-spill.mjs +92 -4
  621. package/src/tui/session/transcript-store.mjs +2 -0
  622. package/src/tui/session/turn-quiet.mjs +1 -1
  623. package/src/tui/session/turn.mjs +3 -0
  624. package/src/tui/session/worktree-setup-notice.mjs +1 -1
  625. package/src/tui/spinner-meta.mjs +3 -3
  626. package/src/tui/spinner-verbs.mjs +2 -2
  627. package/src/defaults/skills/goal-management/SKILL.md +0 -169
  628. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
  629. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
  630. package/src/session-runtime/goal-tasks.mjs +0 -1
@@ -0,0 +1,576 @@
1
+ import { resolveProviderApiKey } from '../../../shared/provider-api-key.mjs';
2
+ import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
3
+ import { sanitizeToolPairs } from '../session/context-utils.mjs';
4
+ import { noteRequestServiceTier } from '../../../shared/llm/usage-context.mjs';
5
+ import { buildGeminiRequest } from './gemini-request-body.mjs';
6
+ import { geminiDocumentedThinkingLevels } from './gemini-thinking.mjs';
7
+ import { geminiEndsWithFunctionResponse, runGeminiStreamAttempts } from './gemini-retry-policy.mjs';
8
+ import { consumeGeminiRestStreamResponse } from './gemini-stream.mjs';
9
+ import { geminiTextLeakGuardFor } from './gemini-sdk-request.mjs';
10
+ import { createGeminiReasoningRelay } from './gemini-reasoning-relay.mjs';
11
+ import {
12
+ geminiFailureUsage,
13
+ geminiIncompleteError,
14
+ geminiSendResult,
15
+ parseGeminiCandidate,
16
+ resolveGeminiUsage,
17
+ } from './gemini-response.mjs';
18
+ import { emitGeminiToolCalls } from './gemini-schema.mjs';
19
+ import { geminiRestError } from './gemini.mjs';
20
+ import {
21
+ ANTHROPIC_RETRY_BACKOFF_MS,
22
+ ANTHROPIC_RETRY_JITTER_RATIO,
23
+ anthropicMaxAttempts,
24
+ canFallbackNonStreaming,
25
+ emitProviderRetryStage,
26
+ withRetry,
27
+ } from './retry-classifier.mjs';
28
+ import { buildAnthropicApiRequest } from './anthropic-api-request.mjs';
29
+ import { applyAnthropicErrorContract } from './anthropic-error-contract.mjs';
30
+ import { createAnthropicMidState, assertAnthropicStreamNotEmpty } from './anthropic-midstream-recovery.mjs';
31
+ import { parseSSEStream } from './anthropic-sse.mjs';
32
+ import { buildAnthropicTurnResult } from './anthropic-turn-result.mjs';
33
+ import { streamCallbacks } from './lib/send-callbacks.mjs';
34
+ import { preparePdfTextForProvider } from './media-normalization.mjs';
35
+ import { VERTEX_API_KEY_MODE, VertexAccessTokenManager } from './vertex-ai-auth.mjs';
36
+ import { VertexMaasRoute, toVertexExclusiveUsage, vertexErrorBody } from './vertex-ai-maas.mjs';
37
+ import {
38
+ VERTEX_FLEX_TIER,
39
+ claudeNeedsInterleavedBeta,
40
+ VERTEX_MODELS,
41
+ VERTEX_MULTI_REGIONS,
42
+ VERTEX_PRIORITY_TIER,
43
+ assertVertexServing,
44
+ vertexEnvLocation,
45
+ vertexModelAccessError,
46
+ vertexPricingModel,
47
+ vertexRequestedTier,
48
+ vertexRoute,
49
+ vertexServingProblem,
50
+ vertexTierOption,
51
+ } from './vertex-ai-models.mjs';
52
+
53
+ export {
54
+ VERTEX_FLEX_TIER,
55
+ VERTEX_MODELS,
56
+ VERTEX_PRIORITY_TIER,
57
+ VERTEX_REGIONAL_PRICING_SUFFIX,
58
+ VERTEX_SERVICE_TIER_PARAMETER,
59
+ } from './vertex-ai-models.mjs';
60
+
61
+ const VERTEX_ANTHROPIC_VERSION = 'vertex-2023-10-16';
62
+
63
+ // Vertex takes Anthropic betas in the body (`anthropic_beta`), never as a
64
+ // header, and only these (effort, fast mode, server fallback and the other
65
+ // first-party betas are not offered); tool search has its own name there.
66
+ const INTERLEAVED_THINKING_BETA = 'interleaved-thinking-2025-05-14';
67
+ const VERTEX_CLAUDE_BETAS = new Map([
68
+ [INTERLEAVED_THINKING_BETA, INTERLEAVED_THINKING_BETA],
69
+ ['advanced-tool-use-2025-11-20', 'tool-search-tool-2025-10-19'],
70
+ ['context-1m-2025-08-07', 'context-1m-2025-08-07'],
71
+ ['context-management-2025-06-27', 'context-management-2025-06-27'],
72
+ ['compact-2026-01-12', 'compact-2026-01-12'],
73
+ ]);
74
+
75
+ // Interleaved thinking needs the beta only for a manual thinking budget with
76
+ // tools on the models that document it (adaptive thinking interleaves on its own).
77
+ function needsInterleavedThinking(body, model) {
78
+ return (
79
+ body.thinking?.type === 'enabled' &&
80
+ Array.isArray(body.tools) &&
81
+ body.tools.length > 0 &&
82
+ claudeNeedsInterleavedBeta(model)
83
+ );
84
+ }
85
+
86
+ /** The Vertex names of the selected `betas` this request body needs. */
87
+ function vertexClaudeBetas(betas, body, model) {
88
+ const out = new Set();
89
+ for (const beta of betas || []) {
90
+ const mapped = VERTEX_CLAUDE_BETAS.get(beta);
91
+ if (!mapped || (mapped === INTERLEAVED_THINKING_BETA && !needsInterleavedThinking(body, model))) continue;
92
+ out.add(mapped);
93
+ }
94
+ return [...out];
95
+ }
96
+
97
+ // Flex and Priority PayGo are selected per request with
98
+ // X-Vertex-AI-LLM-Shared-Request-Type (Provisioned Throughput is still used
99
+ // first when the project has it). The served tier is usageMetadata.trafficType:
100
+ // ON_DEMAND_FLEX, ON_DEMAND_PRIORITY, or ON_DEMAND for a Priority request
101
+ // downgraded to Standard PayGo (billed at Standard rates).
102
+ const SERVED_TIER = Object.freeze({
103
+ ON_DEMAND_FLEX: VERTEX_FLEX_TIER,
104
+ FLEX: VERTEX_FLEX_TIER,
105
+ BATCH: VERTEX_FLEX_TIER,
106
+ ON_DEMAND_PRIORITY: VERTEX_PRIORITY_TIER,
107
+ ON_DEMAND: 'default',
108
+ });
109
+
110
+ // A Flex request queues server-side and may sit silent for minutes before its
111
+ // first chunk (the docs allow request timeouts up to 30 minutes), so the shared
112
+ // 60s first-chunk window would kill and replay a healthy one. Kept under the
113
+ // 600s socket body timeout (MIXDOG_LLM_BODY_TIMEOUT_MS).
114
+ const VERTEX_FLEX_FIRST_CHUNK_TIMEOUT_MS = 570_000;
115
+
116
+ // Multi-region locations are served by representative endpoints, not by
117
+ // <location>-aiplatform.googleapis.com.
118
+ function vertexHost(location) {
119
+ if (location === 'global') return 'aiplatform.googleapis.com';
120
+ if (VERTEX_MULTI_REGIONS.has(location)) return `aiplatform.${location}.rep.googleapis.com`;
121
+ return `${location}-aiplatform.googleapis.com`;
122
+ }
123
+
124
+ // Express mode: an API key on the global endpoint, with no project or location in the path.
125
+ const EXPRESS_BASE = 'https://aiplatform.googleapis.com/v1';
126
+
127
+ /**
128
+ * The request's location, and whether the user configured it (`pinned`):
129
+ * without one, the environment's region (for a Claude model, its own first),
130
+ * else global.
131
+ */
132
+ function vertexLocation(config, claudeId = '') {
133
+ const configured = String(config?.location || '').trim();
134
+ const location = (configured || vertexEnvLocation(process.env, claudeId) || 'global').trim().toLowerCase();
135
+ // The location names the host the bearer token is sent to: only a region
136
+ // label (or global / a multi-region) may reach the host template.
137
+ if (!/^[a-z][a-z0-9-]{0,62}$/.test(location)) throw new Error('[vertex-ai] location is invalid');
138
+ return { location, pinned: Boolean(configured) };
139
+ }
140
+
141
+ const servesAt = (route, location, tier) => !vertexServingProblem(route, location, tier);
142
+
143
+ const isNotFound = (error) => [error?.status, error?.httpStatus, error?.response?.status].map(Number).includes(404);
144
+
145
+ function vertexProjectOverride(config) {
146
+ const projectId = String(config?.projectId || '').trim();
147
+ if (projectId && (!/^[a-zA-Z0-9._:-]{1,128}$/.test(projectId) || projectId.includes('/'))) {
148
+ throw new Error('[vertex-ai] project ID override is invalid');
149
+ }
150
+ return projectId;
151
+ }
152
+
153
+ function geminiCallbacks(opts) {
154
+ const reasoning = createGeminiReasoningRelay(opts);
155
+ return {
156
+ onStreamDelta: typeof opts.onStreamDelta === 'function' ? opts.onStreamDelta : null,
157
+ onToolCall: typeof opts.onToolCall === 'function' ? opts.onToolCall : null,
158
+ onTextDelta: typeof opts.onTextDelta === 'function' ? opts.onTextDelta : null,
159
+ onReasoningDelta: reasoning.onReasoningDelta,
160
+ retractReasoning: reasoning.retract,
161
+ };
162
+ }
163
+
164
+ // Vertex rejects (400) functionCall.id / functionResponse.id, which the
165
+ // Gemini API request builder carries; calls pair by name and order here.
166
+ function withoutFunctionIds(contents) {
167
+ const strip = (key, part) => {
168
+ const { id: _id, ...rest } = part[key];
169
+ return { ...part, [key]: rest };
170
+ };
171
+ return (contents || []).map((content) =>
172
+ Array.isArray(content?.parts)
173
+ ? {
174
+ ...content,
175
+ parts: content.parts.map((part) => {
176
+ if (part?.functionCall && 'id' in part.functionCall) return strip('functionCall', part);
177
+ if (part?.functionResponse && 'id' in part.functionResponse) return strip('functionResponse', part);
178
+ return part;
179
+ }),
180
+ }
181
+ : content
182
+ );
183
+ }
184
+
185
+ function geminiVertexBody(request) {
186
+ return {
187
+ contents: withoutFunctionIds(request.contents),
188
+ // Vertex accepts only a Content object here, never a bare string.
189
+ ...(request.systemInstruction ? { systemInstruction: { parts: [{ text: request.systemInstruction }] } } : {}),
190
+ ...(request.generationConfig ? { generationConfig: request.generationConfig } : {}),
191
+ ...(request.geminiTools ? { tools: request.geminiTools } : {}),
192
+ ...(request.toolConfig ? { toolConfig: request.toolConfig } : {}),
193
+ ...(request.safetySettings ? { safetySettings: request.safetySettings } : {}),
194
+ };
195
+ }
196
+
197
+ export class VertexAIProvider {
198
+ static inputExcludesCache = true;
199
+ nativePdf = true;
200
+ name = 'vertex-ai';
201
+
202
+ constructor(config = {}) {
203
+ this.config = config;
204
+ const customFetch = typeof config.fetchFn === 'function' ? config.fetchFn : null;
205
+ this._fetch = customFetch ?? fetch;
206
+ this._auth = new VertexAccessTokenManager({
207
+ credentialResolver: () => resolveProviderApiKey('vertex-ai', this.config),
208
+ authMode: () => this.config.authMode,
209
+ fetchFn: this._fetch,
210
+ now: typeof config.now === 'function' ? config.now : () => Date.now(),
211
+ });
212
+ this._maas = new VertexMaasRoute({
213
+ name: this.name,
214
+ config,
215
+ auth: this._auth,
216
+ fetchFn: customFetch,
217
+ });
218
+ }
219
+
220
+ _projectId() {
221
+ return vertexProjectOverride(this.config) || this._auth.projectId();
222
+ }
223
+
224
+ // Only a Flex route has a budget; the shared window covers the rest. Vertex
225
+ // never marks transport progress at the response headers, so the transport
226
+ // deadline must already cover the headers wait plus the first-chunk wait.
227
+ firstResponseBudget(_model, { modelParameters } = {}) {
228
+ if (vertexRequestedTier({ modelParameters }) !== VERTEX_FLEX_TIER) return null;
229
+ const ms = 2 * VERTEX_FLEX_FIRST_CHUNK_TIMEOUT_MS;
230
+ return { transportMs: ms, semanticMs: ms };
231
+ }
232
+
233
+ _express() {
234
+ return this.config.authMode === VERTEX_API_KEY_MODE;
235
+ }
236
+
237
+ _expressKey() {
238
+ const key = String(resolveProviderApiKey('vertex-ai', this.config) || '').trim();
239
+ if (!key) throw new Error('[vertex-ai] the Vertex AI API key is not configured');
240
+ return key;
241
+ }
242
+
243
+ /** `target`: the send's { identity, project } and the location it goes to. */
244
+ _locationBase({ location, project }) {
245
+ if (this._express()) return EXPRESS_BASE;
246
+ return `https://${vertexHost(location)}/v1/projects/${encodeURIComponent(project)}/locations/${location}`;
247
+ }
248
+
249
+ _url(publisher, model, method, target) {
250
+ // A version suffix (claude-…@default, @YYYYMMDD) stays a literal `@` in the path.
251
+ const id = encodeURIComponent(model).replace(/%40/g, '@');
252
+ return `${this._locationBase(target)}/publishers/${publisher}/models/${id}:${method}`;
253
+ }
254
+
255
+ /**
256
+ * `identity` is the account `url` was built for, read in the same tick as
257
+ * the URL before the first attempt; every attempt (retries included) must
258
+ * still run as that account, so a switch in between aborts the request.
259
+ * Express mode sends its API key instead (its URL names no project).
260
+ */
261
+ async _authorizedFetch(url, init, identity) {
262
+ if (this._express()) {
263
+ const headers = new Headers(init?.headers || {});
264
+ headers.set('x-goog-api-key', this._expressKey());
265
+ return await this._fetch(url, { ...init, headers, dispatcher: getLlmDispatcher() });
266
+ }
267
+ let token = '';
268
+ const run = async () => {
269
+ token = await this._auth.getAccessToken({ identity });
270
+ this._auth.assertIdentity(identity);
271
+ const headers = new Headers(init?.headers || {});
272
+ headers.set('Authorization', `Bearer ${token}`);
273
+ return await this._fetch(url, { ...init, headers, dispatcher: getLlmDispatcher() });
274
+ };
275
+ let response = await run();
276
+ if (response.status === 401) {
277
+ this._auth.invalidate(token);
278
+ response = await run();
279
+ }
280
+ return response;
281
+ }
282
+
283
+ async send(messages, model, tools, sendOpts = {}) {
284
+ const route = vertexRoute(model);
285
+ const tier = vertexRequestedTier(sendOpts);
286
+ const express = this._express();
287
+ if (express && route.wire !== 'gemini') {
288
+ throw new Error(
289
+ `[vertex-ai] ${route.publisher}/${route.id} needs a service-account key or the gcloud login: ` +
290
+ 'a Vertex AI express mode API key serves Gemini models only'
291
+ );
292
+ }
293
+ const requested = vertexLocation(this.config, route.wire === 'claude' ? route.id : '');
294
+ const { pinned } = requested;
295
+ if (express && pinned && requested.location !== 'global') {
296
+ throw new Error(
297
+ '[vertex-ai] a Vertex AI express mode API key serves only the global location; set the location to global'
298
+ );
299
+ }
300
+ // A configured location is never moved. A region from the environment
301
+ // gives way to global when it cannot serve the request (or for express mode).
302
+ let location = express ? 'global' : requested.location;
303
+ if (!pinned && location !== 'global' && !servesAt(route, location, tier) && servesAt(route, 'global', tier)) {
304
+ location = 'global';
305
+ }
306
+ assertVertexServing(route, location, tier);
307
+ await this._auth.ready();
308
+ let result;
309
+ try {
310
+ // One account for the whole send, the region fallback included: its
311
+ // identity and project are read in one tick, and every attempt (on any
312
+ // location) must still run as it.
313
+ const account = express
314
+ ? { identity: null, project: '' }
315
+ : { identity: this._auth.identity(), project: this._projectId() };
316
+ const sendAt = (at) => {
317
+ const target = { ...account, location: at };
318
+ if (route.wire === 'gemini') return this._sendGemini(messages, route.id, tools, sendOpts, tier, target);
319
+ if (route.wire === 'claude') return this._sendClaude(messages, route.id, tools, sendOpts, target);
320
+ return this._sendMaas(messages, route, tools, sendOpts, target);
321
+ };
322
+ try {
323
+ result = await sendAt(location);
324
+ } catch (error) {
325
+ // A region from the environment that does not have the model (404) is retried once on global.
326
+ if (pinned || location === 'global' || !isNotFound(error) || !servesAt(route, 'global', tier)) throw error;
327
+ location = 'global';
328
+ result = await sendAt(location);
329
+ }
330
+ } catch (error) {
331
+ let project = '(unknown project)';
332
+ try {
333
+ project = this._projectId();
334
+ } catch {
335
+ // No resolvable project: keep the placeholder; the original error is rethrown below.
336
+ }
337
+ throw this._auth.accessError(vertexModelAccessError(error, route, { project, location }), { project });
338
+ }
339
+ const pricingModel = vertexPricingModel(route, location);
340
+ if (pricingModel && result && typeof result === 'object') result.pricingModel = pricingModel;
341
+ return result;
342
+ }
343
+
344
+ async _sendMaas(messages, route, tools, opts, target) {
345
+ // Built for the account it is sent with.
346
+ const baseURL = `${this._locationBase(target)}/endpoints/openapi`;
347
+ return await this._maas.send(messages, `${route.publisher}/${route.id}`, tools, opts, {
348
+ baseURL,
349
+ identity: target.identity,
350
+ });
351
+ }
352
+
353
+ async _sendGemini(messages, model, tools, opts, tier, target) {
354
+ const signal = opts.signal || null;
355
+ const headers = {
356
+ 'Content-Type': 'application/json',
357
+ ...(tier ? { 'X-Vertex-AI-LLM-Shared-Request-Type': tier } : {}),
358
+ };
359
+ const failureUsage = geminiFailureUsage(opts, null, model);
360
+ const vertexFailureUsage = {
361
+ ...failureUsage,
362
+ normalize: (um) => toVertexExclusiveUsage(failureUsage.normalize(um)),
363
+ };
364
+ const callbacks = geminiCallbacks(opts);
365
+ const request = buildGeminiRequest(messages, model, tools, opts, null);
366
+ const body = geminiVertexBody(request);
367
+ // One account for every attempt and the unary fallback: the send's.
368
+ const { identity } = target;
369
+ const streamUrl = `${this._url('google', model, 'streamGenerateContent', target)}?alt=sse`;
370
+ const unaryUrl = this._url('google', model, 'generateContent', target);
371
+ const stream = { ...request, opts, signal, useModel: model, tools, callbacks, cachedContent: null };
372
+ try {
373
+ opts.onStageChange?.('requesting');
374
+ } catch {
375
+ // A throwing progress callback must not fail the request.
376
+ }
377
+ // Every attempt sends the same tier; the served trafficType settles the price.
378
+ noteRequestServiceTier(tier === VERTEX_PRIORITY_TIER ? tier : '');
379
+
380
+ let outcome;
381
+ try {
382
+ outcome = await runGeminiStreamAttempts({
383
+ signal,
384
+ sleepFn: this.config.sleepFn,
385
+ afterToolResult: geminiEndsWithFunctionResponse(request.contents),
386
+ failureUsage: vertexFailureUsage,
387
+ run: async ({ signal: attemptSignal, connected }) => {
388
+ callbacks.retractReasoning();
389
+ const res = await this._authorizedFetch(
390
+ streamUrl,
391
+ { method: 'POST', headers, body: JSON.stringify(body), signal: attemptSignal },
392
+ identity
393
+ );
394
+ if (!res.ok) {
395
+ const text = vertexErrorBody(await res.text().catch(() => ''));
396
+ throw geminiRestError(res, text, 'Vertex AI Gemini streamGenerateContent');
397
+ }
398
+ connected();
399
+ try {
400
+ opts.onStageChange?.('streaming');
401
+ } catch {
402
+ // A throwing progress callback must not fail the request.
403
+ }
404
+ const textLeakGuard = geminiTextLeakGuardFor(stream);
405
+ const response = await consumeGeminiRestStreamResponse(res, {
406
+ signal: attemptSignal,
407
+ onStreamDelta: callbacks.onStreamDelta,
408
+ onTextDelta: callbacks.onTextDelta,
409
+ onReasoningDelta: callbacks.onReasoningDelta,
410
+ textLeakGuard,
411
+ label: 'Vertex AI Gemini streamGenerateContent',
412
+ failureUsage: vertexFailureUsage,
413
+ ...(tier === VERTEX_FLEX_TIER
414
+ ? { firstByteTimeoutMs: VERTEX_FLEX_FIRST_CHUNK_TIMEOUT_MS, idleAfterFirstChunk: true }
415
+ : {}),
416
+ });
417
+ return { response, textLeakGuard };
418
+ },
419
+ });
420
+ } catch (streamError) {
421
+ if (!canFallbackNonStreaming(streamError, { signal })) throw streamError;
422
+ callbacks.retractReasoning();
423
+ const res = await this._authorizedFetch(
424
+ unaryUrl,
425
+ { method: 'POST', headers, body: JSON.stringify(body), signal },
426
+ identity
427
+ );
428
+ if (!res.ok) {
429
+ const text = vertexErrorBody(await res.text().catch(() => ''));
430
+ throw geminiRestError(res, text, 'Vertex AI Gemini generateContent');
431
+ }
432
+ outcome = { response: await res.json(), textLeakGuard: null };
433
+ }
434
+
435
+ const parsed = parseGeminiCandidate(outcome.response, outcome.textLeakGuard);
436
+ const usage = resolveGeminiUsage(outcome.response, opts, null, model, this.name);
437
+ const incomplete = geminiIncompleteError(outcome.response, parsed, model, usage);
438
+ if (incomplete) throw incomplete;
439
+ outcome.textLeakGuard?.releaseDeferredToolCalls?.();
440
+ emitGeminiToolCalls(parsed.nativeToolCalls, callbacks.onToolCall);
441
+ const result = geminiSendResult(parsed, model, opts, toVertexExclusiveUsage(usage));
442
+ // The served tier decides the price: a Flex or Priority request can be
443
+ // served by Provisioned Throughput first, and a Priority one downgraded.
444
+ const served = SERVED_TIER[usage?.raw?.trafficType];
445
+ if (served) result.serviceTier = served;
446
+ return result;
447
+ }
448
+
449
+ async _sendClaude(messages, model, tools, opts, target) {
450
+ messages = sanitizeToolPairs(messages);
451
+ messages = await preparePdfTextForProvider(messages, this);
452
+ const requestOpts = { ...opts, fast: false, serverFallback: false };
453
+ const { params, betas, knownToolNames } = await buildAnthropicApiRequest({
454
+ name: this.name,
455
+ config: { ...this.config, disableBetaHeaders: true },
456
+ messages,
457
+ useModel: model,
458
+ tools,
459
+ opts: requestOpts,
460
+ fastModeLatched: false,
461
+ capabilityModel: model,
462
+ });
463
+ const { model: _model, ...body } = params;
464
+ body.anthropic_version = VERTEX_ANTHROPIC_VERSION;
465
+ const vertexBetas = vertexClaudeBetas(betas, body, model);
466
+ if (vertexBetas.length) body.anthropic_beta = vertexBetas;
467
+ const callbacks = streamCallbacks(opts);
468
+ try {
469
+ callbacks.onStageChange?.('requesting');
470
+ } catch {
471
+ // A throwing progress callback must not fail the request.
472
+ }
473
+ // One account for every attempt: the send's.
474
+ const { identity } = target;
475
+ const url = this._url('anthropic', model, 'streamRawPredict', target);
476
+ const payload = JSON.stringify(body);
477
+ // The initial response retries like the first-party Anthropic route: 429
478
+ // and 529 (and 5xx) on its backoff, Retry-After honored.
479
+ const response = await withRetry(
480
+ async ({ signal: attemptSignal }) => {
481
+ const res = await this._authorizedFetch(
482
+ url,
483
+ { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: payload, signal: attemptSignal },
484
+ identity
485
+ );
486
+ if (res.ok) return res;
487
+ const text = await res.text().catch(() => '');
488
+ let data = null;
489
+ try {
490
+ data = JSON.parse(vertexErrorBody(text));
491
+ } catch {
492
+ // A non-JSON body carries no google.rpc.Status; the status code stands alone.
493
+ }
494
+ const error = Object.assign(
495
+ new Error(`Vertex AI Claude streamRawPredict ${res.status}: ${text.slice(0, 300)}`),
496
+ {
497
+ ...(data ? { data } : {}),
498
+ status: res.status,
499
+ httpStatus: res.status,
500
+ headers: res.headers,
501
+ response: { status: res.status, headers: res.headers },
502
+ initialResponseError: true,
503
+ }
504
+ );
505
+ throw applyAnthropicErrorContract(error, { status: res.status, headers: res.headers, bodyText: text });
506
+ },
507
+ {
508
+ signal: opts.signal || null,
509
+ maxAttempts: anthropicMaxAttempts(),
510
+ backoffMs: ANTHROPIC_RETRY_BACKOFF_MS,
511
+ retryJitterRatio: ANTHROPIC_RETRY_JITTER_RATIO,
512
+ retryJitterMode: 'positive',
513
+ recoveryOwner: 'vertex-ai-claude-initial-response',
514
+ retry529: opts.retry529,
515
+ sleepFn: this.config.sleepFn,
516
+ onRetry: ({ attempt, maxAttempts, lastErr, delayMs }) =>
517
+ emitProviderRetryStage(callbacks.onStageChange, { attempt: attempt + 1, maxAttempts, lastErr, delayMs }),
518
+ }
519
+ );
520
+ try {
521
+ callbacks.onStageChange?.('streaming');
522
+ } catch {
523
+ // A throwing progress callback must not fail the request.
524
+ }
525
+ const controller = new AbortController();
526
+ const externalSignal = opts.signal || null;
527
+ const abort = () => controller.abort(externalSignal?.reason);
528
+ if (externalSignal) {
529
+ if (externalSignal.aborted) abort();
530
+ else externalSignal.addEventListener('abort', abort, { once: true });
531
+ }
532
+ const midState = createAnthropicMidState(0);
533
+ try {
534
+ const parsed = await parseSSEStream(
535
+ response,
536
+ controller.signal,
537
+ (reason) => controller.abort(reason),
538
+ callbacks.onStreamDelta,
539
+ callbacks.onToolCall,
540
+ midState,
541
+ callbacks.onTextDelta,
542
+ knownToolNames,
543
+ { onStreamItemStart: callbacks.onStreamItemStart }
544
+ );
545
+ assertAnthropicStreamNotEmpty(midState, parsed, 'Vertex AI Claude');
546
+ return buildAnthropicTurnResult(parsed, { provider: this.name, useModel: model, opts });
547
+ } finally {
548
+ externalSignal?.removeEventListener?.('abort', abort);
549
+ }
550
+ }
551
+
552
+ async listModels() {
553
+ return VERTEX_MODELS.map((model) => {
554
+ const tierOption = vertexTierOption(model.id);
555
+ // The picker offers effort only from a declared ladder; these models'
556
+ // levels are documented rather than listed by a catalog.
557
+ const levels = geminiDocumentedThinkingLevels(model.id);
558
+ return {
559
+ ...model,
560
+ provider: this.name,
561
+ ...(levels ? { supportsReasoning: true, reasoningOptions: [{ type: 'effort', values: levels }] } : {}),
562
+ ...(tierOption ? { modelParameterOptions: [tierOption] } : {}),
563
+ };
564
+ });
565
+ }
566
+
567
+ async isAvailable() {
568
+ try {
569
+ if (this._express()) return Boolean(this._expressKey());
570
+ await this._auth.ready();
571
+ return Boolean(this._projectId());
572
+ } catch {
573
+ return false;
574
+ }
575
+ }
576
+ }
@@ -55,9 +55,7 @@
55
55
  }
56
56
  ],
57
57
  "store": false,
58
- "include": [
59
- "reasoning.encrypted_content"
60
- ],
58
+ "include": ["reasoning.encrypted_content"],
61
59
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
62
60
  "tools": [
63
61
  {
@@ -148,9 +146,7 @@
148
146
  }
149
147
  ],
150
148
  "store": false,
151
- "include": [
152
- "reasoning.encrypted_content"
153
- ],
149
+ "include": ["reasoning.encrypted_content"],
154
150
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
155
151
  "tools": [
156
152
  {
@@ -278,9 +274,7 @@
278
274
  }
279
275
  ],
280
276
  "store": false,
281
- "include": [
282
- "reasoning.encrypted_content"
283
- ],
277
+ "include": ["reasoning.encrypted_content"],
284
278
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
285
279
  "tools": [
286
280
  {
@@ -400,9 +394,7 @@
400
394
  }
401
395
  ],
402
396
  "store": false,
403
- "include": [
404
- "reasoning.encrypted_content"
405
- ],
397
+ "include": ["reasoning.encrypted_content"],
406
398
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
407
399
  "instructions": "sys",
408
400
  "tools": [
@@ -513,9 +505,7 @@
513
505
  }
514
506
  ],
515
507
  "store": false,
516
- "include": [
517
- "reasoning.encrypted_content"
518
- ],
508
+ "include": ["reasoning.encrypted_content"],
519
509
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
520
510
  "tools": [
521
511
  {
@@ -626,9 +616,7 @@
626
616
  }
627
617
  ],
628
618
  "store": false,
629
- "include": [
630
- "reasoning.encrypted_content"
631
- ],
619
+ "include": ["reasoning.encrypted_content"],
632
620
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
633
621
  "tools": [
634
622
  {
@@ -738,9 +726,7 @@
738
726
  }
739
727
  ],
740
728
  "store": false,
741
- "include": [
742
- "reasoning.encrypted_content"
743
- ],
729
+ "include": ["reasoning.encrypted_content"],
744
730
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
745
731
  "tools": [
746
732
  {
@@ -865,9 +851,7 @@
865
851
  }
866
852
  ],
867
853
  "store": false,
868
- "include": [
869
- "reasoning.encrypted_content"
870
- ],
854
+ "include": ["reasoning.encrypted_content"],
871
855
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
872
856
  "tools": [
873
857
  {
@@ -971,9 +955,7 @@
971
955
  }
972
956
  ],
973
957
  "store": false,
974
- "include": [
975
- "reasoning.encrypted_content"
976
- ],
958
+ "include": ["reasoning.encrypted_content"],
977
959
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
978
960
  "tools": [
979
961
  {
@@ -1078,9 +1060,7 @@
1078
1060
  }
1079
1061
  ],
1080
1062
  "store": false,
1081
- "include": [
1082
- "reasoning.encrypted_content"
1083
- ],
1063
+ "include": ["reasoning.encrypted_content"],
1084
1064
  "prompt_cache_key": "f0858c98-2db1-4764-9d18-e6e1ec2ea4c7",
1085
1065
  "tools": [
1086
1066
  {