@wardby/cli 0.6.0 → 0.8.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 (740) hide show
  1. package/.env.example +5 -5
  2. package/README.md +6 -1
  3. package/deploy/local/docker-compose.quickstart-coding.yml +19 -0
  4. package/dist/claude-coding-worker/driver.d.ts +33 -3
  5. package/dist/claude-coding-worker/driver.js +151 -21
  6. package/dist/claude-coding-worker/main.js +38 -6
  7. package/dist/claude-coding-worker/sdk.js +29 -2
  8. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  9. package/dist/claude-coding-worker/tool-socket.js +111 -0
  10. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  11. package/dist/claude-coding-worker/transcript.js +77 -0
  12. package/dist/claude-plugin/command.d.ts +61 -0
  13. package/dist/claude-plugin/command.js +376 -0
  14. package/dist/cli-help.d.ts +1 -1
  15. package/dist/cli-help.js +3 -1
  16. package/dist/cli.js +71 -13
  17. package/dist/coding/code-host.d.ts +16 -0
  18. package/dist/coding/code-host.js +60 -0
  19. package/dist/coding/continuation-wording.d.ts +35 -0
  20. package/dist/coding/continuation-wording.js +73 -0
  21. package/dist/coding/linked-issue-note.d.ts +23 -0
  22. package/dist/coding/linked-issue-note.js +47 -0
  23. package/dist/coding/mcp-token.d.ts +12 -0
  24. package/dist/coding/mcp-token.js +26 -0
  25. package/dist/coding/merge-wording.d.ts +28 -0
  26. package/dist/coding/merge-wording.js +78 -0
  27. package/dist/coding/pr-description-note.d.ts +9 -0
  28. package/dist/coding/pr-description-note.js +32 -0
  29. package/dist/coding/profile.d.ts +46 -126
  30. package/dist/coding/profile.js +45 -4
  31. package/dist/coding/protected-path-wording.d.ts +8 -0
  32. package/dist/coding/protected-path-wording.js +1 -1
  33. package/dist/coding/protocol.d.ts +264 -346
  34. package/dist/coding/protocol.js +237 -12
  35. package/dist/coding/redact.d.ts +3 -0
  36. package/dist/coding/redact.js +17 -0
  37. package/dist/coding/registry/allowlist.d.ts +12 -0
  38. package/dist/coding/registry/allowlist.js +14 -1
  39. package/dist/coding/registry/audit-mode.d.ts +153 -0
  40. package/dist/coding/registry/audit-mode.js +304 -0
  41. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  42. package/dist/coding/registry/lockfile-shared.js +128 -0
  43. package/dist/coding/registry/lockfiles.js +1 -1
  44. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  45. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  46. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  47. package/dist/coding/registry/npm-lockfile.js +4 -6
  48. package/dist/coding/registry/npm.js +78 -8
  49. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  50. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  51. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  52. package/dist/coding/registry/pypi-plan.js +406 -0
  53. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  54. package/dist/coding/registry/pypi-requirements.js +155 -0
  55. package/dist/coding/registry/pypi.d.ts +3 -27
  56. package/dist/coding/registry/pypi.js +40 -154
  57. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  58. package/dist/coding/registry/refusal-hints.js +61 -0
  59. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  60. package/dist/coding/registry/refusal-wording.js +56 -0
  61. package/dist/coding/registry/report.d.ts +70 -8
  62. package/dist/coding/registry/report.js +112 -5
  63. package/dist/coding/registry/types.d.ts +58 -8
  64. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  65. package/dist/coding/registry/yarn-lockfile.js +367 -0
  66. package/dist/coding/services/catalog.d.ts +37 -351
  67. package/dist/coding/transcript/claude-code.d.ts +13 -0
  68. package/dist/coding/transcript/claude-code.js +273 -0
  69. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  70. package/dist/coding/transcript/download-protocol.js +18 -0
  71. package/dist/coding/transcript/format.d.ts +20 -0
  72. package/dist/coding/transcript/format.js +32 -0
  73. package/dist/coding/transcript/recorder.d.ts +52 -0
  74. package/dist/coding/transcript/recorder.js +225 -0
  75. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  76. package/dist/coding/transcript/resume/checkout.js +203 -0
  77. package/dist/coding/transcript/resume/command.d.ts +17 -0
  78. package/dist/coding/transcript/resume/command.js +176 -0
  79. package/dist/coding/transcript/resume/download.d.ts +20 -0
  80. package/dist/coding/transcript/resume/download.js +153 -0
  81. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  82. package/dist/coding/transcript/resume/launch.js +128 -0
  83. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  84. package/dist/coding/transcript/resume/session-file.js +79 -0
  85. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  86. package/dist/coding/transcript/resume/stand-in.js +49 -0
  87. package/dist/coding-worker/artifact.d.ts +8 -3
  88. package/dist/coding-worker/artifact.js +3 -1
  89. package/dist/coding-worker/debug-trace.d.ts +9 -6
  90. package/dist/coding-worker/debug-trace.js +16 -19
  91. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  92. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  93. package/dist/coding-worker/driver.d.ts +4 -3
  94. package/dist/coding-worker/driver.js +124 -39
  95. package/dist/coding-worker/errors.d.ts +1 -0
  96. package/dist/coding-worker/errors.js +32 -0
  97. package/dist/coding-worker/main.js +5 -1
  98. package/dist/coding-worker/mcp-config.d.ts +27 -0
  99. package/dist/coding-worker/mcp-config.js +32 -0
  100. package/dist/coding-worker/sdk.d.ts +36 -0
  101. package/dist/coding-worker/sdk.js +28 -1
  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 +15 -0
  105. package/dist/config/dependency-cache.d.ts +23 -0
  106. package/dist/config/dependency-cache.js +32 -0
  107. package/dist/config/mcp-call-limit.d.ts +8 -0
  108. package/dist/config/mcp-call-limit.js +18 -0
  109. package/dist/config/mcp-servers.d.ts +8 -0
  110. package/dist/config/mcp-servers.js +12 -0
  111. package/dist/config/providers.d.ts +12 -3
  112. package/dist/config/providers.js +55 -5
  113. package/dist/config/test-simulators.d.ts +92 -0
  114. package/dist/config/test-simulators.js +333 -0
  115. package/dist/config/tool-timeout.d.ts +1 -0
  116. package/dist/config/tool-timeout.js +18 -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-mcp.d.ts +36 -0
  130. package/dist/core/coding-mcp.js +253 -0
  131. package/dist/core/coding-queue.d.ts +2 -1
  132. package/dist/core/coding-queue.js +7 -0
  133. package/dist/core/coding-repository.d.ts +46 -0
  134. package/dist/core/coding-repository.js +92 -0
  135. package/dist/core/cron.d.ts +19 -1
  136. package/dist/core/cron.js +17 -0
  137. package/dist/core/datastores.js +1 -1
  138. package/dist/core/deferred-coding.d.ts +14 -0
  139. package/dist/core/deferred-coding.js +62 -0
  140. package/dist/core/delegation-child.d.ts +25 -0
  141. package/dist/core/delegation-child.js +37 -0
  142. package/dist/core/delegation-slots.d.ts +27 -0
  143. package/dist/core/delegation-slots.js +44 -0
  144. package/dist/core/dispatch.d.ts +48 -2
  145. package/dist/core/dispatch.js +166 -66
  146. package/dist/core/engine-native.js +1 -1
  147. package/dist/core/error-code.d.ts +38 -0
  148. package/dist/core/error-code.js +169 -0
  149. package/dist/core/grants.d.ts +46 -8
  150. package/dist/core/grants.js +99 -8
  151. package/dist/core/host-events.d.ts +18 -2
  152. package/dist/core/host-events.js +291 -27
  153. package/dist/core/host-status.d.ts +85 -3
  154. package/dist/core/host-status.js +300 -22
  155. package/dist/core/issue-bridge.d.ts +50 -6
  156. package/dist/core/issue-bridge.js +124 -33
  157. package/dist/core/issue-events.d.ts +1 -1
  158. package/dist/core/issue-events.js +4 -10
  159. package/dist/core/issue-status.d.ts +1 -1
  160. package/dist/core/issue-status.js +58 -29
  161. package/dist/core/logger.d.ts +5 -0
  162. package/dist/core/logger.js +14 -1
  163. package/dist/core/lost-run-children.d.ts +6 -0
  164. package/dist/core/lost-run-children.js +32 -0
  165. package/dist/core/mark-ready.d.ts +34 -0
  166. package/dist/core/mark-ready.js +152 -0
  167. package/dist/core/markdown-code.d.ts +8 -0
  168. package/dist/core/markdown-code.js +107 -0
  169. package/dist/core/mcp-client/client.d.ts +47 -0
  170. package/dist/core/mcp-client/client.js +141 -0
  171. package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
  172. package/dist/core/mcp-client/jsonrpc.js +54 -0
  173. package/dist/core/mcp-client/results.d.ts +13 -0
  174. package/dist/core/mcp-client/results.js +42 -0
  175. package/dist/core/mcp-servers.d.ts +90 -0
  176. package/dist/core/mcp-servers.js +230 -0
  177. package/dist/core/mcp-tools.d.ts +108 -0
  178. package/dist/core/mcp-tools.js +287 -0
  179. package/dist/core/memory-tools.js +7 -0
  180. package/dist/core/merge-order-check.d.ts +2 -1
  181. package/dist/core/merge-order-check.js +44 -18
  182. package/dist/core/notification-dispatcher.js +2 -1
  183. package/dist/core/notification-templates.d.ts +1 -7
  184. package/dist/core/notification-templates.js +36 -2
  185. package/dist/core/pull-request-state-sync.js +2 -2
  186. package/dist/core/reconciler.d.ts +4 -3
  187. package/dist/core/reconciler.js +8 -1
  188. package/dist/core/related-pull-requests.d.ts +11 -3
  189. package/dist/core/related-pull-requests.js +49 -20
  190. package/dist/core/reply-parts.d.ts +21 -0
  191. package/dist/core/reply-parts.js +73 -0
  192. package/dist/core/review-fix.d.ts +1 -1
  193. package/dist/core/review-fix.js +4 -3
  194. package/dist/core/review-host-checks.d.ts +1 -1
  195. package/dist/core/review-host-tools.d.ts +3 -0
  196. package/dist/core/review-host-tools.js +102 -14
  197. package/dist/core/review-reads.d.ts +55 -0
  198. package/dist/core/review-reads.js +233 -0
  199. package/dist/core/run-status.d.ts +12 -0
  200. package/dist/core/run-status.js +12 -0
  201. package/dist/core/runner.d.ts +145 -49
  202. package/dist/core/runner.js +719 -216
  203. package/dist/core/schedule-start.d.ts +12 -0
  204. package/dist/core/schedule-start.js +14 -0
  205. package/dist/core/secret-broker-config.d.ts +12 -74
  206. package/dist/core/secret-broker-config.js +1 -1
  207. package/dist/core/secret-guard.d.ts +49 -0
  208. package/dist/core/secret-guard.js +119 -0
  209. package/dist/core/secret-guarded-stores.d.ts +12 -0
  210. package/dist/core/secret-guarded-stores.js +41 -0
  211. package/dist/core/secret-spans.d.ts +50 -0
  212. package/dist/core/secret-spans.js +94 -0
  213. package/dist/core/secrets.d.ts +11 -1
  214. package/dist/core/secrets.js +27 -1
  215. package/dist/core/serializable-retry.d.ts +18 -0
  216. package/dist/core/serializable-retry.js +43 -0
  217. package/dist/core/stop-run.d.ts +46 -0
  218. package/dist/core/stop-run.js +61 -0
  219. package/dist/core/tool-admin.d.ts +5 -1
  220. package/dist/core/tool-admin.js +7 -2
  221. package/dist/core/tool-names.d.ts +13 -0
  222. package/dist/core/tool-names.js +20 -0
  223. package/dist/core/webhooks.d.ts +4 -0
  224. package/dist/core/webhooks.js +68 -49
  225. package/dist/core/workflow-events.d.ts +14 -2
  226. package/dist/core/workflow-events.js +4 -0
  227. package/dist/core/workflow-run-events.d.ts +5 -3
  228. package/dist/core/workflow-run-events.js +45 -9
  229. package/dist/core/zod-json-schema.d.ts +4 -0
  230. package/dist/core/zod-json-schema.js +39 -0
  231. package/dist/core/zod3-window.d.ts +35 -0
  232. package/dist/core/zod3-window.js +124 -0
  233. package/dist/generated/prisma/browser.d.ts +65 -3
  234. package/dist/generated/prisma/client.d.ts +65 -3
  235. package/dist/generated/prisma/commonInputTypes.d.ts +266 -106
  236. package/dist/generated/prisma/enums.d.ts +10 -0
  237. package/dist/generated/prisma/enums.js +8 -0
  238. package/dist/generated/prisma/internal/class.d.ts +110 -0
  239. package/dist/generated/prisma/internal/class.js +4 -4
  240. package/dist/generated/prisma/internal/prismaNamespace.d.ts +957 -9
  241. package/dist/generated/prisma/internal/prismaNamespace.js +166 -2
  242. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +174 -0
  243. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +166 -2
  244. package/dist/generated/prisma/models/Agent.d.ts +377 -8
  245. package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
  246. package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
  247. package/dist/generated/prisma/models/AgentRepository.d.ts +81 -1
  248. package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
  249. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +228 -7
  250. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  251. package/dist/generated/prisma/models/CodingProxySession.d.ts +232 -2
  252. package/dist/generated/prisma/models/CodingRun.d.ts +1712 -1
  253. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  254. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  255. package/dist/generated/prisma/models/HostProvider.d.ts +2176 -0
  256. package/dist/generated/prisma/models/HostProvider.js +1 -0
  257. package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
  258. package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
  259. package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
  260. package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
  261. package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
  262. package/dist/generated/prisma/models/HostProviderTrustedAccount.js +1 -0
  263. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  264. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  265. package/dist/generated/prisma/models/McpServer.d.ts +1500 -0
  266. package/dist/generated/prisma/models/McpServer.js +1 -0
  267. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +77 -1
  268. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  269. package/dist/generated/prisma/models/Principal.d.ts +167 -0
  270. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  271. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  272. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  273. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  274. package/dist/generated/prisma/models/ResourceGrant.d.ts +1 -1
  275. package/dist/generated/prisma/models/Run.d.ts +738 -2
  276. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  277. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  278. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  279. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  280. package/dist/generated/prisma/models/Secret.d.ts +387 -0
  281. package/dist/generated/prisma/models/Tool.d.ts +223 -1
  282. package/dist/generated/prisma/models.d.ts +10 -0
  283. package/dist/help/search.js +12 -3
  284. package/dist/help-index.json +2033 -110
  285. package/dist/import/create.js +48 -4
  286. package/dist/import/neutral-schema.d.ts +51 -281
  287. package/dist/import/neutral-schema.js +7 -4
  288. package/dist/knowledge/check.d.ts +1 -1
  289. package/dist/knowledge/cli.d.ts +11 -1
  290. package/dist/knowledge/cli.js +37 -4
  291. package/dist/knowledge/concept.d.ts +3 -19
  292. package/dist/knowledge/location.d.ts +31 -0
  293. package/dist/knowledge/location.js +78 -0
  294. package/dist/mcp/auth/access.d.ts +10 -2
  295. package/dist/mcp/auth/access.js +15 -1
  296. package/dist/mcp/auth/grants-cli.d.ts +6 -4
  297. package/dist/mcp/auth/grants-cli.js +42 -3
  298. package/dist/mcp/auth/ownership.d.ts +7 -7
  299. package/dist/mcp/auth/resource-server.d.ts +3 -1
  300. package/dist/mcp/auth/resource-server.js +17 -2
  301. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  302. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  303. package/dist/mcp/context.d.ts +3 -0
  304. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  305. package/dist/mcp/host-events/github-ingress.js +2 -1
  306. package/dist/mcp/index.d.ts +6 -0
  307. package/dist/mcp/index.js +69 -10
  308. package/dist/mcp/server.d.ts +13 -0
  309. package/dist/mcp/server.js +33 -14
  310. package/dist/mcp/tools/agents.d.ts +4 -0
  311. package/dist/mcp/tools/agents.js +295 -28
  312. package/dist/mcp/tools/datastore.js +17 -8
  313. package/dist/mcp/tools/grants.js +73 -29
  314. package/dist/mcp/tools/host-providers.d.ts +2 -0
  315. package/dist/mcp/tools/host-providers.js +215 -0
  316. package/dist/mcp/tools/mcp-servers.d.ts +26 -0
  317. package/dist/mcp/tools/mcp-servers.js +481 -0
  318. package/dist/mcp/tools/memory.js +11 -1
  319. package/dist/mcp/tools/notification-channels.js +2 -2
  320. package/dist/mcp/tools/packages.d.ts +2 -0
  321. package/dist/mcp/tools/packages.js +195 -0
  322. package/dist/mcp/tools/repositories.js +65 -12
  323. package/dist/mcp/tools/run-access.d.ts +16 -0
  324. package/dist/mcp/tools/run-access.js +25 -0
  325. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  326. package/dist/mcp/tools/run-transcript-download.js +129 -0
  327. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  328. package/dist/mcp/tools/run-transcript.js +70 -0
  329. package/dist/mcp/tools/runs.js +209 -27
  330. package/dist/mcp/tools/scheduling.js +3 -1
  331. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  332. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  333. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  334. package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
  335. package/dist/mcp/tools/secret-elicitation.js +25 -2
  336. package/dist/mcp/tools/secrets.js +40 -6
  337. package/dist/mcp/tools/stop-run.d.ts +2 -0
  338. package/dist/mcp/tools/stop-run.js +82 -0
  339. package/dist/mcp/tools/subagents.js +2 -2
  340. package/dist/mcp/tools/tools.d.ts +7 -5
  341. package/dist/mcp/tools/tools.js +64 -16
  342. package/dist/mcp/tools/trigger.js +28 -6
  343. package/dist/mcp/transport/http-limits.d.ts +2 -0
  344. package/dist/mcp/transport/http-limits.js +6 -2
  345. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  346. package/dist/mcp/transport/stdio-link-host.js +67 -0
  347. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  348. package/dist/mcp/transport/streamable-http.js +41 -1
  349. package/dist/mcp/webhooks/ingress.js +10 -0
  350. package/dist/native-worker/docker-launcher.d.ts +38 -2
  351. package/dist/native-worker/docker-launcher.js +65 -5
  352. package/dist/native-worker/gateway-server.d.ts +55 -3
  353. package/dist/native-worker/gateway-server.js +152 -34
  354. package/dist/native-worker/gateway.d.ts +29 -1
  355. package/dist/native-worker/gateway.js +74 -4
  356. package/dist/native-worker/http-server.d.ts +7 -1
  357. package/dist/native-worker/http-server.js +62 -7
  358. package/dist/native-worker/http-transport.js +1 -1
  359. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  360. package/dist/native-worker/kubernetes-launcher.js +43 -3
  361. package/dist/native-worker/launch.d.ts +18 -1
  362. package/dist/native-worker/launch.js +6 -1
  363. package/dist/native-worker/ledger.d.ts +24 -4
  364. package/dist/native-worker/ledger.js +62 -8
  365. package/dist/native-worker/loopback.js +3 -8
  366. package/dist/native-worker/main.d.ts +2 -1
  367. package/dist/native-worker/main.js +14 -3
  368. package/dist/native-worker/protocol.d.ts +130 -577
  369. package/dist/native-worker/protocol.js +51 -2
  370. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  371. package/dist/native-worker/sandbox-executor.js +78 -4
  372. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  373. package/dist/native-worker/stderr-redaction.js +237 -0
  374. package/dist/native-worker/stdio.d.ts +1 -1
  375. package/dist/native-worker/stdio.js +6 -5
  376. package/dist/native-worker/warm-pool.d.ts +2 -2
  377. package/dist/native-worker/warm-pool.js +4 -4
  378. package/dist/native-worker/worker.js +28 -2
  379. package/dist/observability/metrics.js +6 -1
  380. package/dist/providers/auth/self-hosted.d.ts +1 -1
  381. package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
  382. package/dist/providers/coding-proxy/capability-hash.js +5 -0
  383. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  384. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  385. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  386. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  387. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  388. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  389. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  390. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  391. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  392. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  393. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  394. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  395. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  396. package/dist/providers/coding-proxy/hold.js +86 -0
  397. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  398. package/dist/providers/coding-proxy/interrupted.js +104 -0
  399. package/dist/providers/coding-proxy/mcp-route.d.ts +34 -0
  400. package/dist/providers/coding-proxy/mcp-route.js +166 -0
  401. package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -2
  402. package/dist/providers/coding-proxy/memory-ledger.js +99 -8
  403. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  404. package/dist/providers/coding-proxy/metering.js +27 -4
  405. package/dist/providers/coding-proxy/prisma-ledger.d.ts +16 -2
  406. package/dist/providers/coding-proxy/prisma-ledger.js +209 -69
  407. package/dist/providers/coding-proxy/proxy.d.ts +21 -2
  408. package/dist/providers/coding-proxy/proxy.js +300 -48
  409. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  410. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  411. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  412. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  413. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  414. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  415. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  416. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  417. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  418. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  419. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  420. package/dist/providers/coding-proxy/registry/service.js +579 -112
  421. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  422. package/dist/providers/coding-proxy/registry/store.js +54 -1
  423. package/dist/providers/coding-proxy/runtime.d.ts +10 -0
  424. package/dist/providers/coding-proxy/runtime.js +109 -16
  425. package/dist/providers/coding-proxy/server.d.ts +9 -1
  426. package/dist/providers/coding-proxy/server.js +55 -1
  427. package/dist/providers/coding-proxy/types.d.ts +78 -1
  428. package/dist/providers/datastore/types.d.ts +5 -0
  429. package/dist/providers/engine/types.d.ts +17 -2
  430. package/dist/providers/engine/types.js +17 -0
  431. package/dist/providers/executor/composition.d.ts +10 -3
  432. package/dist/providers/executor/composition.js +52 -7
  433. package/dist/providers/executor/container.d.ts +394 -9
  434. package/dist/providers/executor/container.js +1210 -96
  435. package/dist/providers/executor/dbos-status.d.ts +31 -0
  436. package/dist/providers/executor/dbos-status.js +64 -0
  437. package/dist/providers/executor/dbos.d.ts +50 -1
  438. package/dist/providers/executor/dbos.js +207 -20
  439. package/dist/providers/executor/deferred.d.ts +12 -24
  440. package/dist/providers/executor/deferred.js +10 -29
  441. package/dist/providers/executor/in-process.d.ts +9 -1
  442. package/dist/providers/executor/in-process.js +14 -4
  443. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  444. package/dist/providers/executor/linked-issue-reader.js +30 -0
  445. package/dist/providers/executor/routing.d.ts +2 -0
  446. package/dist/providers/executor/routing.js +4 -0
  447. package/dist/providers/executor/types.d.ts +13 -0
  448. package/dist/providers/host-tools/invoke.d.ts +37 -0
  449. package/dist/providers/host-tools/invoke.js +117 -0
  450. package/dist/providers/host-tools/operations.d.ts +65 -0
  451. package/dist/providers/host-tools/operations.js +149 -0
  452. package/dist/providers/host-tools/registry.d.ts +79 -0
  453. package/dist/providers/host-tools/registry.js +362 -0
  454. package/dist/providers/host-tools/request-guard.d.ts +17 -0
  455. package/dist/providers/host-tools/request-guard.js +99 -0
  456. package/dist/providers/host-tools/self-test.d.ts +64 -0
  457. package/dist/providers/host-tools/self-test.js +142 -0
  458. package/dist/providers/index.d.ts +2 -1
  459. package/dist/providers/issue-tracker/types.d.ts +17 -0
  460. package/dist/providers/issue-tracker/types.js +39 -1
  461. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  462. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  463. package/dist/providers/jobs/docker-isolation.d.ts +10 -2
  464. package/dist/providers/jobs/docker-isolation.js +47 -8
  465. package/dist/providers/jobs/docker.d.ts +9 -0
  466. package/dist/providers/jobs/docker.js +60 -11
  467. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  468. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  469. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  470. package/dist/providers/jobs/kubernetes-api.js +10 -0
  471. package/dist/providers/jobs/kubernetes-client.js +10 -1
  472. package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
  473. package/dist/providers/jobs/kubernetes-isolation.js +32 -3
  474. package/dist/providers/jobs/kubernetes.d.ts +11 -1
  475. package/dist/providers/jobs/kubernetes.js +111 -17
  476. package/dist/providers/jobs/types.d.ts +39 -0
  477. package/dist/providers/jobs/types.js +13 -1
  478. package/dist/providers/llm/anthropic.js +5 -1
  479. package/dist/providers/llm/bedrock.d.ts +0 -12
  480. package/dist/providers/llm/bedrock.js +4 -0
  481. package/dist/providers/llm/claude-messages.d.ts +3 -1
  482. package/dist/providers/llm/claude-messages.js +4 -1
  483. package/dist/providers/llm/claude-provider.d.ts +2 -2
  484. package/dist/providers/llm/claude-provider.js +2 -2
  485. package/dist/providers/llm/openai.d.ts +2 -2
  486. package/dist/providers/llm/openai.js +6 -2
  487. package/dist/providers/llm/routing.d.ts +2 -2
  488. package/dist/providers/llm/routing.js +2 -2
  489. package/dist/providers/llm/types.d.ts +12 -2
  490. package/dist/providers/review-host/github-events.d.ts +9 -1
  491. package/dist/providers/review-host/github-events.js +34 -12
  492. package/dist/providers/review-host/github.d.ts +29 -2
  493. package/dist/providers/review-host/github.js +224 -29
  494. package/dist/providers/review-host/local.d.ts +8 -4
  495. package/dist/providers/review-host/local.js +49 -31
  496. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  497. package/dist/providers/review-host/patch-pages.js +176 -0
  498. package/dist/providers/review-host/review-format.d.ts +19 -1
  499. package/dist/providers/review-host/review-format.js +38 -7
  500. package/dist/providers/review-host/types.d.ts +140 -6
  501. package/dist/providers/review-host/types.js +9 -1
  502. package/dist/providers/storage/gcs.d.ts +63 -0
  503. package/dist/providers/storage/gcs.js +69 -0
  504. package/dist/providers/storage/index.d.ts +15 -0
  505. package/dist/providers/storage/index.js +14 -0
  506. package/dist/providers/storage/local.d.ts +24 -0
  507. package/dist/providers/storage/local.js +92 -0
  508. package/dist/providers/storage/meter.d.ts +14 -0
  509. package/dist/providers/storage/meter.js +34 -0
  510. package/dist/providers/storage/s3.d.ts +41 -0
  511. package/dist/providers/storage/s3.js +107 -0
  512. package/dist/providers/storage/types.d.ts +37 -3
  513. package/dist/providers/storage/types.js +21 -4
  514. package/dist/providers/vcs/git.d.ts +39 -4
  515. package/dist/providers/vcs/git.js +339 -26
  516. package/dist/providers/vcs/github-remote.d.ts +26 -3
  517. package/dist/providers/vcs/github-remote.js +124 -14
  518. package/dist/providers/vcs/github.d.ts +183 -44
  519. package/dist/providers/vcs/github.js +455 -56
  520. package/dist/providers/vcs/index.d.ts +1 -1
  521. package/dist/providers/vcs/index.js +9 -2
  522. package/dist/providers/vcs/pr-description.d.ts +127 -0
  523. package/dist/providers/vcs/pr-description.js +270 -0
  524. package/dist/providers/vcs/remote.d.ts +37 -1
  525. package/dist/providers/vcs/remote.js +7 -1
  526. package/dist/providers/vcs/routing.d.ts +16 -8
  527. package/dist/providers/vcs/routing.js +27 -6
  528. package/dist/providers/vcs/types.d.ts +150 -5
  529. package/dist/quickstart/coding-seed.d.ts +14 -3
  530. package/dist/quickstart/coding-seed.js +213 -4
  531. package/dist/quickstart/index.d.ts +5 -0
  532. package/dist/quickstart/index.js +21 -0
  533. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  534. package/dist/quickstart/reviewer-prompt.js +6 -6
  535. package/dist/quickstart-images.json +1 -1
  536. package/dist/sandbox/eval-core.d.ts +12 -2
  537. package/dist/sandbox/eval-core.js +20 -4
  538. package/dist/sandbox/generated/zod.bundle.js +62 -1
  539. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  540. package/dist/sandbox/host-functions.d.ts +5 -0
  541. package/dist/sandbox/host-functions.js +13 -13
  542. package/dist/sandbox/limits.d.ts +4 -1
  543. package/dist/sandbox/limits.js +4 -1
  544. package/dist/sandbox/run-in-sandbox.d.ts +6 -0
  545. package/dist/sandbox/run-in-sandbox.js +14 -2
  546. package/dist/sandbox/safe-fetch.d.ts +2 -0
  547. package/dist/sandbox/safe-fetch.js +1 -1
  548. package/dist/sandbox/secret-broker.d.ts +1 -0
  549. package/dist/sandbox/secret-broker.js +4 -5
  550. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  551. package/dist/sandbox/tool-timeout.d.ts +32 -0
  552. package/dist/sandbox/tool-timeout.js +52 -0
  553. package/dist/sandbox/user-tool.d.ts +8 -1
  554. package/dist/sandbox/user-tool.js +9 -3
  555. package/dist/sandbox/zod-params.d.ts +37 -5
  556. package/dist/sandbox/zod-params.js +181 -26
  557. package/dist/serve.js +8 -1
  558. package/dist/viewer/api-schema.d.ts +349 -2627
  559. package/dist/viewer/api-schema.js +7 -0
  560. package/dist/viewer/build-schemas.js +6 -2
  561. package/dist/viewer/graph.js +2 -1
  562. package/dist/viewer/openapi.js +2 -4
  563. package/dist/wardby-bin.js +15 -0
  564. package/docs/README.md +11 -1
  565. package/docs/agent-recipes.md +95 -24
  566. package/docs/architecture-runtime.md +1 -1
  567. package/docs/claude-code-plugin.md +164 -0
  568. package/docs/code-review-agents.md +557 -41
  569. package/docs/coding-agent-setup.md +566 -8
  570. package/docs/coding-packages.md +1033 -90
  571. package/docs/coding-services.md +27 -12
  572. package/docs/coding-worker-byo-images.md +24 -2
  573. package/docs/coding-worker-isolation.md +183 -37
  574. package/docs/debugging-agent-runs.md +242 -0
  575. package/docs/getting-started-gke.md +129 -141
  576. package/docs/getting-started-identity-provider.md +53 -38
  577. package/docs/getting-started.md +17 -0
  578. package/docs/host-providers.md +294 -0
  579. package/docs/jira-agents.md +17 -8
  580. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  581. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  582. package/docs/knowledge/delegation-admission-slots.md +52 -0
  583. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  584. package/docs/knowledge/import-rename-target.md +52 -0
  585. package/docs/knowledge/index.md +57 -0
  586. package/docs/knowledge/log.md +9 -0
  587. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  588. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  589. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  590. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  591. package/docs/knowledge/overview-cli.md +74 -0
  592. package/docs/knowledge/overview-coding-proxy.md +72 -0
  593. package/docs/knowledge/overview-coding.md +72 -0
  594. package/docs/knowledge/overview-config.md +60 -0
  595. package/docs/knowledge/overview-core.md +72 -0
  596. package/docs/knowledge/overview-deploy.md +83 -0
  597. package/docs/knowledge/overview-mcp.md +61 -0
  598. package/docs/knowledge/overview-prisma.md +72 -0
  599. package/docs/knowledge/overview-providers.md +89 -0
  600. package/docs/knowledge/overview-sandbox.md +83 -0
  601. package/docs/knowledge/overview-surfaces.md +83 -0
  602. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  603. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  604. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  605. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  606. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  607. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  608. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  609. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  610. package/docs/knowledge/warm-input-publication.md +30 -0
  611. package/docs/knowledge/workspace-staging-failure.md +54 -0
  612. package/docs/knowledge.md +54 -14
  613. package/docs/mcp-servers.md +254 -0
  614. package/docs/native-sandbox.md +143 -31
  615. package/docs/observability.md +4 -0
  616. package/docs/security-deployment.md +139 -29
  617. package/docs/slack-notifications.md +35 -19
  618. package/docs/tool-secrets.md +45 -10
  619. package/docs/viewer-api.md +6 -0
  620. package/docs/viewer-api.openapi.yml +1 -1
  621. package/help/admin-viewer.md +28 -2
  622. package/help/agent-recipes.md +33 -2
  623. package/help/architecture-agent.md +11 -6
  624. package/help/brokered-secrets.md +3 -0
  625. package/help/build-claude-code-image.md +1 -1
  626. package/help/build-worker-image.md +3 -1
  627. package/help/builder-agent.md +19 -6
  628. package/help/claude-code-run-pane.md +40 -0
  629. package/help/code-review-agents.md +177 -6
  630. package/help/coding-packages.md +156 -6
  631. package/help/cost-attribution.md +9 -5
  632. package/help/creating-agents.md +14 -1
  633. package/help/dependency-cache.md +143 -0
  634. package/help/deploy-gke.md +15 -8
  635. package/help/errors/budget-exhausted.md +187 -0
  636. package/help/errors/budget-group-exhausted.md +5 -1
  637. package/help/errors/coding-mcp-pins-unavailable.md +35 -0
  638. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  639. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  640. package/help/errors/continuation-closed.md +9 -12
  641. package/help/errors/database-auth-invalid.md +1 -1
  642. package/help/errors/delegation-conflict.md +24 -0
  643. package/help/errors/file-list-truncated.md +45 -0
  644. package/help/errors/full-read-required.md +49 -0
  645. package/help/errors/github-account-not-allowed.md +4 -0
  646. package/help/errors/graph-incomplete.md +43 -0
  647. package/help/errors/graph-limit.md +43 -0
  648. package/help/errors/host-provider-error.md +40 -0
  649. package/help/errors/host-tool-failed.md +36 -0
  650. package/help/errors/mcp-call-limit.md +22 -0
  651. package/help/errors/mcp-call-timeout.md +22 -0
  652. package/help/errors/mcp-server-auth-failed.md +22 -0
  653. package/help/errors/mcp-server-credentials-unavailable.md +45 -0
  654. package/help/errors/mcp-server-error.md +28 -0
  655. package/help/errors/mcp-server-unreachable.md +22 -0
  656. package/help/errors/mcp-servers-off.md +21 -0
  657. package/help/errors/mcp-tool-not-allowed.md +26 -0
  658. package/help/errors/mcp-tool-removed.md +22 -0
  659. package/help/errors/mcp-unavailable.md +25 -0
  660. package/help/errors/merge-conflict.md +49 -0
  661. package/help/errors/native-sandbox-capacity.md +1 -1
  662. package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
  663. package/help/errors/native-sandbox-docker-failed.md +1 -1
  664. package/help/errors/native-sandbox-gateway-error.md +20 -0
  665. package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
  666. package/help/errors/native-sandbox-image-not-pinned.md +1 -1
  667. package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
  668. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  669. package/help/errors/native-sandbox-network-unenforced.md +1 -1
  670. package/help/errors/native-sandbox-requires-catalog.md +1 -1
  671. package/help/errors/native-sandbox-unavailable.md +1 -1
  672. package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
  673. package/help/errors/native-sandbox-worker-exited.md +4 -3
  674. package/help/errors/native-sandbox-worker-lost.md +1 -1
  675. package/help/errors/native-sandbox-worker-unready.md +1 -1
  676. package/help/errors/package-not-allowed-pending.md +52 -0
  677. package/help/errors/package-not-allowed.md +51 -0
  678. package/help/errors/package-refusals.md +43 -0
  679. package/help/errors/patch-cursor-malformed.md +31 -0
  680. package/help/errors/repository-not-listed.md +36 -0
  681. package/help/errors/repository-required.md +36 -0
  682. package/help/errors/run-lost.md +39 -0
  683. package/help/errors/run-transcript-download.md +44 -0
  684. package/help/errors/secret-in-value.md +69 -0
  685. package/help/errors/target-merge.md +40 -0
  686. package/help/errors/tool-timeout.md +38 -0
  687. package/help/fix-merge-conflicts.md +73 -0
  688. package/help/github-app-setup.md +132 -0
  689. package/help/github.md +22 -0
  690. package/help/host-providers.md +40 -0
  691. package/help/identity-and-access.md +6 -1
  692. package/help/jira.md +23 -6
  693. package/help/knowledge.md +16 -7
  694. package/help/local-repositories.md +1 -1
  695. package/help/low-power-mode.md +7 -1
  696. package/help/mcp-servers.md +73 -0
  697. package/help/mcp.md +7 -2
  698. package/help/merge-order-check.md +5 -0
  699. package/help/native-capabilities.md +55 -1
  700. package/help/native-sandbox.md +16 -2
  701. package/help/operating-agents.md +21 -0
  702. package/help/package-audit-mode.md +91 -0
  703. package/help/related-pull-requests.md +17 -10
  704. package/help/repo-instructions-and-skills.md +3 -1
  705. package/help/resume-runs-locally.md +134 -0
  706. package/help/review-fix-rounds.md +33 -1
  707. package/help/sharing-agents.md +59 -0
  708. package/help/slack-notifications.md +19 -5
  709. package/help/status-comments.md +31 -0
  710. package/help/stop-run.md +58 -0
  711. package/help/troubleshooting/budgets.md +28 -0
  712. package/help/troubleshooting/coding-workers.md +86 -7
  713. package/help/troubleshooting/debugging-agent-runs.md +29 -0
  714. package/package.json +18 -10
  715. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  716. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  717. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  718. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  719. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  720. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  721. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  722. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  723. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  724. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  725. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  726. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  727. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  728. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  729. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  730. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  731. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  732. package/prisma/migrations/20261102000000_host_providers/migration.sql +56 -0
  733. package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
  734. package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
  735. package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
  736. package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
  737. package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
  738. package/prisma/schema.prisma +468 -109
  739. package/scripts/git-askpass.sh +1 -1
  740. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Stopping a run on request (the stop_run MCP tool). Every executor already owns the stop of the
3
+ * runs it executes (`Executor.stop`), and each makes the terminal write itself, conditional on the
4
+ * run still being pending or running, so the first terminal write wins and a finished run is never
5
+ * rewritten:
6
+ *
7
+ * - a native run in the control plane is recorded `cancelled` and stops at its next step boundary
8
+ * (InProcessExecutor/DbosExecutor; a run that has not started never does);
9
+ * - a native run in the sandbox is recorded `cancelled`, its gateway session ends so the worker's
10
+ * next call is refused, and after a short grace its worker is killed and removed
11
+ * (NativeSandboxExecutor);
12
+ * - a coding run, queued for a slot or running, is recorded `cancelled` first (the fence that keeps
13
+ * a finishing run from pushing or opening a pull request), then its proxy session is cancelled and
14
+ * its job stopped and removed (ContainerExecutor).
15
+ *
16
+ * This module adds what a caller asks for on top: the run's in-flight delegated child runs are
17
+ * stopped too (depth-first, so nothing keeps spending for a parent that stopped), who stopped it
18
+ * and why is kept on the row (Run.stopRequestReason) and logged, and a run already finished is
19
+ * returned unchanged.
20
+ */
21
+ import type { PrismaClient, RunStatus } from "#prisma";
22
+ import type { Executor } from "../providers/executor/types.js";
23
+ export type StopRunDb = Pick<PrismaClient, "run">;
24
+ export interface StopRunOptions {
25
+ db: StopRunDb;
26
+ executor: Pick<Executor, "stop">;
27
+ runId: string;
28
+ /** Who asked (a principal id), recorded with the reason. */
29
+ stoppedBy: string;
30
+ /** The caller's own words, if any. */
31
+ reason?: string;
32
+ }
33
+ export interface StopRunResult {
34
+ runId: string;
35
+ /** The run's status before this call. */
36
+ previousStatus: RunStatus;
37
+ /** The run's status after it: `cancelled` once stopped, or whatever it had already ended as. */
38
+ status: RunStatus;
39
+ /** False when the run had already finished: nothing was changed. */
40
+ stopRequested: boolean;
41
+ /** In-flight delegated child runs this call stopped as well. */
42
+ stoppedChildRunIds: string[];
43
+ }
44
+ /** The text recorded on a stopped run: who stopped it and why. */
45
+ export declare function stopRunReason(stoppedBy: string, reason?: string): string;
46
+ export declare function stopRun(options: StopRunOptions): Promise<StopRunResult>;
@@ -0,0 +1,61 @@
1
+ import { logger } from "./logger.js";
2
+ const stopLog = logger.child({ module: "stop-run" });
3
+ const DRIVABLE = ["pending", "running"];
4
+ /** Delegation trees are shallow; this only bounds a malformed one. */
5
+ const MAX_CHILD_DEPTH = 16;
6
+ /** The text recorded on a stopped run: who stopped it and why. */
7
+ export function stopRunReason(stoppedBy, reason) {
8
+ const why = reason?.trim();
9
+ return `Stopped by ${stoppedBy} with stop_run${why ? `: ${why}` : "."}`;
10
+ }
11
+ export async function stopRun(options) {
12
+ const { db, runId } = options;
13
+ const row = await db.run.findUnique({ where: { id: runId }, select: { status: true } });
14
+ if (!row)
15
+ throw new Error(`Unknown run "${runId}".`);
16
+ const previousStatus = row.status;
17
+ if (!DRIVABLE.includes(previousStatus)) {
18
+ return { runId, previousStatus, status: previousStatus, stopRequested: false, stoppedChildRunIds: [] };
19
+ }
20
+ const reason = stopRunReason(options.stoppedBy, options.reason);
21
+ stopLog.info({ runId, stoppedBy: options.stoppedBy, previousStatus, reason }, "stopping run");
22
+ const stoppedChildRunIds = [];
23
+ await stopOne(options, runId, reason, stoppedChildRunIds, 0, new Set());
24
+ const after = await db.run.findUniqueOrThrow({ where: { id: runId }, select: { status: true } });
25
+ return { runId, previousStatus, status: after.status, stopRequested: true, stoppedChildRunIds };
26
+ }
27
+ async function stopOne(options, runId, reason, stoppedChildRunIds, depth, visited) {
28
+ const { db, executor } = options;
29
+ visited.add(runId);
30
+ try {
31
+ await executor.stop(runId, reason);
32
+ }
33
+ catch (err) {
34
+ // Still stop the children and record the request: a failed stop is retried by calling again.
35
+ stopLog.warn({ err, runId }, "the executor failed to stop the run");
36
+ }
37
+ // A run that never started has nothing to interrupt: end it here if no executor did.
38
+ await db.run.updateMany({
39
+ where: { id: runId, status: "pending" },
40
+ data: { status: "cancelled", error: reason, finishedAt: new Date() },
41
+ });
42
+ // Kept for get_run; written only on a run this stop (or another) cancelled, never on one that
43
+ // finished some other way meanwhile. stopRequestedAt stays null: it is the native sandbox
44
+ // gateway's deferred-stop marker, which the scheduler leader drains.
45
+ await db.run.updateMany({
46
+ where: { id: runId, status: "cancelled", stopRequestReason: null },
47
+ data: { stopRequestReason: reason },
48
+ });
49
+ if (depth >= MAX_CHILD_DEPTH)
50
+ return;
51
+ const children = await db.run.findMany({
52
+ where: { parentRunId: runId, status: { in: [...DRIVABLE] } },
53
+ select: { id: true },
54
+ });
55
+ for (const child of children) {
56
+ if (visited.has(child.id))
57
+ continue;
58
+ stoppedChildRunIds.push(child.id);
59
+ await stopOne(options, child.id, `Parent run ${runId} was stopped. ${reason}`, stoppedChildRunIds, depth + 1, visited);
60
+ }
61
+ }
@@ -33,6 +33,8 @@ export interface ToolChanges {
33
33
  description?: string;
34
34
  paramsZod?: string;
35
35
  code?: string;
36
+ /** null clears it (back to the default limit). Checked against the ceiling by the caller (toolTimeoutProblem). */
37
+ timeoutMs?: number | null;
36
38
  }
37
39
  /**
38
40
  * Why a tool change was refused because of its attachments:
@@ -76,6 +78,8 @@ export declare function deleteToolGuarded(db: Pick<PrismaClient, "$transaction">
76
78
  authorize: AuthorizeTool;
77
79
  }): Promise<string[]>;
78
80
  /** One `wardby tool list` line: names are only unique per owner, so the id and owner disambiguate. */
79
- export declare function formatToolLine(tool: Pick<Tool, "id" | "name" | "description" | "ownerId">): string;
81
+ export declare function formatToolLine(tool: Pick<Tool, "id" | "name" | "description" | "ownerId"> & {
82
+ timeoutMs?: number | null;
83
+ }): string;
80
84
  /** Attached agents for an operator-facing refusal: unlike MCP's, nothing is redacted. */
81
85
  export declare function formatAttachedAgents(agents: AttachedAgent[]): string;
@@ -46,7 +46,10 @@ export class ToolAttachedError extends Error {
46
46
  }
47
47
  /** Whether `changes` names at least one field to change. */
48
48
  export function hasToolChanges(changes) {
49
- return changes.description !== undefined || changes.paramsZod !== undefined || changes.code !== undefined;
49
+ return (changes.description !== undefined ||
50
+ changes.paramsZod !== undefined ||
51
+ changes.code !== undefined ||
52
+ changes.timeoutMs !== undefined);
50
53
  }
51
54
  /**
52
55
  * The row update for `changes`, with jsonSchema re-derived exactly as tool
@@ -59,6 +62,7 @@ export async function prepareToolUpdate(changes) {
59
62
  const data = {
60
63
  ...(changes.description !== undefined ? { description: changes.description } : {}),
61
64
  ...(changes.code !== undefined ? { code: changes.code } : {}),
65
+ ...(changes.timeoutMs !== undefined ? { timeoutMs: changes.timeoutMs } : {}),
62
66
  };
63
67
  if (changes.paramsZod !== undefined) {
64
68
  const schemaResult = await deriveJsonSchema(changes.paramsZod);
@@ -119,7 +123,8 @@ export async function deleteToolGuarded(db, toolId, options) {
119
123
  }
120
124
  /** One `wardby tool list` line: names are only unique per owner, so the id and owner disambiguate. */
121
125
  export function formatToolLine(tool) {
122
- return `${tool.id} ${tool.name} owner:${tool.ownerId ?? "public"} ${tool.description}`;
126
+ const timeout = tool.timeoutMs === null || tool.timeoutMs === undefined ? "" : ` timeoutMs:${tool.timeoutMs}`;
127
+ return `${tool.id} ${tool.name} owner:${tool.ownerId ?? "public"}${timeout} ${tool.description}`;
123
128
  }
124
129
  /** Attached agents for an operator-facing refusal: unlike MCP's, nothing is redacted. */
125
130
  export function formatAttachedAgents(agents) {
@@ -9,6 +9,8 @@
9
9
  * the model would see a duplicate tool name and one tool would silently
10
10
  * shadow the other; every attach path refuses that instead
11
11
  * (findSameNamedAttachedTool), and the runner asserts it at load time.
12
+ * The same holds against an attached MCP server's exposed tool names
13
+ * (findSameNamedMcpTool); the runner leaves a clashing MCP tool out.
12
14
  */
13
15
  import type { Prisma, PrismaClient, Tool } from "#prisma";
14
16
  /** The runner's synthesized sub-agent tools are `delegate_to_<boundName>`. */
@@ -28,6 +30,17 @@ export type ToolLookupDb = Pick<PrismaClient | Prisma.TransactionClient, "tool"
28
30
  * is Serializable) so a concurrent attach can't slip in between.
29
31
  */
30
32
  export declare function findSameNamedAttachedTool(db: Pick<ToolLookupDb, "agentTool">, agentId: string, tool: Pick<Tool, "id" | "name">): Promise<Pick<Tool, "id" | "name" | "ownerId"> | null>;
33
+ /**
34
+ * An MCP attachment of `agentId` whose exposed tool name (`<server>__<tool>`) equals `toolName`,
35
+ * or null: the other direction of attach_mcp_server's clash check, for every path that attaches a
36
+ * Tool. Every exposed name contains "__", so any other name needs no lookup.
37
+ */
38
+ export declare function findSameNamedMcpTool(db: Pick<PrismaClient | Prisma.TransactionClient, "agentMcpServer">, agentId: string, toolName: string): Promise<{
39
+ serverId: string;
40
+ serverName: string;
41
+ } | null>;
42
+ /** The refusal for a Tool whose name is an exposed MCP tool name on the agent (findSameNamedMcpTool). */
43
+ export declare function sameNamedMcpToolMessage(agentRef: string, toolName: string, serverName: string): string;
31
44
  /**
32
45
  * Resolves a CLI tool reference: an id, else a name. A name is no longer
33
46
  * unique across owners, so more than one match is refused -- with the
@@ -1,6 +1,7 @@
1
1
  import { MEMORY_TOOL_NAMES } from "./memory-tools.js";
2
2
  import { SUBAGENT_MEMORY_TOOL_NAMES } from "./subagent-memory-tools.js";
3
3
  import { ISSUE_TRACKER_TOOL_NAMES } from "./issue-tracker-tools.js";
4
+ import { exposedNames } from "./mcp-servers.js";
4
5
  /** The runner's synthesized sub-agent tools are `delegate_to_<boundName>`. */
5
6
  export const DELEGATE_TOOL_PREFIX = "delegate_to_";
6
7
  /**
@@ -44,6 +45,25 @@ export async function findSameNamedAttachedTool(db, agentId, tool) {
44
45
  });
45
46
  return clash?.tool ?? null;
46
47
  }
48
+ /**
49
+ * An MCP attachment of `agentId` whose exposed tool name (`<server>__<tool>`) equals `toolName`,
50
+ * or null: the other direction of attach_mcp_server's clash check, for every path that attaches a
51
+ * Tool. Every exposed name contains "__", so any other name needs no lookup.
52
+ */
53
+ export async function findSameNamedMcpTool(db, agentId, toolName) {
54
+ if (!toolName.includes("__"))
55
+ return null;
56
+ const rows = await db.agentMcpServer.findMany({
57
+ where: { agentId },
58
+ select: { allowedTools: true, server: { select: { id: true, name: true } } },
59
+ });
60
+ const hit = rows.find((row) => exposedNames(row.server.name, row.allowedTools).includes(toolName));
61
+ return hit ? { serverId: hit.server.id, serverName: hit.server.name } : null;
62
+ }
63
+ /** The refusal for a Tool whose name is an exposed MCP tool name on the agent (findSameNamedMcpTool). */
64
+ export function sameNamedMcpToolMessage(agentRef, toolName, serverName) {
65
+ return `Agent "${agentRef}" already has the tool "${toolName}" from MCP server "${serverName}"; detach it or allow a different tool first.`;
66
+ }
47
67
  /**
48
68
  * Resolves a CLI tool reference: an id, else a name. A name is no longer
49
69
  * unique across owners, so more than one match is refused -- with the
@@ -22,6 +22,9 @@ export type ResolveWebhookRunResult = {
22
22
  } | {
23
23
  ok: false;
24
24
  reason: "not_found" | "invalid_secret" | "disabled";
25
+ } | {
26
+ ok: false;
27
+ reason: "invalid_repository";
25
28
  } | {
26
29
  ok: false;
27
30
  reason: "invalid_issue";
@@ -35,4 +38,5 @@ export type ResolveWebhookRunResult = {
35
38
  export declare function resolveWebhookRun(id: string, presentedSecret: string, db: PrismaClient, executor: Executor, codingTask?: string, opts?: {
36
39
  issue?: unknown;
37
40
  issueTrackers?: IssueTrackerRegistry;
41
+ repository?: string;
38
42
  }): Promise<ResolveWebhookRunResult>;
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
12
12
  import { AttributionError, explicitAttribution, RESPONSE_PATH_SNAPSHOT_BUDGET, } from "./attribution.js";
13
+ import { RepositoryChoiceRefusedError } from "./coding-repository.js";
13
14
  import { dispatchRun } from "./dispatch.js";
14
15
  import { atLeast, effectiveAccess } from "./grants.js";
15
16
  function hashSecret(secret) {
@@ -81,6 +82,13 @@ export async function resolveWebhookRun(id, presentedSecret, db, executor, codin
81
82
  if (codingTask !== undefined && !taskAllowed(agent.kind, agent.codingProfile)) {
82
83
  return { ok: false, reason: "disabled" };
83
84
  }
85
+ // Choosing a repository takes the same opt-in as a task, and only a coding agent has one.
86
+ if (opts.repository !== undefined) {
87
+ if (agent.kind !== "coding")
88
+ return { ok: false, reason: "invalid_repository" };
89
+ if (!taskAllowed(agent.kind, agent.codingProfile))
90
+ return { ok: false, reason: "disabled" };
91
+ }
84
92
  // An invalid or unlinked issue refuses the call before any run exists.
85
93
  let attribution;
86
94
  if (opts.issue !== undefined) {
@@ -97,55 +105,66 @@ export async function resolveWebhookRun(id, presentedSecret, db, executor, codin
97
105
  }
98
106
  }
99
107
  let rejected = "disabled";
100
- const dispatched = await dispatchRun({
101
- db,
102
- executor,
103
- selfDefects: { db, issueTrackers: opts.issueTrackers },
104
- agentId: agent.id,
105
- trigger: "webhook",
106
- attribution,
107
- // Coding agents keep the existing per-agent opt-in (allowWebhookTaskOverride);
108
- // a native agent's system prompt has no per-run input at all otherwise, so
109
- // accepting task text over an authenticated webhook call needs no separate
110
- // opt-in — it's a much lower-risk capability than a coding agent being told
111
- // to modify a real repository.
112
- codingTask: agent.kind === "coding" ? codingTask : undefined,
113
- taskOverride: agent.kind === "native" ? codingTask : undefined,
114
- // The webhook is its creator's standing trigger: its runs are visible to
115
- // the creator (and the agent owner), like a trigger_agent call.
116
- triggeredById: webhook.ownerId,
117
- beforePersist: async (tx, currentAgent) => {
118
- const current = await tx.webhook.findUnique({ where: { id } });
119
- if (!current) {
120
- rejected = "not_found";
121
- return false;
122
- }
123
- if (!secretMatches(presentedSecret, current.secretHash)) {
124
- rejected = "invalid_secret";
125
- return false;
126
- }
127
- if (current.status !== "enabled") {
128
- rejected = "disabled";
129
- return false;
130
- }
131
- if (codingTask !== undefined && !taskAllowed(currentAgent.kind, currentAgent.codingProfile)) {
132
- rejected = "disabled";
133
- return false;
134
- }
135
- // The creator must still be allowed to trigger the agent (resource-
136
- // sharing grants spec §3.10): its owner, or a holder of execute. Read
137
- // through tx, so a revoke or make_owner takes effect on the next fire.
138
- // A webhook on a formerly public agent keeps firing through the
139
- // migration's everyone-execute grant.
140
- const creatorAccess = await effectiveAccess(tx, "agent", currentAgent, current.ownerId);
141
- if (!atLeast("agent", creatorAccess, "execute")) {
142
- rejected = "disabled";
143
- return false;
144
- }
145
- await tx.webhook.update({ where: { id }, data: { lastFiredAt: new Date() } });
146
- return true;
147
- },
148
- });
108
+ let dispatched;
109
+ try {
110
+ dispatched = await dispatchRun({
111
+ db,
112
+ executor,
113
+ selfDefects: { db, issueTrackers: opts.issueTrackers },
114
+ agentId: agent.id,
115
+ trigger: "webhook",
116
+ attribution,
117
+ // Coding agents keep the existing per-agent opt-in (allowWebhookTaskOverride);
118
+ // a native agent's system prompt has no per-run input at all otherwise, so
119
+ // accepting task text over an authenticated webhook call needs no separate
120
+ // opt-in — it's a much lower-risk capability than a coding agent being told
121
+ // to modify a real repository.
122
+ codingTask: agent.kind === "coding" ? codingTask : undefined,
123
+ taskOverride: agent.kind === "native" ? codingTask : undefined,
124
+ codingRepository: agent.kind === "coding" ? opts.repository : undefined,
125
+ // The webhook is its creator's standing trigger: its runs are visible to
126
+ // the creator (and the agent owner), like a trigger_agent call.
127
+ triggeredById: webhook.ownerId,
128
+ beforePersist: async (tx, currentAgent) => {
129
+ const current = await tx.webhook.findUnique({ where: { id } });
130
+ if (!current) {
131
+ rejected = "not_found";
132
+ return false;
133
+ }
134
+ if (!secretMatches(presentedSecret, current.secretHash)) {
135
+ rejected = "invalid_secret";
136
+ return false;
137
+ }
138
+ if (current.status !== "enabled") {
139
+ rejected = "disabled";
140
+ return false;
141
+ }
142
+ if ((codingTask !== undefined || opts.repository !== undefined) &&
143
+ !taskAllowed(currentAgent.kind, currentAgent.codingProfile)) {
144
+ rejected = "disabled";
145
+ return false;
146
+ }
147
+ // The creator must still be allowed to trigger the agent (resource-
148
+ // sharing grants spec §3.10): its owner, or a holder of execute. Read
149
+ // through tx, so a revoke or make_owner takes effect on the next fire.
150
+ // A webhook on a formerly public agent keeps firing through the
151
+ // migration's everyone-execute grant.
152
+ const creatorAccess = await effectiveAccess(tx, "agent", currentAgent, current.ownerId);
153
+ if (!atLeast("agent", creatorAccess, "execute")) {
154
+ rejected = "disabled";
155
+ return false;
156
+ }
157
+ await tx.webhook.update({ where: { id }, data: { lastFiredAt: new Date() } });
158
+ return true;
159
+ },
160
+ });
161
+ }
162
+ catch (err) {
163
+ // The refusal's message lists the agent's repositories; the caller gets only the code.
164
+ if (err instanceof RepositoryChoiceRefusedError)
165
+ return { ok: false, reason: "invalid_repository" };
166
+ throw err;
167
+ }
149
168
  if (!dispatched)
150
169
  return { ok: false, reason: rejected };
151
170
  return { ok: true, runId: dispatched.run.id };
@@ -1,7 +1,13 @@
1
- export declare const WORKFLOW_EVENT_KINDS: readonly ["issue_picked_up", "run_failed", "pr_opened", "review_posted", "review_fix", "pr_closed"];
1
+ import type { PackageAuditDigest, PackageAuditMode } from "../coding/registry/audit-mode.js";
2
+ import type { RegistryRefusalSummary } from "../coding/registry/report.js";
3
+ export declare const WORKFLOW_EVENT_KINDS: readonly ["issue_picked_up", "run_failed", "run_blocked", "pr_opened", "review_posted", "review_fix", "pr_closed", "packages_audited"];
2
4
  export type WorkflowEventKind = (typeof WORKFLOW_EVENT_KINDS)[number];
3
5
  /** Template inputs per kind. Every string here may be shown in Slack (escaped). */
4
6
  export type WorkflowPayload = {
7
+ kind: "run_blocked";
8
+ agentName: string;
9
+ packageRefusals: RegistryRefusalSummary[];
10
+ } | {
5
11
  kind: "issue_picked_up";
6
12
  agentName: string;
7
13
  trigger: string;
@@ -34,7 +40,11 @@ export type WorkflowPayload = {
34
40
  prUrl: string;
35
41
  merged: boolean;
36
42
  movedTo: string | null;
37
- };
43
+ } | ({
44
+ kind: "packages_audited";
45
+ agentName: string;
46
+ mode: PackageAuditMode;
47
+ } & PackageAuditDigest);
38
48
  /** What a thread's parent message shows about its subject. */
39
49
  export interface ThreadSubject {
40
50
  /** "PAY-241" or "org/repo#212" or "run abc123". */
@@ -44,11 +54,13 @@ export interface ThreadSubject {
44
54
  }
45
55
  export declare const dedupeKeys: {
46
56
  issuePickedUp: (runId: string) => string;
57
+ runBlocked: (runId: string) => string;
47
58
  runFailed: (runId: string) => string;
48
59
  prOpened: (codeProvider: string, repository: string, n: number) => string;
49
60
  reviewPosted: (runId: string) => string;
50
61
  reviewFix: (repository: string, n: number, round: number, state: "started" | "capped") => string;
51
62
  prClosed: (codeProvider: string, repository: string, n: number) => string;
63
+ packagesAudited: (runId: string) => string;
52
64
  };
53
65
  export declare const threadKeys: {
54
66
  issue: (provider: string, key: string) => string;
@@ -2,18 +2,22 @@ import { logger } from "./logger.js";
2
2
  export const WORKFLOW_EVENT_KINDS = [
3
3
  "issue_picked_up",
4
4
  "run_failed",
5
+ "run_blocked",
5
6
  "pr_opened",
6
7
  "review_posted",
7
8
  "review_fix",
8
9
  "pr_closed",
10
+ "packages_audited",
9
11
  ];
10
12
  export const dedupeKeys = {
11
13
  issuePickedUp: (runId) => `issue_picked_up:${runId}`,
14
+ runBlocked: (runId) => `run_blocked:${runId}`,
12
15
  runFailed: (runId) => `run_failed:${runId}`,
13
16
  prOpened: (codeProvider, repository, n) => `pr_opened:${codeProvider}:${repository}#${n}`,
14
17
  reviewPosted: (runId) => `review_posted:${runId}`,
15
18
  reviewFix: (repository, n, round, state) => `review_fix:${repository}#${n}:${round}:${state}`,
16
19
  prClosed: (codeProvider, repository, n) => `pr_closed:${codeProvider}:${repository}#${n}`,
20
+ packagesAudited: (runId) => `packages_audited:${runId}`,
17
21
  };
18
22
  export const threadKeys = {
19
23
  issue: (provider, key) => `issue:${provider}:${key}`,
@@ -1,12 +1,14 @@
1
1
  /**
2
2
  * Workflow notifications a run's finalizer emits: run_failed for a top-level
3
- * run that did not succeed (children are summarized by their parent), and
3
+ * run that did not succeed, run_blocked for package refusals without changes
4
+ * (children are summarized by their parent), packages_audited when its coding
5
+ * children installed anything under package audit mode, and
4
6
  * review_posted when the run published a verdict on its own check. Called
5
7
  * only by the finalizer that made the run terminal. Never throws.
6
8
  */
7
9
  import type { PrismaClient } from "#prisma";
8
- export type RunEventsDb = Pick<PrismaClient, "agent" | "runHostCheck">;
9
- /** Emits run_failed (top-level, non-success) and review_posted (verdict published). Never throws. */
10
+ export type RunEventsDb = Pick<PrismaClient, "agent" | "runHostCheck" | "run" | "runBudgetEvent" | "registryFetch" | "registryAuditRecord">;
11
+ /** Emits top-level run outcomes and published review verdicts. Never throws. */
10
12
  export declare function emitRunFinishedEvents(db: RunEventsDb, run: {
11
13
  id: string;
12
14
  agentId: string;
@@ -1,19 +1,55 @@
1
+ import { pullRequestWebUrl } from "../coding/code-host.js";
2
+ import { packageAuditDigest } from "../coding/registry/audit-mode.js";
3
+ import { blockingRefusals, collectPackageAudit, collectRunOutcome, isBlockedByRefusals } from "./host-status.js";
1
4
  import { logger } from "./logger.js";
2
5
  import { dedupeKeys, emitWorkflowEvent, shortReason } from "./workflow-events.js";
3
6
  const log = logger.child({ module: "workflow-run-events" });
4
7
  const FAILED = new Set(["failed", "budget_exhausted", "cancelled", "lost", "refused"]);
5
8
  const VERDICTS = new Set(["APPROVE", "CHANGES_REQUESTED", "COMMENT"]);
6
- /** Emits run_failed (top-level, non-success) and review_posted (verdict published). Never throws. */
9
+ /** Emits top-level run outcomes and published review verdicts. Never throws. */
7
10
  export async function emitRunFinishedEvents(db, run) {
8
11
  try {
9
12
  const agentName = (await db.agent.findUnique({ where: { id: run.agentId }, select: { name: true } }))?.name ?? run.agentId;
10
- if (!run.parentRunId && FAILED.has(run.status)) {
11
- await emitWorkflowEvent({
12
- dedupeKey: dedupeKeys.runFailed(run.id),
13
- runId: run.id,
14
- agentId: run.agentId,
15
- payload: { kind: "run_failed", agentName, status: run.status, reason: shortReason(run.error) },
16
- });
13
+ if (!run.parentRunId) {
14
+ try {
15
+ // Only a succeeded run can be blocked (isBlockedByRefusals), so only it needs its children read.
16
+ const succeeded = { id: run.id, status: "succeeded", finalText: null };
17
+ const outcome = run.status === "succeeded" ? await collectRunOutcome(db, succeeded) : null;
18
+ if (outcome && isBlockedByRefusals(succeeded, outcome)) {
19
+ await emitWorkflowEvent({
20
+ dedupeKey: dedupeKeys.runBlocked(run.id),
21
+ runId: run.id,
22
+ agentId: run.agentId,
23
+ payload: { kind: "run_blocked", agentName, packageRefusals: blockingRefusals(outcome) },
24
+ });
25
+ }
26
+ // Any terminal status: what audit mode let in is worth knowing whether or not the run succeeded.
27
+ const audit = outcome ? outcome.packageAudit : await collectPackageAudit(db, run.id);
28
+ if (audit && audit.summary.entries.length > 0) {
29
+ await emitWorkflowEvent({
30
+ dedupeKey: dedupeKeys.packagesAudited(run.id),
31
+ runId: run.id,
32
+ agentId: run.agentId,
33
+ payload: {
34
+ kind: "packages_audited",
35
+ agentName,
36
+ mode: audit.mode,
37
+ ...packageAuditDigest(audit.mode, audit.summary),
38
+ },
39
+ });
40
+ }
41
+ }
42
+ catch {
43
+ // A reporting read failure must not prevent other workflow events.
44
+ }
45
+ if (FAILED.has(run.status)) {
46
+ await emitWorkflowEvent({
47
+ dedupeKey: dedupeKeys.runFailed(run.id),
48
+ runId: run.id,
49
+ agentId: run.agentId,
50
+ payload: { kind: "run_failed", agentName, status: run.status, reason: shortReason(run.error) },
51
+ });
52
+ }
17
53
  }
18
54
  const check = await db.runHostCheck.findUnique({ where: { runId: run.id } });
19
55
  if (check?.verdict && VERDICTS.has(check.verdict) && check.prNumber !== null) {
@@ -28,7 +64,7 @@ export async function emitRunFinishedEvents(db, run) {
28
64
  agentName,
29
65
  verdict: check.verdict,
30
66
  prLabel,
31
- prUrl: check.provider === "github" ? `https://github.com/${check.repository}/pull/${check.prNumber}` : null,
67
+ prUrl: pullRequestWebUrl(check.provider, check.repository, check.prNumber),
32
68
  ciPending: check.ciPendingAtReview === true,
33
69
  },
34
70
  });
@@ -0,0 +1,4 @@
1
+ export interface LegacyJsonSchemaOptions {
2
+ closeObjects?: boolean;
3
+ }
4
+ export declare function legacyJsonSchema(node: unknown, options?: LegacyJsonSchemaOptions): unknown;
@@ -0,0 +1,39 @@
1
+ function isStringKeySchema(value) {
2
+ return (!!value &&
3
+ typeof value === "object" &&
4
+ !Array.isArray(value) &&
5
+ Object.keys(value).length === 1 &&
6
+ value.type === "string");
7
+ }
8
+ export function legacyJsonSchema(node, options = {}) {
9
+ if (Array.isArray(node))
10
+ return node.map((item) => legacyJsonSchema(item, options));
11
+ if (!node || typeof node !== "object")
12
+ return node;
13
+ const source = node;
14
+ const out = {};
15
+ for (const [key, value] of Object.entries(source)) {
16
+ if (source.type === "integer" && key === "minimum" && value === Number.MIN_SAFE_INTEGER)
17
+ continue;
18
+ if (source.type === "integer" && key === "maximum" && value === Number.MAX_SAFE_INTEGER)
19
+ continue;
20
+ if (key === "propertyNames" && isStringKeySchema(value))
21
+ continue;
22
+ if (options.closeObjects &&
23
+ key === "additionalProperties" &&
24
+ value &&
25
+ typeof value === "object" &&
26
+ Object.keys(value).length === 0) {
27
+ out[key] = true;
28
+ continue;
29
+ }
30
+ // A `properties` map's keys are names, not keywords: only its values are schemas.
31
+ out[key === "oneOf" ? "anyOf" : key] =
32
+ key === "properties" && value && typeof value === "object"
33
+ ? Object.fromEntries(Object.entries(value).map(([name, sub]) => [name, legacyJsonSchema(sub, options)]))
34
+ : legacyJsonSchema(value, options);
35
+ }
36
+ if (options.closeObjects && source.type === "object" && "properties" in source && !("additionalProperties" in source))
37
+ out.additionalProperties = false;
38
+ return out;
39
+ }
@@ -0,0 +1,35 @@
1
+ import type { PrismaClient } from "#prisma";
2
+ import { type Zod4Compatibility } from "../sandbox/zod-params.js";
3
+ import type { SandboxResult } from "../sandbox/eval-core.js";
4
+ export declare const ZOD3_WINDOW_ENDS = "Zod 3 schemas stop working in the next release";
5
+ /** The warning for one paramsZod, or undefined when Zod 4 compiles it (or there is nothing to say). */
6
+ export declare function zod3WindowWarning(subject: string, compatibility: Zod4Compatibility): string | undefined;
7
+ /** How a warning names a tool. */
8
+ export declare function toolSubject(name: string): string;
9
+ export declare function cachedZod4Compatibility(paramsZod: string): Promise<Zod4Compatibility>;
10
+ /** Test hook: empties the compatibility cache. */
11
+ export declare function clearZod4CompatibilityCache(): void;
12
+ /** The warnings for one tool's paramsZod (empty or one entry), ready for a result's `warnings`. */
13
+ export declare function zod3ToolWarnings(subject: string, paramsZod: string): Promise<string[]>;
14
+ /**
15
+ * A tool row with its Zod 3 window warnings, for a caller who owns it (and so
16
+ * already sees its paramsZod). Rows projected for anyone else, which carry no
17
+ * paramsZod, pass through unchanged: a warning would reveal part of the schema.
18
+ */
19
+ export declare function withZod3ToolWarnings<T extends object>(projected: T): Promise<T | (T & {
20
+ warnings: string[];
21
+ })>;
22
+ /**
23
+ * dry_run_tool's check of a schema Zod 4 does compile: whether Zod 4 treats
24
+ * the sample arguments as the current release does. Names no values.
25
+ */
26
+ export declare function zod3SampleArgsWarning(subject: string, current: SandboxResult, zod4: SandboxResult): string | undefined;
27
+ interface WarnLog {
28
+ warn(fields: object, message: string): void;
29
+ }
30
+ /**
31
+ * Logs one warning per stored tool whose paramsZod Zod 4 can't compile. Runs
32
+ * in the background at startup; never throws.
33
+ */
34
+ export declare function logZod3ToolWarnings(db: Pick<PrismaClient, "tool">, log: WarnLog): Promise<number>;
35
+ export {};