@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
@@ -11,9 +11,18 @@ import { handleHostUserCallback } from "../host-events/github-user-callback.js";
11
11
  import { canonicalUrl, HTTP_LIMITS, HttpBoundaryError, parseBody, readBody } from "./http-limits.js";
12
12
  import { browserHandler } from "../auth/self-hosted/browser.js";
13
13
  import { handleSecretElicitationForm, SECRET_ELICITATION_PATH } from "../tools/secret-elicitation-form.js";
14
+ import { handleRunTranscriptDownload, RUN_TRANSCRIPT_DOWNLOAD_PATH } from "../tools/run-transcript-download.js";
14
15
  import { logger } from "../../core/logger.js";
15
16
  import { VIEWER_API_PREFIX } from "../../viewer/http.js";
16
17
  const httpLog = logger.child({ module: "streamable-http" });
18
+ /**
19
+ * close() waits this long for open requests to finish, then cuts them. A
20
+ * connected MCP client's event stream never ends on its own, so without a
21
+ * limit close() would hold shutdown until the pod is killed. On Kubernetes
22
+ * the load balancer has already moved traffic away by then (preStop), and
23
+ * clients reconnect to another instance.
24
+ */
25
+ export const CLOSE_GRACE_MS = 10_000;
17
26
  export function sendJson(res, status, body, headers = {}) {
18
27
  res
19
28
  .writeHead(status, { "content-type": "application/json", "cache-control": "no-store", ...headers })
@@ -35,7 +44,11 @@ export async function startHttpServer(opts) {
35
44
  ]);
36
45
  const validateHost = hostHeaderValidation([canonical.hostname]);
37
46
  const nodeHandler = toNodeHandler(createMcpHandler(opts.mcp.factory, { responseMode: opts.config.responseMode }));
47
+ // Requests still being answered, so a close that has to cut them can say which they were.
48
+ const open = new Map();
38
49
  const server = createServer({ maxHeaderSize: 16 * 1024, requireHostHeader: false }, (req, res) => {
50
+ open.set(res, { method: req.method ?? "", path: (req.url ?? "").split("?")[0], startedAt: Date.now() });
51
+ res.once("close", () => open.delete(res));
39
52
  void route(req, res).catch((err) => {
40
53
  if (res.headersSent) {
41
54
  res.destroy();
@@ -114,6 +127,17 @@ export async function startHttpServer(opts) {
114
127
  });
115
128
  return;
116
129
  }
130
+ if (url.pathname === RUN_TRANSCRIPT_DOWNLOAD_PATH) {
131
+ // The signed link is the credential (no Authorization header); the
132
+ // token is never logged (open-request tracking keeps the path only).
133
+ await handleRunTranscriptDownload(req.method, url.searchParams.get("t"), res, {
134
+ verify: (token) => opts.mcp.verifyRequestState(token),
135
+ audience: "http",
136
+ db: opts.auth.db,
137
+ blobs: opts.blobs,
138
+ });
139
+ return;
140
+ }
117
141
  if (oauth && (await oauth(req, res, url, body)))
118
142
  return;
119
143
  const webhook = /^\/webhooks\/([^/]+)$/.exec(url.pathname);
@@ -203,7 +227,23 @@ export async function startHttpServer(opts) {
203
227
  port: typeof address === "object" && address ? address.port : opts.config.httpBind.port,
204
228
  close: () => new Promise((resolve, reject) => {
205
229
  opts.viewer?.closeStreams();
206
- server.close((err) => (err ? reject(err) : resolve()));
230
+ const cut = setTimeout(() => {
231
+ const now = Date.now();
232
+ const requests = [...open.values()].map((r) => ({
233
+ method: r.method,
234
+ path: r.path,
235
+ openSeconds: Math.round((now - r.startedAt) / 1000),
236
+ }));
237
+ httpLog.info({ requests }, "HTTP connections still open after the close grace; closing them");
238
+ server.closeAllConnections();
239
+ }, opts.closeGraceMs ?? CLOSE_GRACE_MS);
240
+ server.close((err) => {
241
+ clearTimeout(cut);
242
+ if (err)
243
+ reject(err);
244
+ else
245
+ resolve();
246
+ });
207
247
  server.closeIdleConnections();
208
248
  }),
209
249
  };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Builds the native sandbox executor from configuration (NATIVE_SANDBOX_*, docs/native-sandbox.md),
3
+ * or nothing when the native sandbox is not configured — sandbox-mode runs then fail closed.
4
+ */
5
+ import { type Power } from "../core/power.js";
6
+ import type { NativeRunProviders, RunnerDb } from "../core/runner.js";
7
+ import { type GatewayLedgerDb } from "./ledger.js";
8
+ import type { KubernetesApi } from "../providers/jobs/kubernetes-api.js";
9
+ import { NativeSandboxExecutor, type ManagedWorkerLauncher } from "./sandbox-executor.js";
10
+ import { type WarmWorkerLauncher } from "./warm-pool.js";
11
+ import { type WarmPoolDb } from "./warm-pool-ledger.js";
12
+ export declare function buildNativeSandboxExecutor(options: {
13
+ db: RunnerDb & GatewayLedgerDb & WarmPoolDb;
14
+ /** Read at call time: the composition root patches `executor` on after wrapping this one. */
15
+ providers: NativeRunProviders;
16
+ env?: NodeJS.ProcessEnv;
17
+ /** Tests only: replaces the launcher. */
18
+ launcher?: ManagedWorkerLauncher & Partial<WarmWorkerLauncher>;
19
+ /** Tests only: replaces the kubeconfig-backed client for NATIVE_SANDBOX_LAUNCHER=kubernetes. */
20
+ kubernetesApi?: KubernetesApi;
21
+ /** Low-power mode: the shared Power the Kubernetes launcher wakes the native gateway through. */
22
+ power?: Power;
23
+ }): NativeSandboxExecutor | undefined;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Builds the native sandbox executor from configuration (NATIVE_SANDBOX_*, docs/native-sandbox.md),
3
+ * or nothing when the native sandbox is not configured — sandbox-mode runs then fail closed.
4
+ */
5
+ import { loadNativeSandboxConfig } from "../config/providers.js";
6
+ import { DISABLED_POWER } from "../core/power.js";
7
+ import { lowPowerActive } from "../core/power-composition.js";
8
+ import { nativeGatewayUrl } from "./docker-isolation.js";
9
+ import { DockerNativeWorkerLauncher } from "./docker-launcher.js";
10
+ import { PrismaGatewayLedger } from "./ledger.js";
11
+ import { KubernetesNativeWorkerLauncher } from "./kubernetes-launcher.js";
12
+ import { ClientNodeKubernetesApi } from "../providers/jobs/kubernetes-client.js";
13
+ import { SANDBOX_RUN_MAX_SEC } from "../core/runner.js";
14
+ import { NativeSandboxExecutor } from "./sandbox-executor.js";
15
+ import { PooledWorkerLauncher } from "./warm-pool.js";
16
+ import { PrismaWarmPoolLedger } from "./warm-pool-ledger.js";
17
+ export function buildNativeSandboxExecutor(options) {
18
+ const env = options.env ?? process.env;
19
+ const config = loadNativeSandboxConfig(env);
20
+ if (!config)
21
+ return undefined;
22
+ // Only when low-power mode is actually on (as buildPower decides); otherwise it is ignored.
23
+ if (config.warmPoolSize > 0 && lowPowerActive(env)) {
24
+ throw new Error("WARDBY_LOW_POWER=1 requires NATIVE_SANDBOX_WARM_POOL_SIZE=0: an always-on warm pool defeats scale-to-zero.");
25
+ }
26
+ const limits = { cpus: config.cpus, memoryMb: config.memoryMb, pids: config.pids };
27
+ const markReady = (runId) => new PrismaGatewayLedger(options.db).markNetworkReadyForRun(runId);
28
+ const cold = options.launcher ??
29
+ (config.launcher === "kubernetes"
30
+ ? new KubernetesNativeWorkerLauncher({
31
+ api: options.kubernetesApi ?? new ClientNodeKubernetesApi({ context: config.context }),
32
+ namespace: config.namespace,
33
+ image: config.workerImage,
34
+ limits,
35
+ gatewayService: config.gatewayService,
36
+ runtimeClassName: config.runtimeClassName,
37
+ platform: config.platform,
38
+ priorityClassName: config.priorityClassName,
39
+ readyTimeoutMs: config.readyTimeoutMs,
40
+ enforcementTimeoutMs: config.enforcementTimeoutMs,
41
+ gatewayUrl: config.gatewayUrl,
42
+ deadlineSeconds: SANDBOX_RUN_MAX_SEC,
43
+ power: options.power ?? DISABLED_POWER,
44
+ // Isolation proven inside the pod: the gateway may now serve the run.
45
+ onNetworkProven: markReady,
46
+ })
47
+ : new DockerNativeWorkerLauncher({
48
+ image: config.workerImage,
49
+ gatewayContainer: config.gatewayContainer,
50
+ limits,
51
+ }));
52
+ // The pool also starts with size 0 when the launcher can run one: its first tick removes workers
53
+ // left from an earlier configuration, and nothing runs after that.
54
+ const launcher = isWarmCapable(cold)
55
+ ? new PooledWorkerLauncher({
56
+ ledger: new PrismaWarmPoolLedger(options.db),
57
+ launcher: cold,
58
+ size: config.warmPoolSize,
59
+ maxAgeMs: config.warmMaxAgeMs,
60
+ warmTimeoutMs: config.launcher === "kubernetes"
61
+ ? (config.readyTimeoutMs ?? 120_000) + (config.enforcementTimeoutMs ?? 30_000)
62
+ : 120_000,
63
+ onDelivered: markReady,
64
+ })
65
+ : cold;
66
+ return new NativeSandboxExecutor({
67
+ db: options.db,
68
+ providers: options.providers,
69
+ launcher,
70
+ // Kubernetes resolves the gateway's ClusterIP per launch (resolveGatewayUrl) unless overridden.
71
+ gatewayUrl: config.gatewayUrl ?? nativeGatewayUrl(),
72
+ maxConcurrent: config.maxConcurrent,
73
+ });
74
+ }
75
+ function isWarmCapable(launcher) {
76
+ return typeof launcher.startWarm === "function" && typeof launcher.deliver === "function";
77
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Docker objects for one sandbox-mode native run (docs/native-sandbox.md),
3
+ * built the way the coding launcher builds its own (providers/jobs/
4
+ * docker-isolation.ts): an internal per-run network whose only other member is
5
+ * the native gateway container, and a single-use worker container that can
6
+ * reach nothing else — no internet, no database, no Docker socket. Names carry
7
+ * an opaque hash of the run id, never the id itself.
8
+ */
9
+ export declare const NATIVE_WORKER_UID = 10001;
10
+ export declare const NATIVE_GATEWAY_ALIAS = "wardby-native-gateway";
11
+ export declare const NATIVE_GATEWAY_PORT = 8790;
12
+ /** The gateway's witness port: never reachable from a worker (see coding-proxy/deny-port.ts). */
13
+ export declare const NATIVE_GATEWAY_DENY_PORT = 8791;
14
+ export declare const NATIVE_WORKER_TMP_MB = 64;
15
+ export interface NativeWorkerLimits {
16
+ cpus: number;
17
+ memoryMb: number;
18
+ pids: number;
19
+ }
20
+ export declare const DEFAULT_NATIVE_WORKER_LIMITS: NativeWorkerLimits;
21
+ export interface NativeIsolationNames {
22
+ network: string;
23
+ worker: string;
24
+ }
25
+ export declare function nativeIsolationNames(runId: string): NativeIsolationNames;
26
+ /** The label value tying a Docker object to its run, without exposing the run id. */
27
+ export declare function nativeRunLabel(runId: string): string;
28
+ /** A warm pool worker's name (native sandbox phase 6): its random token, never a run's hash. */
29
+ export declare function nativeWarmWorkerName(token: string): string;
30
+ export declare function nativeWarmIsolationNames(token: string): NativeIsolationNames;
31
+ /** Docker's label filter for every warm pool object, and the label carrying its token. */
32
+ export declare const NATIVE_WARM_LABEL_FILTER = "io.wardby.pool=warm";
33
+ export declare const NATIVE_WARM_TOKEN_LABEL = "io.wardby.warm-worker";
34
+ /** Docker's label filter for every native worker object (the janitor lists by it). */
35
+ export declare const NATIVE_WORKER_LABEL_FILTER = "io.wardby.component=native-worker";
36
+ export declare function buildNativeNetworkCreateArgs(runId: string): string[];
37
+ export declare function buildNativeWarmNetworkCreateArgs(token: string): string[];
38
+ /** Joins the gateway container to the run's network under the name workers dial. */
39
+ export declare function buildGatewayConnectArgs(runId: string, gatewayContainer: string): string[];
40
+ export declare function gatewayConnectArgs(network: string, gatewayContainer: string): string[];
41
+ export declare function buildGatewayDisconnectArgs(runId: string, gatewayContainer: string): string[];
42
+ export declare function gatewayDisconnectArgs(network: string, gatewayContainer: string): string[];
43
+ /**
44
+ * `docker run -i` for the worker: its WorkerInput (capability included) arrives on stdin, so the
45
+ * capability is never in its environment, argv, labels, or `docker inspect`. Not `--rm`: the
46
+ * executor reads the exit code, then removes it.
47
+ */
48
+ export declare function buildNativeWorkerRunArgs(input: {
49
+ runId: string;
50
+ image: string;
51
+ limits: NativeWorkerLimits;
52
+ }): string[];
53
+ /**
54
+ * `docker run -d` for a warm pool worker: no input yet. It waits for one written into its /tmp by
55
+ * `docker exec -i` after a run claims it (warm-delivery.ts), so the capability still never reaches
56
+ * its environment, argv, or labels.
57
+ */
58
+ export declare function buildNativeWarmWorkerRunArgs(input: {
59
+ token: string;
60
+ image: string;
61
+ limits: NativeWorkerLimits;
62
+ waitMs: number;
63
+ }): string[];
64
+ /** The URL a worker dials: the gateway's alias on its own run network. */
65
+ export declare function nativeGatewayUrl(port?: number): string;
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Docker objects for one sandbox-mode native run (docs/native-sandbox.md),
3
+ * built the way the coding launcher builds its own (providers/jobs/
4
+ * docker-isolation.ts): an internal per-run network whose only other member is
5
+ * the native gateway container, and a single-use worker container that can
6
+ * reach nothing else — no internet, no database, no Docker socket. Names carry
7
+ * an opaque hash of the run id, never the id itself.
8
+ */
9
+ import { isImmutableDockerImage, isolationToken } from "../providers/jobs/docker-isolation.js";
10
+ import { createHash } from "node:crypto";
11
+ import { WARM_INPUT_FILE } from "./warm-delivery.js";
12
+ export const NATIVE_WORKER_UID = 10001;
13
+ export const NATIVE_GATEWAY_ALIAS = "wardby-native-gateway";
14
+ export const NATIVE_GATEWAY_PORT = 8790;
15
+ /** The gateway's witness port: never reachable from a worker (see coding-proxy/deny-port.ts). */
16
+ export const NATIVE_GATEWAY_DENY_PORT = 8791;
17
+ export const NATIVE_WORKER_TMP_MB = 64;
18
+ const LABEL_MANAGED = "io.wardby.managed=true";
19
+ const LABEL_COMPONENT = "io.wardby.component=native-worker";
20
+ export const DEFAULT_NATIVE_WORKER_LIMITS = { cpus: 1, memoryMb: 512, pids: 128 };
21
+ export function nativeIsolationNames(runId) {
22
+ const token = isolationToken(runId);
23
+ return { network: `wardby-nnet-${token}`, worker: `wardby-native-${token}` };
24
+ }
25
+ /** The label value tying a Docker object to its run, without exposing the run id. */
26
+ export function nativeRunLabel(runId) {
27
+ return createHash("sha256").update(runId).digest("hex");
28
+ }
29
+ function labels(runId) {
30
+ return [
31
+ "--label",
32
+ LABEL_MANAGED,
33
+ "--label",
34
+ LABEL_COMPONENT,
35
+ "--label",
36
+ `io.wardby.run-sha256=${nativeRunLabel(runId)}`,
37
+ ];
38
+ }
39
+ /** A warm pool worker's name (native sandbox phase 6): its random token, never a run's hash. */
40
+ export function nativeWarmWorkerName(token) {
41
+ if (!/^[0-9a-f]{20}$/.test(token))
42
+ throw new Error("native_sandbox_invalid_warm_token");
43
+ return `wardby-nwarm-${token}`;
44
+ }
45
+ export function nativeWarmIsolationNames(token) {
46
+ return { network: `wardby-nwnet-${token}`, worker: nativeWarmWorkerName(token) };
47
+ }
48
+ /** Docker's label filter for every warm pool object, and the label carrying its token. */
49
+ export const NATIVE_WARM_LABEL_FILTER = "io.wardby.pool=warm";
50
+ export const NATIVE_WARM_TOKEN_LABEL = "io.wardby.warm-worker";
51
+ function warmLabels(token) {
52
+ return [
53
+ "--label",
54
+ LABEL_MANAGED,
55
+ "--label",
56
+ LABEL_COMPONENT,
57
+ "--label",
58
+ NATIVE_WARM_LABEL_FILTER,
59
+ "--label",
60
+ `${NATIVE_WARM_TOKEN_LABEL}=${token}`,
61
+ ];
62
+ }
63
+ /** Docker's label filter for every native worker object (the janitor lists by it). */
64
+ export const NATIVE_WORKER_LABEL_FILTER = LABEL_COMPONENT;
65
+ export function buildNativeNetworkCreateArgs(runId) {
66
+ return networkCreateArgs(nativeIsolationNames(runId).network, labels(runId));
67
+ }
68
+ export function buildNativeWarmNetworkCreateArgs(token) {
69
+ return networkCreateArgs(nativeWarmIsolationNames(token).network, warmLabels(token));
70
+ }
71
+ function networkCreateArgs(network, objectLabels) {
72
+ return [
73
+ "network",
74
+ "create",
75
+ "--driver",
76
+ "bridge",
77
+ "--internal",
78
+ "--ipv6=false",
79
+ "--opt",
80
+ "com.docker.network.bridge.gateway_mode_ipv4=isolated",
81
+ "--opt",
82
+ "com.docker.network.bridge.gateway_mode_ipv6=isolated",
83
+ ...objectLabels,
84
+ network,
85
+ ];
86
+ }
87
+ /** Joins the gateway container to the run's network under the name workers dial. */
88
+ export function buildGatewayConnectArgs(runId, gatewayContainer) {
89
+ return gatewayConnectArgs(nativeIsolationNames(runId).network, gatewayContainer);
90
+ }
91
+ export function gatewayConnectArgs(network, gatewayContainer) {
92
+ return ["network", "connect", "--alias", NATIVE_GATEWAY_ALIAS, network, gatewayContainer];
93
+ }
94
+ export function buildGatewayDisconnectArgs(runId, gatewayContainer) {
95
+ return gatewayDisconnectArgs(nativeIsolationNames(runId).network, gatewayContainer);
96
+ }
97
+ export function gatewayDisconnectArgs(network, gatewayContainer) {
98
+ return ["network", "disconnect", "--force", network, gatewayContainer];
99
+ }
100
+ /**
101
+ * `docker run -i` for the worker: its WorkerInput (capability included) arrives on stdin, so the
102
+ * capability is never in its environment, argv, labels, or `docker inspect`. Not `--rm`: the
103
+ * executor reads the exit code, then removes it.
104
+ */
105
+ export function buildNativeWorkerRunArgs(input) {
106
+ const names = nativeIsolationNames(input.runId);
107
+ return workerRunArgs({ ...input, names, mode: ["-i"], env: [], objectLabels: labels(input.runId) });
108
+ }
109
+ /**
110
+ * `docker run -d` for a warm pool worker: no input yet. It waits for one written into its /tmp by
111
+ * `docker exec -i` after a run claims it (warm-delivery.ts), so the capability still never reaches
112
+ * its environment, argv, or labels.
113
+ */
114
+ export function buildNativeWarmWorkerRunArgs(input) {
115
+ return workerRunArgs({
116
+ ...input,
117
+ names: nativeWarmIsolationNames(input.token),
118
+ mode: ["-d"],
119
+ env: [
120
+ "--env",
121
+ `NATIVE_WORKER_INPUT_FILE=${WARM_INPUT_FILE}`,
122
+ "--env",
123
+ `NATIVE_WORKER_INPUT_WAIT_MS=${Math.floor(input.waitMs)}`,
124
+ ],
125
+ objectLabels: warmLabels(input.token),
126
+ });
127
+ }
128
+ function workerRunArgs(input) {
129
+ const { image, limits, names } = input;
130
+ if (!isImmutableDockerImage(image)) {
131
+ throw new Error("native_sandbox_image_not_pinned: the worker image must be a digest (repo@sha256:...) or a local image id.");
132
+ }
133
+ return [
134
+ "run",
135
+ ...input.mode,
136
+ "--name",
137
+ names.worker,
138
+ "--pull",
139
+ "never",
140
+ "--user",
141
+ `${NATIVE_WORKER_UID}:${NATIVE_WORKER_UID}`,
142
+ "--network",
143
+ names.network,
144
+ "--read-only",
145
+ "--tmpfs",
146
+ `/tmp:rw,noexec,nosuid,nodev,size=${NATIVE_WORKER_TMP_MB}m`,
147
+ "--cap-drop",
148
+ "ALL",
149
+ "--security-opt",
150
+ "no-new-privileges=true",
151
+ "--security-opt",
152
+ "seccomp=builtin",
153
+ "--cgroupns",
154
+ "private",
155
+ "--ipc",
156
+ "none",
157
+ "--cpus",
158
+ String(limits.cpus),
159
+ "--memory",
160
+ `${limits.memoryMb}m`,
161
+ "--memory-swap",
162
+ `${limits.memoryMb}m`,
163
+ "--memory-swappiness",
164
+ "0",
165
+ "--pids-limit",
166
+ String(limits.pids),
167
+ "--restart",
168
+ "no",
169
+ "--log-driver",
170
+ "local",
171
+ "--log-opt",
172
+ "max-size=1m",
173
+ "--log-opt",
174
+ "max-file=2",
175
+ ...input.env,
176
+ ...input.objectLabels,
177
+ image,
178
+ ];
179
+ }
180
+ /** The URL a worker dials: the gateway's alias on its own run network. */
181
+ export function nativeGatewayUrl(port = NATIVE_GATEWAY_PORT) {
182
+ return `http://${NATIVE_GATEWAY_ALIAS}:${port}/native-gateway/v1/call`;
183
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Launches, watches, stops, and removes native sandbox workers on the local
3
+ * Docker engine (docs/native-sandbox.md), from the isolation plan in
4
+ * docker-isolation.ts. Every operation is idempotent and keyed by the run id,
5
+ * so the executor can retry, a second launch attaches instead of starting
6
+ * twice, and a restarted server re-finds a running worker by name.
7
+ */
8
+ import { type NativeWorkerLimits } from "./docker-isolation.js";
9
+ import type { DetachedWorkerLauncher, WorkerHandle, WorkerLaunchOptions } from "./launch.js";
10
+ import type { WorkerInput } from "./protocol.js";
11
+ import { type WarmWorkerLauncher } from "./warm-pool.js";
12
+ /**
13
+ * Bounded, so a noisy worker cannot flood the log. The worker holds no long-lived credentials (only
14
+ * its run's gateway capability), and it redacts the secret values it received (every `secrets.get`
15
+ * result, and the capability) from everything it writes to stderr, its failure line and logger lines
16
+ * included (stderr-redaction.ts), with the console bridge's redactor and its minimum length. The
17
+ * worker is untrusted, so the launcher masks the tail again itself (workerTailFields).
18
+ */
19
+ export declare const WORKER_STDERR_TAIL_CHARS = 2000;
20
+ /** How long a failed worker's diagnostic (its log read and its secret values read) may take in all. */
21
+ export declare const WORKER_TAIL_TIMEOUT_MS = 10000;
22
+ /**
23
+ * Log fields for a failed worker's output. `stderrTailOmitted` says why there is no tail although
24
+ * there may be output: its secret values could not be read (so it could not be redacted), or its
25
+ * log could not be read (Kubernetes).
26
+ */
27
+ export interface WorkerTailFields {
28
+ stderrTail?: string;
29
+ stderrTailOmitted?: "secrets_unavailable" | "log_read_failed";
30
+ }
31
+ /** `promise`, or a rejection once `ms` pass first. */
32
+ export declare function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T>;
33
+ /**
34
+ * A failed worker's output tail as log fields: `stderrTail`, masked by exact value through the
35
+ * shared redactor against every secret value delivered to that worker (its gateway capability,
36
+ * from its input, and each value its tools may read, from `secretValues`, with their JSON-escaped
37
+ * forms). When those values are not given, cannot be read, or are not read within `timeoutMs`, no
38
+ * tail: `stderrTailOmitted: "secrets_unavailable"` (fail closed). No fields when the output is empty.
39
+ *
40
+ * `cut`: `output` is a slice of a longer output (a log read bounded by lines or bytes), so it may
41
+ * begin (`start`) or end (`end`) inside a value, which no exact match finds; as many characters as
42
+ * the longest value less one are masked at each cut end too.
43
+ */
44
+ export declare function workerTailFields(output: string, input: WorkerInput, secretValues: (() => Promise<readonly string[]>) | undefined, cut?: {
45
+ start?: boolean;
46
+ end?: boolean;
47
+ }, timeoutMs?: number): Promise<WorkerTailFields>;
48
+ export interface DockerResult {
49
+ code: number | null;
50
+ stdout: string;
51
+ stderr: string;
52
+ }
53
+ /** The Docker CLI as this launcher uses it; tests replace it. */
54
+ export interface DockerCli {
55
+ run(args: string[], options?: {
56
+ input?: string;
57
+ timeoutMs?: number;
58
+ }): Promise<DockerResult>;
59
+ }
60
+ export declare function processDockerCli(binary?: string): DockerCli;
61
+ export type NativeWorkerState = {
62
+ state: "running";
63
+ } | {
64
+ state: "exited";
65
+ exitCode: number;
66
+ } | {
67
+ state: "missing";
68
+ };
69
+ export interface DockerNativeWorkerLauncherOptions {
70
+ image: string;
71
+ /** The container running `wardby native-gateway`, joined to each run's network. */
72
+ gatewayContainer: string;
73
+ limits: NativeWorkerLimits;
74
+ docker?: DockerCli;
75
+ }
76
+ export declare class DockerNativeWorkerLauncher implements DetachedWorkerLauncher, WarmWorkerLauncher {
77
+ private readonly options;
78
+ private readonly docker;
79
+ constructor(options: DockerNativeWorkerLauncherOptions);
80
+ private must;
81
+ /** The image must be present and pinned; a digest is pulled once, a local id must already exist. */
82
+ private ensureImage;
83
+ launch(input: WorkerInput, launchOptions?: WorkerLaunchOptions): Promise<WorkerHandle>;
84
+ /** Waits for (and reports) the worker's exit; usable after a server restart. */
85
+ handle(runId: string): WorkerHandle;
86
+ private handleByName;
87
+ inspect(runId: string): Promise<NativeWorkerState>;
88
+ private inspectByName;
89
+ kill(runId: string): Promise<void>;
90
+ /** Removes the worker, its network, and the gateway's membership of it. Idempotent. */
91
+ remove(runId: string): Promise<void>;
92
+ /** Removes a worker found by the janitor, by its container name (its network shares the name's token). */
93
+ removeByWorkerName(workerName: string): Promise<void>;
94
+ /** Every native worker container this engine holds, with its run-hash label (for the janitor). */
95
+ listWorkers(): Promise<{
96
+ name: string;
97
+ runHash: string;
98
+ }[]>;
99
+ warmSpecHash(waitMs: number): string;
100
+ /** Its network is internal from creation, so a running container is already isolated: claimable. */
101
+ startWarm(token: string, waitMs: number): Promise<void>;
102
+ /** Still running, and attached to its own network and nothing else. */
103
+ reattestWarm(token: string): Promise<boolean>;
104
+ deliver(token: string, input: WorkerInput): Promise<void>;
105
+ warmHandle(token: string): WorkerHandle;
106
+ inspectWarm(token: string): Promise<NativeWorkerState>;
107
+ killWarm(token: string): Promise<void>;
108
+ removeWarm(token: string): Promise<void>;
109
+ listWarm(): Promise<string[]>;
110
+ }