@wardby/cli 0.5.3 → 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 (370) 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/profile.d.ts +12 -0
  17. package/dist/coding/profile.js +6 -0
  18. package/dist/coding/protocol.d.ts +104 -0
  19. package/dist/coding/protocol.js +87 -3
  20. package/dist/coding-worker/artifact.d.ts +8 -0
  21. package/dist/coding-worker/artifact.js +2 -2
  22. package/dist/coding-worker/driver.js +2 -0
  23. package/dist/coding-worker/sdk.d.ts +6 -0
  24. package/dist/coding-worker/sdk.js +1 -0
  25. package/dist/coding-worker/skills.d.ts +23 -0
  26. package/dist/coding-worker/skills.js +117 -0
  27. package/dist/coding-worker/types.d.ts +2 -0
  28. package/dist/config/github-allowed-accounts.d.ts +15 -0
  29. package/dist/config/github-allowed-accounts.js +36 -0
  30. package/dist/config/low-power.d.ts +12 -0
  31. package/dist/config/low-power.js +18 -0
  32. package/dist/config/mobile.d.ts +12 -0
  33. package/dist/config/mobile.js +18 -0
  34. package/dist/config/providers.d.ts +53 -0
  35. package/dist/config/providers.js +92 -6
  36. package/dist/core/db.d.ts +16 -6
  37. package/dist/core/db.js +12 -10
  38. package/dist/core/dispatch.d.ts +11 -0
  39. package/dist/core/dispatch.js +36 -1
  40. package/dist/core/engine-native.js +9 -5
  41. package/dist/core/host-events.d.ts +49 -3
  42. package/dist/core/host-events.js +289 -15
  43. package/dist/core/issue-bridge.js +42 -2
  44. package/dist/core/issue-events.js +12 -1
  45. package/dist/core/issue-status.js +14 -3
  46. package/dist/core/merge-order-check.d.ts +129 -0
  47. package/dist/core/merge-order-check.js +336 -0
  48. package/dist/core/notification-dispatcher.d.ts +70 -0
  49. package/dist/core/notification-dispatcher.js +368 -0
  50. package/dist/core/notification-templates.d.ts +25 -0
  51. package/dist/core/notification-templates.js +105 -0
  52. package/dist/core/notifications.d.ts +10 -0
  53. package/dist/core/notifications.js +38 -0
  54. package/dist/core/pg-auth.d.ts +22 -0
  55. package/dist/core/pg-auth.js +152 -0
  56. package/dist/core/power-composition.d.ts +16 -0
  57. package/dist/core/power-composition.js +37 -0
  58. package/dist/core/power-idle.d.ts +14 -0
  59. package/dist/core/power-idle.js +30 -0
  60. package/dist/core/power.d.ts +71 -0
  61. package/dist/core/power.js +202 -0
  62. package/dist/core/reconciler.d.ts +4 -2
  63. package/dist/core/reconciler.js +29 -5
  64. package/dist/core/related-pull-requests.d.ts +48 -4
  65. package/dist/core/related-pull-requests.js +113 -11
  66. package/dist/core/repo-access.d.ts +15 -0
  67. package/dist/core/repo-access.js +66 -0
  68. package/dist/core/review-fix.d.ts +37 -0
  69. package/dist/core/review-fix.js +207 -6
  70. package/dist/core/review-host-tools.d.ts +20 -0
  71. package/dist/core/review-host-tools.js +58 -2
  72. package/dist/core/runner.d.ts +336 -3
  73. package/dist/core/runner.js +894 -317
  74. package/dist/core/secret-broker-config.d.ts +103 -0
  75. package/dist/core/secret-broker-config.js +112 -0
  76. package/dist/core/secrets.d.ts +39 -4
  77. package/dist/core/secrets.js +148 -40
  78. package/dist/core/workflow-event-recorder.d.ts +14 -0
  79. package/dist/core/workflow-event-recorder.js +120 -0
  80. package/dist/core/workflow-events.d.ts +82 -0
  81. package/dist/core/workflow-events.js +44 -0
  82. package/dist/core/workflow-run-events.d.ts +16 -0
  83. package/dist/core/workflow-run-events.js +40 -0
  84. package/dist/generated/prisma/browser.d.ts +58 -0
  85. package/dist/generated/prisma/client.d.ts +58 -0
  86. package/dist/generated/prisma/commonInputTypes.d.ts +150 -0
  87. package/dist/generated/prisma/enums.d.ts +27 -0
  88. package/dist/generated/prisma/enums.js +23 -0
  89. package/dist/generated/prisma/internal/class.d.ts +88 -0
  90. package/dist/generated/prisma/internal/class.js +4 -4
  91. package/dist/generated/prisma/internal/prismaNamespace.d.ts +772 -1
  92. package/dist/generated/prisma/internal/prismaNamespace.js +135 -4
  93. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +139 -0
  94. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +135 -4
  95. package/dist/generated/prisma/models/Agent.d.ts +360 -1
  96. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +73 -1
  97. package/dist/generated/prisma/models/CodingRun.d.ts +205 -1
  98. package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
  99. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1675 -0
  100. package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
  101. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1517 -0
  102. package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
  103. package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
  104. package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
  105. package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
  106. package/dist/generated/prisma/models/NotificationChannel.js +1 -0
  107. package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
  108. package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
  109. package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
  110. package/dist/generated/prisma/models/NotificationThread.js +1 -0
  111. package/dist/generated/prisma/models/Run.d.ts +826 -1
  112. package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
  113. package/dist/generated/prisma/models/Secret.d.ts +37 -1
  114. package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
  115. package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
  116. package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
  117. package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
  118. package/dist/generated/prisma/models.d.ts +8 -0
  119. package/dist/help/build.js +4 -2
  120. package/dist/help/catalog.d.ts +1 -1
  121. package/dist/help/catalog.js +31 -6
  122. package/dist/help-index.json +1363 -176
  123. package/dist/import/create.js +17 -0
  124. package/dist/import/neutral-schema.d.ts +6 -2
  125. package/dist/import/neutral-schema.js +2 -0
  126. package/dist/mcp/auth/access.d.ts +1 -0
  127. package/dist/mcp/auth/repo-authorization.js +14 -0
  128. package/dist/mcp/auth/resource-server.d.ts +2 -1
  129. package/dist/mcp/auth/resource-server.js +7 -2
  130. package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
  131. package/dist/mcp/auth/self-hosted/browser.js +19 -6
  132. package/dist/mcp/context.d.ts +6 -0
  133. package/dist/mcp/host-events/github-ingress.d.ts +23 -1
  134. package/dist/mcp/host-events/github-ingress.js +68 -0
  135. package/dist/mcp/index.d.ts +13 -0
  136. package/dist/mcp/index.js +59 -10
  137. package/dist/mcp/tools/agents.js +82 -11
  138. package/dist/mcp/tools/notification-channels.d.ts +2 -0
  139. package/dist/mcp/tools/notification-channels.js +293 -0
  140. package/dist/mcp/tools/power.d.ts +2 -0
  141. package/dist/mcp/tools/power.js +77 -0
  142. package/dist/mcp/tools/runs.d.ts +0 -6
  143. package/dist/mcp/tools/runs.js +7 -2
  144. package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
  145. package/dist/mcp/tools/secret-broker-compat.js +23 -0
  146. package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
  147. package/dist/mcp/tools/secret-elicitation-form.js +200 -10
  148. package/dist/mcp/tools/secret-elicitation-server.js +8 -1
  149. package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
  150. package/dist/mcp/tools/secret-elicitation.js +110 -12
  151. package/dist/mcp/tools/secrets.js +184 -7
  152. package/dist/mcp/tools/tools.d.ts +1 -1
  153. package/dist/mcp/tools/tools.js +22 -2
  154. package/dist/native-worker/composition.d.ts +23 -0
  155. package/dist/native-worker/composition.js +77 -0
  156. package/dist/native-worker/docker-isolation.d.ts +65 -0
  157. package/dist/native-worker/docker-isolation.js +183 -0
  158. package/dist/native-worker/docker-launcher.d.ts +74 -0
  159. package/dist/native-worker/docker-launcher.js +237 -0
  160. package/dist/native-worker/gateway-server.d.ts +39 -0
  161. package/dist/native-worker/gateway-server.js +315 -0
  162. package/dist/native-worker/gateway.d.ts +44 -0
  163. package/dist/native-worker/gateway.js +197 -0
  164. package/dist/native-worker/http-server.d.ts +22 -0
  165. package/dist/native-worker/http-server.js +109 -0
  166. package/dist/native-worker/http-transport.d.ts +17 -0
  167. package/dist/native-worker/http-transport.js +88 -0
  168. package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
  169. package/dist/native-worker/kubernetes-isolation.js +218 -0
  170. package/dist/native-worker/kubernetes-launcher.d.ts +102 -0
  171. package/dist/native-worker/kubernetes-launcher.js +335 -0
  172. package/dist/native-worker/launch.d.ts +45 -0
  173. package/dist/native-worker/launch.js +44 -0
  174. package/dist/native-worker/ledger.d.ts +109 -0
  175. package/dist/native-worker/ledger.js +192 -0
  176. package/dist/native-worker/loopback.d.ts +12 -0
  177. package/dist/native-worker/loopback.js +49 -0
  178. package/dist/native-worker/main.d.ts +7 -0
  179. package/dist/native-worker/main.js +74 -0
  180. package/dist/native-worker/protocol.d.ts +744 -0
  181. package/dist/native-worker/protocol.js +200 -0
  182. package/dist/native-worker/sandbox-executor.d.ts +68 -0
  183. package/dist/native-worker/sandbox-executor.js +210 -0
  184. package/dist/native-worker/stdio.d.ts +29 -0
  185. package/dist/native-worker/stdio.js +188 -0
  186. package/dist/native-worker/warm-delivery.d.ts +16 -0
  187. package/dist/native-worker/warm-delivery.js +33 -0
  188. package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
  189. package/dist/native-worker/warm-pool-ledger.js +73 -0
  190. package/dist/native-worker/warm-pool.d.ts +107 -0
  191. package/dist/native-worker/warm-pool.js +283 -0
  192. package/dist/native-worker/worker.d.ts +17 -0
  193. package/dist/native-worker/worker.js +115 -0
  194. package/dist/providers/auth/authorization-server.d.ts +3 -0
  195. package/dist/providers/auth/index.js +2 -0
  196. package/dist/providers/auth/self-hosted.d.ts +13 -1
  197. package/dist/providers/auth/self-hosted.js +54 -4
  198. package/dist/providers/chat/fake.d.ts +46 -0
  199. package/dist/providers/chat/fake.js +39 -0
  200. package/dist/providers/chat/index.d.ts +4 -0
  201. package/dist/providers/chat/index.js +8 -0
  202. package/dist/providers/chat/slack.d.ts +37 -0
  203. package/dist/providers/chat/slack.js +105 -0
  204. package/dist/providers/chat/types.d.ts +42 -0
  205. package/dist/providers/chat/types.js +19 -0
  206. package/dist/providers/engine/types.d.ts +19 -0
  207. package/dist/providers/engine/types.js +22 -0
  208. package/dist/providers/executor/composition.d.ts +24 -1
  209. package/dist/providers/executor/composition.js +39 -6
  210. package/dist/providers/executor/container.d.ts +24 -1
  211. package/dist/providers/executor/container.js +101 -11
  212. package/dist/providers/executor/dbos.d.ts +42 -0
  213. package/dist/providers/executor/dbos.js +118 -12
  214. package/dist/providers/executor/deferred.d.ts +56 -0
  215. package/dist/providers/executor/deferred.js +119 -0
  216. package/dist/providers/executor/routing.d.ts +37 -10
  217. package/dist/providers/executor/routing.js +73 -32
  218. package/dist/providers/executor/types.d.ts +12 -0
  219. package/dist/providers/jobs/docker.js +3 -3
  220. package/dist/providers/jobs/fake-kubernetes-api.d.ts +21 -2
  221. package/dist/providers/jobs/fake-kubernetes-api.js +42 -1
  222. package/dist/providers/jobs/kubernetes-api.d.ts +17 -1
  223. package/dist/providers/jobs/kubernetes-api.js +7 -0
  224. package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
  225. package/dist/providers/jobs/kubernetes-client.js +52 -3
  226. package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
  227. package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
  228. package/dist/providers/jobs/kubernetes-isolation.d.ts +3 -1
  229. package/dist/providers/jobs/kubernetes-isolation.js +6 -0
  230. package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
  231. package/dist/providers/jobs/kubernetes-platform.js +38 -1
  232. package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
  233. package/dist/providers/jobs/kubernetes-preflight.js +4 -2
  234. package/dist/providers/jobs/kubernetes.d.ts +36 -1
  235. package/dist/providers/jobs/kubernetes.js +74 -4
  236. package/dist/providers/jobs/metadata-probes.d.ts +11 -0
  237. package/dist/providers/jobs/metadata-probes.js +13 -0
  238. package/dist/providers/jobs/types.d.ts +9 -0
  239. package/dist/providers/review-host/github.d.ts +11 -1
  240. package/dist/providers/review-host/github.js +50 -0
  241. package/dist/providers/review-host/types.d.ts +23 -0
  242. package/dist/providers/vcs/github.d.ts +32 -6
  243. package/dist/providers/vcs/github.js +74 -16
  244. package/dist/quickstart/coding-seed.d.ts +10 -3
  245. package/dist/quickstart/coding-seed.js +74 -3
  246. package/dist/quickstart/images.d.ts +2 -0
  247. package/dist/quickstart/images.js +7 -1
  248. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  249. package/dist/quickstart/reviewer-prompt.js +1 -1
  250. package/dist/quickstart-images.json +1 -1
  251. package/dist/sandbox/brokered-fetch.d.ts +23 -0
  252. package/dist/sandbox/brokered-fetch.js +37 -0
  253. package/dist/sandbox/host-functions.d.ts +34 -0
  254. package/dist/sandbox/host-functions.js +144 -80
  255. package/dist/sandbox/prelude.js +7 -1
  256. package/dist/sandbox/run-in-sandbox.d.ts +19 -0
  257. package/dist/sandbox/run-in-sandbox.js +28 -10
  258. package/dist/sandbox/safe-fetch.d.ts +2 -0
  259. package/dist/sandbox/safe-fetch.js +3 -1
  260. package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
  261. package/dist/sandbox/secret-broker-sigv4.js +49 -0
  262. package/dist/sandbox/secret-broker.d.ts +34 -0
  263. package/dist/sandbox/secret-broker.js +162 -0
  264. package/dist/sandbox/user-tool.d.ts +14 -0
  265. package/dist/sandbox/user-tool.js +32 -0
  266. package/dist/serve.js +18 -0
  267. package/dist/viewer/api-schema.d.ts +210 -14
  268. package/dist/viewer/api-schema.js +22 -0
  269. package/dist/viewer/build-schemas.js +4 -1
  270. package/dist/viewer/event-bus.d.ts +6 -0
  271. package/dist/viewer/event-bus.js +16 -7
  272. package/dist/viewer/graph.d.ts +5 -2
  273. package/dist/viewer/graph.js +7 -2
  274. package/dist/viewer/http.d.ts +0 -1
  275. package/dist/viewer/http.js +2 -2
  276. package/dist/viewer/infra.js +25 -2
  277. package/dist/viewer/limits.d.ts +4 -0
  278. package/dist/viewer/limits.js +4 -0
  279. package/dist/viewer/openapi.d.ts +15 -0
  280. package/dist/viewer/openapi.js +172 -0
  281. package/docs/README.md +7 -0
  282. package/docs/agent-recipes.md +57 -8
  283. package/docs/architecture-runtime.md +16 -1
  284. package/docs/code-review-agents.md +139 -5
  285. package/docs/coding-agent-setup.md +113 -5
  286. package/docs/coding-packages.md +4 -2
  287. package/docs/coding-services.md +3 -1
  288. package/docs/coding-worker-byo-images.md +198 -6
  289. package/docs/coding-worker-isolation.md +68 -14
  290. package/docs/getting-started-gke.md +225 -9
  291. package/docs/getting-started-identity-provider.md +21 -10
  292. package/docs/getting-started.md +5 -4
  293. package/docs/jira-agents.md +5 -1
  294. package/docs/native-sandbox.md +635 -0
  295. package/docs/release-verification.md +9 -0
  296. package/docs/security-deployment.md +113 -12
  297. package/docs/slack-notifications.md +252 -0
  298. package/docs/tool-secrets.md +252 -0
  299. package/docs/viewer-api.md +46 -5
  300. package/docs/viewer-api.openapi.yml +1404 -0
  301. package/help/admin-viewer.md +6 -2
  302. package/help/agent-recipes.md +27 -0
  303. package/help/architecture-agent.md +1 -1
  304. package/help/brokered-secrets.md +79 -0
  305. package/help/build-claude-code-image.md +131 -0
  306. package/help/build-worker-image.md +3 -6
  307. package/help/code-review-agents.md +68 -6
  308. package/help/deploy-gke.md +8 -1
  309. package/help/deployment-targets.md +25 -14
  310. package/help/errors/coding-provider-not-configured.md +2 -2
  311. package/help/errors/database-auth-invalid.md +28 -0
  312. package/help/errors/github-account-not-allowed.md +25 -0
  313. package/help/errors/low-power-disabled.md +29 -0
  314. package/help/errors/low-power-scale-forbidden.md +35 -0
  315. package/help/errors/low-power-wake-timeout.md +30 -0
  316. package/help/errors/mobile-disabled.md +31 -0
  317. package/help/errors/native-sandbox-capacity.md +22 -0
  318. package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
  319. package/help/errors/native-sandbox-docker-failed.md +20 -0
  320. package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
  321. package/help/errors/native-sandbox-image-not-pinned.md +19 -0
  322. package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
  323. package/help/errors/native-sandbox-network-unenforced.md +22 -0
  324. package/help/errors/native-sandbox-requires-catalog.md +31 -0
  325. package/help/errors/native-sandbox-unavailable.md +19 -0
  326. package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
  327. package/help/errors/native-sandbox-worker-exited.md +20 -0
  328. package/help/errors/native-sandbox-worker-lost.md +20 -0
  329. package/help/errors/native-sandbox-worker-unready.md +22 -0
  330. package/help/errors/secret-broker-body-invalid.md +26 -0
  331. package/help/errors/secret-broker-changed.md +20 -0
  332. package/help/errors/secret-broker-config-invalid.md +30 -0
  333. package/help/errors/secret-broker-conflict.md +27 -0
  334. package/help/errors/secret-broker-destination-denied.md +28 -0
  335. package/help/errors/secret-broker-value-invalid.md +28 -0
  336. package/help/errors/secret-brokered.md +24 -0
  337. package/help/errors/secret-not-brokered.md +25 -0
  338. package/help/errors/slack-auth-failed.md +48 -0
  339. package/help/errors/slack-channel-unreachable.md +39 -0
  340. package/help/errors/slack-not-configured.md +33 -0
  341. package/help/getting-started.md +4 -5
  342. package/help/github.md +18 -1
  343. package/help/identity-and-access.md +5 -1
  344. package/help/local-repositories.md +2 -3
  345. package/help/low-power-mode.md +125 -0
  346. package/help/merge-order-check.md +117 -0
  347. package/help/mobile-app.md +54 -0
  348. package/help/native-sandbox.md +136 -0
  349. package/help/observability.md +8 -0
  350. package/help/related-pull-requests.md +70 -9
  351. package/help/repo-instructions-and-skills.md +91 -0
  352. package/help/review-fix-rounds.md +10 -0
  353. package/help/slack-notifications.md +62 -0
  354. package/help/troubleshooting/coding-workers.md +21 -0
  355. package/package.json +11 -4
  356. package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
  357. package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
  358. package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
  359. package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
  360. package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
  361. package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
  362. package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
  363. package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
  364. package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
  365. package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
  366. package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
  367. package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
  368. package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
  369. package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
  370. package/prisma/schema.prisma +362 -91
package/dist/cli.js CHANGED
@@ -2,12 +2,14 @@
2
2
  /**
3
3
  * Minimal CLI.
4
4
  *
5
- * wardby agent create --name <n> --model <m> --prompt <p> --budget <usd> [--schedule "<cron>"] [--timezone <tz>] [--memory-enabled] [--effort <level>]
5
+ * wardby agent create --name <n> --model <m> --prompt <p> --budget <usd> [--schedule "<cron>"] [--timezone <tz>] [--memory-enabled] [--effort <level>] [--native-execution-mode control-plane|sandbox]
6
6
  * wardby agent list
7
+ * wardby agent mode <name> control-plane|sandbox
7
8
  * wardby agent schedule <name> --cron "<expr>" [--timezone <tz>] [--disable]
8
9
  * wardby run <name>
9
10
  * wardby runs [--agent <name>] [--limit N] [--status <s>]
10
11
  * wardby scheduler [--scope default]
12
+ * wardby native-gateway (the native sandbox gateway only; NATIVE_GATEWAY_LISTEN)
11
13
  * wardby mcp (MCP_TRANSPORT=stdio|http selects the transport; authoring/
12
14
  * control is MCP-first from here — this floor keeps working
13
15
  * before/without an MCP client)
@@ -28,6 +30,11 @@ import { describePreflightFailure, kubernetesPreflight, preflightCanaryImage, }
28
30
  import { RoutingLlmProvider, isLlmEffort, modelSupportedEfforts, resolveLlmRegistrations, } from "./providers/llm/index.js";
29
31
  import { startModelCatalog } from "./providers/llm/catalog-store.js";
30
32
  import { buildConfiguredExecutor, buildExecutor } from "./providers/executor/index.js";
33
+ import { DeferredExecutor, drainDeferredRuns } from "./providers/executor/deferred.js";
34
+ import { parseGatewayListen, startGatewayServer } from "./native-worker/http-server.js";
35
+ import { NATIVE_GATEWAY_DENY_PORT } from "./native-worker/docker-isolation.js";
36
+ import { startDenyPortListener } from "./providers/coding-proxy/deny-port.js";
37
+ import { buildNativeSandboxExecutor } from "./native-worker/composition.js";
31
38
  import { PostgresDatastore } from "./providers/datastore/index.js";
32
39
  import { PostgresAgentMemory } from "./providers/memory/index.js";
33
40
  import { buildSecretCipher } from "./providers/secrets/index.js";
@@ -35,19 +42,22 @@ import { prisma } from "./core/db.js";
35
42
  import { runAgent } from "./core/runner.js";
36
43
  import { cancelRunOnSignal } from "./core/run-heartbeat.js";
37
44
  import { buildIssueTrackers } from "./providers/issue-tracker/index.js";
45
+ import { buildChatProviders } from "./providers/chat/index.js";
38
46
  import { buildReviewHosts } from "./providers/review-host/index.js";
39
47
  import { createRepoAccessGate } from "./core/repo-access.js";
40
48
  import { validateCronExpression } from "./core/cron.js";
41
49
  import { assertAgentModelAvailable } from "./core/run-pricing.js";
42
50
  import { startScheduler } from "./core/scheduler.js";
43
51
  import { startReconciler } from "./core/reconciler.js";
52
+ import { startNotifications } from "./core/notifications.js";
44
53
  import { NativeEngine } from "./core/engine-native.js";
45
54
  import { logger } from "./core/logger.js";
55
+ import { buildPower } from "./core/power-composition.js";
46
56
  import { deriveJsonSchema } from "./sandbox/zod-params.js";
47
57
  import { findSameNamedAttachedTool, reservedToolNameReason, resolveToolRef } from "./core/tool-names.js";
48
58
  import { ToolAttachedError, deleteToolGuarded, formatAttachedAgents, formatToolLine, hasToolChanges, prepareToolUpdate, updateToolGuarded, } from "./core/tool-admin.js";
49
59
  import { ToolCapabilitiesPatchSchema } from "./sandbox/tool-capabilities.js";
50
- import { startMcp } from "./mcp/index.js";
60
+ import { startMcp, warmUpExecutor } from "./mcp/index.js";
51
61
  import { startServe } from "./serve.js";
52
62
  import { authCommand } from "./mcp/auth/self-hosted/cli.js";
53
63
  import { hostAccountCommand } from "./mcp/auth/host-account-cli.js";
@@ -56,6 +66,7 @@ import { everyoneGrantData } from "./core/grants.js";
56
66
  import { parseImportArgs } from "./import/cli-args.js";
57
67
  import { runImport } from "./import/index.js";
58
68
  import { CLI_USAGE } from "./cli-help.js";
69
+ import { parseCliNativeExecutionMode } from "./cli-native-mode.js";
59
70
  import { helpCommand } from "./help/cli.js";
60
71
  const cliLog = logger.child({ module: "cli" });
61
72
  const RUN_STATUSES = [
@@ -121,6 +132,7 @@ async function agentCreate(args) {
121
132
  effort: { type: "string" },
122
133
  owner: { type: "string" },
123
134
  public: { type: "boolean" },
135
+ "native-execution-mode": { type: "string" },
124
136
  },
125
137
  });
126
138
  if (!values.name || !values.model || !values.prompt || !values.budget) {
@@ -134,6 +146,15 @@ async function agentCreate(args) {
134
146
  if (!Number.isInteger(maxTurns) || maxTurns <= 0) {
135
147
  fail(`--max-turns must be a positive integer, got "${values["max-turns"]}".`);
136
148
  }
149
+ let nativeExecutionMode;
150
+ if (values["native-execution-mode"] !== undefined) {
151
+ try {
152
+ nativeExecutionMode = parseCliNativeExecutionMode(values["native-execution-mode"]);
153
+ }
154
+ catch (err) {
155
+ fail(err instanceof Error ? err.message : String(err));
156
+ }
157
+ }
137
158
  const timezone = values.timezone ?? "UTC";
138
159
  if (values.schedule) {
139
160
  try {
@@ -188,6 +209,7 @@ async function agentCreate(args) {
188
209
  maxTurns,
189
210
  memoryEnabled: values["memory-enabled"] ?? false,
190
211
  effort: values.effort ?? null,
212
+ ...(nativeExecutionMode ? { nativeExecutionMode } : {}),
191
213
  ownerId: ownerId,
192
214
  },
193
215
  });
@@ -506,6 +528,29 @@ async function agentSchedule(args) {
506
528
  });
507
529
  console.log(`schedule set for "${name}": "${schedule}" (${timezone}).`);
508
530
  }
531
+ /** Where a native agent's later runs execute; runs already created keep their mode. */
532
+ async function agentMode(args) {
533
+ const [name, value, ...extra] = args;
534
+ if (!name || !value || extra.length > 0) {
535
+ fail("agent mode requires an agent name and a mode: wardby agent mode <name> control-plane|sandbox");
536
+ }
537
+ let nativeExecutionMode;
538
+ try {
539
+ nativeExecutionMode = parseCliNativeExecutionMode(value);
540
+ }
541
+ catch (err) {
542
+ fail(err instanceof Error ? err.message : String(err));
543
+ }
544
+ const agent = await prisma.agent.findUnique({ where: { name } });
545
+ if (!agent) {
546
+ fail(`unknown agent "${name}".`);
547
+ }
548
+ if (agent.kind !== "native") {
549
+ fail(`"${name}" is a coding agent; the native execution mode only applies to native agents.`);
550
+ }
551
+ await prisma.agent.update({ where: { id: agent.id }, data: { nativeExecutionMode } });
552
+ console.log(`native execution mode for "${name}": ${value}.`);
553
+ }
509
554
  async function agentList() {
510
555
  const agents = await prisma.agent.findMany({ orderBy: { name: "asc" } });
511
556
  if (agents.length === 0) {
@@ -517,7 +562,8 @@ async function agentList() {
517
562
  ? `${agent.scheduleEnabled ? "enabled" : "disabled"}: ${agent.schedule} (${agent.timezone})`
518
563
  : "manual";
519
564
  console.log(`${agent.name} ${agent.kind.padEnd(6)} ${agent.model} ` +
520
- `$${Number(agent.budgetUsd).toFixed(4)} ${agent.maxTurns} turns memory ${agent.memoryEnabled ? "on" : "off"} ${schedule}`);
565
+ `$${Number(agent.budgetUsd).toFixed(4)} ${agent.maxTurns} turns memory ${agent.memoryEnabled ? "on" : "off"} ${schedule}` +
566
+ (agent.kind === "native" && agent.nativeExecutionMode === "sandbox" ? " sandbox" : ""));
521
567
  }
522
568
  }
523
569
  async function run(name) {
@@ -713,11 +759,42 @@ async function scheduler(args) {
713
759
  const memory = buildMemory();
714
760
  const reviewHosts = buildReviewHosts(process.env, prisma);
715
761
  const issueTrackers = buildIssueTrackers();
762
+ const chat = buildChatProviders();
716
763
  // One repository-access gate (and cache) for native repo_* calls and coding runs.
717
764
  const repoAccess = createRepoAccessGate({ db: prisma, hosts: reviewHosts });
718
- const nativeExecutor = buildExecutor(config, { llm, engine, datastore, secrets, memory, reviewHosts, issueTrackers, repoAccess }, prisma);
719
- const executor = buildConfiguredExecutor({ native: nativeExecutor, db: prisma, providerConfig: config, repoAccess });
765
+ // Patched with the composed executor below, as startMcp does: native runs read
766
+ // `providers.executor` at call time, so their delegate_to_* calls can dispatch coding and
767
+ // sandbox-mode sub-agents through the same RoutingExecutor.
768
+ const nativeProviders = {
769
+ llm,
770
+ engine,
771
+ datastore,
772
+ secrets,
773
+ memory,
774
+ reviewHosts,
775
+ issueTrackers,
776
+ repoAccess,
777
+ };
778
+ const nativeExecutor = buildExecutor(config, nativeProviders, prisma);
779
+ const power = buildPower({ env: process.env, db: prisma });
780
+ if (power.enabled) {
781
+ void power.checkAccess().then((missing) => {
782
+ if (missing.length)
783
+ cliLog.warn(`low_power_scale_forbidden: missing ${missing.join(", ")}`);
784
+ }, (err) => cliLog.warn({ err }, "low_power_access_check_failed"));
785
+ }
786
+ const executor = buildConfiguredExecutor({
787
+ native: nativeExecutor,
788
+ db: prisma,
789
+ providerConfig: config,
790
+ repoAccess,
791
+ power,
792
+ // Sandbox-mode native runs (docs/native-sandbox.md); undefined when NATIVE_SANDBOX_LAUNCHER is unset.
793
+ nativeSandbox: buildNativeSandboxExecutor({ db: prisma, providers: nativeProviders, power }),
794
+ });
795
+ nativeProviders.executor = executor;
720
796
  await executor.launch?.();
797
+ warmUpExecutor(executor);
721
798
  const reconciler = startReconciler({
722
799
  db: prisma,
723
800
  executor,
@@ -725,6 +802,7 @@ async function scheduler(args) {
725
802
  issueTrackers,
726
803
  deferredReviews: { db: prisma, executor, hosts: reviewHosts, repoAccess, issueTrackers },
727
804
  });
805
+ const notifications = await startNotifications({ db: prisma, chat });
728
806
  const selfDefects = { db: prisma, issueTrackers };
729
807
  const sched = startScheduler({
730
808
  executor,
@@ -733,6 +811,9 @@ async function scheduler(args) {
733
811
  selfDefects,
734
812
  onLeaderTick: async () => {
735
813
  await drainCodingQueue({ db: prisma, executor, ...concurrency, selfDefects });
814
+ // Runs the native sandbox gateway dispatched (or asked to stop): it holds no executor of its own.
815
+ await drainDeferredRuns({ db: prisma, executor });
816
+ await power.sleepIfIdle().catch((err) => cliLog.warn({ err }, "power_sleep_failed"));
736
817
  },
737
818
  });
738
819
  console.log(`wardby scheduler started (scope "${scope}"). Press Ctrl+C to stop.`);
@@ -741,6 +822,7 @@ async function scheduler(args) {
741
822
  console.log("\nwardby scheduler shutting down...");
742
823
  sched.stop();
743
824
  reconciler.stop();
825
+ notifications.stop();
744
826
  void Promise.resolve(executor.close?.())
745
827
  .catch((err) => cliLog.warn({ err }, "executor close failed during scheduler shutdown"))
746
828
  .finally(() => {
@@ -752,6 +834,54 @@ async function scheduler(args) {
752
834
  process.once("SIGTERM", shutdown);
753
835
  });
754
836
  }
837
+ /**
838
+ * The native sandbox gateway on its own (docs/native-sandbox.md): only the internal listener
839
+ * sandbox workers call, on NATIVE_GATEWAY_LISTEN (default 0.0.0.0:8790). It never starts or
840
+ * stops a run itself — workers can reach it, so it holds no Docker socket or cluster
841
+ * credential: a delegation it makes is started by the scheduler leader (DeferredExecutor).
842
+ * It needs the server's database and LLM/integration settings, nothing more.
843
+ */
844
+ async function nativeGateway() {
845
+ const listen = parseGatewayListen(process.env.NATIVE_GATEWAY_LISTEN) ?? { host: "0.0.0.0", port: 8790 };
846
+ let modelCatalog;
847
+ try {
848
+ modelCatalog = await startModelCatalog(prisma);
849
+ }
850
+ catch (err) {
851
+ fail(err instanceof Error ? err.message : String(err));
852
+ }
853
+ const secrets = buildSecrets();
854
+ const reviewHosts = buildReviewHosts(process.env, prisma);
855
+ const providers = {
856
+ llm: buildLlmProvider(),
857
+ engine: buildEngine(),
858
+ datastore: buildDatastore(secrets),
859
+ secrets,
860
+ memory: buildMemory(),
861
+ reviewHosts,
862
+ issueTrackers: buildIssueTrackers(),
863
+ repoAccess: createRepoAccessGate({ db: prisma, hosts: reviewHosts }),
864
+ // Coding resolution only (worker image, service declaration): never started or stopped here.
865
+ executor: new DeferredExecutor(prisma, buildConfiguredExecutor({ native: noopExecutor(), db: prisma })),
866
+ };
867
+ const server = await startGatewayServer(listen, { db: prisma, providers });
868
+ // The deny port (NATIVE_GATEWAY_DENY_PORT, default 8791) serves nothing: a worker that can reach the
869
+ // gateway port but not this one proves its NetworkPolicy is programmed and port-scoped.
870
+ const denyPort = Number(process.env.NATIVE_GATEWAY_DENY_PORT ?? NATIVE_GATEWAY_DENY_PORT);
871
+ const deny = await startDenyPortListener(listen.host, denyPort);
872
+ console.error(`wardby native-gateway listening on ${listen.host}:${listen.port}. Press Ctrl+C to stop.`);
873
+ await new Promise((resolve) => {
874
+ const shutdown = () => {
875
+ server.close(() => {
876
+ modelCatalog.close();
877
+ void deny.close().finally(resolve);
878
+ });
879
+ server.closeIdleConnections();
880
+ };
881
+ process.once("SIGINT", shutdown);
882
+ process.once("SIGTERM", shutdown);
883
+ });
884
+ }
755
885
  async function mcp() {
756
886
  const handle = await startMcp();
757
887
  // startMcp() resolves once the transport is up (bound/listening), not
@@ -843,6 +973,9 @@ async function main() {
843
973
  else if (command === "agent" && rest[0] === "schedule") {
844
974
  await agentSchedule(rest.slice(1));
845
975
  }
976
+ else if (command === "agent" && rest[0] === "mode") {
977
+ await agentMode(rest.slice(1));
978
+ }
846
979
  else if (command === "tool" && rest[0] === "create") {
847
980
  await toolCreate(rest.slice(1));
848
981
  }
@@ -873,6 +1006,9 @@ async function main() {
873
1006
  else if (command === "scheduler") {
874
1007
  await scheduler(rest);
875
1008
  }
1009
+ else if (command === "native-gateway") {
1010
+ await nativeGateway();
1011
+ }
876
1012
  else if (command === "mcp") {
877
1013
  await mcp();
878
1014
  }
@@ -0,0 +1,45 @@
1
+ import { type ClaudeContextFile } from "./protocol.js";
2
+ export interface ClaudeContextSkip {
3
+ path: string;
4
+ reason: "symlink" | "not_file" | "too_large" | "not_utf8" | "limit" | "outside_repo" | "not_allowed";
5
+ }
6
+ export interface ClaudeContext {
7
+ files: ClaudeContextFile[];
8
+ /** Files left out and why, at most `MAX_RECORDED_SKIPS` entries. */
9
+ skipped: ClaudeContextSkip[];
10
+ /**
11
+ * How many further files were left out without an entry in `skipped`: skips
12
+ * beyond `MAX_RECORDED_SKIPS`, plus `@imports` beyond `MAX_IMPORTS_PER_FILE`
13
+ * in a single file, which are not followed at all, plus 1 when `.claude/skills` has more than
14
+ * `MAX_SKILL_ENTRIES` entries. 0 when nothing overflowed.
15
+ */
16
+ skippedOverflow: number;
17
+ }
18
+ /** Content of the `CLAUDE.md` synthesized for a repository that only has `AGENTS.md`. */
19
+ export declare const AGENTS_BRIDGE = "@AGENTS.md\n";
20
+ /** At most this many `skipped` entries are recorded; the rest are only counted in `skippedOverflow`. */
21
+ export declare const MAX_RECORDED_SKIPS = 50;
22
+ /** Only the first this-many distinct `@imports` of each file are followed; the rest are counted in `skippedOverflow`. */
23
+ export declare const MAX_IMPORTS_PER_FILE = 100;
24
+ /**
25
+ * At most this many `.claude/skills` entries are considered (matching the Codex worker's scan cap);
26
+ * if there are more, the rest are neither read nor counted beyond adding one to `skippedOverflow`.
27
+ */
28
+ export declare const MAX_SKILL_ENTRIES = 2000;
29
+ /**
30
+ * Returns the `@path` imports in a Markdown instruction file, in order and
31
+ * de-duplicated. Imports inside fenced code blocks and inline code spans are
32
+ * ignored, as is an `@` not preceded by whitespace (an e-mail address). Runs
33
+ * in time linear in the input, whatever the repository puts in it.
34
+ */
35
+ export declare function importsOf(markdown: string): string[];
36
+ /**
37
+ * Builds the Claude Code context for the checkout at `workspace`. Files are
38
+ * ordered roots first, then imports breadth-first, then skills by directory
39
+ * name. A file reached more than once is read once. Once the next file would
40
+ * exceed the file-count or total-size limit, it and every later candidate are
41
+ * reported as `limit` without being read.
42
+ */
43
+ export declare function buildClaudeContext(workspace: string, options: {
44
+ skills: boolean;
45
+ }): Promise<ClaudeContext>;