@wardby/cli 0.5.2 → 0.6.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 (411) hide show
  1. package/.env.example +33 -0
  2. package/README.md +25 -14
  3. package/dist/claude-coding-worker/context.d.ts +22 -0
  4. package/dist/claude-coding-worker/context.js +92 -0
  5. package/dist/claude-coding-worker/driver.d.ts +7 -1
  6. package/dist/claude-coding-worker/driver.js +38 -5
  7. package/dist/claude-coding-worker/sdk.js +13 -4
  8. package/dist/cli-help.d.ts +1 -1
  9. package/dist/cli-help.js +5 -2
  10. package/dist/cli-native-mode.d.ts +9 -0
  11. package/dist/cli-native-mode.js +20 -0
  12. package/dist/cli.d.ts +3 -1
  13. package/dist/cli.js +141 -5
  14. package/dist/coding/claude-context.d.ts +45 -0
  15. package/dist/coding/claude-context.js +434 -0
  16. package/dist/coding/local-git.js +9 -1
  17. package/dist/coding/profile.d.ts +12 -0
  18. package/dist/coding/profile.js +6 -0
  19. package/dist/coding/protocol.d.ts +104 -0
  20. package/dist/coding/protocol.js +87 -3
  21. package/dist/coding/registry/pypi.d.ts +25 -1
  22. package/dist/coding/registry/pypi.js +140 -16
  23. package/dist/coding/registry/types.d.ts +17 -3
  24. package/dist/coding-worker/artifact.d.ts +8 -0
  25. package/dist/coding-worker/artifact.js +2 -2
  26. package/dist/coding-worker/driver.js +2 -0
  27. package/dist/coding-worker/sdk.d.ts +6 -0
  28. package/dist/coding-worker/sdk.js +1 -0
  29. package/dist/coding-worker/skills.d.ts +23 -0
  30. package/dist/coding-worker/skills.js +117 -0
  31. package/dist/coding-worker/types.d.ts +2 -0
  32. package/dist/config/github-allowed-accounts.d.ts +15 -0
  33. package/dist/config/github-allowed-accounts.js +36 -0
  34. package/dist/config/low-power.d.ts +12 -0
  35. package/dist/config/low-power.js +18 -0
  36. package/dist/config/mobile.d.ts +12 -0
  37. package/dist/config/mobile.js +18 -0
  38. package/dist/config/providers.d.ts +56 -2
  39. package/dist/config/providers.js +92 -6
  40. package/dist/core/db.d.ts +16 -6
  41. package/dist/core/db.js +12 -10
  42. package/dist/core/dispatch.d.ts +11 -0
  43. package/dist/core/dispatch.js +36 -1
  44. package/dist/core/engine-native.js +9 -5
  45. package/dist/core/host-events.d.ts +49 -3
  46. package/dist/core/host-events.js +289 -15
  47. package/dist/core/http-runtime.js +13 -6
  48. package/dist/core/issue-bridge.js +42 -2
  49. package/dist/core/issue-events.js +12 -1
  50. package/dist/core/issue-status.js +14 -3
  51. package/dist/core/merge-order-check.d.ts +129 -0
  52. package/dist/core/merge-order-check.js +336 -0
  53. package/dist/core/notification-dispatcher.d.ts +70 -0
  54. package/dist/core/notification-dispatcher.js +368 -0
  55. package/dist/core/notification-templates.d.ts +25 -0
  56. package/dist/core/notification-templates.js +105 -0
  57. package/dist/core/notifications.d.ts +10 -0
  58. package/dist/core/notifications.js +38 -0
  59. package/dist/core/pg-auth.d.ts +22 -0
  60. package/dist/core/pg-auth.js +152 -0
  61. package/dist/core/power-composition.d.ts +16 -0
  62. package/dist/core/power-composition.js +37 -0
  63. package/dist/core/power-idle.d.ts +14 -0
  64. package/dist/core/power-idle.js +30 -0
  65. package/dist/core/power.d.ts +71 -0
  66. package/dist/core/power.js +202 -0
  67. package/dist/core/reconciler.d.ts +4 -2
  68. package/dist/core/reconciler.js +29 -5
  69. package/dist/core/related-pull-requests.d.ts +48 -4
  70. package/dist/core/related-pull-requests.js +113 -11
  71. package/dist/core/repo-access.d.ts +15 -0
  72. package/dist/core/repo-access.js +66 -0
  73. package/dist/core/review-fix.d.ts +37 -0
  74. package/dist/core/review-fix.js +207 -6
  75. package/dist/core/review-host-tools.d.ts +20 -0
  76. package/dist/core/review-host-tools.js +58 -2
  77. package/dist/core/runner.d.ts +336 -3
  78. package/dist/core/runner.js +894 -317
  79. package/dist/core/secret-broker-config.d.ts +103 -0
  80. package/dist/core/secret-broker-config.js +112 -0
  81. package/dist/core/secrets.d.ts +39 -4
  82. package/dist/core/secrets.js +148 -40
  83. package/dist/core/workflow-event-recorder.d.ts +14 -0
  84. package/dist/core/workflow-event-recorder.js +120 -0
  85. package/dist/core/workflow-events.d.ts +82 -0
  86. package/dist/core/workflow-events.js +44 -0
  87. package/dist/core/workflow-run-events.d.ts +16 -0
  88. package/dist/core/workflow-run-events.js +40 -0
  89. package/dist/generated/prisma/browser.d.ts +58 -0
  90. package/dist/generated/prisma/client.d.ts +58 -0
  91. package/dist/generated/prisma/commonInputTypes.d.ts +150 -0
  92. package/dist/generated/prisma/enums.d.ts +27 -0
  93. package/dist/generated/prisma/enums.js +23 -0
  94. package/dist/generated/prisma/internal/class.d.ts +88 -0
  95. package/dist/generated/prisma/internal/class.js +4 -4
  96. package/dist/generated/prisma/internal/prismaNamespace.d.ts +772 -1
  97. package/dist/generated/prisma/internal/prismaNamespace.js +135 -4
  98. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +139 -0
  99. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +135 -4
  100. package/dist/generated/prisma/models/Agent.d.ts +360 -1
  101. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +73 -1
  102. package/dist/generated/prisma/models/CodingRun.d.ts +205 -1
  103. package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
  104. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1675 -0
  105. package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
  106. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1517 -0
  107. package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
  108. package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
  109. package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
  110. package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
  111. package/dist/generated/prisma/models/NotificationChannel.js +1 -0
  112. package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
  113. package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
  114. package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
  115. package/dist/generated/prisma/models/NotificationThread.js +1 -0
  116. package/dist/generated/prisma/models/Run.d.ts +826 -1
  117. package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
  118. package/dist/generated/prisma/models/Secret.d.ts +37 -1
  119. package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
  120. package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
  121. package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
  122. package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
  123. package/dist/generated/prisma/models.d.ts +8 -0
  124. package/dist/help/build.js +4 -2
  125. package/dist/help/catalog.d.ts +1 -1
  126. package/dist/help/catalog.js +31 -6
  127. package/dist/help-index.json +1492 -113
  128. package/dist/import/create.js +17 -0
  129. package/dist/import/neutral-schema.d.ts +6 -2
  130. package/dist/import/neutral-schema.js +2 -0
  131. package/dist/mcp/auth/access.d.ts +1 -0
  132. package/dist/mcp/auth/ownership.d.ts +1 -1
  133. package/dist/mcp/auth/repo-authorization.js +14 -0
  134. package/dist/mcp/auth/resource-server.d.ts +2 -1
  135. package/dist/mcp/auth/resource-server.js +7 -2
  136. package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
  137. package/dist/mcp/auth/self-hosted/browser.js +19 -6
  138. package/dist/mcp/context.d.ts +6 -0
  139. package/dist/mcp/host-events/github-ingress.d.ts +23 -1
  140. package/dist/mcp/host-events/github-ingress.js +68 -0
  141. package/dist/mcp/index.d.ts +13 -0
  142. package/dist/mcp/index.js +59 -10
  143. package/dist/mcp/tools/agents.js +83 -12
  144. package/dist/mcp/tools/notification-channels.d.ts +2 -0
  145. package/dist/mcp/tools/notification-channels.js +293 -0
  146. package/dist/mcp/tools/power.d.ts +2 -0
  147. package/dist/mcp/tools/power.js +77 -0
  148. package/dist/mcp/tools/runs.d.ts +0 -6
  149. package/dist/mcp/tools/runs.js +7 -2
  150. package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
  151. package/dist/mcp/tools/secret-broker-compat.js +23 -0
  152. package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
  153. package/dist/mcp/tools/secret-elicitation-form.js +200 -10
  154. package/dist/mcp/tools/secret-elicitation-server.js +8 -1
  155. package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
  156. package/dist/mcp/tools/secret-elicitation.js +110 -12
  157. package/dist/mcp/tools/secrets.js +184 -7
  158. package/dist/mcp/tools/tools.d.ts +1 -1
  159. package/dist/mcp/tools/tools.js +22 -2
  160. package/dist/native-worker/composition.d.ts +23 -0
  161. package/dist/native-worker/composition.js +77 -0
  162. package/dist/native-worker/docker-isolation.d.ts +65 -0
  163. package/dist/native-worker/docker-isolation.js +183 -0
  164. package/dist/native-worker/docker-launcher.d.ts +74 -0
  165. package/dist/native-worker/docker-launcher.js +237 -0
  166. package/dist/native-worker/gateway-server.d.ts +39 -0
  167. package/dist/native-worker/gateway-server.js +315 -0
  168. package/dist/native-worker/gateway.d.ts +44 -0
  169. package/dist/native-worker/gateway.js +197 -0
  170. package/dist/native-worker/http-server.d.ts +22 -0
  171. package/dist/native-worker/http-server.js +109 -0
  172. package/dist/native-worker/http-transport.d.ts +17 -0
  173. package/dist/native-worker/http-transport.js +88 -0
  174. package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
  175. package/dist/native-worker/kubernetes-isolation.js +218 -0
  176. package/dist/native-worker/kubernetes-launcher.d.ts +102 -0
  177. package/dist/native-worker/kubernetes-launcher.js +335 -0
  178. package/dist/native-worker/launch.d.ts +45 -0
  179. package/dist/native-worker/launch.js +44 -0
  180. package/dist/native-worker/ledger.d.ts +109 -0
  181. package/dist/native-worker/ledger.js +192 -0
  182. package/dist/native-worker/loopback.d.ts +12 -0
  183. package/dist/native-worker/loopback.js +49 -0
  184. package/dist/native-worker/main.d.ts +7 -0
  185. package/dist/native-worker/main.js +74 -0
  186. package/dist/native-worker/protocol.d.ts +744 -0
  187. package/dist/native-worker/protocol.js +200 -0
  188. package/dist/native-worker/sandbox-executor.d.ts +68 -0
  189. package/dist/native-worker/sandbox-executor.js +210 -0
  190. package/dist/native-worker/stdio.d.ts +29 -0
  191. package/dist/native-worker/stdio.js +188 -0
  192. package/dist/native-worker/warm-delivery.d.ts +16 -0
  193. package/dist/native-worker/warm-delivery.js +33 -0
  194. package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
  195. package/dist/native-worker/warm-pool-ledger.js +73 -0
  196. package/dist/native-worker/warm-pool.d.ts +107 -0
  197. package/dist/native-worker/warm-pool.js +283 -0
  198. package/dist/native-worker/worker.d.ts +17 -0
  199. package/dist/native-worker/worker.js +115 -0
  200. package/dist/providers/auth/authorization-server.d.ts +3 -0
  201. package/dist/providers/auth/index.js +2 -0
  202. package/dist/providers/auth/self-hosted.d.ts +13 -1
  203. package/dist/providers/auth/self-hosted.js +54 -4
  204. package/dist/providers/chat/fake.d.ts +46 -0
  205. package/dist/providers/chat/fake.js +39 -0
  206. package/dist/providers/chat/index.d.ts +4 -0
  207. package/dist/providers/chat/index.js +8 -0
  208. package/dist/providers/chat/slack.d.ts +37 -0
  209. package/dist/providers/chat/slack.js +105 -0
  210. package/dist/providers/chat/types.d.ts +42 -0
  211. package/dist/providers/chat/types.js +19 -0
  212. package/dist/providers/coding-proxy/mock-upstream.d.ts +33 -0
  213. package/dist/providers/coding-proxy/mock-upstream.js +116 -0
  214. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +3 -0
  215. package/dist/providers/coding-proxy/registry/prisma-store.js +17 -0
  216. package/dist/providers/coding-proxy/registry/service.d.ts +4 -0
  217. package/dist/providers/coding-proxy/registry/service.js +20 -3
  218. package/dist/providers/coding-proxy/registry/store.d.ts +18 -1
  219. package/dist/providers/coding-proxy/registry/store.js +33 -0
  220. package/dist/providers/coding-proxy/runtime.js +12 -1
  221. package/dist/providers/coding-proxy/types.d.ts +2 -0
  222. package/dist/providers/engine/types.d.ts +19 -0
  223. package/dist/providers/engine/types.js +22 -0
  224. package/dist/providers/executor/composition.d.ts +24 -1
  225. package/dist/providers/executor/composition.js +39 -6
  226. package/dist/providers/executor/container.d.ts +24 -1
  227. package/dist/providers/executor/container.js +101 -11
  228. package/dist/providers/executor/dbos.d.ts +42 -0
  229. package/dist/providers/executor/dbos.js +118 -12
  230. package/dist/providers/executor/deferred.d.ts +56 -0
  231. package/dist/providers/executor/deferred.js +119 -0
  232. package/dist/providers/executor/routing.d.ts +37 -10
  233. package/dist/providers/executor/routing.js +73 -32
  234. package/dist/providers/executor/types.d.ts +12 -0
  235. package/dist/providers/jobs/docker.js +3 -3
  236. package/dist/providers/jobs/fake-kubernetes-api.d.ts +21 -2
  237. package/dist/providers/jobs/fake-kubernetes-api.js +42 -1
  238. package/dist/providers/jobs/kubernetes-api.d.ts +17 -1
  239. package/dist/providers/jobs/kubernetes-api.js +7 -0
  240. package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
  241. package/dist/providers/jobs/kubernetes-client.js +52 -3
  242. package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
  243. package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
  244. package/dist/providers/jobs/kubernetes-isolation.d.ts +16 -1
  245. package/dist/providers/jobs/kubernetes-isolation.js +58 -5
  246. package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
  247. package/dist/providers/jobs/kubernetes-platform.js +38 -1
  248. package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
  249. package/dist/providers/jobs/kubernetes-preflight.js +4 -2
  250. package/dist/providers/jobs/kubernetes.d.ts +56 -7
  251. package/dist/providers/jobs/kubernetes.js +117 -36
  252. package/dist/providers/jobs/metadata-probes.d.ts +11 -0
  253. package/dist/providers/jobs/metadata-probes.js +13 -0
  254. package/dist/providers/jobs/types.d.ts +9 -0
  255. package/dist/providers/llm/openai.js +0 -1
  256. package/dist/providers/review-host/github.d.ts +11 -1
  257. package/dist/providers/review-host/github.js +50 -0
  258. package/dist/providers/review-host/types.d.ts +23 -0
  259. package/dist/providers/vcs/github.d.ts +32 -6
  260. package/dist/providers/vcs/github.js +74 -16
  261. package/dist/quickstart/coding-db.js +14 -2
  262. package/dist/quickstart/coding-doctor.d.ts +3 -0
  263. package/dist/quickstart/coding-doctor.js +3 -0
  264. package/dist/quickstart/coding-images.d.ts +9 -0
  265. package/dist/quickstart/coding-images.js +39 -0
  266. package/dist/quickstart/coding-seed.d.ts +20 -1
  267. package/dist/quickstart/coding-seed.js +96 -7
  268. package/dist/quickstart/coding.d.ts +2 -0
  269. package/dist/quickstart/coding.js +75 -3
  270. package/dist/quickstart/config.d.ts +2 -0
  271. package/dist/quickstart/config.js +4 -0
  272. package/dist/quickstart/images.d.ts +13 -0
  273. package/dist/quickstart/images.js +80 -12
  274. package/dist/quickstart/index.d.ts +0 -2
  275. package/dist/quickstart/index.js +10 -14
  276. package/dist/quickstart/manifests.d.ts +56 -0
  277. package/dist/quickstart/manifests.js +523 -0
  278. package/dist/quickstart/python-detect.d.ts +10 -0
  279. package/dist/quickstart/python-detect.js +32 -0
  280. package/dist/quickstart/repo-packages.d.ts +10 -0
  281. package/dist/quickstart/repo-packages.js +132 -0
  282. package/dist/quickstart/reviewer-prompt.d.ts +12 -0
  283. package/dist/quickstart/reviewer-prompt.js +84 -0
  284. package/dist/quickstart/scenarios.d.ts +19 -0
  285. package/dist/quickstart/scenarios.js +28 -0
  286. package/dist/quickstart/sync-reviewer-prompt.d.ts +1 -0
  287. package/dist/quickstart/sync-reviewer-prompt.js +10 -0
  288. package/dist/quickstart-images.json +1 -1
  289. package/dist/sandbox/brokered-fetch.d.ts +23 -0
  290. package/dist/sandbox/brokered-fetch.js +37 -0
  291. package/dist/sandbox/host-functions.d.ts +34 -0
  292. package/dist/sandbox/host-functions.js +144 -80
  293. package/dist/sandbox/prelude.js +7 -1
  294. package/dist/sandbox/run-in-sandbox.d.ts +19 -0
  295. package/dist/sandbox/run-in-sandbox.js +28 -10
  296. package/dist/sandbox/safe-fetch.d.ts +2 -0
  297. package/dist/sandbox/safe-fetch.js +3 -1
  298. package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
  299. package/dist/sandbox/secret-broker-sigv4.js +49 -0
  300. package/dist/sandbox/secret-broker.d.ts +34 -0
  301. package/dist/sandbox/secret-broker.js +162 -0
  302. package/dist/sandbox/user-tool.d.ts +14 -0
  303. package/dist/sandbox/user-tool.js +32 -0
  304. package/dist/serve.js +18 -0
  305. package/dist/viewer/api-schema.d.ts +214 -18
  306. package/dist/viewer/api-schema.js +22 -0
  307. package/dist/viewer/build-schemas.js +4 -1
  308. package/dist/viewer/event-bus.d.ts +6 -0
  309. package/dist/viewer/event-bus.js +16 -7
  310. package/dist/viewer/graph.d.ts +5 -2
  311. package/dist/viewer/graph.js +7 -2
  312. package/dist/viewer/http.d.ts +0 -1
  313. package/dist/viewer/http.js +2 -2
  314. package/dist/viewer/infra.js +25 -2
  315. package/dist/viewer/limits.d.ts +4 -0
  316. package/dist/viewer/limits.js +4 -0
  317. package/dist/viewer/openapi.d.ts +15 -0
  318. package/dist/viewer/openapi.js +172 -0
  319. package/docs/README.md +7 -0
  320. package/docs/agent-recipes.md +57 -8
  321. package/docs/architecture-runtime.md +16 -1
  322. package/docs/code-review-agents.md +139 -5
  323. package/docs/coding-agent-setup.md +127 -2
  324. package/docs/coding-packages.md +105 -5
  325. package/docs/coding-services.md +3 -1
  326. package/docs/coding-worker-byo-images.md +239 -2
  327. package/docs/coding-worker-isolation.md +88 -23
  328. package/docs/getting-started-gke.md +225 -9
  329. package/docs/getting-started-identity-provider.md +21 -10
  330. package/docs/getting-started.md +140 -11
  331. package/docs/jira-agents.md +5 -1
  332. package/docs/knowledge.md +11 -0
  333. package/docs/native-sandbox.md +635 -0
  334. package/docs/release-verification.md +9 -0
  335. package/docs/security-deployment.md +113 -12
  336. package/docs/slack-notifications.md +252 -0
  337. package/docs/tool-secrets.md +252 -0
  338. package/docs/viewer-api.md +46 -5
  339. package/docs/viewer-api.openapi.yml +1404 -0
  340. package/help/admin-viewer.md +6 -2
  341. package/help/agent-recipes.md +27 -0
  342. package/help/architecture-agent.md +136 -0
  343. package/help/brokered-secrets.md +79 -0
  344. package/help/build-claude-code-image.md +131 -0
  345. package/help/build-worker-image.md +195 -0
  346. package/help/code-review-agents.md +68 -6
  347. package/help/coding-packages.md +31 -2
  348. package/help/creating-agents.md +14 -0
  349. package/help/deploy-gke.md +37 -6
  350. package/help/deployment-targets.md +24 -13
  351. package/help/errors/coding-provider-not-configured.md +2 -2
  352. package/help/errors/database-auth-invalid.md +28 -0
  353. package/help/errors/github-account-not-allowed.md +25 -0
  354. package/help/errors/low-power-disabled.md +29 -0
  355. package/help/errors/low-power-scale-forbidden.md +35 -0
  356. package/help/errors/low-power-wake-timeout.md +30 -0
  357. package/help/errors/mobile-disabled.md +31 -0
  358. package/help/errors/native-sandbox-capacity.md +22 -0
  359. package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
  360. package/help/errors/native-sandbox-docker-failed.md +20 -0
  361. package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
  362. package/help/errors/native-sandbox-image-not-pinned.md +19 -0
  363. package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
  364. package/help/errors/native-sandbox-network-unenforced.md +22 -0
  365. package/help/errors/native-sandbox-requires-catalog.md +31 -0
  366. package/help/errors/native-sandbox-unavailable.md +19 -0
  367. package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
  368. package/help/errors/native-sandbox-worker-exited.md +20 -0
  369. package/help/errors/native-sandbox-worker-lost.md +20 -0
  370. package/help/errors/native-sandbox-worker-unready.md +22 -0
  371. package/help/errors/secret-broker-body-invalid.md +26 -0
  372. package/help/errors/secret-broker-changed.md +20 -0
  373. package/help/errors/secret-broker-config-invalid.md +30 -0
  374. package/help/errors/secret-broker-conflict.md +27 -0
  375. package/help/errors/secret-broker-destination-denied.md +28 -0
  376. package/help/errors/secret-broker-value-invalid.md +28 -0
  377. package/help/errors/secret-brokered.md +24 -0
  378. package/help/errors/secret-not-brokered.md +25 -0
  379. package/help/errors/slack-auth-failed.md +48 -0
  380. package/help/errors/slack-channel-unreachable.md +39 -0
  381. package/help/errors/slack-not-configured.md +33 -0
  382. package/help/getting-started.md +18 -0
  383. package/help/github.md +18 -1
  384. package/help/identity-and-access.md +5 -1
  385. package/help/local-repositories.md +35 -5
  386. package/help/low-power-mode.md +125 -0
  387. package/help/merge-order-check.md +117 -0
  388. package/help/mobile-app.md +54 -0
  389. package/help/native-sandbox.md +136 -0
  390. package/help/observability.md +8 -0
  391. package/help/related-pull-requests.md +70 -9
  392. package/help/repo-instructions-and-skills.md +91 -0
  393. package/help/review-fix-rounds.md +10 -0
  394. package/help/slack-notifications.md +62 -0
  395. package/help/troubleshooting/coding-workers.md +21 -0
  396. package/package.json +13 -5
  397. package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
  398. package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
  399. package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
  400. package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
  401. package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
  402. package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
  403. package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
  404. package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
  405. package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
  406. package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
  407. package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
  408. package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
  409. package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
  410. package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
  411. package/prisma/schema.prisma +362 -91
@@ -0,0 +1,188 @@
1
+ /**
2
+ * The worker contract over a child process's stdin/stdout, as newline-delimited
3
+ * JSON. The control plane writes the WorkerInput as the first line, then
4
+ * answers the worker's requests; the worker writes requests and reads answers.
5
+ * Both directions are capped at MAX_MESSAGE_BYTES per line. stderr is the
6
+ * worker's diagnostics only.
7
+ *
8
+ * Frames, worker → control: { id, request }
9
+ * Frames, control → worker: { id, ok: true, result } | { id, ok: false, error: { code, message } }
10
+ * | { id, event } (llm.stream events) | { id, end: true }
11
+ */
12
+ import { spawn } from "node:child_process";
13
+ import { GatewayError, MAX_MESSAGE_BYTES, ProtocolError, } from "./protocol.js";
14
+ /** Splits a byte stream into lines, refusing any line over the cap. */
15
+ export function readLines(stream, onLine, onError) {
16
+ let buffer = "";
17
+ stream.setEncoding("utf8");
18
+ stream.on("data", (chunk) => {
19
+ buffer += chunk;
20
+ let newline;
21
+ while ((newline = buffer.indexOf("\n")) >= 0) {
22
+ const line = buffer.slice(0, newline);
23
+ buffer = buffer.slice(newline + 1);
24
+ if (line)
25
+ onLine(line);
26
+ }
27
+ if (Buffer.byteLength(buffer) > MAX_MESSAGE_BYTES) {
28
+ buffer = "";
29
+ onError(new ProtocolError("message_too_large"));
30
+ }
31
+ });
32
+ }
33
+ function writeLine(stream, frame) {
34
+ const line = JSON.stringify(frame);
35
+ if (Buffer.byteLength(line) > MAX_MESSAGE_BYTES)
36
+ throw new ProtocolError("message_too_large");
37
+ stream.write(`${line}\n`);
38
+ }
39
+ const errorFrame = (err) => {
40
+ const gatewayError = err instanceof GatewayError ? err : new GatewayError("internal", err instanceof Error ? err.message : String(err));
41
+ return { code: gatewayError.code, message: gatewayError.message };
42
+ };
43
+ /** The worker's side: requests out on `output`, answers in on `input`. */
44
+ export function createStdioTransport(input, output) {
45
+ let nextId = 0;
46
+ const pending = new Map();
47
+ const failAll = (err) => {
48
+ for (const entry of pending.values())
49
+ (entry.kind === "call" ? entry.reject : entry.fail)(err);
50
+ pending.clear();
51
+ };
52
+ readLines(input, (line) => {
53
+ let frame;
54
+ try {
55
+ frame = JSON.parse(line);
56
+ }
57
+ catch {
58
+ failAll(new ProtocolError("message_not_json"));
59
+ return;
60
+ }
61
+ const entry = pending.get(frame.id);
62
+ if (!entry)
63
+ return;
64
+ const error = frame.error
65
+ ? new GatewayError(frame.error.code, frame.error.message)
66
+ : undefined;
67
+ if (entry.kind === "call") {
68
+ pending.delete(frame.id);
69
+ if (error)
70
+ entry.reject(error);
71
+ else
72
+ entry.resolve(frame.result ?? null);
73
+ }
74
+ else if (frame.event) {
75
+ entry.push(frame.event);
76
+ }
77
+ else {
78
+ pending.delete(frame.id);
79
+ if (error)
80
+ entry.fail(error);
81
+ else
82
+ entry.end();
83
+ }
84
+ }, failAll);
85
+ input.on("end", () => failAll(new GatewayError("internal", "The gateway connection closed.")));
86
+ return {
87
+ call(request) {
88
+ const id = ++nextId;
89
+ return new Promise((resolve, reject) => {
90
+ pending.set(id, { kind: "call", resolve, reject });
91
+ writeLine(output, { id, request });
92
+ });
93
+ },
94
+ async *stream(request) {
95
+ const id = ++nextId;
96
+ const queue = [];
97
+ let done = false;
98
+ let failure;
99
+ let wake;
100
+ const notify = () => {
101
+ wake?.();
102
+ wake = undefined;
103
+ };
104
+ pending.set(id, {
105
+ kind: "stream",
106
+ push: (event) => {
107
+ queue.push(event);
108
+ notify();
109
+ },
110
+ end: () => {
111
+ done = true;
112
+ notify();
113
+ },
114
+ fail: (err) => {
115
+ failure = err;
116
+ notify();
117
+ },
118
+ });
119
+ writeLine(output, { id, request });
120
+ for (;;) {
121
+ if (queue.length > 0) {
122
+ yield queue.shift();
123
+ continue;
124
+ }
125
+ if (failure)
126
+ throw failure;
127
+ if (done)
128
+ return;
129
+ await new Promise((resolve) => (wake = resolve));
130
+ }
131
+ },
132
+ };
133
+ }
134
+ /** Serves one worker's requests from `gateway`, answering on `output`. */
135
+ export function serveStdioWorker(input, output, gateway) {
136
+ readLines(input, (line) => {
137
+ let frame;
138
+ try {
139
+ frame = JSON.parse(line);
140
+ }
141
+ catch {
142
+ return; // An unparseable line has no id to answer; the worker's own call times out with its process.
143
+ }
144
+ const { id, request } = frame;
145
+ const method = request?.method;
146
+ if (method === "llm.stream") {
147
+ void (async () => {
148
+ try {
149
+ for await (const event of gateway.stream(request))
150
+ writeLine(output, { id, event });
151
+ writeLine(output, { id, end: true });
152
+ }
153
+ catch (err) {
154
+ writeLine(output, { id, ok: false, error: errorFrame(err) });
155
+ }
156
+ })();
157
+ return;
158
+ }
159
+ void gateway.call(request).then((result) => writeLine(output, { id, ok: true, result: result ?? null }), (err) => writeLine(output, { id, ok: false, error: errorFrame(err) }));
160
+ }, () => {
161
+ // An oversized line from the worker: drop it; the worker is killed with its run.
162
+ });
163
+ }
164
+ /** Launches the worker as a child process speaking this transport on its stdio. */
165
+ export function createProcessLauncher(spec) {
166
+ return {
167
+ run(input, gateway, signal) {
168
+ return new Promise((resolve) => {
169
+ const child = spawn(spec.command, spec.args, {
170
+ env: spec.env ?? {},
171
+ cwd: spec.cwd,
172
+ stdio: ["pipe", "pipe", "inherit"],
173
+ });
174
+ const kill = () => child.kill("SIGKILL");
175
+ signal.addEventListener("abort", kill, { once: true });
176
+ child.on("error", () => resolve({ exitCode: null }));
177
+ child.on("exit", (code) => {
178
+ signal.removeEventListener("abort", kill);
179
+ resolve({ exitCode: code });
180
+ });
181
+ // A worker that exits mid-answer closes its stdin under a pending write: not an error here.
182
+ child.stdin.on("error", () => { });
183
+ serveStdioWorker(child.stdout, child.stdin, gateway);
184
+ writeLine(child.stdin, input);
185
+ });
186
+ },
187
+ };
188
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * How a claimed warm worker gets its input (native sandbox phase 6): the launcher runs this fixed
3
+ * command inside the worker's container (`docker exec -i`, or the Kubernetes exec API) with the
4
+ * WorkerInput on stdin. The capability is never in the command, so it stays out of argv, the
5
+ * environment, and Kubernetes audit logs. The file is written under a temporary name and hard-linked into
6
+ * place (a link, unlike a rename, never replaces an existing file), so the waiting worker never
7
+ * reads half of it, and a second delivery to one worker fails.
8
+ */
9
+ /** Where a pool worker waits for its input: /tmp is its only writable filesystem. */
10
+ export declare const WARM_INPUT_DIR = "/tmp/wardby-input";
11
+ export declare const WARM_INPUT_FILE = "/tmp/wardby-input/input.json";
12
+ /** The worker's exit code when no input arrived within NATIVE_WORKER_INPUT_WAIT_MS. */
13
+ export declare const WARM_WORKER_UNCLAIMED_EXIT = 75;
14
+ /** The delivery command's exit code when the worker already has an input. */
15
+ export declare const WARM_DELIVERY_ALREADY_DELIVERED = 2;
16
+ export declare function warmDeliveryCommand(file?: string): string[];
@@ -0,0 +1,33 @@
1
+ /**
2
+ * How a claimed warm worker gets its input (native sandbox phase 6): the launcher runs this fixed
3
+ * command inside the worker's container (`docker exec -i`, or the Kubernetes exec API) with the
4
+ * WorkerInput on stdin. The capability is never in the command, so it stays out of argv, the
5
+ * environment, and Kubernetes audit logs. The file is written under a temporary name and hard-linked into
6
+ * place (a link, unlike a rename, never replaces an existing file), so the waiting worker never
7
+ * reads half of it, and a second delivery to one worker fails.
8
+ */
9
+ /** Where a pool worker waits for its input: /tmp is its only writable filesystem. */
10
+ export const WARM_INPUT_DIR = "/tmp/wardby-input";
11
+ export const WARM_INPUT_FILE = `${WARM_INPUT_DIR}/input.json`;
12
+ /** The worker's exit code when no input arrived within NATIVE_WORKER_INPUT_WAIT_MS. */
13
+ export const WARM_WORKER_UNCLAIMED_EXIT = 75;
14
+ /** The delivery command's exit code when the worker already has an input. */
15
+ export const WARM_DELIVERY_ALREADY_DELIVERED = 2;
16
+ export function warmDeliveryCommand(file = WARM_INPUT_FILE) {
17
+ const script = [
18
+ 'const fs = require("node:fs");',
19
+ 'const path = require("node:path");',
20
+ `const file = ${JSON.stringify(file)};`,
21
+ `if (fs.existsSync(file)) process.exit(${WARM_DELIVERY_ALREADY_DELIVERED});`,
22
+ "fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });",
23
+ "const chunks = [];",
24
+ "process.stdin.on('data', (c) => chunks.push(c));",
25
+ "process.stdin.on('end', () => {",
26
+ " const tmp = `${file}.partial`;",
27
+ " fs.writeFileSync(tmp, Buffer.concat(chunks), { flag: 'wx', mode: 0o400 });",
28
+ ` try { fs.linkSync(tmp, file); } catch { fs.unlinkSync(tmp); process.exit(${WARM_DELIVERY_ALREADY_DELIVERED}); }`,
29
+ " fs.unlinkSync(tmp);",
30
+ "});",
31
+ ].join("\n");
32
+ return ["node", "-e", script];
33
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The warm pool's rows (native sandbox phase 6, docs/native-sandbox.md): one per pool worker,
3
+ * inserted before the worker is created. A run claims an idle worker with one conditional update
4
+ * (`FOR UPDATE SKIP LOCKED`), so two claims — from any replica or process — never take the same
5
+ * worker, and a run never holds two (`runId` is unique).
6
+ */
7
+ import type { NativeWarmWorker, PrismaClient } from "#prisma";
8
+ export type WarmPoolDb = Pick<PrismaClient, "$transaction" | "$queryRaw" | "nativeWarmWorker">;
9
+ export type WarmWorkerRow = NativeWarmWorker;
10
+ export declare class PrismaWarmPoolLedger {
11
+ private readonly db;
12
+ constructor(db: WarmPoolDb);
13
+ /**
14
+ * Inserts `warming` rows for the pool's deficit (size minus its warming and idle workers of this
15
+ * spec) and returns them. Serialized per spec, so concurrent callers never overshoot the size.
16
+ */
17
+ reserve(specHash: string, size: number, newToken: () => string, nameFor: (token: string) => string): Promise<{
18
+ id: string;
19
+ name: string;
20
+ }[]>;
21
+ /** A warming worker's isolation is proven: it becomes claimable. False when it was retired meanwhile. */
22
+ markIdle(id: string): Promise<boolean>;
23
+ /** Takes one idle worker of this spec, born after `bornAfter`, for the run; null when there is none. */
24
+ claim(runId: string, specHash: string, bornAfter: Date): Promise<{
25
+ id: string;
26
+ name: string;
27
+ } | null>;
28
+ forRun(runId: string): Promise<WarmWorkerRow | null>;
29
+ /** Takes an idle worker out of the pool for removal; false when it was claimed (or is gone). */
30
+ retire(id: string): Promise<boolean>;
31
+ remove(id: string): Promise<void>;
32
+ count(): Promise<number>;
33
+ /** Every pool row, with its run's status (the maintenance tick's view; the pool is small). */
34
+ workers(): Promise<(WarmWorkerRow & {
35
+ run: {
36
+ status: string;
37
+ } | null;
38
+ })[]>;
39
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The warm pool's rows (native sandbox phase 6, docs/native-sandbox.md): one per pool worker,
3
+ * inserted before the worker is created. A run claims an idle worker with one conditional update
4
+ * (`FOR UPDATE SKIP LOCKED`), so two claims — from any replica or process — never take the same
5
+ * worker, and a run never holds two (`runId` is unique).
6
+ */
7
+ export class PrismaWarmPoolLedger {
8
+ db;
9
+ constructor(db) {
10
+ this.db = db;
11
+ }
12
+ /**
13
+ * Inserts `warming` rows for the pool's deficit (size minus its warming and idle workers of this
14
+ * spec) and returns them. Serialized per spec, so concurrent callers never overshoot the size.
15
+ */
16
+ async reserve(specHash, size, newToken, nameFor) {
17
+ return this.db.$transaction(async (tx) => {
18
+ await tx.$queryRaw `SELECT pg_advisory_xact_lock(hashtext(${`wardby-native-warm-pool:${specHash}`}))::text`;
19
+ const have = await tx.nativeWarmWorker.count({ where: { specHash, status: { in: ["warming", "idle"] } } });
20
+ const rows = Array.from({ length: Math.max(0, size - have) }, () => {
21
+ const id = newToken();
22
+ return { id, name: nameFor(id), specHash };
23
+ });
24
+ if (rows.length > 0)
25
+ await tx.nativeWarmWorker.createMany({ data: rows });
26
+ return rows.map(({ id, name }) => ({ id, name }));
27
+ });
28
+ }
29
+ /** A warming worker's isolation is proven: it becomes claimable. False when it was retired meanwhile. */
30
+ async markIdle(id) {
31
+ const { count } = await this.db.nativeWarmWorker.updateMany({
32
+ where: { id, status: "warming" },
33
+ data: { status: "idle", readyAt: new Date() },
34
+ });
35
+ return count === 1;
36
+ }
37
+ /** Takes one idle worker of this spec, born after `bornAfter`, for the run; null when there is none. */
38
+ async claim(runId, specHash, bornAfter) {
39
+ const rows = await this.db.$queryRaw `
40
+ UPDATE "NativeWarmWorker"
41
+ SET "status" = 'claimed', "runId" = ${runId}, "claimedAt" = now(), "updatedAt" = now()
42
+ WHERE "id" = (
43
+ SELECT "id" FROM "NativeWarmWorker"
44
+ WHERE "status" = 'idle' AND "specHash" = ${specHash} AND "createdAt" > ${bornAfter}
45
+ ORDER BY "readyAt" ASC
46
+ LIMIT 1
47
+ FOR UPDATE SKIP LOCKED
48
+ )
49
+ RETURNING "id", "name"`;
50
+ return rows[0] ?? null;
51
+ }
52
+ forRun(runId) {
53
+ return this.db.nativeWarmWorker.findUnique({ where: { runId } });
54
+ }
55
+ /** Takes an idle worker out of the pool for removal; false when it was claimed (or is gone). */
56
+ async retire(id) {
57
+ const { count } = await this.db.nativeWarmWorker.updateMany({
58
+ where: { id, status: "idle" },
59
+ data: { status: "retiring" },
60
+ });
61
+ return count === 1;
62
+ }
63
+ async remove(id) {
64
+ await this.db.nativeWarmWorker.deleteMany({ where: { id } });
65
+ }
66
+ count() {
67
+ return this.db.nativeWarmWorker.count();
68
+ }
69
+ /** Every pool row, with its run's status (the maintenance tick's view; the pool is small). */
70
+ workers() {
71
+ return this.db.nativeWarmWorker.findMany({ include: { run: { select: { status: true } } } });
72
+ }
73
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * The native sandbox warm pool (phase 6, docs/native-sandbox.md): up to NATIVE_SANDBOX_WARM_POOL_SIZE
3
+ * idle workers, each already isolated (on Kubernetes: attested and probed from inside), holding no
4
+ * run data and no capability. A run claims one with a compare-and-swap on its row
5
+ * (warm-pool-ledger.ts), its input arrives by exec only after the claim, and the worker is
6
+ * destroyed after that one run like any other. With no idle worker, or any doubt about the one it
7
+ * claimed, a run cold-launches exactly as without a pool.
8
+ *
9
+ * Maintenance runs in the process that calls the executor's `launch()`: every tick it reaps rows
10
+ * whose runs have ended, retires idle workers that are too old, of another spec, gone, or over the
11
+ * size (only ever unclaimed ones), and replenishes the deficit. Claims work from any process.
12
+ */
13
+ import type { NativeWorkerState } from "./docker-launcher.js";
14
+ import type { WorkerHandle } from "./launch.js";
15
+ import type { WorkerInput } from "./protocol.js";
16
+ import type { ManagedWorkerLauncher } from "./sandbox-executor.js";
17
+ import type { PrismaWarmPoolLedger } from "./warm-pool-ledger.js";
18
+ export declare const NATIVE_SANDBOX_WARM_DELIVERY_FAILED = "native_sandbox_warm_delivery_failed";
19
+ /** What a launcher does for pool workers. Every operation is keyed by the worker's random token. */
20
+ export interface WarmWorkerLauncher {
21
+ /** What its pool workers are built from (with the worker's wait): a claim takes only a matching one. */
22
+ warmSpecHash(waitMs: number): string;
23
+ /**
24
+ * Creates a pool worker and proves its isolation, resolving once it is claimable. On failure it
25
+ * removes what it created and throws.
26
+ */
27
+ startWarm(token: string, waitMs: number): Promise<void>;
28
+ /** The claimed worker still runs, as built: cheap reads, not a new isolation probe. */
29
+ reattestWarm(token: string, waitMs: number): Promise<boolean>;
30
+ /** Writes the run's input into the worker over exec stdin (warm-delivery.ts). */
31
+ deliver(token: string, input: WorkerInput): Promise<void>;
32
+ warmHandle(token: string): WorkerHandle;
33
+ inspectWarm(token: string): Promise<NativeWorkerState>;
34
+ killWarm(token: string): Promise<void>;
35
+ /** Removes the worker and everything made for it. Idempotent. */
36
+ removeWarm(token: string): Promise<void>;
37
+ /** The tokens of every pool worker this launcher holds, rows or not. */
38
+ listWarm(): Promise<string[]>;
39
+ }
40
+ export interface WarmPoolOptions {
41
+ ledger: PrismaWarmPoolLedger;
42
+ /** The cold launcher, which also runs pool workers. */
43
+ launcher: ManagedWorkerLauncher & WarmWorkerLauncher;
44
+ /** NATIVE_SANDBOX_WARM_POOL_SIZE. 0 still cleans up a pool left from an earlier configuration, once. */
45
+ size: number;
46
+ /** NATIVE_SANDBOX_WARM_MAX_AGE_MS. */
47
+ maxAgeMs: number;
48
+ /** How long starting and proving a pool worker may take; a `warming` row older than this was abandoned. */
49
+ warmTimeoutMs: number;
50
+ /** Marks a run's session ready once its input is delivered (when sessions start not ready: Kubernetes). */
51
+ onDelivered?: (runId: string) => Promise<void>;
52
+ intervalMs?: number;
53
+ now?: () => number;
54
+ sleep?: (ms: number) => Promise<void>;
55
+ newToken?: () => string;
56
+ }
57
+ /** A ManagedWorkerLauncher that hands a run a warm worker when it can, and cold-launches otherwise. */
58
+ export declare class PooledWorkerLauncher implements ManagedWorkerLauncher {
59
+ private readonly options;
60
+ readonly networkReadyAtLaunch: boolean | undefined;
61
+ readonly waitMs: number;
62
+ readonly specHash: string;
63
+ private timer;
64
+ private ticking;
65
+ /** The one pass queued behind a running one: a tick asked for mid-pass sees state from after the ask. */
66
+ private queued;
67
+ private readonly warming;
68
+ /** Tokens this process is still starting: never reaped as abandoned, however slow. */
69
+ private readonly warmingHere;
70
+ /** The first pass (orphan sweep included) has run. */
71
+ private swept;
72
+ constructor(options: WarmPoolOptions);
73
+ private get cold();
74
+ private now;
75
+ private sleep;
76
+ launch(input: WorkerInput): Promise<WorkerHandle>;
77
+ private confirmGone;
78
+ /** Removes a pool worker and its row. */
79
+ private discard;
80
+ private claimedToken;
81
+ handle(runId: string): WorkerHandle;
82
+ inspect(runId: string): Promise<NativeWorkerState>;
83
+ kill(runId: string): Promise<void>;
84
+ remove(runId: string): Promise<void>;
85
+ listWorkers(): Promise<{
86
+ name: string;
87
+ runHash: string;
88
+ }[]>;
89
+ removeByWorkerName(name: string): Promise<void>;
90
+ get resolveGatewayUrl(): (() => Promise<string>) | undefined;
91
+ /**
92
+ * Starts maintenance: one pass now, then one every interval. At size 0 a pass is a single count
93
+ * of pool rows until one appears: a replica still running a bigger size during a rolling update
94
+ * can refill the pool after this replica's first pass, and only a later pass retires those.
95
+ */
96
+ start(): Promise<void>;
97
+ stop(): void;
98
+ /** Asks for a pass soon, only in the process running maintenance: a short-lived CLI never warms workers. */
99
+ private nudge;
100
+ /** One maintenance pass; resolves once reaping and retiring are done (warming continues behind it). */
101
+ tick(): Promise<void>;
102
+ /** Resolves once every worker this process is warming has settled (tests, shutdown). */
103
+ settled(): Promise<void>;
104
+ private maintain;
105
+ private retire;
106
+ private replenish;
107
+ }