@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,269 @@
1
+ /**
2
+ * Host-neutral issue-tracker surface for native agents. Jira Cloud is the
3
+ * first implementation (./jira.ts). The control plane holds the credential;
4
+ * no method takes a token. See docs/private/2026-09-30-jira-issue-tracker-design.md.
5
+ */
6
+ export type IssueTrackerProvider = "jira";
7
+ export declare const ISSUE_TRACKER_PROVIDERS: readonly IssueTrackerProvider[];
8
+ /** The product name shown to people (e.g. in a pull request's "Resolves Jira issue …" line). */
9
+ export declare const ISSUE_TRACKER_NAMES: Readonly<Record<IssueTrackerProvider, string>>;
10
+ export interface IssuePerson {
11
+ accountId: string;
12
+ displayName: string;
13
+ }
14
+ export interface IssueCommentView {
15
+ id: string;
16
+ author: IssuePerson | null;
17
+ created: string;
18
+ body: string;
19
+ /** Written by the bot and carrying this agent's footer: editable with jira_edit_own_comment. */
20
+ byThisAgent: boolean;
21
+ }
22
+ export interface IssueView {
23
+ key: string;
24
+ projectKey: string;
25
+ summary: string;
26
+ description: string;
27
+ status: string;
28
+ /** The status's category (Jira statusCategory.key): "done" is what dedupe treats as resolved. */
29
+ statusCategory: IssueStatusCategory;
30
+ issueType: string;
31
+ priority: string | null;
32
+ labels: string[];
33
+ assignee: IssuePerson | null;
34
+ reporter: IssuePerson | null;
35
+ url: string;
36
+ /** Most recent last; capped. */
37
+ comments: IssueCommentView[];
38
+ commentsTruncated: boolean;
39
+ /** Capped list; contents are read with readAttachmentText. Filenames are untrusted. */
40
+ attachments: IssueAttachmentView[];
41
+ /** Issue links (e.g. "relates to PROJ-9"), capped. Summaries are untrusted issue text. */
42
+ links: IssueLinkView[];
43
+ }
44
+ export interface IssueLinkView {
45
+ /** How this issue relates to the other, as Jira words it from this side ("relates to", "is blocked by"). */
46
+ relation: string;
47
+ key: string;
48
+ summary: string;
49
+ status: string;
50
+ }
51
+ export type IssueStatusCategory = "new" | "indeterminate" | "done";
52
+ export interface IssueAttachmentView {
53
+ id: string;
54
+ filename: string;
55
+ mimeType: string;
56
+ size: number;
57
+ }
58
+ export interface CreateIssueInput {
59
+ projectKey: string;
60
+ /** Issue type name (case-insensitive); resolved to an id from the project's create metadata. */
61
+ issueType: string;
62
+ summary: string;
63
+ descriptionMarkdown: string;
64
+ labels?: string[];
65
+ /** Priority name. */
66
+ priority?: string;
67
+ /** Component names. */
68
+ components?: string[];
69
+ parentKey?: string;
70
+ /** customfield_N -> raw JSON value. */
71
+ customFields?: Record<string, unknown>;
72
+ /** Issue properties, set in the create call itself. */
73
+ properties?: Record<string, unknown>;
74
+ /** Projects whose bare issue keys in the description become smart links. */
75
+ issueKeyProjects?: readonly string[];
76
+ }
77
+ export interface CreateMetaIssueType {
78
+ id: string;
79
+ name: string;
80
+ subtask: boolean;
81
+ }
82
+ export interface CreateMetaField {
83
+ fieldId: string;
84
+ name: string;
85
+ required: boolean;
86
+ hasDefault: boolean;
87
+ allowedValues?: string[];
88
+ }
89
+ export interface IssueSearchHit {
90
+ key: string;
91
+ summary: string;
92
+ status: string;
93
+ issueType: string;
94
+ updated: string;
95
+ url: string;
96
+ }
97
+ export interface IssueSearchResult {
98
+ issues: IssueSearchHit[];
99
+ truncated: boolean;
100
+ }
101
+ /** Who the tracker credential acts as (Jira: GET /myself). */
102
+ export interface IssueTrackerIdentity {
103
+ accountId: string;
104
+ displayName: string;
105
+ accountType: string;
106
+ }
107
+ /**
108
+ * Bounds one tracker call for callers on a latency budget (e.g. inside a database transaction).
109
+ * `timeoutMs` caps the WHOLE call, every request it makes included; with `retryOn429: false` a 429 fails
110
+ * at once instead of sleeping for Retry-After, so the call cannot outlive `timeoutMs`.
111
+ */
112
+ export interface TrackerCallOptions {
113
+ timeoutMs?: number;
114
+ retryOn429?: boolean;
115
+ }
116
+ /** What cost attribution keeps about an issue (src/core/attribution.ts): the hierarchy as of now. */
117
+ export interface IssueSnapshot {
118
+ /** The key that was asked for (WorkItem.key). */
119
+ key: string;
120
+ title?: string;
121
+ type?: string;
122
+ url: string;
123
+ /** The project (Jira) / team (Linear) the issue is in now. */
124
+ scopeKey: string;
125
+ parent?: {
126
+ key: string;
127
+ title?: string;
128
+ kind: string;
129
+ };
130
+ }
131
+ export interface IssueTracker {
132
+ readonly provider: IssueTrackerProvider;
133
+ /** The bot's own accountId (cached after the first call). */
134
+ botAccountId(): Promise<string>;
135
+ /** The account the credential acts as, from the same cached call as botAccountId. */
136
+ identity(): Promise<IssueTrackerIdentity>;
137
+ getIssue(key: string, opts: {
138
+ maxComments: number;
139
+ agentMarker: string;
140
+ } & TrackerCallOptions): Promise<IssueView>;
141
+ /** The project the issue is in now; an old key (kept as an alias after a move) resolves to its new project. */
142
+ issueProject(key: string): Promise<string>;
143
+ /** Title, type, scope and parent of `key` in one call, for cost attribution. Throws IssueTrackerError. */
144
+ snapshotIssue(key: string, opts?: {
145
+ timeoutMs?: number;
146
+ retryOn429?: boolean;
147
+ }): Promise<IssueSnapshot>;
148
+ search(jql: string, opts: {
149
+ maxResults: number;
150
+ }): Promise<IssueSearchResult>;
151
+ /** Whether issue `key` matches `jql` (used for a link's jqlFilter). Callers on a latency budget pass a short timeout and no 429 retry. */
152
+ matchesJql(key: string, jql: string, opts?: TrackerCallOptions): Promise<boolean>;
153
+ comment(key: string,
154
+ /** issueKeyProjects: projects whose bare issue keys in the text become smart links. */
155
+ input: {
156
+ markdown: string;
157
+ visibilityRole?: string;
158
+ issueKeyProjects?: readonly string[];
159
+ }, opts?: TrackerCallOptions): Promise<{
160
+ id: string;
161
+ url: string;
162
+ }>;
163
+ editComment(key: string, commentId: string, input: {
164
+ markdown: string;
165
+ issueKeyProjects?: readonly string[];
166
+ }): Promise<void>;
167
+ /** The comment's author accountId and plain text (uncapped: only for ownership checks, never shown to a model), or null when it doesn't exist. */
168
+ readComment(key: string, commentId: string): Promise<{
169
+ authorId: string | null;
170
+ body: string;
171
+ } | null>;
172
+ issueUrl(key: string): string;
173
+ /** Transitions the service account can perform now: target status name + category. */
174
+ transitions(key: string): Promise<Array<{
175
+ id: string;
176
+ name: string;
177
+ toStatus: string;
178
+ toCategory: string;
179
+ }>>;
180
+ /** Performs the transition whose target status name matches (case-insensitive). */
181
+ transitionTo(key: string, toStatus: string): Promise<{
182
+ transitionId: string;
183
+ toStatus: string;
184
+ }>;
185
+ /** Field ids the service account may edit on this issue (from editmeta). */
186
+ editableFields(key: string): Promise<string[]>;
187
+ /** Sets fields: labels (string[]), components (names), priority (name), customfield_N (raw JSON value). */
188
+ editFields(key: string, fields: Record<string, unknown>): Promise<void>;
189
+ linkTypes(opts?: TrackerCallOptions): Promise<Array<{
190
+ name: string;
191
+ inward: string;
192
+ outward: string;
193
+ }>>;
194
+ linkIssues(input: {
195
+ type: string;
196
+ inwardKey: string;
197
+ outwardKey: string;
198
+ }, opts?: TrackerCallOptions): Promise<void>;
199
+ /** Adds (or, for an existing globalId, updates) a web link on the issue: Jira's remote link, shown under "Web links". */
200
+ addRemoteLink(key: string, input: {
201
+ globalId: string;
202
+ url: string;
203
+ title: string;
204
+ status?: {
205
+ resolved: boolean;
206
+ };
207
+ }): Promise<void>;
208
+ /** The property's JSON value, or null when it does not exist. */
209
+ getProperty(key: string, property: string): Promise<unknown>;
210
+ setProperty(key: string, property: string, value: unknown): Promise<void>;
211
+ /** Issue types creatable in the project by the service account. */
212
+ createMeta(projectKey: string): Promise<{
213
+ issueTypes: CreateMetaIssueType[];
214
+ }>;
215
+ /** Create-screen fields for one issue type (by id). */
216
+ fieldMeta(projectKey: string, issueTypeId: string): Promise<CreateMetaField[]>;
217
+ /** Creates an issue; missing required fields (without defaults) fail with tracker_invalid_request naming them. */
218
+ createIssue(input: CreateIssueInput, opts?: TrackerCallOptions): Promise<{
219
+ key: string;
220
+ url: string;
221
+ }>;
222
+ /** First `maxBytes` of a text-like attachment, decoded as UTF-8; other types fail with tracker_invalid_request. */
223
+ readAttachmentText(id: string, maxBytes: number): Promise<{
224
+ filename: string;
225
+ mimeType: string;
226
+ text: string;
227
+ truncated: boolean;
228
+ }>;
229
+ }
230
+ export type IssueTrackerErrorCode = "tracker_not_found" | "tracker_permission_denied" | "tracker_rate_limited" | "tracker_invalid_request" | "tracker_api_error" | "tracker_invalid_response";
231
+ export declare class IssueTrackerError extends Error {
232
+ readonly code: IssueTrackerErrorCode;
233
+ constructor(code: IssueTrackerErrorCode, message?: string);
234
+ }
235
+ export type IssueTrackerRegistry = Partial<Record<IssueTrackerProvider, IssueTracker>>;
236
+ export type IssueEventKind = "created" | "transitioned" | "labeled" | "assigned" | "mention";
237
+ /** What a webhook adapter (jira-events.ts) normalises a payload into, for src/core/issue-events.ts. */
238
+ export interface IssueEvent {
239
+ provider: IssueTrackerProvider;
240
+ projectKey: string;
241
+ issueKey: string;
242
+ /** Every kind this one delivery represents (an update can transition AND label). */
243
+ kinds: IssueEventKind[];
244
+ actor: {
245
+ accountId: string;
246
+ displayName: string;
247
+ };
248
+ /** The new status name, with "transitioned". */
249
+ toStatus?: string;
250
+ /** Labels added by this change, with "labeled". */
251
+ addedLabels: string[];
252
+ /** The new assignee's accountId, with "assigned". */
253
+ assigneeAccountId?: string;
254
+ /** The mentioning comment, with "mention". */
255
+ comment?: {
256
+ id: string;
257
+ body: string;
258
+ };
259
+ /** Untrusted: whoever wrote them was not gated. Absent when the payload lacked the issue. */
260
+ subject?: {
261
+ summary: string;
262
+ description: string;
263
+ };
264
+ }
265
+ /** Shared by the ingress and the tools: a Jira issue key, e.g. PROJ-123. */
266
+ export declare const ISSUE_KEY: RegExp;
267
+ /** A Jira project key. */
268
+ export declare const PROJECT_KEY: RegExp;
269
+ export declare const projectOf: (issueKey: string) => string;
@@ -0,0 +1,16 @@
1
+ export const ISSUE_TRACKER_PROVIDERS = ["jira"];
2
+ /** The product name shown to people (e.g. in a pull request's "Resolves Jira issue …" line). */
3
+ export const ISSUE_TRACKER_NAMES = { jira: "Jira" };
4
+ export class IssueTrackerError extends Error {
5
+ code;
6
+ constructor(code, message = code) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = "IssueTrackerError";
10
+ }
11
+ }
12
+ /** Shared by the ingress and the tools: a Jira issue key, e.g. PROJ-123. */
13
+ export const ISSUE_KEY = /^[A-Z][A-Z0-9_]{0,254}-[1-9]\d{0,9}$/;
14
+ /** A Jira project key. */
15
+ export const PROJECT_KEY = /^[A-Z][A-Z0-9_]{0,254}$/;
16
+ export const projectOf = (issueKey) => issueKey.slice(0, issueKey.lastIndexOf("-"));
@@ -0,0 +1,23 @@
1
+ import type { JobSpec } from "./types.js";
2
+ /**
3
+ * The tool runner's parseToolSetup bounds (src/claude-tool-runner/command.mjs; a test keeps them
4
+ * equal). A setup past any of them would stop the tool runner before it reports ready, so the
5
+ * launcher refuses to build one instead.
6
+ */
7
+ export declare const CLAUDE_TOOL_SETUP_LIMITS: {
8
+ readonly maxEnvEntries: 1024;
9
+ readonly maxEnvValueBytes: 4096;
10
+ readonly maxFiles: 8;
11
+ readonly maxFileBytes: number;
12
+ readonly maxSetupBytes: number;
13
+ };
14
+ export interface ClaudeToolSetup {
15
+ schemaVersion: 1;
16
+ env: Record<string, string>;
17
+ files: {
18
+ path: string;
19
+ content: string;
20
+ mode: number;
21
+ }[];
22
+ }
23
+ export declare function claudeToolSetup(spec: JobSpec, capability: string): string;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * What Claude Code's tool runner (the credential-free container that runs commands in the
3
+ * repository) needs from the trusted launcher: the package-registry settings every Codex shell
4
+ * gets, built from the run's registry-only token (deriveRegistryToken, never the capability), and
5
+ * the run's service test variables. Delivered as CLAUDE_TOOL_SETUP_ENV: a Kubernetes Secret key, or
6
+ * `docker create --env NAME` with the value in the CLI's own environment.
7
+ */
8
+ import { serviceEnvironment } from "../../coding-worker/driver.js";
9
+ import { registryWorkerSetup } from "../../coding/registry/worker-config.js";
10
+ import { CODING_PROXY_ALIAS, CODING_PROXY_PORT } from "./docker-isolation.js";
11
+ /** Where the tool runner mounts the repository; the registry's config files live under its .cache. */
12
+ const TOOL_WORKSPACE = "/workspace";
13
+ /**
14
+ * The tool runner's parseToolSetup bounds (src/claude-tool-runner/command.mjs; a test keeps them
15
+ * equal). A setup past any of them would stop the tool runner before it reports ready, so the
16
+ * launcher refuses to build one instead.
17
+ */
18
+ export const CLAUDE_TOOL_SETUP_LIMITS = {
19
+ maxEnvEntries: 1024,
20
+ maxEnvValueBytes: 4096,
21
+ maxFiles: 8,
22
+ maxFileBytes: 16 * 1024,
23
+ maxSetupBytes: 96 * 1024,
24
+ };
25
+ export function claudeToolSetup(spec, capability) {
26
+ if (spec.provider !== "claude-code")
27
+ throw new Error("claude_tool_setup_provider");
28
+ const registry = registryWorkerSetup({
29
+ proxyBaseUrl: `http://${CODING_PROXY_ALIAS}:${CODING_PROXY_PORT}`,
30
+ capability,
31
+ cacheRoot: `${TOOL_WORKSPACE}/.cache`,
32
+ });
33
+ const setup = {
34
+ schemaVersion: 1,
35
+ // Same precedence as the Codex driver: the registry's own settings win over a service's.
36
+ env: { ...serviceEnvironment(spec.services), ...registry.env },
37
+ files: registry.files,
38
+ };
39
+ const raw = JSON.stringify(setup);
40
+ const limits = CLAUDE_TOOL_SETUP_LIMITS;
41
+ const entries = Object.values(setup.env);
42
+ if (entries.length > limits.maxEnvEntries ||
43
+ entries.some((value) => Buffer.byteLength(value) > limits.maxEnvValueBytes) ||
44
+ setup.files.length > limits.maxFiles ||
45
+ setup.files.some((file) => Buffer.byteLength(file.content) > limits.maxFileBytes) ||
46
+ Buffer.byteLength(raw) > limits.maxSetupBytes) {
47
+ throw new Error("claude_tool_setup_too_large");
48
+ }
49
+ return raw;
50
+ }
@@ -0,0 +1,7 @@
1
+ import { type CollectExclusions } from "../../coding/collect-exclude.js";
2
+ /**
3
+ * Deletes every excluded path from a staging copy of a workspace before it is
4
+ * validated. Walks with lstat and never descends through a symlink; `rm` removes
5
+ * a symlink itself, not its target.
6
+ */
7
+ export declare function pruneCollectExcluded(root: string, exclusions: CollectExclusions): Promise<void>;
@@ -0,0 +1,27 @@
1
+ import { lstat, opendir, rm } from "node:fs/promises";
2
+ import { join, relative, sep } from "node:path";
3
+ import { isCollectExcluded } from "../../coding/collect-exclude.js";
4
+ /**
5
+ * Deletes every excluded path from a staging copy of a workspace before it is
6
+ * validated. Walks with lstat and never descends through a symlink; `rm` removes
7
+ * a symlink itself, not its target.
8
+ */
9
+ export async function pruneCollectExcluded(root, exclusions) {
10
+ const visit = async (directory) => {
11
+ const handle = await opendir(directory);
12
+ const children = [];
13
+ for await (const entry of handle)
14
+ children.push(join(directory, entry.name));
15
+ for (const child of children) {
16
+ const relativePath = relative(root, child).split(sep).join("/");
17
+ if (isCollectExcluded(relativePath, exclusions)) {
18
+ await rm(child, { recursive: true, force: true });
19
+ continue;
20
+ }
21
+ const metadata = await lstat(child);
22
+ if (metadata.isDirectory() && !metadata.isSymbolicLink())
23
+ await visit(child);
24
+ }
25
+ };
26
+ await visit(root);
27
+ }
@@ -1,8 +1,22 @@
1
+ import type { CodingProvider } from "../../coding/provider.js";
1
2
  import type { JobSpec } from "./types.js";
2
3
  export declare const CODING_WORKER_UID = 10001;
3
4
  export declare const CODING_WORKER_GID = 10001;
5
+ /**
6
+ * The network keeper (a run with services only): owns the run's network namespace so each
7
+ * service and the worker can share it with `--network container:`, as a pod's containers do.
8
+ */
9
+ export declare const NETWORK_KEEPER_PIDS_LIMIT = 32;
10
+ export declare const NETWORK_KEEPER_MEMORY_MB = 64;
11
+ /** Idles until stopped, on the worker image's own `node` (every worker image ships it for the storage keeper). */
12
+ export declare const NETWORK_KEEPER_SCRIPT = "process.once('SIGTERM', () => process.exit(0)); setInterval(() => {}, 2147483647);";
4
13
  export declare const CODING_PROXY_ALIAS = "wardby-proxy";
5
14
  export declare const CODING_PROXY_PORT = 8787;
15
+ /**
16
+ * The one variable Claude's tool runner receives: its package-registry and service settings as JSON
17
+ * (claude-tool-setup.ts). Never the run capability.
18
+ */
19
+ export declare const CLAUDE_TOOL_SETUP_ENV = "WARDBY_TOOL_SETUP";
6
20
  /**
7
21
  * The proxy's deny port. Nothing is served here (see coding-proxy/deny-port.ts);
8
22
  * it is the enforcement witness — the one destination a run's NetworkPolicy must
@@ -25,6 +39,7 @@ export interface DockerIsolationNames {
25
39
  keeperContainer: string;
26
40
  workerContainer: string;
27
41
  toolContainer: string;
42
+ networkKeeperContainer: string;
28
43
  }
29
44
  export interface DockerIsolationPlan {
30
45
  names: DockerIsolationNames;
@@ -35,6 +50,8 @@ export interface DockerIsolationPlan {
35
50
  keeperCreateArgs: string[];
36
51
  workerCreateArgs: string[];
37
52
  toolCreateArgs?: string[];
53
+ /** Present only for a run with services (docs/coding-services.md). */
54
+ networkKeeperCreateArgs?: string[];
38
55
  proxyNetworkConnectArgs: string[];
39
56
  }
40
57
  export interface DockerHostInfo {
@@ -70,11 +87,14 @@ export interface DockerVolumeInspection {
70
87
  Options?: Record<string, string>;
71
88
  }
72
89
  export interface DockerContainerInspection {
90
+ Id?: string;
73
91
  Config?: {
74
92
  Env?: string[];
75
93
  User?: string;
76
94
  Image?: string;
77
95
  Labels?: Record<string, string>;
96
+ Entrypoint?: string[] | null;
97
+ Cmd?: string[] | null;
78
98
  };
79
99
  HostConfig?: {
80
100
  AutoRemove?: boolean;
@@ -140,18 +160,42 @@ export interface DockerContainerInspection {
140
160
  Ports?: Record<string, unknown>;
141
161
  };
142
162
  }
163
+ /**
164
+ * Which runs the Docker launcher starts services for: Codex and Claude Code. The container that runs
165
+ * the run's commands (Codex's worker, Claude Code's tool runner) joins the network keeper's
166
+ * namespace and reaches the services on 127.0.0.1; Claude Code's agent stays on the run network.
167
+ */
168
+ export declare function dockerSupportsServicesFor(provider: CodingProvider): boolean;
143
169
  /** A registry digest reference (`[host[:port]/]path@sha256:<64 hex>`); no local image IDs, no tags. */
144
170
  export declare function isRepositoryDigest(image: string): boolean;
145
171
  /** Accepts a registry digest or Docker's content-addressed local image ID. */
146
172
  export declare function isImmutableDockerImage(image: string): boolean;
173
+ /** The opaque per-run token in every Docker object name; never the run ID itself. */
174
+ export declare function isolationToken(runId: string): string;
147
175
  export declare function isolationNames(runId: string): DockerIsolationNames;
176
+ /** The fixed isolation labels every run object carries (docker-services.ts builds with them). */
177
+ export declare function isolationLabelArgs(runId: string): string[];
178
+ export declare function hasIsolationLabels(labels: Record<string, string> | undefined, runId: string): boolean;
148
179
  export declare function buildIsolationNetworkCreateArgs(runId: string): string[];
149
180
  export declare function buildStorageVolumeCreateArgs(spec: JobSpec): string[];
150
181
  export declare function buildKeeperCreateArgs(spec: JobSpec): string[];
182
+ export declare function buildNetworkKeeperCreateArgs(spec: JobSpec): string[];
151
183
  export declare function buildWorkerCreateArgs(spec: JobSpec, proxyPort?: number): string[];
184
+ export declare function claudeToolLimits(spec: JobSpec): {
185
+ cpus: number;
186
+ memoryMb: number;
187
+ pids: number;
188
+ };
152
189
  /** The Claude agent sees the task/result and socket, never the repository workspace. */
153
190
  export declare function buildClaudeAgentCreateArgs(spec: JobSpec, proxyPort?: number): string[];
154
- /** The tool runner receives only the checkout and socket; it never joins the proxy network. */
191
+ /**
192
+ * The tool runner receives only the checkout and its own storage subpath; it shares the run's
193
+ * proxy network with the agent (one room) but holds no capability, so the proxy grants it only
194
+ * registry access via its own WARDBY_TOOL_SETUP value. For a run with services it joins the network
195
+ * keeper's namespace instead, which is on that same run network: it reaches the proxy by its alias
196
+ * and the services on 127.0.0.1, and nothing else. It talks to the agent over the Unix socket in
197
+ * their shared `tool` storage subpath, which does not depend on either container's network.
198
+ */
155
199
  export declare function buildClaudeToolRunnerCreateArgs(spec: JobSpec): string[];
156
200
  export declare function buildProxyNetworkConnectArgs(runId: string, proxyContainer: string): string[];
157
201
  export declare function buildDockerIsolationPlan(spec: JobSpec, proxyContainer: string): DockerIsolationPlan;
@@ -160,7 +204,8 @@ export declare function assertIsolationNetworkInspection(network: DockerNetworkI
160
204
  export declare function assertIsolationNetworkParticipants(network: DockerNetworkInspection, expectedContainerNames: string[]): void;
161
205
  export declare function assertStorageVolumeInspection(volume: DockerVolumeInspection, spec: JobSpec): void;
162
206
  export declare function assertKeeperContainerInspection(container: DockerContainerInspection, spec: JobSpec): void;
207
+ export declare function assertNetworkKeeperContainerInspection(container: DockerContainerInspection, spec: JobSpec): void;
163
208
  export declare function assertProxyContainerInspection(container: DockerContainerInspection, runId: string): void;
164
- export declare function assertWorkerContainerInspection(container: DockerContainerInspection, spec: JobSpec, expectedCapability: string): void;
209
+ export declare function assertWorkerContainerInspection(container: DockerContainerInspection, spec: JobSpec, expectedCapability: string, networkKeeperId?: string): void;
165
210
  export declare function assertClaudeAgentContainerInspection(container: DockerContainerInspection, spec: JobSpec, expectedCapability: string): void;
166
- export declare function assertClaudeToolRunnerContainerInspection(container: DockerContainerInspection, spec: JobSpec): void;
211
+ export declare function assertClaudeToolRunnerContainerInspection(container: DockerContainerInspection, spec: JobSpec, expectedSetup: string, networkKeeperId?: string): void;