@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,263 @@
1
+ /**
2
+ * The trusted side of the native sandbox worker contract. `runSandboxedEngine`
3
+ * is an Engine in all but name: the runner hands it the same context it would
4
+ * hand NativeEngine, and it returns an EngineResult — but the turn loop runs
5
+ * in a worker, and this module serves the worker's calls from that context.
6
+ *
7
+ * Authority stays here (invariant 8 of the plan): model usage and cost are
8
+ * metered from what the provider streamed through this gateway, never taken
9
+ * from the worker; every call is validated against the protocol schemas and
10
+ * refused once the run is no longer drivable; built-in tools and privileged
11
+ * sandbox bridges are served only by name from the run's own surface.
12
+ */
13
+ import pino from "pino";
14
+ import { isPrivilegedBridgeName, redactExactSecretValues, withEscapedForms, } from "../sandbox/host-functions.js";
15
+ import { logger } from "../core/logger.js";
16
+ import { declaredCodeOf } from "../core/error-code.js";
17
+ import { GatewayError, GatewayRequestSchema, NATIVE_WORKER_PROTOCOL_VERSION, parseParams, ProtocolError, workerGatewayError, } from "./protocol.js";
18
+ /**
19
+ * The gateways' log. Both (in-process and HTTP) log an unexpected error here, as `native gateway
20
+ * request failed` (or `native gateway model stream failed`). Exported so tests can watch it.
21
+ */
22
+ export const gatewayLog = logger.child({ module: "native-gateway" });
23
+ /** `err` for the log with every exact secret value removed from its (cause-folded) message and stack. */
24
+ function redactedError(err, rawValues) {
25
+ // The same expansion as the console bridge and the worker: a value may sit escaped in the text.
26
+ const values = withEscapedForms(rawValues);
27
+ // pino's own serializer folds the cause chain into message and stack, so a cause is covered too.
28
+ const serialized = pino.stdSerializers.err(err);
29
+ const safe = new Error(redactExactSecretValues(serialized.message, values));
30
+ safe.name = err.name;
31
+ safe.stack = redactExactSecretValues(serialized.stack ?? "", values);
32
+ return safe;
33
+ }
34
+ /**
35
+ * Logs an unexpected error for the operator, redacted by exact value. A successfully read list is
36
+ * complete (its reader rejects when any secret's read fails), so an empty one means the run has no
37
+ * secret values and the message is logged as is. Fail closed: a thrown value that is not an Error
38
+ * (a string, an object: its text cannot be redacted reliably), or no list (unavailable or
39
+ * unreadable), logs only the error's name and declared code, never its message, stack or content.
40
+ */
41
+ export function logUnexpectedError(log, err, values, logMessage, fields = {}) {
42
+ if (values && err instanceof Error)
43
+ log.error({ ...fields, err: redactedError(err, values) }, logMessage);
44
+ else
45
+ log.error({ ...fields, errName: err instanceof Error ? err.name : typeof err, causeCode: declaredCodeOf(err) }, logMessage);
46
+ }
47
+ /**
48
+ * The one way either gateway turns a failure into what the worker sees: an unexpected error is
49
+ * logged for the operator (redacted by the run's secret values) and becomes the checked
50
+ * GatewayError (workerGatewayError); the values are read once and serve both.
51
+ */
52
+ export async function forWorker(err, secretValues, logMessage) {
53
+ if (err instanceof GatewayError)
54
+ return workerGatewayError(err, secretValues);
55
+ const values = await secretValues?.().then((v) => [...v], () => undefined);
56
+ logUnexpectedError(gatewayLog, err, values, logMessage);
57
+ return workerGatewayError(err, values ? async () => values : undefined);
58
+ }
59
+ /** Thrown when the worker stopped because the run was cancelled; the runner records `cancelled`. */
60
+ export class SandboxRunCancelledError extends Error {
61
+ }
62
+ /** Runs one native run's engine in a worker and returns its result with gateway-metered usage. */
63
+ export async function runSandboxedEngine(options) {
64
+ const { runId, input, ctx } = options;
65
+ const llm = ctx.providers.llm;
66
+ const controller = new AbortController();
67
+ const usage = { tokensIn: 0, tokensOut: 0, costUsd: 0, cachedInputTokens: 0, cacheWriteTokens: 0 };
68
+ const usedCallIds = new Set();
69
+ const builtinResults = new Map();
70
+ const hosts = new Map();
71
+ let lastTextSeq = -1;
72
+ let finished;
73
+ let cancelled = false;
74
+ const meter = (event) => {
75
+ usage.tokensIn += event.inputTokens;
76
+ usage.tokensOut += event.outputTokens;
77
+ usage.costUsd += event.costUsd;
78
+ usage.cachedInputTokens += event.cachedInputTokens ?? 0;
79
+ usage.cacheWriteTokens += event.cacheWriteTokens ?? 0;
80
+ };
81
+ /** Validates the envelope and the run, and claims the callId; returns the method's params. */
82
+ const admit = async (raw, expected) => {
83
+ const parsed = GatewayRequestSchema.safeParse(raw);
84
+ if (!parsed.success) {
85
+ const v = raw?.v;
86
+ if (v !== undefined && v !== NATIVE_WORKER_PROTOCOL_VERSION) {
87
+ throw new GatewayError("invalid_request", new ProtocolError("unsupported_protocol_version").message);
88
+ }
89
+ throw new GatewayError("invalid_request", parsed.error.issues[0]?.message ?? "invalid request");
90
+ }
91
+ const request = parsed.data;
92
+ if (request.runId !== runId)
93
+ throw new GatewayError("not_allowed", "request for another run");
94
+ if (expected && request.method !== expected)
95
+ throw new GatewayError("invalid_request", "wrong method");
96
+ let params;
97
+ try {
98
+ params = parseParams(request.method, request.params);
99
+ }
100
+ catch (err) {
101
+ throw new GatewayError("invalid_request", err instanceof Error ? err.message : String(err));
102
+ }
103
+ const state = await options.drivability();
104
+ if (state !== "drivable") {
105
+ if (state === "cancelled")
106
+ cancelled = true;
107
+ controller.abort();
108
+ throw new GatewayError("run_not_drivable", "This run is no longer running.");
109
+ }
110
+ return { request, params };
111
+ };
112
+ const claim = (callId) => {
113
+ if (usedCallIds.has(callId))
114
+ throw new GatewayError("duplicate_call", `callId "${callId}" was already used.`);
115
+ usedCallIds.add(callId);
116
+ };
117
+ /** The run's readable secret values, for checking a failure's cause code before the worker sees it. */
118
+ const readable = options.readableSecretValues;
119
+ const runSecretValues = readable
120
+ ? async () => (await Promise.all(Object.keys(input.userTools).map((tool) => readable(tool)))).flat()
121
+ : undefined;
122
+ const served = {
123
+ async *stream(raw) {
124
+ const { request, params } = await admit(raw, "llm.stream");
125
+ claim(request.callId);
126
+ // The worker may only call the run's own pinned model.
127
+ if (params.request.model !== input.agent.model) {
128
+ throw new GatewayError("not_allowed", "A run may only call its own model.");
129
+ }
130
+ const req = params.request;
131
+ let sawDone = false;
132
+ let streamedText = "";
133
+ try {
134
+ for await (const event of llm.stream(req, controller.signal)) {
135
+ if (event.type === "done") {
136
+ sawDone = true;
137
+ meter(event.usage);
138
+ }
139
+ else if (event.type === "text") {
140
+ streamedText += event.delta;
141
+ }
142
+ yield event;
143
+ }
144
+ }
145
+ finally {
146
+ // The worker stopped reading (its own mid-stream budget cutoff, or it went away) before the
147
+ // provider reported usage: bill this gateway's own estimate of what was streamed, so an
148
+ // aborted call is never free.
149
+ if (!sawDone) {
150
+ const inputTokens = await llm.countTokens(req.model, req.messages, req.tools).catch(() => 0);
151
+ const outputTokens = streamedText
152
+ ? await llm.countTokens(req.model, [{ role: "assistant", content: streamedText }]).catch(() => 0)
153
+ : 0;
154
+ meter({ inputTokens, outputTokens, costUsd: llm.priceUsd(req.model, { inputTokens, outputTokens }) });
155
+ }
156
+ }
157
+ },
158
+ async call(raw) {
159
+ const { request, params } = await admit(raw);
160
+ switch (request.method) {
161
+ case "llm.countTokens": {
162
+ const p = params;
163
+ return llm.countTokens(p.model, p.messages, p.tools);
164
+ }
165
+ case "builtin.call": {
166
+ const p = params;
167
+ // A repeated callId for a finished built-in returns the same result instead of acting twice.
168
+ const prior = builtinResults.get(request.callId);
169
+ if (prior)
170
+ return prior;
171
+ const handler = input.builtinTools.includes(p.name) ? options.builtinHandler(p.name) : undefined;
172
+ if (!handler)
173
+ throw new GatewayError("not_allowed", `"${p.name}" is not a built-in tool of this run.`);
174
+ const result = handler(p.argsJson);
175
+ builtinResults.set(request.callId, result);
176
+ return result;
177
+ }
178
+ case "host.call": {
179
+ const p = params;
180
+ claim(request.callId);
181
+ if (!isPrivilegedBridgeName(p.bridge))
182
+ throw new GatewayError("not_allowed", "unknown bridge");
183
+ const key = `${p.tool}\u0000${p.invocation}`;
184
+ let host = hosts.get(key);
185
+ if (!host) {
186
+ host = options.privilegedHostFor(p.tool, controller.signal);
187
+ if (!host)
188
+ throw new GatewayError("not_allowed", `"${p.tool}" is not a user tool of this run.`);
189
+ hosts.set(key, host);
190
+ }
191
+ try {
192
+ return await host[p.bridge](p.argsJson);
193
+ }
194
+ catch (err) {
195
+ // What the tool sees, exactly as in-process (bridge.ts truncates the same way).
196
+ const message = err instanceof Error ? err.message.slice(0, 1024) : "Host function failed.";
197
+ throw new GatewayError("bridge_error", message);
198
+ }
199
+ }
200
+ case "progress": {
201
+ const p = params;
202
+ // Turns from the worker, usage from this gateway's own metering.
203
+ const progress = {
204
+ turns: p.turns,
205
+ usage: { tokensIn: usage.tokensIn, tokensOut: usage.tokensOut, costUsd: usage.costUsd },
206
+ };
207
+ await ctx.onProgress?.(progress);
208
+ return null;
209
+ }
210
+ case "text": {
211
+ const p = params;
212
+ if (p.seq > lastTextSeq) {
213
+ lastTextSeq = p.seq;
214
+ ctx.onText?.(p.delta);
215
+ }
216
+ return null;
217
+ }
218
+ case "finish": {
219
+ claim(request.callId);
220
+ finished ??= params;
221
+ return null;
222
+ }
223
+ default:
224
+ throw new GatewayError("invalid_request", `"${request.method}" is a streaming method.`);
225
+ }
226
+ },
227
+ };
228
+ // What crosses to the worker on every transport: a GatewayError, never an unexpected error's text.
229
+ const gateway = {
230
+ async call(raw) {
231
+ try {
232
+ return await served.call(raw);
233
+ }
234
+ catch (err) {
235
+ throw await forWorker(err, runSecretValues, "native gateway request failed");
236
+ }
237
+ },
238
+ async *stream(raw) {
239
+ try {
240
+ yield* served.stream(raw);
241
+ }
242
+ catch (err) {
243
+ throw await forWorker(err, runSecretValues, "native gateway model stream failed");
244
+ }
245
+ },
246
+ };
247
+ const { exitCode } = await options.launcher.run(input, gateway, controller.signal);
248
+ controller.abort();
249
+ if (cancelled || (!finished && (await options.drivability()) === "cancelled")) {
250
+ throw new SandboxRunCancelledError("The run was cancelled while its sandbox worker was running.");
251
+ }
252
+ if (!finished) {
253
+ gatewayLog.warn({ runId, exitCode }, "native sandbox worker exited without a result");
254
+ throw new Error(`native_sandbox_worker_exited: the sandbox worker exited (code ${exitCode}) without a result.`);
255
+ }
256
+ return {
257
+ status: finished.status,
258
+ finalText: finished.finalText,
259
+ turns: finished.turns,
260
+ ...(finished.error !== undefined ? { error: finished.error } : {}),
261
+ usage,
262
+ };
263
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * The native sandbox gateway's internal HTTP listener (NATIVE_GATEWAY_LISTEN).
3
+ * Deliberately separate from the public MCP/webhook server: only sandbox
4
+ * workers reach it (deployment network policy allows worker → this port and
5
+ * nothing else), and every request carries a one-run bearer capability.
6
+ *
7
+ * POST /native-gateway/v1/call body: GatewayRequest
8
+ * → application/json { ok: true, result } | { ok: false, error: { code, message } }
9
+ * → application/x-ndjson (llm.stream) { event } … then { end: true } or { error: { code, message, causeCode? } }
10
+ */
11
+ import { type Server } from "node:http";
12
+ import { type GatewayServerDeps } from "./gateway-server.js";
13
+ /** The HTTP listener's own log. Exported so tests can watch it. */
14
+ export declare const httpLog: import("pino").Logger<never, boolean>;
15
+ export declare const NATIVE_GATEWAY_PATH = "/native-gateway/v1/call";
16
+ export interface NativeGatewayListen {
17
+ host: string;
18
+ port: number;
19
+ }
20
+ /** Parses NATIVE_GATEWAY_LISTEN ("host:port" or ":port"); undefined when unset. */
21
+ export declare function parseGatewayListen(value: string | undefined): NativeGatewayListen | undefined;
22
+ export declare function createGatewayServer(deps: GatewayServerDeps): Server;
23
+ /** Starts the listener; resolves once it is accepting connections. */
24
+ export declare function startGatewayServer(listen: NativeGatewayListen, deps: GatewayServerDeps): Promise<Server>;
@@ -0,0 +1,113 @@
1
+ /**
2
+ * The native sandbox gateway's internal HTTP listener (NATIVE_GATEWAY_LISTEN).
3
+ * Deliberately separate from the public MCP/webhook server: only sandbox
4
+ * workers reach it (deployment network policy allows worker → this port and
5
+ * nothing else), and every request carries a one-run bearer capability.
6
+ *
7
+ * POST /native-gateway/v1/call body: GatewayRequest
8
+ * → application/json { ok: true, result } | { ok: false, error: { code, message } }
9
+ * → application/x-ndjson (llm.stream) { event } … then { end: true } or { error: { code, message, causeCode? } }
10
+ */
11
+ import { createServer } from "node:http";
12
+ import { logger } from "../core/logger.js";
13
+ import { logUnexpectedError } from "./gateway.js";
14
+ import { serveGatewayRequest } from "./gateway-server.js";
15
+ import { GatewayError, MAX_MESSAGE_BYTES, toGatewayError } from "./protocol.js";
16
+ /** The HTTP listener's own log. Exported so tests can watch it. */
17
+ export const httpLog = logger.child({ module: "native-gateway-http" });
18
+ export const NATIVE_GATEWAY_PATH = "/native-gateway/v1/call";
19
+ /** Parses NATIVE_GATEWAY_LISTEN ("host:port" or ":port"); undefined when unset. */
20
+ export function parseGatewayListen(value) {
21
+ if (!value)
22
+ return undefined;
23
+ const match = /^(.*):(\d{1,5})$/.exec(value.trim());
24
+ const port = match ? Number(match[2]) : NaN;
25
+ if (!match || !Number.isInteger(port) || port < 1 || port > 65_535) {
26
+ throw new Error(`NATIVE_GATEWAY_LISTEN must be host:port or :port (got "${value}").`);
27
+ }
28
+ return { host: match[1] || "0.0.0.0", port };
29
+ }
30
+ function readBody(req) {
31
+ return new Promise((resolve, reject) => {
32
+ let size = 0;
33
+ const chunks = [];
34
+ req.on("data", (chunk) => {
35
+ size += chunk.length;
36
+ if (size > MAX_MESSAGE_BYTES) {
37
+ reject(new GatewayError("invalid_request", "message_too_large"));
38
+ req.destroy();
39
+ return;
40
+ }
41
+ chunks.push(chunk);
42
+ });
43
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
44
+ req.on("error", reject);
45
+ });
46
+ }
47
+ export function createGatewayServer(deps) {
48
+ return createServer({ maxHeaderSize: 16 * 1024 }, (req, res) => {
49
+ void (async () => {
50
+ const send = (status, body) => {
51
+ res.setHeader("content-type", "application/json");
52
+ res.writeHead(status);
53
+ res.end(JSON.stringify(body));
54
+ };
55
+ if (req.method === "GET" && req.url === "/healthz") {
56
+ // Ready when the database answers: every call needs it.
57
+ const healthy = await deps.db.$queryRaw `SELECT 1`.then(() => true, () => false);
58
+ send(healthy ? 200 : 503, { ok: healthy });
59
+ return;
60
+ }
61
+ if (req.method !== "POST" || req.url !== NATIVE_GATEWAY_PATH) {
62
+ send(404, { ok: false, error: { code: "not_found", message: "not found" } });
63
+ return;
64
+ }
65
+ let body;
66
+ try {
67
+ body = JSON.parse(await readBody(req));
68
+ }
69
+ catch (err) {
70
+ send(400, {
71
+ ok: false,
72
+ error: { code: "invalid_request", message: err instanceof GatewayError ? err.message : "body is not JSON" },
73
+ });
74
+ return;
75
+ }
76
+ const response = await serveGatewayRequest(deps, req.headers.authorization, body);
77
+ if (response.kind === "json") {
78
+ send(response.status, response.body);
79
+ return;
80
+ }
81
+ res.setHeader("content-type", "application/x-ndjson");
82
+ res.writeHead(200);
83
+ try {
84
+ for await (const event of response.events)
85
+ res.write(`${JSON.stringify({ event })}\n`);
86
+ res.end(`${JSON.stringify({ end: true })}\n`);
87
+ }
88
+ catch (err) {
89
+ // The gateway's stream fails only with a checked GatewayError (checkedEvents); anything else
90
+ // still crosses as the generic message, never its own text.
91
+ const { code, message, causeCode } = toGatewayError(err);
92
+ const error = { code, message, ...(causeCode ? { causeCode } : {}) };
93
+ res.end(`${JSON.stringify({ error })}\n`);
94
+ }
95
+ })().catch((err) => {
96
+ // No run's secret values are known here, so only the name and declared code are logged.
97
+ logUnexpectedError(httpLog, err, undefined, "native gateway HTTP handler failed");
98
+ if (!res.headersSent)
99
+ res.writeHead(500);
100
+ res.end();
101
+ });
102
+ });
103
+ }
104
+ /** Starts the listener; resolves once it is accepting connections. */
105
+ export async function startGatewayServer(listen, deps) {
106
+ const server = createGatewayServer(deps);
107
+ await new Promise((resolve, reject) => {
108
+ server.once("error", reject);
109
+ server.listen(listen.port, listen.host, () => resolve());
110
+ });
111
+ httpLog.info({ host: listen.host, port: listen.port }, "native sandbox gateway listening");
112
+ return server;
113
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The worker's HTTP transport to the native sandbox gateway. One-shot calls are
3
+ * retried with the same request (same callId) on a connection failure until a
4
+ * deadline, so a control-plane replica restarting is a retry, not a failure:
5
+ * the gateway replays a finished call's result instead of acting again. A
6
+ * model stream is never retried — its reservation is already taken.
7
+ */
8
+ import type { GatewayTransport } from "./worker.js";
9
+ export interface HttpTransportOptions {
10
+ url: string;
11
+ capability: string;
12
+ fetch?: typeof globalThis.fetch;
13
+ /** How long a one-shot call keeps retrying connection failures. */
14
+ retryForMs?: number;
15
+ sleep?: (ms: number) => Promise<void>;
16
+ }
17
+ export declare function createHttpTransport(options: HttpTransportOptions): GatewayTransport;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * The worker's HTTP transport to the native sandbox gateway. One-shot calls are
3
+ * retried with the same request (same callId) on a connection failure until a
4
+ * deadline, so a control-plane replica restarting is a retry, not a failure:
5
+ * the gateway replays a finished call's result instead of acting again. A
6
+ * model stream is never retried — its reservation is already taken.
7
+ */
8
+ import { GatewayError } from "./protocol.js";
9
+ const RETRY_DELAYS_MS = [100, 250, 500, 1_000, 2_000, 4_000];
10
+ export function createHttpTransport(options) {
11
+ const fetchImpl = options.fetch ?? globalThis.fetch;
12
+ const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
13
+ const retryForMs = options.retryForMs ?? 120_000;
14
+ const post = (request) => fetchImpl(options.url, {
15
+ method: "POST",
16
+ headers: { "content-type": "application/json", authorization: `Bearer ${options.capability}` },
17
+ body: JSON.stringify(request),
18
+ });
19
+ const gatewayError = (error, status) => new GatewayError((error?.code ?? "internal"), error?.message ?? `gateway answered ${status}`, typeof error?.causeCode === "string" ? error.causeCode : undefined);
20
+ return {
21
+ async call(request) {
22
+ const giveUpAt = Date.now() + retryForMs;
23
+ for (let attempt = 0;; attempt += 1) {
24
+ let response;
25
+ try {
26
+ response = await post(request);
27
+ }
28
+ catch (err) {
29
+ if (Date.now() >= giveUpAt) {
30
+ throw new GatewayError("internal", `gateway unreachable: ${err instanceof Error ? err.message : String(err)}`);
31
+ }
32
+ await sleep(RETRY_DELAYS_MS[Math.min(attempt, RETRY_DELAYS_MS.length - 1)]);
33
+ continue;
34
+ }
35
+ const body = (await response.json().catch(() => undefined));
36
+ if (body?.ok === true)
37
+ return body.result;
38
+ // Isolation not proven yet (a pod's NetworkPolicy is still being programmed): wait and ask again.
39
+ if (body?.ok === false && body.error.code === "not_ready" && Date.now() < giveUpAt) {
40
+ await sleep(RETRY_DELAYS_MS[Math.min(attempt, RETRY_DELAYS_MS.length - 1)]);
41
+ continue;
42
+ }
43
+ throw gatewayError(body?.ok === false ? body.error : undefined, response.status);
44
+ }
45
+ },
46
+ async *stream(request) {
47
+ const giveUpAt = Date.now() + retryForMs;
48
+ let response;
49
+ for (let attempt = 0;; attempt += 1) {
50
+ try {
51
+ response = await post(request);
52
+ }
53
+ catch (err) {
54
+ throw new GatewayError("internal", `gateway unreachable: ${err instanceof Error ? err.message : String(err)}`);
55
+ }
56
+ if (response.headers.get("content-type")?.includes("application/x-ndjson") && response.body)
57
+ break;
58
+ const body = (await response.json().catch(() => undefined));
59
+ // Refused before any reservation was taken, so asking again is safe.
60
+ if (body?.error?.code === "not_ready" && Date.now() < giveUpAt) {
61
+ await sleep(RETRY_DELAYS_MS[Math.min(attempt, RETRY_DELAYS_MS.length - 1)]);
62
+ continue;
63
+ }
64
+ throw gatewayError(body?.error, response.status);
65
+ }
66
+ const decoder = new TextDecoder();
67
+ let buffer = "";
68
+ for await (const chunk of response.body) {
69
+ buffer += decoder.decode(chunk, { stream: true });
70
+ let newline;
71
+ while ((newline = buffer.indexOf("\n")) >= 0) {
72
+ const line = buffer.slice(0, newline);
73
+ buffer = buffer.slice(newline + 1);
74
+ if (!line)
75
+ continue;
76
+ const frame = JSON.parse(line);
77
+ if (frame.event)
78
+ yield frame.event;
79
+ else if (frame.error)
80
+ throw gatewayError(frame.error, 200);
81
+ else if (frame.end)
82
+ return;
83
+ }
84
+ }
85
+ throw new GatewayError("internal", "The gateway stream ended without a result.");
86
+ },
87
+ };
88
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Kubernetes objects for one sandbox-mode native run (docs/native-sandbox.md), as pure builders —
3
+ * the launcher creates exactly these and attests what the API server stored against them. One pod
4
+ * per run, with no service-account token, a read-only non-root container holding no credentials,
5
+ * its WorkerInput (capability included) mounted read-only from a per-run Secret, and a
6
+ * NetworkPolicy whose only egress is the native gateway's port. Names carry a hash of the run id,
7
+ * never the id itself.
8
+ */
9
+ import type { V1NetworkPolicy, V1Pod, V1Secret } from "@kubernetes/client-node";
10
+ import { type KubernetesPlatform } from "../providers/jobs/kubernetes-platform.js";
11
+ import { nativeWarmWorkerName, type NativeWorkerLimits } from "./docker-isolation.js";
12
+ export { nativeWarmWorkerName };
13
+ import type { WorkerInput } from "./protocol.js";
14
+ export declare const NATIVE_RUN_COMPONENT_LABEL: {
15
+ readonly "wardby.io/component": "native-run";
16
+ };
17
+ export declare const NATIVE_GATEWAY_POD_LABEL: {
18
+ readonly "app.kubernetes.io/name": "wardby-native-gateway";
19
+ };
20
+ export declare const NATIVE_RUN_SHA_LABEL = "wardby.io/run-sha256";
21
+ /** The label selector listing every native run pod (the janitor's listing). */
22
+ export declare const NATIVE_RUN_SELECTOR = "wardby.io/component=native-run";
23
+ export declare const NATIVE_WORKER_CONTAINER = "worker";
24
+ export declare const NATIVE_INPUT_MOUNT = "/run/wardby/input";
25
+ export declare const NATIVE_INPUT_KEY = "input.json";
26
+ export declare const NATIVE_INPUT_FILE = "/run/wardby/input/input.json";
27
+ export interface NativeKubernetesNames {
28
+ runSha: string;
29
+ pod: string;
30
+ policy: string;
31
+ secret: string;
32
+ }
33
+ export declare function nativeKubernetesNames(runId: string): NativeKubernetesNames;
34
+ export declare function nativeRunLabels(runId: string): Record<string, string>;
35
+ export declare function buildNativeInputSecret(input: WorkerInput, namespace: string): V1Secret;
36
+ export interface NativeRunPodOptions {
37
+ runId: string;
38
+ namespace: string;
39
+ image: string;
40
+ limits: NativeWorkerLimits;
41
+ /** The pod's hard lifetime: the run's session deadline. */
42
+ activeDeadlineSeconds: number;
43
+ runtimeClassName?: string;
44
+ /** The cluster's admission rules the pod must already satisfy (KUBERNETES_PLATFORM). Default: "generic". */
45
+ platform?: KubernetesPlatform;
46
+ /** KUBERNETES_RUN_PRIORITY_CLASS: the class must exist in the cluster, or every create is refused. */
47
+ priorityClassName?: string;
48
+ }
49
+ export declare const NATIVE_SANDBOX_PLATFORM_ERROR = "native_sandbox_platform_unsupported";
50
+ export declare function buildNativeRunPod(options: NativeRunPodOptions): V1Pod;
51
+ /** The labels of every warm pool pod: still a native-run pod (the gateway admits it), never a run's. */
52
+ export declare const NATIVE_WARM_POOL_LABEL: {
53
+ readonly "wardby.io/pool": "warm";
54
+ };
55
+ export declare const NATIVE_WARM_TOKEN_LABEL = "wardby.io/warm-worker";
56
+ /** The label selector listing every warm pool pod. */
57
+ export declare const NATIVE_WARM_SELECTOR = "wardby.io/component=native-run,wardby.io/pool=warm";
58
+ export declare function nativeWarmLabels(token: string): Record<string, string>;
59
+ export interface NativeWarmPodOptions extends Omit<NativeRunPodOptions, "runId"> {
60
+ token: string;
61
+ /** NATIVE_WORKER_INPUT_WAIT_MS: how long the worker waits to be claimed before it exits. */
62
+ waitMs: number;
63
+ }
64
+ /** A warm pool pod (native sandbox phase 6): no input yet; it waits for one delivered by exec. */
65
+ export declare function buildNativeWarmPod(options: NativeWarmPodOptions): V1Pod;
66
+ /** Ingress: none. Egress: the native gateway's pods, on the gateway port only. */
67
+ export declare function buildNativeRunNetworkPolicy(runId: string, namespace: string): V1NetworkPolicy;
68
+ /** A warm pool pod's policy: the same egress, selecting the pod by its token. */
69
+ export declare function buildNativeWarmNetworkPolicy(token: string, namespace: string): V1NetworkPolicy;
70
+ /** Exit codes of the in-pod enforcement probe. */
71
+ export declare const NATIVE_PROBE: {
72
+ readonly proven: 0;
73
+ readonly gatewayUnreachable: 3;
74
+ readonly denyReachable: 4;
75
+ readonly outsideReachable: 5;
76
+ };
77
+ /** Addresses a worker must not reach: the internet, and the cloud metadata endpoints (node and workload credentials). */
78
+ export declare const NATIVE_PROBE_OUTSIDE: readonly {
79
+ host: string;
80
+ port: number;
81
+ }[];
82
+ /**
83
+ * Run inside the worker container (exec): proves the pod's egress is the gateway port and nothing
84
+ * else — the gateway answers, while its deny port (same address, another port) and every outside
85
+ * address do not. A connection that is refused or times out both count as unreachable.
86
+ */
87
+ export declare function nativeEnforcementProbe(gatewayHost: string, outside?: readonly {
88
+ host: string;
89
+ port: number;
90
+ }[]): string[];