@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
@@ -3,14 +3,28 @@ import { isAbsolute, resolve } from "node:path";
3
3
  export const CODING_PROTOCOL_VERSION = 1;
4
4
  /** The code host every coding run's repository and pull request live on (see pullRequestUrlSchema); the one place to change when another is added. */
5
5
  export const CODING_CODE_PROVIDER = "github";
6
- export const MAX_CODING_ARTIFACT_BYTES = 64 * 1024;
6
+ /** result.json and the agent output file: room for a full summary and test list, JSON-escaped. */
7
+ export const MAX_CODING_ARTIFACT_BYTES = 256 * 1024;
8
+ /** The worker input artifact (input.json): larger than results because it can carry Claude Code repo context. */
9
+ export const MAX_CODING_INPUT_BYTES = 512 * 1024;
10
+ /** Bounds on CodingTaskInput.claudeContext, enforced by the builder (src/coding/claude-context.ts) and this schema. */
11
+ export const CLAUDE_CONTEXT_LIMITS = { maxFiles: 200, maxFileBytes: 64 * 1024, maxTotalBytes: 256 * 1024 };
7
12
  export const MAX_CODING_TASK_BYTES = 16 * 1024;
8
13
  /** Room reserved at the end of a composed task for lines the executor appends (e.g. the base commit). */
9
14
  export const CODING_TASK_TRAILER_RESERVE_BYTES = 256;
10
- export const MAX_CODING_SUMMARY_BYTES = 8 * 1024;
15
+ /**
16
+ * A coding run's summary (the agent's final message, posted as the PR body):
17
+ * longer text is cut at a line boundary with SUMMARY_TRUNCATED_MARKER rather
18
+ * than failing the run.
19
+ */
20
+ export const MAX_CODING_SUMMARY_BYTES = 64 * 1024;
21
+ export const SUMMARY_TRUNCATED_MARKER = "\n\n[summary truncated]";
11
22
  export const MAX_CODING_TESTS = 64;
12
23
  export const MAX_CODING_TEST_COMMAND_BYTES = 2 * 1024;
13
24
  export const MAX_TAG_BYTES = 32;
25
+ /** The workspace volume bounds every launcher enforces (docker-isolation.ts, kubernetes-isolation.ts). */
26
+ export const MIN_CODING_DISK_MB = 64;
27
+ export const MAX_CODING_DISK_MB = 32_768;
14
28
  /**
15
29
  * Coding-run services (docs/coding-services.md): the catalog name and version
16
30
  * grammar, shared by the repository's .wardby/services.yaml, the catalog, and
@@ -42,6 +56,42 @@ export const INVALID_SINGLE_LINE_CONTROL = /[\u0000-\u001F\u007F]/;
42
56
  export function byteLength(value) {
43
57
  return Buffer.byteLength(value, "utf8");
44
58
  }
59
+ /**
60
+ * `text` unchanged when `measure(text) <= max`; otherwise its longest prefix
61
+ * that fits with `marker` appended, cut back to the last line break when one
62
+ * is in the second half, and never inside a surrogate pair.
63
+ */
64
+ export function truncateText(text, max, measure = byteLength, marker = SUMMARY_TRUNCATED_MARKER) {
65
+ if (measure(text) <= max)
66
+ return text;
67
+ const room = max - measure(marker);
68
+ if (room <= 0)
69
+ return marker.trim();
70
+ let low = 0;
71
+ let high = text.length;
72
+ while (low < high) {
73
+ const mid = (low + high + 1) >> 1;
74
+ if (measure(text.slice(0, mid)) <= room)
75
+ low = mid;
76
+ else
77
+ high = mid - 1;
78
+ }
79
+ let cut = text.slice(0, low);
80
+ if (/[\uD800-\uDBFF]$/.test(cut))
81
+ cut = cut.slice(0, -1);
82
+ const lineBreak = cut.lastIndexOf("\n");
83
+ if (lineBreak > cut.length / 2)
84
+ cut = cut.slice(0, lineBreak);
85
+ return `${cut.trimEnd()}${marker}`;
86
+ }
87
+ /**
88
+ * A summary field: over-long text is redacted, then truncated (truncateText),
89
+ * then checked like any bounded text. Redacting first keeps a credential that
90
+ * straddles the cut from leaving its front half in the output.
91
+ */
92
+ function summaryText() {
93
+ return z.preprocess((value) => typeof value === "string" ? truncateText(redactTokenShapedValues(value), MAX_CODING_SUMMARY_BYTES) : value, boundedText(MAX_CODING_SUMMARY_BYTES));
94
+ }
45
95
  function boundedText(maxBytes, singleLine = false) {
46
96
  const invalidControl = singleLine ? INVALID_SINGLE_LINE_CONTROL : INVALID_MULTILINE_CONTROL;
47
97
  return z
@@ -83,6 +133,9 @@ const RESERVED_SERVICE_ENV_PREFIXES = [
83
133
  "ANTHROPIC_",
84
134
  "PIP_",
85
135
  "NPM_CONFIG_",
136
+ "YARN_",
137
+ "PNPM_",
138
+ "COREPACK_",
86
139
  "UV_",
87
140
  "GIT_",
88
141
  ];
@@ -321,8 +374,68 @@ const testResultSchema = z
321
374
  export const MAX_CODING_TURNS = 1000;
322
375
  /** The Claude Code worker's turn limit when the agent sets none; the run's budget and timeout are the real limits. */
323
376
  export const DEFAULT_CLAUDE_MAX_TURNS = 200;
377
+ /**
378
+ * The most output tokens per model reply on a Claude Code run when the agent sets
379
+ * none (CodingAgentProfile.maxOutputTokens); thinking counts toward it. The coding
380
+ * proxy reserves maxOutputTokens x the model's output price per request against
381
+ * the run budget, so higher values need a larger budget.
382
+ */
383
+ export const DEFAULT_CLAUDE_MAX_OUTPUT_TOKENS = 32_000;
384
+ /** Bounds on CodingAgentProfile.maxOutputTokens (Claude Code runs). */
385
+ export const MIN_CLAUDE_MAX_OUTPUT_TOKENS = 1024;
386
+ export const MAX_CLAUDE_MAX_OUTPUT_TOKENS = 128_000;
324
387
  /** Longest line a debug-traced worker writes to its log (src/coding-worker/debug-trace.ts). */
325
388
  export const MAX_DEBUG_TRACE_LINE_BYTES = 16 * 1024;
389
+ /** A traced run's total trace output when the agent sets no cap (CodingAgentProfile.debugTraceMaxMb), in MiB. */
390
+ export const DEFAULT_DEBUG_TRACE_MAX_MB = 2;
391
+ /** Upper bound on CodingAgentProfile.debugTraceMaxMb. */
392
+ export const MAX_DEBUG_TRACE_MAX_MB = 64;
393
+ /** C0 and C1 control characters, which have no place in a context file path. */
394
+ const CONTROL_CHARACTER = /[\u0000-\u001f\u007f-\u009f]/;
395
+ /**
396
+ * A repo-relative POSIX path with no empty, ".", or ".." segment, no backslash, no control
397
+ * character, and nothing under .git.
398
+ */
399
+ export function isSafeContextPath(path) {
400
+ if (path.length === 0 || path.length > 512 || path.startsWith("/") || path.includes("\\"))
401
+ return false;
402
+ if (CONTROL_CHARACTER.test(path))
403
+ return false;
404
+ const segments = path.split("/");
405
+ if (segments.some((segment) => segment === "" || segment === "." || segment === ".."))
406
+ return false;
407
+ return segments[0] !== ".git";
408
+ }
409
+ const ALLOWED_CONTEXT_FILES = new Set(["CLAUDE.md", ".claude/CLAUDE.md", "AGENTS.md"]);
410
+ const CONTEXT_SKILL_PATH = /^\.claude\/skills\/[^/]+\/SKILL\.md$/;
411
+ /**
412
+ * Whether a Claude Code context file may be shipped to (and written by) the worker: a safe path
413
+ * that is CLAUDE.md, .claude/CLAUDE.md, AGENTS.md, a .claude/skills/<name>/SKILL.md, or any other
414
+ * Markdown file outside every .claude directory that is not a CLAUDE.local.md. This keeps
415
+ * repository settings, hooks, MCP configuration, agents, commands, and personal memory out of
416
+ * Claude Code's native loading. Not part of the input schema: a refused file is dropped, and never
417
+ * fails the run.
418
+ */
419
+ export function isAllowedContextPath(path) {
420
+ if (!isSafeContextPath(path))
421
+ return false;
422
+ if (ALLOWED_CONTEXT_FILES.has(path) || CONTEXT_SKILL_PATH.test(path))
423
+ return true;
424
+ const segments = path.toLowerCase().split("/");
425
+ if (!path.endsWith(".md"))
426
+ return false;
427
+ if (segments.includes(".claude"))
428
+ return false;
429
+ return segments[segments.length - 1] !== "claude.local.md";
430
+ }
431
+ export const ClaudeContextFileSchema = z
432
+ .object({
433
+ path: z.string().refine(isSafeContextPath, "must be a safe repo-relative path"),
434
+ content: z
435
+ .string()
436
+ .refine((value) => Buffer.byteLength(value) <= CLAUDE_CONTEXT_LIMITS.maxFileBytes, "file too large"),
437
+ })
438
+ .strict();
326
439
  export const CodingTaskInputSchema = z
327
440
  .object({
328
441
  schemaVersion: z.literal(CODING_PROTOCOL_VERSION),
@@ -350,12 +463,44 @@ export const CodingTaskInputSchema = z
350
463
  * untraced run is unchanged for workers that predate it.
351
464
  */
352
465
  debugTrace: z.boolean().optional(),
466
+ /**
467
+ * Dependency cache (CodingAgentProfile.dependencyCache, fixed on the run at
468
+ * dispatch). The control plane writes the key only when true, so an input
469
+ * for any other run is unchanged for workers that predate it (their strict
470
+ * schema would refuse the key).
471
+ */
472
+ dependencyCache: z.literal(true).optional(),
473
+ /**
474
+ * Session resume (CodingAgentProfile.sessionResume, fixed on the run at dispatch): the worker keeps
475
+ * Claude Code's session and writes a sanitised transcript next to its result. Written only when
476
+ * true, so other runs' input is unchanged for workers that predate it.
477
+ */
478
+ sessionResume: z.literal(true).optional(),
479
+ /**
480
+ * The run's workspace volume size in MiB (the job's limits.diskMb), so the dependency cache can
481
+ * stay inside it: on Kubernetes the emptyDir sizeLimit is invisible to statfs. Written only with
482
+ * dependencyCache, so every other input is unchanged for workers that predate it.
483
+ */
484
+ diskMb: z.number().int().min(MIN_CODING_DISK_MB).max(MAX_CODING_DISK_MB).optional(),
485
+ /**
486
+ * Cap on a traced run's total trace output, in MiB (CodingRun.debugTraceMaxMb).
487
+ * Written only on a traced run whose agent sets one; absent means the
488
+ * worker default (DEFAULT_DEBUG_TRACE_MAX_MB).
489
+ */
490
+ debugTraceMaxMb: z.number().int().min(1).max(MAX_DEBUG_TRACE_MAX_MB).optional(),
353
491
  /**
354
492
  * Claude Code turn limit (CodingAgentProfile.maxTurns, fixed on the run at
355
493
  * dispatch). Absent means the worker default; written only when the agent
356
494
  * sets one, so other runs' input is unchanged for workers that predate it.
357
495
  */
358
496
  maxTurns: z.number().int().min(1).max(MAX_CODING_TURNS).optional(),
497
+ /**
498
+ * Claude Code output tokens per model reply (CodingAgentProfile.maxOutputTokens,
499
+ * fixed on the run at dispatch). Absent means the worker default
500
+ * (DEFAULT_CLAUDE_MAX_OUTPUT_TOKENS); written only when the agent sets one, so
501
+ * other runs' input is unchanged for workers that predate it.
502
+ */
503
+ maxOutputTokens: z.number().int().min(MIN_CLAUDE_MAX_OUTPUT_TOKENS).max(MAX_CLAUDE_MAX_OUTPUT_TOKENS).optional(),
359
504
  /**
360
505
  * Coding-run services started next to this run (docs/coding-services.md):
361
506
  * each one's catalog name and version, and the variables the agent's shells
@@ -364,6 +509,27 @@ export const CodingTaskInputSchema = z
364
509
  * predate it.
365
510
  */
366
511
  services: z.array(workerServiceSchema).min(1).max(MAX_CODING_SERVICES).optional(),
512
+ /**
513
+ * Load the repository's agent skills (CodingAgentProfile.repoSkills, fixed on the run at
514
+ * dispatch). Absent means true; the control plane writes the key only when false, so other
515
+ * runs' input is unchanged for workers that predate it.
516
+ */
517
+ repoSkills: z.boolean().optional(),
518
+ /**
519
+ * Claude Code runs (CodingAgentProfile.claudeBareMode, fixed on the run at dispatch): false
520
+ * turns off Claude Code's bare mode so it loads claudeContext natively. Absent means true;
521
+ * written only when false.
522
+ */
523
+ claudeBareMode: z.boolean().optional(),
524
+ /**
525
+ * Claude Code runs: the repository's CLAUDE.md, its @imports, and (when repoSkills) each
526
+ * .claude/skills/<name>/SKILL.md, read by the control plane from the prepared workspace.
527
+ * Absent when there is nothing to load.
528
+ */
529
+ claudeContext: z
530
+ .object({ files: z.array(ClaudeContextFileSchema).min(1).max(CLAUDE_CONTEXT_LIMITS.maxFiles) })
531
+ .strict()
532
+ .optional(),
367
533
  })
368
534
  .strict()
369
535
  .superRefine((value, ctx) => {
@@ -375,27 +541,161 @@ export const CodingTaskInputSchema = z
375
541
  message: "must match wardby/run-<runId> (or wardby/run-<continuationOf.runId>)",
376
542
  });
377
543
  }
544
+ if (value.diskMb !== undefined && value.dependencyCache !== true) {
545
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["diskMb"], message: "only with dependencyCache" });
546
+ }
378
547
  const names = (value.services ?? []).map((service) => service.name);
379
548
  if (new Set(names).size !== names.length) {
380
549
  ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["services"], message: "must name each service once" });
381
550
  }
551
+ const contextFiles = value.claudeContext?.files ?? [];
552
+ const paths = contextFiles.map((file) => file.path);
553
+ if (new Set(paths).size !== paths.length) {
554
+ ctx.addIssue({
555
+ code: z.ZodIssueCode.custom,
556
+ path: ["claudeContext", "files"],
557
+ message: "must name each path once",
558
+ });
559
+ }
560
+ const total = contextFiles.reduce((sum, file) => sum + Buffer.byteLength(file.content), 0);
561
+ if (total > CLAUDE_CONTEXT_LIMITS.maxTotalBytes) {
562
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["claudeContext", "files"], message: "context too large" });
563
+ }
382
564
  });
383
- export const CodingAgentOutputSchema = z
384
- .object({
565
+ const agentOutputFields = {
385
566
  schemaVersion: z.literal(CODING_PROTOCOL_VERSION),
386
567
  runId: runIdSchema,
387
568
  outcome: z.enum(["changes_ready", "no_changes", "budget_exhausted"]),
388
- summary: boundedText(MAX_CODING_SUMMARY_BYTES),
569
+ summary: summaryText(),
389
570
  tests: z.array(testResultSchema).max(MAX_CODING_TESTS),
390
571
  // Model-written, so normalized rather than rejected; see normalizeCodingTag.
391
572
  tag: z.preprocess(normalizeCodingTag, tagSchema),
573
+ };
574
+ function redactAgentOutput(value) {
575
+ return {
576
+ ...value,
577
+ summary: redactTokenShapedValues(value.summary),
578
+ tests: value.tests.map((test) => ({ ...test, command: redactTokenShapedValues(test.command) })),
579
+ ...(value.tag !== undefined ? { tag: redactTokenShapedValues(value.tag) } : {}),
580
+ };
581
+ }
582
+ /** What the model returns. Strict: it can never carry a worker-written field such as dependencyCache. */
583
+ export const CodingAgentOutputSchema = z.object(agentOutputFields).strict().transform(redactAgentOutput);
584
+ // ------------------------------------------------------------ dependency cache report
585
+ /**
586
+ * The run's dependency cache (src/coding-worker/dependency-cache.mjs), as the worker reports it in
587
+ * result.json and the control plane stores it (CodingRun.dependencyCacheResult, get_run). Worker-
588
+ * written, never model-written: the model's output schema above refuses the key. Only stable codes,
589
+ * repository folder names and bounded numbers; never npm output.
590
+ */
591
+ export const MAX_DEPENDENCY_CACHE_PROJECTS = 4;
592
+ export const DEPENDENCY_CACHE_OUTCOMES = ["hit", "nearest", "cold", "skipped", "refused"];
593
+ export const DEPENDENCY_CACHE_REBUILD_OUTCOMES = ["ok", "failed", "timeout", "skipped", "unsealed"];
594
+ const DEPENDENCY_CACHE_CODE = /^[a-z][a-z0-9_]{0,63}$/;
595
+ /** "." or up to three folder segments: the proxy's project-path rule (dependency-cache/key.ts). */
596
+ export const DEPENDENCY_CACHE_PATH = /^(?:\.|[A-Za-z0-9_@+-][A-Za-z0-9._@+-]{0,99}(?:\/[A-Za-z0-9_@+-][A-Za-z0-9._@+-]{0,99}){0,2})$/;
597
+ const MAX_DEPENDENCY_CACHE_NUMBER = Number.MAX_SAFE_INTEGER;
598
+ const dependencyCacheCount = z.number().int().min(0).max(MAX_DEPENDENCY_CACHE_NUMBER);
599
+ const dependencyCacheProjectSchema = z
600
+ .object({
601
+ path: z
602
+ .string()
603
+ .regex(DEPENDENCY_CACHE_PATH)
604
+ .refine((path) => !path.split("/").includes("node_modules")),
605
+ result: z.enum(DEPENDENCY_CACHE_OUTCOMES),
606
+ key: z
607
+ .string()
608
+ .regex(/^[a-z0-9]{1,64}$/)
609
+ .optional(),
610
+ sizeBytes: dependencyCacheCount.optional(),
611
+ restoreMs: dependencyCacheCount.optional(),
612
+ installMs: dependencyCacheCount.optional(),
613
+ reason: z.string().regex(DEPENDENCY_CACHE_CODE).optional(),
614
+ rebuild: z.enum(DEPENDENCY_CACHE_REBUILD_OUTCOMES).optional(),
615
+ })
616
+ .strict();
617
+ export const DependencyCacheReportSchema = z
618
+ .object({
619
+ projects: z.array(dependencyCacheProjectSchema).max(MAX_DEPENDENCY_CACHE_PROJECTS),
620
+ /** Projects left out of `projects` (over the cap, or not reportable). */
621
+ omitted: z.number().int().min(1).max(MAX_DEPENDENCY_CACHE_NUMBER).optional(),
622
+ /** Set when no project could be reported at all: a stable code (timeout, internal_error, worker_error, ...). */
623
+ reason: z.string().regex(DEPENDENCY_CACHE_CODE).optional(),
624
+ })
625
+ .strict();
626
+ const INSTALLED_OUTCOMES = new Set(["hit", "nearest", "cold"]);
627
+ const RESTORED_OUTCOMES = new Set(["hit", "nearest"]);
628
+ const MAX_RAW_DEPENDENCY_CACHE_PROJECTS = 1024;
629
+ /**
630
+ * Bounds whatever the module (or a tool runner over its socket) returned into a report: projects
631
+ * that don't fit the schema are dropped and counted in `omitted`; past the cap, installed and
632
+ * refused projects are kept ahead of skipped ones, in their original order. A value that isn't a
633
+ * report at all becomes `{ projects: [], reason: "report_invalid" }`. Never throws.
634
+ */
635
+ export function sanitizeDependencyCacheReport(value) {
636
+ const invalid = () => ({ projects: [], reason: "report_invalid" });
637
+ if (!value || typeof value !== "object" || Array.isArray(value))
638
+ return invalid();
639
+ const raw = value;
640
+ if (!Array.isArray(raw.projects) || raw.projects.length > MAX_RAW_DEPENDENCY_CACHE_PROJECTS)
641
+ return invalid();
642
+ if (Object.keys(raw).some((key) => key !== "projects" && key !== "reason" && key !== "omitted"))
643
+ return invalid();
644
+ const valid = [];
645
+ for (const project of raw.projects) {
646
+ const parsed = dependencyCacheProjectSchema.safeParse(project);
647
+ if (parsed.success)
648
+ valid.push(parsed.data);
649
+ }
650
+ const kept = valid
651
+ .map((project, index) => ({ project, index, rank: project.result === "skipped" ? 1 : 0 }))
652
+ .sort((a, b) => a.rank - b.rank || a.index - b.index)
653
+ .slice(0, MAX_DEPENDENCY_CACHE_PROJECTS)
654
+ .sort((a, b) => a.index - b.index)
655
+ .map((entry) => entry.project);
656
+ const earlier = typeof raw.omitted === "number" && Number.isSafeInteger(raw.omitted) && raw.omitted > 0;
657
+ const omitted = Math.min(MAX_DEPENDENCY_CACHE_NUMBER, raw.projects.length - kept.length + (earlier ? raw.omitted : 0));
658
+ const reason = typeof raw.reason === "string" && DEPENDENCY_CACHE_CODE.test(raw.reason) ? raw.reason : undefined;
659
+ return {
660
+ projects: kept,
661
+ ...(omitted > 0 ? { omitted } : {}),
662
+ ...(reason ? { reason } : {}),
663
+ };
664
+ }
665
+ /** Folders the dependency cache installed (hit, nearest or cold), "." for the repository root. */
666
+ export function installedDependencyFolders(report) {
667
+ return (report?.projects ?? []).filter((project) => INSTALLED_OUTCOMES.has(project.result)).map((p) => p.path);
668
+ }
669
+ /** Folders whose node_modules came from a cached snapshot (hit or nearest): the PR body's line. */
670
+ export function restoredDependencyFolders(report) {
671
+ return (report?.projects ?? []).filter((project) => RESTORED_OUTCOMES.has(project.result)).map((p) => p.path);
672
+ }
673
+ /** The one line both workers add to the agent's prompt when dependencies were installed; else undefined. */
674
+ export function dependencyCacheTaskNote(report) {
675
+ const folders = installedDependencyFolders(report);
676
+ if (folders.length === 0)
677
+ return undefined;
678
+ const named = folders.map((path) => (path === "." ? "the repo root" : path)).join(", ");
679
+ return `Dependencies are pre-installed from the committed lockfile in: ${named}. Don't run \`npm ci\` there; add packages with a single install command.`;
680
+ }
681
+ /**
682
+ * What a worker writes to result.json and the control plane reads back: the model's output plus
683
+ * worker-written fields. `dependencyCache` is written only on a run whose input asked for it, so an
684
+ * older control plane never sees the key; a malformed one is bounded (sanitizeDependencyCacheReport)
685
+ * rather than failing the run.
686
+ */
687
+ export const CodingWorkerOutputSchema = z
688
+ .object({
689
+ ...agentOutputFields,
690
+ dependencyCache: z
691
+ .unknown()
692
+ .optional()
693
+ .transform((value) => (value === undefined ? undefined : sanitizeDependencyCacheReport(value))),
392
694
  })
393
695
  .strict()
394
- .transform((value) => ({
395
- ...value,
396
- summary: redactTokenShapedValues(value.summary),
397
- tests: value.tests.map((test) => ({ ...test, command: redactTokenShapedValues(test.command) })),
398
- ...(value.tag !== undefined ? { tag: redactTokenShapedValues(value.tag) } : {}),
696
+ .transform(({ dependencyCache, ...value }) => ({
697
+ ...redactAgentOutput(value),
698
+ ...(dependencyCache !== undefined ? { dependencyCache } : {}),
399
699
  }));
400
700
  const pullRequestUrlSchema = z
401
701
  .string()
@@ -429,7 +729,7 @@ export const CodingRunResultSchema = z
429
729
  .optional(),
430
730
  pullRequestUrl: pullRequestUrlSchema.optional(),
431
731
  pullRequestNumber: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),
432
- summary: boundedText(MAX_CODING_SUMMARY_BYTES),
732
+ summary: summaryText(),
433
733
  tests: z.array(testResultSchema).max(MAX_CODING_TESTS),
434
734
  usage: usageSchema,
435
735
  tag: tagSchema,
@@ -486,7 +786,10 @@ export function publicCodingRunResult(value) {
486
786
  */
487
787
  const PEM_PRIVATE_KEY = /-----BEGIN (?:[A-Z ]{1,32} )?PRIVATE KEY-----[\s\S]{0,6144}?-----END (?:[A-Z ]{1,32} )?PRIVATE KEY-----/g;
488
788
  const TOKEN_PATTERNS = [
489
- /sk-(?:ant-)?[A-Za-z0-9_-]{16,}/gi,
789
+ // Not after a letter or digit: "task-…", "risk-…" and "disk-…" words are
790
+ // not keys, and redacting them garbled run output and failed knowledge
791
+ // checks on file names such as "mcp-task-cancellation-stamp.md".
792
+ /(?<![A-Za-z0-9])sk-(?:ant-)?[A-Za-z0-9_-]{16,}/gi,
490
793
  /github_pat_[A-Za-z0-9_]{20,}/g,
491
794
  /gh[pousr]_[A-Za-z0-9]{20,}/g,
492
795
  /AKIA[0-9A-Z]{16}/g,
@@ -562,8 +865,8 @@ export function redactTokenShapedValues(value) {
562
865
  export function redactAndTruncate(value, limit) {
563
866
  return redactTokenShapedValues(value.slice(0, limit + MAX_REDACTED_SPAN)).slice(0, limit);
564
867
  }
565
- function parseJsonWithoutDuplicateKeys(text) {
566
- if (byteLength(text) > MAX_CODING_ARTIFACT_BYTES)
868
+ function parseJsonWithoutDuplicateKeys(text, maxBytes = MAX_CODING_ARTIFACT_BYTES) {
869
+ if (byteLength(text) > maxBytes)
567
870
  throw new Error("coding_artifact_size_limit");
568
871
  let offset = 0;
569
872
  const whitespace = () => {
@@ -659,11 +962,15 @@ function parseJsonWithoutDuplicateKeys(text) {
659
962
  }
660
963
  }
661
964
  export function parseCodingTaskInputJson(text) {
662
- return CodingTaskInputSchema.parse(parseJsonWithoutDuplicateKeys(text));
965
+ return CodingTaskInputSchema.parse(parseJsonWithoutDuplicateKeys(text, MAX_CODING_INPUT_BYTES));
663
966
  }
664
967
  export function parseCodingAgentOutputJson(text) {
665
968
  return CodingAgentOutputSchema.parse(parseJsonWithoutDuplicateKeys(text));
666
969
  }
970
+ /** The control plane's read of a worker's result.json (see CodingWorkerOutputSchema). */
971
+ export function parseCodingWorkerOutputJson(text) {
972
+ return CodingWorkerOutputSchema.parse(parseJsonWithoutDuplicateKeys(text));
973
+ }
667
974
  export function parseCodingRunResultJson(text) {
668
975
  return CodingRunResultSchema.parse(parseJsonWithoutDuplicateKeys(text));
669
976
  }
@@ -0,0 +1,3 @@
1
+ export declare const REDACTED = "[REDACTED]";
2
+ /** Redacts the given exact secrets, then every token-shaped value. */
3
+ export declare function redactSecrets(text: string, secrets?: readonly string[]): string;
@@ -0,0 +1,12 @@
1
+ import { redactExactSecretValues } from "../core/secret-spans.js";
2
+ import { redactTokenShapedValues } from "./protocol.js";
3
+ export const REDACTED = "[REDACTED]";
4
+ /** Shapes protocol.ts's list does not cover, or covers only at longer lengths. */
5
+ const EXTRA_TOKEN_PATTERNS = [/rrp_[A-Za-z0-9_-]{8,}/g, /rrg_[A-Za-z0-9_-]{8,}/g, /\bBearer\s+[^\s"',;]+/gi];
6
+ /** Redacts the given exact secrets, then every token-shaped value. */
7
+ export function redactSecrets(text, secrets = []) {
8
+ // The shared span-union redactor; any non-empty value counts here, as it always has.
9
+ let redacted = redactExactSecretValues(text, secrets, { marker: REDACTED, minLength: 1 });
10
+ redacted = redactTokenShapedValues(redacted);
11
+ return EXTRA_TOKEN_PATTERNS.reduce((value, pattern) => value.replace(pattern, REDACTED), redacted);
12
+ }
@@ -1,9 +1,21 @@
1
+ /**
2
+ * The per-agent package allowlist and policy model: parsing raw allowlist
3
+ * strings (via each ecosystem's adapter) into `AllowlistEntry` values, and
4
+ * matching a normalized package name against them.
5
+ */
6
+ import { z } from "zod";
1
7
  import type { AllowlistEntry, RegistryAdapter } from "./types.js";
2
8
  export type PackageAllowlist = Readonly<Record<string, readonly string[]>>;
3
9
  export interface PackagePolicy {
4
10
  minReleaseAgeDays: number;
11
+ /** Advisory ids (GHSA-…, CVE-…) whose installs this agent may proceed with; malware (MAL-…) is never acceptable. */
12
+ acceptedAdvisories: readonly string[];
5
13
  }
6
14
  export declare const DEFAULT_MIN_RELEASE_AGE_DAYS = 3;
15
+ export declare const ACCEPTED_ADVISORY_ID: RegExp;
16
+ export declare const MAX_ACCEPTED_ADVISORIES = 32;
17
+ /** The one definition of the acceptedAdvisories field, shared by the policy and the coding profile. */
18
+ export declare const acceptedAdvisoriesSchema: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodString>>;
7
19
  export declare function resolvePolicy(value: unknown): PackagePolicy;
8
20
  export declare function parseAllowlist(allowlist: PackageAllowlist, adapters: ReadonlyMap<string, RegistryAdapter>): Map<string, AllowlistEntry[]>;
9
21
  export declare function matchRoot(entries: readonly AllowlistEntry[], normalizedName: string): AllowlistEntry | undefined;
@@ -5,8 +5,21 @@
5
5
  */
6
6
  import { z } from "zod";
7
7
  export const DEFAULT_MIN_RELEASE_AGE_DAYS = 3;
8
+ export const ACCEPTED_ADVISORY_ID = /^[A-Z][A-Z0-9]*-[A-Za-z0-9-]{3,64}$/;
9
+ export const MAX_ACCEPTED_ADVISORIES = 32;
10
+ /** The one definition of the acceptedAdvisories field, shared by the policy and the coding profile. */
11
+ export const acceptedAdvisoriesSchema = z
12
+ .array(z
13
+ .string()
14
+ .refine((id) => !id.startsWith("MAL-"), "acceptedAdvisories: malware advisories (MAL-…) can never be accepted.")
15
+ .pipe(z.string().regex(ACCEPTED_ADVISORY_ID, "must look like GHSA-xxxx-xxxx-xxxx or CVE-2026-12345")))
16
+ .max(MAX_ACCEPTED_ADVISORIES)
17
+ .refine((ids) => new Set(ids).size === ids.length, "must not contain duplicates");
8
18
  const PolicySchema = z
9
- .object({ minReleaseAgeDays: z.number().int().min(0).max(30).default(DEFAULT_MIN_RELEASE_AGE_DAYS) })
19
+ .object({
20
+ minReleaseAgeDays: z.number().int().min(0).max(30).default(DEFAULT_MIN_RELEASE_AGE_DAYS),
21
+ acceptedAdvisories: acceptedAdvisoriesSchema.default([]),
22
+ })
10
23
  .strict();
11
24
  export function resolvePolicy(value) {
12
25
  return PolicySchema.parse(value ?? {});
@@ -0,0 +1,153 @@
1
+ export declare const PACKAGE_AUDIT_MODES: readonly ["audit", "full"];
2
+ export type PackageAuditMode = (typeof PACKAGE_AUDIT_MODES)[number];
3
+ /** The window `packageAuditMode` opens when `packageAuditMinutes` is omitted: 24 hours. */
4
+ export declare const DEFAULT_PACKAGE_AUDIT_MINUTES: number;
5
+ /** The longest window one update may open: 7 days. */
6
+ export declare const MAX_PACKAGE_AUDIT_MINUTES: number;
7
+ /**
8
+ * How an audited package reached the run: named by the project or a lockfile
9
+ * project (`top-level`), declared by an audited package (`transitive`),
10
+ * fetched with no metadata or plan to prove a parent (`unknown`), or on the
11
+ * allowlist graph and recorded only for advisories served past (`allowed`).
12
+ */
13
+ export type AuditRelation = "top-level" | "transitive" | "unknown" | "allowed";
14
+ export interface AuditAdvisory {
15
+ id: string;
16
+ severity: string;
17
+ summary: string;
18
+ }
19
+ /** Why one request or plan approval was audited; `advisories` only for full-mode waivers. */
20
+ export interface PackageAuditVerdict {
21
+ relation: AuditRelation;
22
+ /** The top-level audited package that pulled it in (transitive only). */
23
+ via?: string;
24
+ advisories?: AuditAdvisory[];
25
+ }
26
+ /** A RegistryAuditRecord row as read back (advisories is untrusted JSON). */
27
+ export interface PackageAuditRow {
28
+ ecosystem: string;
29
+ name: string;
30
+ version: string;
31
+ relation: string;
32
+ via: string | null;
33
+ sizeBytes: number | null;
34
+ advisories: unknown;
35
+ }
36
+ /** One audited package version as get_run, the PR body and the status comment show it. */
37
+ export interface PackageAuditEntry {
38
+ ecosystem: string;
39
+ name: string;
40
+ version: string;
41
+ size: number | null;
42
+ relation: AuditRelation;
43
+ via?: string;
44
+ advisories?: AuditAdvisory[];
45
+ }
46
+ export declare class PackageAuditPatchError extends Error {
47
+ }
48
+ export declare function isPackageAuditMode(value: unknown): value is PackageAuditMode;
49
+ /** Whether a stored mode is in force: set, and its window has not ended. */
50
+ export declare function isPackageAuditActive(mode: string | null | undefined, until: Date | null | undefined, now: Date): mode is PackageAuditMode;
51
+ /** The get_agent / update_agent warning while a mode is in force. */
52
+ export declare function packageAuditActiveWarning(mode: PackageAuditMode, until: Date): string;
53
+ /**
54
+ * update_agent's packageAuditMode / packageAuditMinutes semantics: a mode
55
+ * opens a window of the given minutes (24 hours by default), minutes alone
56
+ * re-arm the stored mode, and null clears both. Returns undefined when the
57
+ * patch names neither field; throws PackageAuditPatchError for a 400.
58
+ */
59
+ export declare function resolvePackageAuditPatch(stored: {
60
+ mode: PackageAuditMode | null;
61
+ }, patch: {
62
+ packageAuditMode?: PackageAuditMode | null;
63
+ packageAuditMinutes?: number;
64
+ }, now: Date): {
65
+ mode: PackageAuditMode | null;
66
+ until: Date | null;
67
+ } | undefined;
68
+ export declare const MAX_AUDIT_SUMMARY_CHARS = 200;
69
+ /** An advisory summary (OSV free text) as plain, single-line, bounded text. */
70
+ export declare function sanitizeAuditSummary(value: unknown): string;
71
+ /** Untrusted advisory JSON reduced to well-formed, non-malware entries (at most 16, distinct ids). */
72
+ export declare function sanitizeAuditAdvisories(value: unknown): AuditAdvisory[];
73
+ /** A stored verdict (RegistryApprovedVersion.audit, untrusted JSON) read back; null when absent or malformed. */
74
+ export declare function parsePackageAuditVerdict(value: unknown): PackageAuditVerdict | null;
75
+ export interface PackageAuditSummary {
76
+ entries: PackageAuditEntry[];
77
+ /** Names to add to the allowlist: top-level, per ecosystem, first-seen order. */
78
+ toApprove: {
79
+ ecosystem: string;
80
+ name: string;
81
+ dependencies: number;
82
+ }[];
83
+ /** Names recorded only with relation `unknown` (a direct download, or after a plan fallback): they
84
+ * may be dependencies of allowlisted packages, so they are listed apart and approved only by name. */
85
+ unknown: {
86
+ ecosystem: string;
87
+ name: string;
88
+ dependencies: number;
89
+ }[];
90
+ advisoryRows: {
91
+ ecosystem: string;
92
+ name: string;
93
+ version: string;
94
+ advisory: AuditAdvisory;
95
+ }[];
96
+ }
97
+ /**
98
+ * A run's (or a PR's runs') audit rows deduplicated on ecosystem + name +
99
+ * version (advisories unioned) and ordered top-level, unknown, transitive,
100
+ * allowed. An unrecognised relation reads as `unknown`, so it is listed to
101
+ * approve rather than hidden.
102
+ */
103
+ export declare function summarizePackageAudit(rows: readonly PackageAuditRow[]): PackageAuditSummary;
104
+ /** How a name recorded with relation `unknown` is labelled wherever it is listed. */
105
+ export declare const UNKNOWN_RELATION_LABEL = "Relation unknown \u2014 may be a dependency; approve only if needed directly";
106
+ /**
107
+ * The package audit block for a PR body (`format: "pr"`, a `[!CAUTION]`
108
+ * banner plus the names to approve and, in full mode, the advisories served
109
+ * past), a status comment (`format: "status"`, short), or Slack mrkdwn
110
+ * (`slack`, already escaped). Control-plane text only: names, versions and
111
+ * ids pass through codeSpan.
112
+ */
113
+ export declare function packageAuditWording(mode: PackageAuditMode, summary: PackageAuditSummary, opts?: {
114
+ slack?: boolean;
115
+ format?: "pr" | "status";
116
+ }): string;
117
+ /** What a short audit notice needs (a status comment, a Slack message): a bounded, count-only digest.
118
+ * A type alias, not an interface, so it stays assignable to a stored JSON payload. */
119
+ export type PackageAuditDigest = {
120
+ /** Names to approve, at most 10. */
121
+ toApprove: {
122
+ ecosystem: string;
123
+ name: string;
124
+ }[];
125
+ /** Names to approve beyond those listed. */
126
+ moreToApprove: number;
127
+ /** Names with relation `unknown`, at most 10, listed apart (see PackageAuditSummary.unknown). */
128
+ unknown: {
129
+ ecosystem: string;
130
+ name: string;
131
+ }[];
132
+ moreUnknown: number;
133
+ /** Dependencies of audited packages, recorded transitive. */
134
+ transitive: number;
135
+ /** Advisories full mode served past (0 in audit mode). */
136
+ advisories: number;
137
+ };
138
+ export declare function packageAuditDigest(mode: PackageAuditMode, summary: PackageAuditSummary): PackageAuditDigest;
139
+ /** The short audit notice as GitHub/Jira Markdown or, with `slack`, Slack mrkdwn (already escaped). */
140
+ export declare function packageAuditStatusText(mode: PackageAuditMode, digest: PackageAuditDigest, slack: boolean): string;
141
+ /** A run's (or a pull request's runs') package audit: the mode and what it recorded. */
142
+ export interface PackageAuditReport {
143
+ mode: PackageAuditMode;
144
+ entries: readonly PackageAuditEntry[];
145
+ }
146
+ /** Entries back as rows, so several runs' entries summarize (dedup, order) like one run's. */
147
+ export declare function packageAuditRows(entries: readonly PackageAuditEntry[]): PackageAuditRow[];
148
+ /**
149
+ * Several runs' audit reports as one (a pull request's runs): entries merged
150
+ * on ecosystem + name + version with advisories unioned, and the strongest
151
+ * mode seen (`full` over `audit`). Undefined when no run had the mode.
152
+ */
153
+ export declare function mergePackageAuditReports(reports: readonly (PackageAuditReport | undefined)[]): PackageAuditReport | undefined;