@wardby/cli 0.5.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. package/.env.example +33 -0
  2. package/README.md +25 -14
  3. package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
  4. package/dist/claude-coding-worker/context.d.ts +22 -0
  5. package/dist/claude-coding-worker/context.js +92 -0
  6. package/dist/claude-coding-worker/driver.d.ts +27 -3
  7. package/dist/claude-coding-worker/driver.js +161 -20
  8. package/dist/claude-coding-worker/main.js +34 -6
  9. package/dist/claude-coding-worker/sdk.js +25 -5
  10. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  11. package/dist/claude-coding-worker/tool-socket.js +111 -0
  12. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  13. package/dist/claude-coding-worker/transcript.js +77 -0
  14. package/dist/cli-help.d.ts +1 -1
  15. package/dist/cli-help.js +6 -2
  16. package/dist/cli-native-mode.d.ts +9 -0
  17. package/dist/cli-native-mode.js +20 -0
  18. package/dist/cli.d.ts +3 -1
  19. package/dist/cli.js +161 -11
  20. package/dist/coding/claude-context.d.ts +45 -0
  21. package/dist/coding/claude-context.js +434 -0
  22. package/dist/coding/continuation-wording.d.ts +35 -0
  23. package/dist/coding/continuation-wording.js +73 -0
  24. package/dist/coding/linked-issue-note.d.ts +23 -0
  25. package/dist/coding/linked-issue-note.js +47 -0
  26. package/dist/coding/merge-wording.d.ts +28 -0
  27. package/dist/coding/merge-wording.js +78 -0
  28. package/dist/coding/pr-description-note.d.ts +9 -0
  29. package/dist/coding/pr-description-note.js +32 -0
  30. package/dist/coding/profile.d.ts +50 -118
  31. package/dist/coding/profile.js +51 -4
  32. package/dist/coding/protected-path-wording.d.ts +8 -0
  33. package/dist/coding/protected-path-wording.js +1 -1
  34. package/dist/coding/protocol.d.ts +292 -270
  35. package/dist/coding/protocol.js +322 -15
  36. package/dist/coding/redact.d.ts +3 -0
  37. package/dist/coding/redact.js +12 -0
  38. package/dist/coding/registry/allowlist.d.ts +12 -0
  39. package/dist/coding/registry/allowlist.js +14 -1
  40. package/dist/coding/registry/audit-mode.d.ts +153 -0
  41. package/dist/coding/registry/audit-mode.js +304 -0
  42. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  43. package/dist/coding/registry/lockfile-shared.js +128 -0
  44. package/dist/coding/registry/lockfiles.js +1 -1
  45. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  46. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  47. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  48. package/dist/coding/registry/npm-lockfile.js +4 -6
  49. package/dist/coding/registry/npm.js +78 -8
  50. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  51. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  52. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  53. package/dist/coding/registry/pypi-plan.js +406 -0
  54. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  55. package/dist/coding/registry/pypi-requirements.js +155 -0
  56. package/dist/coding/registry/pypi.d.ts +3 -27
  57. package/dist/coding/registry/pypi.js +40 -154
  58. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  59. package/dist/coding/registry/refusal-hints.js +61 -0
  60. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  61. package/dist/coding/registry/refusal-wording.js +56 -0
  62. package/dist/coding/registry/report.d.ts +70 -8
  63. package/dist/coding/registry/report.js +112 -5
  64. package/dist/coding/registry/types.d.ts +58 -8
  65. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  66. package/dist/coding/registry/yarn-lockfile.js +367 -0
  67. package/dist/coding/services/catalog.d.ts +37 -351
  68. package/dist/coding/transcript/claude-code.d.ts +13 -0
  69. package/dist/coding/transcript/claude-code.js +273 -0
  70. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  71. package/dist/coding/transcript/download-protocol.js +18 -0
  72. package/dist/coding/transcript/format.d.ts +20 -0
  73. package/dist/coding/transcript/format.js +32 -0
  74. package/dist/coding/transcript/recorder.d.ts +51 -0
  75. package/dist/coding/transcript/recorder.js +225 -0
  76. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  77. package/dist/coding/transcript/resume/checkout.js +203 -0
  78. package/dist/coding/transcript/resume/command.d.ts +17 -0
  79. package/dist/coding/transcript/resume/command.js +176 -0
  80. package/dist/coding/transcript/resume/download.d.ts +20 -0
  81. package/dist/coding/transcript/resume/download.js +153 -0
  82. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  83. package/dist/coding/transcript/resume/launch.js +128 -0
  84. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  85. package/dist/coding/transcript/resume/session-file.js +79 -0
  86. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  87. package/dist/coding/transcript/resume/stand-in.js +49 -0
  88. package/dist/coding-worker/artifact.d.ts +16 -3
  89. package/dist/coding-worker/artifact.js +5 -3
  90. package/dist/coding-worker/debug-trace.d.ts +6 -5
  91. package/dist/coding-worker/debug-trace.js +13 -18
  92. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  93. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  94. package/dist/coding-worker/driver.d.ts +4 -3
  95. package/dist/coding-worker/driver.js +118 -38
  96. package/dist/coding-worker/errors.d.ts +1 -0
  97. package/dist/coding-worker/errors.js +32 -0
  98. package/dist/coding-worker/sdk.d.ts +6 -0
  99. package/dist/coding-worker/sdk.js +1 -0
  100. package/dist/coding-worker/skills.d.ts +23 -0
  101. package/dist/coding-worker/skills.js +117 -0
  102. package/dist/coding-worker/task-note.d.ts +11 -0
  103. package/dist/coding-worker/task-note.js +13 -0
  104. package/dist/coding-worker/types.d.ts +13 -0
  105. package/dist/config/dependency-cache.d.ts +23 -0
  106. package/dist/config/dependency-cache.js +32 -0
  107. package/dist/config/github-allowed-accounts.d.ts +15 -0
  108. package/dist/config/github-allowed-accounts.js +36 -0
  109. package/dist/config/low-power.d.ts +12 -0
  110. package/dist/config/low-power.js +18 -0
  111. package/dist/config/mobile.d.ts +12 -0
  112. package/dist/config/mobile.js +18 -0
  113. package/dist/config/providers.d.ts +65 -3
  114. package/dist/config/providers.js +147 -11
  115. package/dist/config/test-simulators.d.ts +82 -0
  116. package/dist/config/test-simulators.js +305 -0
  117. package/dist/core/async-context.d.ts +2 -0
  118. package/dist/core/async-context.js +12 -0
  119. package/dist/core/budget-events.d.ts +108 -0
  120. package/dist/core/budget-events.js +346 -0
  121. package/dist/core/budget-groups.d.ts +50 -1
  122. package/dist/core/budget-groups.js +236 -27
  123. package/dist/core/budget-stopped-head.d.ts +46 -0
  124. package/dist/core/budget-stopped-head.js +81 -0
  125. package/dist/core/budget-topup.d.ts +51 -0
  126. package/dist/core/budget-topup.js +156 -0
  127. package/dist/core/budget-wording.d.ts +16 -2
  128. package/dist/core/budget-wording.js +40 -2
  129. package/dist/core/coding-queue.d.ts +2 -1
  130. package/dist/core/coding-queue.js +7 -0
  131. package/dist/core/cron.d.ts +19 -1
  132. package/dist/core/cron.js +17 -0
  133. package/dist/core/datastores.js +1 -1
  134. package/dist/core/db.d.ts +16 -6
  135. package/dist/core/db.js +12 -10
  136. package/dist/core/deferred-coding.d.ts +14 -0
  137. package/dist/core/deferred-coding.js +62 -0
  138. package/dist/core/delegation-child.d.ts +25 -0
  139. package/dist/core/delegation-child.js +37 -0
  140. package/dist/core/dispatch.d.ts +53 -0
  141. package/dist/core/dispatch.js +167 -57
  142. package/dist/core/engine-native.js +10 -6
  143. package/dist/core/error-code.d.ts +38 -0
  144. package/dist/core/error-code.js +168 -0
  145. package/dist/core/grants.d.ts +19 -6
  146. package/dist/core/grants.js +55 -6
  147. package/dist/core/host-events.d.ts +67 -5
  148. package/dist/core/host-events.js +571 -37
  149. package/dist/core/host-status.d.ts +85 -3
  150. package/dist/core/host-status.js +298 -20
  151. package/dist/core/issue-bridge.d.ts +50 -6
  152. package/dist/core/issue-bridge.js +151 -20
  153. package/dist/core/issue-events.d.ts +1 -1
  154. package/dist/core/issue-events.js +16 -11
  155. package/dist/core/issue-status.d.ts +1 -1
  156. package/dist/core/issue-status.js +68 -29
  157. package/dist/core/logger.d.ts +5 -0
  158. package/dist/core/logger.js +14 -1
  159. package/dist/core/lost-run-children.d.ts +6 -0
  160. package/dist/core/lost-run-children.js +32 -0
  161. package/dist/core/mark-ready.d.ts +34 -0
  162. package/dist/core/mark-ready.js +152 -0
  163. package/dist/core/markdown-code.d.ts +8 -0
  164. package/dist/core/markdown-code.js +107 -0
  165. package/dist/core/memory-tools.js +7 -0
  166. package/dist/core/merge-order-check.d.ts +130 -0
  167. package/dist/core/merge-order-check.js +343 -0
  168. package/dist/core/notification-dispatcher.d.ts +70 -0
  169. package/dist/core/notification-dispatcher.js +368 -0
  170. package/dist/core/notification-templates.d.ts +19 -0
  171. package/dist/core/notification-templates.js +139 -0
  172. package/dist/core/notifications.d.ts +10 -0
  173. package/dist/core/notifications.js +38 -0
  174. package/dist/core/pg-auth.d.ts +22 -0
  175. package/dist/core/pg-auth.js +152 -0
  176. package/dist/core/power-composition.d.ts +16 -0
  177. package/dist/core/power-composition.js +37 -0
  178. package/dist/core/power-idle.d.ts +14 -0
  179. package/dist/core/power-idle.js +30 -0
  180. package/dist/core/power.d.ts +71 -0
  181. package/dist/core/power.js +202 -0
  182. package/dist/core/pull-request-state-sync.js +2 -2
  183. package/dist/core/reconciler.d.ts +8 -5
  184. package/dist/core/reconciler.js +37 -6
  185. package/dist/core/related-pull-requests.d.ts +59 -7
  186. package/dist/core/related-pull-requests.js +140 -25
  187. package/dist/core/reply-parts.d.ts +21 -0
  188. package/dist/core/reply-parts.js +73 -0
  189. package/dist/core/repo-access.d.ts +15 -0
  190. package/dist/core/repo-access.js +66 -0
  191. package/dist/core/review-fix.d.ts +38 -1
  192. package/dist/core/review-fix.js +209 -7
  193. package/dist/core/review-host-checks.d.ts +1 -1
  194. package/dist/core/review-host-tools.d.ts +23 -0
  195. package/dist/core/review-host-tools.js +156 -14
  196. package/dist/core/review-reads.d.ts +55 -0
  197. package/dist/core/review-reads.js +233 -0
  198. package/dist/core/run-status.d.ts +12 -0
  199. package/dist/core/run-status.js +12 -0
  200. package/dist/core/runner.d.ts +384 -5
  201. package/dist/core/runner.js +1244 -372
  202. package/dist/core/schedule-start.d.ts +12 -0
  203. package/dist/core/schedule-start.js +14 -0
  204. package/dist/core/secret-broker-config.d.ts +39 -0
  205. package/dist/core/secret-broker-config.js +112 -0
  206. package/dist/core/secret-guard.d.ts +46 -0
  207. package/dist/core/secret-guard.js +104 -0
  208. package/dist/core/secret-guarded-stores.d.ts +12 -0
  209. package/dist/core/secret-guarded-stores.js +41 -0
  210. package/dist/core/secret-spans.d.ts +50 -0
  211. package/dist/core/secret-spans.js +94 -0
  212. package/dist/core/secrets.d.ts +39 -4
  213. package/dist/core/secrets.js +148 -40
  214. package/dist/core/stop-run.d.ts +46 -0
  215. package/dist/core/stop-run.js +61 -0
  216. package/dist/core/workflow-event-recorder.d.ts +14 -0
  217. package/dist/core/workflow-event-recorder.js +120 -0
  218. package/dist/core/workflow-events.d.ts +94 -0
  219. package/dist/core/workflow-events.js +48 -0
  220. package/dist/core/workflow-run-events.d.ts +18 -0
  221. package/dist/core/workflow-run-events.js +75 -0
  222. package/dist/core/zod-json-schema.d.ts +4 -0
  223. package/dist/core/zod-json-schema.js +39 -0
  224. package/dist/core/zod3-window.d.ts +35 -0
  225. package/dist/core/zod3-window.js +124 -0
  226. package/dist/generated/prisma/browser.d.ts +92 -3
  227. package/dist/generated/prisma/client.d.ts +92 -3
  228. package/dist/generated/prisma/commonInputTypes.d.ts +364 -54
  229. package/dist/generated/prisma/enums.d.ts +37 -0
  230. package/dist/generated/prisma/enums.js +31 -0
  231. package/dist/generated/prisma/internal/class.d.ts +132 -0
  232. package/dist/generated/prisma/internal/class.js +4 -4
  233. package/dist/generated/prisma/internal/prismaNamespace.d.ts +1332 -142
  234. package/dist/generated/prisma/internal/prismaNamespace.js +227 -5
  235. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +234 -0
  236. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +227 -5
  237. package/dist/generated/prisma/models/Agent.d.ts +464 -7
  238. package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
  239. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +301 -1
  240. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  241. package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
  242. package/dist/generated/prisma/models/CodingRun.d.ts +1841 -1
  243. package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
  244. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  245. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  246. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  247. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  248. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1713 -0
  249. package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
  250. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1551 -0
  251. package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
  252. package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
  253. package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
  254. package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
  255. package/dist/generated/prisma/models/NotificationChannel.js +1 -0
  256. package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
  257. package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
  258. package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
  259. package/dist/generated/prisma/models/NotificationThread.js +1 -0
  260. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  261. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  262. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  263. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  264. package/dist/generated/prisma/models/Run.d.ts +1619 -58
  265. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  266. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  267. package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
  268. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  269. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  270. package/dist/generated/prisma/models/Secret.d.ts +37 -1
  271. package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
  272. package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
  273. package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
  274. package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
  275. package/dist/generated/prisma/models.d.ts +12 -0
  276. package/dist/help/build.js +4 -2
  277. package/dist/help/catalog.d.ts +1 -1
  278. package/dist/help/catalog.js +31 -6
  279. package/dist/help-index.json +2584 -146
  280. package/dist/import/create.js +49 -3
  281. package/dist/import/neutral-schema.d.ts +50 -277
  282. package/dist/import/neutral-schema.js +7 -4
  283. package/dist/knowledge/check.d.ts +1 -1
  284. package/dist/knowledge/cli.d.ts +11 -1
  285. package/dist/knowledge/cli.js +37 -4
  286. package/dist/knowledge/concept.d.ts +3 -19
  287. package/dist/knowledge/location.d.ts +31 -0
  288. package/dist/knowledge/location.js +78 -0
  289. package/dist/mcp/auth/access.d.ts +11 -2
  290. package/dist/mcp/auth/access.js +15 -1
  291. package/dist/mcp/auth/ownership.d.ts +7 -7
  292. package/dist/mcp/auth/repo-authorization.js +14 -0
  293. package/dist/mcp/auth/resource-server.d.ts +2 -1
  294. package/dist/mcp/auth/resource-server.js +7 -2
  295. package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
  296. package/dist/mcp/auth/self-hosted/browser.js +19 -6
  297. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  298. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  299. package/dist/mcp/context.d.ts +6 -0
  300. package/dist/mcp/host-events/github-ingress.d.ts +25 -1
  301. package/dist/mcp/host-events/github-ingress.js +70 -1
  302. package/dist/mcp/index.d.ts +19 -0
  303. package/dist/mcp/index.js +117 -20
  304. package/dist/mcp/server.d.ts +13 -0
  305. package/dist/mcp/server.js +33 -14
  306. package/dist/mcp/tools/agents.d.ts +4 -0
  307. package/dist/mcp/tools/agents.js +277 -24
  308. package/dist/mcp/tools/datastore.js +17 -8
  309. package/dist/mcp/tools/grants.js +9 -3
  310. package/dist/mcp/tools/memory.js +11 -1
  311. package/dist/mcp/tools/notification-channels.d.ts +2 -0
  312. package/dist/mcp/tools/notification-channels.js +293 -0
  313. package/dist/mcp/tools/packages.d.ts +2 -0
  314. package/dist/mcp/tools/packages.js +195 -0
  315. package/dist/mcp/tools/power.d.ts +2 -0
  316. package/dist/mcp/tools/power.js +77 -0
  317. package/dist/mcp/tools/repositories.js +18 -5
  318. package/dist/mcp/tools/run-access.d.ts +16 -0
  319. package/dist/mcp/tools/run-access.js +25 -0
  320. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  321. package/dist/mcp/tools/run-transcript-download.js +129 -0
  322. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  323. package/dist/mcp/tools/run-transcript.js +70 -0
  324. package/dist/mcp/tools/runs.d.ts +0 -6
  325. package/dist/mcp/tools/runs.js +41 -14
  326. package/dist/mcp/tools/scheduling.js +3 -1
  327. package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
  328. package/dist/mcp/tools/secret-broker-compat.js +23 -0
  329. package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
  330. package/dist/mcp/tools/secret-elicitation-form.js +205 -10
  331. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  332. package/dist/mcp/tools/secret-elicitation-server.js +10 -54
  333. package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
  334. package/dist/mcp/tools/secret-elicitation.js +110 -12
  335. package/dist/mcp/tools/secrets.js +186 -9
  336. package/dist/mcp/tools/stop-run.d.ts +2 -0
  337. package/dist/mcp/tools/stop-run.js +82 -0
  338. package/dist/mcp/tools/subagents.js +2 -2
  339. package/dist/mcp/tools/tools.d.ts +2 -2
  340. package/dist/mcp/tools/tools.js +47 -11
  341. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  342. package/dist/mcp/transport/stdio-link-host.js +67 -0
  343. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  344. package/dist/mcp/transport/streamable-http.js +41 -1
  345. package/dist/native-worker/composition.d.ts +23 -0
  346. package/dist/native-worker/composition.js +77 -0
  347. package/dist/native-worker/docker-isolation.d.ts +65 -0
  348. package/dist/native-worker/docker-isolation.js +183 -0
  349. package/dist/native-worker/docker-launcher.d.ts +110 -0
  350. package/dist/native-worker/docker-launcher.js +297 -0
  351. package/dist/native-worker/gateway-server.d.ts +77 -0
  352. package/dist/native-worker/gateway-server.js +412 -0
  353. package/dist/native-worker/gateway.d.ts +70 -0
  354. package/dist/native-worker/gateway.js +263 -0
  355. package/dist/native-worker/http-server.d.ts +24 -0
  356. package/dist/native-worker/http-server.js +113 -0
  357. package/dist/native-worker/http-transport.d.ts +17 -0
  358. package/dist/native-worker/http-transport.js +88 -0
  359. package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
  360. package/dist/native-worker/kubernetes-isolation.js +218 -0
  361. package/dist/native-worker/kubernetes-launcher.d.ts +106 -0
  362. package/dist/native-worker/kubernetes-launcher.js +375 -0
  363. package/dist/native-worker/launch.d.ts +62 -0
  364. package/dist/native-worker/launch.js +49 -0
  365. package/dist/native-worker/ledger.d.ts +125 -0
  366. package/dist/native-worker/ledger.js +245 -0
  367. package/dist/native-worker/loopback.d.ts +12 -0
  368. package/dist/native-worker/loopback.js +44 -0
  369. package/dist/native-worker/main.d.ts +8 -0
  370. package/dist/native-worker/main.js +85 -0
  371. package/dist/native-worker/protocol.d.ts +296 -0
  372. package/dist/native-worker/protocol.js +246 -0
  373. package/dist/native-worker/sandbox-executor.d.ts +83 -0
  374. package/dist/native-worker/sandbox-executor.js +284 -0
  375. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  376. package/dist/native-worker/stderr-redaction.js +237 -0
  377. package/dist/native-worker/stdio.d.ts +29 -0
  378. package/dist/native-worker/stdio.js +189 -0
  379. package/dist/native-worker/warm-delivery.d.ts +16 -0
  380. package/dist/native-worker/warm-delivery.js +33 -0
  381. package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
  382. package/dist/native-worker/warm-pool-ledger.js +73 -0
  383. package/dist/native-worker/warm-pool.d.ts +107 -0
  384. package/dist/native-worker/warm-pool.js +283 -0
  385. package/dist/native-worker/worker.d.ts +17 -0
  386. package/dist/native-worker/worker.js +141 -0
  387. package/dist/observability/metrics.js +6 -1
  388. package/dist/providers/auth/authorization-server.d.ts +3 -0
  389. package/dist/providers/auth/index.js +2 -0
  390. package/dist/providers/auth/self-hosted.d.ts +14 -2
  391. package/dist/providers/auth/self-hosted.js +54 -4
  392. package/dist/providers/chat/fake.d.ts +46 -0
  393. package/dist/providers/chat/fake.js +39 -0
  394. package/dist/providers/chat/index.d.ts +4 -0
  395. package/dist/providers/chat/index.js +8 -0
  396. package/dist/providers/chat/slack.d.ts +37 -0
  397. package/dist/providers/chat/slack.js +105 -0
  398. package/dist/providers/chat/types.d.ts +42 -0
  399. package/dist/providers/chat/types.js +19 -0
  400. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  401. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  402. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  403. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  404. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  405. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  406. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  407. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  408. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  409. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  410. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  411. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  412. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  413. package/dist/providers/coding-proxy/hold.js +86 -0
  414. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  415. package/dist/providers/coding-proxy/interrupted.js +104 -0
  416. package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
  417. package/dist/providers/coding-proxy/memory-ledger.js +84 -8
  418. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  419. package/dist/providers/coding-proxy/metering.js +27 -4
  420. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
  421. package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
  422. package/dist/providers/coding-proxy/proxy.d.ts +14 -1
  423. package/dist/providers/coding-proxy/proxy.js +166 -14
  424. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  425. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  426. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  427. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  428. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  429. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  430. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  431. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  432. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  433. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  434. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  435. package/dist/providers/coding-proxy/registry/service.js +579 -112
  436. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  437. package/dist/providers/coding-proxy/registry/store.js +54 -1
  438. package/dist/providers/coding-proxy/runtime.d.ts +4 -0
  439. package/dist/providers/coding-proxy/runtime.js +78 -16
  440. package/dist/providers/coding-proxy/server.d.ts +6 -1
  441. package/dist/providers/coding-proxy/server.js +45 -1
  442. package/dist/providers/coding-proxy/types.d.ts +65 -1
  443. package/dist/providers/datastore/types.d.ts +5 -0
  444. package/dist/providers/engine/types.d.ts +36 -2
  445. package/dist/providers/engine/types.js +39 -0
  446. package/dist/providers/executor/composition.d.ts +31 -1
  447. package/dist/providers/executor/composition.js +81 -8
  448. package/dist/providers/executor/container.d.ts +385 -9
  449. package/dist/providers/executor/container.js +1234 -99
  450. package/dist/providers/executor/dbos-status.d.ts +31 -0
  451. package/dist/providers/executor/dbos-status.js +64 -0
  452. package/dist/providers/executor/dbos.d.ts +91 -0
  453. package/dist/providers/executor/dbos.js +319 -26
  454. package/dist/providers/executor/deferred.d.ts +44 -0
  455. package/dist/providers/executor/deferred.js +100 -0
  456. package/dist/providers/executor/in-process.d.ts +9 -1
  457. package/dist/providers/executor/in-process.js +14 -4
  458. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  459. package/dist/providers/executor/linked-issue-reader.js +30 -0
  460. package/dist/providers/executor/routing.d.ts +39 -10
  461. package/dist/providers/executor/routing.js +77 -32
  462. package/dist/providers/executor/types.d.ts +25 -0
  463. package/dist/providers/index.d.ts +2 -1
  464. package/dist/providers/issue-tracker/types.d.ts +17 -0
  465. package/dist/providers/issue-tracker/types.js +39 -1
  466. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  467. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  468. package/dist/providers/jobs/docker-isolation.d.ts +8 -0
  469. package/dist/providers/jobs/docker-isolation.js +17 -0
  470. package/dist/providers/jobs/docker.d.ts +1 -0
  471. package/dist/providers/jobs/docker.js +29 -4
  472. package/dist/providers/jobs/fake-kubernetes-api.d.ts +23 -2
  473. package/dist/providers/jobs/fake-kubernetes-api.js +45 -1
  474. package/dist/providers/jobs/kubernetes-api.d.ts +25 -1
  475. package/dist/providers/jobs/kubernetes-api.js +17 -0
  476. package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
  477. package/dist/providers/jobs/kubernetes-client.js +61 -3
  478. package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
  479. package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
  480. package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
  481. package/dist/providers/jobs/kubernetes-isolation.js +23 -1
  482. package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
  483. package/dist/providers/jobs/kubernetes-platform.js +38 -1
  484. package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
  485. package/dist/providers/jobs/kubernetes-preflight.js +4 -2
  486. package/dist/providers/jobs/kubernetes.d.ts +42 -2
  487. package/dist/providers/jobs/kubernetes.js +178 -19
  488. package/dist/providers/jobs/metadata-probes.d.ts +11 -0
  489. package/dist/providers/jobs/metadata-probes.js +13 -0
  490. package/dist/providers/jobs/types.d.ts +42 -0
  491. package/dist/providers/jobs/types.js +13 -1
  492. package/dist/providers/llm/anthropic.js +5 -1
  493. package/dist/providers/llm/bedrock.d.ts +0 -12
  494. package/dist/providers/llm/bedrock.js +4 -0
  495. package/dist/providers/llm/claude-messages.d.ts +3 -1
  496. package/dist/providers/llm/claude-messages.js +4 -1
  497. package/dist/providers/llm/claude-provider.d.ts +2 -2
  498. package/dist/providers/llm/claude-provider.js +2 -2
  499. package/dist/providers/llm/openai.d.ts +2 -2
  500. package/dist/providers/llm/openai.js +6 -2
  501. package/dist/providers/llm/routing.d.ts +2 -2
  502. package/dist/providers/llm/routing.js +2 -2
  503. package/dist/providers/llm/types.d.ts +12 -2
  504. package/dist/providers/review-host/github-events.d.ts +9 -1
  505. package/dist/providers/review-host/github-events.js +34 -12
  506. package/dist/providers/review-host/github.d.ts +39 -2
  507. package/dist/providers/review-host/github.js +274 -29
  508. package/dist/providers/review-host/local.d.ts +8 -4
  509. package/dist/providers/review-host/local.js +49 -31
  510. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  511. package/dist/providers/review-host/patch-pages.js +176 -0
  512. package/dist/providers/review-host/review-format.d.ts +19 -1
  513. package/dist/providers/review-host/review-format.js +38 -7
  514. package/dist/providers/review-host/types.d.ts +157 -2
  515. package/dist/providers/review-host/types.js +8 -0
  516. package/dist/providers/storage/gcs.d.ts +63 -0
  517. package/dist/providers/storage/gcs.js +69 -0
  518. package/dist/providers/storage/index.d.ts +15 -0
  519. package/dist/providers/storage/index.js +14 -0
  520. package/dist/providers/storage/local.d.ts +24 -0
  521. package/dist/providers/storage/local.js +92 -0
  522. package/dist/providers/storage/meter.d.ts +14 -0
  523. package/dist/providers/storage/meter.js +34 -0
  524. package/dist/providers/storage/s3.d.ts +41 -0
  525. package/dist/providers/storage/s3.js +107 -0
  526. package/dist/providers/storage/types.d.ts +37 -3
  527. package/dist/providers/storage/types.js +21 -4
  528. package/dist/providers/vcs/git.d.ts +33 -2
  529. package/dist/providers/vcs/git.js +324 -22
  530. package/dist/providers/vcs/github-remote.d.ts +26 -3
  531. package/dist/providers/vcs/github-remote.js +124 -14
  532. package/dist/providers/vcs/github.d.ts +246 -12
  533. package/dist/providers/vcs/github.js +521 -61
  534. package/dist/providers/vcs/index.js +8 -1
  535. package/dist/providers/vcs/pr-description.d.ts +127 -0
  536. package/dist/providers/vcs/pr-description.js +270 -0
  537. package/dist/providers/vcs/remote.d.ts +33 -1
  538. package/dist/providers/vcs/routing.d.ts +4 -2
  539. package/dist/providers/vcs/routing.js +6 -0
  540. package/dist/providers/vcs/types.d.ts +80 -3
  541. package/dist/quickstart/coding-seed.d.ts +21 -3
  542. package/dist/quickstart/coding-seed.js +283 -3
  543. package/dist/quickstart/images.d.ts +2 -0
  544. package/dist/quickstart/images.js +7 -1
  545. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  546. package/dist/quickstart/reviewer-prompt.js +6 -6
  547. package/dist/quickstart-images.json +1 -1
  548. package/dist/sandbox/brokered-fetch.d.ts +23 -0
  549. package/dist/sandbox/brokered-fetch.js +37 -0
  550. package/dist/sandbox/generated/zod.bundle.js +62 -1
  551. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  552. package/dist/sandbox/host-functions.d.ts +35 -0
  553. package/dist/sandbox/host-functions.js +150 -91
  554. package/dist/sandbox/prelude.js +7 -1
  555. package/dist/sandbox/run-in-sandbox.d.ts +19 -0
  556. package/dist/sandbox/run-in-sandbox.js +28 -10
  557. package/dist/sandbox/safe-fetch.d.ts +2 -0
  558. package/dist/sandbox/safe-fetch.js +3 -1
  559. package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
  560. package/dist/sandbox/secret-broker-sigv4.js +49 -0
  561. package/dist/sandbox/secret-broker.d.ts +34 -0
  562. package/dist/sandbox/secret-broker.js +161 -0
  563. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  564. package/dist/sandbox/user-tool.d.ts +14 -0
  565. package/dist/sandbox/user-tool.js +32 -0
  566. package/dist/sandbox/zod-params.d.ts +37 -5
  567. package/dist/sandbox/zod-params.js +181 -26
  568. package/dist/serve.js +25 -0
  569. package/dist/viewer/api-schema.d.ts +372 -2454
  570. package/dist/viewer/api-schema.js +29 -0
  571. package/dist/viewer/build-schemas.js +10 -3
  572. package/dist/viewer/event-bus.d.ts +6 -0
  573. package/dist/viewer/event-bus.js +16 -7
  574. package/dist/viewer/graph.d.ts +5 -2
  575. package/dist/viewer/graph.js +7 -2
  576. package/dist/viewer/http.d.ts +0 -1
  577. package/dist/viewer/http.js +2 -2
  578. package/dist/viewer/infra.js +25 -2
  579. package/dist/viewer/limits.d.ts +4 -0
  580. package/dist/viewer/limits.js +4 -0
  581. package/dist/viewer/openapi.d.ts +15 -0
  582. package/dist/viewer/openapi.js +170 -0
  583. package/dist/wardby-bin.js +10 -0
  584. package/docs/README.md +7 -0
  585. package/docs/agent-recipes.md +114 -27
  586. package/docs/architecture-runtime.md +16 -1
  587. package/docs/code-review-agents.md +689 -45
  588. package/docs/coding-agent-setup.md +602 -12
  589. package/docs/coding-packages.md +1037 -92
  590. package/docs/coding-services.md +30 -13
  591. package/docs/coding-worker-byo-images.md +218 -6
  592. package/docs/coding-worker-isolation.md +173 -44
  593. package/docs/getting-started-gke.md +332 -129
  594. package/docs/getting-started-identity-provider.md +31 -11
  595. package/docs/getting-started.md +14 -4
  596. package/docs/jira-agents.md +22 -9
  597. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  598. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  599. package/docs/knowledge/delegation-admission-slots.md +52 -0
  600. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  601. package/docs/knowledge/import-rename-target.md +52 -0
  602. package/docs/knowledge/index.md +57 -0
  603. package/docs/knowledge/log.md +9 -0
  604. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  605. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  606. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  607. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  608. package/docs/knowledge/overview-cli.md +74 -0
  609. package/docs/knowledge/overview-coding-proxy.md +72 -0
  610. package/docs/knowledge/overview-coding.md +72 -0
  611. package/docs/knowledge/overview-config.md +60 -0
  612. package/docs/knowledge/overview-core.md +72 -0
  613. package/docs/knowledge/overview-deploy.md +83 -0
  614. package/docs/knowledge/overview-mcp.md +61 -0
  615. package/docs/knowledge/overview-prisma.md +72 -0
  616. package/docs/knowledge/overview-providers.md +89 -0
  617. package/docs/knowledge/overview-sandbox.md +83 -0
  618. package/docs/knowledge/overview-surfaces.md +83 -0
  619. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  620. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  621. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  622. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  623. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  624. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  625. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  626. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  627. package/docs/knowledge/warm-input-publication.md +30 -0
  628. package/docs/knowledge/workspace-staging-failure.md +54 -0
  629. package/docs/knowledge.md +54 -14
  630. package/docs/native-sandbox.md +731 -0
  631. package/docs/observability.md +4 -0
  632. package/docs/release-verification.md +9 -0
  633. package/docs/security-deployment.md +146 -14
  634. package/docs/slack-notifications.md +268 -0
  635. package/docs/tool-secrets.md +284 -0
  636. package/docs/viewer-api.md +46 -5
  637. package/docs/viewer-api.openapi.yml +1404 -0
  638. package/help/admin-viewer.md +29 -3
  639. package/help/agent-recipes.md +27 -0
  640. package/help/architecture-agent.md +11 -6
  641. package/help/brokered-secrets.md +79 -0
  642. package/help/build-claude-code-image.md +131 -0
  643. package/help/build-worker-image.md +6 -7
  644. package/help/builder-agent.md +19 -6
  645. package/help/code-review-agents.md +243 -10
  646. package/help/coding-packages.md +156 -6
  647. package/help/cost-attribution.md +9 -5
  648. package/help/creating-agents.md +14 -1
  649. package/help/dependency-cache.md +143 -0
  650. package/help/deploy-gke.md +23 -9
  651. package/help/deployment-targets.md +25 -14
  652. package/help/errors/budget-exhausted.md +187 -0
  653. package/help/errors/budget-group-exhausted.md +5 -1
  654. package/help/errors/coding-provider-not-configured.md +2 -2
  655. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  656. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  657. package/help/errors/continuation-closed.md +9 -12
  658. package/help/errors/database-auth-invalid.md +28 -0
  659. package/help/errors/delegation-conflict.md +24 -0
  660. package/help/errors/file-list-truncated.md +45 -0
  661. package/help/errors/full-read-required.md +49 -0
  662. package/help/errors/github-account-not-allowed.md +29 -0
  663. package/help/errors/graph-incomplete.md +43 -0
  664. package/help/errors/graph-limit.md +43 -0
  665. package/help/errors/low-power-disabled.md +29 -0
  666. package/help/errors/low-power-scale-forbidden.md +35 -0
  667. package/help/errors/low-power-wake-timeout.md +30 -0
  668. package/help/errors/merge-conflict.md +49 -0
  669. package/help/errors/mobile-disabled.md +31 -0
  670. package/help/errors/native-sandbox-capacity.md +22 -0
  671. package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
  672. package/help/errors/native-sandbox-docker-failed.md +20 -0
  673. package/help/errors/native-sandbox-gateway-error.md +20 -0
  674. package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
  675. package/help/errors/native-sandbox-image-not-pinned.md +19 -0
  676. package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
  677. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  678. package/help/errors/native-sandbox-network-unenforced.md +22 -0
  679. package/help/errors/native-sandbox-requires-catalog.md +31 -0
  680. package/help/errors/native-sandbox-unavailable.md +19 -0
  681. package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
  682. package/help/errors/native-sandbox-worker-exited.md +21 -0
  683. package/help/errors/native-sandbox-worker-lost.md +20 -0
  684. package/help/errors/native-sandbox-worker-unready.md +22 -0
  685. package/help/errors/package-not-allowed-pending.md +52 -0
  686. package/help/errors/package-not-allowed.md +51 -0
  687. package/help/errors/package-refusals.md +43 -0
  688. package/help/errors/patch-cursor-malformed.md +31 -0
  689. package/help/errors/run-lost.md +39 -0
  690. package/help/errors/run-transcript-download.md +44 -0
  691. package/help/errors/secret-broker-body-invalid.md +26 -0
  692. package/help/errors/secret-broker-changed.md +20 -0
  693. package/help/errors/secret-broker-config-invalid.md +30 -0
  694. package/help/errors/secret-broker-conflict.md +27 -0
  695. package/help/errors/secret-broker-destination-denied.md +28 -0
  696. package/help/errors/secret-broker-value-invalid.md +28 -0
  697. package/help/errors/secret-brokered.md +24 -0
  698. package/help/errors/secret-in-value.md +69 -0
  699. package/help/errors/secret-not-brokered.md +25 -0
  700. package/help/errors/slack-auth-failed.md +48 -0
  701. package/help/errors/slack-channel-unreachable.md +39 -0
  702. package/help/errors/slack-not-configured.md +33 -0
  703. package/help/errors/target-merge.md +40 -0
  704. package/help/fix-merge-conflicts.md +73 -0
  705. package/help/getting-started.md +4 -5
  706. package/help/github-app-setup.md +132 -0
  707. package/help/github.md +40 -1
  708. package/help/identity-and-access.md +7 -1
  709. package/help/jira.md +23 -6
  710. package/help/knowledge.md +16 -7
  711. package/help/local-repositories.md +3 -4
  712. package/help/low-power-mode.md +131 -0
  713. package/help/merge-order-check.md +122 -0
  714. package/help/mobile-app.md +54 -0
  715. package/help/native-capabilities.md +29 -1
  716. package/help/native-sandbox.md +150 -0
  717. package/help/observability.md +8 -0
  718. package/help/operating-agents.md +5 -0
  719. package/help/package-audit-mode.md +91 -0
  720. package/help/related-pull-requests.md +80 -16
  721. package/help/repo-instructions-and-skills.md +91 -0
  722. package/help/resume-runs-locally.md +131 -0
  723. package/help/review-fix-rounds.md +43 -1
  724. package/help/sharing-agents.md +59 -0
  725. package/help/slack-notifications.md +76 -0
  726. package/help/status-comments.md +31 -0
  727. package/help/stop-run.md +58 -0
  728. package/help/troubleshooting/budgets.md +28 -0
  729. package/help/troubleshooting/coding-workers.md +99 -7
  730. package/package.json +27 -13
  731. package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
  732. package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
  733. package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
  734. package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
  735. package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
  736. package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
  737. package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
  738. package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
  739. package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
  740. package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
  741. package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
  742. package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
  743. package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
  744. package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
  745. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  746. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  747. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  748. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  749. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  750. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  751. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  752. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  753. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  754. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  755. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  756. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  757. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  758. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  759. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  760. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  761. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  762. package/prisma/schema.prisma +631 -146
  763. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -0,0 +1,30 @@
1
+ /** A tracker read for a continuation's task must not hold up its launch. */
2
+ const TRACKER_READ_TIMEOUT_MS = 10_000;
3
+ /**
4
+ * The executor's readLinkedIssue: a GitHub issue through the review host's
5
+ * issue read (the App's installation token for the run's repository), a Jira
6
+ * issue through the configured tracker. Null when the number is a pull
7
+ * request, the issue is missing, or no host or tracker is configured.
8
+ */
9
+ export function linkedIssueReader(deps) {
10
+ return async (ref) => {
11
+ if (ref.provider === "github") {
12
+ const host = deps.hosts.github;
13
+ if (!host?.readIssue)
14
+ return null;
15
+ // Title and body only: the task carries the ticket, not its discussion.
16
+ const result = await host.readIssue(ref.repository, ref.number, { comments: false });
17
+ return result.kind === "issue" ? { title: result.title, body: result.body } : null;
18
+ }
19
+ const tracker = deps.issueTrackers.jira;
20
+ if (!tracker)
21
+ return null;
22
+ const view = await tracker.getIssue(ref.key, {
23
+ maxComments: 0,
24
+ agentMarker: "",
25
+ timeoutMs: TRACKER_READ_TIMEOUT_MS,
26
+ retryOn429: false,
27
+ });
28
+ return { title: view.summary, body: view.description };
29
+ };
30
+ }
@@ -1,25 +1,51 @@
1
- import type { CodingImageSelector, Executor, ExecutionRecoveryResult, PersistedExecutionHandle } from "./types.js";
2
1
  import type { CodingProvider } from "../../coding/provider.js";
2
+ import type { CodingImageSelector, Executor, ExecutionRecoveryResult, PersistedExecutionHandle } from "./types.js";
3
+ /**
4
+ * Which executor owns a run: a coding run, a native run in the control plane
5
+ * (in-process or DBOS), or a native run in an isolated sandbox worker. Read
6
+ * from the run's own row (agent kind plus Run.nativeExecutionMode), never from
7
+ * the agent's current setting, so a setting change reaches only later runs.
8
+ */
9
+ export type ExecutionTarget = "native" | "native-sandbox" | "coding";
3
10
  export interface ExecutionKindResolver {
4
- kindForRun(runId: string): Promise<"native" | "coding" | null>;
11
+ kindForRun(runId: string): Promise<ExecutionTarget | null>;
5
12
  }
6
- /** Keeps native execution unchanged while routing coding runs to isolation. */
13
+ /**
14
+ * Keeps native execution unchanged while routing coding runs to isolation and
15
+ * sandbox-mode native runs to the native sandbox executor.
16
+ *
17
+ * With no sandbox executor composed in, a sandbox run goes to the native
18
+ * executor, whose runner refuses to execute it (executeRun fails it before
19
+ * any spend, closing its host check and status comments): fail closed through
20
+ * the one path that already finishes a run properly, never a silent run in
21
+ * the control plane.
22
+ */
7
23
  export declare class RoutingExecutor implements Executor {
8
24
  private readonly resolver;
9
25
  private readonly native;
10
26
  private readonly coding;
11
- constructor(resolver: ExecutionKindResolver, native: Executor, coding: Executor);
27
+ private readonly sandbox?;
28
+ constructor(resolver: ExecutionKindResolver, native: Executor, coding: Executor, sandbox?: Executor | undefined);
29
+ private route;
12
30
  start(runId: string): Promise<void>;
13
31
  stop(runId: string, reason?: string): Promise<void>;
14
32
  /**
15
- * Recovery is routed by the run's agent kind, exactly like start/stop: a
16
- * native run's handle belongs to the native executor (e.g. a DBOS
17
- * workflow handle), a coding run's to the container executor. Routing by
18
- * handle backend would need this class to know every backend name.
33
+ * Recovery is routed by the run's target, exactly like start/stop: a native
34
+ * run's handle belongs to the native executor (e.g. a DBOS workflow handle),
35
+ * a sandbox run's to the sandbox executor, a coding run's to the container
36
+ * executor. Routing by handle backend would need this class to know every
37
+ * backend name.
19
38
  */
20
39
  recover(handle: PersistedExecutionHandle): Promise<ExecutionRecoveryResult>;
21
- /** Lifecycle fans out to both executors; each is optional on the seam. */
40
+ /** Only coding runs wait in the coding queue, so only the coding executor is asked. */
41
+ cleanupQueueTimeout(runId: string): Promise<void>;
42
+ /** Each distinct executor once, in a fixed order: native, coding, sandbox. */
43
+ private distinct;
44
+ /** Lifecycle fans out to every distinct executor; each hook is optional on the seam. */
22
45
  launch(): Promise<void>;
46
+ /** Fans out like `launch`. */
47
+ warmUp(): Promise<void>;
48
+ /** Reverse of `launch`. */
23
49
  close(): Promise<void>;
24
50
  resolveCodingWorkerImage(selector: CodingImageSelector): string;
25
51
  resolveCodingToolImage(selector: CodingImageSelector): string | null;
@@ -33,6 +59,7 @@ export declare class RoutingExecutor implements Executor {
33
59
  path: string;
34
60
  maxBytes: number;
35
61
  }): Promise<string | null>;
62
+ supportsNativeSandbox(): boolean;
36
63
  supportsCodingServices(provider: CodingProvider): boolean;
37
64
  }
38
65
  export declare class PrismaExecutionKindResolver implements ExecutionKindResolver {
@@ -44,6 +71,7 @@ export declare class PrismaExecutionKindResolver implements ExecutionKindResolve
44
71
  id: string;
45
72
  };
46
73
  select: {
74
+ nativeExecutionMode: true;
47
75
  agent: {
48
76
  select: {
49
77
  kind: true;
@@ -51,11 +79,12 @@ export declare class PrismaExecutionKindResolver implements ExecutionKindResolve
51
79
  };
52
80
  };
53
81
  }): Promise<{
82
+ nativeExecutionMode: string | null;
54
83
  agent: {
55
84
  kind: string;
56
85
  };
57
86
  } | null>;
58
87
  };
59
88
  });
60
- kindForRun(runId: string): Promise<"native" | "coding" | null>;
89
+ kindForRun(runId: string): Promise<ExecutionTarget | null>;
61
90
  }
@@ -1,53 +1,90 @@
1
- /** Keeps native execution unchanged while routing coding runs to isolation. */
1
+ /**
2
+ * Keeps native execution unchanged while routing coding runs to isolation and
3
+ * sandbox-mode native runs to the native sandbox executor.
4
+ *
5
+ * With no sandbox executor composed in, a sandbox run goes to the native
6
+ * executor, whose runner refuses to execute it (executeRun fails it before
7
+ * any spend, closing its host check and status comments): fail closed through
8
+ * the one path that already finishes a run properly, never a silent run in
9
+ * the control plane.
10
+ */
2
11
  export class RoutingExecutor {
3
12
  resolver;
4
13
  native;
5
14
  coding;
6
- constructor(resolver, native, coding) {
15
+ sandbox;
16
+ constructor(resolver, native, coding, sandbox) {
7
17
  this.resolver = resolver;
8
18
  this.native = native;
9
19
  this.coding = coding;
20
+ this.sandbox = sandbox;
21
+ }
22
+ async route(runId) {
23
+ const target = await this.resolver.kindForRun(runId);
24
+ if (target === "native")
25
+ return { target, executor: this.native };
26
+ if (target === "native-sandbox")
27
+ return { target, executor: this.sandbox ?? this.native };
28
+ if (target === "coding")
29
+ return { target, executor: this.coding };
30
+ return null;
10
31
  }
11
32
  async start(runId) {
12
- const kind = await this.resolver.kindForRun(runId);
13
- if (kind === "native")
14
- return this.native.start(runId);
15
- if (kind === "coding")
16
- return this.coding.start(runId);
17
- throw new Error("executor_run_not_found");
33
+ const routed = await this.route(runId);
34
+ if (!routed)
35
+ throw new Error("executor_run_not_found");
36
+ return routed.executor.start(runId);
18
37
  }
19
38
  async stop(runId, reason) {
20
- const kind = await this.resolver.kindForRun(runId);
21
- if (kind === "native")
22
- return this.native.stop(runId, reason);
23
- if (kind === "coding")
24
- return this.coding.stop(runId, reason);
39
+ const routed = await this.route(runId);
40
+ if (routed)
41
+ return routed.executor.stop(runId, reason);
25
42
  }
26
43
  /**
27
- * Recovery is routed by the run's agent kind, exactly like start/stop: a
28
- * native run's handle belongs to the native executor (e.g. a DBOS
29
- * workflow handle), a coding run's to the container executor. Routing by
30
- * handle backend would need this class to know every backend name.
44
+ * Recovery is routed by the run's target, exactly like start/stop: a native
45
+ * run's handle belongs to the native executor (e.g. a DBOS workflow handle),
46
+ * a sandbox run's to the sandbox executor, a coding run's to the container
47
+ * executor. Routing by handle backend would need this class to know every
48
+ * backend name.
31
49
  */
32
50
  async recover(handle) {
33
- const kind = await this.resolver.kindForRun(handle.runId);
34
- if (kind === "native") {
35
- if (!this.native.recover)
36
- return { state: "lost", reason: "native_recovery_unavailable" };
37
- return this.native.recover(handle);
51
+ const routed = await this.route(handle.runId);
52
+ const target = routed?.target ?? "coding";
53
+ const executor = routed?.executor ?? this.coding;
54
+ if (!executor.recover) {
55
+ const reason = target === "native"
56
+ ? "native_recovery_unavailable"
57
+ : target === "native-sandbox" && this.sandbox
58
+ ? "native_sandbox_recovery_unavailable"
59
+ : target === "native-sandbox"
60
+ ? "native_recovery_unavailable"
61
+ : "coding_recovery_unavailable";
62
+ return { state: "lost", reason };
38
63
  }
39
- if (!this.coding.recover)
40
- return { state: "lost", reason: "coding_recovery_unavailable" };
41
- return this.coding.recover(handle);
64
+ return executor.recover(handle);
65
+ }
66
+ /** Only coding runs wait in the coding queue, so only the coding executor is asked. */
67
+ async cleanupQueueTimeout(runId) {
68
+ await this.coding.cleanupQueueTimeout?.(runId);
69
+ }
70
+ /** Each distinct executor once, in a fixed order: native, coding, sandbox. */
71
+ distinct() {
72
+ return [this.native, this.coding, this.sandbox].filter((executor, index, all) => executor !== undefined && all.indexOf(executor) === index);
42
73
  }
43
- /** Lifecycle fans out to both executors; each is optional on the seam. */
74
+ /** Lifecycle fans out to every distinct executor; each hook is optional on the seam. */
44
75
  async launch() {
45
- await this.native.launch?.();
46
- await this.coding.launch?.();
76
+ for (const executor of this.distinct())
77
+ await executor.launch?.();
47
78
  }
79
+ /** Fans out like `launch`. */
80
+ async warmUp() {
81
+ for (const executor of this.distinct())
82
+ await executor.warmUp?.();
83
+ }
84
+ /** Reverse of `launch`. */
48
85
  async close() {
49
- await this.coding.close?.();
50
- await this.native.close?.();
86
+ for (const executor of this.distinct().reverse())
87
+ await executor.close?.();
51
88
  }
52
89
  resolveCodingWorkerImage(selector) {
53
90
  if (!this.coding.resolveCodingWorkerImage)
@@ -69,6 +106,9 @@ export class RoutingExecutor {
69
106
  return null;
70
107
  return this.coding.readCodingRepositoryFile(input);
71
108
  }
109
+ supportsNativeSandbox() {
110
+ return this.sandbox !== undefined;
111
+ }
72
112
  supportsCodingServices(provider) {
73
113
  return this.coding.supportsCodingServices?.(provider) === true;
74
114
  }
@@ -81,8 +121,13 @@ export class PrismaExecutionKindResolver {
81
121
  async kindForRun(runId) {
82
122
  const run = await this.db.run.findUnique({
83
123
  where: { id: runId },
84
- select: { agent: { select: { kind: true } } },
124
+ select: { nativeExecutionMode: true, agent: { select: { kind: true } } },
85
125
  });
86
- return run?.agent.kind === "native" || run?.agent.kind === "coding" ? run.agent.kind : null;
126
+ if (run?.agent.kind === "coding")
127
+ return "coding";
128
+ if (run?.agent.kind !== "native")
129
+ return null;
130
+ // Null = a run from before the snapshot existed: the control plane, as it always ran.
131
+ return run.nativeExecutionMode === "sandbox" ? "native-sandbox" : "native";
87
132
  }
88
133
  }
@@ -35,6 +35,14 @@ export interface Executor {
35
35
  * terminal Run persistence completed. Recovery must never relaunch a job.
36
36
  */
37
37
  recover?: (handle: PersistedExecutionHandle) => Promise<ExecutionRecoveryResult>;
38
+ /**
39
+ * Called by drainCodingQueue for each queued coding run it failed with coding_queue_timeout, after
40
+ * that write: releases what an earlier attempt of the run left (a launch the backend refused for
41
+ * capacity), such as a continuation's in-progress host signal and its input artifact. Best effort;
42
+ * a throw is logged by the caller. Optional: an executor that never leaves a queued run anything
43
+ * to release omits it.
44
+ */
45
+ cleanupQueueTimeout?: (runId: string) => Promise<void>;
38
46
  /**
39
47
  * Optional one-time startup. A durable backend connects and re-drives the
40
48
  * workflows it owned before the last restart. Composition roots call it
@@ -43,6 +51,13 @@ export interface Executor {
43
51
  launch?: () => Promise<void>;
44
52
  /** Optional graceful shutdown counterpart to `launch`. */
45
53
  close?: () => Promise<void>;
54
+ /**
55
+ * Fire-and-forget start-up warm-up, called only from a long-running server process's own
56
+ * start-up (`wardby serve`, the MCP server, `wardby scheduler`) — never from a one-shot CLI
57
+ * command. Delegates to the coding job launcher's own `warmUp` (e.g. Kubernetes's memoized
58
+ * cluster preflight); never throws.
59
+ */
60
+ warmUp?: () => Promise<void>;
46
61
  /**
47
62
  * Resolves a coding agent's profile selection to an immutable worker
48
63
  * image digest, once, at dispatch time (src/core/dispatch.ts) — never
@@ -85,5 +100,15 @@ export interface Executor {
85
100
  * says so (Kubernetes and Docker, for Codex and Claude Code).
86
101
  */
87
102
  supportsCodingServices?(provider: CodingProvider): boolean;
103
+ /**
104
+ * Whether this executor can run sandbox-mode native runs (a native sandbox executor is composed
105
+ * in). MCP refuses to set an agent to sandbox mode where it cannot (docs/native-sandbox.md).
106
+ */
107
+ supportsNativeSandbox?(): boolean;
108
+ /**
109
+ * true: this executor cannot resolve coding inputs; dispatch records the coding run unresolved
110
+ * and the process that starts it resolves them (resolveDeferredCodingRun).
111
+ */
112
+ defersCodingResolution?: boolean;
88
113
  }
89
114
  import type { CodingProvider } from "../../coding/provider.js";
@@ -34,7 +34,8 @@ export interface ProviderRegistry {
34
34
  llm: LlmProvider;
35
35
  secrets: SecretCipher;
36
36
  auth: AuthProvider;
37
- storage: BlobStore;
37
+ /** Absent unless BLOB_STORE is configured. */
38
+ storage?: BlobStore;
38
39
  executor: Executor;
39
40
  datastore: Datastore;
40
41
  memory: AgentMemoryStore;
@@ -264,6 +264,23 @@ export interface IssueEvent {
264
264
  }
265
265
  /** Shared by the ingress and the tools: a Jira issue key, e.g. PROJ-123. */
266
266
  export declare const ISSUE_KEY: RegExp;
267
+ /** A GitHub issue's recorded key (githubIssueKey): "<owner>/<repo>#<number>", the repository normalised to lowercase. */
268
+ export declare const GITHUB_ISSUE_KEY: RegExp;
269
+ /** The product name of each system an issue can be recorded from (CodingRun / IssuePullRequest issueProvider). */
270
+ export declare const ISSUE_SOURCE_NAMES: Readonly<Record<string, string>>;
271
+ /**
272
+ * A recorded issue (CodingRun / IssuePullRequest issueProvider + issueKey) as
273
+ * people see it: the key re-validated for its provider, the system's name and
274
+ * the issue's page. A GitHub issue's page comes from its key; a tracker
275
+ * issue's from `trackerUrl` (the tracker's issueUrl), dropped when it throws
276
+ * or is not https. Undefined for an unknown provider or a malformed key.
277
+ */
278
+ export declare function issueReference(provider: string, key: string, trackerUrl?: (key: string) => string | undefined): {
279
+ key: string;
280
+ url?: string;
281
+ trackerName: string;
282
+ } | undefined;
267
283
  /** A Jira project key. */
268
284
  export declare const PROJECT_KEY: RegExp;
285
+ /** An issue key's project: a Jira key's project key ("PROJ-123" → "PROJ"); a GitHub issue key's repository ("owner/repo#5" → "owner/repo"). */
269
286
  export declare const projectOf: (issueKey: string) => string;
@@ -11,6 +11,44 @@ export class IssueTrackerError extends Error {
11
11
  }
12
12
  /** Shared by the ingress and the tools: a Jira issue key, e.g. PROJ-123. */
13
13
  export const ISSUE_KEY = /^[A-Z][A-Z0-9_]{0,254}-[1-9]\d{0,9}$/;
14
+ /** A GitHub issue's recorded key (githubIssueKey): "<owner>/<repo>#<number>", the repository normalised to lowercase. */
15
+ export const GITHUB_ISSUE_KEY = /^[a-z0-9](?:[a-z0-9-]{0,37}[a-z0-9])?\/[a-z0-9._-]{1,100}#[1-9]\d{0,9}$/;
16
+ /** The product name of each system an issue can be recorded from (CodingRun / IssuePullRequest issueProvider). */
17
+ export const ISSUE_SOURCE_NAMES = { ...ISSUE_TRACKER_NAMES, github: "GitHub" };
18
+ /**
19
+ * A recorded issue (CodingRun / IssuePullRequest issueProvider + issueKey) as
20
+ * people see it: the key re-validated for its provider, the system's name and
21
+ * the issue's page. A GitHub issue's page comes from its key; a tracker
22
+ * issue's from `trackerUrl` (the tracker's issueUrl), dropped when it throws
23
+ * or is not https. Undefined for an unknown provider or a malformed key.
24
+ */
25
+ export function issueReference(provider, key, trackerUrl) {
26
+ let url;
27
+ if (provider === "github") {
28
+ if (!GITHUB_ISSUE_KEY.test(key))
29
+ return undefined;
30
+ const hash = key.lastIndexOf("#");
31
+ url = `https://github.com/${key.slice(0, hash)}/issues/${key.slice(hash + 1)}`;
32
+ }
33
+ else if (provider === "jira") {
34
+ if (!ISSUE_KEY.test(key))
35
+ return undefined;
36
+ try {
37
+ url = trackerUrl?.(key);
38
+ }
39
+ catch {
40
+ url = undefined;
41
+ }
42
+ }
43
+ else {
44
+ return undefined;
45
+ }
46
+ return { key, ...(url?.startsWith("https://") ? { url } : {}), trackerName: ISSUE_SOURCE_NAMES[provider] };
47
+ }
14
48
  /** A Jira project key. */
15
49
  export const PROJECT_KEY = /^[A-Z][A-Z0-9_]{0,254}$/;
16
- export const projectOf = (issueKey) => issueKey.slice(0, issueKey.lastIndexOf("-"));
50
+ /** An issue key's project: a Jira key's project key ("PROJ-123" → "PROJ"); a GitHub issue key's repository ("owner/repo#5" → "owner/repo"). */
51
+ export const projectOf = (issueKey) => {
52
+ const hash = issueKey.lastIndexOf("#");
53
+ return issueKey.slice(0, hash >= 0 ? hash : issueKey.lastIndexOf("-"));
54
+ };
@@ -19,5 +19,9 @@ export interface ClaudeToolSetup {
19
19
  content: string;
20
20
  mode: number;
21
21
  }[];
22
+ /** Present only when the run's dependency cache is on, so older tool runners see an unchanged setup. */
23
+ dependencyCache?: true;
24
+ /** With dependencyCache only: the workspace volume size (limits.diskMb) the cache must stay inside. */
25
+ diskMb?: number;
22
26
  }
23
27
  export declare function claudeToolSetup(spec: JobSpec, capability: string): string;
@@ -2,8 +2,10 @@
2
2
  * What Claude Code's tool runner (the credential-free container that runs commands in the
3
3
  * repository) needs from the trusted launcher: the package-registry settings every Codex shell
4
4
  * gets, built from the run's registry-only token (deriveRegistryToken, never the capability), and
5
- * the run's service test variables. Delivered as CLAUDE_TOOL_SETUP_ENV: a Kubernetes Secret key, or
6
- * `docker create --env NAME` with the value in the CLI's own environment.
5
+ * the run's service test variables, and whether the run's dependency cache is on. Delivered as the
6
+ * WARDBY_TOOL_SETUP environment variable (CLAUDE_TOOL_SETUP_ENV, docker-isolation.ts; a test keeps it
7
+ * equal to the tool runner's TOOL_SETUP_ENV): a Kubernetes Secret key, or `docker create --env NAME`
8
+ * with the value in the CLI's own environment.
7
9
  */
8
10
  import { serviceEnvironment } from "../../coding-worker/driver.js";
9
11
  import { registryWorkerSetup } from "../../coding/registry/worker-config.js";
@@ -35,6 +37,7 @@ export function claudeToolSetup(spec, capability) {
35
37
  // Same precedence as the Codex driver: the registry's own settings win over a service's.
36
38
  env: { ...serviceEnvironment(spec.services), ...registry.env },
37
39
  files: registry.files,
40
+ ...(spec.dependencyCache ? { dependencyCache: true, diskMb: spec.limits.diskMb } : {}),
38
41
  };
39
42
  const raw = JSON.stringify(setup);
40
43
  const limits = CLAUDE_TOOL_SETUP_LIMITS;
@@ -25,6 +25,14 @@ export declare const CLAUDE_TOOL_SETUP_ENV = "WARDBY_TOOL_SETUP";
25
25
  export declare const CODING_PROXY_DENY_PORT = 8788;
26
26
  export declare const DOCKER_ISOLATION_ERROR = "docker_isolation_unsupported";
27
27
  export declare const WORKER_STOP_GRACE_SECONDS = 10;
28
+ /** The Claude worker's SDK config dir (claude-coding-worker/driver.ts CLAUDE_CONFIG_DIR). */
29
+ export declare const CLAUDE_CONFIG_PATH = "/tmp/claude-config";
30
+ /**
31
+ * Its own memory-backed scratch on a session-resume run: room for a session file up to the largest the
32
+ * control plane reads (coding/protocol.ts MAX_RAW_TRANSCRIPT_BYTES, 64 MiB) plus the SDK's small config
33
+ * files. Past it the SDK's writes there fail with ENOSPC, as /tmp's would; /tmp itself keeps its room.
34
+ */
35
+ export declare const CLAUDE_CONFIG_SCRATCH_MIB = 80;
28
36
  export declare const WORKER_PATHS: {
29
37
  readonly workspace: "/workspace";
30
38
  readonly git: "/workspace/.git";
@@ -28,6 +28,14 @@ export const CLAUDE_TOOL_SETUP_ENV = "WARDBY_TOOL_SETUP";
28
28
  export const CODING_PROXY_DENY_PORT = 8788;
29
29
  export const DOCKER_ISOLATION_ERROR = "docker_isolation_unsupported";
30
30
  export const WORKER_STOP_GRACE_SECONDS = 10;
31
+ /** The Claude worker's SDK config dir (claude-coding-worker/driver.ts CLAUDE_CONFIG_DIR). */
32
+ export const CLAUDE_CONFIG_PATH = "/tmp/claude-config";
33
+ /**
34
+ * Its own memory-backed scratch on a session-resume run: room for a session file up to the largest the
35
+ * control plane reads (coding/protocol.ts MAX_RAW_TRANSCRIPT_BYTES, 64 MiB) plus the SDK's small config
36
+ * files. Past it the SDK's writes there fail with ENOSPC, as /tmp's would; /tmp itself keeps its room.
37
+ */
38
+ export const CLAUDE_CONFIG_SCRATCH_MIB = 80;
31
39
  export const WORKER_PATHS = {
32
40
  workspace: "/workspace",
33
41
  git: "/workspace/.git",
@@ -90,6 +98,9 @@ function validateSpec(spec) {
90
98
  else if (spec.toolImage !== undefined) {
91
99
  throw isolationError();
92
100
  }
101
+ if (spec.sessionResume !== undefined && (spec.sessionResume !== true || spec.provider !== "claude-code")) {
102
+ throw isolationError();
103
+ }
93
104
  if (spec.services !== undefined) {
94
105
  // docker-services.ts re-validates every entry against the catalog schema. Both providers' shells
95
106
  // share the network keeper's namespace: Codex's worker, and Claude Code's tool runner.
@@ -432,6 +443,12 @@ export function buildClaudeAgentCreateArgs(spec, proxyPort = CODING_PROXY_PORT)
432
443
  `/tmp:rw,noexec,nosuid,nodev,size=${scratchMb}m,mode=1777`,
433
444
  "--tmpfs",
434
445
  `/home/wardby:rw,noexec,nosuid,nodev,size=${scratchMb}m,uid=${CODING_WORKER_UID},gid=${CODING_WORKER_GID},mode=0700`,
446
+ ...(spec.sessionResume
447
+ ? [
448
+ "--tmpfs",
449
+ `${CLAUDE_CONFIG_PATH}:rw,noexec,nosuid,nodev,size=${CLAUDE_CONFIG_SCRATCH_MIB}m,uid=${CODING_WORKER_UID},gid=${CODING_WORKER_GID},mode=0700`,
450
+ ]
451
+ : []),
435
452
  "--mount",
436
453
  `type=volume,src=${names.storageVolume},dst=${WORKER_PATHS.input},volume-subpath=input,volume-nocopy,readonly`,
437
454
  "--mount",
@@ -164,6 +164,7 @@ export declare class DockerJobLauncher implements WorkspaceJobLauncher {
164
164
  private removeNetworkIfAttested;
165
165
  private removeVolumeIfAttested;
166
166
  private seedRun;
167
+ readTranscript(handle: JobHandle, maxBytes: number): Promise<string | undefined>;
167
168
  private readResultArtifact;
168
169
  private readWorkerFailureDiagnostic;
169
170
  private keeperName;
@@ -7,7 +7,7 @@ import { dirname, isAbsolute, join, resolve, sep } from "node:path";
7
7
  import { logger } from "../../core/logger.js";
8
8
  import { ensurePrivateDirectory } from "../../core/private-directory.js";
9
9
  import { readBoundedRegularFile } from "../../coding-worker/artifact.js";
10
- import { parseCodingAgentOutputJson, redactAndTruncate, MAX_CODING_ARTIFACT_BYTES, MAX_CODING_OUTPUT_ISSUES, SAFE_CODING_OUTPUT_ISSUE, } from "../../coding/protocol.js";
10
+ import { parseCodingWorkerOutputJson, redactAndTruncate, MAX_CODING_ARTIFACT_BYTES, MAX_CODING_INPUT_BYTES, MAX_CODING_OUTPUT_ISSUES, SAFE_CODING_OUTPUT_ISSUE, } from "../../coding/protocol.js";
11
11
  import { assertDockerHostSupportsIsolation, assertClaudeAgentContainerInspection, assertClaudeToolRunnerContainerInspection, assertIsolationNetworkInspection, assertKeeperContainerInspection, assertNetworkKeeperContainerInspection, assertProxyContainerInspection, assertStorageVolumeInspection, assertWorkerContainerInspection, buildDockerIsolationPlan, CLAUDE_TOOL_SETUP_ENV, dockerSupportsServicesFor, } from "./docker-isolation.js";
12
12
  import { serviceUnreadyError } from "../../coding/services/wording.js";
13
13
  import { assertServiceContainerInspection, buildDockerServicePlan, dockerServiceContainerNames, } from "./docker-services.js";
@@ -272,7 +272,7 @@ export class NodeDockerArtifactTransfer {
272
272
  }
273
273
  async seedInput(sourceFile, container) {
274
274
  const metadata = await lstat(sourceFile);
275
- if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > MAX_CODING_ARTIFACT_BYTES) {
275
+ if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > MAX_CODING_INPUT_BYTES) {
276
276
  throw new Error("docker_input_artifact_invalid");
277
277
  }
278
278
  const docker = new NodeDockerCommandRunner({
@@ -1067,13 +1067,38 @@ export class DockerJobLauncher {
1067
1067
  await this.transfer.seedDirectory(resolve(runRoot, "git"), keeper, "/run/wardby/storage/git");
1068
1068
  await this.transfer.seedInput(record.spec.inputArtifact, keeper);
1069
1069
  }
1070
+ async readTranscript(handle, maxBytes) {
1071
+ await this.ready;
1072
+ const record = await this.findRecord(handle);
1073
+ if (!record)
1074
+ return undefined;
1075
+ const staging = await mkdtemp(join(this.stateRoot, ".wardby-transcript-"));
1076
+ const target = join(staging, "session.jsonl");
1077
+ try {
1078
+ try {
1079
+ await this.run([
1080
+ "container",
1081
+ "cp",
1082
+ `${this.keeperName(record)}:/run/wardby/storage/output/session.jsonl`,
1083
+ target,
1084
+ ]);
1085
+ }
1086
+ catch {
1087
+ return undefined;
1088
+ }
1089
+ return await readBoundedRegularFile(target, maxBytes, "transcript_too_large");
1090
+ }
1091
+ finally {
1092
+ await rm(staging, { recursive: true, force: true });
1093
+ }
1094
+ }
1070
1095
  async readResultArtifact(record) {
1071
1096
  const staging = await mkdtemp(join(this.stateRoot, ".wardby-result-"));
1072
1097
  const target = join(staging, "result.json");
1073
1098
  try {
1074
1099
  await this.run(["container", "cp", `${this.keeperName(record)}:/run/wardby/storage/output/result.json`, target]);
1075
1100
  const raw = await readBoundedRegularFile(target, MAX_CODING_ARTIFACT_BYTES, "docker_result_artifact_invalid");
1076
- const output = parseCodingAgentOutputJson(raw);
1101
+ const output = parseCodingWorkerOutputJson(raw);
1077
1102
  if (output.runId !== record.runId)
1078
1103
  throw new Error("docker_result_run_mismatch");
1079
1104
  return JSON.stringify(output);
@@ -1174,7 +1199,7 @@ export class DockerJobLauncher {
1174
1199
  }
1175
1200
  async validateInputArtifact(path) {
1176
1201
  const metadata = await lstat(path);
1177
- if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > MAX_CODING_ARTIFACT_BYTES) {
1202
+ if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > MAX_CODING_INPUT_BYTES) {
1178
1203
  throw new Error("docker_input_artifact_invalid");
1179
1204
  }
1180
1205
  }
@@ -1,4 +1,4 @@
1
- import type { V1ConfigMap, V1Endpoints, V1NetworkPolicy, V1Pod, V1ResourceQuota, V1Secret, V1Service } from "@kubernetes/client-node";
1
+ import type { V1ConfigMap, V1Deployment, V1Endpoints, V1NetworkPolicy, V1Pod, V1ResourceQuota, V1Secret, V1Service } from "@kubernetes/client-node";
2
2
  import type { Readable, Writable } from "node:stream";
3
3
  import { type KubernetesApi, type KubernetesExecOptions } from "./kubernetes-api.js";
4
4
  export interface FakeExecCall {
@@ -10,7 +10,7 @@ export interface FakeExecCall {
10
10
  stdout?: Writable;
11
11
  timeoutMs: number;
12
12
  }
13
- type Kind = "configmap" | "secret" | "pod" | "networkpolicy" | "service" | "endpoints" | "resourcequota";
13
+ type Kind = "configmap" | "secret" | "pod" | "networkpolicy" | "service" | "endpoints" | "resourcequota" | "deployment";
14
14
  type Obj = {
15
15
  metadata?: {
16
16
  name?: string;
@@ -31,6 +31,19 @@ export declare class FakeKubernetesApi implements KubernetesApi {
31
31
  onExec: (call: FakeExecCall) => Promise<number>;
32
32
  /** The admission chain a dry-run create runs through. Default: echo the pod back unchanged. */
33
33
  onDryRunCreatePod: (namespace: string, body: V1Pod) => Promise<V1Pod>;
34
+ /** Runs at the start of every pod create; tests throw KubernetesQuotaExceededError (or anything) from it. */
35
+ onCreatePod: (namespace: string, body: V1Pod) => Promise<void>;
36
+ readonly deploymentPatches: Array<{
37
+ name: string;
38
+ replicas?: number;
39
+ annotations?: Record<string, string>;
40
+ }>;
41
+ /** Deployment names whose patch throws KubernetesForbiddenError. */
42
+ forbidden: Set<string>;
43
+ /** "deployment/<name>" or "endpoints/<name>" keys whose read throws KubernetesForbiddenError. */
44
+ forbiddenReads: Set<string>;
45
+ /** "verb/resource/name" keys canI answers false for. */
46
+ accessDenied: Set<string>;
34
47
  logs: Map<string, string>;
35
48
  /** What readApiServerVersion reports; tests that care about provenance set it. */
36
49
  apiServerVersion: string;
@@ -85,6 +98,8 @@ export declare class FakeKubernetesApi implements KubernetesApi {
85
98
  */
86
99
  dryRunCreatePod(namespace: string, body: V1Pod): Promise<V1Pod>;
87
100
  readPod(namespace: string, name: string): Promise<V1Pod | undefined>;
101
+ /** Matches `key=value[,key=value]` selectors against stored pods' labels. */
102
+ listPods(namespace: string, labelSelector: string): Promise<V1Pod[]>;
88
103
  deletePod(namespace: string, name: string, gracePeriodSeconds: number): Promise<void>;
89
104
  createNetworkPolicy(namespace: string, body: V1NetworkPolicy): Promise<V1NetworkPolicy>;
90
105
  readNetworkPolicy(namespace: string, name: string): Promise<V1NetworkPolicy | undefined>;
@@ -92,6 +107,12 @@ export declare class FakeKubernetesApi implements KubernetesApi {
92
107
  readService(namespace: string, name: string): Promise<V1Service | undefined>;
93
108
  readEndpoints(namespace: string, name: string): Promise<V1Endpoints | undefined>;
94
109
  readResourceQuota(namespace: string, name: string): Promise<V1ResourceQuota | undefined>;
110
+ readDeployment(namespace: string, name: string): Promise<V1Deployment | undefined>;
111
+ patchDeployment(namespace: string, name: string, patch: {
112
+ replicas?: number;
113
+ annotations?: Record<string, string>;
114
+ }): Promise<void>;
115
+ canI(_namespace: string, verb: string, _group: string, resource: string, name: string): Promise<boolean>;
95
116
  readApiServerVersion(): Promise<string>;
96
117
  readNamespace(name: string): Promise<boolean>;
97
118
  exec(namespace: string, pod: string, container: string, command: string[], options: KubernetesExecOptions): Promise<number>;