@wardby/cli 0.6.0 → 0.8.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 (740) hide show
  1. package/.env.example +5 -5
  2. package/README.md +6 -1
  3. package/deploy/local/docker-compose.quickstart-coding.yml +19 -0
  4. package/dist/claude-coding-worker/driver.d.ts +33 -3
  5. package/dist/claude-coding-worker/driver.js +151 -21
  6. package/dist/claude-coding-worker/main.js +38 -6
  7. package/dist/claude-coding-worker/sdk.js +29 -2
  8. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  9. package/dist/claude-coding-worker/tool-socket.js +111 -0
  10. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  11. package/dist/claude-coding-worker/transcript.js +77 -0
  12. package/dist/claude-plugin/command.d.ts +61 -0
  13. package/dist/claude-plugin/command.js +376 -0
  14. package/dist/cli-help.d.ts +1 -1
  15. package/dist/cli-help.js +3 -1
  16. package/dist/cli.js +71 -13
  17. package/dist/coding/code-host.d.ts +16 -0
  18. package/dist/coding/code-host.js +60 -0
  19. package/dist/coding/continuation-wording.d.ts +35 -0
  20. package/dist/coding/continuation-wording.js +73 -0
  21. package/dist/coding/linked-issue-note.d.ts +23 -0
  22. package/dist/coding/linked-issue-note.js +47 -0
  23. package/dist/coding/mcp-token.d.ts +12 -0
  24. package/dist/coding/mcp-token.js +26 -0
  25. package/dist/coding/merge-wording.d.ts +28 -0
  26. package/dist/coding/merge-wording.js +78 -0
  27. package/dist/coding/pr-description-note.d.ts +9 -0
  28. package/dist/coding/pr-description-note.js +32 -0
  29. package/dist/coding/profile.d.ts +46 -126
  30. package/dist/coding/profile.js +45 -4
  31. package/dist/coding/protected-path-wording.d.ts +8 -0
  32. package/dist/coding/protected-path-wording.js +1 -1
  33. package/dist/coding/protocol.d.ts +264 -346
  34. package/dist/coding/protocol.js +237 -12
  35. package/dist/coding/redact.d.ts +3 -0
  36. package/dist/coding/redact.js +17 -0
  37. package/dist/coding/registry/allowlist.d.ts +12 -0
  38. package/dist/coding/registry/allowlist.js +14 -1
  39. package/dist/coding/registry/audit-mode.d.ts +153 -0
  40. package/dist/coding/registry/audit-mode.js +304 -0
  41. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  42. package/dist/coding/registry/lockfile-shared.js +128 -0
  43. package/dist/coding/registry/lockfiles.js +1 -1
  44. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  45. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  46. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  47. package/dist/coding/registry/npm-lockfile.js +4 -6
  48. package/dist/coding/registry/npm.js +78 -8
  49. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  50. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  51. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  52. package/dist/coding/registry/pypi-plan.js +406 -0
  53. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  54. package/dist/coding/registry/pypi-requirements.js +155 -0
  55. package/dist/coding/registry/pypi.d.ts +3 -27
  56. package/dist/coding/registry/pypi.js +40 -154
  57. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  58. package/dist/coding/registry/refusal-hints.js +61 -0
  59. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  60. package/dist/coding/registry/refusal-wording.js +56 -0
  61. package/dist/coding/registry/report.d.ts +70 -8
  62. package/dist/coding/registry/report.js +112 -5
  63. package/dist/coding/registry/types.d.ts +58 -8
  64. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  65. package/dist/coding/registry/yarn-lockfile.js +367 -0
  66. package/dist/coding/services/catalog.d.ts +37 -351
  67. package/dist/coding/transcript/claude-code.d.ts +13 -0
  68. package/dist/coding/transcript/claude-code.js +273 -0
  69. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  70. package/dist/coding/transcript/download-protocol.js +18 -0
  71. package/dist/coding/transcript/format.d.ts +20 -0
  72. package/dist/coding/transcript/format.js +32 -0
  73. package/dist/coding/transcript/recorder.d.ts +52 -0
  74. package/dist/coding/transcript/recorder.js +225 -0
  75. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  76. package/dist/coding/transcript/resume/checkout.js +203 -0
  77. package/dist/coding/transcript/resume/command.d.ts +17 -0
  78. package/dist/coding/transcript/resume/command.js +176 -0
  79. package/dist/coding/transcript/resume/download.d.ts +20 -0
  80. package/dist/coding/transcript/resume/download.js +153 -0
  81. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  82. package/dist/coding/transcript/resume/launch.js +128 -0
  83. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  84. package/dist/coding/transcript/resume/session-file.js +79 -0
  85. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  86. package/dist/coding/transcript/resume/stand-in.js +49 -0
  87. package/dist/coding-worker/artifact.d.ts +8 -3
  88. package/dist/coding-worker/artifact.js +3 -1
  89. package/dist/coding-worker/debug-trace.d.ts +9 -6
  90. package/dist/coding-worker/debug-trace.js +16 -19
  91. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  92. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  93. package/dist/coding-worker/driver.d.ts +4 -3
  94. package/dist/coding-worker/driver.js +124 -39
  95. package/dist/coding-worker/errors.d.ts +1 -0
  96. package/dist/coding-worker/errors.js +32 -0
  97. package/dist/coding-worker/main.js +5 -1
  98. package/dist/coding-worker/mcp-config.d.ts +27 -0
  99. package/dist/coding-worker/mcp-config.js +32 -0
  100. package/dist/coding-worker/sdk.d.ts +36 -0
  101. package/dist/coding-worker/sdk.js +28 -1
  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 +15 -0
  105. package/dist/config/dependency-cache.d.ts +23 -0
  106. package/dist/config/dependency-cache.js +32 -0
  107. package/dist/config/mcp-call-limit.d.ts +8 -0
  108. package/dist/config/mcp-call-limit.js +18 -0
  109. package/dist/config/mcp-servers.d.ts +8 -0
  110. package/dist/config/mcp-servers.js +12 -0
  111. package/dist/config/providers.d.ts +12 -3
  112. package/dist/config/providers.js +55 -5
  113. package/dist/config/test-simulators.d.ts +92 -0
  114. package/dist/config/test-simulators.js +333 -0
  115. package/dist/config/tool-timeout.d.ts +1 -0
  116. package/dist/config/tool-timeout.js +18 -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-mcp.d.ts +36 -0
  130. package/dist/core/coding-mcp.js +253 -0
  131. package/dist/core/coding-queue.d.ts +2 -1
  132. package/dist/core/coding-queue.js +7 -0
  133. package/dist/core/coding-repository.d.ts +46 -0
  134. package/dist/core/coding-repository.js +92 -0
  135. package/dist/core/cron.d.ts +19 -1
  136. package/dist/core/cron.js +17 -0
  137. package/dist/core/datastores.js +1 -1
  138. package/dist/core/deferred-coding.d.ts +14 -0
  139. package/dist/core/deferred-coding.js +62 -0
  140. package/dist/core/delegation-child.d.ts +25 -0
  141. package/dist/core/delegation-child.js +37 -0
  142. package/dist/core/delegation-slots.d.ts +27 -0
  143. package/dist/core/delegation-slots.js +44 -0
  144. package/dist/core/dispatch.d.ts +48 -2
  145. package/dist/core/dispatch.js +166 -66
  146. package/dist/core/engine-native.js +1 -1
  147. package/dist/core/error-code.d.ts +38 -0
  148. package/dist/core/error-code.js +169 -0
  149. package/dist/core/grants.d.ts +46 -8
  150. package/dist/core/grants.js +99 -8
  151. package/dist/core/host-events.d.ts +18 -2
  152. package/dist/core/host-events.js +291 -27
  153. package/dist/core/host-status.d.ts +85 -3
  154. package/dist/core/host-status.js +300 -22
  155. package/dist/core/issue-bridge.d.ts +50 -6
  156. package/dist/core/issue-bridge.js +124 -33
  157. package/dist/core/issue-events.d.ts +1 -1
  158. package/dist/core/issue-events.js +4 -10
  159. package/dist/core/issue-status.d.ts +1 -1
  160. package/dist/core/issue-status.js +58 -29
  161. package/dist/core/logger.d.ts +5 -0
  162. package/dist/core/logger.js +14 -1
  163. package/dist/core/lost-run-children.d.ts +6 -0
  164. package/dist/core/lost-run-children.js +32 -0
  165. package/dist/core/mark-ready.d.ts +34 -0
  166. package/dist/core/mark-ready.js +152 -0
  167. package/dist/core/markdown-code.d.ts +8 -0
  168. package/dist/core/markdown-code.js +107 -0
  169. package/dist/core/mcp-client/client.d.ts +47 -0
  170. package/dist/core/mcp-client/client.js +141 -0
  171. package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
  172. package/dist/core/mcp-client/jsonrpc.js +54 -0
  173. package/dist/core/mcp-client/results.d.ts +13 -0
  174. package/dist/core/mcp-client/results.js +42 -0
  175. package/dist/core/mcp-servers.d.ts +90 -0
  176. package/dist/core/mcp-servers.js +230 -0
  177. package/dist/core/mcp-tools.d.ts +108 -0
  178. package/dist/core/mcp-tools.js +287 -0
  179. package/dist/core/memory-tools.js +7 -0
  180. package/dist/core/merge-order-check.d.ts +2 -1
  181. package/dist/core/merge-order-check.js +44 -18
  182. package/dist/core/notification-dispatcher.js +2 -1
  183. package/dist/core/notification-templates.d.ts +1 -7
  184. package/dist/core/notification-templates.js +36 -2
  185. package/dist/core/pull-request-state-sync.js +2 -2
  186. package/dist/core/reconciler.d.ts +4 -3
  187. package/dist/core/reconciler.js +8 -1
  188. package/dist/core/related-pull-requests.d.ts +11 -3
  189. package/dist/core/related-pull-requests.js +49 -20
  190. package/dist/core/reply-parts.d.ts +21 -0
  191. package/dist/core/reply-parts.js +73 -0
  192. package/dist/core/review-fix.d.ts +1 -1
  193. package/dist/core/review-fix.js +4 -3
  194. package/dist/core/review-host-checks.d.ts +1 -1
  195. package/dist/core/review-host-tools.d.ts +3 -0
  196. package/dist/core/review-host-tools.js +102 -14
  197. package/dist/core/review-reads.d.ts +55 -0
  198. package/dist/core/review-reads.js +233 -0
  199. package/dist/core/run-status.d.ts +12 -0
  200. package/dist/core/run-status.js +12 -0
  201. package/dist/core/runner.d.ts +145 -49
  202. package/dist/core/runner.js +719 -216
  203. package/dist/core/schedule-start.d.ts +12 -0
  204. package/dist/core/schedule-start.js +14 -0
  205. package/dist/core/secret-broker-config.d.ts +12 -74
  206. package/dist/core/secret-broker-config.js +1 -1
  207. package/dist/core/secret-guard.d.ts +49 -0
  208. package/dist/core/secret-guard.js +119 -0
  209. package/dist/core/secret-guarded-stores.d.ts +12 -0
  210. package/dist/core/secret-guarded-stores.js +41 -0
  211. package/dist/core/secret-spans.d.ts +50 -0
  212. package/dist/core/secret-spans.js +94 -0
  213. package/dist/core/secrets.d.ts +11 -1
  214. package/dist/core/secrets.js +27 -1
  215. package/dist/core/serializable-retry.d.ts +18 -0
  216. package/dist/core/serializable-retry.js +43 -0
  217. package/dist/core/stop-run.d.ts +46 -0
  218. package/dist/core/stop-run.js +61 -0
  219. package/dist/core/tool-admin.d.ts +5 -1
  220. package/dist/core/tool-admin.js +7 -2
  221. package/dist/core/tool-names.d.ts +13 -0
  222. package/dist/core/tool-names.js +20 -0
  223. package/dist/core/webhooks.d.ts +4 -0
  224. package/dist/core/webhooks.js +68 -49
  225. package/dist/core/workflow-events.d.ts +14 -2
  226. package/dist/core/workflow-events.js +4 -0
  227. package/dist/core/workflow-run-events.d.ts +5 -3
  228. package/dist/core/workflow-run-events.js +45 -9
  229. package/dist/core/zod-json-schema.d.ts +4 -0
  230. package/dist/core/zod-json-schema.js +39 -0
  231. package/dist/core/zod3-window.d.ts +35 -0
  232. package/dist/core/zod3-window.js +124 -0
  233. package/dist/generated/prisma/browser.d.ts +65 -3
  234. package/dist/generated/prisma/client.d.ts +65 -3
  235. package/dist/generated/prisma/commonInputTypes.d.ts +266 -106
  236. package/dist/generated/prisma/enums.d.ts +10 -0
  237. package/dist/generated/prisma/enums.js +8 -0
  238. package/dist/generated/prisma/internal/class.d.ts +110 -0
  239. package/dist/generated/prisma/internal/class.js +4 -4
  240. package/dist/generated/prisma/internal/prismaNamespace.d.ts +957 -9
  241. package/dist/generated/prisma/internal/prismaNamespace.js +166 -2
  242. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +174 -0
  243. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +166 -2
  244. package/dist/generated/prisma/models/Agent.d.ts +377 -8
  245. package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
  246. package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
  247. package/dist/generated/prisma/models/AgentRepository.d.ts +81 -1
  248. package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
  249. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +228 -7
  250. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  251. package/dist/generated/prisma/models/CodingProxySession.d.ts +232 -2
  252. package/dist/generated/prisma/models/CodingRun.d.ts +1712 -1
  253. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  254. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  255. package/dist/generated/prisma/models/HostProvider.d.ts +2176 -0
  256. package/dist/generated/prisma/models/HostProvider.js +1 -0
  257. package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
  258. package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
  259. package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
  260. package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
  261. package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
  262. package/dist/generated/prisma/models/HostProviderTrustedAccount.js +1 -0
  263. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  264. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  265. package/dist/generated/prisma/models/McpServer.d.ts +1500 -0
  266. package/dist/generated/prisma/models/McpServer.js +1 -0
  267. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +77 -1
  268. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  269. package/dist/generated/prisma/models/Principal.d.ts +167 -0
  270. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  271. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  272. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  273. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  274. package/dist/generated/prisma/models/ResourceGrant.d.ts +1 -1
  275. package/dist/generated/prisma/models/Run.d.ts +738 -2
  276. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  277. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  278. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  279. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  280. package/dist/generated/prisma/models/Secret.d.ts +387 -0
  281. package/dist/generated/prisma/models/Tool.d.ts +223 -1
  282. package/dist/generated/prisma/models.d.ts +10 -0
  283. package/dist/help/search.js +12 -3
  284. package/dist/help-index.json +2033 -110
  285. package/dist/import/create.js +48 -4
  286. package/dist/import/neutral-schema.d.ts +51 -281
  287. package/dist/import/neutral-schema.js +7 -4
  288. package/dist/knowledge/check.d.ts +1 -1
  289. package/dist/knowledge/cli.d.ts +11 -1
  290. package/dist/knowledge/cli.js +37 -4
  291. package/dist/knowledge/concept.d.ts +3 -19
  292. package/dist/knowledge/location.d.ts +31 -0
  293. package/dist/knowledge/location.js +78 -0
  294. package/dist/mcp/auth/access.d.ts +10 -2
  295. package/dist/mcp/auth/access.js +15 -1
  296. package/dist/mcp/auth/grants-cli.d.ts +6 -4
  297. package/dist/mcp/auth/grants-cli.js +42 -3
  298. package/dist/mcp/auth/ownership.d.ts +7 -7
  299. package/dist/mcp/auth/resource-server.d.ts +3 -1
  300. package/dist/mcp/auth/resource-server.js +17 -2
  301. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  302. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  303. package/dist/mcp/context.d.ts +3 -0
  304. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  305. package/dist/mcp/host-events/github-ingress.js +2 -1
  306. package/dist/mcp/index.d.ts +6 -0
  307. package/dist/mcp/index.js +69 -10
  308. package/dist/mcp/server.d.ts +13 -0
  309. package/dist/mcp/server.js +33 -14
  310. package/dist/mcp/tools/agents.d.ts +4 -0
  311. package/dist/mcp/tools/agents.js +295 -28
  312. package/dist/mcp/tools/datastore.js +17 -8
  313. package/dist/mcp/tools/grants.js +73 -29
  314. package/dist/mcp/tools/host-providers.d.ts +2 -0
  315. package/dist/mcp/tools/host-providers.js +215 -0
  316. package/dist/mcp/tools/mcp-servers.d.ts +26 -0
  317. package/dist/mcp/tools/mcp-servers.js +481 -0
  318. package/dist/mcp/tools/memory.js +11 -1
  319. package/dist/mcp/tools/notification-channels.js +2 -2
  320. package/dist/mcp/tools/packages.d.ts +2 -0
  321. package/dist/mcp/tools/packages.js +195 -0
  322. package/dist/mcp/tools/repositories.js +65 -12
  323. package/dist/mcp/tools/run-access.d.ts +16 -0
  324. package/dist/mcp/tools/run-access.js +25 -0
  325. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  326. package/dist/mcp/tools/run-transcript-download.js +129 -0
  327. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  328. package/dist/mcp/tools/run-transcript.js +70 -0
  329. package/dist/mcp/tools/runs.js +209 -27
  330. package/dist/mcp/tools/scheduling.js +3 -1
  331. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  332. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  333. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  334. package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
  335. package/dist/mcp/tools/secret-elicitation.js +25 -2
  336. package/dist/mcp/tools/secrets.js +40 -6
  337. package/dist/mcp/tools/stop-run.d.ts +2 -0
  338. package/dist/mcp/tools/stop-run.js +82 -0
  339. package/dist/mcp/tools/subagents.js +2 -2
  340. package/dist/mcp/tools/tools.d.ts +7 -5
  341. package/dist/mcp/tools/tools.js +64 -16
  342. package/dist/mcp/tools/trigger.js +28 -6
  343. package/dist/mcp/transport/http-limits.d.ts +2 -0
  344. package/dist/mcp/transport/http-limits.js +6 -2
  345. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  346. package/dist/mcp/transport/stdio-link-host.js +67 -0
  347. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  348. package/dist/mcp/transport/streamable-http.js +41 -1
  349. package/dist/mcp/webhooks/ingress.js +10 -0
  350. package/dist/native-worker/docker-launcher.d.ts +38 -2
  351. package/dist/native-worker/docker-launcher.js +65 -5
  352. package/dist/native-worker/gateway-server.d.ts +55 -3
  353. package/dist/native-worker/gateway-server.js +152 -34
  354. package/dist/native-worker/gateway.d.ts +29 -1
  355. package/dist/native-worker/gateway.js +74 -4
  356. package/dist/native-worker/http-server.d.ts +7 -1
  357. package/dist/native-worker/http-server.js +62 -7
  358. package/dist/native-worker/http-transport.js +1 -1
  359. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  360. package/dist/native-worker/kubernetes-launcher.js +43 -3
  361. package/dist/native-worker/launch.d.ts +18 -1
  362. package/dist/native-worker/launch.js +6 -1
  363. package/dist/native-worker/ledger.d.ts +24 -4
  364. package/dist/native-worker/ledger.js +62 -8
  365. package/dist/native-worker/loopback.js +3 -8
  366. package/dist/native-worker/main.d.ts +2 -1
  367. package/dist/native-worker/main.js +14 -3
  368. package/dist/native-worker/protocol.d.ts +130 -577
  369. package/dist/native-worker/protocol.js +51 -2
  370. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  371. package/dist/native-worker/sandbox-executor.js +78 -4
  372. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  373. package/dist/native-worker/stderr-redaction.js +237 -0
  374. package/dist/native-worker/stdio.d.ts +1 -1
  375. package/dist/native-worker/stdio.js +6 -5
  376. package/dist/native-worker/warm-pool.d.ts +2 -2
  377. package/dist/native-worker/warm-pool.js +4 -4
  378. package/dist/native-worker/worker.js +28 -2
  379. package/dist/observability/metrics.js +6 -1
  380. package/dist/providers/auth/self-hosted.d.ts +1 -1
  381. package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
  382. package/dist/providers/coding-proxy/capability-hash.js +5 -0
  383. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  384. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  385. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  386. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  387. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  388. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  389. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  390. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  391. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  392. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  393. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  394. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  395. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  396. package/dist/providers/coding-proxy/hold.js +86 -0
  397. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  398. package/dist/providers/coding-proxy/interrupted.js +104 -0
  399. package/dist/providers/coding-proxy/mcp-route.d.ts +34 -0
  400. package/dist/providers/coding-proxy/mcp-route.js +166 -0
  401. package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -2
  402. package/dist/providers/coding-proxy/memory-ledger.js +99 -8
  403. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  404. package/dist/providers/coding-proxy/metering.js +27 -4
  405. package/dist/providers/coding-proxy/prisma-ledger.d.ts +16 -2
  406. package/dist/providers/coding-proxy/prisma-ledger.js +209 -69
  407. package/dist/providers/coding-proxy/proxy.d.ts +21 -2
  408. package/dist/providers/coding-proxy/proxy.js +300 -48
  409. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  410. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  411. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  412. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  413. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  414. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  415. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  416. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  417. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  418. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  419. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  420. package/dist/providers/coding-proxy/registry/service.js +579 -112
  421. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  422. package/dist/providers/coding-proxy/registry/store.js +54 -1
  423. package/dist/providers/coding-proxy/runtime.d.ts +10 -0
  424. package/dist/providers/coding-proxy/runtime.js +109 -16
  425. package/dist/providers/coding-proxy/server.d.ts +9 -1
  426. package/dist/providers/coding-proxy/server.js +55 -1
  427. package/dist/providers/coding-proxy/types.d.ts +78 -1
  428. package/dist/providers/datastore/types.d.ts +5 -0
  429. package/dist/providers/engine/types.d.ts +17 -2
  430. package/dist/providers/engine/types.js +17 -0
  431. package/dist/providers/executor/composition.d.ts +10 -3
  432. package/dist/providers/executor/composition.js +52 -7
  433. package/dist/providers/executor/container.d.ts +394 -9
  434. package/dist/providers/executor/container.js +1210 -96
  435. package/dist/providers/executor/dbos-status.d.ts +31 -0
  436. package/dist/providers/executor/dbos-status.js +64 -0
  437. package/dist/providers/executor/dbos.d.ts +50 -1
  438. package/dist/providers/executor/dbos.js +207 -20
  439. package/dist/providers/executor/deferred.d.ts +12 -24
  440. package/dist/providers/executor/deferred.js +10 -29
  441. package/dist/providers/executor/in-process.d.ts +9 -1
  442. package/dist/providers/executor/in-process.js +14 -4
  443. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  444. package/dist/providers/executor/linked-issue-reader.js +30 -0
  445. package/dist/providers/executor/routing.d.ts +2 -0
  446. package/dist/providers/executor/routing.js +4 -0
  447. package/dist/providers/executor/types.d.ts +13 -0
  448. package/dist/providers/host-tools/invoke.d.ts +37 -0
  449. package/dist/providers/host-tools/invoke.js +117 -0
  450. package/dist/providers/host-tools/operations.d.ts +65 -0
  451. package/dist/providers/host-tools/operations.js +149 -0
  452. package/dist/providers/host-tools/registry.d.ts +79 -0
  453. package/dist/providers/host-tools/registry.js +362 -0
  454. package/dist/providers/host-tools/request-guard.d.ts +17 -0
  455. package/dist/providers/host-tools/request-guard.js +99 -0
  456. package/dist/providers/host-tools/self-test.d.ts +64 -0
  457. package/dist/providers/host-tools/self-test.js +142 -0
  458. package/dist/providers/index.d.ts +2 -1
  459. package/dist/providers/issue-tracker/types.d.ts +17 -0
  460. package/dist/providers/issue-tracker/types.js +39 -1
  461. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  462. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  463. package/dist/providers/jobs/docker-isolation.d.ts +10 -2
  464. package/dist/providers/jobs/docker-isolation.js +47 -8
  465. package/dist/providers/jobs/docker.d.ts +9 -0
  466. package/dist/providers/jobs/docker.js +60 -11
  467. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  468. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  469. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  470. package/dist/providers/jobs/kubernetes-api.js +10 -0
  471. package/dist/providers/jobs/kubernetes-client.js +10 -1
  472. package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
  473. package/dist/providers/jobs/kubernetes-isolation.js +32 -3
  474. package/dist/providers/jobs/kubernetes.d.ts +11 -1
  475. package/dist/providers/jobs/kubernetes.js +111 -17
  476. package/dist/providers/jobs/types.d.ts +39 -0
  477. package/dist/providers/jobs/types.js +13 -1
  478. package/dist/providers/llm/anthropic.js +5 -1
  479. package/dist/providers/llm/bedrock.d.ts +0 -12
  480. package/dist/providers/llm/bedrock.js +4 -0
  481. package/dist/providers/llm/claude-messages.d.ts +3 -1
  482. package/dist/providers/llm/claude-messages.js +4 -1
  483. package/dist/providers/llm/claude-provider.d.ts +2 -2
  484. package/dist/providers/llm/claude-provider.js +2 -2
  485. package/dist/providers/llm/openai.d.ts +2 -2
  486. package/dist/providers/llm/openai.js +6 -2
  487. package/dist/providers/llm/routing.d.ts +2 -2
  488. package/dist/providers/llm/routing.js +2 -2
  489. package/dist/providers/llm/types.d.ts +12 -2
  490. package/dist/providers/review-host/github-events.d.ts +9 -1
  491. package/dist/providers/review-host/github-events.js +34 -12
  492. package/dist/providers/review-host/github.d.ts +29 -2
  493. package/dist/providers/review-host/github.js +224 -29
  494. package/dist/providers/review-host/local.d.ts +8 -4
  495. package/dist/providers/review-host/local.js +49 -31
  496. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  497. package/dist/providers/review-host/patch-pages.js +176 -0
  498. package/dist/providers/review-host/review-format.d.ts +19 -1
  499. package/dist/providers/review-host/review-format.js +38 -7
  500. package/dist/providers/review-host/types.d.ts +140 -6
  501. package/dist/providers/review-host/types.js +9 -1
  502. package/dist/providers/storage/gcs.d.ts +63 -0
  503. package/dist/providers/storage/gcs.js +69 -0
  504. package/dist/providers/storage/index.d.ts +15 -0
  505. package/dist/providers/storage/index.js +14 -0
  506. package/dist/providers/storage/local.d.ts +24 -0
  507. package/dist/providers/storage/local.js +92 -0
  508. package/dist/providers/storage/meter.d.ts +14 -0
  509. package/dist/providers/storage/meter.js +34 -0
  510. package/dist/providers/storage/s3.d.ts +41 -0
  511. package/dist/providers/storage/s3.js +107 -0
  512. package/dist/providers/storage/types.d.ts +37 -3
  513. package/dist/providers/storage/types.js +21 -4
  514. package/dist/providers/vcs/git.d.ts +39 -4
  515. package/dist/providers/vcs/git.js +339 -26
  516. package/dist/providers/vcs/github-remote.d.ts +26 -3
  517. package/dist/providers/vcs/github-remote.js +124 -14
  518. package/dist/providers/vcs/github.d.ts +183 -44
  519. package/dist/providers/vcs/github.js +455 -56
  520. package/dist/providers/vcs/index.d.ts +1 -1
  521. package/dist/providers/vcs/index.js +9 -2
  522. package/dist/providers/vcs/pr-description.d.ts +127 -0
  523. package/dist/providers/vcs/pr-description.js +270 -0
  524. package/dist/providers/vcs/remote.d.ts +37 -1
  525. package/dist/providers/vcs/remote.js +7 -1
  526. package/dist/providers/vcs/routing.d.ts +16 -8
  527. package/dist/providers/vcs/routing.js +27 -6
  528. package/dist/providers/vcs/types.d.ts +150 -5
  529. package/dist/quickstart/coding-seed.d.ts +14 -3
  530. package/dist/quickstart/coding-seed.js +213 -4
  531. package/dist/quickstart/index.d.ts +5 -0
  532. package/dist/quickstart/index.js +21 -0
  533. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  534. package/dist/quickstart/reviewer-prompt.js +6 -6
  535. package/dist/quickstart-images.json +1 -1
  536. package/dist/sandbox/eval-core.d.ts +12 -2
  537. package/dist/sandbox/eval-core.js +20 -4
  538. package/dist/sandbox/generated/zod.bundle.js +62 -1
  539. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  540. package/dist/sandbox/host-functions.d.ts +5 -0
  541. package/dist/sandbox/host-functions.js +13 -13
  542. package/dist/sandbox/limits.d.ts +4 -1
  543. package/dist/sandbox/limits.js +4 -1
  544. package/dist/sandbox/run-in-sandbox.d.ts +6 -0
  545. package/dist/sandbox/run-in-sandbox.js +14 -2
  546. package/dist/sandbox/safe-fetch.d.ts +2 -0
  547. package/dist/sandbox/safe-fetch.js +1 -1
  548. package/dist/sandbox/secret-broker.d.ts +1 -0
  549. package/dist/sandbox/secret-broker.js +4 -5
  550. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  551. package/dist/sandbox/tool-timeout.d.ts +32 -0
  552. package/dist/sandbox/tool-timeout.js +52 -0
  553. package/dist/sandbox/user-tool.d.ts +8 -1
  554. package/dist/sandbox/user-tool.js +9 -3
  555. package/dist/sandbox/zod-params.d.ts +37 -5
  556. package/dist/sandbox/zod-params.js +181 -26
  557. package/dist/serve.js +8 -1
  558. package/dist/viewer/api-schema.d.ts +349 -2627
  559. package/dist/viewer/api-schema.js +7 -0
  560. package/dist/viewer/build-schemas.js +6 -2
  561. package/dist/viewer/graph.js +2 -1
  562. package/dist/viewer/openapi.js +2 -4
  563. package/dist/wardby-bin.js +15 -0
  564. package/docs/README.md +11 -1
  565. package/docs/agent-recipes.md +95 -24
  566. package/docs/architecture-runtime.md +1 -1
  567. package/docs/claude-code-plugin.md +164 -0
  568. package/docs/code-review-agents.md +557 -41
  569. package/docs/coding-agent-setup.md +566 -8
  570. package/docs/coding-packages.md +1033 -90
  571. package/docs/coding-services.md +27 -12
  572. package/docs/coding-worker-byo-images.md +24 -2
  573. package/docs/coding-worker-isolation.md +183 -37
  574. package/docs/debugging-agent-runs.md +242 -0
  575. package/docs/getting-started-gke.md +129 -141
  576. package/docs/getting-started-identity-provider.md +53 -38
  577. package/docs/getting-started.md +17 -0
  578. package/docs/host-providers.md +294 -0
  579. package/docs/jira-agents.md +17 -8
  580. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  581. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  582. package/docs/knowledge/delegation-admission-slots.md +52 -0
  583. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  584. package/docs/knowledge/import-rename-target.md +52 -0
  585. package/docs/knowledge/index.md +57 -0
  586. package/docs/knowledge/log.md +9 -0
  587. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  588. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  589. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  590. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  591. package/docs/knowledge/overview-cli.md +74 -0
  592. package/docs/knowledge/overview-coding-proxy.md +72 -0
  593. package/docs/knowledge/overview-coding.md +72 -0
  594. package/docs/knowledge/overview-config.md +60 -0
  595. package/docs/knowledge/overview-core.md +72 -0
  596. package/docs/knowledge/overview-deploy.md +83 -0
  597. package/docs/knowledge/overview-mcp.md +61 -0
  598. package/docs/knowledge/overview-prisma.md +72 -0
  599. package/docs/knowledge/overview-providers.md +89 -0
  600. package/docs/knowledge/overview-sandbox.md +83 -0
  601. package/docs/knowledge/overview-surfaces.md +83 -0
  602. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  603. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  604. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  605. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  606. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  607. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  608. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  609. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  610. package/docs/knowledge/warm-input-publication.md +30 -0
  611. package/docs/knowledge/workspace-staging-failure.md +54 -0
  612. package/docs/knowledge.md +54 -14
  613. package/docs/mcp-servers.md +254 -0
  614. package/docs/native-sandbox.md +143 -31
  615. package/docs/observability.md +4 -0
  616. package/docs/security-deployment.md +139 -29
  617. package/docs/slack-notifications.md +35 -19
  618. package/docs/tool-secrets.md +45 -10
  619. package/docs/viewer-api.md +6 -0
  620. package/docs/viewer-api.openapi.yml +1 -1
  621. package/help/admin-viewer.md +28 -2
  622. package/help/agent-recipes.md +33 -2
  623. package/help/architecture-agent.md +11 -6
  624. package/help/brokered-secrets.md +3 -0
  625. package/help/build-claude-code-image.md +1 -1
  626. package/help/build-worker-image.md +3 -1
  627. package/help/builder-agent.md +19 -6
  628. package/help/claude-code-run-pane.md +40 -0
  629. package/help/code-review-agents.md +177 -6
  630. package/help/coding-packages.md +156 -6
  631. package/help/cost-attribution.md +9 -5
  632. package/help/creating-agents.md +14 -1
  633. package/help/dependency-cache.md +143 -0
  634. package/help/deploy-gke.md +15 -8
  635. package/help/errors/budget-exhausted.md +187 -0
  636. package/help/errors/budget-group-exhausted.md +5 -1
  637. package/help/errors/coding-mcp-pins-unavailable.md +35 -0
  638. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  639. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  640. package/help/errors/continuation-closed.md +9 -12
  641. package/help/errors/database-auth-invalid.md +1 -1
  642. package/help/errors/delegation-conflict.md +24 -0
  643. package/help/errors/file-list-truncated.md +45 -0
  644. package/help/errors/full-read-required.md +49 -0
  645. package/help/errors/github-account-not-allowed.md +4 -0
  646. package/help/errors/graph-incomplete.md +43 -0
  647. package/help/errors/graph-limit.md +43 -0
  648. package/help/errors/host-provider-error.md +40 -0
  649. package/help/errors/host-tool-failed.md +36 -0
  650. package/help/errors/mcp-call-limit.md +22 -0
  651. package/help/errors/mcp-call-timeout.md +22 -0
  652. package/help/errors/mcp-server-auth-failed.md +22 -0
  653. package/help/errors/mcp-server-credentials-unavailable.md +45 -0
  654. package/help/errors/mcp-server-error.md +28 -0
  655. package/help/errors/mcp-server-unreachable.md +22 -0
  656. package/help/errors/mcp-servers-off.md +21 -0
  657. package/help/errors/mcp-tool-not-allowed.md +26 -0
  658. package/help/errors/mcp-tool-removed.md +22 -0
  659. package/help/errors/mcp-unavailable.md +25 -0
  660. package/help/errors/merge-conflict.md +49 -0
  661. package/help/errors/native-sandbox-capacity.md +1 -1
  662. package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
  663. package/help/errors/native-sandbox-docker-failed.md +1 -1
  664. package/help/errors/native-sandbox-gateway-error.md +20 -0
  665. package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
  666. package/help/errors/native-sandbox-image-not-pinned.md +1 -1
  667. package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
  668. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  669. package/help/errors/native-sandbox-network-unenforced.md +1 -1
  670. package/help/errors/native-sandbox-requires-catalog.md +1 -1
  671. package/help/errors/native-sandbox-unavailable.md +1 -1
  672. package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
  673. package/help/errors/native-sandbox-worker-exited.md +4 -3
  674. package/help/errors/native-sandbox-worker-lost.md +1 -1
  675. package/help/errors/native-sandbox-worker-unready.md +1 -1
  676. package/help/errors/package-not-allowed-pending.md +52 -0
  677. package/help/errors/package-not-allowed.md +51 -0
  678. package/help/errors/package-refusals.md +43 -0
  679. package/help/errors/patch-cursor-malformed.md +31 -0
  680. package/help/errors/repository-not-listed.md +36 -0
  681. package/help/errors/repository-required.md +36 -0
  682. package/help/errors/run-lost.md +39 -0
  683. package/help/errors/run-transcript-download.md +44 -0
  684. package/help/errors/secret-in-value.md +69 -0
  685. package/help/errors/target-merge.md +40 -0
  686. package/help/errors/tool-timeout.md +38 -0
  687. package/help/fix-merge-conflicts.md +73 -0
  688. package/help/github-app-setup.md +132 -0
  689. package/help/github.md +22 -0
  690. package/help/host-providers.md +40 -0
  691. package/help/identity-and-access.md +6 -1
  692. package/help/jira.md +23 -6
  693. package/help/knowledge.md +16 -7
  694. package/help/local-repositories.md +1 -1
  695. package/help/low-power-mode.md +7 -1
  696. package/help/mcp-servers.md +73 -0
  697. package/help/mcp.md +7 -2
  698. package/help/merge-order-check.md +5 -0
  699. package/help/native-capabilities.md +55 -1
  700. package/help/native-sandbox.md +16 -2
  701. package/help/operating-agents.md +21 -0
  702. package/help/package-audit-mode.md +91 -0
  703. package/help/related-pull-requests.md +17 -10
  704. package/help/repo-instructions-and-skills.md +3 -1
  705. package/help/resume-runs-locally.md +134 -0
  706. package/help/review-fix-rounds.md +33 -1
  707. package/help/sharing-agents.md +59 -0
  708. package/help/slack-notifications.md +19 -5
  709. package/help/status-comments.md +31 -0
  710. package/help/stop-run.md +58 -0
  711. package/help/troubleshooting/budgets.md +28 -0
  712. package/help/troubleshooting/coding-workers.md +86 -7
  713. package/help/troubleshooting/debugging-agent-runs.md +29 -0
  714. package/package.json +18 -10
  715. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  716. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  717. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  718. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  719. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  720. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  721. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  722. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  723. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  724. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  725. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  726. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  727. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  728. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  729. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  730. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  731. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  732. package/prisma/migrations/20261102000000_host_providers/migration.sql +56 -0
  733. package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
  734. package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
  735. package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
  736. package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
  737. package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
  738. package/prisma/schema.prisma +468 -109
  739. package/scripts/git-askpass.sh +1 -1
  740. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -54,26 +54,27 @@ access tokens for that audience.
54
54
 
55
55
  Create these scopes in the provider:
56
56
 
57
- | Scope | Capability |
58
- | --------------------- | ------------------------------------------------------------------ |
59
- | `agents:read` | Inspect agents, models, runs, memory, and attached resources. |
60
- | `agents:write` | Create and modify agents, schedules, and sub-agent relationships. |
61
- | `runs:trigger` | Start agent runs. |
62
- | `tools:write` | Create, attach, and manage tools. |
63
- | `datastore:write` | Create, attach, query, and modify datastores. |
64
- | `secrets:write` | Create, attach, rotate, and remove secret bindings. |
65
- | `webhooks:write` | Create and manage webhook triggers. |
66
- | `budget_groups:write` | Create and manage shared budget groups. |
67
- | `packages:approve` | Approve coding agents' package allowlists. |
68
- | `services:manage` | Create, update and delete coding-run service catalog entries. |
69
- | `agents:admin` | Reassign agent ownership, BYO worker images; admins only. |
70
- | `memory:write` | Set and delete agent memory entries. |
71
- | `admin:view` | Read every owner's runs through the admin viewer API; admins only. |
72
- | `models:admin` | Add, override, disable and reset model catalog entries. |
73
- | `power:manage` | Read low-power state and sleep the proxy/gateway now; admins only. |
57
+ | Scope | Capability |
58
+ | --------------------- | ------------------------------------------------------------------------------- |
59
+ | `agents:read` | Inspect agents, models, runs, memory, and attached resources. |
60
+ | `agents:write` | Create and modify agents, schedules, and sub-agent relationships. |
61
+ | `runs:trigger` | Start agent runs. |
62
+ | `tools:write` | Create, attach, and manage tools. |
63
+ | `datastore:write` | Create, attach, query, and modify datastores. |
64
+ | `secrets:write` | Create, attach, rotate, and remove secret bindings. |
65
+ | `webhooks:write` | Create and manage webhook triggers. |
66
+ | `budget_groups:write` | Create and manage shared budget groups. |
67
+ | `packages:approve` | Approve coding agents' package allowlists. |
68
+ | `services:manage` | Create, update and delete coding-run service catalog entries. |
69
+ | `agents:admin` | Reassign agent ownership, BYO worker images; admins only. |
70
+ | `memory:write` | Set and delete agent memory entries. |
71
+ | `admin:view` | Read every owner's runs through the admin viewer API; admins only. |
72
+ | `models:admin` | Add, override, disable and reset model catalog entries. |
73
+ | `power:manage` | Read low-power state and sleep the proxy/gateway now; admins only. |
74
+ | `hosts:admin` | Register host providers and approve their tools; admins and host managers only. |
74
75
 
75
76
  MCP clients discover this list from Wardby's protected-resource metadata and
76
- may request every advertised scope. Define all fifteen in the provider even when
77
+ may request every advertised scope. Define all sixteen in the provider even when
77
78
  policy grants a particular client or user only a subset. Ensure granted scopes
78
79
  are emitted in the access token's `scope` or `scp` claim; defining them only in
79
80
  the provider UI is not sufficient.
@@ -97,24 +98,29 @@ every advertised scope fail with `invalid_scope`.
97
98
  deployment, define it in the provider too and map it like `agents:admin`;
98
99
  otherwise clients that request every advertised scope fail with `invalid_scope`.
99
100
 
101
+ `hosts:admin` was added after `power:manage`. When you upgrade an existing
102
+ deployment, define it in the provider too and map it like `agents:admin`;
103
+ otherwise clients that request every advertised scope fail with `invalid_scope`.
104
+
100
105
  ### Wardby roles
101
106
 
102
107
  A scope only delegates. `agents:admin`, `packages:approve`, `services:manage`,
103
- `admin:view`, `models:admin` and `power:manage` take effect only for a caller who also holds a Wardby role that grants them:
108
+ `admin:view`, `models:admin`, `power:manage` and `hosts:admin` take effect only for a caller who also holds a Wardby role that grants them:
104
109
 
105
- | Wardby role | Grants |
106
- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
107
- | `admin` | `agents:admin` (`make_owner`, BYO `workerImageRef`), `packages:approve`, `services:manage`, `admin:view` (read every owner's runs, see [viewer-api.md](viewer-api.md)), `models:admin` (model catalog) and `power:manage` (`power_status`, `power_sleep`; see [getting-started-gke.md](getting-started-gke.md#low-power-mode)) |
108
- | `package-approver` | `packages:approve` (package allowlist and policy approval) |
109
- | `service-manager` | `services:manage` (coding-run service catalog changes) |
110
- | `model-manager` | `models:admin` (model catalog changes: `set_model`, `disable_model`, `reset_model`; see [models.md](models.md)) |
110
+ | Wardby role | Grants |
111
+ | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
112
+ | `admin` | `agents:admin` (`make_owner`, BYO `workerImageRef`), `packages:approve`, `services:manage`, `admin:view` (read every owner's runs, see [viewer-api.md](viewer-api.md)), `models:admin` (model catalog), `hosts:admin` (host providers) and `power:manage` (`power_status`, `power_sleep`; see [getting-started-gke.md](getting-started-gke.md#low-power-mode)) |
113
+ | `package-approver` | `packages:approve` (package allowlist and policy approval) |
114
+ | `service-manager` | `services:manage` (coding-run service catalog changes) |
115
+ | `model-manager` | `models:admin` (model catalog changes: `set_model`, `disable_model`, `reset_model`; see [models.md](models.md)) |
116
+ | `host-manager` | `hosts:admin` (`register_host_provider`, `approve_host_provider_tools`, `test_host_provider`; see [host-providers.md](host-providers.md)) |
111
117
 
112
118
  The roles come from a claim in the caller's **access token**, which you map to
113
119
  Wardby roles:
114
120
 
115
121
  ```dotenv
116
122
  AUTH_ROLE_CLAIM=groups # claim name or dotted path
117
- AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager
123
+ AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager,wardby-hosts=host-manager
118
124
  ```
119
125
 
120
126
  Wardby looks up `AUTH_ROLE_CLAIM` in two steps:
@@ -162,20 +168,20 @@ their next token.
162
168
 
163
169
  Provider examples:
164
170
 
165
- - **Okta** (custom authorization server): create four groups, `wardby-admin`,
166
- `wardby-packages`, `wardby-services` and `wardby-models`. Add a `groups` claim
171
+ - **Okta** (custom authorization server): create five groups, `wardby-admin`,
172
+ `wardby-packages`, `wardby-services`, `wardby-models` and `wardby-hosts`. Add a `groups` claim
167
173
  to the access token, filtered to those groups. Set `AUTH_ROLE_CLAIM=groups` and
168
- `AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager`.
174
+ `AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager,wardby-hosts=host-manager`.
169
175
  Optionally, add access policy rules so only those groups can obtain
170
- `agents:admin`, `packages:approve`, `services:manage`, `admin:view`, `models:admin` and `power:manage`.
171
- - **FusionAuth:** create four application roles, `admin`,
172
- `package-approver`, `service-manager` and `model-manager`. They appear in the
176
+ `agents:admin`, `packages:approve`, `services:manage`, `admin:view`, `models:admin`, `power:manage` and `hosts:admin`.
177
+ - **FusionAuth:** create five application roles, `admin`,
178
+ `package-approver`, `service-manager`, `model-manager` and `host-manager`. They appear in the
173
179
  access token's top-level `roles` claim. Set `AUTH_ROLE_CLAIM=roles` and
174
- `AUTH_ROLE_MAP=admin=admin,package-approver=package-approver,service-manager=service-manager,model-manager=model-manager`.
180
+ `AUTH_ROLE_MAP=admin=admin,package-approver=package-approver,service-manager=service-manager,model-manager=model-manager,host-manager=host-manager`.
175
181
  - **Keycloak:** create realm roles such as `wardby-admin`, `wardby-packages`,
176
- `wardby-services` and `wardby-models`. Realm roles appear under
182
+ `wardby-services`, `wardby-models` and `wardby-hosts`. Realm roles appear under
177
183
  `realm_access.roles`. Set `AUTH_ROLE_CLAIM=realm_access.roles` and
178
- `AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager`.
184
+ `AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager,wardby-hosts=host-manager`.
179
185
  For client roles, use `resource_access.<client-id>.roles`. The
180
186
  [local Keycloak harness](../deploy/keycloak-test/README.md) sets this up.
181
187
  - **Auth0:** add the user's roles to the access token as a namespaced custom
@@ -190,7 +196,10 @@ that case, register the MCP client manually as a **public/native application**:
190
196
 
191
197
  - require authorization code flow with PKCE S256;
192
198
  - do not issue or embed a client secret in a desktop client;
193
- - register the client's exact loopback callback URI; and
199
+ - register the client's exact loopback callback URI;
200
+ - enable the refresh-token grant and allow the `offline_access` scope, so the
201
+ client receives a refresh token (desktop clients need one to keep a session);
202
+ and
194
203
  - allow it to request the Wardby audience and scopes.
195
204
 
196
205
  To let the Wardby mobile app sign in, also register its private-use redirect
@@ -212,6 +221,12 @@ public client ID. If a client supports only dynamic registration, either enable
212
221
  that feature with suitable provider-side restrictions or use Wardby's
213
222
  self-hosted authentication mode.
214
223
 
224
+ The Wardby viewer desktop app signs in on a fixed loopback callback,
225
+ `http://127.0.0.1:8585/callback`; register that exact URI on its public/native
226
+ client. Some providers match a loopback redirect by its exact port rather than
227
+ the port-agnostic rule of RFC 8252 §7.3 — for those, this precise port must be
228
+ registered, because a port-less or wildcard loopback entry will not match it.
229
+
215
230
  ## 4. Configure Wardby
216
231
 
217
232
  Inject these settings through the deployment's secret/configuration mechanism:
@@ -227,7 +242,7 @@ AUTH_JWKS_URI=https://identity.example.com/your-tenant/.well-known/jwks.json
227
242
  AUTH_AUDIENCE=https://wardby.example.com/mcp
228
243
  # Optional: Wardby roles (see "Wardby roles" above).
229
244
  AUTH_ROLE_CLAIM=groups
230
- AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager
245
+ AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager,wardby-hosts=host-manager
231
246
  ```
232
247
 
233
248
  Copy `AUTH_ISSUER` exactly from the token's `iss` claim or the provider's
@@ -263,7 +278,7 @@ Confirm that:
263
278
 
264
279
  - `resource` is the canonical MCP URI;
265
280
  - `authorization_servers` contains the external issuer; and
266
- - `scopes_supported` contains all fifteen Wardby scopes.
281
+ - `scopes_supported` contains all sixteen Wardby scopes.
267
282
 
268
283
  An unauthenticated MCP request must return `401` with a `WWW-Authenticate`
269
284
  challenge pointing back to that metadata document.
@@ -238,6 +238,13 @@ After connecting, try:
238
238
  > List my Wardby agents, show the latest run and its actual cost, then create a
239
239
  > new agent with a maximum budget of $0.50. Do not run it yet.
240
240
 
241
+ From Wardby 0.8.0, Claude Code can also show your runs in a pane beside the
242
+ chat. With `--client claude` or `both`, quickstart offers to install it
243
+ (`--claude-plugin` installs it unattended, `--no-claude-plugin` skips the
244
+ question); otherwise run `npx @wardby/cli@latest claude-plugin install`, then
245
+ `/wardby-runs`. `wardby doctor` reports whether it is set up. See the
246
+ [Claude Code plugin](claude-code-plugin.md) guide.
247
+
241
248
  ### Reasoning effort
242
249
 
243
250
  A native agent can set `effort` (`low`, `medium`, `high`, `xhigh`, or `max`)
@@ -422,6 +429,15 @@ along with the database. See
422
429
  run does, its requirements (the server must run on the same machine as the
423
430
  folders) and its limits (no submodules or Git LFS).
424
431
 
432
+ #### Faster installs: the dependency cache
433
+
434
+ For an npm repository, the coding proxy can keep `node_modules` snapshots so a
435
+ run starts with its dependencies already installed. Add
436
+ `WARDBY_DEPENDENCY_CACHE=true` to `.wardby/.env`, restart the stack, then set
437
+ `codingProfile.dependencyCache` to `true` on the agent with `update_agent`. This
438
+ needs wardby 0.7.0 or later; snapshots live on a Docker volume that
439
+ `down -v` removes. See [Dependency cache](coding-packages.md#dependency-cache).
440
+
425
441
  ## Your first agents
426
442
 
427
443
  [Agent recipes](agent-recipes.md) gives two complete, copyable setups: an
@@ -455,6 +471,7 @@ help article.
455
471
  ## Next steps
456
472
 
457
473
  - [Agent recipes](agent-recipes.md)
474
+ - [Claude Code plugin](claude-code-plugin.md): your runs beside the chat (0.8.0+)
458
475
  - [Runtime architecture](architecture-runtime.md)
459
476
  - [Coding-agent setup](coding-agent-setup.md) and its
460
477
  [local repositories](coding-agent-setup.md#local-repositories) section
@@ -0,0 +1,294 @@
1
+ # Host providers
2
+
3
+ A host provider adds a code host to Wardby using your own custom tools. You can add
4
+ a host, or fix one, without a Wardby release.
5
+
6
+ Host providers are being added in stages. **This release (0.8.0) lets you register a
7
+ provider, approve its tools and test them. Agents can't use a registered provider yet**,
8
+ and `link_repository` still refuses its repositories.
9
+
10
+ ## Who can manage one
11
+
12
+ Every host provider tool (`register_host_provider`, `approve_host_provider_tools`,
13
+ `get_host_provider`, `test_host_provider`, `delete_host_provider`) needs the
14
+ `hosts:admin` scope and a role that grants it (`admin` or `host-manager`), or the local
15
+ stdio operator. Bound tools decide who has permission and who wrote a comment, so treat
16
+ this like `agents:admin`. See
17
+ [getting-started-identity-provider.md](getting-started-identity-provider.md#wardby-roles)
18
+ for defining the scope and mapping the role.
19
+
20
+ Providers are shared by every host manager: any host manager can read and re-register any
21
+ provider, including its tool code, whoever owns the tools it names.
22
+
23
+ ## Register a provider
24
+
25
+ 1. Create a tool for each operation with `create_tool`. Each does one host call. See
26
+ [Tool contract](#tool-contract).
27
+ 2. Store each credential with `create_secret`, and broker it with `set_secret_broker`
28
+ ([tool-secrets.md](tool-secrets.md)). Allow every API host and place it in a header or
29
+ query parameter. Repository credentials also allow the git host; the permission
30
+ credential needs only the API hosts.
31
+ 3. Store a webhook secret of at least 16 characters. Don't attach it to any agent.
32
+ 4. Call `register_host_provider`:
33
+
34
+ ```json
35
+ {
36
+ "provider": "your-host",
37
+ "gitHost": "git.example.com",
38
+ "apiHosts": ["api.example.com"],
39
+ "gitUsername": "x-token-auth",
40
+ "pullRequestUrlTemplate": "https://git.example.com/{repository}/pull/{number}",
41
+ "repositoryApiPath": "/2.0/repositories/{repository}",
42
+ "webhook": {
43
+ "header": "X-Hub-Signature",
44
+ "algorithm": "sha256",
45
+ "deliveryHeader": "X-Request-UUID",
46
+ "eventHeader": "X-Event-Key",
47
+ "secret": "your-webhook-secret"
48
+ },
49
+ "credentials": [{ "repositories": "your-workspace/*", "secret": "your-token" }],
50
+ "trustedAccounts": ["<account id>"],
51
+ "tools": { "getPullRequest": "your_get_pr_tool" }
52
+ }
53
+ ```
54
+
55
+ Bind every required operation in `tools` (names here are placeholders), and any optional
56
+ ones you want. For example:
57
+
58
+ ```json
59
+ "tools": {
60
+ "getPullRequest": "your_get_pr", "listPullRequestFiles": "your_list_files",
61
+ "getDiff": "your_get_diff", "readFile": "your_read_file", "listFiles": "your_list_dir",
62
+ "listComments": "your_list_comments", "createComment": "your_create_comment",
63
+ "submitVerdict": "your_submit_verdict", "findPullRequest": "your_find_pr",
64
+ "openPullRequest": "your_open_pr", "updatePullRequest": "your_update_pr"
65
+ }
66
+ ```
67
+
68
+ 5. No restart is needed in this release, because agents can't use a provider yet. Once they
69
+ can, a new provider will need a server restart; approvals won't.
70
+
71
+ The tools and secrets you name must be yours. Secret rules, each refused with a named code:
72
+
73
+ - Credentials and `permissionCredential` must be brokered, placed in a header or query
74
+ parameter, and allowed on the API hosts (credentials also on the git host; the permission credential needs only the API hosts).
75
+ - `permissionCredential` can't also be listed in `credentials`
76
+ (`host_provider_permission_secret_shared`), so no other operation can reach it.
77
+ - The webhook secret can't be a credential or permission secret of any provider, and can't
78
+ be attached to an agent (`host_provider_webhook_secret_shared`). `attach_secret` refuses
79
+ it too.
80
+ - The webhook secret needs at least 16 characters (`host_provider_webhook_secret_short`).
81
+ - A permission secret can't be a credential or permission secret of any other provider, and a
82
+ credential can't be another provider's permission secret
83
+ (`host_provider_permission_secret_shared`).
84
+ - `gitUsername` can't be a credential's value and can't contain "username".
85
+ - `pullRequestUrlTemplate` is an https URL on `gitHost`, with no username, password or port.
86
+
87
+ Keep provider credentials unattached. A brokered credential attached to one of its owner's agents
88
+ can be used by that agent's tools without the host provider path guard, which only applies to a
89
+ provider's bound tools.
90
+
91
+ See [the refusal codes](../help/errors/host-provider-error.md) for what each one means.
92
+
93
+ These provider names can't be used: `github`, `local`, `http`, `https`, `ssh`, `git`,
94
+ `file` and `constructor`. Names match `^[a-z][a-z0-9-]{1,30}$`.
95
+
96
+ These operations are required: `getPullRequest`, `listPullRequestFiles`, `getDiff`,
97
+ `readFile`, `listFiles`, `listComments`, `createComment`, `submitVerdict`,
98
+ `findPullRequest`, `openPullRequest` and `updatePullRequest`. These are optional:
99
+ `editComment`, `resolveThread`, `listCommitStatuses`, `setCommitStatus`,
100
+ `getRepositoryPermission` and `normalizeEvent`. `getRepositoryPermission` becomes required
101
+ when you set `permissionCredential`.
102
+
103
+ ## Who may start a run
104
+
105
+ This is how it will work once agents can use a provider. Registering records your choice
106
+ now; nothing enforces it in this release.
107
+
108
+ | Setup | Situation | Result |
109
+ | ------------------------- | ---------------------------------------- | --------------------------------- |
110
+ | `permissionCredential` | The host says the user has enough access | Run starts |
111
+ | `permissionCredential` | The host says they don't | Refused, even if in the allowlist |
112
+ | `permissionCredential` | The lookup fails | Refused, with no fallback |
113
+ | No `permissionCredential` | The user is in `trustedAccounts` | Run starts, at `write` level |
114
+ | No `permissionCredential` | The user isn't in `trustedAccounts` | Refused |
115
+
116
+ `permissionCredential` needs `permissionApiPath` (with `{workspace}` and `{repo}`) and a
117
+ bound `getRepositoryPermission`.
118
+
119
+ ## Change a tool
120
+
121
+ Registering copies each tool's code, schema and `timeoutMs` (its time limit), and only that
122
+ copy ever runs.
123
+ `update_tool` changes nothing until you approve it, so the last approved version keeps
124
+ working in the meantime.
125
+
126
+ 1. Call `update_tool`.
127
+ 2. Call `get_host_provider` with `includeCode: true`. Changed tools show `status: "changed"`.
128
+ Each operation has `approvedCode` and `approvedParamsZod`, and a changed one also has
129
+ `currentCode` and `currentParamsZod`, because a change can be to the schema alone. Every
130
+ operation also shows `approvedTimeoutMs` and `currentTimeoutMs` (`null` is the default
131
+ 10 seconds), since a change can be to the time limit alone.
132
+ 3. Read the change, then call `approve_host_provider_tools` with the operation names. It
133
+ applies from the next call.
134
+
135
+ Deleting a tool keeps its snapshot running, with `status: "tool_deleted"`. To change that
136
+ operation, bind a new tool by registering again. Registering again also approves every tool
137
+ at its current code.
138
+
139
+ ## Rotate a secret
140
+
141
+ A secret a provider uses is replaced with `create_secret` under the same name, whether it's a
142
+ credential, the permission credential or the webhook secret. Change its broker config with
143
+ `set_secret_broker`. Both need `hosts:admin` with a role that grants it, as well as
144
+ `secrets:write`, and refuse before handing out a browser link. Without brokering a credential
145
+ stops working, so `set_secret_broker` with `broker: null` also breaks the provider.
146
+
147
+ Only the secret's owner can rotate it this way, because secret names belong to their owner. If
148
+ another host manager calls `create_secret` with the same name, they get a separate secret and the
149
+ provider keeps the old value. They must register the provider again with their own secret instead.
150
+
151
+ The new webhook value needs at least 16 characters, whether you pass it directly or enter it
152
+ in the browser (`host_provider_webhook_secret_short`). A browser link requested before the secret
153
+ joined a provider is refused (`host_provider_secret_link_stale`); request a new one.
154
+
155
+ Rotating needs no re-registration: the next call uses the new value. Update the webhook secret on
156
+ the host at the same time.
157
+
158
+ ## Test a provider
159
+
160
+ `test_host_provider` runs each approved read-only tool against one repository, using the
161
+ real credential:
162
+
163
+ ```json
164
+ {
165
+ "provider": "your-host",
166
+ "repository": "your-host:your-workspace/your-repo",
167
+ "pullRequest": 4,
168
+ "headRef": "a-branch-with-a-pull-request",
169
+ "ref": "a-commit-or-branch",
170
+ "accountId": "<account id>"
171
+ }
172
+ ```
173
+
174
+ Only `provider` and `repository` are required. Each other field enables the checks that need it:
175
+
176
+ | Field | Checks it enables |
177
+ | ------------- | ----------------------------------------------------------------------------------- |
178
+ | `pullRequest` | `getPullRequest`, `listPullRequestFiles`, `getDiff`, `listComments` |
179
+ | `headRef` | `findPullRequest` |
180
+ | `ref` | `readFile`, `listFiles`, `listCommitStatuses` (defaults to the pull request's head) |
181
+ | `accountId` | `getRepositoryPermission` |
182
+
183
+ Each result is an `outcome` of `pass`, `fail` (with a fixed code, below) or `skipped`. A skip has
184
+ one of these codes: `not_bound` (no tool bound), `needs_pull_request`, `needs_head_ref`,
185
+ `needs_ref`, `needs_account` (the field above is missing), `allowlist_mode` (no
186
+ `permissionCredential`, so no permission lookup) and `not_read_only` (a write operation, never run).
187
+
188
+ Write operations are skipped. A read-only tool can only send GET requests. The report holds
189
+ an operation, an outcome and a fixed code for each, and no response data, so you can share it.
190
+
191
+ | Code | Meaning |
192
+ | --------------------------------------- | ---------------------------------------------------------------- |
193
+ | `host_unauthorized`, `host_forbidden` | The host refused the credential for this call. |
194
+ | `host_not_found` | The host doesn't have what was asked for. |
195
+ | `host_rate_limited`, `host_unavailable` | Try again later. |
196
+ | `host_conflict` | The host refused because of the current state. |
197
+ | `host_tool_invalid_result` | The tool's answer doesn't match its operation's shape. |
198
+ | `host_tool_invalid_params` | The tool's schema refused what Wardby sends it. |
199
+ | `host_tool_request_denied` | The tool went outside what a bound tool may request (see below). |
200
+ | `host_tool_no_credential` | See below. |
201
+ | `host_tool_failed` | The tool threw an error. Its message is dropped on purpose. |
202
+ | `host_tool_timeout` | The tool ran out of time or instructions. |
203
+
204
+ `host_tool_no_credential` has these causes: no credential's `repositories` covers this repository,
205
+ the secret can't be decrypted, or the secret is no longer brokered or no longer allows every API
206
+ host.
207
+
208
+ ## Tool contract
209
+
210
+ Each tool receives `workspace`, `repo` and `repository` (`workspace/repo`), plus its
211
+ operation's input fields (below). Declare them in `paramsZod`.
212
+
213
+ A tool answers with its operation's result, or `{ "error": "<code>" }` when the host refused,
214
+ where the code is `unauthorized`, `forbidden`, `not_found`, `conflict`, `rate_limited` or
215
+ `unavailable`. Results are checked strictly: an extra key, a missing key or a wrong type fails the
216
+ call with `host_tool_invalid_result`.
217
+
218
+ A pull request object, as returned by `getPullRequest` and `findPullRequest`, has exactly:
219
+ `number` (positive integer), `title`, `body`, `author` (string or null), `state` (`open` or
220
+ `closed`; a merged pull request is `closed` with `merged` true, so map your host's own states),
221
+ `merged` (boolean), `draft` (boolean), `baseRef`, `headRef`, `headSha` (non-empty), `isFork` (boolean) and
222
+ `htmlUrl` (a URL).
223
+
224
+ Read operations (method GET):
225
+
226
+ | Operation | Input fields | Result |
227
+ | ------------------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
228
+ | `getPullRequest` | `number` | A pull request object. |
229
+ | `findPullRequest` | `headRef` | `{ pullRequest }`: a pull request object, or null if none. |
230
+ | `listPullRequestFiles` | `number`, `page` | `{ files, nextPage }`. Each file: `filename`, `status` (`added`, `modified`, `removed` or `renamed`), `additions`, `deletions` (non-negative integers) and optionally `previousFilename`. |
231
+ | `getDiff` | `number` | `{ diff }`: the unified diff text. |
232
+ | `readFile` | `ref`, `path` | `{ kind: "file", content }`, `{ kind: "directory" }` or `{ kind: "not_found" }`. No other keys. |
233
+ | `listFiles` | `ref`, `path`, `page` | `{ entries, nextPage }`. Each entry: `path`, `type` (`file` or `directory`) and optionally `size` (non-negative integer). |
234
+ | `listComments` | `number`, `page` | `{ comments, nextPage }`. Each comment: `id` (non-empty), `author` and `authorId` (string or null), `body`, `createdAt`, `path` (string or null), `line` (positive integer or null), `parentId` (string or null), `resolved` (boolean). |
235
+ | `listCommitStatuses` | `ref`, `page` | `{ statuses, nextPage }`. Each status: `key`, `state` (`pending`, `success`, `failure` or `stopped`) and `url` (string or null). |
236
+ | `getRepositoryPermission` | `accountId` | `{ permission }`: `none`, `read`, `triage`, `write`, `maintain` or `admin`. Uses the permission credential and `permissionApiPath`. |
237
+
238
+ `listPullRequestFiles`, `listFiles`, `listComments` and `listCommitStatuses` page. Each returns
239
+ one page per call, with `nextPage`: a string to continue from, or null at the end. To get the next
240
+ page, Wardby passes that string back as the optional `page` input, and it leaves `page` out for the
241
+ first page. Declare `page` in `paramsZod`, because `z.object` drops keys it doesn't name, and a tool
242
+ without it would return the first page every time. `test_host_provider` reads the first page only.
243
+
244
+ `ref` is optional on `readFile` and `listFiles`, where leaving it out means the default branch, so
245
+ declare it as optional there. `listCommitStatuses` always needs one, because statuses belong to a
246
+ commit.
247
+
248
+ Keep a file's `status` to those four words: Wardby treats a `removed` file as having nothing to read
249
+ at the head.
250
+
251
+ Write operations:
252
+
253
+ | Operation | Method | Result |
254
+ | ------------------- | ------ | ---------------------------- |
255
+ | `openPullRequest` | POST | A pull request object. |
256
+ | `updatePullRequest` | PUT | A pull request object. |
257
+ | `createComment` | POST | `{ id }` (non-empty string). |
258
+ | `editComment` | PUT | `{ id }` (non-empty string). |
259
+ | `resolveThread` | POST | `{}` |
260
+ | `submitVerdict` | POST | `{}` |
261
+ | `setCommitStatus` | POST | `{}` |
262
+
263
+ The input fields of the write operations are defined when agents can use a provider, in a later
264
+ release, so tools for them may need changing then. `test_host_provider` never runs them.
265
+
266
+ `normalizeEvent` makes no requests and isn't called yet.
267
+
268
+ Use `fetch(url, { secrets: ["host"] })`. Wardby resolves `host` to the credential for this
269
+ call's repository. A bound tool:
270
+
271
+ - reaches only `apiHosts`, over https on the default port, with no embedded credentials;
272
+ - stays under `repositoryApiPath` for this repository. `getRepositoryPermission` stays under
273
+ `permissionApiPath` instead, and is the only operation that gets `permissionCredential`;
274
+ - uses its operation's method: GET for reads, and POST or PUT for writes;
275
+ - may set only the headers `accept`, `content-type`, `if-match` and `if-none-match`;
276
+ - makes at most three requests per call. No request follows a redirect, whether or not it
277
+ carries a secret: follow a `Location` yourself, which counts as a request and goes through
278
+ the same limits;
279
+ - can't send the query keys `_method` or any starting `x-http-method`, in any case, which some
280
+ frameworks read as the request's method;
281
+ - has its path judged by what a server could turn it into: dot-only segments after decoding
282
+ and encoded separators are refused. A few unusual file names can therefore be refused, and a
283
+ repository path must be sent literally, not percent-encoded;
284
+ - has no datastore, shared datastore or readable secrets, and its `console` output is dropped;
285
+ - runs under the usual sandbox limits: 10 s per call, 8 s per fetch, 8 MiB per response.
286
+
287
+ Anything outside these limits fails the call with `host_tool_request_denied`, even if the
288
+ tool catches the error.
289
+
290
+ ## Remove a provider
291
+
292
+ `delete_host_provider` removes a provider and its snapshots. It's refused while an agent links
293
+ to one of its repositories. `delete_secret` is refused while a provider uses that secret, and
294
+ names the provider.
@@ -466,9 +466,12 @@ What happens:
466
466
  the same branch instead of opening a second pull request. The run message
467
467
  lists up to ten open pull requests recorded for the issue this way — any
468
468
  agent's, not only the triggered agent's own — each with its own run id, so
469
- a follow-up can continue every one the change touches.
469
+ a follow-up can continue every one the change touches. GitHub issues behave
470
+ the same way; see
471
+ [Follow-ups on an issue](code-review-agents.md#follow-ups-on-an-issue).
470
472
  - **Several repositories.** When the issue leads to pull requests in more
471
- than one repository (in the same run, or in later runs for the same issue),
473
+ than one repository (in the same run, or in later runs for the same issue,
474
+ Jira or GitHub),
472
475
  each pull request's description gets a **Related pull requests** section
473
476
  naming the issue and every pull request recorded for it, merged and closed
474
477
  ones included as context; see
@@ -574,8 +577,16 @@ A run is attributed when:
574
577
  - its parent run is attributed (sub-agents and coding runs inherit, and cannot
575
578
  change it).
576
579
 
580
+ GitHub issues are attributed the same way, to a work item with provider
581
+ `github` and key `owner/repo#N`: a run started by a mention on the issue (and
582
+ every sub-agent and coding run it starts), and runs on a pull request opened
583
+ from it. `cost_report` lists them like any other work item
584
+ (`provider: "github"` narrows to them).
585
+
577
586
  When a run is attributed to an issue, whatever the source, coding runs it
578
- starts name that issue in their pull request's title and body. The issue total
587
+ starts name that issue in their pull request's title and body. A GitHub issue
588
+ is named only in the body, as `From issue #N`, on a pull request in the
589
+ issue's own repository. The issue total
579
590
  in a Jira comment's spend line covers every run attributed to that issue,
580
591
  whichever agent ran it.
581
592
 
@@ -602,11 +613,9 @@ How to read the numbers:
602
613
  - You see the runs of agents you own and runs you triggered, the same as
603
614
  `list_runs` and `get_run`.
604
615
 
605
- On GKE, existing deployments must re-run the database grants bootstrap
606
- (`deploy/gke/bootstrap-database-iam.sh`) after upgrading, so the coding proxy
607
- can write per-model usage for coding runs. Until then coding runs still work,
608
- but their per-model breakdown isn't recorded. See
609
- [Getting started on GKE](getting-started-gke.md).
616
+ On GKE, the coding proxy needs a database grant to write per-model usage for
617
+ coding runs; `deploy/gke/up.sh` applies it when you upgrade. See
618
+ [Upgrading an existing deployment](getting-started-gke.md#upgrading-an-existing-deployment).
610
619
 
611
620
  ### Company-managed projects using Epic Link
612
621
 
@@ -0,0 +1,41 @@
1
+ ---
2
+ type: invariant
3
+ title: Blob absence must distinguish missing infrastructure
4
+ description: Mapping a storage outage to not_found can delete valid dependency snapshot metadata.
5
+ tags: [storage, cache, providers]
6
+ status: stable
7
+ generated: { by: wardby-architect/gpt-6.1-sol, at: 2026-10-16T18:34:00.557Z }
8
+ sources:
9
+ - id: missing
10
+ url: https://github.com/wardby/wardby/blob/744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be/src/providers/storage/s3.ts#L26-L32
11
+ - id: cleanup
12
+ url: https://github.com/wardby/wardby/blob/744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be/src/providers/coding-proxy/dependency-cache/service.ts#L275-L295
13
+ wardby:
14
+ schema: 1
15
+ roles: [builder, reviewer]
16
+ affects: ["src/providers/storage/**", "src/providers/coding-proxy/dependency-cache/service.ts"]
17
+ citations:
18
+ - id: missing
19
+ repo: github:wardby/wardby
20
+ path: src/providers/storage/s3.ts
21
+ lines: [26, 32]
22
+ symbol: isNotFound
23
+ sha: 744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be
24
+ spanHash: sha256:686cdad150c8c0d58e6b9acc5a2cd0bdf2e65b07b5ce8740938f43747f1408b7
25
+ - id: cleanup
26
+ repo: github:wardby/wardby
27
+ path: src/providers/coding-proxy/dependency-cache/service.ts
28
+ lines: [275, 295]
29
+ symbol: download
30
+ sha: 744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be
31
+ spanHash: sha256:02d4e058438d562ba55b6681e0267e890eed1ef82159a3b332d214f2fd066427
32
+ confidence: high
33
+ ---
34
+
35
+ The cache deletes snapshot metadata when getStream raises BlobStoreError with code not_found. The S3 adapter therefore maps missing keys, including the bare HeadObject NotFound response, but leaves NoSuchBucket and other failures as errors.[^missing][^cleanup]
36
+
37
+ **Why:** not_found authorizes metadata cleanup; it is not a generic unavailable response. New storage adapters must preserve this distinction so an infrastructure failure cannot masquerade as a dangling snapshot.
38
+
39
+ [^missing]: src/providers/storage/s3.ts, lines 26-32.
40
+
41
+ [^cleanup]: src/providers/coding-proxy/dependency-cache/service.ts, lines 275-295.
@@ -0,0 +1,52 @@
1
+ ---
2
+ type: invariant
3
+ title: Untrusted file bounds belong to the open descriptor
4
+ description: Checking a path before reading it leaves file substitution and growth races across worker boundaries.
5
+ tags: [coding, isolation, files]
6
+ status: stable
7
+ generated: { by: wardby-architect/gpt-6.1-sol, at: 2026-10-16T18:34:00.557Z }
8
+ sources:
9
+ - id: read
10
+ url: https://github.com/wardby/wardby/blob/744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be/src/coding-worker/artifact.ts#L12-L48
11
+ - id: skills
12
+ url: https://github.com/wardby/wardby/blob/744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be/src/coding-worker/skills.ts#L43-L54
13
+ - id: result
14
+ url: https://github.com/wardby/wardby/blob/744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be/src/providers/jobs/docker.ts#L1263-L1277
15
+ wardby:
16
+ schema: 1
17
+ roles: [builder, reviewer]
18
+ affects: ["src/coding-worker/artifact.ts", "src/coding-worker/skills.ts", "src/providers/jobs/docker.ts"]
19
+ citations:
20
+ - id: read
21
+ repo: github:wardby/wardby
22
+ path: src/coding-worker/artifact.ts
23
+ lines: [12, 48]
24
+ symbol: readBoundedRegularFile
25
+ sha: 744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be
26
+ spanHash: sha256:ce5173dc2723b798c03e33fcb780c5c4da5b2dd15f2b517c4db77fec841f788d
27
+ - id: skills
28
+ repo: github:wardby/wardby
29
+ path: src/coding-worker/skills.ts
30
+ lines: [43, 54]
31
+ symbol: skillNameFromFile
32
+ sha: 744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be
33
+ spanHash: sha256:022ed743f1ccb279f73e4520bf458ad28eeace035ae695853c9e5f7ee52087d4
34
+ - id: result
35
+ repo: github:wardby/wardby
36
+ path: src/providers/jobs/docker.ts
37
+ lines: [1263, 1277]
38
+ symbol: readResultArtifact
39
+ sha: 744d27eb926ccf7eafe52c98ac2af7f9bcd5c1be
40
+ spanHash: sha256:da6466b5dc44b1de79f473668648048b3f3ef3f82a6cce61516e8bfa76efb996
41
+ confidence: high
42
+ ---
43
+
44
+ The bounded reader opens without following a final symlink and without blocking on a FIFO, checks the opened descriptor against the path inode, and reads at most one byte beyond the limit to detect growth. Both repository skill scanning and Docker result collection use it.[^read][^skills][^result]
45
+
46
+ **What to do:** preserve descriptor checks and the bounded read together. Replacing them with a path stat followed by readFile reopens substitution and growth races even when the initial size was safe.
47
+
48
+ [^read]: src/coding-worker/artifact.ts, lines 12-48.
49
+
50
+ [^skills]: src/coding-worker/skills.ts, lines 43-54.
51
+
52
+ [^result]: src/providers/jobs/docker.ts, lines 1263-1277.