@wardby/cli 0.2.1 → 0.4.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 (555) hide show
  1. package/.env.example +53 -4
  2. package/README.md +52 -13
  3. package/dist/claude-coding-worker/driver.d.ts +6 -1
  4. package/dist/claude-coding-worker/driver.js +27 -1
  5. package/dist/claude-coding-worker/main.js +2 -0
  6. package/dist/claude-coding-worker/tool-socket.d.ts +9 -0
  7. package/dist/claude-coding-worker/tool-socket.js +26 -0
  8. package/dist/cli-help.d.ts +1 -1
  9. package/dist/cli-help.js +14 -4
  10. package/dist/cli.d.ts +1 -1
  11. package/dist/cli.js +284 -36
  12. package/dist/coding/base-commit.d.ts +6 -0
  13. package/dist/coding/base-commit.js +12 -0
  14. package/dist/coding/collect-exclude.d.ts +25 -0
  15. package/dist/coding/collect-exclude.js +76 -0
  16. package/dist/coding/profile.d.ts +67 -22
  17. package/dist/coding/profile.js +58 -25
  18. package/dist/coding/protected-path-wording.d.ts +24 -0
  19. package/dist/coding/protected-path-wording.js +55 -0
  20. package/dist/coding/protected-paths.d.ts +31 -0
  21. package/dist/coding/protected-paths.js +48 -0
  22. package/dist/coding/protocol.d.ts +91 -4
  23. package/dist/coding/protocol.js +123 -12
  24. package/dist/coding/provider.d.ts +6 -1
  25. package/dist/coding/provider.js +16 -9
  26. package/dist/coding/registry/adapters.d.ts +2 -0
  27. package/dist/coding/registry/adapters.js +9 -0
  28. package/dist/coding/registry/allowlist.d.ts +9 -0
  29. package/dist/coding/registry/allowlist.js +28 -0
  30. package/dist/coding/registry/json-scan.d.ts +55 -0
  31. package/dist/coding/registry/json-scan.js +191 -0
  32. package/dist/coding/registry/lockfiles.d.ts +6 -0
  33. package/dist/coding/registry/lockfiles.js +89 -0
  34. package/dist/coding/registry/npm-lockfile.d.ts +9 -0
  35. package/dist/coding/registry/npm-lockfile.js +73 -0
  36. package/dist/coding/registry/npm-plan.d.ts +29 -0
  37. package/dist/coding/registry/npm-plan.js +289 -0
  38. package/dist/coding/registry/npm.d.ts +7 -0
  39. package/dist/coding/registry/npm.js +252 -0
  40. package/dist/coding/registry/pypi.d.ts +4 -0
  41. package/dist/coding/registry/pypi.js +210 -0
  42. package/dist/coding/registry/report.d.ts +37 -0
  43. package/dist/coding/registry/report.js +31 -0
  44. package/dist/coding/registry/token.d.ts +4 -0
  45. package/dist/coding/registry/token.js +7 -0
  46. package/dist/coding/registry/types.d.ts +286 -0
  47. package/dist/coding/registry/types.js +19 -0
  48. package/dist/coding/registry/worker-config.d.ts +14 -0
  49. package/dist/coding/registry/worker-config.js +31 -0
  50. package/dist/coding/services/builtins.d.ts +22 -0
  51. package/dist/coding/services/builtins.js +85 -0
  52. package/dist/coding/services/catalog.d.ts +443 -0
  53. package/dist/coding/services/catalog.js +159 -0
  54. package/dist/coding/services/declaration.d.ts +11 -0
  55. package/dist/coding/services/declaration.js +114 -0
  56. package/dist/coding/services/note.d.ts +8 -0
  57. package/dist/coding/services/note.js +15 -0
  58. package/dist/coding/services/resolve.d.ts +25 -0
  59. package/dist/coding/services/resolve.js +50 -0
  60. package/dist/coding/services/wording.d.ts +25 -0
  61. package/dist/coding/services/wording.js +70 -0
  62. package/dist/coding-proxy/main.js +24 -4
  63. package/dist/coding-worker/artifact.d.ts +6 -0
  64. package/dist/coding-worker/debug-trace.d.ts +37 -0
  65. package/dist/coding-worker/debug-trace.js +117 -0
  66. package/dist/coding-worker/driver.d.ts +13 -1
  67. package/dist/coding-worker/driver.js +102 -13
  68. package/dist/coding-worker/errors.js +8 -0
  69. package/dist/coding-worker/main.js +10 -2
  70. package/dist/coding-worker/sdk.d.ts +2 -2
  71. package/dist/coding-worker/sdk.js +7 -2
  72. package/dist/coding-worker/types.d.ts +3 -0
  73. package/dist/config/providers.d.ts +66 -0
  74. package/dist/config/providers.js +137 -0
  75. package/dist/core/attribution.d.ts +101 -0
  76. package/dist/core/attribution.js +208 -0
  77. package/dist/core/budget-groups.d.ts +120 -10
  78. package/dist/core/budget-groups.js +133 -24
  79. package/dist/core/budget-wording.d.ts +22 -0
  80. package/dist/core/budget-wording.js +55 -0
  81. package/dist/core/coding-queue.d.ts +3 -0
  82. package/dist/core/coding-queue.js +6 -2
  83. package/dist/core/coding-service-status.d.ts +11 -0
  84. package/dist/core/coding-service-status.js +17 -0
  85. package/dist/core/cost-report.d.ts +88 -0
  86. package/dist/core/cost-report.js +248 -0
  87. package/dist/core/datastores.js +18 -2
  88. package/dist/core/db.d.ts +5 -1
  89. package/dist/core/db.js +8 -2
  90. package/dist/core/dispatch.d.ts +74 -7
  91. package/dist/core/dispatch.js +382 -47
  92. package/dist/core/engine-native.js +44 -14
  93. package/dist/core/glob.d.ts +10 -0
  94. package/dist/core/glob.js +33 -0
  95. package/dist/core/grants.d.ts +86 -0
  96. package/dist/core/grants.js +126 -0
  97. package/dist/core/host-events.d.ts +72 -0
  98. package/dist/core/host-events.js +597 -0
  99. package/dist/core/host-identity-links.d.ts +54 -0
  100. package/dist/core/host-identity-links.js +189 -0
  101. package/dist/core/host-status.d.ts +78 -0
  102. package/dist/core/host-status.js +228 -0
  103. package/dist/core/in-flight-runs.d.ts +8 -0
  104. package/dist/core/in-flight-runs.js +56 -0
  105. package/dist/core/issue-bridge.d.ts +60 -0
  106. package/dist/core/issue-bridge.js +189 -0
  107. package/dist/core/issue-dedupe.d.ts +70 -0
  108. package/dist/core/issue-dedupe.js +255 -0
  109. package/dist/core/issue-events.d.ts +42 -0
  110. package/dist/core/issue-events.js +155 -0
  111. package/dist/core/issue-status.d.ts +29 -0
  112. package/dist/core/issue-status.js +241 -0
  113. package/dist/core/issue-tracker-tools.d.ts +64 -0
  114. package/dist/core/issue-tracker-tools.js +850 -0
  115. package/dist/core/model-usage.d.ts +10 -0
  116. package/dist/core/model-usage.js +24 -0
  117. package/dist/core/provider-wording.d.ts +12 -0
  118. package/dist/core/provider-wording.js +44 -0
  119. package/dist/core/reconciler.d.ts +42 -2
  120. package/dist/core/reconciler.js +97 -2
  121. package/dist/core/repo-access.d.ts +99 -0
  122. package/dist/core/repo-access.js +136 -0
  123. package/dist/core/review-host-checks.d.ts +11 -0
  124. package/dist/core/review-host-checks.js +41 -0
  125. package/dist/core/review-host-tools.d.ts +47 -0
  126. package/dist/core/review-host-tools.js +354 -0
  127. package/dist/core/run-heartbeat.d.ts +27 -0
  128. package/dist/core/run-heartbeat.js +54 -0
  129. package/dist/core/run-pricing.d.ts +61 -0
  130. package/dist/core/run-pricing.js +56 -0
  131. package/dist/core/runner.d.ts +33 -8
  132. package/dist/core/runner.js +410 -62
  133. package/dist/core/scheduler.d.ts +4 -1
  134. package/dist/core/scheduler.js +3 -2
  135. package/dist/core/secrets.d.ts +11 -2
  136. package/dist/core/secrets.js +25 -6
  137. package/dist/core/self-defects.d.ts +80 -0
  138. package/dist/core/self-defects.js +180 -0
  139. package/dist/core/subagent-memory-tools.d.ts +1 -1
  140. package/dist/core/subagent-memory-tools.js +16 -3
  141. package/dist/core/tool-admin.d.ts +81 -0
  142. package/dist/core/tool-admin.js +129 -0
  143. package/dist/core/tool-names.d.ts +42 -0
  144. package/dist/core/tool-names.js +67 -0
  145. package/dist/core/untrusted-content.d.ts +32 -0
  146. package/dist/core/untrusted-content.js +72 -0
  147. package/dist/core/webhooks.d.ts +17 -2
  148. package/dist/core/webhooks.js +42 -3
  149. package/dist/generated/prisma/browser.d.ts +166 -0
  150. package/dist/generated/prisma/client.d.ts +166 -0
  151. package/dist/generated/prisma/commonInputTypes.d.ts +152 -52
  152. package/dist/generated/prisma/enums.d.ts +13 -0
  153. package/dist/generated/prisma/enums.js +12 -1
  154. package/dist/generated/prisma/internal/class.d.ts +242 -0
  155. package/dist/generated/prisma/internal/class.js +4 -4
  156. package/dist/generated/prisma/internal/prismaNamespace.d.ts +2571 -577
  157. package/dist/generated/prisma/internal/prismaNamespace.js +312 -6
  158. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +328 -0
  159. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +312 -6
  160. package/dist/generated/prisma/models/Agent.d.ts +682 -1
  161. package/dist/generated/prisma/models/AgentIssueProject.d.ts +1838 -0
  162. package/dist/generated/prisma/models/AgentIssueProject.js +1 -0
  163. package/dist/generated/prisma/models/AgentRepository.d.ts +1425 -0
  164. package/dist/generated/prisma/models/AgentRepository.js +1 -0
  165. package/dist/generated/prisma/models/AgentTool.d.ts +95 -1
  166. package/dist/generated/prisma/models/AuthUser.d.ts +56 -1
  167. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +258 -7
  168. package/dist/generated/prisma/models/CodingProxySession.d.ts +195 -2
  169. package/dist/generated/prisma/models/CodingRun.d.ts +1405 -95
  170. package/dist/generated/prisma/models/CodingRunServiceStatus.d.ts +1404 -0
  171. package/dist/generated/prisma/models/CodingRunServiceStatus.js +1 -0
  172. package/dist/generated/prisma/models/CodingService.d.ts +1348 -0
  173. package/dist/generated/prisma/models/CodingService.js +1 -0
  174. package/dist/generated/prisma/models/HostEventDelivery.d.ts +946 -0
  175. package/dist/generated/prisma/models/HostEventDelivery.js +1 -0
  176. package/dist/generated/prisma/models/HostIdentity.d.ts +1232 -0
  177. package/dist/generated/prisma/models/HostIdentity.js +1 -0
  178. package/dist/generated/prisma/models/HostIdentityLinkRequest.d.ts +1473 -0
  179. package/dist/generated/prisma/models/HostIdentityLinkRequest.js +1 -0
  180. package/dist/generated/prisma/models/IssueFingerprint.d.ts +1183 -0
  181. package/dist/generated/prisma/models/IssueFingerprint.js +1 -0
  182. package/dist/generated/prisma/models/IssuePullRequest.d.ts +1255 -0
  183. package/dist/generated/prisma/models/IssuePullRequest.js +1 -0
  184. package/dist/generated/prisma/models/ModelCatalogEntry.d.ts +1322 -0
  185. package/dist/generated/prisma/models/ModelCatalogEntry.js +1 -0
  186. package/dist/generated/prisma/models/Principal.d.ts +455 -0
  187. package/dist/generated/prisma/models/RegistryAllowance.d.ts +1148 -0
  188. package/dist/generated/prisma/models/RegistryAllowance.js +1 -0
  189. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +1219 -0
  190. package/dist/generated/prisma/models/RegistryApprovedVersion.js +1 -0
  191. package/dist/generated/prisma/models/RegistryFetch.d.ts +1428 -0
  192. package/dist/generated/prisma/models/RegistryFetch.js +1 -0
  193. package/dist/generated/prisma/models/RegistryPlanRefusal.d.ts +1294 -0
  194. package/dist/generated/prisma/models/RegistryPlanRefusal.js +1 -0
  195. package/dist/generated/prisma/models/RegistryVersionFact.d.ts +1085 -0
  196. package/dist/generated/prisma/models/RegistryVersionFact.js +1 -0
  197. package/dist/generated/prisma/models/ResourceGrant.d.ts +1437 -0
  198. package/dist/generated/prisma/models/ResourceGrant.js +1 -0
  199. package/dist/generated/prisma/models/Run.d.ts +1402 -82
  200. package/dist/generated/prisma/models/RunAttribution.d.ts +1259 -0
  201. package/dist/generated/prisma/models/RunAttribution.js +1 -0
  202. package/dist/generated/prisma/models/RunHostCheck.d.ts +1239 -0
  203. package/dist/generated/prisma/models/RunHostCheck.js +1 -0
  204. package/dist/generated/prisma/models/RunHostStatus.d.ts +1315 -0
  205. package/dist/generated/prisma/models/RunHostStatus.js +1 -0
  206. package/dist/generated/prisma/models/RunIssueStatus.d.ts +1199 -0
  207. package/dist/generated/prisma/models/RunIssueStatus.js +1 -0
  208. package/dist/generated/prisma/models/RunModelUsage.d.ts +1316 -0
  209. package/dist/generated/prisma/models/RunModelUsage.js +1 -0
  210. package/dist/generated/prisma/models/Tool.d.ts +15 -3
  211. package/dist/generated/prisma/models/WorkItem.d.ts +1408 -0
  212. package/dist/generated/prisma/models/WorkItem.js +1 -0
  213. package/dist/generated/prisma/models.d.ts +22 -0
  214. package/dist/help/build.d.ts +1 -0
  215. package/dist/help/build.js +9 -0
  216. package/dist/help/catalog.d.ts +24 -0
  217. package/dist/help/catalog.js +160 -0
  218. package/dist/help/cli.d.ts +2 -0
  219. package/dist/help/cli.js +65 -0
  220. package/dist/help/runtime.d.ts +3 -0
  221. package/dist/help/runtime.js +44 -0
  222. package/dist/help/search.d.ts +9 -0
  223. package/dist/help/search.js +104 -0
  224. package/dist/help-index.json +999 -0
  225. package/dist/import/cli-args.js +3 -2
  226. package/dist/import/create.d.ts +5 -0
  227. package/dist/import/create.js +67 -13
  228. package/dist/import/index.js +19 -9
  229. package/dist/import/neutral-schema.d.ts +18 -18
  230. package/dist/knowledge/check.d.ts +13 -0
  231. package/dist/knowledge/check.js +69 -0
  232. package/dist/knowledge/cli.d.ts +14 -0
  233. package/dist/knowledge/cli.js +67 -0
  234. package/dist/knowledge/concept.d.ts +54 -0
  235. package/dist/knowledge/concept.js +78 -0
  236. package/dist/knowledge/note.d.ts +11 -0
  237. package/dist/knowledge/note.js +39 -0
  238. package/dist/knowledge/relevance.d.ts +11 -0
  239. package/dist/knowledge/relevance.js +14 -0
  240. package/dist/knowledge/span-hash.d.ts +3 -0
  241. package/dist/knowledge/span-hash.js +16 -0
  242. package/dist/mcp/auth/access.d.ts +72 -0
  243. package/dist/mcp/auth/access.js +58 -0
  244. package/dist/mcp/auth/grants-cli.d.ts +149 -0
  245. package/dist/mcp/auth/grants-cli.js +518 -0
  246. package/dist/mcp/auth/host-account-cli.d.ts +2 -0
  247. package/dist/mcp/auth/host-account-cli.js +47 -0
  248. package/dist/mcp/auth/ownership.d.ts +25 -51
  249. package/dist/mcp/auth/ownership.js +19 -14
  250. package/dist/mcp/auth/repo-authorization.d.ts +22 -0
  251. package/dist/mcp/auth/repo-authorization.js +51 -0
  252. package/dist/mcp/auth/resource-server.d.ts +33 -2
  253. package/dist/mcp/auth/resource-server.js +99 -3
  254. package/dist/mcp/auth/self-hosted/browser.js +2 -2
  255. package/dist/mcp/auth/self-hosted/cli.js +47 -13
  256. package/dist/mcp/auth/self-hosted/credentials.d.ts +23 -5
  257. package/dist/mcp/auth/self-hosted/credentials.js +62 -4
  258. package/dist/mcp/auth/self-hosted/session.d.ts +7 -6
  259. package/dist/mcp/context.d.ts +30 -1
  260. package/dist/mcp/errors.d.ts +25 -6
  261. package/dist/mcp/errors.js +98 -0
  262. package/dist/mcp/host-events/deliveries.d.ts +9 -0
  263. package/dist/mcp/host-events/deliveries.js +17 -0
  264. package/dist/mcp/host-events/github-ingress.d.ts +38 -0
  265. package/dist/mcp/host-events/github-ingress.js +83 -0
  266. package/dist/mcp/host-events/github-user-callback.d.ts +18 -0
  267. package/dist/mcp/host-events/github-user-callback.js +50 -0
  268. package/dist/mcp/host-events/jira-ingress.d.ts +29 -0
  269. package/dist/mcp/host-events/jira-ingress.js +92 -0
  270. package/dist/mcp/index.d.ts +10 -1
  271. package/dist/mcp/index.js +187 -19
  272. package/dist/mcp/server.js +32 -11
  273. package/dist/mcp/tools/agents.js +519 -50
  274. package/dist/mcp/tools/budget-groups.js +3 -3
  275. package/dist/mcp/tools/cost-report.d.ts +8 -0
  276. package/dist/mcp/tools/cost-report.js +60 -0
  277. package/dist/mcp/tools/datastore.js +22 -15
  278. package/dist/mcp/tools/grants.d.ts +2 -0
  279. package/dist/mcp/tools/grants.js +239 -0
  280. package/dist/mcp/tools/help.d.ts +5 -0
  281. package/dist/mcp/tools/help.js +67 -0
  282. package/dist/mcp/tools/host-accounts.d.ts +2 -0
  283. package/dist/mcp/tools/host-accounts.js +114 -0
  284. package/dist/mcp/tools/issue-projects.d.ts +2 -0
  285. package/dist/mcp/tools/issue-projects.js +238 -0
  286. package/dist/mcp/tools/memory.d.ts +7 -1
  287. package/dist/mcp/tools/memory.js +5 -5
  288. package/dist/mcp/tools/model-catalog.d.ts +22 -0
  289. package/dist/mcp/tools/model-catalog.js +423 -0
  290. package/dist/mcp/tools/repositories.d.ts +2 -0
  291. package/dist/mcp/tools/repositories.js +182 -0
  292. package/dist/mcp/tools/runs.d.ts +6 -0
  293. package/dist/mcp/tools/runs.js +60 -6
  294. package/dist/mcp/tools/scheduling.js +3 -6
  295. package/dist/mcp/tools/secrets.js +18 -6
  296. package/dist/mcp/tools/services.d.ts +2 -0
  297. package/dist/mcp/tools/services.js +222 -0
  298. package/dist/mcp/tools/subagents.js +52 -16
  299. package/dist/mcp/tools/tools.d.ts +41 -0
  300. package/dist/mcp/tools/tools.js +201 -40
  301. package/dist/mcp/tools/trigger.js +65 -7
  302. package/dist/mcp/tools/webhooks.js +15 -4
  303. package/dist/mcp/transport/streamable-http.d.ts +15 -0
  304. package/dist/mcp/transport/streamable-http.js +55 -3
  305. package/dist/mcp/webhooks/ingress.d.ts +2 -1
  306. package/dist/mcp/webhooks/ingress.js +9 -2
  307. package/dist/providers/auth/delegating.d.ts +19 -0
  308. package/dist/providers/auth/delegating.js +71 -0
  309. package/dist/providers/auth/index.d.ts +2 -0
  310. package/dist/providers/auth/index.js +11 -0
  311. package/dist/providers/auth/self-hosted.d.ts +10 -2
  312. package/dist/providers/auth/self-hosted.js +55 -6
  313. package/dist/providers/auth/types.d.ts +6 -0
  314. package/dist/providers/coding-proxy/memory-ledger.d.ts +4 -1
  315. package/dist/providers/coding-proxy/memory-ledger.js +31 -3
  316. package/dist/providers/coding-proxy/metering.d.ts +6 -1
  317. package/dist/providers/coding-proxy/metering.js +41 -4
  318. package/dist/providers/coding-proxy/prisma-ledger.d.ts +17 -0
  319. package/dist/providers/coding-proxy/prisma-ledger.js +106 -8
  320. package/dist/providers/coding-proxy/proxy.d.ts +25 -2
  321. package/dist/providers/coding-proxy/proxy.js +561 -38
  322. package/dist/providers/coding-proxy/registry/audit.d.ts +131 -0
  323. package/dist/providers/coding-proxy/registry/audit.js +380 -0
  324. package/dist/providers/coding-proxy/registry/bounded-fetch.d.ts +16 -0
  325. package/dist/providers/coding-proxy/registry/bounded-fetch.js +77 -0
  326. package/dist/providers/coding-proxy/registry/plan.d.ts +58 -0
  327. package/dist/providers/coding-proxy/registry/plan.js +304 -0
  328. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +34 -0
  329. package/dist/providers/coding-proxy/registry/prisma-store.js +151 -0
  330. package/dist/providers/coding-proxy/registry/service.d.ts +213 -0
  331. package/dist/providers/coding-proxy/registry/service.js +1137 -0
  332. package/dist/providers/coding-proxy/registry/store.d.ts +127 -0
  333. package/dist/providers/coding-proxy/registry/store.js +70 -0
  334. package/dist/providers/coding-proxy/runtime.d.ts +17 -0
  335. package/dist/providers/coding-proxy/runtime.js +63 -0
  336. package/dist/providers/coding-proxy/secure-fetch.js +0 -1
  337. package/dist/providers/coding-proxy/server.d.ts +11 -0
  338. package/dist/providers/coding-proxy/server.js +163 -0
  339. package/dist/providers/coding-proxy/types.d.ts +33 -1
  340. package/dist/providers/coding-proxy/types.js +12 -1
  341. package/dist/providers/engine/types.d.ts +29 -0
  342. package/dist/providers/executor/build.d.ts +2 -2
  343. package/dist/providers/executor/composition.d.ts +3 -0
  344. package/dist/providers/executor/composition.js +28 -1
  345. package/dist/providers/executor/container.d.ts +134 -4
  346. package/dist/providers/executor/container.js +394 -37
  347. package/dist/providers/executor/dbos.d.ts +4 -3
  348. package/dist/providers/executor/dbos.js +7 -5
  349. package/dist/providers/executor/in-process.d.ts +2 -3
  350. package/dist/providers/executor/routing.d.ts +13 -0
  351. package/dist/providers/executor/routing.js +18 -0
  352. package/dist/providers/executor/types.d.ts +34 -0
  353. package/dist/providers/issue-tracker/adf.d.ts +31 -0
  354. package/dist/providers/issue-tracker/adf.js +181 -0
  355. package/dist/providers/issue-tracker/index.d.ts +5 -0
  356. package/dist/providers/issue-tracker/index.js +12 -0
  357. package/dist/providers/issue-tracker/jira-client.d.ts +41 -0
  358. package/dist/providers/issue-tracker/jira-client.js +151 -0
  359. package/dist/providers/issue-tracker/jira-events.d.ts +3 -0
  360. package/dist/providers/issue-tracker/jira-events.js +98 -0
  361. package/dist/providers/issue-tracker/jira.d.ts +116 -0
  362. package/dist/providers/issue-tracker/jira.js +502 -0
  363. package/dist/providers/issue-tracker/types.d.ts +269 -0
  364. package/dist/providers/issue-tracker/types.js +16 -0
  365. package/dist/providers/jobs/claude-tool-setup.d.ts +23 -0
  366. package/dist/providers/jobs/claude-tool-setup.js +50 -0
  367. package/dist/providers/jobs/collect-prune.d.ts +7 -0
  368. package/dist/providers/jobs/collect-prune.js +27 -0
  369. package/dist/providers/jobs/docker-isolation.d.ts +48 -3
  370. package/dist/providers/jobs/docker-isolation.js +213 -22
  371. package/dist/providers/jobs/docker-services.d.ts +35 -0
  372. package/dist/providers/jobs/docker-services.js +191 -0
  373. package/dist/providers/jobs/docker.d.ts +53 -2
  374. package/dist/providers/jobs/docker.js +307 -32
  375. package/dist/providers/jobs/fake-kubernetes-api.d.ts +1 -0
  376. package/dist/providers/jobs/fake-kubernetes-api.js +12 -3
  377. package/dist/providers/jobs/kubernetes-isolation.d.ts +17 -2
  378. package/dist/providers/jobs/kubernetes-isolation.js +238 -57
  379. package/dist/providers/jobs/kubernetes-platform.d.ts +10 -4
  380. package/dist/providers/jobs/kubernetes-platform.js +11 -5
  381. package/dist/providers/jobs/kubernetes-preflight.js +3 -0
  382. package/dist/providers/jobs/kubernetes.d.ts +24 -2
  383. package/dist/providers/jobs/kubernetes.js +153 -22
  384. package/dist/providers/jobs/service-state.d.ts +22 -0
  385. package/dist/providers/jobs/service-state.js +17 -0
  386. package/dist/providers/jobs/types.d.ts +18 -0
  387. package/dist/providers/llm/anthropic.d.ts +3 -3
  388. package/dist/providers/llm/anthropic.js +3 -5
  389. package/dist/providers/llm/bedrock.d.ts +3 -3
  390. package/dist/providers/llm/bedrock.js +3 -8
  391. package/dist/providers/llm/catalog-lookup.d.ts +10 -0
  392. package/dist/providers/llm/catalog-lookup.js +15 -0
  393. package/dist/providers/llm/catalog-shipped.d.ts +18 -0
  394. package/dist/providers/llm/catalog-shipped.js +197 -0
  395. package/dist/providers/llm/catalog-store.d.ts +58 -0
  396. package/dist/providers/llm/catalog-store.js +138 -0
  397. package/dist/providers/llm/catalog-types.d.ts +66 -0
  398. package/dist/providers/llm/catalog-types.js +64 -0
  399. package/dist/providers/llm/catalog.d.ts +61 -0
  400. package/dist/providers/llm/catalog.js +147 -0
  401. package/dist/providers/llm/claude-messages.d.ts +5 -1
  402. package/dist/providers/llm/claude-messages.js +1 -0
  403. package/dist/providers/llm/claude-provider.d.ts +10 -12
  404. package/dist/providers/llm/claude-provider.js +15 -6
  405. package/dist/providers/llm/index.d.ts +9 -6
  406. package/dist/providers/llm/index.js +8 -5
  407. package/dist/providers/llm/openai.d.ts +14 -5
  408. package/dist/providers/llm/openai.js +24 -14
  409. package/dist/providers/llm/pricing-core.d.ts +5 -3
  410. package/dist/providers/llm/registration.js +8 -12
  411. package/dist/providers/llm/routing.d.ts +21 -11
  412. package/dist/providers/llm/routing.js +47 -13
  413. package/dist/providers/llm/types.d.ts +12 -0
  414. package/dist/providers/llm/types.js +8 -1
  415. package/dist/providers/review-host/diff-lines.d.ts +16 -0
  416. package/dist/providers/review-host/diff-lines.js +59 -0
  417. package/dist/providers/review-host/github-events.d.ts +6 -0
  418. package/dist/providers/review-host/github-events.js +226 -0
  419. package/dist/providers/review-host/github-user-auth.d.ts +38 -0
  420. package/dist/providers/review-host/github-user-auth.js +128 -0
  421. package/dist/providers/review-host/github.d.ts +57 -0
  422. package/dist/providers/review-host/github.js +568 -0
  423. package/dist/providers/review-host/index.d.ts +12 -0
  424. package/dist/providers/review-host/index.js +30 -0
  425. package/dist/providers/review-host/review-format.d.ts +19 -0
  426. package/dist/providers/review-host/review-format.js +59 -0
  427. package/dist/providers/review-host/types.d.ts +309 -0
  428. package/dist/providers/review-host/types.js +24 -0
  429. package/dist/providers/vcs/git.d.ts +16 -6
  430. package/dist/providers/vcs/git.js +78 -34
  431. package/dist/providers/vcs/github.d.ts +94 -3
  432. package/dist/providers/vcs/github.js +223 -17
  433. package/dist/providers/vcs/types.d.ts +48 -4
  434. package/dist/quickstart/index.d.ts +2 -0
  435. package/dist/quickstart/index.js +36 -8
  436. package/dist/sandbox/fetch-policy.d.ts +20 -2
  437. package/dist/sandbox/fetch-policy.js +64 -3
  438. package/dist/sandbox/host-functions.d.ts +9 -1
  439. package/dist/sandbox/host-functions.js +12 -5
  440. package/dist/serve.js +8 -2
  441. package/dist/viewer/api-schema.d.ts +2757 -0
  442. package/dist/viewer/api-schema.js +165 -0
  443. package/dist/viewer/build-schemas.d.ts +2 -0
  444. package/dist/viewer/build-schemas.js +18 -0
  445. package/dist/viewer/event-bus.d.ts +38 -0
  446. package/dist/viewer/event-bus.js +232 -0
  447. package/dist/viewer/graph.d.ts +40 -0
  448. package/dist/viewer/graph.js +243 -0
  449. package/dist/viewer/http.d.ts +30 -0
  450. package/dist/viewer/http.js +133 -0
  451. package/dist/viewer/run-detail.d.ts +4 -0
  452. package/dist/viewer/run-detail.js +61 -0
  453. package/dist/wardby-bin.js +11 -0
  454. package/docs/README.md +40 -0
  455. package/docs/agent-recipes.md +383 -0
  456. package/docs/architecture-runtime.md +90 -0
  457. package/docs/assets/brand/wardby-icon-512.png +0 -0
  458. package/docs/assets/brand/wardby-icon.svg +16 -0
  459. package/docs/assets/brand/wardby-mascot-profile-512.png +0 -0
  460. package/docs/assets/brand/wardby-mascot.png +0 -0
  461. package/docs/assets/brand/wardby-mascot.svg +5 -0
  462. package/docs/assets/wardby-workflow.svg +106 -0
  463. package/docs/code-review-agents.md +508 -0
  464. package/docs/coding-agent-setup.md +175 -0
  465. package/docs/coding-packages.md +455 -0
  466. package/docs/coding-services.md +300 -0
  467. package/docs/coding-worker-byo-images.md +98 -0
  468. package/docs/coding-worker-isolation.md +1068 -0
  469. package/docs/getting-started-gke.md +632 -0
  470. package/docs/getting-started-identity-provider.md +319 -0
  471. package/docs/getting-started.md +147 -0
  472. package/docs/jira-agents.md +649 -0
  473. package/docs/knowledge.md +387 -0
  474. package/docs/models.md +221 -0
  475. package/docs/observability.md +53 -0
  476. package/docs/release-verification.md +66 -0
  477. package/docs/security-deployment.md +667 -0
  478. package/docs/viewer-api.md +142 -0
  479. package/help/admin-viewer.md +39 -0
  480. package/help/agent-recipes.md +173 -0
  481. package/help/architecture-agent.md +189 -0
  482. package/help/builder-agent.md +80 -0
  483. package/help/code-review-agents.md +37 -0
  484. package/help/coding-packages.md +31 -0
  485. package/help/coding-services.md +71 -0
  486. package/help/cost-attribution.md +67 -0
  487. package/help/creating-agents.md +90 -0
  488. package/help/deploy-gke.md +45 -0
  489. package/help/deployment-targets.md +39 -0
  490. package/help/errors/budget-group-exhausted.md +25 -0
  491. package/help/errors/docker-isolation-unsupported.md +26 -0
  492. package/help/errors/model-unavailable.md +63 -0
  493. package/help/errors/protected-path.md +45 -0
  494. package/help/errors/repo-access.md +27 -0
  495. package/help/errors/service-declaration-invalid.md +27 -0
  496. package/help/errors/service-declaration-unavailable.md +25 -0
  497. package/help/errors/service-launcher-unsupported.md +30 -0
  498. package/help/errors/service-not-allowed.md +27 -0
  499. package/help/errors/service-unknown.md +23 -0
  500. package/help/errors/service-unready.md +49 -0
  501. package/help/getting-started.md +32 -0
  502. package/help/github.md +48 -0
  503. package/help/identity-and-access.md +44 -0
  504. package/help/jira.md +135 -0
  505. package/help/knowledge.md +47 -0
  506. package/help/mcp.md +30 -0
  507. package/help/models.md +90 -0
  508. package/help/native-capabilities.md +30 -0
  509. package/help/observability.md +41 -0
  510. package/help/operating-agents.md +36 -0
  511. package/help/security.md +27 -0
  512. package/help/troubleshooting/budgets.md +32 -0
  513. package/help/troubleshooting/coding-workers.md +47 -0
  514. package/help/troubleshooting/repository-access.md +27 -0
  515. package/package.json +14 -3
  516. package/prisma/migrations/20260925010000_coding_collect_exclude/migration.sql +8 -0
  517. package/prisma/migrations/20260925015000_allowed_egress_default/migration.sql +8 -0
  518. package/prisma/migrations/20260925020000_coding_package_registry/migration.sql +55 -0
  519. package/prisma/migrations/20260925030000_tool_name_per_owner/migration.sql +11 -0
  520. package/prisma/migrations/20260926010000_run_trigger_host_event/migration.sql +7 -0
  521. package/prisma/migrations/20260926020000_code_review_hosts/migration.sql +53 -0
  522. package/prisma/migrations/20260926030000_auth_user_roles/migration.sql +9 -0
  523. package/prisma/migrations/20260926040000_agent_effort/migration.sql +6 -0
  524. package/prisma/migrations/20260926050000_registry_lockfile_plan/migration.sql +32 -0
  525. package/prisma/migrations/20260926050000_repo_access_authorization/migration.sql +82 -0
  526. package/prisma/migrations/20260926060000_registry_plan_refusal/migration.sql +19 -0
  527. package/prisma/migrations/20260926100000_registry_plan_refusal_published_at/migration.sql +5 -0
  528. package/prisma/migrations/20260926190000_run_host_status/migration.sql +18 -0
  529. package/prisma/migrations/20260926210000_run_host_status_at_dispatch/migration.sql +5 -0
  530. package/prisma/migrations/20260927010000_resource_grants/migration.sql +72 -0
  531. package/prisma/migrations/20260927020000_proxy_session_budget_exhausted/migration.sql +3 -0
  532. package/prisma/migrations/20260927030000_coding_debug_trace/migration.sql +4 -0
  533. package/prisma/migrations/20260927040000_proxy_session_upstream_failure/migration.sql +3 -0
  534. package/prisma/migrations/20260927050000_coding_run_services/migration.sql +74 -0
  535. package/prisma/migrations/20260928000000_coding_run_tool_image/migration.sql +5 -0
  536. package/prisma/migrations/20260930000000_jira_issue_projects/migration.sql +34 -0
  537. package/prisma/migrations/20261001000000_jira_phase2_allowlists/migration.sql +3 -0
  538. package/prisma/migrations/20261001010000_jira_link_types_allowlist/migration.sql +2 -0
  539. package/prisma/migrations/20261002000000_jira_coding_bridge/migration.sql +28 -0
  540. package/prisma/migrations/20261002010000_jira_issue_creation/migration.sql +25 -0
  541. package/prisma/migrations/20261003000000_issue_cost_attribution/migration.sql +56 -0
  542. package/prisma/migrations/20261003010000_coding_run_service_status/migration.sql +23 -0
  543. package/prisma/migrations/20261003020000_viewer_notify/migration.sql +54 -0
  544. package/prisma/migrations/20261003030000_viewer_notify_fixes/migration.sql +47 -0
  545. package/prisma/migrations/20261003040000_viewer_indexes/migration.sql +12 -0
  546. package/prisma/migrations/20261004000000_model_catalog/migration.sql +26 -0
  547. package/prisma/schema.prisma +663 -21
  548. package/dist/mcp/tools/models.d.ts +0 -8
  549. package/dist/mcp/tools/models.js +0 -15
  550. package/dist/providers/llm/pricing-anthropic.d.ts +0 -4
  551. package/dist/providers/llm/pricing-anthropic.js +0 -30
  552. package/dist/providers/llm/pricing-bedrock-claude.d.ts +0 -12
  553. package/dist/providers/llm/pricing-bedrock-claude.js +0 -37
  554. package/dist/providers/llm/pricing.d.ts +0 -30
  555. package/dist/providers/llm/pricing.js +0 -74
@@ -0,0 +1,383 @@
1
+ # Agent recipes
2
+
3
+ Two complete agent setups you can ask your MCP client to build, made only from
4
+ shipped Wardby features:
5
+
6
+ - [Recipe A: an architecture keeper](#recipe-a-an-architecture-keeper), three
7
+ cooperating agents that keep a repository's architecture knowledge accurate.
8
+ - [Recipe B: a builder per language](#recipe-b-a-builder-per-language), a
9
+ coding agent that turns an `@mention` into a draft pull request, with notes for
10
+ Node/TypeScript, Python, and other languages.
11
+
12
+ Each recipe gives the one-paragraph ask you paste into Claude or Codex, the
13
+ configuration that results, and what it produces. Both use `your-org/your-repo`
14
+ as a placeholder repository.
15
+
16
+ Agent names are unique across the whole instance, so the examples use
17
+ repo-scoped names such as `<repo>-architect`. The sub-agent bound names
18
+ (`architect`, `builder`) stay fixed so the delegate tools keep their names.
19
+
20
+ ## Before you start
21
+
22
+ These recipes go beyond the quickstart. Check each item.
23
+
24
+ 1. **Version.** The recipes require Wardby 0.4.0 or later. The knowledge note in
25
+ coding runs, `wardby knowledge check`, and the `push` trigger are not in
26
+ earlier releases.
27
+ 2. **Coding-agent setup.** The quickstart runs native agents only: it does not
28
+ install a GitHub App or build worker images. Both recipes use coding agents,
29
+ so complete [Coding-agent setup](coding-agent-setup.md) first: a GitHub App
30
+ installed on the repository, a worker image, the coding proxy, and a Docker or
31
+ Kubernetes job launcher. Run `wardby coding preflight` to check it. For a
32
+ hosted deployment, [Getting started on GKE](getting-started-gke.md) covers
33
+ this.
34
+ 3. **A GitHub account link.** Link your GitHub account once with
35
+ `link_host_account`. Creating a coding agent or linking a repository checks
36
+ that you have write access to the repository
37
+ ([details](code-review-agents.md#who-may-give-an-agent-a-repository)).
38
+ 4. **A public HTTPS URL for GitHub webhooks.** The event triggers (`push` for the
39
+ merge watcher, `pull_request` for the reviewer, `mention` for the router) work
40
+ only when GitHub can deliver webhooks to your Wardby instance. Set the App's
41
+ webhook URL to `https://<your-host>/hosts/github/events` and its webhook
42
+ secret to the value of `GITHUB_APP_WEBHOOK_SECRET`
43
+ ([registering the App](code-review-agents.md#registering-the-github-app)). A
44
+ laptop install is not reachable from GitHub by default, so it needs a public
45
+ HTTPS endpoint in front of it (the
46
+ [runtime architecture](architecture-runtime.md) diagram shows an HTTPS tunnel
47
+ in front of the local server) or a hosted deployment such as
48
+ [GKE](getting-started-gke.md). Scheduled and manually triggered runs need no
49
+ webhook.
50
+ 5. **App events.** Tick the events each trigger needs in the App's settings:
51
+ Pull request and Check run for reviews; Issue comment, Pull request review
52
+ comment, and Issues for mentions; and **Push** for the merge watcher. Each is
53
+ its own checkbox
54
+ ([registering the App](code-review-agents.md#registering-the-github-app)).
55
+ 6. **Models.** Pick ids from `list_models` ([Models and pricing](models.md)). The
56
+ examples use `claude-sonnet-5` for the capable coding model and
57
+ `claude-haiku-4-5` for the small fast one; use whatever your deployment has
58
+ enabled. A coding agent's model must be supported by its coding provider.
59
+
60
+ ## Recipe A: an architecture keeper
61
+
62
+ **What it does.** Keeps `docs/knowledge/` (see
63
+ [Architecture knowledge bundles](knowledge.md)) accurate and growing, and lets
64
+ coding agents and reviewers use it. **Triggers:** the architect runs weekly on a
65
+ schedule; the merge watcher runs on every merge to the default branch; the
66
+ reviewer step runs on every pull request.
67
+
68
+ ### The MCP ask
69
+
70
+ > Set up an architecture keeper for `your-org/your-repo`. Create a Claude Code
71
+ > coding agent called `<repo>-architect` with the reference architecture-agent prompt
72
+ > from the Wardby knowledge guide and a $3 per-run budget. Trigger it once and
73
+ > show me the run; don't schedule it yet. After I've reviewed its first pull
74
+ > request, schedule it for Mondays at 6:00 AM. Then create a small, cheap native
75
+ > agent called `<repo>-merge-watcher` with the reference watcher prompt, attach
76
+ > `architect` to it as a sub-agent named `architect`, and link it to the
77
+ > repository with the `push` trigger. Finally, add the reviewer step to my
78
+ > existing code-review agent's prompt.
79
+
80
+ ### The resulting configuration
81
+
82
+ Do the steps in this order; each depends on the one before.
83
+
84
+ 1. **Create the architect.**
85
+ 2. **Trigger it once by hand** (`trigger_agent`) and review the draft pull
86
+ request it opens.
87
+ 3. **Schedule it** (`set_schedule`).
88
+ 4. **Create the watcher**, attach the architect, tick **Push** in the App's
89
+ events, and link it with `push`.
90
+ 5. **Add the reviewer step** to your review agent's prompt.
91
+
92
+ <details>
93
+ <summary>Architect (coding agent)</summary>
94
+
95
+ | Setting | Value |
96
+ | ----------------- | -------------------------------------------------------------------------------------------------------- |
97
+ | `name` | `<repo>-architect` |
98
+ | `kind` | `coding` |
99
+ | `model` | a capable coding model, for example `claude-sonnet-5` with `provider: "claude-code"` |
100
+ | `budgetUsd` | `3` per run (docs-only work) |
101
+ | `codingProfile` | `provider`, `repository: "your-org/your-repo"`, `baseRef` (your default branch), and `defaultTask` below |
102
+ | `schedule` | `0 6 * * 1` with your `timezone`, set after the first manual run (`set_schedule`) |
103
+ | Tools, sub-agents | None |
104
+ | Repository checks | May be skipped; the work is docs-only |
105
+ | System prompt | The architect prompt in [Architecture knowledge bundles](knowledge.md#set-up-an-architecture-agent) |
106
+
107
+ `defaultTask`, required before a coding agent can be scheduled:
108
+
109
+ ```text
110
+ Weekly knowledge review. Run the full cycle described in your instructions for
111
+ this repository. Your file changes are collected into a pull request for review;
112
+ don't try to commit or open one yourself.
113
+ ```
114
+
115
+ The prompt is published once, in the knowledge guide, so this page cannot drift
116
+ from it. Copy it from there, unchanged, as the agent's `systemPrompt`.
117
+
118
+ </details>
119
+
120
+ <details>
121
+ <summary>Merge watcher (native agent)</summary>
122
+
123
+ | Setting | Value |
124
+ | ------------- | ------------------------------------------------------------------------------------------------------------------------------ |
125
+ | `name` | `<repo>-merge-watcher` |
126
+ | `kind` | `native` |
127
+ | `model` | a small fast model, for example `claude-haiku-4-5` |
128
+ | `budgetUsd` | Sized for the architect's per-run cost: the run tree shares one budget, so at least `3` plus a little for the watcher itself |
129
+ | Sub-agent | `attach_subagent` with `parentAgentId` the watcher, `childAgentId` the architect, `boundName: "architect"` |
130
+ | Link | `link_repository` with `access: "write"`, `triggers: ["push"]`, no `checkName` |
131
+ | System prompt | The reference watcher prompt in [Drift runs on merge](knowledge.md#set-up-the-merge-watcher), copied unchanged from that guide |
132
+
133
+ The bound name gives the watcher a `delegate_to_architect` tool, which the
134
+ reference prompt calls.
135
+
136
+ ```json
137
+ {
138
+ "agentId": "<watcher agent id>",
139
+ "repository": "your-org/your-repo",
140
+ "access": "write",
141
+ "triggers": ["push"]
142
+ }
143
+ ```
144
+
145
+ Only pushes to the default branch start it. If the watcher already has a run
146
+ pending or running, the next merge starts nothing; the weekly run catches up.
147
+
148
+ </details>
149
+
150
+ <details>
151
+ <summary>Reviewer knowledge step</summary>
152
+
153
+ Append the "Reviewer step" section from
154
+ [Architecture knowledge bundles](knowledge.md#reviewer-step) to the system
155
+ prompt of a code-review agent ([Code-review agents](code-review-agents.md)). No
156
+ other setting changes. It makes reviews read the bundle's index, apply the
157
+ concepts that match the changed files, and report stale citations on knowledge
158
+ pull requests as suggestions only.
159
+
160
+ </details>
161
+
162
+ ### What it produces
163
+
164
+ - A weekly draft pull request that touches only `docs/knowledge/` and an
165
+ `AGENTS.md` pointer, adding cited concepts and re-anchoring stale ones. A
166
+ person reviews and merges it.
167
+ - After each merge that touches a concept's files, a drift run limited to the
168
+ affected concepts, as another draft pull request.
169
+ - Reviews that cite the relevant concepts.
170
+ - Every later coding run for the repository (Recipe B) receives the knowledge
171
+ index and base commit automatically.
172
+
173
+ Run `wardby knowledge check` locally or in CI to validate the bundle. The
174
+ format, the check's codes, and drift behavior are in
175
+ [Architecture knowledge bundles](knowledge.md).
176
+
177
+ ## Recipe B: a builder per language
178
+
179
+ **What it does.** Turns an `@mention` on an issue or pull request into a draft
180
+ pull request. A native router agent reads the request and delegates to a coding
181
+ builder agent. **Trigger:** the router is linked with `mention`; only people with
182
+ write access to the repository can start it.
183
+
184
+ ### The MCP ask
185
+
186
+ > For `your-org/your-repo`, create a Codex coding agent called `<repo>-builder` with a
187
+ > $5 per-run budget and a 30 minute timeout, starting from the default branch.
188
+ > Allow it to install these packages from the registry: (your dependencies).
189
+ > Then create a small native agent called `<repo>-router` with a $6 budget, attach
190
+ > `builder` to it as a sub-agent named `builder`, and link it to the repository
191
+ > with the `mention` trigger. The router should ask for details when a request is
192
+ > unclear and otherwise delegate one precise task to the builder. Never merge
193
+ > anything.
194
+
195
+ Pick the language section below for the toolchain and package settings.
196
+
197
+ ### Common configuration
198
+
199
+ <details>
200
+ <summary>Router (native agent)</summary>
201
+
202
+ | Setting | Value |
203
+ | ----------- | ------------------------------------------------------------------------------------------------------ |
204
+ | `name` | `<repo>-router` |
205
+ | `kind` | `native` |
206
+ | `model` | a small fast model, for example `claude-haiku-4-5` |
207
+ | `budgetUsd` | The builder's budget plus a little: the run tree shares one budget |
208
+ | Sub-agent | `attach_subagent` with `parentAgentId` the router, `childAgentId` the builder, `boundName: "builder"` |
209
+ | Link | `link_repository` with `access: "write"`, `triggers: ["mention"]` (one `mention` agent per repository) |
210
+
211
+ ```json
212
+ {
213
+ "agentId": "<router agent id>",
214
+ "repository": "your-org/your-repo",
215
+ "access": "write",
216
+ "triggers": ["mention"]
217
+ }
218
+ ```
219
+
220
+ System prompt:
221
+
222
+ The prompt is published once, in the [builder-agent help article](../help/builder-agent.md#router-prompt). Copy it unchanged as the agent's `systemPrompt`.
223
+
224
+ The router's final reply is posted where the mention was, so never instruct it
225
+ to include secrets or internal details. See
226
+ [What the mention agent receives](code-review-agents.md#what-the-mention-agent-receives).
227
+
228
+ </details>
229
+
230
+ <details>
231
+ <summary>Builder (coding agent) fields that matter</summary>
232
+
233
+ | Field (`codingProfile`) | What to set |
234
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
235
+ | `model` (agent field) | A capable coding model the chosen provider supports, for example `gpt-5.6-terra` with `codex` or `claude-sonnet-5` with `claude-code`; a mismatch is refused |
236
+ | `provider` | `codex` or `claude-code`; the agent's `model` must be one that provider supports |
237
+ | `repository` | `your-org/your-repo`; your linked GitHub account needs write access |
238
+ | `baseRef` | The branch runs start from, usually your default branch |
239
+ | `toolchain` | `node` or `node-python` (per language below) |
240
+ | `toolchainVersion` | `"3.12"` for `node-python`; omit for `node` |
241
+ | `packageAllowlist` | Top-level packages per ecosystem (`npm`, `pypi`). Needs `packages:approve` or `agents:admin` |
242
+ | `packagePolicy` | Optional `minReleaseAgeDays` (0 to 30) |
243
+ | `services` | Catalog service names the agent may start, for example `["postgres"]`; see [Services](coding-services.md) |
244
+ | `protectedPaths` | Globs a run may not change, for example `[".github/**", "CODEOWNERS"]`. `.wardby/**` is always protected except `.wardby/services.yaml` |
245
+ | `timeoutSec` | 60 to 7200; for example `1800` |
246
+ | `workerImageRef` | Digest-pinned custom image; needs `agents:admin` (see "Other languages") |
247
+ | `defaultTask` | Needed only to schedule the agent |
248
+ | Agent `budgetUsd` | Per-run budget, reserved at dispatch, for example `5` |
249
+
250
+ The agent's `systemPrompt` is placed ahead of each request as standing
251
+ instructions. The template below is generic.
252
+
253
+ </details>
254
+
255
+ <details>
256
+ <summary>Builder system prompt template</summary>
257
+
258
+ The prompt is published once, in the [builder-agent help article](../help/builder-agent.md#builder-prompt), so this page cannot drift from it. Copy it unchanged as the agent's `systemPrompt`.
259
+
260
+ Adjust the numbered rules to your project; keep rules 1, 5, and 6.
261
+
262
+ </details>
263
+
264
+ Package error codes are in [Installing packages in coding runs](coding-packages.md).
265
+ Make sure the repository's `AGENTS.md` lists the test and lint commands, because
266
+ the builder takes them from there.
267
+
268
+ ### Node / TypeScript
269
+
270
+ Use the stock worker image: `toolchain: "node"`, no `toolchainVersion`. The
271
+ agent runs `npm ci` or `npm install` through the registry proxy, so enable the
272
+ packages your project needs (top-level entries only; the dependency graph is
273
+ added automatically):
274
+
275
+ ```json
276
+ {
277
+ "provider": "codex",
278
+ "repository": "your-org/your-repo",
279
+ "baseRef": "main",
280
+ "toolchain": "node",
281
+ "timeoutSec": 1800,
282
+ "packageAllowlist": {
283
+ "npm": ["react@^19", "vitest", "@testing-library/*"]
284
+ },
285
+ "packagePolicy": { "minReleaseAgeDays": 3 },
286
+ "protectedPaths": [".github/**", "CODEOWNERS"]
287
+ }
288
+ ```
289
+
290
+ Test commands come from `AGENTS.md` (for example `npm test` and `npm run lint`).
291
+ Lockfile installs are verified against the registry before npm runs; see
292
+ [Installing packages in coding runs](coding-packages.md).
293
+
294
+ ### Python
295
+
296
+ Use the `node-python` toolchain with version `3.12`, which adds Python 3 with
297
+ `pytest` and `ruff` next to Node. Pip installs go through the registry proxy
298
+ into a virtual environment, and only wheels are served (source distributions are
299
+ refused), so allow packages that publish wheels. Extras such as `[binary]` are not accepted in an allowlist entry; list the wheel package's own name instead (`psycopg-binary`, not `psycopg[binary]`):
300
+
301
+ ```json
302
+ {
303
+ "provider": "codex",
304
+ "repository": "your-org/your-repo",
305
+ "baseRef": "main",
306
+ "toolchain": "node-python",
307
+ "toolchainVersion": "3.12",
308
+ "timeoutSec": 1800,
309
+ "packageAllowlist": {
310
+ "pypi": ["flask>=3", "sqlalchemy>=2", "psycopg-binary>=3"]
311
+ },
312
+ "services": ["postgres"]
313
+ }
314
+ ```
315
+
316
+ `services` is optional. When the tests need a database, commit
317
+ `.wardby/services.yaml` to the base branch:
318
+
319
+ ```yaml
320
+ services:
321
+ postgres: "16"
322
+ ```
323
+
324
+ Each run then gets a fresh, empty PostgreSQL instance and a `DATABASE_URL`
325
+ variable; say so in `AGENTS.md` so tests read it. See
326
+ [Services for coding runs](coding-services.md) for the catalog, variables, and
327
+ errors. For Claude Code on `node-python`, the operator also sets
328
+ `CODING_CLAUDE_TOOL_RUNNER_IMAGE_NODE_PYTHON_3_12` (see
329
+ [Coding-agent setup](coding-agent-setup.md)).
330
+
331
+ ### Other languages (Go, Java, Rust, ...)
332
+
333
+ Wardby ships worker images only for `node` and `node-python`. For any other
334
+ toolchain, build your own image on Wardby's driver base image and point the
335
+ agent at it with `workerImageRef`, a digest-pinned reference (a mutable tag is
336
+ rejected). Setting it needs the `agents:admin` scope and the admin role. The
337
+ Dockerfile shape, the driver image, and what Wardby does and does not verify are
338
+ in [Bring-your-own worker images](coding-worker-byo-images.md).
339
+
340
+ ```json
341
+ {
342
+ "provider": "codex",
343
+ "repository": "your-org/your-repo",
344
+ "baseRef": "main",
345
+ "toolchain": "node",
346
+ "workerImageRef": "registry.example.com/your-org/worker-go@sha256:<64 hex>",
347
+ "timeoutSec": 1800
348
+ }
349
+ ```
350
+
351
+ `toolchain` is still required; the worker image's own toolchain is what runs.
352
+
353
+ What the package registry covers: only **npm and PyPI** are mediated. A Go,
354
+ Maven, Cargo, or other ecosystem has no registry proxy, and the worker has no
355
+ direct network access, so those dependencies must be baked into your image or
356
+ already vendored in the repository. The registry still applies to any npm or
357
+ pip use inside the same run, and `packageAllowlist` has no entry for other
358
+ ecosystems. If services are allowed, the image must be built on driver v11 or
359
+ later.
360
+
361
+ ### Together with Recipe A
362
+
363
+ Coding runs automatically receive the repository's knowledge index and base
364
+ commit when `docs/knowledge/index.md` exists on the base branch
365
+ ([how coding runs use the bundle](knowledge.md#how-coding-runs-use-the-bundle)),
366
+ so the builder works from recorded pitfalls and invariants. Recipe A keeps that
367
+ bundle current.
368
+
369
+ ### What it produces
370
+
371
+ A mention from someone with write access gets a "Working on it" status comment
372
+ from the App. The router either asks a question or delegates, the builder
373
+ pushes a unique branch and opens at most one draft pull request, and the App
374
+ edits the status comment with the pull request link or the failure. A person
375
+ reviews and merges; Wardby never merges for you. A later mention on that pull
376
+ request continues the same branch.
377
+
378
+ ## Next steps
379
+
380
+ - [Architecture knowledge bundles](knowledge.md)
381
+ - [Code-review agents](code-review-agents.md)
382
+ - [Coding-agent setup](coding-agent-setup.md)
383
+ - [Models and pricing](models.md)
@@ -0,0 +1,90 @@
1
+ # Runtime architecture — GitHub trigger path + observability
2
+
3
+ Two independent subsystems currently run side by side on the same host and
4
+ share only Postgres and a Docker Compose network: the `wardby mcp` process
5
+ (agents/runs/webhooks/MCP tools) and the local observability stack
6
+ (coding-proxy metrics → Prometheus → Grafana). Neither depends on the other;
7
+ restarting one has no effect on the other.
8
+
9
+ ```mermaid
10
+ flowchart TB
11
+ subgraph GH["GitHub — your-org/your-repo"]
12
+ Issue["Issue or comment that\nmentions your agent"]
13
+ Action["Actions workflow that\nPOSTs the task to wardby"]
14
+ PRout["Draft PR opened"]
15
+ Issue --> Action
16
+ end
17
+
18
+ Action -->|"POST /webhooks/:id\nx-webhook-secret"| Tunnel
19
+
20
+ subgraph Public["Public HTTPS"]
21
+ Tunnel["HTTPS tunnel (e.g. ngrok)\n<your-domain> -> :8080\n(TLS terminated here)"]
22
+ end
23
+
24
+ Tunnel --> MCP
25
+
26
+ subgraph Host["Your machine"]
27
+ subgraph MCPBox["wardby mcp (Node/tsx)\nMCP_TRANSPORT=http, self-hosted auth"]
28
+ MCP["/webhooks/:id - secret auth\n/mcp - OAuth auth (list_agents, trigger_agent, get_run, ...)\n/.well-known/oauth-protected-resource"]
29
+ end
30
+
31
+ MCP -->|"creates Run, dispatches via JobLauncher"| Worker
32
+ MCP <-->|"reads/writes"| PG[("local-postgres-1\nAgent, Run, Webhook,\nBudgetGroup, AgentMemory, Datastore")]
33
+
34
+ subgraph Docker["Docker"]
35
+ Worker["ephemeral coding worker\n(Codex / Claude Code)\none per Run"]
36
+ Proxy["wardby-coding-proxy\ncredential injection +\ntoken/cost metering\n:9464/metrics (private net only)"]
37
+ Worker -->|"OpenAI/Anthropic calls,\nproxied"| Proxy
38
+ Proxy -->|"usage/cost ledger"| PG
39
+ end
40
+
41
+ Worker -->|"push branch"| PRout
42
+
43
+ Proxy -->|"scraped"| Prom["local-prometheus-1\n127.0.0.1:9090 (loopback)\n24h retention"]
44
+ Prom -->|"query"| Graf["local-grafana-1\n127.0.0.1:3000 (loopback)\ndashboards: wardby-coding-proxy,\nwardby-coding-budget"]
45
+ end
46
+ ```
47
+
48
+ ## Key boundaries
49
+
50
+ - **Only one thing is reachable from outside this machine:** the HTTPS
51
+ tunnel into `wardby mcp:8080`. Postgres, coding-proxy, Prometheus, and
52
+ Grafana are all either fully private-network-only (`coding-proxy:9464`
53
+ has no `ports:` mapping at all) or explicitly loopback-bound
54
+ (`127.0.0.1:9090`, `127.0.0.1:3000`) — Grafana/Prometheus are not exposed
55
+ through the tunnel.
56
+ - **The coding worker never sees real API credentials.** `wardby-coding-proxy`
57
+ sits between it and OpenAI/Anthropic, injecting credentials and metering
58
+ tokens/cost — this is also where `/metrics` lives.
59
+ - **Two write paths into Postgres:** `wardby mcp` owns the agent/run/webhook
60
+ config tables directly; `coding-proxy` writes its own usage/cost ledger
61
+ directly during a run, which `wardby mcp` reconciles back into the `Run`
62
+ row once the container finishes (the "cap at the boundary, reconcile
63
+ after" pattern for opaque agent runs).
64
+ - **`wardby mcp` restarts don't affect observability, and vice versa.** The
65
+ control plane and metrics stack can be deployed and restarted independently.
66
+
67
+ ## Where the worker actually runs
68
+
69
+ The diagram above shows `JOB_LAUNCHER=docker`, which is what this host uses.
70
+ The worker's execution backend is a seam (`WorkspaceJobLauncher`), and the
71
+ choice does not change any boundary above — the worker still holds no
72
+ credentials, still reaches only the proxy, and the proxy still owns the ledger.
73
+
74
+ | `JOB_LAUNCHER` | Worker runs in | Isolation |
75
+ | -------------- | -------------------------------- | ---------------------------------------------------- |
76
+ | `local` | a child process on this host | development only, no isolation |
77
+ | `docker` | a container on a per-run network | the diagram above |
78
+ | `kubernetes` | a pod in a namespace | per-run NetworkPolicy, attested pod, optional gVisor |
79
+
80
+ Under `kubernetes` the shape is the same with different nouns: the per-run
81
+ Docker network becomes a NetworkPolicy, the keeper and worker share a pod
82
+ instead of a volume, and the proxy is a Service rather than a container name.
83
+ Two things have no Docker equivalent. The pod read back from the API server is
84
+ compared field by field against the pod wardby built, and any difference fails
85
+ the run; and before the worker is released, the launcher proves the network
86
+ policy is actually being enforced, because a cluster accepts a policy whether
87
+ or not anything enforces it. See
88
+ [coding-worker-isolation.md](coding-worker-isolation.md) for the mechanics and
89
+ the [Kubernetes deployment guide](../deploy/kind-coding/README.md) for the local
90
+ and GKE Autopilot overlays.
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-labelledby="title desc">
2
+ <title id="title">Wardby icon</title>
3
+ <desc id="desc">A friendly helmeted guardian carrying a budget shield.</desc>
4
+
5
+ <circle cx="64" cy="64" r="58" fill="#071d3b"/>
6
+ <path d="M20 55C20 25 40 12 64 12s44 13 44 43v35H20Z" fill="#fffaf0"/>
7
+ <rect x="30" y="43" width="68" height="45" rx="18" fill="#0a2850"/>
8
+ <path d="M27 48Q64 18 101 48" fill="none" stroke="#c8aa70" stroke-width="10" stroke-linecap="round"/>
9
+ <path d="M64 7V53" fill="none" stroke="#c8aa70" stroke-width="11" stroke-linecap="round"/>
10
+ <path d="M44 65q7 10 14 0M70 65q7 10 14 0" fill="none" stroke="#4be6b3" stroke-width="6" stroke-linecap="round"/>
11
+
12
+ <path d="M78 76 108 86v18c0 12-10 19-30 24-20-5-30-12-30-24V86Z" fill="#071d3b" stroke="#fffaf0" stroke-width="5" stroke-linejoin="round"/>
13
+ <g transform="translate(78 105) scale(.72) translate(-78 -105)">
14
+ <path d="M89 91c-3-4-7-6-12-6-7 0-12 4-12 9 0 6 5 8 13 10 8 2 13 5 13 11 0 7-5 11-13 11-7 0-13-3-17-8M78 82v46" fill="none" stroke="#4be6b3" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
15
+ </g>
16
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1254 1254" role="img" aria-labelledby="title desc">
2
+ <title id="title">Wardby robot mascot</title>
3
+ <desc id="desc">A friendly helmeted robot carrying a shield marked with a dollar sign.</desc>
4
+ <image width="1254" height="1254" href="wardby-mascot.png" xlink:href="wardby-mascot.png" preserveAspectRatio="xMidYMid meet"/>
5
+ </svg>
@@ -0,0 +1,106 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1280" height="430" viewBox="0 0 1280 430" role="img" aria-labelledby="title desc">
2
+ <title id="title">Wardby agent workflow</title>
3
+ <desc id="desc">Five stages show a request moving from Claude or Codex through MCP, governed execution in Wardby, and an outcome controlled by review policy.</desc>
4
+ <defs>
5
+ <linearGradient id="background" x1="0" y1="0" x2="1" y2="1">
6
+ <stop offset="0" stop-color="#f7faff"/>
7
+ <stop offset="1" stop-color="#edf8f7"/>
8
+ </linearGradient>
9
+ <linearGradient id="primary" x1="0" y1="0" x2="1" y2="1">
10
+ <stop offset="0" stop-color="#0f6bff"/>
11
+ <stop offset="1" stop-color="#0756d8"/>
12
+ </linearGradient>
13
+ <linearGradient id="success" x1="0" y1="0" x2="1" y2="1">
14
+ <stop offset="0" stop-color="#2de3a6"/>
15
+ <stop offset="1" stop-color="#11b981"/>
16
+ </linearGradient>
17
+ <filter id="shadow" x="-20%" y="-20%" width="140%" height="160%">
18
+ <feDropShadow dx="0" dy="5" stdDeviation="7" flood-color="#082850" flood-opacity="0.10"/>
19
+ </filter>
20
+ <marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
21
+ <path d="M 0 0 L 10 5 L 0 10 z" fill="#7c93b3"/>
22
+ </marker>
23
+ </defs>
24
+
25
+ <rect x="1" y="1" width="1278" height="428" rx="28" fill="url(#background)" stroke="#dbe7f5" stroke-width="2"/>
26
+
27
+ <text x="48" y="48" fill="#0f6bff" font-family="Arial, Helvetica, sans-serif" font-size="13" font-weight="700" letter-spacing="2">FULL AGENT LIFECYCLE</text>
28
+ <text x="48" y="76" fill="#082850" font-family="Arial, Helvetica, sans-serif" font-size="24" font-weight="700">From a conversation to a governed, reviewable outcome</text>
29
+
30
+ <g filter="url(#shadow)">
31
+ <rect x="45" y="112" width="210" height="172" rx="18" fill="#ffffff" stroke="#bcd4f7" stroke-width="2"/>
32
+ <circle cx="75" cy="142" r="17" fill="#e8f1ff"/>
33
+ <text x="75" y="148" text-anchor="middle" fill="#0f6bff" font-family="Arial, Helvetica, sans-serif" font-size="15" font-weight="700">1</text>
34
+ <text x="103" y="147" fill="#0f6bff" font-family="Arial, Helvetica, sans-serif" font-size="12" font-weight="700" letter-spacing="1.5">ASK</text>
35
+ <text x="70" y="190" fill="#082850" font-family="Arial, Helvetica, sans-serif" font-size="21" font-weight="700">Claude or Codex</text>
36
+ <text x="70" y="220" fill="#52677f" font-family="Arial, Helvetica, sans-serif" font-size="14">Describe the outcome</text>
37
+ <text x="70" y="243" fill="#52677f" font-family="Arial, Helvetica, sans-serif" font-size="14">in natural language</text>
38
+ </g>
39
+
40
+ <path d="M 263 198 H 284" fill="none" stroke="#7c93b3" stroke-width="3" marker-end="url(#arrow)"/>
41
+ <text x="273" y="184" text-anchor="middle" fill="#637b98" font-family="Arial, Helvetica, sans-serif" font-size="11" font-weight="700">MCP</text>
42
+
43
+ <g filter="url(#shadow)">
44
+ <rect x="295" y="112" width="210" height="172" rx="18" fill="#ffffff" stroke="#bcd4f7" stroke-width="2"/>
45
+ <circle cx="325" cy="142" r="17" fill="#e8f1ff"/>
46
+ <text x="325" y="148" text-anchor="middle" fill="#0f6bff" font-family="Arial, Helvetica, sans-serif" font-size="15" font-weight="700">2</text>
47
+ <text x="353" y="147" fill="#0f6bff" font-family="Arial, Helvetica, sans-serif" font-size="12" font-weight="700" letter-spacing="1.5">DEFINE</text>
48
+ <text x="320" y="190" fill="#082850" font-family="Arial, Helvetica, sans-serif" font-size="21" font-weight="700">Agent blueprint</text>
49
+ <text x="320" y="220" fill="#52677f" font-family="Arial, Helvetica, sans-serif" font-size="14">Model • tools • schedule</text>
50
+ <text x="320" y="243" fill="#52677f" font-family="Arial, Helvetica, sans-serif" font-size="14">Sub-agents • outcome</text>
51
+ </g>
52
+
53
+ <path d="M 513 198 H 534" fill="none" stroke="#7c93b3" stroke-width="3" marker-end="url(#arrow)"/>
54
+ <text x="523" y="184" text-anchor="middle" fill="#637b98" font-family="Arial, Helvetica, sans-serif" font-size="11" font-weight="700">POLICY</text>
55
+
56
+ <g filter="url(#shadow)">
57
+ <rect x="545" y="112" width="210" height="172" rx="18" fill="url(#primary)"/>
58
+ <circle cx="575" cy="142" r="17" fill="#ffffff" fill-opacity="0.20"/>
59
+ <text x="575" y="148" text-anchor="middle" fill="#ffffff" font-family="Arial, Helvetica, sans-serif" font-size="15" font-weight="700">3</text>
60
+ <text x="603" y="147" fill="#dceaff" font-family="Arial, Helvetica, sans-serif" font-size="12" font-weight="700" letter-spacing="1.5">GOVERN</text>
61
+ <text x="570" y="190" fill="#ffffff" font-family="Arial, Helvetica, sans-serif" font-size="21" font-weight="700">Wardby</text>
62
+ <text x="570" y="220" fill="#e7f0ff" font-family="Arial, Helvetica, sans-serif" font-size="14">Budget • secrets • owner</text>
63
+ <text x="570" y="243" fill="#e7f0ff" font-family="Arial, Helvetica, sans-serif" font-size="14">Audit • cancellation</text>
64
+ </g>
65
+
66
+ <path d="M 763 198 H 784" fill="none" stroke="#7c93b3" stroke-width="3" marker-end="url(#arrow)"/>
67
+ <text x="773" y="184" text-anchor="middle" fill="#637b98" font-family="Arial, Helvetica, sans-serif" font-size="11" font-weight="700">RUN</text>
68
+
69
+ <g filter="url(#shadow)">
70
+ <rect x="795" y="112" width="210" height="172" rx="18" fill="#ffffff" stroke="#bcd4f7" stroke-width="2"/>
71
+ <circle cx="825" cy="142" r="17" fill="#e8f1ff"/>
72
+ <text x="825" y="148" text-anchor="middle" fill="#0f6bff" font-family="Arial, Helvetica, sans-serif" font-size="15" font-weight="700">4</text>
73
+ <text x="853" y="147" fill="#0f6bff" font-family="Arial, Helvetica, sans-serif" font-size="12" font-weight="700" letter-spacing="1.5">EXECUTE</text>
74
+ <text x="820" y="190" fill="#082850" font-family="Arial, Helvetica, sans-serif" font-size="21" font-weight="700">Isolated workers</text>
75
+ <text x="820" y="220" fill="#52677f" font-family="Arial, Helvetica, sans-serif" font-size="14">Native • Codex • Claude</text>
76
+ <text x="820" y="243" fill="#52677f" font-family="Arial, Helvetica, sans-serif" font-size="14">Bounded tools and access</text>
77
+ </g>
78
+
79
+ <path d="M 1013 198 H 1034" fill="none" stroke="#7c93b3" stroke-width="3" marker-end="url(#arrow)"/>
80
+ <text x="1023" y="184" text-anchor="middle" fill="#637b98" font-family="Arial, Helvetica, sans-serif" font-size="11" font-weight="700">RESULT</text>
81
+
82
+ <g filter="url(#shadow)">
83
+ <rect x="1045" y="112" width="190" height="172" rx="18" fill="#ffffff" stroke="#22c995" stroke-width="2"/>
84
+ <circle cx="1075" cy="142" r="17" fill="url(#success)"/>
85
+ <text x="1075" y="148" text-anchor="middle" fill="#ffffff" font-family="Arial, Helvetica, sans-serif" font-size="15" font-weight="700">5</text>
86
+ <text x="1103" y="147" fill="#09845f" font-family="Arial, Helvetica, sans-serif" font-size="12" font-weight="700" letter-spacing="1.5">REVIEW</text>
87
+ <text x="1070" y="190" fill="#082850" font-family="Arial, Helvetica, sans-serif" font-size="21" font-weight="700">Review policy</text>
88
+ <text x="1070" y="220" fill="#52677f" font-family="Arial, Helvetica, sans-serif" font-size="14">Agent or human review</text>
89
+ <text x="1070" y="243" fill="#09845f" font-family="Arial, Helvetica, sans-serif" font-size="14" font-weight="700">Authority stays explicit</text>
90
+ </g>
91
+
92
+ <rect x="45" y="324" width="1190" height="70" rx="16" fill="#082850"/>
93
+ <text x="72" y="351" fill="#70edc2" font-family="Arial, Helvetica, sans-serif" font-size="12" font-weight="700" letter-spacing="1.5">RUNS IN YOUR INFRASTRUCTURE</text>
94
+ <text x="72" y="378" fill="#ffffff" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700">Your cloud • Your credentials • Your operating boundary</text>
95
+
96
+ <g font-family="Arial, Helvetica, sans-serif" font-size="12" font-weight="700" text-anchor="middle">
97
+ <rect x="605" y="343" width="140" height="32" rx="16" fill="#ffffff" fill-opacity="0.11"/>
98
+ <text x="675" y="364" fill="#ffffff">Budget enforced</text>
99
+ <rect x="757" y="343" width="168" height="32" rx="16" fill="#ffffff" fill-opacity="0.11"/>
100
+ <text x="841" y="364" fill="#ffffff">Credentials separated</text>
101
+ <rect x="937" y="343" width="135" height="32" rx="16" fill="#ffffff" fill-opacity="0.11"/>
102
+ <text x="1005" y="364" fill="#ffffff">Runs observable</text>
103
+ <rect x="1084" y="343" width="125" height="32" rx="16" fill="#ffffff" fill-opacity="0.11"/>
104
+ <text x="1147" y="364" fill="#ffffff">Action policy</text>
105
+ </g>
106
+ </svg>