@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
@@ -0,0 +1,156 @@
1
+ import { codingTopUpRoom, MIN_RESERVATION_USD } from "./budget-groups.js";
2
+ import { GROUP_DISPATCH_LOCK_SQL, isSerializationConflict, isTransactionUnavailable } from "./dispatch.js";
3
+ import { logger } from "./logger.js";
4
+ const topUpLog = logger.child({ module: "budget-topup" });
5
+ /** Share of the base one step adds, unless one maximum request hold is more. */
6
+ export const TOP_UP_STEP_SHARE = 0.1;
7
+ /** Headroom: the share of the base, or this many of the run's largest request holds if more. */
8
+ export const TOP_UP_HEADROOM_SHARE = 0.2;
9
+ export const TOP_UP_HEADROOM_HOLDS = 2;
10
+ const roundMicro = (usd) => Math.round(usd / MIN_RESERVATION_USD) * MIN_RESERVATION_USD;
11
+ const floorMicro = (usd) => Math.floor(usd / MIN_RESERVATION_USD + 1e-6) * MIN_RESERVATION_USD;
12
+ /** The run's grant, limit and proxy-session totals, or the outcome when there is nothing to ask for. */
13
+ async function readState(db, runId) {
14
+ const coding = await db.codingRun.findUnique({
15
+ where: { runId },
16
+ select: {
17
+ budgetReservedUsd: true,
18
+ budgetBaseUsd: true,
19
+ budgetLimitUsd: true,
20
+ run: { select: { status: true } },
21
+ proxySession: { select: { id: true, status: true, budgetExhaustedAt: true } },
22
+ },
23
+ });
24
+ if (!coding || coding.budgetLimitUsd == null)
25
+ return { outcome: "closed" };
26
+ const grantedUsd = Number(coding.budgetReservedUsd);
27
+ const limitUsd = Number(coding.budgetLimitUsd);
28
+ const result = { outcome: "closed", grantedUsd };
29
+ if (grantedUsd + MIN_RESERVATION_USD > limitUsd)
30
+ return result;
31
+ if (coding.run.status !== "running" && coding.run.status !== "pending")
32
+ return result;
33
+ // Already refused by the proxy: the worker is stopping, a grant now would only be held for nothing.
34
+ const session = coding.proxySession;
35
+ if (!session || session.status !== "active" || session.budgetExhaustedAt)
36
+ return result;
37
+ const refused = await db.runBudgetEvent.findFirst({
38
+ where: { runId, kind: "overrun_unavailable" },
39
+ select: { id: true },
40
+ });
41
+ if (refused)
42
+ return result;
43
+ // Totals as the proxy ledger counts them (prisma-ledger.ts reserve).
44
+ const totals = await db.$queryRaw `
45
+ SELECT
46
+ COALESCE(SUM(CASE
47
+ WHEN "status" = 'completed' THEN "actualCostUsd"
48
+ WHEN "status" = 'uncertain' AND "costEstimated" THEN "actualCostUsd"
49
+ ELSE 0
50
+ END), 0) AS "spent",
51
+ COALESCE(SUM(CASE
52
+ WHEN "status" = 'reserved' THEN "reservationUsd"
53
+ WHEN "status" = 'uncertain' AND NOT "costEstimated" THEN "reservationUsd"
54
+ ELSE 0
55
+ END), 0) AS "held",
56
+ COALESCE(MAX(COALESCE("ceilingUsd", "reservationUsd")), 0) AS "maxHold"
57
+ FROM "CodingProxyRequest" WHERE "sessionId" = ${session.id}
58
+ `;
59
+ return {
60
+ baseUsd: coding.budgetBaseUsd == null ? grantedUsd : Number(coding.budgetBaseUsd),
61
+ grantedUsd,
62
+ limitUsd,
63
+ sessionId: session.id,
64
+ spentUsd: Number(totals[0]?.spent ?? 0),
65
+ heldUsd: Number(totals[0]?.held ?? 0),
66
+ maxHoldUsd: Number(totals[0]?.maxHold ?? 0),
67
+ };
68
+ }
69
+ /**
70
+ * How far below its grant a run asks for its next step. Agent loops grow their
71
+ * context, so the next request usually holds more than any before it, and the
72
+ * top-up has to land before it is sent.
73
+ */
74
+ function headroomUsd(state) {
75
+ return Math.max(TOP_UP_HEADROOM_HOLDS * state.maxHoldUsd, TOP_UP_HEADROOM_SHARE * state.baseUsd);
76
+ }
77
+ /** Close to its grant: within its headroom. */
78
+ function isClose(state) {
79
+ return state.spentUsd + state.heldUsd >= state.grantedUsd - headroomUsd(state);
80
+ }
81
+ /** Near enough to its grant that the next poll should come soon. */
82
+ function isNear(state) {
83
+ return state.spentUsd + state.heldUsd >= state.grantedUsd - 2 * headroomUsd(state);
84
+ }
85
+ async function grantOnce(tx, runId, now) {
86
+ // First statement: serializes with dispatch and every other top-up (see GROUP_DISPATCH_LOCK_SQL).
87
+ await tx.$executeRawUnsafe(GROUP_DISPATCH_LOCK_SQL);
88
+ const state = await readState(tx, runId);
89
+ if ("outcome" in state)
90
+ return state;
91
+ if (!isClose(state))
92
+ return { outcome: "not_needed", grantedUsd: state.grantedUsd, near: isNear(state) };
93
+ const room = await codingTopUpRoom(tx, runId, now);
94
+ const step = Math.max(TOP_UP_STEP_SHARE * state.baseUsd, state.maxHoldUsd);
95
+ const grant = floorMicro(Math.min(step, state.limitUsd - state.grantedUsd, room.roomUsd));
96
+ if (grant < MIN_RESERVATION_USD) {
97
+ const details = {
98
+ source: "top-up",
99
+ capUsd: room.detail?.capUsd ?? 0,
100
+ spentUsd: room.detail?.spentUsd ?? 0,
101
+ heldUsd: room.detail?.heldUsd ?? 0,
102
+ leftUsd: room.roomUsd,
103
+ baseBudgetUsd: state.baseUsd,
104
+ grantedUsd: state.grantedUsd,
105
+ limitUsd: state.limitUsd,
106
+ ...(room.groupName ? { groupName: room.groupName } : {}),
107
+ };
108
+ await tx.runBudgetEvent.create({
109
+ data: {
110
+ runId,
111
+ kind: "overrun_unavailable",
112
+ limit: room.limitedBy ?? "run",
113
+ details: details,
114
+ },
115
+ });
116
+ return { outcome: "unavailable", grantedUsd: state.grantedUsd };
117
+ }
118
+ const grantedUsd = Math.min(state.limitUsd, roundMicro(state.grantedUsd + grant));
119
+ await tx.codingRun.update({ where: { runId }, data: { budgetReservedUsd: grantedUsd } });
120
+ await tx.codingProxySession.updateMany({
121
+ where: { id: state.sessionId, status: "active" },
122
+ data: { budgetUsd: grantedUsd },
123
+ });
124
+ return { outcome: "granted", grantedUsd, near: true };
125
+ }
126
+ /**
127
+ * Grants the run one overrun step when it is close to its grant and its
128
+ * budget group and run tree have room. Cheap when it is not close: that is
129
+ * read without the lock. One attempt per call, so a poll never blocks on
130
+ * retries: a serialization conflict (or a lock not had in time) answers
131
+ * not_needed and near, and the caller's next poll, soon, asks again.
132
+ */
133
+ export async function topUpCodingBudget(db, runId, now = new Date()) {
134
+ const state = await readState(db, runId);
135
+ if ("outcome" in state)
136
+ return state;
137
+ if (!isClose(state))
138
+ return { outcome: "not_needed", grantedUsd: state.grantedUsd, near: isNear(state) };
139
+ try {
140
+ const result = await db.$transaction((tx) => grantOnce(tx, runId, now), {
141
+ isolationLevel: "Serializable",
142
+ maxWait: TOP_UP_TX_MAX_WAIT_MS,
143
+ });
144
+ if (result.outcome === "granted" || result.outcome === "unavailable") {
145
+ topUpLog.info({ runId, outcome: result.outcome, grantedUsd: result.grantedUsd }, "coding run overrun top-up");
146
+ }
147
+ return result;
148
+ }
149
+ catch (err) {
150
+ if (!isSerializationConflict(err) && !isTransactionUnavailable(err))
151
+ throw err;
152
+ return { outcome: "not_needed", grantedUsd: state.grantedUsd, near: true };
153
+ }
154
+ }
155
+ /** How long one top-up waits to start its transaction: short, so a poll (and its heartbeat) is never held long. */
156
+ export const TOP_UP_TX_MAX_WAIT_MS = 2_000;
@@ -6,17 +6,31 @@
6
6
  */
7
7
  import type { PrismaClient } from "#prisma";
8
8
  export interface BudgetFacts {
9
- /** The run's own budget (a coding run's reservation); falls back to the agent's. */
9
+ /** The run's own budget (a coding run's reservation: its grant); falls back to the agent's. */
10
10
  runBudgetUsd?: number | null;
11
11
  agentBudgetUsd: number;
12
+ /** The run's budget before the agent's allowed overrun; absent for runs from before the setting. */
13
+ baseBudgetUsd?: number | null;
14
+ /** The most the run could have been topped up to (CodingRun.budgetLimitUsd); absent = its reservation. */
15
+ limitUsd?: number | null;
12
16
  budgetGroupName?: string | null;
13
17
  /** The run was refused before it started. */
14
18
  refused?: boolean;
15
19
  }
20
+ /** A group name is operator-chosen text; keep it to one short, quote-free line. */
21
+ export declare function groupName(name: string | null | undefined): string | null;
22
+ /** The allowed overrun as a whole percent, or null when the run had none (no base, or it rounds to 0%). */
23
+ export declare function overrunPercent(baseUsd: number | null | undefined, limitUsd: number): number | null;
16
24
  export declare function budgetSentence(facts: BudgetFacts): string;
25
+ /**
26
+ * For a run that finished over its base budget: what it spent and by how much
27
+ * it went over, and whether that stayed inside the allowed overrun. Undefined
28
+ * when the spend is within the base budget.
29
+ */
30
+ export declare function overrunSentence(costUsd: number, baseUsd: number, limitUsd: number): string | undefined;
17
31
  /**
18
32
  * The sentence for a finished run, read from the database: a coding run's
19
33
  * reserved budget, otherwise the agent's. Falls back to a sentence without
20
34
  * amounts when they cannot be read. Never throws.
21
35
  */
22
- export declare function loadBudgetSentence(db: Pick<PrismaClient, "run">, runId: string, status: string): Promise<string>;
36
+ export declare function loadBudgetSentence(db: Pick<PrismaClient, "run" | "runBudgetEvent">, runId: string, status: string): Promise<string>;
@@ -1,10 +1,18 @@
1
+ import { hostBudgetSentence, loadBudgetEvent } from "./budget-events.js";
1
2
  const MAX_GROUP_NAME_CHARS = 64;
2
3
  const usd = (amount) => `$${amount.toFixed(2)}`;
3
4
  /** A group name is operator-chosen text; keep it to one short, quote-free line. */
4
- function groupName(name) {
5
+ export function groupName(name) {
5
6
  const cleaned = (name ?? "").replace(/["`]/g, "").replace(/\s+/g, " ").trim().slice(0, MAX_GROUP_NAME_CHARS);
6
7
  return cleaned || null;
7
8
  }
9
+ /** The allowed overrun as a whole percent, or null when the run had none (no base, or it rounds to 0%). */
10
+ export function overrunPercent(baseUsd, limitUsd) {
11
+ if (baseUsd == null || !(baseUsd > 0) || !(baseUsd < limitUsd))
12
+ return null;
13
+ const percent = Math.round((limitUsd / baseUsd - 1) * 100);
14
+ return percent > 0 ? percent : null;
15
+ }
8
16
  export function budgetSentence(facts) {
9
17
  const group = groupName(facts.budgetGroupName);
10
18
  if (facts.refused) {
@@ -14,6 +22,16 @@ export function budgetSentence(facts) {
14
22
  : `Out of budget: ${within}.`;
15
23
  }
16
24
  const runBudget = facts.runBudgetUsd ?? facts.agentBudgetUsd;
25
+ const base = facts.baseBudgetUsd;
26
+ const limit = facts.limitUsd ?? runBudget;
27
+ const percent = overrunPercent(base, limit);
28
+ if (base != null && percent !== null && runBudget > base) {
29
+ // Topped up only partly: what of the overrun its group and run tree had room for.
30
+ const overrun = runBudget < limit
31
+ ? `${usd(runBudget - base)} of its ${percent}% allowed overrun`
32
+ : `its ${percent}% allowed overrun`;
33
+ return `Out of budget: this run's ${usd(base)} budget and ${overrun} (${usd(runBudget)} in all) were used up.`;
34
+ }
17
35
  const used = `Out of budget: this run's ${usd(runBudget)} budget was used up`;
18
36
  // A run reserved less than the agent's own budget: its group had only that much left.
19
37
  if (group && runBudget < facts.agentBudgetUsd) {
@@ -21,27 +39,47 @@ export function budgetSentence(facts) {
21
39
  }
22
40
  return `${used}.`;
23
41
  }
42
+ /**
43
+ * For a run that finished over its base budget: what it spent and by how much
44
+ * it went over, and whether that stayed inside the allowed overrun. Undefined
45
+ * when the spend is within the base budget.
46
+ */
47
+ export function overrunSentence(costUsd, baseUsd, limitUsd) {
48
+ if (!(baseUsd > 0) || !(costUsd > baseUsd))
49
+ return undefined;
50
+ const over = costUsd - baseUsd;
51
+ const percent = Math.round((over / baseUsd) * 100);
52
+ const within = costUsd <= limitUsd ? ", within its allowed overrun" : "";
53
+ return `Spent ${usd(costUsd)}, ${usd(over)} (${percent}%) over its ${usd(baseUsd)} budget${within}.`;
54
+ }
24
55
  /**
25
56
  * The sentence for a finished run, read from the database: a coding run's
26
57
  * reserved budget, otherwise the agent's. Falls back to a sentence without
27
58
  * amounts when they cannot be read. Never throws.
28
59
  */
29
60
  export async function loadBudgetSentence(db, runId, status) {
61
+ const loaded = await loadBudgetEvent(db, runId);
62
+ if (loaded)
63
+ return hostBudgetSentence(loaded.event);
30
64
  const refused = status === "refused";
31
65
  try {
32
66
  const row = await db.run.findUnique({
33
67
  where: { id: runId },
34
68
  select: {
35
69
  agent: { select: { budgetUsd: true, budgetGroup: { select: { name: true } } } },
36
- codingRun: { select: { budgetReservedUsd: true } },
70
+ codingRun: { select: { budgetReservedUsd: true, budgetBaseUsd: true, budgetLimitUsd: true } },
37
71
  },
38
72
  });
39
73
  const agentBudgetUsd = Number(row?.agent?.budgetUsd);
40
74
  if (!row?.agent || !Number.isFinite(agentBudgetUsd))
41
75
  throw new Error("budget_facts_unavailable");
42
76
  const reserved = row.codingRun ? Number(row.codingRun.budgetReservedUsd) : NaN;
77
+ const base = row.codingRun?.budgetBaseUsd == null ? NaN : Number(row.codingRun.budgetBaseUsd);
78
+ const limit = row.codingRun?.budgetLimitUsd == null ? NaN : Number(row.codingRun.budgetLimitUsd);
43
79
  return budgetSentence({
44
80
  runBudgetUsd: Number.isFinite(reserved) ? reserved : null,
81
+ baseBudgetUsd: Number.isFinite(base) ? base : null,
82
+ limitUsd: Number.isFinite(limit) ? limit : null,
45
83
  agentBudgetUsd,
46
84
  budgetGroupName: row.agent.budgetGroup?.name ?? null,
47
85
  refused,
@@ -5,7 +5,8 @@
5
5
  *
6
6
  * 1. fails queued runs that waited longer than CODING_QUEUE_TIMEOUT_SEC
7
7
  * (coding_queue_timeout), with a conditional update so concurrent
8
- * drains never double-fail a run;
8
+ * drains never double-fail a run, then lets the executor clean up after
9
+ * each (Executor.cleanupQueueTimeout);
9
10
  * 2. starts the oldest queued runs, at most as many as there are free
10
11
  * slots, so order stays FIFO in practice. Starting is fire-and-forget,
11
12
  * like dispatchRun: Executor.start resolves only when the run ends.
@@ -30,6 +30,13 @@ export async function drainCodingQueue(options) {
30
30
  timedOut += 1;
31
31
  // Only this drain made the row failed (a concurrent drain matched zero rows); bounded, never throws.
32
32
  await fileSelfDefectForRun(options.selfDefects, runId);
33
+ // What a launch the cluster refused left behind (a continuation's in-progress check, its input).
34
+ try {
35
+ await executor.cleanupQueueTimeout?.(runId);
36
+ }
37
+ catch (err) {
38
+ queueLog.warn({ err, runId }, "queue-timeout cleanup failed");
39
+ }
33
40
  }
34
41
  }
35
42
  const active = await db.codingRun.count({
@@ -5,7 +5,11 @@
5
5
  export interface DueCheckInput {
6
6
  schedule: string;
7
7
  timezone: string;
8
- /** Start of the most recent window this agent already fired for, or null if never. */
8
+ /**
9
+ * Start of the most recent window this agent already fired for, or the
10
+ * moment its schedule was set (see startsSchedule); null only for a
11
+ * schedule set before that was recorded.
12
+ */
9
13
  lastScheduledAt: Date | null;
10
14
  now: Date;
11
15
  }
@@ -26,6 +30,20 @@ export interface DueCheckInput {
26
30
  * `now` that lands exactly on a boundary.
27
31
  */
28
32
  export declare function dueWindow(input: DueCheckInput): Date | null;
33
+ export interface ScheduleState {
34
+ schedule: string | null;
35
+ timezone: string;
36
+ scheduleEnabled: boolean;
37
+ }
38
+ /**
39
+ * Whether a schedule change starts the schedule afresh. Setting, changing
40
+ * (expression or timezone) or re-enabling a schedule does, so it first fires
41
+ * at its next window after that, never for one that passed before it existed
42
+ * or while it was off (see scheduleStartFields). Saving the schedule it
43
+ * already has does not, keeping its firing history. `before` is null for a
44
+ * new agent.
45
+ */
46
+ export declare function startsSchedule(before: ScheduleState | null, after: ScheduleState): boolean;
29
47
  export declare function isDue(input: DueCheckInput): boolean;
30
48
  /** Throws a descriptive error for an invalid cron expression or timezone. */
31
49
  export declare function validateCronExpression(schedule: string, timezone: string): void;
package/dist/core/cron.js CHANGED
@@ -31,6 +31,23 @@ export function dueWindow(input) {
31
31
  }
32
32
  return mostRecent;
33
33
  }
34
+ /**
35
+ * Whether a schedule change starts the schedule afresh. Setting, changing
36
+ * (expression or timezone) or re-enabling a schedule does, so it first fires
37
+ * at its next window after that, never for one that passed before it existed
38
+ * or while it was off (see scheduleStartFields). Saving the schedule it
39
+ * already has does not, keeping its firing history. `before` is null for a
40
+ * new agent.
41
+ */
42
+ export function startsSchedule(before, after) {
43
+ if (!after.schedule || !after.scheduleEnabled)
44
+ return false;
45
+ const unchanged = before !== null &&
46
+ before.scheduleEnabled &&
47
+ before.schedule === after.schedule &&
48
+ before.timezone === after.timezone;
49
+ return !unchanged;
50
+ }
34
51
  export function isDue(input) {
35
52
  return dueWindow(input) !== null;
36
53
  }
@@ -65,7 +65,7 @@ export function buildSharedDatastoreAccessor(agentId, datastore, db) {
65
65
  const datastoreId = await resolveDatastoreId(agentId, boundName, db);
66
66
  if (!datastoreId)
67
67
  throw new Error("datastore_not_bound");
68
- await datastore.setShared(datastoreId, key, value, opts);
68
+ await datastore.setShared(datastoreId, key, value, { ...opts, writerAgentId: agentId });
69
69
  },
70
70
  async delete(boundName, key) {
71
71
  const datastoreId = await resolveDatastoreId(agentId, boundName, db);
package/dist/core/db.d.ts CHANGED
@@ -1,4 +1,6 @@
1
+ import type { PoolConfig } from "pg";
1
2
  import { PrismaClient } from "#prisma";
3
+ import { type DatabaseAuth, type PgAuthOptions } from "./pg-auth.js";
2
4
  /**
3
5
  * Connection-pool sizing for the node-postgres pool behind @prisma/adapter-pg.
4
6
  *
@@ -28,13 +30,21 @@ export interface PoolSettings {
28
30
  connectionTimeoutMillis: number;
29
31
  }
30
32
  export declare function poolSettings(connectionString: string): PoolSettings;
33
+ export interface PrismaClientOptions {
34
+ /** Overrides the pool size for a caller that sizes its own pools
35
+ * (the coding proxy keeps its ledger and its package registry apart). */
36
+ poolMax?: number;
37
+ /** Defaults to DATABASE_AUTH (see pg-auth.ts). */
38
+ auth?: DatabaseAuth;
39
+ /** Test seam for rds-iam (environment, token signer, CA file reader). */
40
+ pgAuth?: PgAuthOptions;
41
+ }
42
+ /** The pg pool config behind every Prisma client: auth (pg-auth.ts) plus pool sizing. */
43
+ export declare function prismaPgConfig(url: string, options?: PrismaClientOptions): PoolConfig;
31
44
  /**
32
45
  * The one way wardby builds a Prisma client. `url` defaults to DATABASE_URL
33
- * as read at call time.
46
+ * as read at call time. How it authenticates follows DATABASE_AUTH
47
+ * (password by default, or rds-iam; see pg-auth.ts).
34
48
  */
35
- /** `poolMax` overrides the pool size for a caller that sizes its own pools
36
- * (the coding proxy keeps its ledger and its package registry apart). */
37
- export declare function createPrismaClient(url?: string | undefined, options?: {
38
- poolMax?: number;
39
- }): PrismaClient;
49
+ export declare function createPrismaClient(url?: string | undefined, options?: PrismaClientOptions): PrismaClient;
40
50
  export declare const prisma: PrismaClient;
package/dist/core/db.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { availableParallelism } from "node:os";
2
2
  import { PrismaPg } from "@prisma/adapter-pg";
3
3
  import { PrismaClient } from "#prisma";
4
+ import { databaseAuthFromEnv, pgConnectionConfig } from "./pg-auth.js";
4
5
  /**
5
6
  * Connection-pool sizing for the node-postgres pool behind @prisma/adapter-pg.
6
7
  *
@@ -56,20 +57,21 @@ class MissingUrlAdapter extends PrismaPg {
56
57
  throw new Error("DATABASE_URL is not set: cannot connect to the database.");
57
58
  }
58
59
  }
60
+ /** The pg pool config behind every Prisma client: auth (pg-auth.ts) plus pool sizing. */
61
+ export function prismaPgConfig(url, options = {}) {
62
+ return {
63
+ ...pgConnectionConfig(url, options.auth ?? databaseAuthFromEnv(), options.pgAuth),
64
+ ...poolSettings(url),
65
+ ...(options.poolMax !== undefined ? { max: options.poolMax } : {}),
66
+ };
67
+ }
59
68
  /**
60
69
  * The one way wardby builds a Prisma client. `url` defaults to DATABASE_URL
61
- * as read at call time.
70
+ * as read at call time. How it authenticates follows DATABASE_AUTH
71
+ * (password by default, or rds-iam; see pg-auth.ts).
62
72
  */
63
- /** `poolMax` overrides the pool size for a caller that sizes its own pools
64
- * (the coding proxy keeps its ledger and its package registry apart). */
65
73
  export function createPrismaClient(url = process.env.DATABASE_URL, options = {}) {
66
- const adapter = url
67
- ? new PrismaPg({
68
- connectionString: url,
69
- ...poolSettings(url),
70
- ...(options.poolMax !== undefined ? { max: options.poolMax } : {}),
71
- })
72
- : new MissingUrlAdapter({ connectionString: "" });
74
+ const adapter = url ? new PrismaPg(prismaPgConfig(url, options)) : new MissingUrlAdapter({ connectionString: "" });
73
75
  return new PrismaClient({ adapter });
74
76
  }
75
77
  export const prisma = createPrismaClient();
@@ -0,0 +1,14 @@
1
+ import type { PrismaClient } from "#prisma";
2
+ import type { Executor } from "../providers/executor/types.js";
3
+ export interface ResolveDeferredCodingInput {
4
+ db: PrismaClient;
5
+ /** The starting process's own executor: the one with the coding configuration. */
6
+ executor: Executor;
7
+ runId: string;
8
+ }
9
+ /**
10
+ * Coding inputs of a run the native gateway dispatched (DeferredExecutor): resolved here, on the
11
+ * process that starts it, with its own executor — the gateway holds no coding configuration.
12
+ * Marker: a pending coding run whose CodingRun.workerImage is null. False: the run was refused.
13
+ */
14
+ export declare function resolveDeferredCodingRun({ db, executor, runId }: ResolveDeferredCodingInput): Promise<boolean>;
@@ -0,0 +1,62 @@
1
+ import { composeCodingTask } from "../coding/protocol.js";
2
+ import { assertCodingProvider } from "../coding/provider.js";
3
+ import { parseAllowedServiceNames } from "../coding/services/catalog.js";
4
+ import { servicesInstructionNote } from "../coding/services/note.js";
5
+ import { knowledgeSection } from "../knowledge/note.js";
6
+ import { readKnowledgeIndexAt, readServiceDeclarationAt, resolveDispatchServices } from "./dispatch.js";
7
+ /**
8
+ * Coding inputs of a run the native gateway dispatched (DeferredExecutor): resolved here, on the
9
+ * process that starts it, with its own executor — the gateway holds no coding configuration.
10
+ * Marker: a pending coding run whose CodingRun.workerImage is null. False: the run was refused.
11
+ */
12
+ export async function resolveDeferredCodingRun({ db, executor, runId }) {
13
+ const run = await db.run.findUnique({
14
+ where: { id: runId },
15
+ include: { codingRun: true, agent: { include: { codingProfile: true } } },
16
+ });
17
+ const coding = run?.codingRun;
18
+ // A native run, or a coding run dispatch already resolved: nothing to do.
19
+ if (!run || !coding || coding.workerImage !== null)
20
+ return true;
21
+ const profile = run.agent.codingProfile;
22
+ if (!profile)
23
+ throw new Error(`coding_profile_missing: coding agent "${run.agentId}" has no coding profile.`);
24
+ assertCodingProvider(coding.provider);
25
+ // The provider is the run's own (fixed at dispatch); the toolchain and image ref are the profile's,
26
+ // read as they are when the run starts.
27
+ const selector = {
28
+ provider: coding.provider,
29
+ toolchain: profile.toolchain,
30
+ toolchainVersion: profile.toolchainVersion,
31
+ workerImageRef: profile.workerImageRef,
32
+ };
33
+ // Services before images, in dispatch's order: a run with both a refused declaration and a bad
34
+ // image ends refused. As at dispatch, only an agent allowed some service reads the declaration,
35
+ // and any refusal dispatch would have raised refuses the run here instead.
36
+ let services = [];
37
+ if (parseAllowedServiceNames(profile.services).length > 0) {
38
+ const outcome = await readServiceDeclarationAt(executor, coding.repository, coding.baseRef);
39
+ const resolved = await resolveDispatchServices(db, outcome, profile.services, executor, coding.provider, coding.task, run.agent.systemPrompt);
40
+ if ("refusal" in resolved) {
41
+ await db.run.updateMany({
42
+ where: { id: runId, status: "pending" },
43
+ data: { status: "refused", error: resolved.refusal, finishedAt: new Date() },
44
+ });
45
+ return false;
46
+ }
47
+ services = resolved.services;
48
+ }
49
+ if (!executor.resolveCodingWorkerImage) {
50
+ throw new Error("coding_execution_not_configured: this process cannot start coding runs.");
51
+ }
52
+ const workerImage = executor.resolveCodingWorkerImage(selector);
53
+ const toolImage = executor.resolveCodingToolImage?.(selector) ?? null;
54
+ const knowledge = await readKnowledgeIndexAt(executor, coding.repository, coding.baseRef);
55
+ const task = composeCodingTask(run.agent.systemPrompt, coding.task, servicesInstructionNote(services), knowledge ? knowledgeSection(knowledge) : undefined);
56
+ // Conditional on the marker: of two racing starts, only one writes (both composed the same inputs).
57
+ await db.codingRun.updateMany({
58
+ where: { runId, workerImage: null },
59
+ data: { workerImage, toolImage, services, task },
60
+ });
61
+ return true;
62
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The one lookup both delegation paths (control-plane `delegate_to_*` and the sandbox gateway's
3
+ * `durableDelegate`) use to find the child a delegation call already created, so a re-executed
4
+ * delegate step (a resume, or a takeover under a new version) waits on that child again instead
5
+ * of refusing it as a duplicate.
6
+ */
7
+ import type { PrismaClient } from "#prisma";
8
+ export type DelegationChildDb = Pick<PrismaClient, "run">;
9
+ /**
10
+ * The child a delegation call already created, if any: exact key first (Run.parentCallId, the
11
+ * model's tool-call id), then the single child of that agent with no key. Two or more such
12
+ * children are ambiguous and adopt none.
13
+ *
14
+ * A caller with a call id is a re-run of a recorded step, so an unkeyed child can only be a
15
+ * legacy row created before parentCallId existed; it is adopted in any status, because it may
16
+ * have finished while the lead was between deploys and its result is what the step is owed. A
17
+ * caller without a call id cannot tell a re-run from a new call (its children are unkeyed too),
18
+ * so it adopts only a drivable child; a finished one leaves the call to the once-per-agent
19
+ * refusal. `createdAt` is the child row's creation time (Run.startedAt, set when the row is
20
+ * written and never rewritten), from which the caller measures its wait bound.
21
+ */
22
+ export declare function findDelegationChild(db: DelegationChildDb, parentRunId: string, childAgentId: string, parentCallId: string | undefined): Promise<{
23
+ id: string;
24
+ createdAt: Date;
25
+ } | null>;
@@ -0,0 +1,37 @@
1
+ import { DRIVABLE } from "./run-status.js";
2
+ /**
3
+ * The child a delegation call already created, if any: exact key first (Run.parentCallId, the
4
+ * model's tool-call id), then the single child of that agent with no key. Two or more such
5
+ * children are ambiguous and adopt none.
6
+ *
7
+ * A caller with a call id is a re-run of a recorded step, so an unkeyed child can only be a
8
+ * legacy row created before parentCallId existed; it is adopted in any status, because it may
9
+ * have finished while the lead was between deploys and its result is what the step is owed. A
10
+ * caller without a call id cannot tell a re-run from a new call (its children are unkeyed too),
11
+ * so it adopts only a drivable child; a finished one leaves the call to the once-per-agent
12
+ * refusal. `createdAt` is the child row's creation time (Run.startedAt, set when the row is
13
+ * written and never rewritten), from which the caller measures its wait bound.
14
+ */
15
+ export async function findDelegationChild(db, parentRunId, childAgentId, parentCallId) {
16
+ const select = { id: true, startedAt: true };
17
+ const found = (row) => ({ id: row.id, createdAt: row.startedAt });
18
+ if (parentCallId) {
19
+ // Same agent too: a call id is the same call only if it names the same sub-agent. A colliding
20
+ // id from another agent is never adopted: its create then fails on the unique key, which the
21
+ // delegate tool answers with a tool-result error (delegation_conflict), never a run failure.
22
+ const keyed = await db.run.findFirst({ where: { parentRunId, parentCallId, agentId: childAgentId }, select });
23
+ if (keyed)
24
+ return found(keyed);
25
+ }
26
+ const legacy = await db.run.findMany({
27
+ where: {
28
+ parentRunId,
29
+ agentId: childAgentId,
30
+ parentCallId: null,
31
+ ...(parentCallId ? {} : { status: { in: [...DRIVABLE] } }),
32
+ },
33
+ select,
34
+ take: 2,
35
+ });
36
+ return legacy.length === 1 ? found(legacy[0]) : null;
37
+ }