@wardby/cli 0.6.0 → 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 (576) hide show
  1. package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
  2. package/dist/claude-coding-worker/driver.d.ts +21 -3
  3. package/dist/claude-coding-worker/driver.js +125 -17
  4. package/dist/claude-coding-worker/main.js +34 -6
  5. package/dist/claude-coding-worker/sdk.js +12 -1
  6. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  7. package/dist/claude-coding-worker/tool-socket.js +111 -0
  8. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  9. package/dist/claude-coding-worker/transcript.js +77 -0
  10. package/dist/cli-help.d.ts +1 -1
  11. package/dist/cli-help.js +1 -0
  12. package/dist/cli.js +24 -10
  13. package/dist/coding/continuation-wording.d.ts +35 -0
  14. package/dist/coding/continuation-wording.js +73 -0
  15. package/dist/coding/linked-issue-note.d.ts +23 -0
  16. package/dist/coding/linked-issue-note.js +47 -0
  17. package/dist/coding/merge-wording.d.ts +28 -0
  18. package/dist/coding/merge-wording.js +78 -0
  19. package/dist/coding/pr-description-note.d.ts +9 -0
  20. package/dist/coding/pr-description-note.js +32 -0
  21. package/dist/coding/profile.d.ts +46 -126
  22. package/dist/coding/profile.js +45 -4
  23. package/dist/coding/protected-path-wording.d.ts +8 -0
  24. package/dist/coding/protected-path-wording.js +1 -1
  25. package/dist/coding/protocol.d.ts +264 -346
  26. package/dist/coding/protocol.js +235 -12
  27. package/dist/coding/redact.d.ts +3 -0
  28. package/dist/coding/redact.js +12 -0
  29. package/dist/coding/registry/allowlist.d.ts +12 -0
  30. package/dist/coding/registry/allowlist.js +14 -1
  31. package/dist/coding/registry/audit-mode.d.ts +153 -0
  32. package/dist/coding/registry/audit-mode.js +304 -0
  33. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  34. package/dist/coding/registry/lockfile-shared.js +128 -0
  35. package/dist/coding/registry/lockfiles.js +1 -1
  36. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  37. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  38. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  39. package/dist/coding/registry/npm-lockfile.js +4 -6
  40. package/dist/coding/registry/npm.js +78 -8
  41. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  42. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  43. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  44. package/dist/coding/registry/pypi-plan.js +406 -0
  45. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  46. package/dist/coding/registry/pypi-requirements.js +155 -0
  47. package/dist/coding/registry/pypi.d.ts +3 -27
  48. package/dist/coding/registry/pypi.js +40 -154
  49. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  50. package/dist/coding/registry/refusal-hints.js +61 -0
  51. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  52. package/dist/coding/registry/refusal-wording.js +56 -0
  53. package/dist/coding/registry/report.d.ts +70 -8
  54. package/dist/coding/registry/report.js +112 -5
  55. package/dist/coding/registry/types.d.ts +58 -8
  56. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  57. package/dist/coding/registry/yarn-lockfile.js +367 -0
  58. package/dist/coding/services/catalog.d.ts +37 -351
  59. package/dist/coding/transcript/claude-code.d.ts +13 -0
  60. package/dist/coding/transcript/claude-code.js +273 -0
  61. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  62. package/dist/coding/transcript/download-protocol.js +18 -0
  63. package/dist/coding/transcript/format.d.ts +20 -0
  64. package/dist/coding/transcript/format.js +32 -0
  65. package/dist/coding/transcript/recorder.d.ts +51 -0
  66. package/dist/coding/transcript/recorder.js +225 -0
  67. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  68. package/dist/coding/transcript/resume/checkout.js +203 -0
  69. package/dist/coding/transcript/resume/command.d.ts +17 -0
  70. package/dist/coding/transcript/resume/command.js +176 -0
  71. package/dist/coding/transcript/resume/download.d.ts +20 -0
  72. package/dist/coding/transcript/resume/download.js +153 -0
  73. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  74. package/dist/coding/transcript/resume/launch.js +128 -0
  75. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  76. package/dist/coding/transcript/resume/session-file.js +79 -0
  77. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  78. package/dist/coding/transcript/resume/stand-in.js +49 -0
  79. package/dist/coding-worker/artifact.d.ts +8 -3
  80. package/dist/coding-worker/artifact.js +3 -1
  81. package/dist/coding-worker/debug-trace.d.ts +6 -5
  82. package/dist/coding-worker/debug-trace.js +13 -18
  83. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  84. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  85. package/dist/coding-worker/driver.d.ts +4 -3
  86. package/dist/coding-worker/driver.js +116 -38
  87. package/dist/coding-worker/errors.d.ts +1 -0
  88. package/dist/coding-worker/errors.js +32 -0
  89. package/dist/coding-worker/task-note.d.ts +11 -0
  90. package/dist/coding-worker/task-note.js +13 -0
  91. package/dist/coding-worker/types.d.ts +11 -0
  92. package/dist/config/dependency-cache.d.ts +23 -0
  93. package/dist/config/dependency-cache.js +32 -0
  94. package/dist/config/providers.d.ts +12 -3
  95. package/dist/config/providers.js +55 -5
  96. package/dist/config/test-simulators.d.ts +82 -0
  97. package/dist/config/test-simulators.js +305 -0
  98. package/dist/core/async-context.d.ts +2 -0
  99. package/dist/core/async-context.js +12 -0
  100. package/dist/core/budget-events.d.ts +108 -0
  101. package/dist/core/budget-events.js +346 -0
  102. package/dist/core/budget-groups.d.ts +50 -1
  103. package/dist/core/budget-groups.js +236 -27
  104. package/dist/core/budget-stopped-head.d.ts +46 -0
  105. package/dist/core/budget-stopped-head.js +81 -0
  106. package/dist/core/budget-topup.d.ts +51 -0
  107. package/dist/core/budget-topup.js +156 -0
  108. package/dist/core/budget-wording.d.ts +16 -2
  109. package/dist/core/budget-wording.js +40 -2
  110. package/dist/core/coding-queue.d.ts +2 -1
  111. package/dist/core/coding-queue.js +7 -0
  112. package/dist/core/cron.d.ts +19 -1
  113. package/dist/core/cron.js +17 -0
  114. package/dist/core/datastores.js +1 -1
  115. package/dist/core/deferred-coding.d.ts +14 -0
  116. package/dist/core/deferred-coding.js +62 -0
  117. package/dist/core/delegation-child.d.ts +25 -0
  118. package/dist/core/delegation-child.js +37 -0
  119. package/dist/core/dispatch.d.ts +42 -0
  120. package/dist/core/dispatch.js +131 -56
  121. package/dist/core/engine-native.js +1 -1
  122. package/dist/core/error-code.d.ts +38 -0
  123. package/dist/core/error-code.js +168 -0
  124. package/dist/core/grants.d.ts +19 -6
  125. package/dist/core/grants.js +55 -6
  126. package/dist/core/host-events.d.ts +18 -2
  127. package/dist/core/host-events.js +284 -24
  128. package/dist/core/host-status.d.ts +85 -3
  129. package/dist/core/host-status.js +298 -20
  130. package/dist/core/issue-bridge.d.ts +50 -6
  131. package/dist/core/issue-bridge.js +124 -33
  132. package/dist/core/issue-events.d.ts +1 -1
  133. package/dist/core/issue-events.js +4 -10
  134. package/dist/core/issue-status.d.ts +1 -1
  135. package/dist/core/issue-status.js +54 -26
  136. package/dist/core/logger.d.ts +5 -0
  137. package/dist/core/logger.js +14 -1
  138. package/dist/core/lost-run-children.d.ts +6 -0
  139. package/dist/core/lost-run-children.js +32 -0
  140. package/dist/core/mark-ready.d.ts +34 -0
  141. package/dist/core/mark-ready.js +152 -0
  142. package/dist/core/markdown-code.d.ts +8 -0
  143. package/dist/core/markdown-code.js +107 -0
  144. package/dist/core/memory-tools.js +7 -0
  145. package/dist/core/merge-order-check.d.ts +2 -1
  146. package/dist/core/merge-order-check.js +8 -1
  147. package/dist/core/notification-templates.d.ts +1 -7
  148. package/dist/core/notification-templates.js +36 -2
  149. package/dist/core/pull-request-state-sync.js +2 -2
  150. package/dist/core/reconciler.d.ts +4 -3
  151. package/dist/core/reconciler.js +8 -1
  152. package/dist/core/related-pull-requests.d.ts +11 -3
  153. package/dist/core/related-pull-requests.js +27 -14
  154. package/dist/core/reply-parts.d.ts +21 -0
  155. package/dist/core/reply-parts.js +73 -0
  156. package/dist/core/review-fix.d.ts +1 -1
  157. package/dist/core/review-fix.js +2 -1
  158. package/dist/core/review-host-checks.d.ts +1 -1
  159. package/dist/core/review-host-tools.d.ts +3 -0
  160. package/dist/core/review-host-tools.js +99 -13
  161. package/dist/core/review-reads.d.ts +55 -0
  162. package/dist/core/review-reads.js +233 -0
  163. package/dist/core/run-status.d.ts +12 -0
  164. package/dist/core/run-status.js +12 -0
  165. package/dist/core/runner.d.ts +80 -34
  166. package/dist/core/runner.js +439 -144
  167. package/dist/core/schedule-start.d.ts +12 -0
  168. package/dist/core/schedule-start.js +14 -0
  169. package/dist/core/secret-broker-config.d.ts +10 -74
  170. package/dist/core/secret-guard.d.ts +46 -0
  171. package/dist/core/secret-guard.js +104 -0
  172. package/dist/core/secret-guarded-stores.d.ts +12 -0
  173. package/dist/core/secret-guarded-stores.js +41 -0
  174. package/dist/core/secret-spans.d.ts +50 -0
  175. package/dist/core/secret-spans.js +94 -0
  176. package/dist/core/stop-run.d.ts +46 -0
  177. package/dist/core/stop-run.js +61 -0
  178. package/dist/core/workflow-events.d.ts +14 -2
  179. package/dist/core/workflow-events.js +4 -0
  180. package/dist/core/workflow-run-events.d.ts +5 -3
  181. package/dist/core/workflow-run-events.js +43 -8
  182. package/dist/core/zod-json-schema.d.ts +4 -0
  183. package/dist/core/zod-json-schema.js +39 -0
  184. package/dist/core/zod3-window.d.ts +35 -0
  185. package/dist/core/zod3-window.js +124 -0
  186. package/dist/generated/prisma/browser.d.ts +34 -3
  187. package/dist/generated/prisma/client.d.ts +34 -3
  188. package/dist/generated/prisma/commonInputTypes.d.ts +220 -60
  189. package/dist/generated/prisma/enums.d.ts +10 -0
  190. package/dist/generated/prisma/enums.js +8 -0
  191. package/dist/generated/prisma/internal/class.d.ts +44 -0
  192. package/dist/generated/prisma/internal/class.js +4 -4
  193. package/dist/generated/prisma/internal/prismaNamespace.d.ts +428 -9
  194. package/dist/generated/prisma/internal/prismaNamespace.js +92 -1
  195. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
  196. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +92 -1
  197. package/dist/generated/prisma/models/Agent.d.ts +106 -8
  198. package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
  199. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +229 -1
  200. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  201. package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
  202. package/dist/generated/prisma/models/CodingRun.d.ts +1637 -1
  203. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  204. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  205. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  206. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  207. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +39 -1
  208. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  209. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  210. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  211. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  212. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  213. package/dist/generated/prisma/models/Run.d.ts +738 -2
  214. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  215. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  216. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  217. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  218. package/dist/generated/prisma/models.d.ts +4 -0
  219. package/dist/help-index.json +1320 -69
  220. package/dist/import/create.js +32 -3
  221. package/dist/import/neutral-schema.d.ts +50 -281
  222. package/dist/import/neutral-schema.js +5 -4
  223. package/dist/knowledge/check.d.ts +1 -1
  224. package/dist/knowledge/cli.d.ts +11 -1
  225. package/dist/knowledge/cli.js +37 -4
  226. package/dist/knowledge/concept.d.ts +3 -19
  227. package/dist/knowledge/location.d.ts +31 -0
  228. package/dist/knowledge/location.js +78 -0
  229. package/dist/mcp/auth/access.d.ts +10 -2
  230. package/dist/mcp/auth/access.js +15 -1
  231. package/dist/mcp/auth/ownership.d.ts +7 -7
  232. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  233. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  234. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  235. package/dist/mcp/host-events/github-ingress.js +2 -1
  236. package/dist/mcp/index.d.ts +6 -0
  237. package/dist/mcp/index.js +58 -10
  238. package/dist/mcp/server.d.ts +13 -0
  239. package/dist/mcp/server.js +33 -14
  240. package/dist/mcp/tools/agents.d.ts +4 -0
  241. package/dist/mcp/tools/agents.js +198 -16
  242. package/dist/mcp/tools/datastore.js +17 -8
  243. package/dist/mcp/tools/grants.js +9 -3
  244. package/dist/mcp/tools/memory.js +11 -1
  245. package/dist/mcp/tools/notification-channels.js +2 -2
  246. package/dist/mcp/tools/packages.d.ts +2 -0
  247. package/dist/mcp/tools/packages.js +195 -0
  248. package/dist/mcp/tools/repositories.js +18 -5
  249. package/dist/mcp/tools/run-access.d.ts +16 -0
  250. package/dist/mcp/tools/run-access.js +25 -0
  251. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  252. package/dist/mcp/tools/run-transcript-download.js +129 -0
  253. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  254. package/dist/mcp/tools/run-transcript.js +70 -0
  255. package/dist/mcp/tools/runs.js +34 -12
  256. package/dist/mcp/tools/scheduling.js +3 -1
  257. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  258. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  259. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  260. package/dist/mcp/tools/secrets.js +2 -2
  261. package/dist/mcp/tools/stop-run.d.ts +2 -0
  262. package/dist/mcp/tools/stop-run.js +82 -0
  263. package/dist/mcp/tools/subagents.js +2 -2
  264. package/dist/mcp/tools/tools.d.ts +1 -1
  265. package/dist/mcp/tools/tools.js +25 -9
  266. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  267. package/dist/mcp/transport/stdio-link-host.js +67 -0
  268. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  269. package/dist/mcp/transport/streamable-http.js +41 -1
  270. package/dist/native-worker/docker-launcher.d.ts +38 -2
  271. package/dist/native-worker/docker-launcher.js +65 -5
  272. package/dist/native-worker/gateway-server.d.ts +41 -3
  273. package/dist/native-worker/gateway-server.js +124 -27
  274. package/dist/native-worker/gateway.d.ts +27 -1
  275. package/dist/native-worker/gateway.js +70 -4
  276. package/dist/native-worker/http-server.d.ts +3 -1
  277. package/dist/native-worker/http-server.js +11 -7
  278. package/dist/native-worker/http-transport.js +1 -1
  279. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  280. package/dist/native-worker/kubernetes-launcher.js +43 -3
  281. package/dist/native-worker/launch.d.ts +18 -1
  282. package/dist/native-worker/launch.js +6 -1
  283. package/dist/native-worker/ledger.d.ts +18 -2
  284. package/dist/native-worker/ledger.js +57 -4
  285. package/dist/native-worker/loopback.js +3 -8
  286. package/dist/native-worker/main.d.ts +2 -1
  287. package/dist/native-worker/main.js +14 -3
  288. package/dist/native-worker/protocol.d.ts +129 -577
  289. package/dist/native-worker/protocol.js +47 -1
  290. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  291. package/dist/native-worker/sandbox-executor.js +78 -4
  292. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  293. package/dist/native-worker/stderr-redaction.js +237 -0
  294. package/dist/native-worker/stdio.d.ts +1 -1
  295. package/dist/native-worker/stdio.js +6 -5
  296. package/dist/native-worker/warm-pool.d.ts +2 -2
  297. package/dist/native-worker/warm-pool.js +4 -4
  298. package/dist/native-worker/worker.js +28 -2
  299. package/dist/observability/metrics.js +6 -1
  300. package/dist/providers/auth/self-hosted.d.ts +1 -1
  301. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  302. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  303. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  304. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  305. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  306. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  307. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  308. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  309. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  310. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  311. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  312. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  313. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  314. package/dist/providers/coding-proxy/hold.js +86 -0
  315. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  316. package/dist/providers/coding-proxy/interrupted.js +104 -0
  317. package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
  318. package/dist/providers/coding-proxy/memory-ledger.js +84 -8
  319. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  320. package/dist/providers/coding-proxy/metering.js +27 -4
  321. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
  322. package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
  323. package/dist/providers/coding-proxy/proxy.d.ts +14 -1
  324. package/dist/providers/coding-proxy/proxy.js +166 -14
  325. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  326. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  327. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  328. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  329. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  330. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  331. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  332. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  333. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  334. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  335. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  336. package/dist/providers/coding-proxy/registry/service.js +579 -112
  337. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  338. package/dist/providers/coding-proxy/registry/store.js +54 -1
  339. package/dist/providers/coding-proxy/runtime.d.ts +4 -0
  340. package/dist/providers/coding-proxy/runtime.js +78 -16
  341. package/dist/providers/coding-proxy/server.d.ts +6 -1
  342. package/dist/providers/coding-proxy/server.js +45 -1
  343. package/dist/providers/coding-proxy/types.d.ts +65 -1
  344. package/dist/providers/datastore/types.d.ts +5 -0
  345. package/dist/providers/engine/types.d.ts +17 -2
  346. package/dist/providers/engine/types.js +17 -0
  347. package/dist/providers/executor/composition.d.ts +10 -3
  348. package/dist/providers/executor/composition.js +47 -7
  349. package/dist/providers/executor/container.d.ts +361 -8
  350. package/dist/providers/executor/container.js +1136 -91
  351. package/dist/providers/executor/dbos-status.d.ts +31 -0
  352. package/dist/providers/executor/dbos-status.js +64 -0
  353. package/dist/providers/executor/dbos.d.ts +50 -1
  354. package/dist/providers/executor/dbos.js +207 -20
  355. package/dist/providers/executor/deferred.d.ts +12 -24
  356. package/dist/providers/executor/deferred.js +10 -29
  357. package/dist/providers/executor/in-process.d.ts +9 -1
  358. package/dist/providers/executor/in-process.js +14 -4
  359. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  360. package/dist/providers/executor/linked-issue-reader.js +30 -0
  361. package/dist/providers/executor/routing.d.ts +2 -0
  362. package/dist/providers/executor/routing.js +4 -0
  363. package/dist/providers/executor/types.d.ts +13 -0
  364. package/dist/providers/index.d.ts +2 -1
  365. package/dist/providers/issue-tracker/types.d.ts +17 -0
  366. package/dist/providers/issue-tracker/types.js +39 -1
  367. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  368. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  369. package/dist/providers/jobs/docker-isolation.d.ts +8 -0
  370. package/dist/providers/jobs/docker-isolation.js +17 -0
  371. package/dist/providers/jobs/docker.d.ts +1 -0
  372. package/dist/providers/jobs/docker.js +27 -2
  373. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  374. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  375. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  376. package/dist/providers/jobs/kubernetes-api.js +10 -0
  377. package/dist/providers/jobs/kubernetes-client.js +10 -1
  378. package/dist/providers/jobs/kubernetes-isolation.d.ts +2 -0
  379. package/dist/providers/jobs/kubernetes-isolation.js +17 -1
  380. package/dist/providers/jobs/kubernetes.d.ts +6 -1
  381. package/dist/providers/jobs/kubernetes.js +105 -16
  382. package/dist/providers/jobs/types.d.ts +33 -0
  383. package/dist/providers/jobs/types.js +13 -1
  384. package/dist/providers/llm/anthropic.js +5 -1
  385. package/dist/providers/llm/bedrock.d.ts +0 -12
  386. package/dist/providers/llm/bedrock.js +4 -0
  387. package/dist/providers/llm/claude-messages.d.ts +3 -1
  388. package/dist/providers/llm/claude-messages.js +4 -1
  389. package/dist/providers/llm/claude-provider.d.ts +2 -2
  390. package/dist/providers/llm/claude-provider.js +2 -2
  391. package/dist/providers/llm/openai.d.ts +2 -2
  392. package/dist/providers/llm/openai.js +6 -2
  393. package/dist/providers/llm/routing.d.ts +2 -2
  394. package/dist/providers/llm/routing.js +2 -2
  395. package/dist/providers/llm/types.d.ts +12 -2
  396. package/dist/providers/review-host/github-events.d.ts +9 -1
  397. package/dist/providers/review-host/github-events.js +34 -12
  398. package/dist/providers/review-host/github.d.ts +29 -2
  399. package/dist/providers/review-host/github.js +224 -29
  400. package/dist/providers/review-host/local.d.ts +8 -4
  401. package/dist/providers/review-host/local.js +49 -31
  402. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  403. package/dist/providers/review-host/patch-pages.js +176 -0
  404. package/dist/providers/review-host/review-format.d.ts +19 -1
  405. package/dist/providers/review-host/review-format.js +38 -7
  406. package/dist/providers/review-host/types.d.ts +134 -2
  407. package/dist/providers/review-host/types.js +8 -0
  408. package/dist/providers/storage/gcs.d.ts +63 -0
  409. package/dist/providers/storage/gcs.js +69 -0
  410. package/dist/providers/storage/index.d.ts +15 -0
  411. package/dist/providers/storage/index.js +14 -0
  412. package/dist/providers/storage/local.d.ts +24 -0
  413. package/dist/providers/storage/local.js +92 -0
  414. package/dist/providers/storage/meter.d.ts +14 -0
  415. package/dist/providers/storage/meter.js +34 -0
  416. package/dist/providers/storage/s3.d.ts +41 -0
  417. package/dist/providers/storage/s3.js +107 -0
  418. package/dist/providers/storage/types.d.ts +37 -3
  419. package/dist/providers/storage/types.js +21 -4
  420. package/dist/providers/vcs/git.d.ts +33 -2
  421. package/dist/providers/vcs/git.js +324 -22
  422. package/dist/providers/vcs/github-remote.d.ts +26 -3
  423. package/dist/providers/vcs/github-remote.js +124 -14
  424. package/dist/providers/vcs/github.d.ts +214 -6
  425. package/dist/providers/vcs/github.js +447 -45
  426. package/dist/providers/vcs/index.js +8 -1
  427. package/dist/providers/vcs/pr-description.d.ts +127 -0
  428. package/dist/providers/vcs/pr-description.js +270 -0
  429. package/dist/providers/vcs/remote.d.ts +33 -1
  430. package/dist/providers/vcs/routing.d.ts +4 -2
  431. package/dist/providers/vcs/routing.js +6 -0
  432. package/dist/providers/vcs/types.d.ts +80 -3
  433. package/dist/quickstart/coding-seed.d.ts +14 -3
  434. package/dist/quickstart/coding-seed.js +213 -4
  435. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  436. package/dist/quickstart/reviewer-prompt.js +6 -6
  437. package/dist/quickstart-images.json +1 -1
  438. package/dist/sandbox/generated/zod.bundle.js +62 -1
  439. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  440. package/dist/sandbox/host-functions.d.ts +1 -0
  441. package/dist/sandbox/host-functions.js +6 -11
  442. package/dist/sandbox/secret-broker.js +3 -4
  443. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  444. package/dist/sandbox/zod-params.d.ts +37 -5
  445. package/dist/sandbox/zod-params.js +181 -26
  446. package/dist/serve.js +8 -1
  447. package/dist/viewer/api-schema.d.ts +349 -2627
  448. package/dist/viewer/api-schema.js +7 -0
  449. package/dist/viewer/build-schemas.js +6 -2
  450. package/dist/viewer/openapi.js +2 -4
  451. package/dist/wardby-bin.js +10 -0
  452. package/docs/agent-recipes.md +58 -20
  453. package/docs/code-review-agents.md +551 -41
  454. package/docs/coding-agent-setup.md +489 -7
  455. package/docs/coding-packages.md +1033 -90
  456. package/docs/coding-services.md +27 -12
  457. package/docs/coding-worker-byo-images.md +20 -0
  458. package/docs/coding-worker-isolation.md +105 -30
  459. package/docs/getting-started-gke.md +124 -137
  460. package/docs/getting-started-identity-provider.md +10 -1
  461. package/docs/getting-started.md +9 -0
  462. package/docs/jira-agents.md +17 -8
  463. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  464. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  465. package/docs/knowledge/delegation-admission-slots.md +52 -0
  466. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  467. package/docs/knowledge/import-rename-target.md +52 -0
  468. package/docs/knowledge/index.md +57 -0
  469. package/docs/knowledge/log.md +9 -0
  470. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  471. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  472. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  473. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  474. package/docs/knowledge/overview-cli.md +74 -0
  475. package/docs/knowledge/overview-coding-proxy.md +72 -0
  476. package/docs/knowledge/overview-coding.md +72 -0
  477. package/docs/knowledge/overview-config.md +60 -0
  478. package/docs/knowledge/overview-core.md +72 -0
  479. package/docs/knowledge/overview-deploy.md +83 -0
  480. package/docs/knowledge/overview-mcp.md +61 -0
  481. package/docs/knowledge/overview-prisma.md +72 -0
  482. package/docs/knowledge/overview-providers.md +89 -0
  483. package/docs/knowledge/overview-sandbox.md +83 -0
  484. package/docs/knowledge/overview-surfaces.md +83 -0
  485. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  486. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  487. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  488. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  489. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  490. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  491. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  492. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  493. package/docs/knowledge/warm-input-publication.md +30 -0
  494. package/docs/knowledge/workspace-staging-failure.md +54 -0
  495. package/docs/knowledge.md +54 -14
  496. package/docs/native-sandbox.md +119 -23
  497. package/docs/observability.md +4 -0
  498. package/docs/security-deployment.md +33 -2
  499. package/docs/slack-notifications.md +35 -19
  500. package/docs/tool-secrets.md +42 -10
  501. package/docs/viewer-api.openapi.yml +1 -1
  502. package/help/admin-viewer.md +24 -2
  503. package/help/architecture-agent.md +11 -6
  504. package/help/build-worker-image.md +3 -1
  505. package/help/builder-agent.md +19 -6
  506. package/help/code-review-agents.md +177 -6
  507. package/help/coding-packages.md +156 -6
  508. package/help/cost-attribution.md +9 -5
  509. package/help/creating-agents.md +14 -1
  510. package/help/dependency-cache.md +143 -0
  511. package/help/deploy-gke.md +15 -8
  512. package/help/errors/budget-exhausted.md +187 -0
  513. package/help/errors/budget-group-exhausted.md +5 -1
  514. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  515. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  516. package/help/errors/continuation-closed.md +9 -12
  517. package/help/errors/delegation-conflict.md +24 -0
  518. package/help/errors/file-list-truncated.md +45 -0
  519. package/help/errors/full-read-required.md +49 -0
  520. package/help/errors/github-account-not-allowed.md +4 -0
  521. package/help/errors/graph-incomplete.md +43 -0
  522. package/help/errors/graph-limit.md +43 -0
  523. package/help/errors/merge-conflict.md +49 -0
  524. package/help/errors/native-sandbox-gateway-error.md +20 -0
  525. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  526. package/help/errors/native-sandbox-worker-exited.md +3 -2
  527. package/help/errors/package-not-allowed-pending.md +52 -0
  528. package/help/errors/package-not-allowed.md +51 -0
  529. package/help/errors/package-refusals.md +43 -0
  530. package/help/errors/patch-cursor-malformed.md +31 -0
  531. package/help/errors/run-lost.md +39 -0
  532. package/help/errors/run-transcript-download.md +44 -0
  533. package/help/errors/secret-in-value.md +69 -0
  534. package/help/errors/target-merge.md +40 -0
  535. package/help/fix-merge-conflicts.md +73 -0
  536. package/help/github-app-setup.md +132 -0
  537. package/help/github.md +22 -0
  538. package/help/identity-and-access.md +2 -0
  539. package/help/jira.md +23 -6
  540. package/help/knowledge.md +16 -7
  541. package/help/local-repositories.md +1 -1
  542. package/help/low-power-mode.md +7 -1
  543. package/help/merge-order-check.md +5 -0
  544. package/help/native-capabilities.md +29 -1
  545. package/help/native-sandbox.md +15 -1
  546. package/help/operating-agents.md +5 -0
  547. package/help/package-audit-mode.md +91 -0
  548. package/help/related-pull-requests.md +10 -7
  549. package/help/resume-runs-locally.md +131 -0
  550. package/help/review-fix-rounds.md +33 -1
  551. package/help/sharing-agents.md +59 -0
  552. package/help/slack-notifications.md +19 -5
  553. package/help/status-comments.md +31 -0
  554. package/help/stop-run.md +58 -0
  555. package/help/troubleshooting/budgets.md +28 -0
  556. package/help/troubleshooting/coding-workers.md +78 -7
  557. package/package.json +17 -10
  558. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  559. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  560. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  561. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  562. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  563. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  564. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  565. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  566. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  567. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  568. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  569. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  570. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  571. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  572. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  573. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  574. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  575. package/prisma/schema.prisma +311 -97
  576. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -3,7 +3,8 @@ 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;
7
8
  /** The worker input artifact (input.json): larger than results because it can carry Claude Code repo context. */
8
9
  export const MAX_CODING_INPUT_BYTES = 512 * 1024;
9
10
  /** Bounds on CodingTaskInput.claudeContext, enforced by the builder (src/coding/claude-context.ts) and this schema. */
@@ -11,10 +12,19 @@ export const CLAUDE_CONTEXT_LIMITS = { maxFiles: 200, maxFileBytes: 64 * 1024, m
11
12
  export const MAX_CODING_TASK_BYTES = 16 * 1024;
12
13
  /** Room reserved at the end of a composed task for lines the executor appends (e.g. the base commit). */
13
14
  export const CODING_TASK_TRAILER_RESERVE_BYTES = 256;
14
- 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]";
15
22
  export const MAX_CODING_TESTS = 64;
16
23
  export const MAX_CODING_TEST_COMMAND_BYTES = 2 * 1024;
17
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;
18
28
  /**
19
29
  * Coding-run services (docs/coding-services.md): the catalog name and version
20
30
  * grammar, shared by the repository's .wardby/services.yaml, the catalog, and
@@ -46,6 +56,42 @@ export const INVALID_SINGLE_LINE_CONTROL = /[\u0000-\u001F\u007F]/;
46
56
  export function byteLength(value) {
47
57
  return Buffer.byteLength(value, "utf8");
48
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
+ }
49
95
  function boundedText(maxBytes, singleLine = false) {
50
96
  const invalidControl = singleLine ? INVALID_SINGLE_LINE_CONTROL : INVALID_MULTILINE_CONTROL;
51
97
  return z
@@ -87,6 +133,9 @@ const RESERVED_SERVICE_ENV_PREFIXES = [
87
133
  "ANTHROPIC_",
88
134
  "PIP_",
89
135
  "NPM_CONFIG_",
136
+ "YARN_",
137
+ "PNPM_",
138
+ "COREPACK_",
90
139
  "UV_",
91
140
  "GIT_",
92
141
  ];
@@ -325,8 +374,22 @@ const testResultSchema = z
325
374
  export const MAX_CODING_TURNS = 1000;
326
375
  /** The Claude Code worker's turn limit when the agent sets none; the run's budget and timeout are the real limits. */
327
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;
328
387
  /** Longest line a debug-traced worker writes to its log (src/coding-worker/debug-trace.ts). */
329
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;
330
393
  /** C0 and C1 control characters, which have no place in a context file path. */
331
394
  const CONTROL_CHARACTER = /[\u0000-\u001f\u007f-\u009f]/;
332
395
  /**
@@ -400,12 +463,44 @@ export const CodingTaskInputSchema = z
400
463
  * untraced run is unchanged for workers that predate it.
401
464
  */
402
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(),
403
491
  /**
404
492
  * Claude Code turn limit (CodingAgentProfile.maxTurns, fixed on the run at
405
493
  * dispatch). Absent means the worker default; written only when the agent
406
494
  * sets one, so other runs' input is unchanged for workers that predate it.
407
495
  */
408
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(),
409
504
  /**
410
505
  * Coding-run services started next to this run (docs/coding-services.md):
411
506
  * each one's catalog name and version, and the variables the agent's shells
@@ -446,6 +541,9 @@ export const CodingTaskInputSchema = z
446
541
  message: "must match wardby/run-<runId> (or wardby/run-<continuationOf.runId>)",
447
542
  });
448
543
  }
544
+ if (value.diskMb !== undefined && value.dependencyCache !== true) {
545
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["diskMb"], message: "only with dependencyCache" });
546
+ }
449
547
  const names = (value.services ?? []).map((service) => service.name);
450
548
  if (new Set(names).size !== names.length) {
451
549
  ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["services"], message: "must name each service once" });
@@ -464,22 +562,140 @@ export const CodingTaskInputSchema = z
464
562
  ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["claudeContext", "files"], message: "context too large" });
465
563
  }
466
564
  });
467
- export const CodingAgentOutputSchema = z
468
- .object({
565
+ const agentOutputFields = {
469
566
  schemaVersion: z.literal(CODING_PROTOCOL_VERSION),
470
567
  runId: runIdSchema,
471
568
  outcome: z.enum(["changes_ready", "no_changes", "budget_exhausted"]),
472
- summary: boundedText(MAX_CODING_SUMMARY_BYTES),
569
+ summary: summaryText(),
473
570
  tests: z.array(testResultSchema).max(MAX_CODING_TESTS),
474
571
  // Model-written, so normalized rather than rejected; see normalizeCodingTag.
475
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))),
476
694
  })
477
695
  .strict()
478
- .transform((value) => ({
479
- ...value,
480
- summary: redactTokenShapedValues(value.summary),
481
- tests: value.tests.map((test) => ({ ...test, command: redactTokenShapedValues(test.command) })),
482
- ...(value.tag !== undefined ? { tag: redactTokenShapedValues(value.tag) } : {}),
696
+ .transform(({ dependencyCache, ...value }) => ({
697
+ ...redactAgentOutput(value),
698
+ ...(dependencyCache !== undefined ? { dependencyCache } : {}),
483
699
  }));
484
700
  const pullRequestUrlSchema = z
485
701
  .string()
@@ -513,7 +729,7 @@ export const CodingRunResultSchema = z
513
729
  .optional(),
514
730
  pullRequestUrl: pullRequestUrlSchema.optional(),
515
731
  pullRequestNumber: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),
516
- summary: boundedText(MAX_CODING_SUMMARY_BYTES),
732
+ summary: summaryText(),
517
733
  tests: z.array(testResultSchema).max(MAX_CODING_TESTS),
518
734
  usage: usageSchema,
519
735
  tag: tagSchema,
@@ -570,7 +786,10 @@ export function publicCodingRunResult(value) {
570
786
  */
571
787
  const PEM_PRIVATE_KEY = /-----BEGIN (?:[A-Z ]{1,32} )?PRIVATE KEY-----[\s\S]{0,6144}?-----END (?:[A-Z ]{1,32} )?PRIVATE KEY-----/g;
572
788
  const TOKEN_PATTERNS = [
573
- /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,
574
793
  /github_pat_[A-Za-z0-9_]{20,}/g,
575
794
  /gh[pousr]_[A-Za-z0-9]{20,}/g,
576
795
  /AKIA[0-9A-Z]{16}/g,
@@ -748,6 +967,10 @@ export function parseCodingTaskInputJson(text) {
748
967
  export function parseCodingAgentOutputJson(text) {
749
968
  return CodingAgentOutputSchema.parse(parseJsonWithoutDuplicateKeys(text));
750
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
+ }
751
974
  export function parseCodingRunResultJson(text) {
752
975
  return CodingRunResultSchema.parse(parseJsonWithoutDuplicateKeys(text));
753
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;