@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,31 @@
1
+ /**
2
+ * Where a repository's knowledge bundle lives (docs/knowledge.md, "Where the
3
+ * bundle lives"): the folder `.wardby/knowledge.yaml` names, else
4
+ * DEFAULT_KNOWLEDGE_BUNDLE_PATH. A missing, unreadable, or invalid file never
5
+ * fails anything: it degrades to the default, with a warning when the file
6
+ * exists but cannot be used.
7
+ */
8
+ export declare const KNOWLEDGE_CONFIG_PATH = ".wardby/knowledge.yaml";
9
+ export declare const KNOWLEDGE_CONFIG_MAX_BYTES: number;
10
+ export interface KnowledgeLocation {
11
+ bundlePath: string;
12
+ /** Set when `.wardby/knowledge.yaml` exists but was ignored, saying why. */
13
+ warning?: string;
14
+ }
15
+ export type KnowledgeConfigParse = {
16
+ ok: true;
17
+ bundlePath: string;
18
+ } | {
19
+ ok: false;
20
+ error: string;
21
+ };
22
+ /** `path: <repo-relative folder>`, the file's only key. */
23
+ export declare function parseKnowledgeConfig(text: string): KnowledgeConfigParse;
24
+ /** A repo-relative POSIX folder, without `./` or trailing slashes, outside `.wardby/` and `.git/`. */
25
+ export declare function normalizeBundlePath(raw: string): KnowledgeConfigParse;
26
+ /**
27
+ * The bundle location, given a reader for `.wardby/knowledge.yaml` that
28
+ * returns null when the file does not exist. A reader that throws, like an
29
+ * invalid file, yields the default with a warning.
30
+ */
31
+ export declare function resolveKnowledgeLocation(readConfig: () => Promise<string | null | undefined>): Promise<KnowledgeLocation>;
@@ -0,0 +1,78 @@
1
+ import { parse as parseYaml } from "yaml";
2
+ import { DEFAULT_KNOWLEDGE_BUNDLE_PATH } from "./concept.js";
3
+ /**
4
+ * Where a repository's knowledge bundle lives (docs/knowledge.md, "Where the
5
+ * bundle lives"): the folder `.wardby/knowledge.yaml` names, else
6
+ * DEFAULT_KNOWLEDGE_BUNDLE_PATH. A missing, unreadable, or invalid file never
7
+ * fails anything: it degrades to the default, with a warning when the file
8
+ * exists but cannot be used.
9
+ */
10
+ export const KNOWLEDGE_CONFIG_PATH = ".wardby/knowledge.yaml";
11
+ export const KNOWLEDGE_CONFIG_MAX_BYTES = 4 * 1024;
12
+ const MAX_BUNDLE_PATH_LENGTH = 200;
13
+ /** `path: <repo-relative folder>`, the file's only key. */
14
+ export function parseKnowledgeConfig(text) {
15
+ let doc;
16
+ try {
17
+ doc = parseYaml(text);
18
+ }
19
+ catch {
20
+ return { ok: false, error: "it is not valid YAML" };
21
+ }
22
+ if (typeof doc !== "object" || doc === null || Array.isArray(doc))
23
+ return { ok: false, error: "it must be a mapping with a `path` key" };
24
+ const keys = Object.keys(doc);
25
+ const unknown = keys.filter((k) => k !== "path");
26
+ if (unknown.length > 0)
27
+ return { ok: false, error: `unknown key ${unknown.map((k) => `\`${k}\``).join(", ")}` };
28
+ const { path } = doc;
29
+ if (typeof path !== "string")
30
+ return { ok: false, error: "`path` must be a string" };
31
+ return normalizeBundlePath(path);
32
+ }
33
+ /** A repo-relative POSIX folder, without `./` or trailing slashes, outside `.wardby/` and `.git/`. */
34
+ export function normalizeBundlePath(raw) {
35
+ let path = raw.trim();
36
+ while (path.startsWith("./"))
37
+ path = path.slice(2);
38
+ path = path.replace(/\/+$/, "");
39
+ if (path === "" || path === ".")
40
+ return { ok: false, error: "`path` must name a folder inside the repository" };
41
+ if (path.length > MAX_BUNDLE_PATH_LENGTH)
42
+ return { ok: false, error: `\`path\` must be at most ${MAX_BUNDLE_PATH_LENGTH} characters` };
43
+ // eslint-disable-next-line no-control-regex
44
+ if (/[\u0000-\u001f\u007f\\]/.test(path))
45
+ return { ok: false, error: "`path` must be a plain POSIX path" };
46
+ if (path.startsWith("/"))
47
+ return { ok: false, error: "`path` must be relative to the repository root" };
48
+ const segments = path.split("/");
49
+ if (segments.some((s) => s === "" || s === "." || s === ".."))
50
+ return { ok: false, error: "`path` must not contain empty, `.` or `..` segments" };
51
+ if (segments[0] === ".wardby" || segments[0] === ".git")
52
+ return { ok: false, error: "`path` must not be inside `.wardby/` or `.git/`" };
53
+ return { ok: true, bundlePath: path };
54
+ }
55
+ /**
56
+ * The bundle location, given a reader for `.wardby/knowledge.yaml` that
57
+ * returns null when the file does not exist. A reader that throws, like an
58
+ * invalid file, yields the default with a warning.
59
+ */
60
+ export async function resolveKnowledgeLocation(readConfig) {
61
+ let text;
62
+ try {
63
+ text = await readConfig();
64
+ }
65
+ catch (err) {
66
+ const reason = err instanceof Error ? err.message : String(err);
67
+ return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH, warning: ignoredWarning(`it could not be read (${reason})`) };
68
+ }
69
+ if (text === null || text === undefined)
70
+ return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH };
71
+ const parsed = parseKnowledgeConfig(text);
72
+ if (!parsed.ok)
73
+ return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH, warning: ignoredWarning(parsed.error) };
74
+ return { bundlePath: parsed.bundlePath };
75
+ }
76
+ function ignoredWarning(reason) {
77
+ return `${KNOWLEDGE_CONFIG_PATH} was ignored because ${reason}; using ${DEFAULT_KNOWLEDGE_BUNDLE_PATH}/.`;
78
+ }
@@ -38,15 +38,17 @@ export declare function assertAgentAccess<A extends AgentRef>(ctx: McpRequestCon
38
38
  export declare function requireAgentAccess(ctx: McpRequestContext, id: string, required: AgentLevel | "owner", db?: Pick<PrismaClient, "agent" | "resourceGrant">): Promise<{
39
39
  agent: {
40
40
  name: string;
41
+ updatedAt: Date;
41
42
  model: string;
42
43
  budgetUsd: import("@prisma/client-runtime-utils").Decimal;
43
44
  maxTurns: number;
44
- createdAt: Date;
45
- updatedAt: Date;
46
45
  kind: import("#prisma").AgentKind;
46
+ createdAt: Date;
47
47
  id: string;
48
48
  ownerId: string | null;
49
+ nativeExecutionMode: import("#prisma").NativeExecutionMode;
49
50
  systemPrompt: string;
51
+ allowedOverrunPercent: number;
50
52
  schedule: string | null;
51
53
  timezone: string;
52
54
  scheduleEnabled: boolean;
@@ -67,6 +69,13 @@ export declare function requireAgentAccess(ctx: McpRequestContext, id: string, r
67
69
  * it can adopt the agent first (make_owner / grants adopt-public).
68
70
  */
69
71
  export declare function requireBindingOwner(ctx: McpRequestContext, agent: AgentRef): void;
72
+ /**
73
+ * requireBindingOwner, plus: nothing owner-held may be bound to an agent
74
+ * everyone can write (anyone could then rewrite it to use the binding).
75
+ */
76
+ export declare function requireBindable(ctx: McpRequestContext, agent: AgentRef, db?: GrantDb): Promise<void>;
77
+ /** The public-write half of requireBindable, for paths that skip the owner check (an admin's adminOverride). */
78
+ export declare function requireNotPublicWritable(agent: AgentRef, db: GrantDb): Promise<void>;
70
79
  /** Prisma where for agent listings: own rows plus rows granted >= read; the operator sees all. */
71
80
  export declare function readableAgentsWhere(ctx: McpRequestContext, db?: GrantDb): Promise<Prisma.AgentWhereInput>;
72
81
  /** One grant lookup for a whole listing: returns agent -> the caller's access. */
@@ -1,4 +1,4 @@
1
- import { atLeast, effectiveAccess, grantedAccessMap, grantedIds } from "../../core/grants.js";
1
+ import { atLeast, effectiveAccess, grantedAccessMap, grantedIds, isPublicWritable, } from "../../core/grants.js";
2
2
  import { McpError } from "../errors.js";
3
3
  export function agentNotFound(id) {
4
4
  return new McpError(404, `Agent "${id}" not found.`);
@@ -42,6 +42,20 @@ export function requireBindingOwner(ctx, agent) {
42
42
  throw new McpError(403, `Only the owner of agent "${agent.id}" can change its bindings.`);
43
43
  }
44
44
  }
45
+ /**
46
+ * requireBindingOwner, plus: nothing owner-held may be bound to an agent
47
+ * everyone can write (anyone could then rewrite it to use the binding).
48
+ */
49
+ export async function requireBindable(ctx, agent, db = ctx.db) {
50
+ requireBindingOwner(ctx, agent);
51
+ await requireNotPublicWritable(agent, db);
52
+ }
53
+ /** The public-write half of requireBindable, for paths that skip the owner check (an admin's adminOverride). */
54
+ export async function requireNotPublicWritable(agent, db) {
55
+ if (await isPublicWritable(db, agent.id)) {
56
+ throw new McpError(409, `Agent "${agent.id}" is writable by everyone, so nothing can be bound to it; revoke or lower the everyone grant first.`);
57
+ }
58
+ }
45
59
  /** Prisma where for agent listings: own rows plus rows granted >= read; the operator sees all. */
46
60
  export async function readableAgentsWhere(ctx, db = ctx.db) {
47
61
  if (ctx.operator)
@@ -26,8 +26,8 @@ export declare function visibleToPrincipal(principalId: string): {
26
26
  };
27
27
  export declare function requireOwnedBudgetGroup(db: PrismaClient, id: string, principalId: string): Promise<{
28
28
  name: string;
29
- createdAt: Date;
30
29
  updatedAt: Date;
30
+ createdAt: Date;
31
31
  id: string;
32
32
  ownerId: string | null;
33
33
  dailyBudgetUsd: import("@prisma/client-runtime-utils").Decimal | null;
@@ -37,8 +37,8 @@ export declare function requireOwnedBudgetGroup(db: PrismaClient, id: string, pr
37
37
  }>;
38
38
  export declare function requireReadableBudgetGroup(db: Pick<PrismaClient, "budgetGroup">, id: string, principalId: string): Promise<{
39
39
  name: string;
40
- createdAt: Date;
41
40
  updatedAt: Date;
41
+ createdAt: Date;
42
42
  id: string;
43
43
  ownerId: string | null;
44
44
  dailyBudgetUsd: import("@prisma/client-runtime-utils").Decimal | null;
@@ -50,8 +50,8 @@ export declare function requireOwnedSecret(db: PrismaClient, id: string, princip
50
50
  export declare function requireOwnedWebhook(db: PrismaClient, id: string, principalId: string): Promise<void>;
51
51
  export declare function requireOwnedDatastore(db: PrismaClient, id: string, principalId: string): Promise<{
52
52
  name: string;
53
- createdAt: Date;
54
53
  updatedAt: Date;
54
+ createdAt: Date;
55
55
  id: string;
56
56
  ownerId: string | null;
57
57
  }>;
@@ -72,14 +72,14 @@ export declare function assertStrictlyOwnedTool(tool: Tool | null, id: string, p
72
72
  * triggered them. No canRead/null=public path exists here on purpose.
73
73
  */
74
74
  export declare function requireOwnedTask(db: PrismaClient, taskId: string, principalId: string): Promise<{
75
+ updatedAt: Date;
75
76
  error: import("@prisma/client/runtime/client").JsonValue | null;
76
- status: import("#prisma").TaskStatus;
77
77
  runId: string | null;
78
- createdAt: Date;
79
- updatedAt: Date;
80
- kind: import("#prisma").TaskKind;
81
78
  result: import("@prisma/client/runtime/client").JsonValue | null;
79
+ kind: import("#prisma").TaskKind;
80
+ createdAt: Date;
82
81
  id: string;
82
+ status: import("#prisma").TaskStatus;
83
83
  principalId: string | null;
84
84
  inputRequests: import("@prisma/client/runtime/client").JsonValue | null;
85
85
  inputResponses: import("@prisma/client/runtime/client").JsonValue | null;
@@ -6,6 +6,7 @@
6
6
  * side and the rules; the host call happens here, before any transaction.
7
7
  */
8
8
  import { LocalRepoError, isLocalRepository, loadLocalRepoRoots, resolveLocalRepository, } from "../../coding/local-repo.js";
9
+ import { GITHUB_ACCOUNT_NOT_ALLOWED } from "../../config/github-allowed-accounts.js";
9
10
  import { requiredLevel } from "../../core/repo-access.js";
10
11
  import { McpError } from "../errors.js";
11
12
  import { requireScope } from "./resource-server.js";
@@ -39,6 +40,13 @@ export async function authorizeRepositoryForSet(ctx, input) {
39
40
  await canonicalLocalRepository(input.repository);
40
41
  return stamp("local_root");
41
42
  }
43
+ // A server-wide boundary: no admin approval reaches past it.
44
+ const accountDenied = await ctx.providers.repoAccess?.checkAccount?.(input.provider, input.repository);
45
+ if (accountDenied && !accountDenied.ok) {
46
+ if (accountDenied.reason === "github_account_not_allowed")
47
+ throw accountNotAllowed(input.repository);
48
+ throw new McpError(503, `Could not check whether ${input.repository}'s GitHub account is served right now; try again later.`);
49
+ }
42
50
  if (input.adminOverride) {
43
51
  // Role-gated: the scope alone never suffices (resource-server.ts).
44
52
  requireScope(ctx, ctx.canonicalUri, "agents:admin");
@@ -66,7 +74,13 @@ export async function authorizeRepositoryForSet(ctx, input) {
66
74
  case "insufficient_permission":
67
75
  throw new McpError(403, `Your linked GitHub account has ${decision.level ?? "no"} access to ${input.repository}; ` +
68
76
  `this needs ${required}. Ask a repository admin for access, or a wardby admin to approve it (adminOverride).`);
77
+ case "github_account_not_allowed":
78
+ throw accountNotAllowed(input.repository);
69
79
  default:
70
80
  throw new McpError(503, `Could not verify your GitHub access to ${input.repository} right now (is the GitHub App installed on it?). Try again.`);
71
81
  }
72
82
  }
83
+ function accountNotAllowed(repository) {
84
+ return new McpError(403, `${GITHUB_ACCOUNT_NOT_ALLOWED}: ${repository} belongs to a GitHub account this server does not serve. ` +
85
+ "An operator can add the account to WARDBY_GITHUB_ALLOWED_ACCOUNTS.");
86
+ }
@@ -18,7 +18,8 @@ export declare const SCOPES_SUPPORTED: string[];
18
18
  * services:manage changes the coding-run service catalog, which decides what
19
19
  * runs next to every coding run that names an entry; admin:view reads every
20
20
  * owner's runs (the admin viewer API); models:admin changes the model catalog,
21
- * which prices every principal's runs.
21
+ * which prices every principal's runs; power:manage scales the shared coding
22
+ * proxy and native gateway to zero (power_sleep) and reads their state.
22
23
  * A token scope only DELEGATES — it never authorizes on its own:
23
24
  * requireScope/requireAnyScope honour one only when one of the caller's
24
25
  * roles (McpRequestContext.roles, resolved live per request) grants it.
@@ -27,6 +27,9 @@ export const SCOPES_SUPPORTED = [
27
27
  // Add, override, disable and reset model catalog entries (see docs/models.md).
28
28
  // Reading the catalog (list_models, get_model) is agents:read.
29
29
  "models:admin",
30
+ // Scale the coding proxy and native gateway to zero now (power_sleep) and
31
+ // read their state (power_status); low-power mode only (docs/getting-started-gke.md).
32
+ "power:manage",
30
33
  ];
31
34
  /**
32
35
  * Scopes whose operations reach beyond the caller's own (or public)
@@ -36,7 +39,8 @@ export const SCOPES_SUPPORTED = [
36
39
  * services:manage changes the coding-run service catalog, which decides what
37
40
  * runs next to every coding run that names an entry; admin:view reads every
38
41
  * owner's runs (the admin viewer API); models:admin changes the model catalog,
39
- * which prices every principal's runs.
42
+ * which prices every principal's runs; power:manage scales the shared coding
43
+ * proxy and native gateway to zero (power_sleep) and reads their state.
40
44
  * A token scope only DELEGATES — it never authorizes on its own:
41
45
  * requireScope/requireAnyScope honour one only when one of the caller's
42
46
  * roles (McpRequestContext.roles, resolved live per request) grants it.
@@ -47,13 +51,14 @@ export const PRIVILEGED_SCOPES = [
47
51
  "services:manage",
48
52
  "admin:view",
49
53
  "models:admin",
54
+ "power:manage",
50
55
  ];
51
56
  /**
52
57
  * The built-in roles and the permissions (privileged scope names) each
53
58
  * grants. No roles = member: every non-privileged scope, nothing privileged.
54
59
  */
55
60
  export const ROLE_PERMISSIONS = {
56
- admin: ["agents:admin", "packages:approve", "services:manage", "admin:view", "models:admin"],
61
+ admin: ["agents:admin", "packages:approve", "services:manage", "admin:view", "models:admin", "power:manage"],
57
62
  "package-approver": ["packages:approve"],
58
63
  "service-manager": ["services:manage"],
59
64
  "model-manager": ["models:admin"],
@@ -1,3 +1,3 @@
1
1
  import type { IncomingMessage, ServerResponse } from "node:http";
2
- import type { SelfHostedAuthProvider } from "../../../providers/auth/self-hosted.js";
2
+ import { type SelfHostedAuthProvider } from "../../../providers/auth/self-hosted.js";
3
3
  export declare function browserHandler(provider: SelfHostedAuthProvider): (req: IncomingMessage, res: ServerResponse, url: URL, body: unknown) => Promise<boolean>;
@@ -1,4 +1,5 @@
1
1
  import { randomUUID, randomBytes } from "node:crypto";
2
+ import { MobileDisabledError } from "../../../providers/auth/self-hosted.js";
2
3
  import { PostgresRateLimiter, RateLimitError } from "./rate-limit.js";
3
4
  import { logger } from "../../../core/logger.js";
4
5
  import { PAGE_STYLE } from "../../shared/page-style.js";
@@ -120,12 +121,24 @@ export function browserHandler(provider) {
120
121
  // here is already a public PKCE client with validated redirect URIs.
121
122
  if (p.application_type !== undefined && p.application_type !== "native" && p.application_type !== "web")
122
123
  throw new Error("unsupported application_type");
123
- const registered = await provider.registerClient({
124
- redirectUris: p.redirect_uris,
125
- clientName: p.client_name,
126
- grantTypes: p.grant_types,
127
- tokenEndpointAuthMethod: p.token_endpoint_auth_method,
128
- });
124
+ let registered;
125
+ try {
126
+ registered = await provider.registerClient({
127
+ redirectUris: p.redirect_uris,
128
+ clientName: p.client_name,
129
+ grantTypes: p.grant_types,
130
+ tokenEndpointAuthMethod: p.token_endpoint_auth_method,
131
+ });
132
+ }
133
+ catch (err) {
134
+ // The one registration error that names its reason: the operator
135
+ // must turn mobile sign-in on. Everything else stays generic below.
136
+ if (err instanceof MobileDisabledError) {
137
+ json(res, 400, { error: "invalid_redirect_uri", error_description: err.message });
138
+ return true;
139
+ }
140
+ throw err;
141
+ }
129
142
  json(res, 201, {
130
143
  client_id: registered.clientId,
131
144
  token_endpoint_auth_method: "none",
@@ -23,10 +23,10 @@ export declare function lockUser(tx: AuthDb, id: string): Promise<{
23
23
  subject: string;
24
24
  };
25
25
  } & {
26
- status: string;
27
- createdAt: Date;
28
26
  updatedAt: Date;
27
+ createdAt: Date;
29
28
  id: string;
29
+ status: string;
30
30
  roles: string[];
31
31
  displayName: string | null;
32
32
  principalId: string;
@@ -58,11 +58,11 @@ export declare class IdentityService {
58
58
  }>;
59
59
  revokeKey(keyId: string): Promise<void>;
60
60
  listUsers(): Prisma.PrismaPromise<{
61
+ id: string;
61
62
  status: string;
62
63
  principal: {
63
64
  subject: string;
64
65
  };
65
- id: string;
66
66
  roles: string[];
67
67
  displayName: string | null;
68
68
  }[]>;
@@ -16,10 +16,10 @@ export declare class Sessions {
16
16
  subject: string;
17
17
  };
18
18
  } & {
19
- status: string;
20
- createdAt: Date;
21
19
  updatedAt: Date;
20
+ createdAt: Date;
22
21
  id: string;
22
+ status: string;
23
23
  roles: string[];
24
24
  displayName: string | null;
25
25
  principalId: string;
@@ -13,10 +13,14 @@ import type { ProviderRegistry } from "../providers/index.js";
13
13
  import type { RepoAccessGate } from "../core/repo-access.js";
14
14
  import type { IssueTrackerRegistry } from "../providers/issue-tracker/types.js";
15
15
  import type { HostUserAuthorizerRegistry, ReviewHostRegistry } from "../providers/review-host/types.js";
16
+ import type { Power } from "../core/power.js";
17
+ import type { ChatProviderRegistry } from "../providers/chat/types.js";
16
18
  export type McpProviders = Pick<ProviderRegistry, "llm" | "engine" | "datastore" | "secrets" | "executor" | "memory"> & {
17
19
  reviewHosts?: ReviewHostRegistry;
18
20
  /** Issue trackers (Jira); empty or absent = no issue-tracker integration. */
19
21
  issueTrackers?: IssueTrackerRegistry;
22
+ /** Chat providers for workflow notifications (Slack); empty or absent = notifications off. */
23
+ chat?: ChatProviderRegistry;
20
24
  /** Identity linking (link_host_account); empty or absent = linking disabled. */
21
25
  hostUserAuthorizers?: HostUserAuthorizerRegistry;
22
26
  /**
@@ -25,6 +29,8 @@ export type McpProviders = Pick<ProviderRegistry, "llm" | "engine" | "datastore"
25
29
  * only admin approvals still work.
26
30
  */
27
31
  repoAccess?: RepoAccessGate;
32
+ /** Low-power mode (scale idle proxy/gateway to zero); absent = DISABLED_POWER. */
33
+ power?: Power;
28
34
  };
29
35
  export interface McpRequestContext {
30
36
  principal: Principal;
@@ -19,10 +19,24 @@ export interface GitHubIngressDeps {
19
19
  /** For a merged/closed PR's linked issue; absent → closed PRs are ignored. */
20
20
  issueTrackers?: IssueTrackerRegistry;
21
21
  webhookSecret: string | undefined;
22
- appIdentity: () => Promise<{
22
+ /**
23
+ * The App's id, slug, and owner (the owner is always served). Throwing fails
24
+ * the request closed. `fresh` bypasses any cache; it is used before an
25
+ * uninstall, since the owner can change while the server runs.
26
+ */
27
+ appIdentity: (opts?: {
28
+ fresh?: boolean;
29
+ }) => Promise<{
23
30
  id: number;
24
31
  slug: string;
32
+ ownerLogin: string;
25
33
  }>;
34
+ /** Accounts served in addition to the App's owner (WARDBY_GITHUB_ALLOWED_ACCOUNTS). */
35
+ allowedAccounts: () => ReadonlySet<string>;
36
+ /** False = no reply explaining why a mention started nothing (WARDBY_MENTION_EXPLANATIONS). */
37
+ mentionExplanations?: boolean;
38
+ /** Removes the App from an installation on an account that isn't served; absent = ignore only. */
39
+ uninstallInstallation?: (installationId: number) => Promise<void>;
26
40
  now?: () => Date;
27
41
  }
28
42
  export interface GitHubIngressResult {
@@ -31,6 +45,16 @@ export interface GitHubIngressResult {
31
45
  /** Cosmetic follow-ups (reactions) to run after the response is sent. */
32
46
  afterResponse?: () => Promise<void>;
33
47
  }
48
+ /**
49
+ * Which GitHub account an event belongs to. Installation events name it on
50
+ * the installation; repository events carry only installation.id, so the
51
+ * repository's owner stands in.
52
+ */
53
+ export declare function eventAccount(eventName: string, payload: unknown): {
54
+ login: string;
55
+ installationId?: number;
56
+ uninstall: boolean;
57
+ } | undefined;
34
58
  export declare function handleGitHubEventIngress(req: {
35
59
  headers: Record<string, string | undefined>;
36
60
  rawBody: string;
@@ -9,8 +9,38 @@ import { maybePruneHostEventDeliveries } from "./deliveries.js";
9
9
  import { routeHostEvent } from "../../core/host-events.js";
10
10
  import { logger } from "../../core/logger.js";
11
11
  import { normalizeGitHubEvent, verifyGitHubSignature } from "../../providers/review-host/github-events.js";
12
+ import { isGitHubAccountAllowed, trustedAccounts } from "../../config/github-allowed-accounts.js";
12
13
  const log = logger.child({ module: "github-ingress" });
13
14
  const SAFE_DELIVERY = /^[A-Za-z0-9-]{1,100}$/;
15
+ const INSTALLATION_EVENTS = new Set(["installation", "installation_repositories"]);
16
+ function field(value, key) {
17
+ return value !== null && typeof value === "object" ? value[key] : undefined;
18
+ }
19
+ /**
20
+ * Which GitHub account an event belongs to. Installation events name it on
21
+ * the installation; repository events carry only installation.id, so the
22
+ * repository's owner stands in.
23
+ */
24
+ export function eventAccount(eventName, payload) {
25
+ if (INSTALLATION_EVENTS.has(eventName)) {
26
+ const installation = field(payload, "installation");
27
+ const login = field(field(installation, "account"), "login");
28
+ const id = field(installation, "id");
29
+ if (typeof login !== "string" || login === "")
30
+ return undefined;
31
+ return {
32
+ login,
33
+ ...(typeof id === "number" && Number.isSafeInteger(id) && id > 0 ? { installationId: id } : {}),
34
+ uninstall: field(payload, "action") !== "deleted",
35
+ };
36
+ }
37
+ const repository = field(payload, "repository");
38
+ const fullName = field(repository, "full_name");
39
+ const owner = typeof fullName === "string" && fullName.includes("/")
40
+ ? fullName.split("/", 1)[0]
41
+ : field(field(repository, "owner"), "login");
42
+ return typeof owner === "string" && owner !== "" ? { login: owner, uninstall: false } : undefined;
43
+ }
14
44
  export async function handleGitHubEventIngress(req, deps) {
15
45
  if (!deps.webhookSecret)
16
46
  return { status: 404, body: { error: "not_found" } };
@@ -31,7 +61,45 @@ export async function handleGitHubEventIngress(req, deps) {
31
61
  return { status: 400, body: { error: "invalid_json" } };
32
62
  }
33
63
  const app = await deps.appIdentity();
34
- const event = normalizeGitHubEvent(eventName, payload, app);
64
+ const account = eventAccount(eventName, payload);
65
+ if (account && !isGitHubAccountAllowed(trustedAccounts(app.ownerLogin, deps.allowedAccounts()), account.login)) {
66
+ // Never the body: only the account and what we do about it.
67
+ log.warn({ event: eventName, account: account.login, installationId: account.installationId, deliveryId }, "GitHub event from an account this server does not serve ignored");
68
+ const uninstall = deps.uninstallInstallation;
69
+ const installationId = account.installationId;
70
+ return {
71
+ status: 202,
72
+ body: { ignored: "account_not_allowed" },
73
+ ...(account.uninstall && uninstall && installationId !== undefined
74
+ ? {
75
+ afterResponse: async () => {
76
+ // Destructive, so re-check against a fresh owner read: the cached
77
+ // owner may be stale after an ownership transfer or rename.
78
+ let fresh;
79
+ try {
80
+ fresh = await deps.appIdentity({ fresh: true });
81
+ }
82
+ catch (err) {
83
+ log.warn({ err, account: account.login, installationId }, "could not re-read the App owner; not removing the App from the installation");
84
+ return;
85
+ }
86
+ if (isGitHubAccountAllowed(trustedAccounts(fresh.ownerLogin, deps.allowedAccounts()), account.login)) {
87
+ log.info({ account: account.login, installationId }, "account is served after re-reading the App owner; not removing the App from the installation");
88
+ return;
89
+ }
90
+ try {
91
+ await uninstall(installationId);
92
+ log.warn({ account: account.login, installationId }, "removed the App from an installation on an account this server does not serve");
93
+ }
94
+ catch (err) {
95
+ log.warn({ err, account: account.login, installationId }, "could not remove the App from a foreign installation");
96
+ }
97
+ },
98
+ }
99
+ : {}),
100
+ };
101
+ }
102
+ const event = normalizeGitHubEvent(eventName, payload, app, (dropped) => log.info({ ...dropped, deliveryId }, "mention ignored: its author did not pass the pre-filter"));
35
103
  // An event we don't act on must never claim the delivery id: recording it
36
104
  // here would let a later, real delivery of the same id (GitHub does reuse
37
105
  // ids across distinct redeliveries of what it considers the same event)
@@ -62,6 +130,7 @@ export async function handleGitHubEventIngress(req, deps) {
62
130
  repoAccess: deps.repoAccess,
63
131
  ...(deps.issueTrackers ? { issueTrackers: deps.issueTrackers } : {}),
64
132
  mentionHandle: app.slug,
133
+ ...(deps.mentionExplanations === false ? { mentionExplanations: false } : {}),
65
134
  });
66
135
  log.info({ event: event.kind, repository: event.repository, deliveryId, runIds: routed.runIds }, "host event routed");
67
136
  return {
@@ -12,6 +12,12 @@ export declare function localOperatorContext(principal: Principal, providers: Mc
12
12
  export declare function registerAllTools(mcp: WardbyMcpServer, opts: {
13
13
  secretElicitationUrl: SecretElicitationUrlBuilder;
14
14
  secretElicitationProtocol: boolean;
15
+ /** Builds a get_run_transcript download URL for a minted token; absent = transcripts are not served. */
16
+ runTranscriptUrl?: (token: string) => Promise<string>;
17
+ /** Whether a blob store is configured to serve run transcripts from. */
18
+ blobStoreConfigured?: boolean;
19
+ /** Which host serves those links (default http). */
20
+ runTranscriptAudience?: "stdio" | "http";
15
21
  /** Rebuilds the process's installed model CatalogStore after set_model/disable_model/reset_model. */
16
22
  refreshModelCatalog?: () => Promise<void>;
17
23
  }): void;
@@ -37,5 +43,18 @@ export interface StartMcpOptions {
37
43
  */
38
44
  schedulerAttached?: boolean;
39
45
  }
46
+ /**
47
+ * Fire-and-forget: starts the executor's start-up warm-up (e.g. KubernetesJobLauncher's memoized
48
+ * cluster preflight, via RoutingExecutor -> ContainerExecutor -> the job launcher's own `warmUp`)
49
+ * right when a long-running server process starts, so its first coding run doesn't pay for it.
50
+ * Never awaited by its caller and never throws: `warmUp()` on every implementation already swallows
51
+ * its own failure (logging it instead), but this still guards the call site against a surprise
52
+ * rejection, since nothing here may block or fail server start-up. Called from `startMcp` below —
53
+ * i.e. from `wardby mcp` (stdio and HTTP) and from `wardby serve`, which shares this same start-up
54
+ * path — and, separately, from `cli.ts`'s `scheduler()` (`wardby scheduler`), which dispatches
55
+ * scheduled coding runs through its own Kubernetes executor but never starts an MCP server. Never
56
+ * called from a one-shot CLI command (`wardby run`, `coding preflight`, migrations, imports).
57
+ */
58
+ export declare function warmUpExecutor(executor: Pick<McpProviders["executor"], "warmUp">): void;
40
59
  /** The real CLI entry point: `wardby mcp`. Reads config from the environment, starts stdio or HTTP per MCP_TRANSPORT. */
41
60
  export declare function startMcp(options?: StartMcpOptions): Promise<McpServerHandle>;