@wardby/cli 0.1.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 (412) hide show
  1. package/.env.example +131 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +2 -0
  4. package/README.md +282 -0
  5. package/bin/wardby.js +3 -0
  6. package/deploy/local/docker-compose.yml +19 -0
  7. package/dist/claude-coding-worker/driver.d.ts +70 -0
  8. package/dist/claude-coding-worker/driver.js +128 -0
  9. package/dist/claude-coding-worker/main.d.ts +2 -0
  10. package/dist/claude-coding-worker/main.js +41 -0
  11. package/dist/claude-coding-worker/sdk.d.ts +4 -0
  12. package/dist/claude-coding-worker/sdk.js +43 -0
  13. package/dist/claude-coding-worker/tool-relay.d.ts +1 -0
  14. package/dist/claude-coding-worker/tool-relay.js +9 -0
  15. package/dist/cli-help.d.ts +1 -0
  16. package/dist/cli-help.js +20 -0
  17. package/dist/cli.d.ts +18 -0
  18. package/dist/cli.js +629 -0
  19. package/dist/coding/observability.d.ts +59 -0
  20. package/dist/coding/observability.js +77 -0
  21. package/dist/coding/profile.d.ts +88 -0
  22. package/dist/coding/profile.js +137 -0
  23. package/dist/coding/protocol.d.ts +345 -0
  24. package/dist/coding/protocol.js +445 -0
  25. package/dist/coding/provider.d.ts +4 -0
  26. package/dist/coding/provider.js +18 -0
  27. package/dist/coding-proxy/main.d.ts +1 -0
  28. package/dist/coding-proxy/main.js +51 -0
  29. package/dist/coding-worker/artifact.d.ts +16 -0
  30. package/dist/coding-worker/artifact.js +37 -0
  31. package/dist/coding-worker/driver.d.ts +46 -0
  32. package/dist/coding-worker/driver.js +158 -0
  33. package/dist/coding-worker/errors.d.ts +1 -0
  34. package/dist/coding-worker/errors.js +23 -0
  35. package/dist/coding-worker/isolation-probe.d.ts +1 -0
  36. package/dist/coding-worker/isolation-probe.js +146 -0
  37. package/dist/coding-worker/keeper.d.ts +4 -0
  38. package/dist/coding-worker/keeper.js +29 -0
  39. package/dist/coding-worker/main.d.ts +2 -0
  40. package/dist/coding-worker/main.js +43 -0
  41. package/dist/coding-worker/sdk.d.ts +26 -0
  42. package/dist/coding-worker/sdk.js +28 -0
  43. package/dist/coding-worker/types.d.ts +64 -0
  44. package/dist/coding-worker/types.js +1 -0
  45. package/dist/config/providers.d.ts +158 -0
  46. package/dist/config/providers.js +162 -0
  47. package/dist/core/budget-groups.d.ts +72 -0
  48. package/dist/core/budget-groups.js +149 -0
  49. package/dist/core/budget.d.ts +63 -0
  50. package/dist/core/budget.js +69 -0
  51. package/dist/core/coding-queue.d.ts +32 -0
  52. package/dist/core/coding-queue.js +54 -0
  53. package/dist/core/cron.d.ts +31 -0
  54. package/dist/core/cron.js +43 -0
  55. package/dist/core/datastores.d.ts +41 -0
  56. package/dist/core/datastores.js +105 -0
  57. package/dist/core/db.d.ts +2 -0
  58. package/dist/core/db.js +2 -0
  59. package/dist/core/dispatch.d.ts +81 -0
  60. package/dist/core/dispatch.js +184 -0
  61. package/dist/core/engine-native.d.ts +29 -0
  62. package/dist/core/engine-native.js +259 -0
  63. package/dist/core/http-runtime.d.ts +7 -0
  64. package/dist/core/http-runtime.js +101 -0
  65. package/dist/core/lease.d.ts +13 -0
  66. package/dist/core/lease.js +22 -0
  67. package/dist/core/logger.d.ts +13 -0
  68. package/dist/core/logger.js +45 -0
  69. package/dist/core/memory-tools.d.ts +11 -0
  70. package/dist/core/memory-tools.js +122 -0
  71. package/dist/core/reconciler.d.ts +45 -0
  72. package/dist/core/reconciler.js +152 -0
  73. package/dist/core/runner.d.ts +87 -0
  74. package/dist/core/runner.js +529 -0
  75. package/dist/core/scheduler.d.ts +47 -0
  76. package/dist/core/scheduler.js +121 -0
  77. package/dist/core/secrets.d.ts +46 -0
  78. package/dist/core/secrets.js +100 -0
  79. package/dist/core/subagent-memory-tools.d.ts +18 -0
  80. package/dist/core/subagent-memory-tools.js +121 -0
  81. package/dist/core/timing.d.ts +7 -0
  82. package/dist/core/timing.js +7 -0
  83. package/dist/core/webhooks.d.ts +23 -0
  84. package/dist/core/webhooks.js +113 -0
  85. package/dist/env.d.ts +11 -0
  86. package/dist/env.js +13 -0
  87. package/dist/import/budgets.d.ts +16 -0
  88. package/dist/import/budgets.js +21 -0
  89. package/dist/import/bundle.d.ts +16 -0
  90. package/dist/import/bundle.js +61 -0
  91. package/dist/import/cli-args.d.ts +2 -0
  92. package/dist/import/cli-args.js +44 -0
  93. package/dist/import/create.d.ts +34 -0
  94. package/dist/import/create.js +363 -0
  95. package/dist/import/index.d.ts +25 -0
  96. package/dist/import/index.js +130 -0
  97. package/dist/import/model-gate.d.ts +1 -0
  98. package/dist/import/model-gate.js +3 -0
  99. package/dist/import/neutral-schema.d.ts +369 -0
  100. package/dist/import/neutral-schema.js +109 -0
  101. package/dist/import/preflight.d.ts +41 -0
  102. package/dist/import/preflight.js +71 -0
  103. package/dist/import/report.d.ts +5 -0
  104. package/dist/import/report.js +98 -0
  105. package/dist/import/tool-scan.d.ts +8 -0
  106. package/dist/import/tool-scan.js +20 -0
  107. package/dist/mcp/auth/ownership.d.ts +113 -0
  108. package/dist/mcp/auth/ownership.js +87 -0
  109. package/dist/mcp/auth/principal.d.ts +9 -0
  110. package/dist/mcp/auth/principal.js +9 -0
  111. package/dist/mcp/auth/resource-server.d.ts +47 -0
  112. package/dist/mcp/auth/resource-server.js +82 -0
  113. package/dist/mcp/auth/self-hosted/browser.d.ts +3 -0
  114. package/dist/mcp/auth/self-hosted/browser.js +273 -0
  115. package/dist/mcp/auth/self-hosted/cli.d.ts +2 -0
  116. package/dist/mcp/auth/self-hosted/cli.js +39 -0
  117. package/dist/mcp/auth/self-hosted/credentials.d.ts +58 -0
  118. package/dist/mcp/auth/self-hosted/credentials.js +106 -0
  119. package/dist/mcp/auth/self-hosted/rate-limit.d.ts +13 -0
  120. package/dist/mcp/auth/self-hosted/rate-limit.js +20 -0
  121. package/dist/mcp/auth/self-hosted/session.d.ts +36 -0
  122. package/dist/mcp/auth/self-hosted/session.js +110 -0
  123. package/dist/mcp/capabilities.d.ts +11 -0
  124. package/dist/mcp/capabilities.js +10 -0
  125. package/dist/mcp/context.d.ts +46 -0
  126. package/dist/mcp/context.js +1 -0
  127. package/dist/mcp/errors.d.ts +13 -0
  128. package/dist/mcp/errors.js +22 -0
  129. package/dist/mcp/index.d.ts +32 -0
  130. package/dist/mcp/index.js +187 -0
  131. package/dist/mcp/jsonrpc.d.ts +8 -0
  132. package/dist/mcp/jsonrpc.js +1 -0
  133. package/dist/mcp/server.d.ts +107 -0
  134. package/dist/mcp/server.js +203 -0
  135. package/dist/mcp/tasks/manager.d.ts +63 -0
  136. package/dist/mcp/tasks/manager.js +103 -0
  137. package/dist/mcp/tools/agents.d.ts +2 -0
  138. package/dist/mcp/tools/agents.js +375 -0
  139. package/dist/mcp/tools/budget-groups.d.ts +2 -0
  140. package/dist/mcp/tools/budget-groups.js +136 -0
  141. package/dist/mcp/tools/datastore.d.ts +2 -0
  142. package/dist/mcp/tools/datastore.js +217 -0
  143. package/dist/mcp/tools/memory.d.ts +3 -0
  144. package/dist/mcp/tools/memory.js +60 -0
  145. package/dist/mcp/tools/models.d.ts +8 -0
  146. package/dist/mcp/tools/models.js +15 -0
  147. package/dist/mcp/tools/runs.d.ts +2 -0
  148. package/dist/mcp/tools/runs.js +61 -0
  149. package/dist/mcp/tools/scheduling.d.ts +2 -0
  150. package/dist/mcp/tools/scheduling.js +48 -0
  151. package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -0
  152. package/dist/mcp/tools/secret-elicitation-form.js +93 -0
  153. package/dist/mcp/tools/secret-elicitation-server.d.ts +5 -0
  154. package/dist/mcp/tools/secret-elicitation-server.js +57 -0
  155. package/dist/mcp/tools/secret-elicitation.d.ts +38 -0
  156. package/dist/mcp/tools/secret-elicitation.js +52 -0
  157. package/dist/mcp/tools/secrets.d.ts +13 -0
  158. package/dist/mcp/tools/secrets.js +124 -0
  159. package/dist/mcp/tools/subagents.d.ts +2 -0
  160. package/dist/mcp/tools/subagents.js +133 -0
  161. package/dist/mcp/tools/text-result.d.ts +6 -0
  162. package/dist/mcp/tools/text-result.js +3 -0
  163. package/dist/mcp/tools/tools.d.ts +2 -0
  164. package/dist/mcp/tools/tools.js +211 -0
  165. package/dist/mcp/tools/trigger.d.ts +2 -0
  166. package/dist/mcp/tools/trigger.js +120 -0
  167. package/dist/mcp/tools/webhooks.d.ts +2 -0
  168. package/dist/mcp/tools/webhooks.js +34 -0
  169. package/dist/mcp/transport/http-limits.d.ts +17 -0
  170. package/dist/mcp/transport/http-limits.js +92 -0
  171. package/dist/mcp/transport/stdio.d.ts +23 -0
  172. package/dist/mcp/transport/stdio.js +6 -0
  173. package/dist/mcp/transport/streamable-http.d.ts +34 -0
  174. package/dist/mcp/transport/streamable-http.js +158 -0
  175. package/dist/mcp/unattended-schedules.d.ts +15 -0
  176. package/dist/mcp/unattended-schedules.js +21 -0
  177. package/dist/mcp/webhooks/ingress.d.ts +17 -0
  178. package/dist/mcp/webhooks/ingress.js +33 -0
  179. package/dist/observability/config.d.ts +6 -0
  180. package/dist/observability/config.js +20 -0
  181. package/dist/observability/metrics-server.d.ts +11 -0
  182. package/dist/observability/metrics-server.js +47 -0
  183. package/dist/observability/metrics.d.ts +36 -0
  184. package/dist/observability/metrics.js +158 -0
  185. package/dist/providers/auth/authorization-server.d.ts +41 -0
  186. package/dist/providers/auth/authorization-server.js +1 -0
  187. package/dist/providers/auth/delegating.d.ts +44 -0
  188. package/dist/providers/auth/delegating.js +105 -0
  189. package/dist/providers/auth/index.d.ts +11 -0
  190. package/dist/providers/auth/index.js +20 -0
  191. package/dist/providers/auth/release-gate.d.ts +1 -0
  192. package/dist/providers/auth/release-gate.js +4 -0
  193. package/dist/providers/auth/self-hosted.d.ts +78 -0
  194. package/dist/providers/auth/self-hosted.js +377 -0
  195. package/dist/providers/auth/subject.d.ts +1 -0
  196. package/dist/providers/auth/subject.js +6 -0
  197. package/dist/providers/auth/types.d.ts +63 -0
  198. package/dist/providers/auth/types.js +22 -0
  199. package/dist/providers/coding-proxy/deny-port.d.ts +5 -0
  200. package/dist/providers/coding-proxy/deny-port.js +45 -0
  201. package/dist/providers/coding-proxy/environment-credentials.d.ts +7 -0
  202. package/dist/providers/coding-proxy/environment-credentials.js +16 -0
  203. package/dist/providers/coding-proxy/index.d.ts +7 -0
  204. package/dist/providers/coding-proxy/index.js +7 -0
  205. package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -0
  206. package/dist/providers/coding-proxy/memory-ledger.js +103 -0
  207. package/dist/providers/coding-proxy/metering.d.ts +20 -0
  208. package/dist/providers/coding-proxy/metering.js +161 -0
  209. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -0
  210. package/dist/providers/coding-proxy/prisma-ledger.js +213 -0
  211. package/dist/providers/coding-proxy/proxy.d.ts +75 -0
  212. package/dist/providers/coding-proxy/proxy.js +721 -0
  213. package/dist/providers/coding-proxy/runtime.d.ts +18 -0
  214. package/dist/providers/coding-proxy/runtime.js +39 -0
  215. package/dist/providers/coding-proxy/secure-fetch.d.ts +9 -0
  216. package/dist/providers/coding-proxy/secure-fetch.js +72 -0
  217. package/dist/providers/coding-proxy/server.d.ts +17 -0
  218. package/dist/providers/coding-proxy/server.js +139 -0
  219. package/dist/providers/coding-proxy/types.d.ts +99 -0
  220. package/dist/providers/coding-proxy/types.js +1 -0
  221. package/dist/providers/datastore/index.d.ts +2 -0
  222. package/dist/providers/datastore/index.js +2 -0
  223. package/dist/providers/datastore/postgres.d.ts +20 -0
  224. package/dist/providers/datastore/postgres.js +130 -0
  225. package/dist/providers/datastore/scoped.d.ts +10 -0
  226. package/dist/providers/datastore/scoped.js +46 -0
  227. package/dist/providers/datastore/types.d.ts +31 -0
  228. package/dist/providers/datastore/types.js +7 -0
  229. package/dist/providers/email/types.d.ts +46 -0
  230. package/dist/providers/email/types.js +8 -0
  231. package/dist/providers/engine/index.d.ts +1 -0
  232. package/dist/providers/engine/index.js +1 -0
  233. package/dist/providers/engine/types.d.ts +67 -0
  234. package/dist/providers/engine/types.js +16 -0
  235. package/dist/providers/executor/build.d.ts +6 -0
  236. package/dist/providers/executor/build.js +15 -0
  237. package/dist/providers/executor/composition.d.ts +14 -0
  238. package/dist/providers/executor/composition.js +123 -0
  239. package/dist/providers/executor/container.d.ts +184 -0
  240. package/dist/providers/executor/container.js +936 -0
  241. package/dist/providers/executor/dbos-status.d.ts +50 -0
  242. package/dist/providers/executor/dbos-status.js +64 -0
  243. package/dist/providers/executor/dbos.d.ts +53 -0
  244. package/dist/providers/executor/dbos.js +269 -0
  245. package/dist/providers/executor/in-process.d.ts +18 -0
  246. package/dist/providers/executor/in-process.js +38 -0
  247. package/dist/providers/executor/index.d.ts +8 -0
  248. package/dist/providers/executor/index.js +8 -0
  249. package/dist/providers/executor/routing.d.ts +48 -0
  250. package/dist/providers/executor/routing.js +70 -0
  251. package/dist/providers/executor/types.d.ts +55 -0
  252. package/dist/providers/executor/types.js +1 -0
  253. package/dist/providers/index.d.ts +43 -0
  254. package/dist/providers/index.js +18 -0
  255. package/dist/providers/jobs/docker-isolation.d.ts +166 -0
  256. package/dist/providers/jobs/docker-isolation.js +724 -0
  257. package/dist/providers/jobs/docker.d.ts +127 -0
  258. package/dist/providers/jobs/docker.js +1027 -0
  259. package/dist/providers/jobs/fake-kubernetes-api.d.ts +98 -0
  260. package/dist/providers/jobs/fake-kubernetes-api.js +142 -0
  261. package/dist/providers/jobs/fake.d.ts +23 -0
  262. package/dist/providers/jobs/fake.js +132 -0
  263. package/dist/providers/jobs/kubernetes-api.d.ts +60 -0
  264. package/dist/providers/jobs/kubernetes-api.js +20 -0
  265. package/dist/providers/jobs/kubernetes-client.d.ts +36 -0
  266. package/dist/providers/jobs/kubernetes-client.js +171 -0
  267. package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +49 -0
  268. package/dist/providers/jobs/kubernetes-dry-run-fixture.js +141 -0
  269. package/dist/providers/jobs/kubernetes-isolation.d.ts +147 -0
  270. package/dist/providers/jobs/kubernetes-isolation.js +607 -0
  271. package/dist/providers/jobs/kubernetes-platform.d.ts +177 -0
  272. package/dist/providers/jobs/kubernetes-platform.js +280 -0
  273. package/dist/providers/jobs/kubernetes-preflight.d.ts +59 -0
  274. package/dist/providers/jobs/kubernetes-preflight.js +339 -0
  275. package/dist/providers/jobs/kubernetes-witness.d.ts +10 -0
  276. package/dist/providers/jobs/kubernetes-witness.js +193 -0
  277. package/dist/providers/jobs/kubernetes.d.ts +127 -0
  278. package/dist/providers/jobs/kubernetes.js +874 -0
  279. package/dist/providers/jobs/safe-extract.d.ts +9 -0
  280. package/dist/providers/jobs/safe-extract.js +325 -0
  281. package/dist/providers/jobs/types.d.ts +78 -0
  282. package/dist/providers/jobs/types.js +6 -0
  283. package/dist/providers/jobs/workspace-swap.d.ts +2 -0
  284. package/dist/providers/jobs/workspace-swap.js +47 -0
  285. package/dist/providers/llm/anthropic.d.ts +13 -0
  286. package/dist/providers/llm/anthropic.js +21 -0
  287. package/dist/providers/llm/bedrock.d.ts +19 -0
  288. package/dist/providers/llm/bedrock.js +33 -0
  289. package/dist/providers/llm/claude-messages.d.ts +106 -0
  290. package/dist/providers/llm/claude-messages.js +157 -0
  291. package/dist/providers/llm/claude-provider.d.ts +40 -0
  292. package/dist/providers/llm/claude-provider.js +31 -0
  293. package/dist/providers/llm/index.d.ts +10 -0
  294. package/dist/providers/llm/index.js +10 -0
  295. package/dist/providers/llm/openai.d.ts +23 -0
  296. package/dist/providers/llm/openai.js +156 -0
  297. package/dist/providers/llm/pricing-anthropic.d.ts +4 -0
  298. package/dist/providers/llm/pricing-anthropic.js +30 -0
  299. package/dist/providers/llm/pricing-bedrock-claude.d.ts +12 -0
  300. package/dist/providers/llm/pricing-bedrock-claude.js +37 -0
  301. package/dist/providers/llm/pricing-core.d.ts +26 -0
  302. package/dist/providers/llm/pricing-core.js +17 -0
  303. package/dist/providers/llm/pricing.d.ts +30 -0
  304. package/dist/providers/llm/pricing.js +74 -0
  305. package/dist/providers/llm/registration.d.ts +8 -0
  306. package/dist/providers/llm/registration.js +39 -0
  307. package/dist/providers/llm/routing.d.ts +25 -0
  308. package/dist/providers/llm/routing.js +32 -0
  309. package/dist/providers/llm/types.d.ts +85 -0
  310. package/dist/providers/llm/types.js +12 -0
  311. package/dist/providers/memory/index.d.ts +2 -0
  312. package/dist/providers/memory/index.js +2 -0
  313. package/dist/providers/memory/postgres.d.ts +20 -0
  314. package/dist/providers/memory/postgres.js +72 -0
  315. package/dist/providers/memory/types.d.ts +32 -0
  316. package/dist/providers/memory/types.js +17 -0
  317. package/dist/providers/secrets/app-key.d.ts +8 -0
  318. package/dist/providers/secrets/app-key.js +50 -0
  319. package/dist/providers/secrets/index.d.ts +10 -0
  320. package/dist/providers/secrets/index.js +13 -0
  321. package/dist/providers/secrets/transfer-envelope.d.ts +12 -0
  322. package/dist/providers/secrets/transfer-envelope.js +35 -0
  323. package/dist/providers/secrets/types.d.ts +18 -0
  324. package/dist/providers/secrets/types.js +12 -0
  325. package/dist/providers/storage/types.d.ts +18 -0
  326. package/dist/providers/storage/types.js +7 -0
  327. package/dist/providers/vcs/git.d.ts +105 -0
  328. package/dist/providers/vcs/git.js +710 -0
  329. package/dist/providers/vcs/github.d.ts +105 -0
  330. package/dist/providers/vcs/github.js +394 -0
  331. package/dist/providers/vcs/index.d.ts +6 -0
  332. package/dist/providers/vcs/index.js +26 -0
  333. package/dist/providers/vcs/types.d.ts +118 -0
  334. package/dist/providers/vcs/types.js +1 -0
  335. package/dist/sandbox/bounded-json.d.ts +2 -0
  336. package/dist/sandbox/bounded-json.js +36 -0
  337. package/dist/sandbox/bridge.d.ts +15 -0
  338. package/dist/sandbox/bridge.js +78 -0
  339. package/dist/sandbox/eval-core.d.ts +37 -0
  340. package/dist/sandbox/eval-core.js +159 -0
  341. package/dist/sandbox/fetch-policy.d.ts +24 -0
  342. package/dist/sandbox/fetch-policy.js +96 -0
  343. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +5 -0
  344. package/dist/sandbox/generated/zod.bundle.js +1 -0
  345. package/dist/sandbox/host-functions.d.ts +29 -0
  346. package/dist/sandbox/host-functions.js +168 -0
  347. package/dist/sandbox/limits.d.ts +39 -0
  348. package/dist/sandbox/limits.js +39 -0
  349. package/dist/sandbox/parser-worker/__fixtures__/crash.d.ts +1 -0
  350. package/dist/sandbox/parser-worker/__fixtures__/crash.js +6 -0
  351. package/dist/sandbox/parser-worker/__fixtures__/echo.d.ts +1 -0
  352. package/dist/sandbox/parser-worker/__fixtures__/echo.js +5 -0
  353. package/dist/sandbox/parser-worker/__fixtures__/reject.d.ts +1 -0
  354. package/dist/sandbox/parser-worker/__fixtures__/reject.js +5 -0
  355. package/dist/sandbox/parser-worker/__fixtures__/spin-forever.d.ts +1 -0
  356. package/dist/sandbox/parser-worker/__fixtures__/spin-forever.js +11 -0
  357. package/dist/sandbox/parser-worker/pool.d.ts +13 -0
  358. package/dist/sandbox/parser-worker/pool.js +111 -0
  359. package/dist/sandbox/parser-worker/worker.d.ts +14 -0
  360. package/dist/sandbox/parser-worker/worker.js +63 -0
  361. package/dist/sandbox/pii-redaction.d.ts +1 -0
  362. package/dist/sandbox/pii-redaction.js +29 -0
  363. package/dist/sandbox/prelude.d.ts +26 -0
  364. package/dist/sandbox/prelude.js +408 -0
  365. package/dist/sandbox/quickjs-module.d.ts +13 -0
  366. package/dist/sandbox/quickjs-module.js +19 -0
  367. package/dist/sandbox/run-in-sandbox.d.ts +34 -0
  368. package/dist/sandbox/run-in-sandbox.js +53 -0
  369. package/dist/sandbox/safe-fetch.d.ts +26 -0
  370. package/dist/sandbox/safe-fetch.js +140 -0
  371. package/dist/sandbox/tool-capabilities.d.ts +66 -0
  372. package/dist/sandbox/tool-capabilities.js +103 -0
  373. package/dist/sandbox/zod-params.d.ts +22 -0
  374. package/dist/sandbox/zod-params.js +60 -0
  375. package/dist/serve.d.ts +14 -0
  376. package/dist/serve.js +54 -0
  377. package/dist/wardby-bin.d.ts +2 -0
  378. package/dist/wardby-bin.js +20 -0
  379. package/package.json +123 -0
  380. package/prisma/migrations/20260905000000_init/migration.sql +34 -0
  381. package/prisma/migrations/20260905010000_scheduler_durability/migration.sql +31 -0
  382. package/prisma/migrations/20260905020000_tools_multiturn/migration.sql +47 -0
  383. package/prisma/migrations/20260905030000_cache_tool_json_schema/migration.sql +13 -0
  384. package/prisma/migrations/20260906000000_mcp_phase4/migration.sql +115 -0
  385. package/prisma/migrations/20260906010000_run_final_text/migration.sql +7 -0
  386. package/prisma/migrations/20260906020000_run_turns/migration.sql +6 -0
  387. package/prisma/migrations/20260906030000_task_principal_id/migration.sql +5 -0
  388. package/prisma/migrations/20260906040000_secure_self_hosted_oauth/migration.sql +67 -0
  389. package/prisma/migrations/20260906050000_phase5_coding_agents/migration.sql +52 -0
  390. package/prisma/migrations/20260906060000_tool_capability_scoping/migration.sql +22 -0
  391. package/prisma/migrations/20260906070000_datastore_pii_flag/migration.sql +6 -0
  392. package/prisma/migrations/20260906080000_secret_elicitation_outcomes/migration.sql +13 -0
  393. package/prisma/migrations/20260907010000_coding_proxy_ledger/migration.sql +57 -0
  394. package/prisma/migrations/20260907020000_budget_groups/migration.sql +24 -0
  395. package/prisma/migrations/20260907030000_coding_webhook_task_override/migration.sql +4 -0
  396. package/prisma/migrations/20260908010000_run_execution_backend/migration.sql +2 -0
  397. package/prisma/migrations/20260908020000_coding_run_audit_metadata/migration.sql +7 -0
  398. package/prisma/migrations/20260910010000_agent_secret_bound_name/migration.sql +16 -0
  399. package/prisma/migrations/20260911010000_coding_worker_toolchains/migration.sql +5 -0
  400. package/prisma/migrations/20260912010000_coding_provider_contract/migration.sql +24 -0
  401. package/prisma/migrations/20260912020000_coding_proxy_protocol/migration.sql +10 -0
  402. package/prisma/migrations/20260912030000_agent_memory/migration.sql +18 -0
  403. package/prisma/migrations/20260912040000_named_shared_datastores/migration.sql +68 -0
  404. package/prisma/migrations/20260913000000_run_trigger_webhook/migration.sql +2 -0
  405. package/prisma/migrations/20260913010000_agent_sub_agent/migration.sql +32 -0
  406. package/prisma/migrations/20260913020000_run_task_override/migration.sql +5 -0
  407. package/prisma/migrations/20260913030000_coding_run_root/migration.sql +11 -0
  408. package/prisma/migrations/20260922010000_coding_run_queued_at/migration.sql +8 -0
  409. package/prisma/migrations/20260922020000_coding_workspace_disk/migration.sql +8 -0
  410. package/prisma/migrations/migration_lock.toml +3 -0
  411. package/prisma/schema.prisma +723 -0
  412. package/scripts/git-askpass.sh +11 -0
@@ -0,0 +1,2 @@
1
+ import type { PrismaClient } from "@prisma/client";
2
+ export declare function authCommand(args: string[], db: PrismaClient, hashKey: string, output?: (value: string) => void): Promise<void>;
@@ -0,0 +1,39 @@
1
+ import { parseArgs } from "node:util";
2
+ import { IdentityService } from "./credentials.js";
3
+ export async function authCommand(args, db, hashKey, output = console.log) {
4
+ const [kind, action, ...rest] = args;
5
+ const service = new IdentityService(db, hashKey);
6
+ if (hashKey.toLowerCase() === process.env.SECRET_APP_KEY?.toLowerCase() ||
7
+ hashKey.toLowerCase() === process.env.AUTH_SIGNING_KEY?.toLowerCase())
8
+ throw new Error("Authentication keys must be independent.");
9
+ if (kind === "key" && action === "revoke" && rest.length === 1) {
10
+ await service.revokeKey(rest[0]);
11
+ output("Key, sessions, and grants revoked.");
12
+ return;
13
+ }
14
+ const { values } = parseArgs({ args: rest, options: { subject: { type: "string" } } });
15
+ if (kind === "user" && action === "list") {
16
+ output(JSON.stringify(await service.listUsers(), null, 2));
17
+ return;
18
+ }
19
+ if (!values.subject)
20
+ throw new Error("auth requires --subject (except user list and key revoke <key-id>).");
21
+ if (kind === "user" && action === "create") {
22
+ output(JSON.stringify(await service.createUser(values.subject)));
23
+ return;
24
+ }
25
+ if (kind === "user" && action === "disable") {
26
+ await service.disableUser(values.subject);
27
+ output("User disabled; credentials, sessions, and grants revoked.");
28
+ return;
29
+ }
30
+ if (kind === "key" && action === "create") {
31
+ output(await service.createKey(values.subject));
32
+ return;
33
+ }
34
+ if (kind === "key" && action === "list") {
35
+ output(JSON.stringify(await service.listKeys(values.subject), null, 2));
36
+ return;
37
+ }
38
+ throw new Error("Use auth user create|list|disable or auth key create|list|revoke.");
39
+ }
@@ -0,0 +1,58 @@
1
+ import type { Prisma, PrismaClient } from "@prisma/client";
2
+ export type AuthDb = Prisma.TransactionClient;
3
+ export declare const DAY = 86400000;
4
+ export declare function decodeKey(value: string, name: string): Buffer;
5
+ export declare class Credentials {
6
+ private readonly key;
7
+ constructor(value: string);
8
+ hash(value: string): string;
9
+ create(prefix: string): {
10
+ id: `${string}-${string}-${string}-${string}-${string}`;
11
+ token: string;
12
+ hash: string;
13
+ };
14
+ id(token: string, prefix: string): string | undefined;
15
+ matches(token: string, hash: string | undefined): boolean;
16
+ }
17
+ export declare function lockUser(tx: AuthDb, id: string): Promise<{
18
+ principal: {
19
+ id: string;
20
+ createdAt: Date;
21
+ subject: string;
22
+ };
23
+ } & {
24
+ status: string;
25
+ id: string;
26
+ createdAt: Date;
27
+ updatedAt: Date;
28
+ principalId: string;
29
+ displayName: string | null;
30
+ }>;
31
+ export declare class IdentityService {
32
+ readonly db: PrismaClient;
33
+ readonly credentials: Credentials;
34
+ constructor(db: PrismaClient, hashKey: string);
35
+ createUser(subject: string): Promise<{
36
+ userId: string;
37
+ subject: string;
38
+ loginKey: string;
39
+ }>;
40
+ createKey(subject: string): Promise<string>;
41
+ disableUser(subject: string): Promise<void>;
42
+ revokeKey(keyId: string): Promise<void>;
43
+ listUsers(): Prisma.PrismaPromise<{
44
+ status: string;
45
+ principal: {
46
+ subject: string;
47
+ };
48
+ id: string;
49
+ displayName: string | null;
50
+ }[]>;
51
+ listKeys(subject: string): Prisma.PrismaPromise<{
52
+ createdAt: Date;
53
+ keyId: string;
54
+ lastUsedAt: Date | null;
55
+ expiresAt: Date;
56
+ revokedAt: Date | null;
57
+ }[]>;
58
+ }
@@ -0,0 +1,106 @@
1
+ import { createHmac, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
2
+ import { requireSubject } from "../../../providers/auth/subject.js";
3
+ export const DAY = 86_400_000;
4
+ export function decodeKey(value, name) {
5
+ if (!/^[a-f\d]{64}$/i.test(value))
6
+ throw new Error(`${name} must be 32 random bytes encoded as 64 hex characters.`);
7
+ return Buffer.from(value, "hex");
8
+ }
9
+ export class Credentials {
10
+ key;
11
+ constructor(value) {
12
+ this.key = decodeKey(value, "AUTH_CREDENTIAL_HASH_KEY");
13
+ }
14
+ hash(value) {
15
+ return createHmac("sha256", this.key).update(value).digest("hex");
16
+ }
17
+ create(prefix) {
18
+ const id = randomUUID();
19
+ const token = `${prefix}_${id}.${randomBytes(32).toString("base64url")}`;
20
+ return { id, token, hash: this.hash(token) };
21
+ }
22
+ id(token, prefix) {
23
+ const match = new RegExp(`^${prefix}_([a-f0-9-]{36})\\.([A-Za-z0-9_-]{43})$`).exec(token);
24
+ return match?.[1];
25
+ }
26
+ matches(token, hash) {
27
+ const expected = hash && /^[a-f\d]{64}$/i.test(hash) ? Buffer.from(hash, "hex") : Buffer.alloc(32);
28
+ return timingSafeEqual(Buffer.from(this.hash(token), "hex"), expected) && !!hash;
29
+ }
30
+ }
31
+ export async function lockUser(tx, id) {
32
+ await tx.$queryRaw `SELECT "id" FROM "AuthUser" WHERE "id" = ${id} FOR UPDATE`;
33
+ const user = await tx.authUser.findUnique({ where: { id }, include: { principal: true } });
34
+ if (!user || user.status !== "enabled")
35
+ throw new Error("Invalid credentials.");
36
+ requireSubject(user.principal.subject);
37
+ return user;
38
+ }
39
+ export class IdentityService {
40
+ db;
41
+ credentials;
42
+ constructor(db, hashKey) {
43
+ this.db = db;
44
+ this.credentials = new Credentials(hashKey);
45
+ }
46
+ async createUser(subject) {
47
+ requireSubject(subject);
48
+ return this.db.$transaction(async (tx) => {
49
+ const principal = await tx.principal.upsert({ where: { subject }, create: { subject }, update: {} });
50
+ const user = await tx.authUser.create({ data: { principalId: principal.id } });
51
+ const key = this.credentials.create("rvk");
52
+ await tx.authLoginKey.create({
53
+ data: { keyId: key.id, userId: user.id, secretHash: key.hash, expiresAt: new Date(Date.now() + 365 * DAY) },
54
+ });
55
+ return { userId: user.id, subject, loginKey: key.token };
56
+ });
57
+ }
58
+ async createKey(subject) {
59
+ const user = await this.db.authUser.findFirst({ where: { principal: { subject: requireSubject(subject) } } });
60
+ if (!user)
61
+ throw new Error("Unknown user.");
62
+ return this.db.$transaction(async (tx) => {
63
+ await lockUser(tx, user.id);
64
+ const key = this.credentials.create("rvk");
65
+ await tx.authLoginKey.create({
66
+ data: { keyId: key.id, userId: user.id, secretHash: key.hash, expiresAt: new Date(Date.now() + 365 * DAY) },
67
+ });
68
+ return key.token;
69
+ });
70
+ }
71
+ async disableUser(subject) {
72
+ const user = await this.db.authUser.findFirst({ where: { principal: { subject: requireSubject(subject) } } });
73
+ if (!user)
74
+ throw new Error("Unknown user.");
75
+ await this.db.$transaction(async (tx) => {
76
+ await tx.$queryRaw `SELECT "id" FROM "AuthUser" WHERE "id" = ${user.id} FOR UPDATE`;
77
+ const now = new Date();
78
+ await tx.authUser.update({ where: { id: user.id }, data: { status: "disabled" } });
79
+ await tx.authLoginKey.updateMany({ where: { userId: user.id }, data: { revokedAt: now } });
80
+ await tx.authSession.updateMany({ where: { userId: user.id }, data: { revokedAt: now } });
81
+ await tx.oAuthFamily.updateMany({ where: { userId: user.id }, data: { revokedAt: now } });
82
+ });
83
+ }
84
+ async revokeKey(keyId) {
85
+ const key = await this.db.authLoginKey.findUnique({ where: { keyId } });
86
+ if (!key)
87
+ return;
88
+ await this.db.$transaction(async (tx) => {
89
+ await tx.$queryRaw `SELECT "id" FROM "AuthUser" WHERE "id" = ${key.userId} FOR UPDATE`;
90
+ await tx.authLoginKey.update({ where: { keyId }, data: { revokedAt: new Date() } });
91
+ await tx.authSession.updateMany({ where: { userId: key.userId }, data: { revokedAt: new Date() } });
92
+ await tx.oAuthFamily.updateMany({ where: { userId: key.userId }, data: { revokedAt: new Date() } });
93
+ });
94
+ }
95
+ listUsers() {
96
+ return this.db.authUser.findMany({
97
+ select: { id: true, status: true, displayName: true, principal: { select: { subject: true } } },
98
+ });
99
+ }
100
+ listKeys(subject) {
101
+ return this.db.authLoginKey.findMany({
102
+ where: { user: { principal: { subject: requireSubject(subject) } } },
103
+ select: { keyId: true, createdAt: true, expiresAt: true, lastUsedAt: true, revokedAt: true },
104
+ });
105
+ }
106
+ }
@@ -0,0 +1,13 @@
1
+ import type { PrismaClient } from "@prisma/client";
2
+ import type { Credentials } from "./credentials.js";
3
+ export interface RateLimiter {
4
+ check(bucket: string, identity: string, limit: number): Promise<void>;
5
+ }
6
+ export declare class RateLimitError extends Error {
7
+ }
8
+ export declare class PostgresRateLimiter implements RateLimiter {
9
+ private db;
10
+ private credentials;
11
+ constructor(db: PrismaClient, credentials: Credentials);
12
+ check(bucket: string, identity: string, limit: number): Promise<void>;
13
+ }
@@ -0,0 +1,20 @@
1
+ export class RateLimitError extends Error {
2
+ }
3
+ export class PostgresRateLimiter {
4
+ db;
5
+ credentials;
6
+ constructor(db, credentials) {
7
+ this.db = db;
8
+ this.credentials = credentials;
9
+ }
10
+ async check(bucket, identity, limit) {
11
+ const window = Math.floor(Date.now() / 60_000);
12
+ const key = this.credentials.hash(`${bucket}:${identity}:${window}`);
13
+ const expires = new Date((window + 2) * 60_000);
14
+ const rows = await this.db.$queryRaw `
15
+ INSERT INTO "AuthRateLimit" ("key", "hits", "expiresAt") VALUES (${key}, 1, ${expires})
16
+ ON CONFLICT ("key") DO UPDATE SET "hits" = "AuthRateLimit"."hits" + 1 RETURNING "hits"`;
17
+ if (rows[0].hits > limit)
18
+ throw new RateLimitError("Rate limited.");
19
+ }
20
+ }
@@ -0,0 +1,36 @@
1
+ import type { PrismaClient } from "@prisma/client";
2
+ import type { Credentials } from "./credentials.js";
3
+ import { type AuthDb } from "./credentials.js";
4
+ export declare class Sessions {
5
+ readonly db: PrismaClient;
6
+ readonly credentials: Credentials;
7
+ constructor(db: PrismaClient, credentials: Credentials);
8
+ challenge(purpose: "login" | "consent" | "logout", sessionId: string | null, binding: string): Promise<string>;
9
+ consumeChallenge(tx: AuthDb, token: string, purpose: string, sessionId: string | null, binding: string): Promise<void>;
10
+ login(loginKey: string, challenge: string, binding: string, previousSession?: string): Promise<string>;
11
+ get(token: string, tx?: AuthDb): Promise<{
12
+ user: {
13
+ principal: {
14
+ id: string;
15
+ createdAt: Date;
16
+ subject: string;
17
+ };
18
+ } & {
19
+ status: string;
20
+ id: string;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ principalId: string;
24
+ displayName: string | null;
25
+ };
26
+ } & {
27
+ createdAt: Date;
28
+ userId: string;
29
+ secretHash: string;
30
+ expiresAt: Date;
31
+ revokedAt: Date | null;
32
+ sessionId: string;
33
+ lastSeenAt: Date;
34
+ }>;
35
+ logout(token: string, challenge: string): Promise<void>;
36
+ }
@@ -0,0 +1,110 @@
1
+ import { DAY, lockUser } from "./credentials.js";
2
+ export class Sessions {
3
+ db;
4
+ credentials;
5
+ constructor(db, credentials) {
6
+ this.db = db;
7
+ this.credentials = credentials;
8
+ }
9
+ async challenge(purpose, sessionId, binding) {
10
+ const challenge = this.credentials.create("rvc");
11
+ await this.db.authFormChallenge.create({
12
+ data: {
13
+ challengeId: challenge.id,
14
+ sessionId,
15
+ purpose,
16
+ binding: this.credentials.hash(binding),
17
+ secretHash: challenge.hash,
18
+ expiresAt: new Date(Date.now() + 600_000),
19
+ },
20
+ });
21
+ return challenge.token;
22
+ }
23
+ async consumeChallenge(tx, token, purpose, sessionId, binding) {
24
+ const id = this.credentials.id(token, "rvc");
25
+ if (!id)
26
+ throw new Error("Invalid form challenge.");
27
+ const row = await tx.authFormChallenge.findUnique({ where: { challengeId: id } });
28
+ if (!this.credentials.matches(token, row?.secretHash))
29
+ throw new Error("Invalid form challenge.");
30
+ const result = await tx.authFormChallenge.updateMany({
31
+ where: {
32
+ challengeId: id,
33
+ purpose,
34
+ sessionId,
35
+ binding: this.credentials.hash(binding),
36
+ consumedAt: null,
37
+ expiresAt: { gt: new Date() },
38
+ },
39
+ data: { consumedAt: new Date() },
40
+ });
41
+ if (result.count !== 1)
42
+ throw new Error("Invalid form challenge.");
43
+ }
44
+ async login(loginKey, challenge, binding, previousSession) {
45
+ // A failed credential attempt still consumes its challenge.
46
+ await this.consumeChallenge(this.db, challenge, "login", null, binding);
47
+ const keyId = this.credentials.id(loginKey, "rvk");
48
+ const key = keyId ? await this.db.authLoginKey.findUnique({ where: { keyId } }) : null;
49
+ if (!this.credentials.matches(loginKey, key?.secretHash) || !key)
50
+ throw new Error("Invalid credentials.");
51
+ return this.db.$transaction(async (tx) => {
52
+ await lockUser(tx, key.userId);
53
+ const valid = await tx.authLoginKey.updateMany({
54
+ where: { keyId: key.keyId, revokedAt: null, expiresAt: { gt: new Date() } },
55
+ data: { lastUsedAt: new Date() },
56
+ });
57
+ if (valid.count !== 1)
58
+ throw new Error("Invalid credentials.");
59
+ if (previousSession) {
60
+ const previousId = this.credentials.id(previousSession, "rvs");
61
+ if (previousId)
62
+ await tx.authSession.updateMany({
63
+ where: { sessionId: previousId, secretHash: this.credentials.hash(previousSession) },
64
+ data: { revokedAt: new Date() },
65
+ });
66
+ }
67
+ const session = this.credentials.create("rvs");
68
+ await tx.authSession.create({
69
+ data: {
70
+ sessionId: session.id,
71
+ userId: key.userId,
72
+ secretHash: session.hash,
73
+ expiresAt: new Date(Date.now() + 30 * DAY),
74
+ },
75
+ });
76
+ return session.token;
77
+ });
78
+ }
79
+ async get(token, tx = this.db) {
80
+ const sessionId = this.credentials.id(token, "rvs");
81
+ if (!sessionId)
82
+ throw new Error("Invalid session.");
83
+ const session = await tx.authSession.findUnique({
84
+ where: { sessionId },
85
+ include: { user: { include: { principal: true } } },
86
+ });
87
+ if (!session || !this.credentials.matches(token, session.secretHash) || session.user.status !== "enabled")
88
+ throw new Error("Invalid session.");
89
+ const now = new Date();
90
+ const live = await tx.authSession.updateMany({
91
+ where: {
92
+ sessionId,
93
+ revokedAt: null,
94
+ expiresAt: { gt: now },
95
+ lastSeenAt: { gt: new Date(now.getTime() - DAY / 2) },
96
+ },
97
+ data: { lastSeenAt: now },
98
+ });
99
+ if (live.count !== 1)
100
+ throw new Error("Invalid session.");
101
+ return session;
102
+ }
103
+ async logout(token, challenge) {
104
+ await this.db.$transaction(async (tx) => {
105
+ const session = await this.get(token, tx);
106
+ await this.consumeChallenge(tx, challenge, "logout", session.sessionId, "logout");
107
+ await tx.authSession.update({ where: { sessionId: session.sessionId }, data: { revokedAt: new Date() } });
108
+ });
109
+ }
110
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tasks extension identity + per-request client-capability inspection.
3
+ * `io.modelcontextprotocol/tasks` capabilities have no settings of their
4
+ * own (an empty object means "supported"), per the extension's own spec.
5
+ */
6
+ export declare const TASKS_EXTENSION_ID = "io.modelcontextprotocol/tasks";
7
+ export interface ClientCapabilitiesLike {
8
+ extensions?: Record<string, unknown>;
9
+ }
10
+ /** Whether a request's declared client capabilities include the Tasks extension. */
11
+ export declare function clientSupportsTasks(clientCapabilities: ClientCapabilitiesLike | undefined): boolean;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tasks extension identity + per-request client-capability inspection.
3
+ * `io.modelcontextprotocol/tasks` capabilities have no settings of their
4
+ * own (an empty object means "supported"), per the extension's own spec.
5
+ */
6
+ export const TASKS_EXTENSION_ID = "io.modelcontextprotocol/tasks";
7
+ /** Whether a request's declared client capabilities include the Tasks extension. */
8
+ export function clientSupportsTasks(clientCapabilities) {
9
+ return Boolean(clientCapabilities?.extensions?.[TASKS_EXTENSION_ID]);
10
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Per-request context every MCP tool handler receives: who's calling
3
+ * (principal + granted scopes) and what they can call into. Narrowed to
4
+ * the seams Phase 4's tool modules actually touch (llm/engine/datastore/
5
+ * secrets/executor/memory) — same `Pick<ProviderRegistry, ...>` narrowing
6
+ * this codebase already uses for `executeRun`/`RunnerDb`, since the full
7
+ * registry also carries jobs/email/auth/storage seams no Phase 4 tool
8
+ * needs and this plan never builds real adapters for.
9
+ */
10
+ import type { Principal, PrismaClient } from "@prisma/client";
11
+ import type { RequestStateAccessor } from "@modelcontextprotocol/server";
12
+ import type { ProviderRegistry } from "../providers/index.js";
13
+ export type McpProviders = Pick<ProviderRegistry, "llm" | "engine" | "datastore" | "secrets" | "executor" | "memory">;
14
+ export interface McpRequestContext {
15
+ principal: Principal;
16
+ scopes: Set<string>;
17
+ /**
18
+ * The server's resource identifier, for tool handlers that need a
19
+ * field-level scope step-up beyond the tool's own declared scope (e.g.
20
+ * requiring agents:admin only when a mutation touches workerImageRef).
21
+ * Passed to requireScope the same way WardbyMcpServer does centrally.
22
+ */
23
+ canonicalUri: string;
24
+ providers: McpProviders;
25
+ db: PrismaClient;
26
+ /**
27
+ * The current call's multi-round-trip data (protocol revision 2026-07-28)
28
+ * — present on every call so a tool can tell an initial call from a
29
+ * retried one. `inputResponses` is only populated on a retry;
30
+ * `requestState()` returns the verified payload minted by
31
+ * `WardbyMcpServer.mintRequestState` on a prior round, or `undefined` on
32
+ * an initial call. See src/mcp/tools/secrets.ts for the one current user.
33
+ */
34
+ mcpReq: {
35
+ inputResponses?: Record<string, unknown>;
36
+ requestState: RequestStateAccessor;
37
+ };
38
+ /**
39
+ * Whether THIS call's client declared the Tasks extension
40
+ * (io.modelcontextprotocol/tasks) — read from the modern-era per-request
41
+ * `_meta` envelope (`ctx.mcpReq.envelope.clientCapabilities`). A legacy
42
+ * (2025-era) client carries no envelope at all and is therefore always
43
+ * `false` here — Tasks is a 2026-07-28-only concept.
44
+ */
45
+ clientSupportsTasks: boolean;
46
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ /**
2
+ * MCP-layer errors that carry an HTTP status + WWW-Authenticate challenge —
3
+ * the transport (Task 7) maps these to the actual HTTP response; JSON-RPC
4
+ * dispatch (Task 6) maps them to a JSON-RPC error object. One error type
5
+ * for both call sites avoids two parallel error hierarchies.
6
+ */
7
+ export declare class McpError extends Error {
8
+ readonly httpStatus: number;
9
+ readonly wwwAuthenticate?: string;
10
+ constructor(httpStatus: number, message: string, wwwAuthenticate?: string);
11
+ }
12
+ export declare function unauthorized(message: string, resourceMetadataUrl: string): McpError;
13
+ export declare function insufficientScope(scopes: string[], resourceMetadataUrl: string): McpError;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * MCP-layer errors that carry an HTTP status + WWW-Authenticate challenge —
3
+ * the transport (Task 7) maps these to the actual HTTP response; JSON-RPC
4
+ * dispatch (Task 6) maps them to a JSON-RPC error object. One error type
5
+ * for both call sites avoids two parallel error hierarchies.
6
+ */
7
+ export class McpError extends Error {
8
+ httpStatus;
9
+ wwwAuthenticate;
10
+ constructor(httpStatus, message, wwwAuthenticate) {
11
+ super(message);
12
+ this.name = "McpError";
13
+ this.httpStatus = httpStatus;
14
+ this.wwwAuthenticate = wwwAuthenticate;
15
+ }
16
+ }
17
+ export function unauthorized(message, resourceMetadataUrl) {
18
+ return new McpError(401, message, `Bearer resource_metadata="${resourceMetadataUrl}"`);
19
+ }
20
+ export function insufficientScope(scopes, resourceMetadataUrl) {
21
+ return new McpError(403, `Insufficient scope; this operation requires: ${scopes.join(" ")}`, `Bearer resource_metadata="${resourceMetadataUrl}", scope="${scopes.join(" ")}"`);
22
+ }
@@ -0,0 +1,32 @@
1
+ import { type WardbyMcpServer } from "./server.js";
2
+ import type { McpProviders } from "./context.js";
3
+ import { type SecretElicitationUrlBuilder } from "./tools/secrets.js";
4
+ /** Registers the full Phase 4 tool surface — every module, in one place. */
5
+ export declare function registerAllTools(mcp: WardbyMcpServer, opts: {
6
+ secretElicitationUrl: SecretElicitationUrlBuilder;
7
+ secretElicitationProtocol: boolean;
8
+ }): void;
9
+ export interface McpProviderComposition {
10
+ providers: McpProviders;
11
+ }
12
+ /** Builds the real provider set (LLM/engine/datastore/secrets/executor) — shared by both transports. */
13
+ export declare function buildMcpProviders(): McpProviderComposition;
14
+ /** Handle returned by `startMcp()` — closes the running transport, then the executor. */
15
+ export interface McpServerHandle {
16
+ close(): Promise<void>;
17
+ }
18
+ export interface StartMcpOptions {
19
+ /**
20
+ * A pre-built provider set. `wardby serve` builds one and shares it, because
21
+ * DbosExecutor is a per-process singleton and two executors cannot coexist
22
+ * (dbos.ts launch()). Built internally when omitted.
23
+ */
24
+ providers?: McpProviders;
25
+ /**
26
+ * Set by a composition root that also runs the scheduler, so startup does
27
+ * not warn that enabled schedules will never fire.
28
+ */
29
+ schedulerAttached?: boolean;
30
+ }
31
+ /** The real CLI entry point: `wardby mcp`. Reads config from the environment, starts stdio or HTTP per MCP_TRANSPORT. */
32
+ export declare function startMcp(options?: StartMcpOptions): Promise<McpServerHandle>;