@wardby/cli 0.5.3 → 0.7.0

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 (763) hide show
  1. package/.env.example +33 -0
  2. package/README.md +25 -14
  3. package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
  4. package/dist/claude-coding-worker/context.d.ts +22 -0
  5. package/dist/claude-coding-worker/context.js +92 -0
  6. package/dist/claude-coding-worker/driver.d.ts +27 -3
  7. package/dist/claude-coding-worker/driver.js +161 -20
  8. package/dist/claude-coding-worker/main.js +34 -6
  9. package/dist/claude-coding-worker/sdk.js +25 -5
  10. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  11. package/dist/claude-coding-worker/tool-socket.js +111 -0
  12. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  13. package/dist/claude-coding-worker/transcript.js +77 -0
  14. package/dist/cli-help.d.ts +1 -1
  15. package/dist/cli-help.js +6 -2
  16. package/dist/cli-native-mode.d.ts +9 -0
  17. package/dist/cli-native-mode.js +20 -0
  18. package/dist/cli.d.ts +3 -1
  19. package/dist/cli.js +161 -11
  20. package/dist/coding/claude-context.d.ts +45 -0
  21. package/dist/coding/claude-context.js +434 -0
  22. package/dist/coding/continuation-wording.d.ts +35 -0
  23. package/dist/coding/continuation-wording.js +73 -0
  24. package/dist/coding/linked-issue-note.d.ts +23 -0
  25. package/dist/coding/linked-issue-note.js +47 -0
  26. package/dist/coding/merge-wording.d.ts +28 -0
  27. package/dist/coding/merge-wording.js +78 -0
  28. package/dist/coding/pr-description-note.d.ts +9 -0
  29. package/dist/coding/pr-description-note.js +32 -0
  30. package/dist/coding/profile.d.ts +50 -118
  31. package/dist/coding/profile.js +51 -4
  32. package/dist/coding/protected-path-wording.d.ts +8 -0
  33. package/dist/coding/protected-path-wording.js +1 -1
  34. package/dist/coding/protocol.d.ts +292 -270
  35. package/dist/coding/protocol.js +322 -15
  36. package/dist/coding/redact.d.ts +3 -0
  37. package/dist/coding/redact.js +12 -0
  38. package/dist/coding/registry/allowlist.d.ts +12 -0
  39. package/dist/coding/registry/allowlist.js +14 -1
  40. package/dist/coding/registry/audit-mode.d.ts +153 -0
  41. package/dist/coding/registry/audit-mode.js +304 -0
  42. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  43. package/dist/coding/registry/lockfile-shared.js +128 -0
  44. package/dist/coding/registry/lockfiles.js +1 -1
  45. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  46. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  47. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  48. package/dist/coding/registry/npm-lockfile.js +4 -6
  49. package/dist/coding/registry/npm.js +78 -8
  50. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  51. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  52. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  53. package/dist/coding/registry/pypi-plan.js +406 -0
  54. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  55. package/dist/coding/registry/pypi-requirements.js +155 -0
  56. package/dist/coding/registry/pypi.d.ts +3 -27
  57. package/dist/coding/registry/pypi.js +40 -154
  58. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  59. package/dist/coding/registry/refusal-hints.js +61 -0
  60. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  61. package/dist/coding/registry/refusal-wording.js +56 -0
  62. package/dist/coding/registry/report.d.ts +70 -8
  63. package/dist/coding/registry/report.js +112 -5
  64. package/dist/coding/registry/types.d.ts +58 -8
  65. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  66. package/dist/coding/registry/yarn-lockfile.js +367 -0
  67. package/dist/coding/services/catalog.d.ts +37 -351
  68. package/dist/coding/transcript/claude-code.d.ts +13 -0
  69. package/dist/coding/transcript/claude-code.js +273 -0
  70. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  71. package/dist/coding/transcript/download-protocol.js +18 -0
  72. package/dist/coding/transcript/format.d.ts +20 -0
  73. package/dist/coding/transcript/format.js +32 -0
  74. package/dist/coding/transcript/recorder.d.ts +51 -0
  75. package/dist/coding/transcript/recorder.js +225 -0
  76. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  77. package/dist/coding/transcript/resume/checkout.js +203 -0
  78. package/dist/coding/transcript/resume/command.d.ts +17 -0
  79. package/dist/coding/transcript/resume/command.js +176 -0
  80. package/dist/coding/transcript/resume/download.d.ts +20 -0
  81. package/dist/coding/transcript/resume/download.js +153 -0
  82. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  83. package/dist/coding/transcript/resume/launch.js +128 -0
  84. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  85. package/dist/coding/transcript/resume/session-file.js +79 -0
  86. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  87. package/dist/coding/transcript/resume/stand-in.js +49 -0
  88. package/dist/coding-worker/artifact.d.ts +16 -3
  89. package/dist/coding-worker/artifact.js +5 -3
  90. package/dist/coding-worker/debug-trace.d.ts +6 -5
  91. package/dist/coding-worker/debug-trace.js +13 -18
  92. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  93. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  94. package/dist/coding-worker/driver.d.ts +4 -3
  95. package/dist/coding-worker/driver.js +118 -38
  96. package/dist/coding-worker/errors.d.ts +1 -0
  97. package/dist/coding-worker/errors.js +32 -0
  98. package/dist/coding-worker/sdk.d.ts +6 -0
  99. package/dist/coding-worker/sdk.js +1 -0
  100. package/dist/coding-worker/skills.d.ts +23 -0
  101. package/dist/coding-worker/skills.js +117 -0
  102. package/dist/coding-worker/task-note.d.ts +11 -0
  103. package/dist/coding-worker/task-note.js +13 -0
  104. package/dist/coding-worker/types.d.ts +13 -0
  105. package/dist/config/dependency-cache.d.ts +23 -0
  106. package/dist/config/dependency-cache.js +32 -0
  107. package/dist/config/github-allowed-accounts.d.ts +15 -0
  108. package/dist/config/github-allowed-accounts.js +36 -0
  109. package/dist/config/low-power.d.ts +12 -0
  110. package/dist/config/low-power.js +18 -0
  111. package/dist/config/mobile.d.ts +12 -0
  112. package/dist/config/mobile.js +18 -0
  113. package/dist/config/providers.d.ts +65 -3
  114. package/dist/config/providers.js +147 -11
  115. package/dist/config/test-simulators.d.ts +82 -0
  116. package/dist/config/test-simulators.js +305 -0
  117. package/dist/core/async-context.d.ts +2 -0
  118. package/dist/core/async-context.js +12 -0
  119. package/dist/core/budget-events.d.ts +108 -0
  120. package/dist/core/budget-events.js +346 -0
  121. package/dist/core/budget-groups.d.ts +50 -1
  122. package/dist/core/budget-groups.js +236 -27
  123. package/dist/core/budget-stopped-head.d.ts +46 -0
  124. package/dist/core/budget-stopped-head.js +81 -0
  125. package/dist/core/budget-topup.d.ts +51 -0
  126. package/dist/core/budget-topup.js +156 -0
  127. package/dist/core/budget-wording.d.ts +16 -2
  128. package/dist/core/budget-wording.js +40 -2
  129. package/dist/core/coding-queue.d.ts +2 -1
  130. package/dist/core/coding-queue.js +7 -0
  131. package/dist/core/cron.d.ts +19 -1
  132. package/dist/core/cron.js +17 -0
  133. package/dist/core/datastores.js +1 -1
  134. package/dist/core/db.d.ts +16 -6
  135. package/dist/core/db.js +12 -10
  136. package/dist/core/deferred-coding.d.ts +14 -0
  137. package/dist/core/deferred-coding.js +62 -0
  138. package/dist/core/delegation-child.d.ts +25 -0
  139. package/dist/core/delegation-child.js +37 -0
  140. package/dist/core/dispatch.d.ts +53 -0
  141. package/dist/core/dispatch.js +167 -57
  142. package/dist/core/engine-native.js +10 -6
  143. package/dist/core/error-code.d.ts +38 -0
  144. package/dist/core/error-code.js +168 -0
  145. package/dist/core/grants.d.ts +19 -6
  146. package/dist/core/grants.js +55 -6
  147. package/dist/core/host-events.d.ts +67 -5
  148. package/dist/core/host-events.js +571 -37
  149. package/dist/core/host-status.d.ts +85 -3
  150. package/dist/core/host-status.js +298 -20
  151. package/dist/core/issue-bridge.d.ts +50 -6
  152. package/dist/core/issue-bridge.js +151 -20
  153. package/dist/core/issue-events.d.ts +1 -1
  154. package/dist/core/issue-events.js +16 -11
  155. package/dist/core/issue-status.d.ts +1 -1
  156. package/dist/core/issue-status.js +68 -29
  157. package/dist/core/logger.d.ts +5 -0
  158. package/dist/core/logger.js +14 -1
  159. package/dist/core/lost-run-children.d.ts +6 -0
  160. package/dist/core/lost-run-children.js +32 -0
  161. package/dist/core/mark-ready.d.ts +34 -0
  162. package/dist/core/mark-ready.js +152 -0
  163. package/dist/core/markdown-code.d.ts +8 -0
  164. package/dist/core/markdown-code.js +107 -0
  165. package/dist/core/memory-tools.js +7 -0
  166. package/dist/core/merge-order-check.d.ts +130 -0
  167. package/dist/core/merge-order-check.js +343 -0
  168. package/dist/core/notification-dispatcher.d.ts +70 -0
  169. package/dist/core/notification-dispatcher.js +368 -0
  170. package/dist/core/notification-templates.d.ts +19 -0
  171. package/dist/core/notification-templates.js +139 -0
  172. package/dist/core/notifications.d.ts +10 -0
  173. package/dist/core/notifications.js +38 -0
  174. package/dist/core/pg-auth.d.ts +22 -0
  175. package/dist/core/pg-auth.js +152 -0
  176. package/dist/core/power-composition.d.ts +16 -0
  177. package/dist/core/power-composition.js +37 -0
  178. package/dist/core/power-idle.d.ts +14 -0
  179. package/dist/core/power-idle.js +30 -0
  180. package/dist/core/power.d.ts +71 -0
  181. package/dist/core/power.js +202 -0
  182. package/dist/core/pull-request-state-sync.js +2 -2
  183. package/dist/core/reconciler.d.ts +8 -5
  184. package/dist/core/reconciler.js +37 -6
  185. package/dist/core/related-pull-requests.d.ts +59 -7
  186. package/dist/core/related-pull-requests.js +140 -25
  187. package/dist/core/reply-parts.d.ts +21 -0
  188. package/dist/core/reply-parts.js +73 -0
  189. package/dist/core/repo-access.d.ts +15 -0
  190. package/dist/core/repo-access.js +66 -0
  191. package/dist/core/review-fix.d.ts +38 -1
  192. package/dist/core/review-fix.js +209 -7
  193. package/dist/core/review-host-checks.d.ts +1 -1
  194. package/dist/core/review-host-tools.d.ts +23 -0
  195. package/dist/core/review-host-tools.js +156 -14
  196. package/dist/core/review-reads.d.ts +55 -0
  197. package/dist/core/review-reads.js +233 -0
  198. package/dist/core/run-status.d.ts +12 -0
  199. package/dist/core/run-status.js +12 -0
  200. package/dist/core/runner.d.ts +384 -5
  201. package/dist/core/runner.js +1244 -372
  202. package/dist/core/schedule-start.d.ts +12 -0
  203. package/dist/core/schedule-start.js +14 -0
  204. package/dist/core/secret-broker-config.d.ts +39 -0
  205. package/dist/core/secret-broker-config.js +112 -0
  206. package/dist/core/secret-guard.d.ts +46 -0
  207. package/dist/core/secret-guard.js +104 -0
  208. package/dist/core/secret-guarded-stores.d.ts +12 -0
  209. package/dist/core/secret-guarded-stores.js +41 -0
  210. package/dist/core/secret-spans.d.ts +50 -0
  211. package/dist/core/secret-spans.js +94 -0
  212. package/dist/core/secrets.d.ts +39 -4
  213. package/dist/core/secrets.js +148 -40
  214. package/dist/core/stop-run.d.ts +46 -0
  215. package/dist/core/stop-run.js +61 -0
  216. package/dist/core/workflow-event-recorder.d.ts +14 -0
  217. package/dist/core/workflow-event-recorder.js +120 -0
  218. package/dist/core/workflow-events.d.ts +94 -0
  219. package/dist/core/workflow-events.js +48 -0
  220. package/dist/core/workflow-run-events.d.ts +18 -0
  221. package/dist/core/workflow-run-events.js +75 -0
  222. package/dist/core/zod-json-schema.d.ts +4 -0
  223. package/dist/core/zod-json-schema.js +39 -0
  224. package/dist/core/zod3-window.d.ts +35 -0
  225. package/dist/core/zod3-window.js +124 -0
  226. package/dist/generated/prisma/browser.d.ts +92 -3
  227. package/dist/generated/prisma/client.d.ts +92 -3
  228. package/dist/generated/prisma/commonInputTypes.d.ts +364 -54
  229. package/dist/generated/prisma/enums.d.ts +37 -0
  230. package/dist/generated/prisma/enums.js +31 -0
  231. package/dist/generated/prisma/internal/class.d.ts +132 -0
  232. package/dist/generated/prisma/internal/class.js +4 -4
  233. package/dist/generated/prisma/internal/prismaNamespace.d.ts +1332 -142
  234. package/dist/generated/prisma/internal/prismaNamespace.js +227 -5
  235. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +234 -0
  236. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +227 -5
  237. package/dist/generated/prisma/models/Agent.d.ts +464 -7
  238. package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
  239. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +301 -1
  240. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  241. package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
  242. package/dist/generated/prisma/models/CodingRun.d.ts +1841 -1
  243. package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
  244. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  245. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  246. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  247. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  248. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1713 -0
  249. package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
  250. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1551 -0
  251. package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
  252. package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
  253. package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
  254. package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
  255. package/dist/generated/prisma/models/NotificationChannel.js +1 -0
  256. package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
  257. package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
  258. package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
  259. package/dist/generated/prisma/models/NotificationThread.js +1 -0
  260. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  261. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  262. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  263. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  264. package/dist/generated/prisma/models/Run.d.ts +1619 -58
  265. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  266. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  267. package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
  268. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  269. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  270. package/dist/generated/prisma/models/Secret.d.ts +37 -1
  271. package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
  272. package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
  273. package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
  274. package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
  275. package/dist/generated/prisma/models.d.ts +12 -0
  276. package/dist/help/build.js +4 -2
  277. package/dist/help/catalog.d.ts +1 -1
  278. package/dist/help/catalog.js +31 -6
  279. package/dist/help-index.json +2584 -146
  280. package/dist/import/create.js +49 -3
  281. package/dist/import/neutral-schema.d.ts +50 -277
  282. package/dist/import/neutral-schema.js +7 -4
  283. package/dist/knowledge/check.d.ts +1 -1
  284. package/dist/knowledge/cli.d.ts +11 -1
  285. package/dist/knowledge/cli.js +37 -4
  286. package/dist/knowledge/concept.d.ts +3 -19
  287. package/dist/knowledge/location.d.ts +31 -0
  288. package/dist/knowledge/location.js +78 -0
  289. package/dist/mcp/auth/access.d.ts +11 -2
  290. package/dist/mcp/auth/access.js +15 -1
  291. package/dist/mcp/auth/ownership.d.ts +7 -7
  292. package/dist/mcp/auth/repo-authorization.js +14 -0
  293. package/dist/mcp/auth/resource-server.d.ts +2 -1
  294. package/dist/mcp/auth/resource-server.js +7 -2
  295. package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
  296. package/dist/mcp/auth/self-hosted/browser.js +19 -6
  297. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  298. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  299. package/dist/mcp/context.d.ts +6 -0
  300. package/dist/mcp/host-events/github-ingress.d.ts +25 -1
  301. package/dist/mcp/host-events/github-ingress.js +70 -1
  302. package/dist/mcp/index.d.ts +19 -0
  303. package/dist/mcp/index.js +117 -20
  304. package/dist/mcp/server.d.ts +13 -0
  305. package/dist/mcp/server.js +33 -14
  306. package/dist/mcp/tools/agents.d.ts +4 -0
  307. package/dist/mcp/tools/agents.js +277 -24
  308. package/dist/mcp/tools/datastore.js +17 -8
  309. package/dist/mcp/tools/grants.js +9 -3
  310. package/dist/mcp/tools/memory.js +11 -1
  311. package/dist/mcp/tools/notification-channels.d.ts +2 -0
  312. package/dist/mcp/tools/notification-channels.js +293 -0
  313. package/dist/mcp/tools/packages.d.ts +2 -0
  314. package/dist/mcp/tools/packages.js +195 -0
  315. package/dist/mcp/tools/power.d.ts +2 -0
  316. package/dist/mcp/tools/power.js +77 -0
  317. package/dist/mcp/tools/repositories.js +18 -5
  318. package/dist/mcp/tools/run-access.d.ts +16 -0
  319. package/dist/mcp/tools/run-access.js +25 -0
  320. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  321. package/dist/mcp/tools/run-transcript-download.js +129 -0
  322. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  323. package/dist/mcp/tools/run-transcript.js +70 -0
  324. package/dist/mcp/tools/runs.d.ts +0 -6
  325. package/dist/mcp/tools/runs.js +41 -14
  326. package/dist/mcp/tools/scheduling.js +3 -1
  327. package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
  328. package/dist/mcp/tools/secret-broker-compat.js +23 -0
  329. package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
  330. package/dist/mcp/tools/secret-elicitation-form.js +205 -10
  331. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  332. package/dist/mcp/tools/secret-elicitation-server.js +10 -54
  333. package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
  334. package/dist/mcp/tools/secret-elicitation.js +110 -12
  335. package/dist/mcp/tools/secrets.js +186 -9
  336. package/dist/mcp/tools/stop-run.d.ts +2 -0
  337. package/dist/mcp/tools/stop-run.js +82 -0
  338. package/dist/mcp/tools/subagents.js +2 -2
  339. package/dist/mcp/tools/tools.d.ts +2 -2
  340. package/dist/mcp/tools/tools.js +47 -11
  341. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  342. package/dist/mcp/transport/stdio-link-host.js +67 -0
  343. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  344. package/dist/mcp/transport/streamable-http.js +41 -1
  345. package/dist/native-worker/composition.d.ts +23 -0
  346. package/dist/native-worker/composition.js +77 -0
  347. package/dist/native-worker/docker-isolation.d.ts +65 -0
  348. package/dist/native-worker/docker-isolation.js +183 -0
  349. package/dist/native-worker/docker-launcher.d.ts +110 -0
  350. package/dist/native-worker/docker-launcher.js +297 -0
  351. package/dist/native-worker/gateway-server.d.ts +77 -0
  352. package/dist/native-worker/gateway-server.js +412 -0
  353. package/dist/native-worker/gateway.d.ts +70 -0
  354. package/dist/native-worker/gateway.js +263 -0
  355. package/dist/native-worker/http-server.d.ts +24 -0
  356. package/dist/native-worker/http-server.js +113 -0
  357. package/dist/native-worker/http-transport.d.ts +17 -0
  358. package/dist/native-worker/http-transport.js +88 -0
  359. package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
  360. package/dist/native-worker/kubernetes-isolation.js +218 -0
  361. package/dist/native-worker/kubernetes-launcher.d.ts +106 -0
  362. package/dist/native-worker/kubernetes-launcher.js +375 -0
  363. package/dist/native-worker/launch.d.ts +62 -0
  364. package/dist/native-worker/launch.js +49 -0
  365. package/dist/native-worker/ledger.d.ts +125 -0
  366. package/dist/native-worker/ledger.js +245 -0
  367. package/dist/native-worker/loopback.d.ts +12 -0
  368. package/dist/native-worker/loopback.js +44 -0
  369. package/dist/native-worker/main.d.ts +8 -0
  370. package/dist/native-worker/main.js +85 -0
  371. package/dist/native-worker/protocol.d.ts +296 -0
  372. package/dist/native-worker/protocol.js +246 -0
  373. package/dist/native-worker/sandbox-executor.d.ts +83 -0
  374. package/dist/native-worker/sandbox-executor.js +284 -0
  375. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  376. package/dist/native-worker/stderr-redaction.js +237 -0
  377. package/dist/native-worker/stdio.d.ts +29 -0
  378. package/dist/native-worker/stdio.js +189 -0
  379. package/dist/native-worker/warm-delivery.d.ts +16 -0
  380. package/dist/native-worker/warm-delivery.js +33 -0
  381. package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
  382. package/dist/native-worker/warm-pool-ledger.js +73 -0
  383. package/dist/native-worker/warm-pool.d.ts +107 -0
  384. package/dist/native-worker/warm-pool.js +283 -0
  385. package/dist/native-worker/worker.d.ts +17 -0
  386. package/dist/native-worker/worker.js +141 -0
  387. package/dist/observability/metrics.js +6 -1
  388. package/dist/providers/auth/authorization-server.d.ts +3 -0
  389. package/dist/providers/auth/index.js +2 -0
  390. package/dist/providers/auth/self-hosted.d.ts +14 -2
  391. package/dist/providers/auth/self-hosted.js +54 -4
  392. package/dist/providers/chat/fake.d.ts +46 -0
  393. package/dist/providers/chat/fake.js +39 -0
  394. package/dist/providers/chat/index.d.ts +4 -0
  395. package/dist/providers/chat/index.js +8 -0
  396. package/dist/providers/chat/slack.d.ts +37 -0
  397. package/dist/providers/chat/slack.js +105 -0
  398. package/dist/providers/chat/types.d.ts +42 -0
  399. package/dist/providers/chat/types.js +19 -0
  400. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  401. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  402. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  403. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  404. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  405. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  406. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  407. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  408. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  409. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  410. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  411. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  412. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  413. package/dist/providers/coding-proxy/hold.js +86 -0
  414. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  415. package/dist/providers/coding-proxy/interrupted.js +104 -0
  416. package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
  417. package/dist/providers/coding-proxy/memory-ledger.js +84 -8
  418. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  419. package/dist/providers/coding-proxy/metering.js +27 -4
  420. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
  421. package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
  422. package/dist/providers/coding-proxy/proxy.d.ts +14 -1
  423. package/dist/providers/coding-proxy/proxy.js +166 -14
  424. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  425. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  426. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  427. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  428. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  429. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  430. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  431. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  432. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  433. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  434. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  435. package/dist/providers/coding-proxy/registry/service.js +579 -112
  436. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  437. package/dist/providers/coding-proxy/registry/store.js +54 -1
  438. package/dist/providers/coding-proxy/runtime.d.ts +4 -0
  439. package/dist/providers/coding-proxy/runtime.js +78 -16
  440. package/dist/providers/coding-proxy/server.d.ts +6 -1
  441. package/dist/providers/coding-proxy/server.js +45 -1
  442. package/dist/providers/coding-proxy/types.d.ts +65 -1
  443. package/dist/providers/datastore/types.d.ts +5 -0
  444. package/dist/providers/engine/types.d.ts +36 -2
  445. package/dist/providers/engine/types.js +39 -0
  446. package/dist/providers/executor/composition.d.ts +31 -1
  447. package/dist/providers/executor/composition.js +81 -8
  448. package/dist/providers/executor/container.d.ts +385 -9
  449. package/dist/providers/executor/container.js +1234 -99
  450. package/dist/providers/executor/dbos-status.d.ts +31 -0
  451. package/dist/providers/executor/dbos-status.js +64 -0
  452. package/dist/providers/executor/dbos.d.ts +91 -0
  453. package/dist/providers/executor/dbos.js +319 -26
  454. package/dist/providers/executor/deferred.d.ts +44 -0
  455. package/dist/providers/executor/deferred.js +100 -0
  456. package/dist/providers/executor/in-process.d.ts +9 -1
  457. package/dist/providers/executor/in-process.js +14 -4
  458. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  459. package/dist/providers/executor/linked-issue-reader.js +30 -0
  460. package/dist/providers/executor/routing.d.ts +39 -10
  461. package/dist/providers/executor/routing.js +77 -32
  462. package/dist/providers/executor/types.d.ts +25 -0
  463. package/dist/providers/index.d.ts +2 -1
  464. package/dist/providers/issue-tracker/types.d.ts +17 -0
  465. package/dist/providers/issue-tracker/types.js +39 -1
  466. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  467. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  468. package/dist/providers/jobs/docker-isolation.d.ts +8 -0
  469. package/dist/providers/jobs/docker-isolation.js +17 -0
  470. package/dist/providers/jobs/docker.d.ts +1 -0
  471. package/dist/providers/jobs/docker.js +29 -4
  472. package/dist/providers/jobs/fake-kubernetes-api.d.ts +23 -2
  473. package/dist/providers/jobs/fake-kubernetes-api.js +45 -1
  474. package/dist/providers/jobs/kubernetes-api.d.ts +25 -1
  475. package/dist/providers/jobs/kubernetes-api.js +17 -0
  476. package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
  477. package/dist/providers/jobs/kubernetes-client.js +61 -3
  478. package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
  479. package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
  480. package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
  481. package/dist/providers/jobs/kubernetes-isolation.js +23 -1
  482. package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
  483. package/dist/providers/jobs/kubernetes-platform.js +38 -1
  484. package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
  485. package/dist/providers/jobs/kubernetes-preflight.js +4 -2
  486. package/dist/providers/jobs/kubernetes.d.ts +42 -2
  487. package/dist/providers/jobs/kubernetes.js +178 -19
  488. package/dist/providers/jobs/metadata-probes.d.ts +11 -0
  489. package/dist/providers/jobs/metadata-probes.js +13 -0
  490. package/dist/providers/jobs/types.d.ts +42 -0
  491. package/dist/providers/jobs/types.js +13 -1
  492. package/dist/providers/llm/anthropic.js +5 -1
  493. package/dist/providers/llm/bedrock.d.ts +0 -12
  494. package/dist/providers/llm/bedrock.js +4 -0
  495. package/dist/providers/llm/claude-messages.d.ts +3 -1
  496. package/dist/providers/llm/claude-messages.js +4 -1
  497. package/dist/providers/llm/claude-provider.d.ts +2 -2
  498. package/dist/providers/llm/claude-provider.js +2 -2
  499. package/dist/providers/llm/openai.d.ts +2 -2
  500. package/dist/providers/llm/openai.js +6 -2
  501. package/dist/providers/llm/routing.d.ts +2 -2
  502. package/dist/providers/llm/routing.js +2 -2
  503. package/dist/providers/llm/types.d.ts +12 -2
  504. package/dist/providers/review-host/github-events.d.ts +9 -1
  505. package/dist/providers/review-host/github-events.js +34 -12
  506. package/dist/providers/review-host/github.d.ts +39 -2
  507. package/dist/providers/review-host/github.js +274 -29
  508. package/dist/providers/review-host/local.d.ts +8 -4
  509. package/dist/providers/review-host/local.js +49 -31
  510. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  511. package/dist/providers/review-host/patch-pages.js +176 -0
  512. package/dist/providers/review-host/review-format.d.ts +19 -1
  513. package/dist/providers/review-host/review-format.js +38 -7
  514. package/dist/providers/review-host/types.d.ts +157 -2
  515. package/dist/providers/review-host/types.js +8 -0
  516. package/dist/providers/storage/gcs.d.ts +63 -0
  517. package/dist/providers/storage/gcs.js +69 -0
  518. package/dist/providers/storage/index.d.ts +15 -0
  519. package/dist/providers/storage/index.js +14 -0
  520. package/dist/providers/storage/local.d.ts +24 -0
  521. package/dist/providers/storage/local.js +92 -0
  522. package/dist/providers/storage/meter.d.ts +14 -0
  523. package/dist/providers/storage/meter.js +34 -0
  524. package/dist/providers/storage/s3.d.ts +41 -0
  525. package/dist/providers/storage/s3.js +107 -0
  526. package/dist/providers/storage/types.d.ts +37 -3
  527. package/dist/providers/storage/types.js +21 -4
  528. package/dist/providers/vcs/git.d.ts +33 -2
  529. package/dist/providers/vcs/git.js +324 -22
  530. package/dist/providers/vcs/github-remote.d.ts +26 -3
  531. package/dist/providers/vcs/github-remote.js +124 -14
  532. package/dist/providers/vcs/github.d.ts +246 -12
  533. package/dist/providers/vcs/github.js +521 -61
  534. package/dist/providers/vcs/index.js +8 -1
  535. package/dist/providers/vcs/pr-description.d.ts +127 -0
  536. package/dist/providers/vcs/pr-description.js +270 -0
  537. package/dist/providers/vcs/remote.d.ts +33 -1
  538. package/dist/providers/vcs/routing.d.ts +4 -2
  539. package/dist/providers/vcs/routing.js +6 -0
  540. package/dist/providers/vcs/types.d.ts +80 -3
  541. package/dist/quickstart/coding-seed.d.ts +21 -3
  542. package/dist/quickstart/coding-seed.js +283 -3
  543. package/dist/quickstart/images.d.ts +2 -0
  544. package/dist/quickstart/images.js +7 -1
  545. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  546. package/dist/quickstart/reviewer-prompt.js +6 -6
  547. package/dist/quickstart-images.json +1 -1
  548. package/dist/sandbox/brokered-fetch.d.ts +23 -0
  549. package/dist/sandbox/brokered-fetch.js +37 -0
  550. package/dist/sandbox/generated/zod.bundle.js +62 -1
  551. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  552. package/dist/sandbox/host-functions.d.ts +35 -0
  553. package/dist/sandbox/host-functions.js +150 -91
  554. package/dist/sandbox/prelude.js +7 -1
  555. package/dist/sandbox/run-in-sandbox.d.ts +19 -0
  556. package/dist/sandbox/run-in-sandbox.js +28 -10
  557. package/dist/sandbox/safe-fetch.d.ts +2 -0
  558. package/dist/sandbox/safe-fetch.js +3 -1
  559. package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
  560. package/dist/sandbox/secret-broker-sigv4.js +49 -0
  561. package/dist/sandbox/secret-broker.d.ts +34 -0
  562. package/dist/sandbox/secret-broker.js +161 -0
  563. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  564. package/dist/sandbox/user-tool.d.ts +14 -0
  565. package/dist/sandbox/user-tool.js +32 -0
  566. package/dist/sandbox/zod-params.d.ts +37 -5
  567. package/dist/sandbox/zod-params.js +181 -26
  568. package/dist/serve.js +25 -0
  569. package/dist/viewer/api-schema.d.ts +372 -2454
  570. package/dist/viewer/api-schema.js +29 -0
  571. package/dist/viewer/build-schemas.js +10 -3
  572. package/dist/viewer/event-bus.d.ts +6 -0
  573. package/dist/viewer/event-bus.js +16 -7
  574. package/dist/viewer/graph.d.ts +5 -2
  575. package/dist/viewer/graph.js +7 -2
  576. package/dist/viewer/http.d.ts +0 -1
  577. package/dist/viewer/http.js +2 -2
  578. package/dist/viewer/infra.js +25 -2
  579. package/dist/viewer/limits.d.ts +4 -0
  580. package/dist/viewer/limits.js +4 -0
  581. package/dist/viewer/openapi.d.ts +15 -0
  582. package/dist/viewer/openapi.js +170 -0
  583. package/dist/wardby-bin.js +10 -0
  584. package/docs/README.md +7 -0
  585. package/docs/agent-recipes.md +114 -27
  586. package/docs/architecture-runtime.md +16 -1
  587. package/docs/code-review-agents.md +689 -45
  588. package/docs/coding-agent-setup.md +602 -12
  589. package/docs/coding-packages.md +1037 -92
  590. package/docs/coding-services.md +30 -13
  591. package/docs/coding-worker-byo-images.md +218 -6
  592. package/docs/coding-worker-isolation.md +173 -44
  593. package/docs/getting-started-gke.md +332 -129
  594. package/docs/getting-started-identity-provider.md +31 -11
  595. package/docs/getting-started.md +14 -4
  596. package/docs/jira-agents.md +22 -9
  597. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  598. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  599. package/docs/knowledge/delegation-admission-slots.md +52 -0
  600. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  601. package/docs/knowledge/import-rename-target.md +52 -0
  602. package/docs/knowledge/index.md +57 -0
  603. package/docs/knowledge/log.md +9 -0
  604. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  605. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  606. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  607. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  608. package/docs/knowledge/overview-cli.md +74 -0
  609. package/docs/knowledge/overview-coding-proxy.md +72 -0
  610. package/docs/knowledge/overview-coding.md +72 -0
  611. package/docs/knowledge/overview-config.md +60 -0
  612. package/docs/knowledge/overview-core.md +72 -0
  613. package/docs/knowledge/overview-deploy.md +83 -0
  614. package/docs/knowledge/overview-mcp.md +61 -0
  615. package/docs/knowledge/overview-prisma.md +72 -0
  616. package/docs/knowledge/overview-providers.md +89 -0
  617. package/docs/knowledge/overview-sandbox.md +83 -0
  618. package/docs/knowledge/overview-surfaces.md +83 -0
  619. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  620. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  621. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  622. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  623. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  624. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  625. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  626. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  627. package/docs/knowledge/warm-input-publication.md +30 -0
  628. package/docs/knowledge/workspace-staging-failure.md +54 -0
  629. package/docs/knowledge.md +54 -14
  630. package/docs/native-sandbox.md +731 -0
  631. package/docs/observability.md +4 -0
  632. package/docs/release-verification.md +9 -0
  633. package/docs/security-deployment.md +146 -14
  634. package/docs/slack-notifications.md +268 -0
  635. package/docs/tool-secrets.md +284 -0
  636. package/docs/viewer-api.md +46 -5
  637. package/docs/viewer-api.openapi.yml +1404 -0
  638. package/help/admin-viewer.md +29 -3
  639. package/help/agent-recipes.md +27 -0
  640. package/help/architecture-agent.md +11 -6
  641. package/help/brokered-secrets.md +79 -0
  642. package/help/build-claude-code-image.md +131 -0
  643. package/help/build-worker-image.md +6 -7
  644. package/help/builder-agent.md +19 -6
  645. package/help/code-review-agents.md +243 -10
  646. package/help/coding-packages.md +156 -6
  647. package/help/cost-attribution.md +9 -5
  648. package/help/creating-agents.md +14 -1
  649. package/help/dependency-cache.md +143 -0
  650. package/help/deploy-gke.md +23 -9
  651. package/help/deployment-targets.md +25 -14
  652. package/help/errors/budget-exhausted.md +187 -0
  653. package/help/errors/budget-group-exhausted.md +5 -1
  654. package/help/errors/coding-provider-not-configured.md +2 -2
  655. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  656. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  657. package/help/errors/continuation-closed.md +9 -12
  658. package/help/errors/database-auth-invalid.md +28 -0
  659. package/help/errors/delegation-conflict.md +24 -0
  660. package/help/errors/file-list-truncated.md +45 -0
  661. package/help/errors/full-read-required.md +49 -0
  662. package/help/errors/github-account-not-allowed.md +29 -0
  663. package/help/errors/graph-incomplete.md +43 -0
  664. package/help/errors/graph-limit.md +43 -0
  665. package/help/errors/low-power-disabled.md +29 -0
  666. package/help/errors/low-power-scale-forbidden.md +35 -0
  667. package/help/errors/low-power-wake-timeout.md +30 -0
  668. package/help/errors/merge-conflict.md +49 -0
  669. package/help/errors/mobile-disabled.md +31 -0
  670. package/help/errors/native-sandbox-capacity.md +22 -0
  671. package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
  672. package/help/errors/native-sandbox-docker-failed.md +20 -0
  673. package/help/errors/native-sandbox-gateway-error.md +20 -0
  674. package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
  675. package/help/errors/native-sandbox-image-not-pinned.md +19 -0
  676. package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
  677. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  678. package/help/errors/native-sandbox-network-unenforced.md +22 -0
  679. package/help/errors/native-sandbox-requires-catalog.md +31 -0
  680. package/help/errors/native-sandbox-unavailable.md +19 -0
  681. package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
  682. package/help/errors/native-sandbox-worker-exited.md +21 -0
  683. package/help/errors/native-sandbox-worker-lost.md +20 -0
  684. package/help/errors/native-sandbox-worker-unready.md +22 -0
  685. package/help/errors/package-not-allowed-pending.md +52 -0
  686. package/help/errors/package-not-allowed.md +51 -0
  687. package/help/errors/package-refusals.md +43 -0
  688. package/help/errors/patch-cursor-malformed.md +31 -0
  689. package/help/errors/run-lost.md +39 -0
  690. package/help/errors/run-transcript-download.md +44 -0
  691. package/help/errors/secret-broker-body-invalid.md +26 -0
  692. package/help/errors/secret-broker-changed.md +20 -0
  693. package/help/errors/secret-broker-config-invalid.md +30 -0
  694. package/help/errors/secret-broker-conflict.md +27 -0
  695. package/help/errors/secret-broker-destination-denied.md +28 -0
  696. package/help/errors/secret-broker-value-invalid.md +28 -0
  697. package/help/errors/secret-brokered.md +24 -0
  698. package/help/errors/secret-in-value.md +69 -0
  699. package/help/errors/secret-not-brokered.md +25 -0
  700. package/help/errors/slack-auth-failed.md +48 -0
  701. package/help/errors/slack-channel-unreachable.md +39 -0
  702. package/help/errors/slack-not-configured.md +33 -0
  703. package/help/errors/target-merge.md +40 -0
  704. package/help/fix-merge-conflicts.md +73 -0
  705. package/help/getting-started.md +4 -5
  706. package/help/github-app-setup.md +132 -0
  707. package/help/github.md +40 -1
  708. package/help/identity-and-access.md +7 -1
  709. package/help/jira.md +23 -6
  710. package/help/knowledge.md +16 -7
  711. package/help/local-repositories.md +3 -4
  712. package/help/low-power-mode.md +131 -0
  713. package/help/merge-order-check.md +122 -0
  714. package/help/mobile-app.md +54 -0
  715. package/help/native-capabilities.md +29 -1
  716. package/help/native-sandbox.md +150 -0
  717. package/help/observability.md +8 -0
  718. package/help/operating-agents.md +5 -0
  719. package/help/package-audit-mode.md +91 -0
  720. package/help/related-pull-requests.md +80 -16
  721. package/help/repo-instructions-and-skills.md +91 -0
  722. package/help/resume-runs-locally.md +131 -0
  723. package/help/review-fix-rounds.md +43 -1
  724. package/help/sharing-agents.md +59 -0
  725. package/help/slack-notifications.md +76 -0
  726. package/help/status-comments.md +31 -0
  727. package/help/stop-run.md +58 -0
  728. package/help/troubleshooting/budgets.md +28 -0
  729. package/help/troubleshooting/coding-workers.md +99 -7
  730. package/package.json +27 -13
  731. package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
  732. package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
  733. package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
  734. package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
  735. package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
  736. package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
  737. package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
  738. package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
  739. package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
  740. package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
  741. package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
  742. package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
  743. package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
  744. package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
  745. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  746. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  747. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  748. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  749. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  750. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  751. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  752. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  753. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  754. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  755. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  756. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  757. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  758. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  759. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  760. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  761. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  762. package/prisma/schema.prisma +631 -146
  763. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -17,9 +17,25 @@ export declare function safeUpstreamErrorCode(record: Record<string, unknown>):
17
17
  /** Accumulates Anthropic's split input/output usage until message_stop. */
18
18
  export declare class AnthropicSseUsageTracker {
19
19
  private startUsage?;
20
+ /** message_start's output count: a placeholder (usually 1), not a running count. */
21
+ private startOutputTokens?;
22
+ /** message_delta's running output count. */
20
23
  private outputTokens?;
21
24
  private stopped;
22
25
  consume(frame: string): TerminalUsage;
26
+ /**
27
+ * What a cut stream reported before its message_stop: start usage (input incl. cache reads), the
28
+ * output count message_delta reported, and message_start's output count as a floor only.
29
+ */
30
+ partial(): {
31
+ readUsage?: {
32
+ inputTokens: number;
33
+ cachedInputTokens: number;
34
+ cacheWriteTokens: number;
35
+ };
36
+ reportedOutputTokens?: number;
37
+ outputFloorTokens?: number;
38
+ };
23
39
  }
24
40
  /** The rates a request is billed at, tagged with their version. Picks only the price fields: a catalog entry's routing/shape fields stay out of the ledger. */
25
41
  export declare function pricingSnapshot(version: string, pricing: ModelPricing): PricingSnapshot;
@@ -134,6 +134,9 @@ function sseEvent(frame) {
134
134
  /** Accumulates Anthropic's split input/output usage until message_stop. */
135
135
  export class AnthropicSseUsageTracker {
136
136
  startUsage;
137
+ /** message_start's output count: a placeholder (usually 1), not a running count. */
138
+ startOutputTokens;
139
+ /** message_delta's running output count. */
137
140
  outputTokens;
138
141
  stopped = false;
139
142
  consume(frame) {
@@ -156,8 +159,9 @@ export class AnthropicSseUsageTracker {
156
159
  tokenCount(record.cache_read_input_tokens ?? 0, "cache_read_input_tokens");
157
160
  tokenCount(record.cache_creation_input_tokens ?? 0, "cache_creation_input_tokens");
158
161
  this.startUsage = record;
159
- if (record.output_tokens !== undefined)
160
- this.outputTokens = tokenCount(record.output_tokens, "output_tokens");
162
+ if (record.output_tokens !== undefined) {
163
+ this.startOutputTokens = tokenCount(record.output_tokens, "output_tokens");
164
+ }
161
165
  return { terminal: false };
162
166
  }
163
167
  case "message_delta": {
@@ -168,19 +172,38 @@ export class AnthropicSseUsageTracker {
168
172
  return { terminal: false };
169
173
  }
170
174
  case "message_stop": {
171
- if (this.stopped || !this.startUsage || this.outputTokens === undefined) {
175
+ const outputTokens = this.outputTokens ?? this.startOutputTokens;
176
+ if (this.stopped || !this.startUsage || outputTokens === undefined) {
172
177
  return { terminal: true };
173
178
  }
174
179
  this.stopped = true;
175
180
  return {
176
181
  terminal: true,
177
- usage: parseAnthropicAuthoritativeUsage({ ...this.startUsage, output_tokens: this.outputTokens }),
182
+ usage: parseAnthropicAuthoritativeUsage({ ...this.startUsage, output_tokens: outputTokens }),
178
183
  };
179
184
  }
180
185
  default:
181
186
  return { terminal: false };
182
187
  }
183
188
  }
189
+ /**
190
+ * What a cut stream reported before its message_stop: start usage (input incl. cache reads), the
191
+ * output count message_delta reported, and message_start's output count as a floor only.
192
+ */
193
+ partial() {
194
+ if (!this.startUsage)
195
+ return this.outputTokens === undefined ? {} : { reportedOutputTokens: this.outputTokens };
196
+ const cached = tokenCount(this.startUsage.cache_read_input_tokens ?? 0, "cache_read_input_tokens");
197
+ return {
198
+ readUsage: {
199
+ inputTokens: tokenCount(this.startUsage.input_tokens, "input_tokens") + cached,
200
+ cachedInputTokens: cached,
201
+ cacheWriteTokens: tokenCount(this.startUsage.cache_creation_input_tokens ?? 0, "cache_creation_input_tokens"),
202
+ },
203
+ ...(this.outputTokens !== undefined ? { reportedOutputTokens: this.outputTokens } : {}),
204
+ ...(this.startOutputTokens !== undefined ? { outputFloorTokens: this.startOutputTokens } : {}),
205
+ };
206
+ }
184
207
  }
185
208
  /** The rates a request is billed at, tagged with their version. Picks only the price fields: a catalog entry's routing/shape fields stay out of the ledger. */
186
209
  export function pricingSnapshot(version, pricing) {
@@ -1,5 +1,5 @@
1
1
  import type { PrismaClient } from "#prisma";
2
- import type { CreateProxySessionInput, ProxyLedger, ProxyRequest, ProxySession, ProxyUsage, ReserveProxyRequestInput, ReserveProxyRequestResult } from "./types.js";
2
+ import type { CreateProxySessionInput, PreviousReply, ProxyLedger, ProxyRefusalRecord, ProxyRequest, ProxySession, ProxyUsage, ReserveProxyRequestInput, ReserveProxyRequestResult } from "./types.js";
3
3
  export type PrismaProxyLedgerDb = Pick<PrismaClient, "$transaction" | "$queryRaw" | "$executeRaw">;
4
4
  /** How long a ledger transaction waits for a pool connection (Prisma's
5
5
  * default is 2 s). A model request fails outright when this runs out, so it
@@ -22,10 +22,23 @@ export declare class PrismaProxyLedger implements ProxyLedger {
22
22
  findSessionByCapabilityHash(capabilityHash: string): Promise<ProxySession | null>;
23
23
  reserve(input: ReserveProxyRequestInput): Promise<ReserveProxyRequestResult>;
24
24
  complete(requestId: string, usage: ProxyUsage, actualCostUsd: number, upstreamStatus: number): Promise<ProxyRequest>;
25
+ /**
26
+ * Recomputes the run's totals (Run) and this model's usage (RunModelUsage) from its settled
27
+ * requests: completed ones and uncertain ones settled at an estimate. Set, never incremented.
28
+ */
29
+ private recomputeRunTotals;
25
30
  release(requestId: string, upstreamStatus: number): Promise<void>;
26
- markUncertain(requestId: string, upstreamStatus?: number): Promise<void>;
31
+ markUncertain(requestId: string, upstreamStatus?: number, estimate?: {
32
+ usage: ProxyUsage;
33
+ costUsd: number;
34
+ }): Promise<void>;
35
+ settlementHints(sessionId: string, model: string): Promise<{
36
+ medianOutputTokens?: number;
37
+ }>;
38
+ previousReply(sessionId: string, conversationKey: string): Promise<PreviousReply | null>;
27
39
  cancelSession(sessionId: string): Promise<void>;
28
40
  budgetExhausted(sessionId: string): Promise<boolean>;
41
+ budgetRefusal(sessionId: string): Promise<ProxyRefusalRecord | null>;
29
42
  recordUpstreamFailure(sessionId: string, code: string): Promise<void>;
30
43
  upstreamFailure(sessionId: string): Promise<string | null>;
31
44
  getRequest(requestId: string): Promise<ProxyRequest | null>;
@@ -72,6 +72,13 @@ function requestFromRow(row) {
72
72
  }
73
73
  : undefined,
74
74
  upstreamStatus: row.upstreamStatus ?? undefined,
75
+ costEstimated: row.costEstimated === true,
76
+ ...(row.requestBytes !== null ? { requestBytes: row.requestBytes } : {}),
77
+ ...(row.ceilingUsd !== null && row.ceilingUsd !== undefined ? { ceilingUsd: Number(row.ceilingUsd) } : {}),
78
+ ...(row.reservationBasis === "cached" || row.reservationBasis === "full"
79
+ ? { reservationBasis: row.reservationBasis }
80
+ : {}),
81
+ ...(row.conversationKey !== null ? { conversationKey: row.conversationKey } : {}),
75
82
  };
76
83
  }
77
84
  async function requestById(db, id) {
@@ -79,7 +86,8 @@ async function requestById(db, id) {
79
86
  SELECT "id", "sessionId", "requestKey", "requestFingerprint", "model", "status",
80
87
  "reservationUsd", "actualCostUsd", "pricingVersion", "pricingSnapshot",
81
88
  "inputTokens", "outputTokens", "cachedInputTokens", "cacheWriteTokens",
82
- "reasoningTokens", "upstreamStatus"
89
+ "reasoningTokens", "upstreamStatus", "costEstimated",
90
+ "requestBytes", "ceilingUsd", "reservationBasis", "conversationKey"
83
91
  FROM "CodingProxyRequest" WHERE "id" = ${id}
84
92
  `;
85
93
  return rows[0] ? requestFromRow(rows[0]) : null;
@@ -132,28 +140,54 @@ export class PrismaProxyLedger {
132
140
  SELECT "id", "sessionId", "requestKey", "requestFingerprint", "model", "status",
133
141
  "reservationUsd", "actualCostUsd", "pricingVersion", "pricingSnapshot",
134
142
  "inputTokens", "outputTokens", "cachedInputTokens", "cacheWriteTokens",
135
- "reasoningTokens", "upstreamStatus"
143
+ "reasoningTokens", "upstreamStatus", "costEstimated",
144
+ "requestBytes", "ceilingUsd", "reservationBasis", "conversationKey"
136
145
  FROM "CodingProxyRequest"
137
146
  WHERE "sessionId" = ${input.sessionId} AND "requestKey" = ${input.requestKey}
138
147
  `;
139
148
  if (duplicate[0])
140
149
  return { outcome: "duplicate", request: requestFromRow(duplicate[0]) };
141
150
  const totals = await tx.$queryRaw `
142
- SELECT COALESCE(SUM(
143
- CASE
151
+ SELECT
152
+ COALESCE(SUM(CASE
144
153
  WHEN "status" = 'completed' THEN "actualCostUsd"
145
- WHEN "status" IN ('reserved', 'uncertain') THEN "reservationUsd"
154
+ WHEN "status" = 'uncertain' AND "costEstimated" THEN "actualCostUsd"
146
155
  ELSE 0
147
- END
148
- ), 0) AS "held"
156
+ END), 0) AS "spent",
157
+ COALESCE(SUM(CASE WHEN "status" = 'reserved' THEN "reservationUsd" ELSE 0 END), 0) AS "heldReserved",
158
+ COALESCE(SUM(CASE
159
+ WHEN "status" = 'uncertain' AND NOT "costEstimated" THEN "reservationUsd"
160
+ ELSE 0
161
+ END), 0) AS "heldUncertain",
162
+ COUNT(*) FILTER (
163
+ WHERE "status" = 'completed' OR ("status" = 'uncertain' AND "costEstimated")
164
+ ) AS "done"
149
165
  FROM "CodingProxyRequest" WHERE "sessionId" = ${input.sessionId}
150
166
  `;
151
- if (Number(totals[0]?.held ?? 0) + input.reservationUsd >= Number(row.budgetUsd)) {
167
+ const spentUsd = Number(totals[0]?.spent ?? 0);
168
+ const heldReservedUsd = Number(totals[0]?.heldReserved ?? 0);
169
+ const heldUncertainUsd = Number(totals[0]?.heldUncertain ?? 0);
170
+ if (spentUsd + heldReservedUsd + heldUncertainUsd + input.reservationUsd >= Number(row.budgetUsd)) {
171
+ const details = {
172
+ budgetUsd: Number(row.budgetUsd),
173
+ spentUsd,
174
+ heldReservedUsd,
175
+ heldUncertainUsd,
176
+ refusedHoldUsd: input.reservationUsd,
177
+ ...(input.reservationBasis ? { refusedHoldBasis: input.reservationBasis } : {}),
178
+ ...(input.ceilingUsd !== undefined ? { refusedHoldCeilingUsd: input.ceilingUsd } : {}),
179
+ model: input.model,
180
+ turn: Number(totals[0]?.done ?? 0) + 1,
181
+ };
182
+ // The numbers of the session's first refusal only; the control plane copies them into the
183
+ // run's budget event (this role has no access to that table).
184
+ const detailsJson = JSON.stringify({ source: "proxy", ...details });
152
185
  await tx.$executeRaw `
153
- UPDATE "CodingProxySession" SET "budgetExhaustedAt" = COALESCE("budgetExhaustedAt", ${input.now})
154
- WHERE "id" = ${input.sessionId}
186
+ UPDATE "CodingProxySession"
187
+ SET "budgetExhaustedAt" = ${input.now}, "budgetRefusal" = ${detailsJson}::jsonb
188
+ WHERE "id" = ${input.sessionId} AND "budgetExhaustedAt" IS NULL
155
189
  `;
156
- return { outcome: "budget_exhausted" };
190
+ return { outcome: "budget_exhausted", details };
157
191
  }
158
192
  const pricing = JSON.stringify({
159
193
  encoding: input.pricing.encoding,
@@ -165,11 +199,13 @@ export class PrismaProxyLedger {
165
199
  await tx.$executeRaw `
166
200
  INSERT INTO "CodingProxyRequest"
167
201
  ("id", "sessionId", "requestKey", "requestFingerprint", "model", "status",
168
- "reservationUsd", "pricingVersion", "pricingSnapshot", "createdAt", "updatedAt")
202
+ "reservationUsd", "pricingVersion", "pricingSnapshot", "requestBytes", "ceilingUsd",
203
+ "reservationBasis", "conversationKey", "createdAt", "updatedAt")
169
204
  VALUES
170
205
  (${input.id}, ${input.sessionId}, ${input.requestKey}, ${input.requestFingerprint}, ${input.model},
171
206
  'reserved', ${input.reservationUsd}, ${input.pricing.version}, ${pricing}::jsonb,
172
- CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
207
+ ${input.requestBytes ?? null}, ${input.ceilingUsd ?? null}, ${input.reservationBasis ?? null},
208
+ ${input.conversationKey ?? null}, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
173
209
  `;
174
210
  const request = await requestById(tx, input.id);
175
211
  if (!request)
@@ -189,7 +225,8 @@ export class PrismaProxyLedger {
189
225
  SELECT "id", "sessionId", "requestKey", "requestFingerprint", "model", "status",
190
226
  "reservationUsd", "actualCostUsd", "pricingVersion", "pricingSnapshot",
191
227
  "inputTokens", "outputTokens", "cachedInputTokens", "cacheWriteTokens",
192
- "reasoningTokens", "upstreamStatus"
228
+ "reasoningTokens", "upstreamStatus", "costEstimated",
229
+ "requestBytes", "ceilingUsd", "reservationBasis", "conversationKey"
193
230
  FROM "CodingProxyRequest" WHERE "id" = ${requestId} FOR UPDATE
194
231
  `;
195
232
  const prior = locked[0] ? requestFromRow(locked[0]) : null;
@@ -210,63 +247,73 @@ export class PrismaProxyLedger {
210
247
  "inputTokens" = ${usage.inputTokens}, "outputTokens" = ${usage.outputTokens},
211
248
  "cachedInputTokens" = ${usage.cachedInputTokens}, "cacheWriteTokens" = ${usage.cacheWriteTokens},
212
249
  "reasoningTokens" = ${usage.reasoningTokens}, "upstreamStatus" = ${upstreamStatus},
250
+ "costEstimated" = false,
213
251
  "completedAt" = CURRENT_TIMESTAMP, "updatedAt" = CURRENT_TIMESTAMP
214
252
  WHERE "id" = ${requestId} AND "status" IN ('reserved', 'uncertain')
215
253
  `;
216
- const [updatedRun] = await tx.$queryRaw `
217
- UPDATE "Run" AS r
218
- SET "tokensIn" = totals."tokensIn", "tokensOut" = totals."tokensOut", "costUsd" = totals."costUsd",
219
- "turns" = totals."turns"
220
- FROM (
221
- SELECT s."runId", COALESCE(SUM(q."inputTokens"), 0)::integer AS "tokensIn",
222
- COALESCE(SUM(q."outputTokens"), 0)::integer AS "tokensOut",
223
- COALESCE(SUM(q."actualCostUsd"), 0) AS "costUsd",
224
- COUNT(*)::integer AS "turns"
225
- FROM "CodingProxySession" s
226
- JOIN "CodingProxyRequest" q ON q."sessionId" = s."id" AND q."status" = 'completed'
227
- WHERE s."id" = ${prior.sessionId}
228
- GROUP BY s."runId"
229
- ) AS totals
230
- WHERE r."id" = totals."runId"
231
- RETURNING r."id"
232
- `;
233
- // Per-model usage (RunModelUsage), recomputed for this request's model and set, never incremented.
234
- // Best effort inside a savepoint: Run totals and the ledger are the budget truth, so a failed
235
- // write here (e.g. a role without the RunModelUsage grant) must never fail the completion.
236
- await tx.$executeRaw `SAVEPOINT run_model_usage`;
237
- try {
238
- await tx.$executeRaw `
239
- INSERT INTO "RunModelUsage"
240
- ("runId", "model", "freshInputTokens", "cachedInputTokens", "cacheWriteTokens", "outputTokens", "costUsd")
241
- SELECT s."runId", q."model",
242
- COALESCE(SUM(COALESCE(q."inputTokens", 0) - COALESCE(q."cachedInputTokens", 0)), 0)::integer,
243
- COALESCE(SUM(q."cachedInputTokens"), 0)::integer,
244
- COALESCE(SUM(q."cacheWriteTokens"), 0)::integer,
245
- COALESCE(SUM(q."outputTokens"), 0)::integer,
246
- COALESCE(SUM(q."actualCostUsd"), 0)
247
- FROM "CodingProxySession" s
248
- JOIN "CodingProxyRequest" q ON q."sessionId" = s."id" AND q."status" = 'completed'
249
- WHERE s."id" = ${prior.sessionId} AND q."model" = ${prior.model}
250
- GROUP BY s."runId", q."model"
251
- ON CONFLICT ("runId", "model") DO UPDATE SET
252
- "freshInputTokens" = EXCLUDED."freshInputTokens",
253
- "cachedInputTokens" = EXCLUDED."cachedInputTokens",
254
- "cacheWriteTokens" = EXCLUDED."cacheWriteTokens",
255
- "outputTokens" = EXCLUDED."outputTokens",
256
- "costUsd" = EXCLUDED."costUsd"
257
- `;
258
- await tx.$executeRaw `RELEASE SAVEPOINT run_model_usage`;
259
- }
260
- catch (err) {
261
- await tx.$executeRaw `ROLLBACK TO SAVEPOINT run_model_usage`;
262
- log.warn({ err, runId: updatedRun?.id, sessionId: prior.sessionId, model: prior.model }, "could not record the run's model usage");
263
- }
254
+ await this.recomputeRunTotals(tx, prior.sessionId, prior.model);
264
255
  const request = await requestById(tx, requestId);
265
256
  if (!request)
266
257
  throw new Error("proxy_completion_not_persisted");
267
258
  return request;
268
259
  });
269
260
  }
261
+ /**
262
+ * Recomputes the run's totals (Run) and this model's usage (RunModelUsage) from its settled
263
+ * requests: completed ones and uncertain ones settled at an estimate. Set, never incremented.
264
+ */
265
+ async recomputeRunTotals(tx, sessionId, model) {
266
+ const [updatedRun] = await tx.$queryRaw `
267
+ UPDATE "Run" AS r
268
+ SET "tokensIn" = totals."tokensIn", "tokensOut" = totals."tokensOut", "costUsd" = totals."costUsd",
269
+ "turns" = totals."turns"
270
+ FROM (
271
+ SELECT s."runId", COALESCE(SUM(q."inputTokens"), 0)::integer AS "tokensIn",
272
+ COALESCE(SUM(q."outputTokens"), 0)::integer AS "tokensOut",
273
+ COALESCE(SUM(q."actualCostUsd"), 0) AS "costUsd",
274
+ COUNT(*)::integer AS "turns"
275
+ FROM "CodingProxySession" s
276
+ JOIN "CodingProxyRequest" q ON q."sessionId" = s."id"
277
+ AND (q."status" = 'completed' OR (q."status" = 'uncertain' AND q."costEstimated"))
278
+ WHERE s."id" = ${sessionId}
279
+ GROUP BY s."runId"
280
+ ) AS totals
281
+ WHERE r."id" = totals."runId"
282
+ RETURNING r."id"
283
+ `;
284
+ // Per-model usage (RunModelUsage), recomputed for this request's model and set, never incremented.
285
+ // Best effort inside a savepoint: Run totals and the ledger are the budget truth, so a failed
286
+ // write here (e.g. a role without the RunModelUsage grant) must never fail the completion.
287
+ await tx.$executeRaw `SAVEPOINT run_model_usage`;
288
+ try {
289
+ await tx.$executeRaw `
290
+ INSERT INTO "RunModelUsage"
291
+ ("runId", "model", "freshInputTokens", "cachedInputTokens", "cacheWriteTokens", "outputTokens", "costUsd")
292
+ SELECT s."runId", q."model",
293
+ COALESCE(SUM(COALESCE(q."inputTokens", 0) - COALESCE(q."cachedInputTokens", 0)), 0)::integer,
294
+ COALESCE(SUM(q."cachedInputTokens"), 0)::integer,
295
+ COALESCE(SUM(q."cacheWriteTokens"), 0)::integer,
296
+ COALESCE(SUM(q."outputTokens"), 0)::integer,
297
+ COALESCE(SUM(q."actualCostUsd"), 0)
298
+ FROM "CodingProxySession" s
299
+ JOIN "CodingProxyRequest" q ON q."sessionId" = s."id"
300
+ AND (q."status" = 'completed' OR (q."status" = 'uncertain' AND q."costEstimated"))
301
+ WHERE s."id" = ${sessionId} AND q."model" = ${model}
302
+ GROUP BY s."runId", q."model"
303
+ ON CONFLICT ("runId", "model") DO UPDATE SET
304
+ "freshInputTokens" = EXCLUDED."freshInputTokens",
305
+ "cachedInputTokens" = EXCLUDED."cachedInputTokens",
306
+ "cacheWriteTokens" = EXCLUDED."cacheWriteTokens",
307
+ "outputTokens" = EXCLUDED."outputTokens",
308
+ "costUsd" = EXCLUDED."costUsd"
309
+ `;
310
+ await tx.$executeRaw `RELEASE SAVEPOINT run_model_usage`;
311
+ }
312
+ catch (err) {
313
+ await tx.$executeRaw `ROLLBACK TO SAVEPOINT run_model_usage`;
314
+ log.warn({ err, runId: updatedRun?.id, sessionId, model }, "could not record the run's model usage");
315
+ }
316
+ }
270
317
  async release(requestId, upstreamStatus) {
271
318
  await this.db.$executeRaw `
272
319
  UPDATE "CodingProxyRequest"
@@ -274,12 +321,70 @@ export class PrismaProxyLedger {
274
321
  WHERE "id" = ${requestId} AND "status" = 'reserved'
275
322
  `;
276
323
  }
277
- async markUncertain(requestId, upstreamStatus) {
278
- await this.db.$executeRaw `
279
- UPDATE "CodingProxyRequest"
280
- SET "status" = 'uncertain', "upstreamStatus" = ${upstreamStatus ?? null}, "updatedAt" = CURRENT_TIMESTAMP
281
- WHERE "id" = ${requestId} AND "status" = 'reserved'
324
+ async markUncertain(requestId, upstreamStatus, estimate) {
325
+ await this.transaction(async (tx) => {
326
+ const initial = await requestById(tx, requestId);
327
+ if (!initial)
328
+ return;
329
+ await tx.$queryRaw `
330
+ SELECT "id" FROM "CodingProxySession" WHERE "id" = ${initial.sessionId} FOR UPDATE
331
+ `;
332
+ const updated = await tx.$executeRaw `
333
+ UPDATE "CodingProxyRequest"
334
+ SET "status" = 'uncertain', "upstreamStatus" = ${upstreamStatus ?? null},
335
+ "actualCostUsd" = ${estimate?.costUsd ?? null},
336
+ "inputTokens" = ${estimate?.usage.inputTokens ?? null}, "outputTokens" = ${estimate?.usage.outputTokens ?? null},
337
+ "cachedInputTokens" = ${estimate?.usage.cachedInputTokens ?? null},
338
+ "cacheWriteTokens" = ${estimate?.usage.cacheWriteTokens ?? null},
339
+ "reasoningTokens" = ${estimate ? 0 : null},
340
+ "costEstimated" = ${estimate !== undefined}, "updatedAt" = CURRENT_TIMESTAMP
341
+ WHERE "id" = ${requestId} AND "status" = 'reserved'
342
+ `;
343
+ if (estimate && updated > 0)
344
+ await this.recomputeRunTotals(tx, initial.sessionId, initial.model);
345
+ });
346
+ }
347
+ async settlementHints(sessionId, model) {
348
+ const median = await this.db.$queryRaw `
349
+ SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY "outputTokens") AS "median"
350
+ FROM "CodingProxyRequest"
351
+ WHERE "sessionId" = ${sessionId} AND "model" = ${model} AND "status" = 'completed'
352
+ AND "outputTokens" IS NOT NULL
282
353
  `;
354
+ const medianOutputTokens = median[0]?.median ?? null;
355
+ return {
356
+ ...(medianOutputTokens !== null ? { medianOutputTokens: Number(medianOutputTokens) } : {}),
357
+ };
358
+ }
359
+ async previousReply(sessionId, conversationKey) {
360
+ const rows = await this.db.$queryRaw `
361
+ SELECT "model", "status", "costEstimated", "inputTokens", "outputTokens", "cachedInputTokens",
362
+ "cacheWriteTokens", "reasoningTokens", "requestBytes", "createdAt"
363
+ FROM "CodingProxyRequest"
364
+ WHERE "sessionId" = ${sessionId} AND "conversationKey" = ${conversationKey}
365
+ AND "status" IN ('completed', 'uncertain')
366
+ ORDER BY "createdAt" DESC LIMIT 1
367
+ `;
368
+ const row = rows[0];
369
+ if (!row)
370
+ return null;
371
+ const usage = row.inputTokens !== null && row.outputTokens !== null
372
+ ? {
373
+ inputTokens: row.inputTokens,
374
+ outputTokens: row.outputTokens,
375
+ cachedInputTokens: row.cachedInputTokens ?? 0,
376
+ cacheWriteTokens: row.cacheWriteTokens ?? 0,
377
+ reasoningTokens: row.reasoningTokens ?? 0,
378
+ }
379
+ : undefined;
380
+ return {
381
+ model: row.model,
382
+ status: row.status,
383
+ costEstimated: row.costEstimated === true,
384
+ ...(usage ? { usage } : {}),
385
+ requestBytes: row.requestBytes,
386
+ startedAt: row.createdAt,
387
+ };
283
388
  }
284
389
  async cancelSession(sessionId) {
285
390
  await this.db.$executeRaw `
@@ -293,6 +398,13 @@ export class PrismaProxyLedger {
293
398
  `;
294
399
  return rows.length > 0;
295
400
  }
401
+ async budgetRefusal(sessionId) {
402
+ const rows = await this.db.$queryRaw `
403
+ SELECT "budgetRefusal" FROM "CodingProxySession" WHERE "id" = ${sessionId}
404
+ `;
405
+ const value = rows[0]?.budgetRefusal;
406
+ return value && typeof value === "object" ? value : null;
407
+ }
296
408
  async recordUpstreamFailure(sessionId, code) {
297
409
  await this.db.$executeRaw `
298
410
  UPDATE "CodingProxySession" SET "upstreamFailure" = ${code}, "updatedAt" = CURRENT_TIMESTAMP
@@ -1,5 +1,5 @@
1
1
  import type { ModelPricing } from "../llm/pricing-core.js";
2
- import type { CredentialResolver, ProxyAuditSink, ProxyLedger, ProxyModelTerms, ProxyProtocol } from "./types.js";
2
+ import type { CredentialResolver, ProxyAuditSink, ProxyLedger, ProxyModelTerms, ProxyProtocol, ProxyRefusalRecord } from "./types.js";
3
3
  export declare const PROXY_MAX_BODY_BYTES: number;
4
4
  export declare const PROXY_MAX_OUTPUT_TOKENS = 1000000;
5
5
  export declare const PROXY_DEFAULT_MAX_OUTPUT_TOKENS = 4096;
@@ -64,6 +64,11 @@ export interface CodingProxyOptions {
64
64
  audit?: ProxyAuditSink;
65
65
  pricing?: (model: string, protocol: ProxyProtocol) => ModelPricing;
66
66
  pricingVersion?: string;
67
+ /**
68
+ * Called with the run's id on every authenticated model request, before it is forwarded (the
69
+ * dependency cache's seal, ModelRequestSeal). Awaited; a failure is ignored, never the request's.
70
+ */
71
+ onModelRequest?: (runId: string) => Promise<void>;
67
72
  }
68
73
  export declare function capabilityHash(capability: string): string;
69
74
  export declare class CodingProxy {
@@ -76,11 +81,14 @@ export declare class CodingProxy {
76
81
  private readonly getPricing;
77
82
  private readonly priceVersion;
78
83
  private readonly activeRequests;
84
+ private readonly onModelRequest?;
79
85
  constructor(options: CodingProxyOptions);
80
86
  createSession(input: CreateCodingProxySession): Promise<CreatedCodingProxySession>;
81
87
  cancelSession(sessionId: string): Promise<void>;
82
88
  /** Whether this session's run was refused a model request for budget. */
83
89
  budgetExhausted(sessionId: string): Promise<boolean>;
90
+ /** The numbers behind this session's first budget refusal, if any. */
91
+ budgetRefusal(sessionId: string): Promise<ProxyRefusalRecord | null>;
84
92
  /** The code of the first upstream failure relayed for this session's run, if any. */
85
93
  upstreamFailure(sessionId: string): Promise<string | null>;
86
94
  execute(input: ExecuteProxyRequest, sink: ProxyResponseSink): Promise<void>;
@@ -95,4 +103,9 @@ export declare class CodingProxy {
95
103
  /** Best effort: the executor reads it to name the failure; it must never break the relay. */
96
104
  private recordUpstreamFailure;
97
105
  private markUncertain;
106
+ /**
107
+ * The best known cost of a request that broke before its final usage (interrupted.ts), or
108
+ * undefined when none can be made: the request then keeps its full hold. Never throws.
109
+ */
110
+ private estimateInterrupted;
98
111
  }