@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
@@ -1,7 +1,11 @@
1
1
  import type { Prisma, PrismaClient, Run, RunTrigger, Task } from "#prisma";
2
2
  import type { Executor } from "../providers/executor/types.js";
3
+ import { type CodingProvider } from "../coding/provider.js";
4
+ import { type DeclaredService } from "../coding/services/declaration.js";
5
+ import { type ServiceResolution } from "../coding/services/resolve.js";
3
6
  import { type AttributionIntent } from "./attribution.js";
4
7
  import { type BudgetConstraint } from "./budget-groups.js";
8
+ import { type KnowledgeNoteInput } from "../knowledge/note.js";
5
9
  import { type SelfDefectSink } from "./self-defects.js";
6
10
  export type DispatchDb = Pick<PrismaClient, "agent" | "run" | "runHostCheck" | "codingRun" | "task" | "webhook" | "budgetGroup" | "$transaction" | "$queryRaw">;
7
11
  export type DispatchTx = Pick<Prisma.TransactionClient, "agent" | "run" | "runHostCheck" | "runHostStatus" | "runIssueStatus" | "codingRun" | "codingService" | "task" | "webhook" | "budgetGroup" | "resourceGrant" | "workItem" | "localPullRequest" | "runAttribution" | "$queryRaw" | "$executeRawUnsafe">;
@@ -28,6 +32,17 @@ export interface DispatchRunOptions {
28
32
  * exclusive with `codingBaseRef`. Coding agents only.
29
33
  */
30
34
  continuesCodingRunId?: string;
35
+ /**
36
+ * The step in the delegating agent's declared merge order for this coding
37
+ * run (1 = merge first; equal numbers mean no order between them). Integer
38
+ * 1-99, validated by the caller (the delegate_to_* tool's mergeOrder
39
+ * argument); throws `Error("invalid_merge_order")` otherwise. Coding agents
40
+ * only; ignored for a native agent (no CodingRun to store it on). A
41
+ * continuation (`continuesCodingRunId`) that omits this inherits the pull
42
+ * request's effective value: the newest non-null `mergeOrder` among the
43
+ * root coding run and its continuations.
44
+ */
45
+ mergeOrder?: number;
31
46
  now?: Date;
32
47
  lockAgent?: boolean;
33
48
  task?: {
@@ -52,6 +67,12 @@ export interface DispatchRunOptions {
52
67
  triggeredById?: string | null;
53
68
  /** Sub-agent dispatch (see AgentSubAgent): links this run into a run tree. */
54
69
  parentRunId?: string;
70
+ /**
71
+ * The parent's delegation call (the model's tool-call id) that dispatches this sub-agent run.
72
+ * Unique per parent, so a re-executed delegate step finds the child its call created
73
+ * (findDelegationChild) instead of starting a second one.
74
+ */
75
+ parentCallId?: string;
55
76
  /**
56
77
  * Cost attribution for a run that starts a new attribution (issue event,
57
78
  * linked PR, explicit key), resolved before the call (attribution.ts
@@ -137,6 +158,19 @@ export declare function markRunFailedFromExecutorError(db: Pick<DispatchDb, "run
137
158
  * `run_tree_exhausted`, then a sentence for people.
138
159
  */
139
160
  export declare function budgetExhaustedError(constraint: BudgetConstraint): string;
161
+ /**
162
+ * Serializes grouped coding dispatches (security review I1). Under
163
+ * Serializable, a row lock taken after the transaction's first read cannot
164
+ * queue anything: the snapshot is already fixed, so each waiter wakes up
165
+ * with a stale view and aborts. LOCK TABLE is the one statement that takes
166
+ * no snapshot, so as the transaction's first statement it makes a waiter's
167
+ * snapshot start only after the previous holder committed. SHARE ROW
168
+ * EXCLUSIVE conflicts with itself and with writes to BudgetGroup rows, but not
169
+ * with the ROW SHARE that foreign-key checks from Agent take, so attaching
170
+ * agents to groups is not blocked. It serializes grouped coding dispatches
171
+ * across all groups; each holds it only for one short transaction.
172
+ */
173
+ export declare const GROUP_DISPATCH_LOCK_SQL = "LOCK TABLE \"BudgetGroup\" IN SHARE ROW EXCLUSIVE MODE";
140
174
  /**
141
175
  * Attempts for the persist transaction, and the jittered backoff between
142
176
  * them, for serialization failures, deadlocks and transactions that could
@@ -178,6 +212,25 @@ export type ContinuationCheck = {
178
212
  * run at all" (a user-facing refusal message, not a dispatch).
179
213
  */
180
214
  export declare function checkContinuation(reader: Pick<DispatchTx, "codingRun">, runId: string, repository: string, dispatchingOwnerId?: string | null): Promise<ContinuationCheck>;
215
+ /** What dispatch learned about a coding run's .wardby/services.yaml before its transaction. */
216
+ export type DeclarationOutcome = {
217
+ kind: "none";
218
+ } | {
219
+ kind: "declared";
220
+ services: DeclaredService[];
221
+ } | {
222
+ kind: "refused";
223
+ refusal: string;
224
+ };
225
+ /** The bundle index at a known base ref; also how a deferred coding run reads it when it starts. */
226
+ export declare function readKnowledgeIndexAt(executor: Executor, repository: string, baseRef: string): Promise<KnowledgeNoteInput | undefined>;
227
+ /** The declaration at a known base ref, parsed; also how a deferred coding run reads it when it starts. */
228
+ export declare function readServiceDeclarationAt(executor: Executor, repository: string, baseRef: string): Promise<DeclarationOutcome>;
229
+ /**
230
+ * Inside the transaction: the run's services, or the refusal that stops it. Takes only the
231
+ * catalog, so a deferred coding run's start resolves them the same way with a plain client.
232
+ */
233
+ export declare function resolveDispatchServices(tx: Pick<Prisma.TransactionClient, "codingService">, outcome: DeclarationOutcome, allowed: unknown, executor: Executor, provider: CodingProvider, request: string, instructions: string | null): Promise<ServiceResolution>;
181
234
  /**
182
235
  * Persists every detached run input in one transaction, then invokes the
183
236
  * executor only after commit. A null result means the caller's transactional
@@ -1,5 +1,6 @@
1
1
  import { CODING_PROTOCOL_VERSION, CodingTaskInputSchema, normalizeGitHubRepository, normalizeGitRef, publicCodingRunResult, composeCodingTask, } from "../coding/protocol.js";
2
2
  import { assertCodingProvider, assertCodingProviderModel } from "../coding/provider.js";
3
+ import { isPackageAuditActive } from "../coding/registry/audit-mode.js";
3
4
  import { ModelUnavailableError, entryOf } from "../providers/llm/catalog-types.js";
4
5
  import { parseAllowedServiceNames, workerServices } from "../coding/services/catalog.js";
5
6
  import { MAX_SERVICE_DECLARATION_BYTES, ServiceDeclarationError, parseServiceDeclaration, } from "../coding/services/declaration.js";
@@ -7,8 +8,8 @@ import { servicesInstructionNote } from "../coding/services/note.js";
7
8
  import { resolveRunServices } from "../coding/services/resolve.js";
8
9
  import { DECLARATION_UNAVAILABLE_SENTENCE, LAUNCHER_UNSUPPORTED_SENTENCE, invalidDeclarationSentence, serviceRefusal, } from "../coding/services/wording.js";
9
10
  import { attributeRun } from "./attribution.js";
10
- import { effectiveBudgetForRun, MIN_RESERVATION_USD } from "./budget-groups.js";
11
- import { DEFAULT_KNOWLEDGE_BUNDLE_PATH } from "../knowledge/concept.js";
11
+ import { effectiveBudgetForRun, MIN_RESERVATION_USD, } from "./budget-groups.js";
12
+ import { KNOWLEDGE_CONFIG_MAX_BYTES, KNOWLEDGE_CONFIG_PATH, resolveKnowledgeLocation } from "../knowledge/location.js";
12
13
  import { KNOWLEDGE_INDEX_READ_MAX_BYTES, knowledgeSection } from "../knowledge/note.js";
13
14
  import { logger } from "./logger.js";
14
15
  import { CodingModelProviderMismatchError, resolveCodingEntry } from "./run-pricing.js";
@@ -107,21 +108,45 @@ export function budgetExhaustedError(constraint) {
107
108
  * agents to groups is not blocked. It serializes grouped coding dispatches
108
109
  * across all groups; each holds it only for one short transaction.
109
110
  */
110
- const GROUP_DISPATCH_LOCK_SQL = 'LOCK TABLE "BudgetGroup" IN SHARE ROW EXCLUSIVE MODE';
111
+ export const GROUP_DISPATCH_LOCK_SQL = 'LOCK TABLE "BudgetGroup" IN SHARE ROW EXCLUSIVE MODE';
112
+ /** Rounded down to CodingRun's 6 decimal places. */
113
+ function floorToMicroUsd(usd) {
114
+ return Math.floor(usd / MIN_RESERVATION_USD) * MIN_RESERVATION_USD;
115
+ }
111
116
  /**
112
- * A coding run's budget reservation: the requested ceiling (override or the
117
+ * A coding run's budget reservation: the requested base (override or the
113
118
  * agent's budgetUsd) tightened by its budget group and run tree, where every
114
- * live in-flight run's unspent hold already counts as spent. Rounded down to
115
- * CodingRun.budgetReservedUsd's 6 decimal places; less than that is refused.
119
+ * live in-flight run's unspent hold already counts as spent. Only the base is
120
+ * reserved (CodingRun.budgetReservedUsd, and budgetBaseUsd beside it). The
121
+ * agent's allowedOverrunPercent raises the requested base to the run's limit
122
+ * (CodingRun.budgetLimitUsd), which is never reserved: the run may spend past
123
+ * its base only through top-ups its group and run tree have room for when it
124
+ * needs them (budget-topup.ts). Rounded down to 6 decimal places; a base less
125
+ * than that is refused.
116
126
  */
117
127
  async function reserveCodingBudget(tx, agent, now, options) {
128
+ const overrunPercent = agent.allowedOverrunPercent;
118
129
  const effective = await effectiveBudgetForRun(tx, agent, now, options.parentRunId);
119
130
  const requested = options.budgetUsdOverride ?? Number(agent.budgetUsd);
120
- const budgetUsd = Math.floor(Math.min(requested, effective.effectiveBudgetUsd) / MIN_RESERVATION_USD) * MIN_RESERVATION_USD;
121
- if (budgetUsd < MIN_RESERVATION_USD && effective.exhaustedBy) {
122
- return { budgetUsd: 0, refusal: budgetExhaustedError(effective.exhaustedBy) };
131
+ const baseBudgetUsd = floorToMicroUsd(Math.min(requested, effective.effectiveBudgetUsd));
132
+ if (baseBudgetUsd < MIN_RESERVATION_USD && effective.exhaustedBy) {
133
+ return {
134
+ budgetUsd: 0,
135
+ baseBudgetUsd: 0,
136
+ limitUsd: null,
137
+ refusal: budgetExhaustedError(effective.exhaustedBy),
138
+ ...(effective.exhaustedDetail
139
+ ? { refusalDetail: { limit: effective.exhaustedBy, detail: effective.exhaustedDetail } }
140
+ : {}),
141
+ };
123
142
  }
124
- return { budgetUsd };
143
+ const limitUsd = overrunPercent > 0 ? floorToMicroUsd((requested * (100 + overrunPercent)) / 100) : null;
144
+ return {
145
+ budgetUsd: baseBudgetUsd,
146
+ baseBudgetUsd,
147
+ limitUsd: limitUsd !== null && limitUsd > baseBudgetUsd ? limitUsd : null,
148
+ ...(effective.limitedBy ? { limitedBy: effective.limitedBy } : {}),
149
+ };
125
150
  }
126
151
  /**
127
152
  * Attempts for the persist transaction, and the jittered backoff between
@@ -227,8 +252,37 @@ ownerId) {
227
252
  headRef: root.headRef,
228
253
  continuationOf: { runId: root.runId },
229
254
  rootCodingRunId: root.runId,
255
+ mergeOrder: await effectiveMergeOrder(reader, root.runId),
230
256
  };
231
257
  }
258
+ /**
259
+ * The pull request's current merge step: the newest non-null mergeOrder
260
+ * (by run start) among the root coding run and every continuation of it
261
+ * (CodingRun.rootCodingRunId, indexed), or null when none set one. A
262
+ * continuation that omits mergeOrder inherits this, so an earlier
263
+ * continuation's override is kept rather than reverting to the root's.
264
+ */
265
+ async function effectiveMergeOrder(reader, rootRunId) {
266
+ const newest = await reader.codingRun.findFirst({
267
+ where: { OR: [{ runId: rootRunId }, { rootCodingRunId: rootRunId }], mergeOrder: { not: null } },
268
+ orderBy: [{ run: { startedAt: "desc" } }, { runId: "desc" }],
269
+ select: { mergeOrder: true },
270
+ });
271
+ return newest?.mergeOrder ?? null;
272
+ }
273
+ /**
274
+ * Resolves the CodingRun's mergeOrder: the caller's own value if given (an
275
+ * integer 1-99; anything else throws), else the inherited effective value
276
+ * (undefined for a fresh branch), else null (no order).
277
+ */
278
+ function resolveMergeOrder(options, inherited) {
279
+ if (options.mergeOrder === undefined)
280
+ return inherited ?? null;
281
+ if (!Number.isInteger(options.mergeOrder) || options.mergeOrder < 1 || options.mergeOrder > 99) {
282
+ throw new Error("invalid_merge_order");
283
+ }
284
+ return options.mergeOrder;
285
+ }
232
286
  /** Read failures that are the file's fault rather than the host's: reported as an invalid declaration. */
233
287
  const UNREADABLE_DECLARATION = {
234
288
  github_file_too_large: `it is larger than ${MAX_SERVICE_DECLARATION_BYTES} bytes`,
@@ -240,30 +294,49 @@ const UNREADABLE_DECLARATION = {
240
294
  };
241
295
  /**
242
296
  * The knowledge note's input (docs/knowledge.md): the repository's bundle
243
- * index at the run's base, read before the transaction like the services
297
+ * index at the run's base (in the folder .wardby/knowledge.yaml names, else
298
+ * docs/knowledge/), read before the transaction like the services
244
299
  * declaration. Any failure means no note, never a failed dispatch.
245
300
  */
246
301
  async function readKnowledgeIndex(options, profile, resolvedBranch, ownerId) {
247
- const executor = options.executor;
248
- if (!executor.readCodingRepositoryFile)
302
+ if (!options.executor.readCodingRepositoryFile)
249
303
  return undefined;
304
+ let baseRef;
250
305
  try {
251
306
  // Resolved here, inside the try: a branch problem is the transaction's to report, not the note's.
252
- const branch = resolvedBranch ?? (await resolveCodingBranch(options.db, options, profile, ownerId));
253
- const indexText = await executor.readCodingRepositoryFile({
254
- repository: profile.repository,
255
- baseRef: normalizeGitRef(branch.baseRef),
256
- path: `${DEFAULT_KNOWLEDGE_BUNDLE_PATH}/index.md`,
307
+ baseRef = (resolvedBranch ?? (await resolveCodingBranch(options.db, options, profile, ownerId))).baseRef;
308
+ }
309
+ catch (err) {
310
+ dispatchLog.warn({ err, repository: profile.repository }, "knowledge index read failed; dispatching without it");
311
+ return undefined;
312
+ }
313
+ return readKnowledgeIndexAt(options.executor, profile.repository, baseRef);
314
+ }
315
+ /** The bundle index at a known base ref; also how a deferred coding run reads it when it starts. */
316
+ export async function readKnowledgeIndexAt(executor, repository, baseRef) {
317
+ const readFile = executor.readCodingRepositoryFile?.bind(executor);
318
+ if (!readFile)
319
+ return undefined;
320
+ const ref = normalizeGitRef(baseRef);
321
+ // The repository may name its bundle folder in .wardby/knowledge.yaml; anything wrong with that file falls back to the default.
322
+ const { bundlePath, warning } = await resolveKnowledgeLocation(() => readFile({ repository, baseRef: ref, path: KNOWLEDGE_CONFIG_PATH, maxBytes: KNOWLEDGE_CONFIG_MAX_BYTES }));
323
+ if (warning)
324
+ dispatchLog.warn({ repository, baseRef: ref }, warning);
325
+ try {
326
+ const indexText = await readFile({
327
+ repository,
328
+ baseRef: ref,
329
+ path: `${bundlePath}/index.md`,
257
330
  maxBytes: KNOWLEDGE_INDEX_READ_MAX_BYTES,
258
331
  });
259
- return indexText ? { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH, indexText } : undefined;
332
+ return indexText ? { bundlePath, indexText } : undefined;
260
333
  }
261
334
  catch (err) {
262
335
  if (err instanceof Error && err.message in UNREADABLE_DECLARATION) {
263
- dispatchLog.info({ repository: profile.repository, reason: err.message }, "knowledge index unreadable; dispatching without it");
336
+ dispatchLog.info({ repository, reason: err.message }, "knowledge index unreadable; dispatching without it");
264
337
  return undefined;
265
338
  }
266
- dispatchLog.warn({ err, repository: profile.repository }, "knowledge index read failed; dispatching without it");
339
+ dispatchLog.warn({ err, repository }, "knowledge index read failed; dispatching without it");
267
340
  return undefined;
268
341
  }
269
342
  }
@@ -275,56 +348,54 @@ async function readKnowledgeIndex(options, profile, resolvedBranch, ownerId) {
275
348
  */
276
349
  async function readServiceDeclaration(options, profile, ownerId) {
277
350
  const branch = await resolveCodingBranch(options.db, options, profile, ownerId);
278
- const read = { repository: profile.repository, profileBaseRef: profile.baseRef, branch };
279
- const executor = options.executor;
351
+ return {
352
+ repository: profile.repository,
353
+ profileBaseRef: profile.baseRef,
354
+ branch,
355
+ outcome: await readServiceDeclarationAt(options.executor, profile.repository, branch.baseRef),
356
+ };
357
+ }
358
+ /** The declaration at a known base ref, parsed; also how a deferred coding run reads it when it starts. */
359
+ export async function readServiceDeclarationAt(executor, repository, baseRef) {
280
360
  if (!executor.readCodingServiceDeclaration)
281
- return { ...read, outcome: { kind: "none" } };
361
+ return { kind: "none" };
282
362
  let text;
283
363
  try {
284
- text = await executor.readCodingServiceDeclaration({
285
- repository: profile.repository,
286
- baseRef: normalizeGitRef(branch.baseRef),
287
- });
364
+ text = await executor.readCodingServiceDeclaration({ repository, baseRef: normalizeGitRef(baseRef) });
288
365
  }
289
366
  catch (err) {
290
367
  const reason = UNREADABLE_DECLARATION[err instanceof Error ? err.message : ""];
291
368
  if (reason) {
292
369
  return {
293
- ...read,
294
- outcome: {
295
- kind: "refused",
296
- refusal: serviceRefusal("service_declaration_invalid", invalidDeclarationSentence(reason)),
297
- },
370
+ kind: "refused",
371
+ refusal: serviceRefusal("service_declaration_invalid", invalidDeclarationSentence(reason)),
298
372
  };
299
373
  }
300
- dispatchLog.warn({ err, agentId: options.agentId }, "could not read the repository's service declaration");
374
+ dispatchLog.warn({ err, repository }, "could not read the repository's service declaration");
301
375
  return {
302
- ...read,
303
- outcome: {
304
- kind: "refused",
305
- refusal: serviceRefusal("service_declaration_unavailable", DECLARATION_UNAVAILABLE_SENTENCE),
306
- },
376
+ kind: "refused",
377
+ refusal: serviceRefusal("service_declaration_unavailable", DECLARATION_UNAVAILABLE_SENTENCE),
307
378
  };
308
379
  }
309
380
  if (text === null)
310
- return { ...read, outcome: { kind: "none" } };
381
+ return { kind: "none" };
311
382
  try {
312
- return { ...read, outcome: { kind: "declared", services: parseServiceDeclaration(text) } };
383
+ return { kind: "declared", services: parseServiceDeclaration(text) };
313
384
  }
314
385
  catch (err) {
315
386
  if (!(err instanceof ServiceDeclarationError))
316
387
  throw err;
317
388
  return {
318
- ...read,
319
- outcome: {
320
- kind: "refused",
321
- refusal: serviceRefusal("service_declaration_invalid", invalidDeclarationSentence(err.reason)),
322
- },
389
+ kind: "refused",
390
+ refusal: serviceRefusal("service_declaration_invalid", invalidDeclarationSentence(err.reason)),
323
391
  };
324
392
  }
325
393
  }
326
- /** Inside the transaction: the run's services, or the refusal that stops it. */
327
- async function resolveDispatchServices(tx, outcome, allowed, executor, provider, request, instructions) {
394
+ /**
395
+ * Inside the transaction: the run's services, or the refusal that stops it. Takes only the
396
+ * catalog, so a deferred coding run's start resolves them the same way with a plain client.
397
+ */
398
+ export async function resolveDispatchServices(tx, outcome, allowed, executor, provider, request, instructions) {
328
399
  if (outcome.kind === "refused")
329
400
  return { refusal: outcome.refusal };
330
401
  if (outcome.kind === "none" || outcome.services.length === 0)
@@ -356,15 +427,19 @@ export async function dispatchRun(options) {
356
427
  },
357
428
  });
358
429
  const lockGroups = preview?.kind === "coding" && preview.budgetGroupId != null;
430
+ // The native gateway's executor has no coding configuration: the run is recorded
431
+ // unresolved and the process that starts it reads and resolves (resolveDeferredCodingRun).
432
+ const deferCoding = options.executor.defersCodingResolution === true;
359
433
  // Only an agent allowed some service reads the repository's declaration; any
360
434
  // other coding agent never calls the host for it and gets no services.
361
- const declarationRead = preview?.kind === "coding" &&
435
+ const declarationRead = !deferCoding &&
436
+ preview?.kind === "coding" &&
362
437
  preview.codingProfile &&
363
438
  parseAllowedServiceNames(preview.codingProfile.services).length > 0
364
439
  ? await readServiceDeclaration(options, preview.codingProfile, preview.ownerId ?? null)
365
440
  : undefined;
366
441
  // The knowledge note's input: the repository's bundle index at the run's base (a network call).
367
- const knowledgeIndex = preview?.kind === "coding" && preview.codingProfile && options.executor.readCodingRepositoryFile
442
+ const knowledgeIndex = !deferCoding && preview?.kind === "coding" && preview.codingProfile && options.executor.readCodingRepositoryFile
368
443
  ? await readKnowledgeIndex(options, preview.codingProfile, declarationRead?.branch, preview.ownerId ?? null)
369
444
  : undefined;
370
445
  const persistOnce = () => options.db.$transaction(async (tx) => {
@@ -439,7 +514,10 @@ export async function dispatchRun(options) {
439
514
  agentId: agent.id,
440
515
  trigger: options.trigger ?? "manual",
441
516
  executionManaged: true,
517
+ // Fixed for the run's life: the executor routes on this, never on the agent's current setting.
518
+ nativeExecutionMode: agent.kind === "native" ? agent.nativeExecutionMode : null,
442
519
  parentRunId: options.parentRunId,
520
+ parentCallId: options.parentCallId,
443
521
  grantedParentMemoryKeys: options.grantedParentMemoryKeys ?? [],
444
522
  taskOverride: options.taskOverride,
445
523
  triggeredById: options.triggeredById ?? null,
@@ -459,6 +537,13 @@ export async function dispatchRun(options) {
459
537
  : {}),
460
538
  },
461
539
  });
540
+ if (refusal && codingBudget?.refusalDetail && refusal === codingBudget.refusal) {
541
+ const { limit, detail } = codingBudget.refusalDetail;
542
+ // Group and lead names are filled at read time.
543
+ await tx.runBudgetEvent.create({
544
+ data: { runId: run.id, kind: "refused", limit, details: { source: "dispatch", ...detail } },
545
+ });
546
+ }
462
547
  if (options.afterPersist)
463
548
  await options.afterPersist(tx, run);
464
549
  const attributed = await attributeRun(tx, run.id, {
@@ -473,13 +558,19 @@ export async function dispatchRun(options) {
473
558
  if (!request)
474
559
  throw new Error(`Coding agent "${agent.id}" requires a task.`);
475
560
  // The worker sees only the task text, so the agent's own instructions, and the
476
- // services note, ride in it.
477
- const task = composeCodingTask(agent.systemPrompt, request, servicesInstructionNote(services), knowledgeIndex ? knowledgeSection(knowledgeIndex) : undefined);
561
+ // services note, ride in it. Deferred, the task is stored raw and composed when the
562
+ // run starts; composing here only checks its size, so it throws exactly as today.
563
+ if (deferCoding)
564
+ composeCodingTask(agent.systemPrompt, request);
565
+ const task = deferCoding
566
+ ? request
567
+ : composeCodingTask(agent.systemPrompt, request, servicesInstructionNote(services), knowledgeIndex ? knowledgeSection(knowledgeIndex) : undefined);
478
568
  const budgetUsd = codingBudget.budgetUsd;
479
569
  // Resolved once: before the transaction when the declaration was read from it.
480
570
  const branch = declarationRead?.branch ?? (await resolveCodingBranch(tx, options, agent.codingProfile, agent.ownerId));
481
- const { baseRef, continuationOf, rootCodingRunId } = branch;
571
+ const { baseRef, continuationOf, rootCodingRunId, mergeOrder: inheritedMergeOrder } = branch;
482
572
  const headRef = branch.headRef ?? `wardby/run-${run.id}`;
573
+ const mergeOrder = resolveMergeOrder(options, inheritedMergeOrder);
483
574
  const input = CodingTaskInputSchema.parse({
484
575
  schemaVersion: CODING_PROTOCOL_VERSION,
485
576
  runId: run.id,
@@ -499,16 +590,22 @@ export async function dispatchRun(options) {
499
590
  toolchainVersion: agent.codingProfile.toolchainVersion,
500
591
  workerImageRef: agent.codingProfile.workerImageRef,
501
592
  };
502
- const workerImage = options.executor.resolveCodingWorkerImage?.(imageSelector);
593
+ // Deferred, both stay null until the starting process resolves them.
594
+ const workerImage = deferCoding ? null : options.executor.resolveCodingWorkerImage?.(imageSelector);
503
595
  // Claude Code's commands run in its tool runner, so the toolchain picks that image too; fixed
504
596
  // here with the worker image so the run keeps both however the deployment changes later.
505
- const toolImage = options.executor.resolveCodingToolImage?.(imageSelector) ?? null;
597
+ const toolImage = deferCoding ? null : (options.executor.resolveCodingToolImage?.(imageSelector) ?? null);
598
+ const traced = agent.codingProfile.debugTraceUntil != null &&
599
+ now.getTime() < agent.codingProfile.debugTraceUntil.getTime();
600
+ const { packageAuditMode, packageAuditUntil } = agent.codingProfile;
506
601
  await tx.codingRun.create({
507
602
  data: {
508
603
  runId: run.id,
604
+ budgetLimitedBy: codingBudget.limitedBy ?? null,
509
605
  issueProvider: attributed?.provider ?? null,
510
606
  issueKey: attributed?.key ?? null,
511
607
  task: input.task,
608
+ request,
512
609
  repository: input.repository,
513
610
  baseRef: input.baseRef,
514
611
  headRef: input.headRef,
@@ -522,12 +619,25 @@ export async function dispatchRun(options) {
522
619
  workerImage,
523
620
  toolImage,
524
621
  budgetReservedUsd: budgetUsd,
622
+ budgetBaseUsd: codingBudget.baseBudgetUsd,
623
+ budgetLimitUsd: codingBudget.limitUsd,
525
624
  rootCodingRunId,
625
+ mergeOrder,
526
626
  workspaceDiskMb: agent.codingProfile.workspaceDiskMb,
527
627
  maxTurns: agent.codingProfile.maxTurns,
628
+ maxOutputTokens: agent.codingProfile.maxOutputTokens,
629
+ repoSkills: agent.codingProfile.repoSkills,
630
+ claudeBareMode: agent.codingProfile.claudeBareMode,
631
+ dependencyCache: agent.codingProfile.dependencyCache,
632
+ sessionResume: agent.codingProfile.sessionResume,
528
633
  // Fixed here so a run's tracing never changes mid-run.
529
- debugTrace: agent.codingProfile.debugTraceUntil != null &&
530
- now.getTime() < agent.codingProfile.debugTraceUntil.getTime(),
634
+ debugTrace: traced,
635
+ debugTraceMaxMb: traced ? agent.codingProfile.debugTraceMaxMb : null,
636
+ // Fixed here too: a run keeps the mode its dispatch saw for its
637
+ // whole life, however the window moves afterwards.
638
+ packageAuditMode: isPackageAuditActive(packageAuditMode, packageAuditUntil, now)
639
+ ? packageAuditMode
640
+ : null,
531
641
  services,
532
642
  },
533
643
  });
@@ -6,7 +6,7 @@
6
6
  * lives behind a seam (a future LangGraph engine swaps in here) and why
7
7
  * the budget guardrail must stay above whichever engine is running.
8
8
  */
9
- import { runStepInline } from "../providers/engine/types.js";
9
+ import { RunOwnershipLostError, runStepInline } from "../providers/engine/types.js";
10
10
  import { applyPreflightSafetyMargin, checkTokenCalibration, estimateInputCost, isOverBudget } from "./budget.js";
11
11
  import { logger } from "./logger.js";
12
12
  import { UNTRUSTED_CONTEXT_TAG, UNTRUSTED_TOOL_OUTPUT_TAG, wrapUntrusted } from "./untrusted-content.js";
@@ -178,7 +178,7 @@ export class NativeEngine {
178
178
  * once all have settled, the first rejection by call order is rethrown.
179
179
  */
180
180
  async runToolCalls(ctx, step, turn, toolCalls) {
181
- const runCall = (index) => step(`turn:${turn}:tool:${index}`, () => ctx.runSandboxTool(toolCalls[index].name, toolCalls[index].argsJson));
181
+ const runCall = (index) => step(`turn:${turn}:tool:${index}`, () => ctx.runSandboxTool(toolCalls[index].name, toolCalls[index].argsJson, toolCalls[index].id));
182
182
  const concurrent = ctx.runsConcurrently;
183
183
  const results = new Array(toolCalls.length);
184
184
  let index = 0;
@@ -197,11 +197,15 @@ export class NativeEngine {
197
197
  engineLog.info({ turn, toolCallIds: batch.map((i) => toolCalls[i].id) }, "running tool calls concurrently");
198
198
  const settled = await Promise.allSettled(batch.map((i) => runCall(i)));
199
199
  const rejections = settled.filter((outcome) => outcome.status === "rejected");
200
- for (const extra of rejections.slice(1)) {
201
- engineLog.warn({ turn, err: extra.reason }, "concurrent tool call also failed");
200
+ // An ownership loss wins over an ordinary failure: this attempt no longer owns the run, so it
201
+ // must stop without a terminal write rather than fail the run for the attempt that does.
202
+ const thrown = rejections.find((r) => r.reason instanceof RunOwnershipLostError) ?? rejections[0];
203
+ for (const extra of rejections) {
204
+ if (extra !== thrown)
205
+ engineLog.warn({ turn, err: extra.reason }, "concurrent tool call also failed");
202
206
  }
203
- if (rejections.length > 0)
204
- throw rejections[0].reason;
207
+ if (thrown)
208
+ throw thrown.reason;
205
209
  settled.forEach((outcome, position) => {
206
210
  results[batch[position]] = outcome.value;
207
211
  });
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The code a wardby error message leads with (`some_code` or `some_code: detail`), or undefined.
3
+ * Worker-safe: the native sandbox worker image ships this module.
4
+ */
5
+ export declare function errorCodeOf(message: string | null | undefined): string | undefined;
6
+ /** The code an unexpected error's message leads with, if it is code-shaped (has an underscore) and short enough. */
7
+ export declare function causeCodeOf(err: unknown): string | undefined;
8
+ /**
9
+ * The only codes that may be shown from an arbitrary error's text (to a worker, or to the model in a
10
+ * tool result): wardby's own codes that an unexpected error on those paths can lead with. Anything
11
+ * else, however code-shaped, could be a value from an error's text, so it never crosses.
12
+ * - coding_execution_not_configured, coding_profile_missing: a coding delegation reaching a process
13
+ * that cannot start coding runs (core/deferred-coding.ts, providers/executor/routing.ts).
14
+ * - message_too_large, message_not_json, message_invalid, unsupported_protocol_version: the native
15
+ * worker protocol's own ProtocolError codes (native-worker/protocol.ts).
16
+ * - invalid_merge_order: dispatchRun's refusal of a bad mergeOrder (core/dispatch.ts).
17
+ * - coding_worker_image_invalid: a coding worker image that is not pinned by digest
18
+ * (providers/executor/container.ts).
19
+ * - native_sandbox_unavailable: createRun/the router refusing a sandbox-mode agent with no sandbox executor
20
+ * (core/runner.ts).
21
+ * - run_tree_exhausted: dispatchRun refusing a run whose tree budget is spent (core/dispatch.ts).
22
+ * - secret_in_value, secret_check_unavailable: the datastore and memory write guard refusing a value
23
+ * that holds an attached secret's value (core/secret-guard.ts); the code carries only the name of
24
+ * the secret, never its value, across the gateway.
25
+ */
26
+ export declare const GATEWAY_CAUSE_CODES: ReadonlySet<string>;
27
+ /**
28
+ * The codes wardby itself writes as a failed coding or native child run's Run.error (read from the
29
+ * literals in core/dispatch.ts, core/coding-queue.ts, providers/executor/*, core/run-pricing.ts,
30
+ * providers/llm/catalog-types.ts and the native sandbox). A parent may be told which of these a
31
+ * child failed with; any other leading word is not shown. Includes GATEWAY_CAUSE_CODES, and the
32
+ * container executor's terminal codes: `coding_failure_<category>` for every category
33
+ * failureCategory files a failure under (providers/executor/container.ts), and
34
+ * `coding_provider_<class>` for every provider failure class (core/provider-wording.ts).
35
+ */
36
+ export declare const CHILD_RUN_FAILURE_CODES: ReadonlySet<string>;
37
+ /** The leading code of an arbitrary error or message, only when it is declared in `allowed`. */
38
+ export declare function declaredCodeOf(err: unknown, allowed?: ReadonlySet<string>): string | undefined;