@wardby/cli 0.7.0 → 0.9.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 (367) hide show
  1. package/.env.example +5 -5
  2. package/README.md +6 -1
  3. package/deploy/local/docker-compose.quickstart-coding.yml +11 -0
  4. package/dist/claude-coding-worker/driver.d.ts +12 -0
  5. package/dist/claude-coding-worker/driver.js +29 -7
  6. package/dist/claude-coding-worker/main.js +5 -1
  7. package/dist/claude-coding-worker/sdk.js +17 -1
  8. package/dist/claude-plugin/command.d.ts +64 -0
  9. package/dist/claude-plugin/command.js +379 -0
  10. package/dist/cli-help.d.ts +1 -1
  11. package/dist/cli-help.js +2 -1
  12. package/dist/cli.js +71 -3
  13. package/dist/coding/code-host.d.ts +16 -0
  14. package/dist/coding/code-host.js +60 -0
  15. package/dist/coding/mcp-token.d.ts +12 -0
  16. package/dist/coding/mcp-token.js +26 -0
  17. package/dist/coding/protocol.js +2 -0
  18. package/dist/coding/redact.js +6 -1
  19. package/dist/coding/transcript/recorder.d.ts +5 -4
  20. package/dist/coding/transcript/recorder.js +3 -9
  21. package/dist/coding-worker/debug-trace.d.ts +3 -1
  22. package/dist/coding-worker/debug-trace.js +4 -2
  23. package/dist/coding-worker/driver.js +8 -1
  24. package/dist/coding-worker/main.js +5 -1
  25. package/dist/coding-worker/mcp-config.d.ts +27 -0
  26. package/dist/coding-worker/mcp-config.js +32 -0
  27. package/dist/coding-worker/sdk.d.ts +36 -0
  28. package/dist/coding-worker/sdk.js +28 -1
  29. package/dist/coding-worker/types.d.ts +4 -0
  30. package/dist/config/mcp-call-limit.d.ts +8 -0
  31. package/dist/config/mcp-call-limit.js +18 -0
  32. package/dist/config/mcp-servers.d.ts +8 -0
  33. package/dist/config/mcp-servers.js +12 -0
  34. package/dist/config/test-simulators.d.ts +10 -0
  35. package/dist/config/test-simulators.js +28 -0
  36. package/dist/config/tool-timeout.d.ts +1 -0
  37. package/dist/config/tool-timeout.js +18 -0
  38. package/dist/core/coding-mcp.d.ts +36 -0
  39. package/dist/core/coding-mcp.js +253 -0
  40. package/dist/core/coding-repository.d.ts +46 -0
  41. package/dist/core/coding-repository.js +92 -0
  42. package/dist/core/delegation-slots.d.ts +27 -0
  43. package/dist/core/delegation-slots.js +44 -0
  44. package/dist/core/dispatch.d.ts +6 -2
  45. package/dist/core/dispatch.js +39 -11
  46. package/dist/core/engine-native.d.ts +2 -0
  47. package/dist/core/engine-native.js +13 -0
  48. package/dist/core/error-code.js +2 -0
  49. package/dist/core/grants.d.ts +28 -3
  50. package/dist/core/grants.js +46 -4
  51. package/dist/core/host-events.js +7 -3
  52. package/dist/core/host-status.js +2 -2
  53. package/dist/core/issue-status.js +4 -3
  54. package/dist/core/listen-address.d.ts +10 -0
  55. package/dist/core/listen-address.js +14 -0
  56. package/dist/core/mark-ready.d.ts +1 -1
  57. package/dist/core/mark-ready.js +1 -1
  58. package/dist/core/mcp-client/client.d.ts +47 -0
  59. package/dist/core/mcp-client/client.js +141 -0
  60. package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
  61. package/dist/core/mcp-client/jsonrpc.js +54 -0
  62. package/dist/core/mcp-client/results.d.ts +13 -0
  63. package/dist/core/mcp-client/results.js +42 -0
  64. package/dist/core/mcp-servers.d.ts +90 -0
  65. package/dist/core/mcp-servers.js +230 -0
  66. package/dist/core/mcp-tools.d.ts +108 -0
  67. package/dist/core/mcp-tools.js +287 -0
  68. package/dist/core/merge-order-check.js +38 -19
  69. package/dist/core/notification-dispatcher.js +2 -1
  70. package/dist/core/power-idle.d.ts +8 -2
  71. package/dist/core/power-idle.js +17 -3
  72. package/dist/core/power.d.ts +5 -0
  73. package/dist/core/power.js +5 -0
  74. package/dist/core/related-pull-requests.js +26 -10
  75. package/dist/core/retention-days.d.ts +5 -0
  76. package/dist/core/retention-days.js +14 -0
  77. package/dist/core/review-fix.js +2 -2
  78. package/dist/core/review-host-tools.js +3 -1
  79. package/dist/core/run-steps/config.d.ts +25 -0
  80. package/dist/core/run-steps/config.js +40 -0
  81. package/dist/core/run-steps/control-chars.d.ts +16 -0
  82. package/dist/core/run-steps/control-chars.js +26 -0
  83. package/dist/core/run-steps/detail.d.ts +32 -0
  84. package/dist/core/run-steps/detail.js +240 -0
  85. package/dist/core/run-steps/extract.d.ts +52 -0
  86. package/dist/core/run-steps/extract.js +467 -0
  87. package/dist/core/run-steps/ingress.d.ts +51 -0
  88. package/dist/core/run-steps/ingress.js +160 -0
  89. package/dist/core/run-steps/last-step.d.ts +15 -0
  90. package/dist/core/run-steps/last-step.js +35 -0
  91. package/dist/core/run-steps/native.d.ts +48 -0
  92. package/dist/core/run-steps/native.js +164 -0
  93. package/dist/core/run-steps/seen.d.ts +16 -0
  94. package/dist/core/run-steps/seen.js +35 -0
  95. package/dist/core/run-steps/summarize.d.ts +57 -0
  96. package/dist/core/run-steps/summarize.js +304 -0
  97. package/dist/core/run-steps/sweep.d.ts +21 -0
  98. package/dist/core/run-steps/sweep.js +41 -0
  99. package/dist/core/run-steps/types.d.ts +89 -0
  100. package/dist/core/run-steps/types.js +39 -0
  101. package/dist/core/run-steps/wire.d.ts +35 -0
  102. package/dist/core/run-steps/wire.js +47 -0
  103. package/dist/core/run-steps/writer.d.ts +49 -0
  104. package/dist/core/run-steps/writer.js +279 -0
  105. package/dist/core/runner.d.ts +70 -16
  106. package/dist/core/runner.js +296 -74
  107. package/dist/core/secret-broker-config.d.ts +2 -0
  108. package/dist/core/secret-broker-config.js +1 -1
  109. package/dist/core/secret-guard.d.ts +5 -2
  110. package/dist/core/secret-guard.js +22 -7
  111. package/dist/core/secrets.d.ts +11 -1
  112. package/dist/core/secrets.js +27 -1
  113. package/dist/core/serializable-retry.d.ts +18 -0
  114. package/dist/core/serializable-retry.js +43 -0
  115. package/dist/core/tool-admin.d.ts +5 -1
  116. package/dist/core/tool-admin.js +7 -2
  117. package/dist/core/tool-names.d.ts +13 -0
  118. package/dist/core/tool-names.js +20 -0
  119. package/dist/core/webhooks.d.ts +4 -0
  120. package/dist/core/webhooks.js +68 -49
  121. package/dist/core/workflow-run-events.js +2 -1
  122. package/dist/generated/prisma/browser.d.ts +39 -0
  123. package/dist/generated/prisma/client.d.ts +39 -0
  124. package/dist/generated/prisma/commonInputTypes.d.ts +80 -50
  125. package/dist/generated/prisma/enums.d.ts +6 -0
  126. package/dist/generated/prisma/enums.js +5 -0
  127. package/dist/generated/prisma/internal/class.d.ts +77 -0
  128. package/dist/generated/prisma/internal/class.js +4 -4
  129. package/dist/generated/prisma/internal/prismaNamespace.d.ts +632 -1
  130. package/dist/generated/prisma/internal/prismaNamespace.js +94 -3
  131. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +98 -0
  132. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +94 -3
  133. package/dist/generated/prisma/models/Agent.d.ts +372 -1
  134. package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
  135. package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
  136. package/dist/generated/prisma/models/AgentRepository.d.ts +40 -1
  137. package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
  138. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +0 -7
  139. package/dist/generated/prisma/models/CodingProxySession.d.ts +159 -2
  140. package/dist/generated/prisma/models/CodingRun.d.ts +76 -1
  141. package/dist/generated/prisma/models/HostProvider.d.ts +2176 -0
  142. package/dist/generated/prisma/models/HostProvider.js +1 -0
  143. package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
  144. package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
  145. package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
  146. package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
  147. package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
  148. package/dist/generated/prisma/models/HostProviderTrustedAccount.js +1 -0
  149. package/dist/generated/prisma/models/McpServer.d.ts +1500 -0
  150. package/dist/generated/prisma/models/McpServer.js +1 -0
  151. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +39 -1
  152. package/dist/generated/prisma/models/Principal.d.ts +167 -0
  153. package/dist/generated/prisma/models/ResourceGrant.d.ts +1 -1
  154. package/dist/generated/prisma/models/Run.d.ts +503 -1
  155. package/dist/generated/prisma/models/RunStep.d.ts +1453 -0
  156. package/dist/generated/prisma/models/RunStep.js +1 -0
  157. package/dist/generated/prisma/models/Secret.d.ts +387 -0
  158. package/dist/generated/prisma/models/Tool.d.ts +223 -1
  159. package/dist/generated/prisma/models.d.ts +7 -0
  160. package/dist/help/search.js +12 -3
  161. package/dist/help-index.json +812 -52
  162. package/dist/import/create.js +16 -1
  163. package/dist/import/neutral-schema.d.ts +1 -0
  164. package/dist/import/neutral-schema.js +2 -0
  165. package/dist/mcp/auth/access.d.ts +1 -0
  166. package/dist/mcp/auth/grants-cli.d.ts +6 -4
  167. package/dist/mcp/auth/grants-cli.js +42 -3
  168. package/dist/mcp/auth/resource-server.d.ts +3 -1
  169. package/dist/mcp/auth/resource-server.js +17 -2
  170. package/dist/mcp/context.d.ts +6 -0
  171. package/dist/mcp/index.js +21 -0
  172. package/dist/mcp/tools/agents.js +135 -20
  173. package/dist/mcp/tools/grants.js +66 -28
  174. package/dist/mcp/tools/host-providers.d.ts +2 -0
  175. package/dist/mcp/tools/host-providers.js +215 -0
  176. package/dist/mcp/tools/mcp-servers.d.ts +26 -0
  177. package/dist/mcp/tools/mcp-servers.js +481 -0
  178. package/dist/mcp/tools/power.js +2 -2
  179. package/dist/mcp/tools/repositories.js +50 -10
  180. package/dist/mcp/tools/run-access.d.ts +7 -0
  181. package/dist/mcp/tools/run-access.js +14 -0
  182. package/dist/mcp/tools/run-steps.d.ts +16 -0
  183. package/dist/mcp/tools/run-steps.js +85 -0
  184. package/dist/mcp/tools/runs.js +186 -18
  185. package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
  186. package/dist/mcp/tools/secret-elicitation.js +25 -2
  187. package/dist/mcp/tools/secrets.js +38 -4
  188. package/dist/mcp/tools/tools.d.ts +6 -4
  189. package/dist/mcp/tools/tools.js +40 -8
  190. package/dist/mcp/tools/trigger.js +28 -6
  191. package/dist/mcp/transport/http-limits.d.ts +2 -0
  192. package/dist/mcp/transport/http-limits.js +6 -2
  193. package/dist/mcp/webhooks/ingress.js +10 -0
  194. package/dist/native-worker/gateway-server.d.ts +18 -1
  195. package/dist/native-worker/gateway-server.js +38 -9
  196. package/dist/native-worker/gateway.d.ts +5 -0
  197. package/dist/native-worker/gateway.js +13 -1
  198. package/dist/native-worker/http-server.d.ts +6 -4
  199. package/dist/native-worker/http-server.js +53 -8
  200. package/dist/native-worker/ledger.d.ts +6 -2
  201. package/dist/native-worker/ledger.js +5 -4
  202. package/dist/native-worker/protocol.d.ts +1 -0
  203. package/dist/native-worker/protocol.js +4 -1
  204. package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
  205. package/dist/providers/coding-proxy/capability-hash.js +5 -0
  206. package/dist/providers/coding-proxy/mcp-route.d.ts +34 -0
  207. package/dist/providers/coding-proxy/mcp-route.js +166 -0
  208. package/dist/providers/coding-proxy/memory-ledger.d.ts +2 -0
  209. package/dist/providers/coding-proxy/memory-ledger.js +16 -0
  210. package/dist/providers/coding-proxy/prisma-ledger.d.ts +1 -0
  211. package/dist/providers/coding-proxy/prisma-ledger.js +36 -2
  212. package/dist/providers/coding-proxy/proxy.d.ts +33 -1
  213. package/dist/providers/coding-proxy/proxy.js +266 -75
  214. package/dist/providers/coding-proxy/run-step-forwarder.d.ts +42 -0
  215. package/dist/providers/coding-proxy/run-step-forwarder.js +206 -0
  216. package/dist/providers/coding-proxy/runtime.d.ts +13 -0
  217. package/dist/providers/coding-proxy/runtime.js +87 -4
  218. package/dist/providers/coding-proxy/server.d.ts +3 -0
  219. package/dist/providers/coding-proxy/server.js +10 -0
  220. package/dist/providers/coding-proxy/types.d.ts +18 -0
  221. package/dist/providers/engine/types.d.ts +26 -0
  222. package/dist/providers/executor/composition.js +5 -0
  223. package/dist/providers/executor/container.d.ts +47 -1
  224. package/dist/providers/executor/container.js +84 -8
  225. package/dist/providers/host-tools/invoke.d.ts +37 -0
  226. package/dist/providers/host-tools/invoke.js +117 -0
  227. package/dist/providers/host-tools/operations.d.ts +65 -0
  228. package/dist/providers/host-tools/operations.js +149 -0
  229. package/dist/providers/host-tools/registry.d.ts +79 -0
  230. package/dist/providers/host-tools/registry.js +362 -0
  231. package/dist/providers/host-tools/request-guard.d.ts +17 -0
  232. package/dist/providers/host-tools/request-guard.js +99 -0
  233. package/dist/providers/host-tools/self-test.d.ts +64 -0
  234. package/dist/providers/host-tools/self-test.js +142 -0
  235. package/dist/providers/jobs/docker-isolation.d.ts +2 -2
  236. package/dist/providers/jobs/docker-isolation.js +30 -8
  237. package/dist/providers/jobs/docker.d.ts +8 -0
  238. package/dist/providers/jobs/docker.js +33 -9
  239. package/dist/providers/jobs/kubernetes-isolation.d.ts +3 -1
  240. package/dist/providers/jobs/kubernetes-isolation.js +15 -2
  241. package/dist/providers/jobs/kubernetes.d.ts +13 -0
  242. package/dist/providers/jobs/kubernetes.js +28 -5
  243. package/dist/providers/jobs/types.d.ts +6 -0
  244. package/dist/providers/review-host/types.d.ts +6 -4
  245. package/dist/providers/review-host/types.js +1 -1
  246. package/dist/providers/vcs/git.d.ts +6 -2
  247. package/dist/providers/vcs/git.js +15 -4
  248. package/dist/providers/vcs/github.d.ts +2 -71
  249. package/dist/providers/vcs/github.js +8 -11
  250. package/dist/providers/vcs/index.d.ts +1 -1
  251. package/dist/providers/vcs/index.js +1 -1
  252. package/dist/providers/vcs/remote.d.ts +4 -0
  253. package/dist/providers/vcs/remote.js +7 -1
  254. package/dist/providers/vcs/routing.d.ts +12 -6
  255. package/dist/providers/vcs/routing.js +21 -6
  256. package/dist/providers/vcs/types.d.ts +71 -3
  257. package/dist/quickstart/index.d.ts +5 -0
  258. package/dist/quickstart/index.js +21 -0
  259. package/dist/quickstart-images.json +1 -1
  260. package/dist/sandbox/eval-core.d.ts +12 -2
  261. package/dist/sandbox/eval-core.js +20 -4
  262. package/dist/sandbox/host-functions.d.ts +4 -0
  263. package/dist/sandbox/host-functions.js +7 -2
  264. package/dist/sandbox/limits.d.ts +4 -1
  265. package/dist/sandbox/limits.js +4 -1
  266. package/dist/sandbox/run-in-sandbox.d.ts +6 -0
  267. package/dist/sandbox/run-in-sandbox.js +14 -2
  268. package/dist/sandbox/safe-fetch.d.ts +2 -0
  269. package/dist/sandbox/safe-fetch.js +1 -1
  270. package/dist/sandbox/secret-broker.d.ts +1 -0
  271. package/dist/sandbox/secret-broker.js +1 -1
  272. package/dist/sandbox/tool-timeout.d.ts +32 -0
  273. package/dist/sandbox/tool-timeout.js +52 -0
  274. package/dist/sandbox/user-tool.d.ts +8 -1
  275. package/dist/sandbox/user-tool.js +9 -3
  276. package/dist/serve.js +26 -18
  277. package/dist/viewer/api-schema.d.ts +66 -0
  278. package/dist/viewer/api-schema.js +31 -0
  279. package/dist/viewer/graph.js +2 -1
  280. package/dist/viewer/openapi.js +2 -1
  281. package/dist/viewer/run-detail.d.ts +2 -0
  282. package/dist/viewer/run-detail.js +26 -1
  283. package/dist/wardby-bin.js +5 -0
  284. package/docs/README.md +11 -1
  285. package/docs/agent-recipes.md +37 -4
  286. package/docs/architecture-runtime.md +1 -1
  287. package/docs/claude-code-plugin.md +208 -0
  288. package/docs/code-review-agents.md +6 -0
  289. package/docs/coding-agent-setup.md +94 -1
  290. package/docs/coding-worker-byo-images.md +4 -2
  291. package/docs/coding-worker-isolation.md +94 -7
  292. package/docs/debugging-agent-runs.md +354 -0
  293. package/docs/getting-started-gke.md +33 -11
  294. package/docs/getting-started-identity-provider.md +43 -37
  295. package/docs/getting-started.md +8 -0
  296. package/docs/host-providers.md +294 -0
  297. package/docs/mcp-servers.md +263 -0
  298. package/docs/native-sandbox.md +31 -9
  299. package/docs/security-deployment.md +161 -31
  300. package/docs/tool-secrets.md +3 -0
  301. package/docs/viewer-api.md +27 -12
  302. package/docs/viewer-api.openapi.yml +78 -2
  303. package/help/admin-viewer.md +5 -0
  304. package/help/agent-recipes.md +33 -2
  305. package/help/brokered-secrets.md +3 -0
  306. package/help/build-claude-code-image.md +1 -1
  307. package/help/claude-code-run-pane.md +63 -0
  308. package/help/deploy-gke.md +5 -0
  309. package/help/errors/coding-mcp-gateway-unavailable.md +46 -0
  310. package/help/errors/coding-mcp-pins-unavailable.md +35 -0
  311. package/help/errors/database-auth-invalid.md +1 -1
  312. package/help/errors/host-provider-error.md +40 -0
  313. package/help/errors/host-tool-failed.md +36 -0
  314. package/help/errors/mcp-call-limit.md +22 -0
  315. package/help/errors/mcp-call-timeout.md +22 -0
  316. package/help/errors/mcp-server-auth-failed.md +22 -0
  317. package/help/errors/mcp-server-credentials-unavailable.md +45 -0
  318. package/help/errors/mcp-server-error.md +28 -0
  319. package/help/errors/mcp-server-unreachable.md +22 -0
  320. package/help/errors/mcp-servers-off.md +21 -0
  321. package/help/errors/mcp-tool-not-allowed.md +26 -0
  322. package/help/errors/mcp-tool-removed.md +22 -0
  323. package/help/errors/mcp-unavailable.md +25 -0
  324. package/help/errors/native-sandbox-capacity.md +1 -1
  325. package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
  326. package/help/errors/native-sandbox-docker-failed.md +1 -1
  327. package/help/errors/native-sandbox-gateway-error.md +1 -1
  328. package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
  329. package/help/errors/native-sandbox-image-not-pinned.md +1 -1
  330. package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
  331. package/help/errors/native-sandbox-network-unenforced.md +1 -1
  332. package/help/errors/native-sandbox-requires-catalog.md +1 -1
  333. package/help/errors/native-sandbox-unavailable.md +1 -1
  334. package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
  335. package/help/errors/native-sandbox-worker-exited.md +1 -1
  336. package/help/errors/native-sandbox-worker-lost.md +1 -1
  337. package/help/errors/native-sandbox-worker-unready.md +1 -1
  338. package/help/errors/repository-not-listed.md +36 -0
  339. package/help/errors/repository-required.md +36 -0
  340. package/help/errors/tool-timeout.md +38 -0
  341. package/help/host-providers.md +40 -0
  342. package/help/identity-and-access.md +4 -1
  343. package/help/low-power-mode.md +19 -8
  344. package/help/mcp-servers.md +73 -0
  345. package/help/mcp.md +9 -2
  346. package/help/native-capabilities.md +27 -1
  347. package/help/native-sandbox.md +1 -1
  348. package/help/operating-agents.md +16 -0
  349. package/help/related-pull-requests.md +7 -3
  350. package/help/repo-instructions-and-skills.md +3 -1
  351. package/help/resume-runs-locally.md +7 -0
  352. package/help/run-steps.md +140 -0
  353. package/help/stop-run.md +1 -1
  354. package/help/troubleshooting/coding-workers.md +9 -1
  355. package/help/troubleshooting/debugging-agent-runs.md +29 -0
  356. package/package.json +2 -1
  357. package/prisma/migrations/20261102000000_host_providers/migration.sql +56 -0
  358. package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
  359. package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
  360. package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
  361. package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
  362. package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
  363. package/prisma/migrations/20261110000000_run_steps/migration.sql +26 -0
  364. package/prisma/migrations/20261111000000_run_steps_viewer_notify/migration.sql +59 -0
  365. package/prisma/migrations/20261112000000_run_steps_detail/migration.sql +9 -0
  366. package/prisma/schema.prisma +211 -14
  367. package/scripts/git-askpass.sh +1 -1
@@ -0,0 +1,354 @@
1
+ # Debugging an agent run
2
+
3
+ You can triage most agent problems yourself with the Wardby MCP and GitHub. Only
4
+ some failures need someone with server logs.
5
+
6
+ ## Start here
7
+
8
+ Find the run with `list_runs`, then read it with `get_run`. Then go to the section
9
+ for what you see.
10
+
11
+ ```mermaid
12
+ flowchart TD
13
+ start["Find the run: list_runs, then get_run"]
14
+ start --> none["No run started<br/>Check the repo links and triggers"]
15
+ start --> failed["Failed or refused<br/>Read failureCategory and the final text"]
16
+ start --> nopr["Succeeded, no PR<br/>Read outcome in codingResult"]
17
+ start --> missed["PR, but it missed<br/>Read the diff and the review"]
18
+ none --> nopull["See: No pull request appeared"]
19
+ nopr --> nopull
20
+ failed --> runfailed["See: The run failed"]
21
+ missed --> didntfix["See: The agent didn't fix what you expected"]
22
+ runfailed -- still unexplained --> operator["See: When you need an operator"]
23
+ nopr -- why it decided that --> transcript["See: Run transcripts"]
24
+ missed -- why it decided that --> transcript
25
+ ```
26
+
27
+ ## What you can use without server access
28
+
29
+ These all work through the Wardby MCP or GitHub, and you only see runs you have
30
+ access to.
31
+
32
+ | Tool | What it tells you |
33
+ | --------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
34
+ | `list_runs` (agent id, optional `status`) | An agent's recent runs: status, trigger, cost, turns, final text, and which run started it |
35
+ | `list_runs` without an agent id (from 0.8.0) | Your runs across every agent, each with `agentName`; no final text. `active: true` or `since` (ISO time) narrow it |
36
+ | `get_run` (run id) | One run in full, adding `failureCategory`, `diagnosticId`, `codingResult.outcome`, `request`, budget events and package refusals |
37
+ | `triggerInfo`, `outcomes`, `serviceReadiness` (from 0.8.0, on `get_run` and on `list_runs` without an agent id) | What started the run (the pull request and whether it was a review or a mention, the issue, the schedule or the lead), what it produced (pull requests opened, comments, checks) and each service's state, in the admin viewer API's shapes. Follow a pull request from the run that opened it through its review and fix rounds by matching one run's outcome to the next run's trigger |
38
+ | `get_agent`, `list_repositories`, `list_subagents` | How the agent is set up: prompt, model, budget, repo links and triggers, sub-agents |
39
+ | `search_help`, `get_help_article` | Help for an error code or failure category |
40
+ | `cost_report` | What runs cost, when spend is the question |
41
+ | `get_run_steps` (from 0.9.0) | The run's steps, one line per tool call or model message, live while it runs; see [Run steps](#run-steps) |
42
+ | `get_run_transcript` | The run's conversation, for Claude Code runs with `sessionResume` on |
43
+ | `stop_run` | Stops a run that's stuck |
44
+ | The PR, issue or Jira ticket | The diff, CI, the review, and the comment the run posted |
45
+
46
+ From Wardby 0.8.0, `list_agents` with `summary: true` returns each agent's id,
47
+ name, kind, model, coding provider, budget, owner and your access, without the
48
+ prompt and coding profile. Admins (the `admin` role, `admin:view` scope) can add
49
+ `all: true` to `list_agents` or `list_runs` to see every agent or run in the
50
+ deployment.
51
+
52
+ Admins can also use the [Wardby Viewer](viewer-api.md), a desktop app showing runs,
53
+ sub-agent trees, triggers and outcomes for every owner.
54
+
55
+ ## The run failed
56
+
57
+ Call `get_run` and read `status`, `error`, `failureCategory` and the final text. A
58
+ failed coding run's `error` looks like
59
+ `coding_failure_repo_access:coding_diag_…`: the middle part is the stage that
60
+ failed, and the ID is what an operator searches for.
61
+
62
+ | What you see | Likely cause | What to do |
63
+ | ------------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------- |
64
+ | `repo_access` | The agent's owner lost access, or a repo link was removed | Check `list_repositories` and the owner's GitHub access |
65
+ | `repo_access_unavailable` | GitHub couldn't be reached reliably | Try again later |
66
+ | `workspace` | Often a workspace disk size above the server's limit | Lower `workspaceDiskMb`, or ask an operator to raise the limit |
67
+ | `executor` while running checks | The run may have run out of memory, among other causes | Reduce what the checks run; send the ID to an operator if it repeats |
68
+ | `merge_conflict` | The branch conflicts with its target | Read the `merge-conflict` help article |
69
+ | `service_unready` | A service the run needs, such as Postgres, didn't start | Check `.wardby/services.yaml` and the agent's `services` |
70
+ | `coding_turn_limit` | The run used all its turns | Raise `maxTurns` or narrow the task |
71
+ | `budgetEvents`, or `refused` | The run, run tree or budget group ran out of money | Raise the budget or check spend with `cost_report` |
72
+ | `packageRefusals` | A package isn't allowed or is too new | Add it to `packageAllowlist`, or wait out the release age limit |
73
+
74
+ For anything else, call `search_help` with the code or category. If that doesn't
75
+ explain it, see [When you need an operator](#when-you-need-an-operator).
76
+
77
+ **Prompt for Claude Code:**
78
+
79
+ ```
80
+ Wardby run <run id> failed. Why, and what can I do about it?
81
+ If it needs server logs, give me the diagnosticId.
82
+ ```
83
+
84
+ ## No pull request appeared
85
+
86
+ First find out whether a run started, using `list_runs` on the lead or router,
87
+ then on the coding agent.
88
+
89
+ | What `list_runs` shows | What it means | What to do |
90
+ | -------------------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
91
+ | No new run | The request never started anything: nothing is linked with that trigger, or the person doesn't have access | Check `list_repositories` on the router. Only one agent per repo can hold the `mention` trigger |
92
+ | Lead ran, no coding run under it | The lead chose not to delegate | Read the lead's final text, which should say why |
93
+ | Coding run failed or was refused | See [The run failed](#the-run-failed) | |
94
+ | Coding run succeeded, with no PR | Check `codingResult.outcome` in `get_run` | See below |
95
+
96
+ | `outcome` | Meaning |
97
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
98
+ | `no_changes` | The agent changed nothing. Its final text should say why: the request may be vague or already done. On Claude Code, the transcript shows how it decided |
99
+ | `budget_exhausted` | It ran out of money before finishing. Raise the budget or narrow the task |
100
+ | `branch_pushed` | A local repo: there's a branch, and no PR by design |
101
+
102
+ A mention can also get no reply at all. If a server sets
103
+ `WARDBY_MENTION_EXPLANATIONS=false`, a mention that starts nothing stays silent. An
104
+ operator can look for `mention ignored` or `mention declined` in the server log.
105
+
106
+ **Prompt for Claude Code:**
107
+
108
+ ```
109
+ I asked Wardby agent <agent name> to <request> in <your-org/your-repo>,
110
+ and no pull request appeared. Why?
111
+ ```
112
+
113
+ ## The agent didn't fix what you expected
114
+
115
+ The run succeeded, so most of what you need is on the PR and the run, with no
116
+ server logs involved. Check these in order:
117
+
118
+ 1. **The diff:** what actually changed.
119
+ 2. **The PR description:** the run's final text, including what it says it tested.
120
+ If it says the tests weren't run, trust CI.
121
+ 3. **The review:** whether your review check caught the miss.
122
+ 4. **The request:** whether the issue or mention said what you meant.
123
+ 5. **The task the agent received:** `request` in `get_run` (from Wardby 0.8.0). On a
124
+ delegated run, this shows what the lead told the coding agent.
125
+ 6. **The transcript:** why it decided that. This is only for Claude Code runs with
126
+ `sessionResume` on.
127
+
128
+ The usual causes are a vague request, a lead that dropped something when it rewrote
129
+ the request, a repo rule missing from `AGENTS.md`, or a fix aimed at the symptom it
130
+ was told about.
131
+
132
+ **To fix it,** comment on the PR, mentioning the App, with what's wrong. The
133
+ follow-up pushes to the same branch and PR, so you don't start again. If the same
134
+ miss keeps happening, add the rule to `AGENTS.md` so future runs follow it.
135
+
136
+ **Prompt for Claude Code:**
137
+
138
+ ```
139
+ PR <PR URL> from Wardby didn't do what I expected: <what you expected>.
140
+ Where did it go wrong? Draft a follow-up comment, but don't post it.
141
+ ```
142
+
143
+ ## Run steps
144
+
145
+ While a run runs, Wardby records its steps: one line for each tool call (the
146
+ tool, and its command, file or first argument, cut to about 100 characters) with
147
+ its status once the result is back (`ok`, `error`, or `exit N`), and one line for
148
+ what the model said (cut to about 120 characters). At the default level, tool
149
+ output and full text are never recorded; see Levels below. Steps are recorded
150
+ for native runs (in the control plane and on the native sandbox) and for Claude Code and Codex runs. Every agent's
151
+ shell command shows as `Bash` (a native `run_command`, Claude Code's command tool,
152
+ Codex's `exec_command`, `shell`, `local_shell` and `shell_command`), another tool
153
+ under its own name (for example `apply_patch`), and a remote MCP tool as
154
+ `mcp:<tool>`. A Claude Code or Codex run's final answer is one `said` step: the
155
+ start of the summary it returned, or `Finished` with the outcome (for example
156
+ `Finished: changes ready`) when it returned none.
157
+
158
+ For Claude Code and Codex, the coding proxy reads the steps from the model's
159
+ replies after relaying them and posts them to the server's run-steps listener
160
+ (`POST /internal/run-steps`). A slow or unreachable listener loses steps, never
161
+ slows the run. Without the two settings in the table below, coding runs record no
162
+ steps; native runs are unaffected. Steps for a Claude Code or Codex run need the
163
+ listener, which only `wardby serve` runs.
164
+
165
+ **Levels.**
166
+
167
+ | Level | Tool input | Tool result | Model text |
168
+ | --------- | -------------------- | --------------------------------------- | -------------------- |
169
+ | `off` | - | - | - |
170
+ | `summary` | about 100 characters | status only (`ok`, `error`, `exit N`) | about 120 characters |
171
+ | `detail` | up to about 4 KB | status and the last ~2 KB of its output | up to about 8 KB |
172
+
173
+ At `summary`, the default, tool output is never recorded. At `detail` each step
174
+ also keeps a **detail** text, at most 16 KB. When the output is cut at the
175
+ start, the partial first line is dropped if it ends within 256 characters;
176
+ otherwise only the first 256 characters are dropped, so a long single-line
177
+ output, such as a JSON result, keeps about its last 1.8 KB. At every level,
178
+ terminal escape sequences (colour codes, links, clipboard writes, title changes)
179
+ and every other control character except line breaks and tabs are removed from
180
+ step text before it is stored.
181
+
182
+ A run's level is the lower of two settings, fixed when the run is dispatched (a
183
+ change reaches later runs only; lowering the ceiling also stops detail for runs
184
+ already in flight):
185
+
186
+ - the instance's ceiling, `WARDBY_RUN_STEPS` (default `summary`);
187
+ - the agent's `runSteps` (`off`, `summary` or `detail`), set by the agent's
188
+ owner with `create_agent` or `update_agent`. Unset counts as `summary`. Set
189
+ `null` to clear it.
190
+
191
+ So `detail` needs both the operator and the agent's owner. If `runSteps` asks
192
+ for more than the instance allows, the value is stored, `update_agent` and
193
+ `get_agent` say so in `warnings`, and runs record at the ceiling.
194
+
195
+ > **Warning: `detail` stores tool output.** Before a step is stored, every
196
+ > secret value the run was given is removed and anything shaped like a token or
197
+ > key is masked. A secret that exists only inside a repository file, or another
198
+ > source the run read, and that matches no known shape, is not known to Wardby
199
+ > and can remain in the detail text. That is why detail is off unless both the
200
+ > operator and the agent's owner ask for it. Turn it on only for agents whose
201
+ > tool output you are prepared to keep for the retention period.
202
+
203
+ **Reading them.** `get_run_steps` (`runId`, optional `after` and `limit`) lists
204
+ them oldest first, 50 at a time and at most 200; pass the last `seq` you have as
205
+ `after` to get only newer ones. `get_run` and `list_runs` without `agentId`
206
+ include `lastStep`, the newest step as one line. Access is the same as
207
+ `get_run`'s. At `detail`, `get_run_steps` also returns each step's `detail` to the agent's
208
+ owner and to the person who started the run (and to the stdio operator); anyone
209
+ else, including an admin who does not own the agent, gets the lines only.
210
+ `lastStep`, the admin viewer API and its `step` events never include detail.
211
+ The `wardby-runs` Claude Code pane shows them (see
212
+ [Claude Code plugin](claude-code-plugin.md#using-the-pane)); the admin viewer API
213
+ sends a `step` event for each one and lists a run's newest 200 in its detail
214
+ (see [Viewer API](viewer-api.md)), and the Wardby Viewer app shows them in a
215
+ **Steps** section.
216
+
217
+ **Limits.** A run records at most 2,000 steps; `dropped` in `get_run_steps`
218
+ counts the rest.
219
+
220
+ **Secrets.** Every step is redacted before it is stored: every secret value of
221
+ the run's agent (attached secrets, readable or brokered, and its MCP servers'
222
+ secrets), the run's own capability and its registry token are replaced with
223
+ `[REDACTED]`, then anything shaped like a token or key.
224
+ If the agent's secrets can't be read at that moment, the step is not stored.
225
+
226
+ **Retention.** Steps are deleted `RUN_STEP_RETENTION_DAYS` after they are
227
+ recorded. The scheduler leader deletes expired steps at most every ten minutes. `get_run_steps` reports
228
+ `expired` when a run finished more than `RUN_STEP_RETENTION_DAYS` ago and has no
229
+ steps left.
230
+
231
+ | Variable | Read by | Default | Meaning |
232
+ | ------------------------- | --------------------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
233
+ | `WARDBY_RUN_STEPS` | `wardby serve`, `wardby scheduler`, `wardby run`, `wardby mcp`, `wardby native-gateway`, the coding proxy | `summary` | `off` records nothing; `summary` records the lines above; `detail` allows agents whose `runSteps` is `detail` to record detail. The ceiling for every run. Any other value stops start-up. |
234
+ | `RUN_STEP_RETENTION_DAYS` | `wardby serve`, `wardby scheduler`, `wardby run`, `wardby mcp`, `wardby native-gateway` | `30` | Days to keep a step, a whole number from 1 to 3650. A change applies to steps recorded after it. Any other value stops start-up. |
235
+ | `WARDBY_RUN_STEPS_LISTEN` | `wardby serve` | unset | `host:port` or `:port` of the run-steps listener the coding proxy posts coding runs' steps to. Unset: no listener. An invalid value stops start-up. |
236
+ | `WARDBY_RUN_STEPS_URL` | the coding proxy | unset | The listener's origin, for example `http://<server host>:8792`: `http` or `https`, no credentials, path, query or fragment. Unset: coding runs record no steps. An invalid value stops start-up. |
237
+
238
+ The coding proxy also reads `WARDBY_RUN_STEPS`: with `off`, or with
239
+ `WARDBY_RUN_STEPS_URL` unset, no step text leaves the proxy. For coding runs at
240
+ `detail`, set `WARDBY_RUN_STEPS=detail` on the proxy too: below `detail`, the
241
+ proxy never sends any tool output to the server. Set `WARDBY_RUN_STEPS=detail`
242
+ on every process that writes steps (`wardby serve`, the scheduler, the native
243
+ gateway and `wardby run`). The listener is a
244
+ second network path into the server; see
245
+ [Run steps in Security deployment](security-deployment.md#run-steps) for how to
246
+ restrict it.
247
+
248
+ **Upgrading.** The release adds the `RunStep` table, the `Run.stepsDropped`
249
+ column, `Agent.runSteps`, `Run.runStepsLevel` and
250
+ `CodingProxySession.runStepsLevel`; apply the migrations with
251
+ `prisma migrate deploy` as with any upgrade. Runs started before the upgrade
252
+ record at most `summary`.
253
+
254
+ ## Run transcripts
255
+
256
+ A transcript is the run's conversation: the messages, the tool calls and their
257
+ results, and the files and skills the agent loaded. You can get it yourself,
258
+ without server access, on Claude Code agents.
259
+
260
+ **To turn it on,** set `codingProfile.sessionResume` to `true` with `update_agent`.
261
+ It's off by default and has to be turned on for each agent. It only applies to runs
262
+ started afterward, so an earlier failure has no transcript. The server also needs a
263
+ blob store, set in the environment of the process that launches coding runs:
264
+ `BLOB_STORE` set to `local`, `gcs` or `s3`, plus `BLOB_STORE_LOCAL_DIR`,
265
+ `BLOB_STORE_GCS_BUCKET`, or `BLOB_STORE_S3_BUCKET` and `BLOB_STORE_S3_REGION`.
266
+ Without `BLOB_STORE`, no transcript is stored.
267
+
268
+ **To read one,** call `get_run_transcript` with the run ID. It returns a download
269
+ link that works for 10 minutes and a command. Run `npx @wardby/cli@latest resume -`
270
+ in a clone of the repo and paste the link, which also lets you continue the session
271
+ on your machine.
272
+
273
+ | Transcripts | |
274
+ | ------------------ | ------------------------------------------------------------------------------ |
275
+ | **Who can read** | Anyone who can read the run: the person who triggered it and the agent's owner |
276
+ | **Stored for** | Runs that finish, fail, or stop at their budget |
277
+ | **Not stored for** | Runs stopped with `stop_run` or ended by their timeout |
278
+ | **Removed** | Thinking blocks, the system prompt, the worker's environment, account details |
279
+ | **Redacted** | The agent's attached secrets and the run's own tokens |
280
+ | **Not available** | On Codex agents |
281
+
282
+ Redaction removes secret values, not other sensitive text, so a transcript includes
283
+ what the agent saw in the repo and in command output. Turn this on only for agents
284
+ whose runs you're comfortable sharing with everyone who can read them.
285
+
286
+ **Prompts for Claude Code:**
287
+
288
+ To turn it on:
289
+
290
+ ```
291
+ Turn on transcripts for Wardby agent <agent name>.
292
+ ```
293
+
294
+ To get one:
295
+
296
+ ```
297
+ Get me the transcript for Wardby run <run id>.
298
+ ```
299
+
300
+ See [Resume Claude Code runs locally](../help/resume-runs-locally.md) for more.
301
+
302
+ ## When you need an operator
303
+
304
+ Ask someone with server access when `get_run` and help don't explain a failure. The
305
+ specific reason for a failed coding run is written only to the server log, under
306
+ its `diagnosticId`.
307
+
308
+ **Send them:** the run ID, the `diagnosticId`, the repo, and what you expected to
309
+ happen.
310
+
311
+ **What the operator can do:**
312
+
313
+ 1. Search the control-plane log for the `diagnosticId`, which holds the real reason.
314
+ 2. If that isn't enough, turn on the
315
+ [debug trace](coding-worker-isolation.md#debug-trace) with `debugTraceMinutes`
316
+ and reproduce the failure.
317
+
318
+ The debug trace won't help you directly. Only admins can turn it on, it only covers
319
+ runs started afterward, and its output goes to the run's worker log, which you can't
320
+ read. It can include prompts and repo content, so it isn't exposed through MCP.
321
+
322
+ **What the trace holds:** the agent's whole stream, the commands it ran with their
323
+ output (Claude Code), final usage and duration, and stream failures in full.
324
+ Token-shaped values are redacted. It stops at 2 MiB per run by default.
325
+
326
+ **What MCP gives you:** the trace itself isn't available through MCP. You can only
327
+ turn it on or off with `update_agent` (admin role), see when it expires with
328
+ `get_agent` (`debugTraceUntil`), and see whether a run was traced with `get_run`
329
+ (`debugTrace: true`).
330
+
331
+ **Prompt to try first.** Paste this into any client connected to the Wardby MCP:
332
+
333
+ ```
334
+ Wardby run <run id> didn't do what I expected. What happened, and what can I do?
335
+ If it needs server logs, give me the diagnosticId.
336
+ ```
337
+
338
+ ## Known gaps
339
+
340
+ Two things can't be answered without server access yet.
341
+
342
+ | Gap | Why it matters | What you can do |
343
+ | --------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------- |
344
+ | The specific reason a coding run failed | You get the stage, such as `executor`, but not why | Send the `diagnosticId` to an operator |
345
+ | Why a mention got no reply | With explanations off, a declined mention leaves no reply and no run | Turn explanations on where that's acceptable: `true` is the default |
346
+
347
+ **To turn explanations on,** an operator removes
348
+ `WARDBY_MENTION_EXPLANATIONS=false` from the server's settings, or sets it to
349
+ `true`, then redeploys. Once on, the GitHub App replies to say why a mention started
350
+ nothing. On a public repo, anyone who can read that comment can see what is or isn't
351
+ linked there.
352
+
353
+ Run transcripts are limited to Claude Code runs with `sessionResume` on, so they
354
+ don't help on Codex agents.
@@ -218,6 +218,13 @@ App replying to say why a mention started nothing; pass it to `up.sh` on every
218
218
  run, the same way. See
219
219
  [What a linked review agent does](code-review-agents.md#what-a-linked-review-agent-does).
220
220
 
221
+ `WARDBY_RUN_STEPS` (`off`, `summary` or `detail`) and `RUN_STEP_RETENTION_DAYS`
222
+ (1 to 3650) are optional, not secrets. Pass them to `up.sh` on every run, the
223
+ same way; unset keeps the server defaults (`summary`, 30 days). `up.sh` adds the
224
+ ceiling to the control plane, the coding proxy and the native gateway, and the
225
+ retention to the control plane and the native gateway. See
226
+ [Run steps](debugging-agent-runs.md#run-steps).
227
+
221
228
  Generate `SECRET_APP_KEY` with:
222
229
 
223
230
  ```sh
@@ -401,9 +408,10 @@ server answers `415`, because it checks the content type before the token.
401
408
  Create the first self-hosted login credential. It is printed once.
402
409
  `--role admin` makes this operator account an admin. Only admins can use all
403
410
  the privileged operations: `make_owner`, BYO `workerImageRef`, package
404
- approval, service catalog changes, and model catalog changes. A
405
- `package-approver` can approve packages only, a `service-manager` can change
406
- the service catalog only, and a `model-manager` can change the model catalog
411
+ approval, service catalog changes, model catalog changes, and host providers
412
+ (`hosts:admin`). A `package-approver` can approve packages only, a
413
+ `service-manager` can change the service catalog only, a `model-manager` can
414
+ change the model catalog only, and a `host-manager` can manage host providers
407
415
  only. Users created without `--role` have no roles. See
408
416
  [roles and privileged operations](security-deployment.md#roles-and-privileged-operations).
409
417
 
@@ -454,6 +462,14 @@ Desktop includes it). The images build concurrently, and the stages that only
454
462
  compile JavaScript run on your machine's own architecture, so building the
455
463
  `linux/amd64` images from an arm64 machine emulates only what actually ships.
456
464
 
465
+ `up.sh` adds the cluster to your kubeconfig and makes it the current context, as
466
+ `gcloud container clusters get-credentials` does. From then on it works from its
467
+ own one-cluster copy of that context, so switching contexts in another terminal
468
+ while a deploy runs doesn't send its later steps to a different cluster. The
469
+ copy is readable only by you and is removed when `up.sh` exits. Don't run two
470
+ deploys of the same cluster at once: the second stops at its first Helm step
471
+ with `another operation (install/upgrade/rollback) is in progress`.
472
+
457
473
  A control-plane restart is designed not to drop requests, at the cost of a
458
474
  slower rollout. A new pod must stay Ready for three minutes before the old one
459
475
  is retired, because the load balancer can take well over a minute to start
@@ -585,7 +601,7 @@ delete the class and re-run `up.sh` to change them.
585
601
 
586
602
  ### Native sandbox
587
603
 
588
- Native sandbox requires Wardby 0.5.4 or later.
604
+ Native sandbox requires Wardby 0.6.0 or later.
589
605
 
590
606
  `up.sh` deploys everything the [native sandbox](native-sandbox.md) needs on
591
607
  this cluster. It builds and pushes the `native-worker` image, checks it (Node is
@@ -655,8 +671,9 @@ control plane 1.
655
671
  **Sleeping.** Every minute the scheduler leader scales the coding proxy
656
672
  (`wardby-coding-proxy`) to 0 when no coding run is pending or running and none
657
673
  finished within the idle window. It scales the native gateway
658
- (`wardby-native-gateway`) to 0 when no sandbox native run is pending, running or
659
- recently finished and the gateway has no active session. Either target sleeps
674
+ (`wardby-native-gateway`) to 0 when no sandbox native run and no coding run with
675
+ MCP tools is pending, running or recently finished, and the gateway has no
676
+ active session. Either target sleeps
660
677
  only once at least one idle window has passed since it was last woken (recorded
661
678
  in its `wardby.io/power-woke-at` annotation) and since the control plane
662
679
  started, whichever is later. The condition is checked again immediately before
@@ -664,10 +681,14 @@ scaling. The control plane
664
681
  logs `power: proxy slept (idle 30m)`.
665
682
 
666
683
  **Waking.** Starting a coding run scales the proxy to 1 and waits for a ready
667
- endpoint. Starting a sandbox run does the same for the gateway. The wait is at
684
+ endpoint. Starting a sandbox run does the same for the gateway, and so does starting a
685
+ coding run with MCP tools, whose MCP calls go through the gateway (0.9.0 and later): it wakes the
686
+ proxy and gateway at once and fails before launch with
687
+ [`coding_failure_mcp_gateway_unavailable`](../help/errors/coding-mcp-gateway-unavailable.md)
688
+ if the gateway does not wake. The wait is at
668
689
  least 5 minutes, because a cold Autopilot node can add 1 to 2 minutes of
669
- start-up; a `KUBERNETES_READY_TIMEOUT_MS` (proxy) or
670
- `NATIVE_SANDBOX_READY_TIMEOUT_MS` (gateway) above 5 minutes, set on the
690
+ start-up; a `KUBERNETES_READY_TIMEOUT_MS` (the proxy, and the gateway wake of a coding run) or
691
+ `NATIVE_SANDBOX_READY_TIMEOUT_MS` (the gateway wake of a sandbox run) above 5 minutes, set on the
671
692
  control-plane Deployment, raises it to that value. The first coding run after a
672
693
  control-plane restart also runs the cluster preflight canary, because start-up
673
694
  preflight is deferred while the proxy sleeps (`kubernetes_preflight_deferred`).
@@ -689,8 +710,9 @@ the Viewer shows any such leftover as an old replica rather than a failure.
689
710
  **Sleeping now.** To skip the idle window (for example right after a test), an
690
711
  admin calls the MCP tool `power_sleep`, optionally with `target` set to `proxy`
691
712
  or `gateway` (default both). It scales the target to 0 at once, but never stops
692
- a run: a target with a pending or running run, or for the gateway an active
693
- gateway session, is left up and its run ids are returned under `blocked`.
713
+ a run: a target with a pending or running run (for the gateway, a sandbox run
714
+ or a coding run with MCP tools), or for the gateway an active gateway session,
715
+ is left up and its run ids are returned under `blocked`.
694
716
  Recently finished runs do not block it. The next run wakes the target as usual.
695
717
  `power_status` shows each target's replicas, readiness, last wake time and
696
718
  blocking run ids. Both tools need the `power:manage` scope, which only the
@@ -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
@@ -236,7 +242,7 @@ AUTH_JWKS_URI=https://identity.example.com/your-tenant/.well-known/jwks.json
236
242
  AUTH_AUDIENCE=https://wardby.example.com/mcp
237
243
  # Optional: Wardby roles (see "Wardby roles" above).
238
244
  AUTH_ROLE_CLAIM=groups
239
- 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
240
246
  ```
241
247
 
242
248
  Copy `AUTH_ISSUER` exactly from the token's `iss` claim or the provider's
@@ -272,7 +278,7 @@ Confirm that:
272
278
 
273
279
  - `resource` is the canonical MCP URI;
274
280
  - `authorization_servers` contains the external issuer; and
275
- - `scopes_supported` contains all fifteen Wardby scopes.
281
+ - `scopes_supported` contains all sixteen Wardby scopes.
276
282
 
277
283
  An unauthenticated MCP request must return `401` with a `WWW-Authenticate`
278
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`)
@@ -464,6 +471,7 @@ help article.
464
471
  ## Next steps
465
472
 
466
473
  - [Agent recipes](agent-recipes.md)
474
+ - [Claude Code plugin](claude-code-plugin.md): your runs beside the chat (0.8.0+)
467
475
  - [Runtime architecture](architecture-runtime.md)
468
476
  - [Coding-agent setup](coding-agent-setup.md) and its
469
477
  [local repositories](coding-agent-setup.md#local-repositories) section