@wardby/cli 0.2.0 → 0.3.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 (491) hide show
  1. package/.env.example +34 -4
  2. package/README.md +183 -71
  3. package/dist/claude-coding-worker/driver.d.ts +7 -1
  4. package/dist/claude-coding-worker/driver.js +31 -2
  5. package/dist/claude-coding-worker/main.js +5 -2
  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 +13 -4
  10. package/dist/cli.d.ts +1 -1
  11. package/dist/cli.js +219 -29
  12. package/dist/coding/collect-exclude.d.ts +25 -0
  13. package/dist/coding/collect-exclude.js +76 -0
  14. package/dist/coding/profile.d.ts +67 -22
  15. package/dist/coding/profile.js +58 -25
  16. package/dist/coding/protected-path-wording.d.ts +24 -0
  17. package/dist/coding/protected-path-wording.js +55 -0
  18. package/dist/coding/protected-paths.d.ts +31 -0
  19. package/dist/coding/protected-paths.js +48 -0
  20. package/dist/coding/protocol.d.ts +99 -3
  21. package/dist/coding/protocol.js +155 -4
  22. package/dist/coding/registry/adapters.d.ts +2 -0
  23. package/dist/coding/registry/adapters.js +9 -0
  24. package/dist/coding/registry/allowlist.d.ts +9 -0
  25. package/dist/coding/registry/allowlist.js +28 -0
  26. package/dist/coding/registry/json-scan.d.ts +55 -0
  27. package/dist/coding/registry/json-scan.js +191 -0
  28. package/dist/coding/registry/lockfiles.d.ts +6 -0
  29. package/dist/coding/registry/lockfiles.js +89 -0
  30. package/dist/coding/registry/npm-lockfile.d.ts +9 -0
  31. package/dist/coding/registry/npm-lockfile.js +73 -0
  32. package/dist/coding/registry/npm-plan.d.ts +29 -0
  33. package/dist/coding/registry/npm-plan.js +289 -0
  34. package/dist/coding/registry/npm.d.ts +7 -0
  35. package/dist/coding/registry/npm.js +252 -0
  36. package/dist/coding/registry/pypi.d.ts +4 -0
  37. package/dist/coding/registry/pypi.js +210 -0
  38. package/dist/coding/registry/report.d.ts +37 -0
  39. package/dist/coding/registry/report.js +31 -0
  40. package/dist/coding/registry/token.d.ts +4 -0
  41. package/dist/coding/registry/token.js +7 -0
  42. package/dist/coding/registry/types.d.ts +286 -0
  43. package/dist/coding/registry/types.js +19 -0
  44. package/dist/coding/registry/worker-config.d.ts +14 -0
  45. package/dist/coding/registry/worker-config.js +31 -0
  46. package/dist/coding/services/builtins.d.ts +22 -0
  47. package/dist/coding/services/builtins.js +85 -0
  48. package/dist/coding/services/catalog.d.ts +443 -0
  49. package/dist/coding/services/catalog.js +159 -0
  50. package/dist/coding/services/declaration.d.ts +11 -0
  51. package/dist/coding/services/declaration.js +114 -0
  52. package/dist/coding/services/note.d.ts +8 -0
  53. package/dist/coding/services/note.js +15 -0
  54. package/dist/coding/services/resolve.d.ts +25 -0
  55. package/dist/coding/services/resolve.js +50 -0
  56. package/dist/coding/services/wording.d.ts +25 -0
  57. package/dist/coding/services/wording.js +70 -0
  58. package/dist/coding-proxy/main.js +24 -4
  59. package/dist/coding-worker/artifact.d.ts +18 -0
  60. package/dist/coding-worker/artifact.js +48 -6
  61. package/dist/coding-worker/debug-trace.d.ts +37 -0
  62. package/dist/coding-worker/debug-trace.js +117 -0
  63. package/dist/coding-worker/driver.d.ts +14 -1
  64. package/dist/coding-worker/driver.js +106 -14
  65. package/dist/coding-worker/errors.d.ts +7 -0
  66. package/dist/coding-worker/errors.js +26 -0
  67. package/dist/coding-worker/main.js +13 -4
  68. package/dist/coding-worker/sdk.d.ts +2 -2
  69. package/dist/coding-worker/sdk.js +7 -2
  70. package/dist/coding-worker/types.d.ts +3 -0
  71. package/dist/config/providers.d.ts +41 -0
  72. package/dist/config/providers.js +66 -0
  73. package/dist/core/budget-groups.d.ts +109 -6
  74. package/dist/core/budget-groups.js +125 -19
  75. package/dist/core/budget-wording.d.ts +22 -0
  76. package/dist/core/budget-wording.js +55 -0
  77. package/dist/core/coding-queue.d.ts +1 -1
  78. package/dist/core/datastores.d.ts +1 -1
  79. package/dist/core/datastores.js +18 -2
  80. package/dist/core/db.d.ts +40 -2
  81. package/dist/core/db.js +75 -2
  82. package/dist/core/dispatch.d.ts +49 -7
  83. package/dist/core/dispatch.js +290 -45
  84. package/dist/core/engine-native.js +27 -10
  85. package/dist/core/grants.d.ts +86 -0
  86. package/dist/core/grants.js +126 -0
  87. package/dist/core/host-events.d.ts +49 -0
  88. package/dist/core/host-events.js +257 -0
  89. package/dist/core/host-identity-links.d.ts +54 -0
  90. package/dist/core/host-identity-links.js +189 -0
  91. package/dist/core/host-status.d.ts +61 -0
  92. package/dist/core/host-status.js +211 -0
  93. package/dist/core/http-runtime.js +3 -4
  94. package/dist/core/in-flight-runs.d.ts +8 -0
  95. package/dist/core/in-flight-runs.js +56 -0
  96. package/dist/core/lease.d.ts +1 -1
  97. package/dist/core/private-directory.d.ts +20 -0
  98. package/dist/core/private-directory.js +36 -0
  99. package/dist/core/provider-wording.d.ts +12 -0
  100. package/dist/core/provider-wording.js +44 -0
  101. package/dist/core/reconciler.d.ts +39 -3
  102. package/dist/core/reconciler.js +86 -2
  103. package/dist/core/repo-access.d.ts +99 -0
  104. package/dist/core/repo-access.js +136 -0
  105. package/dist/core/review-host-checks.d.ts +11 -0
  106. package/dist/core/review-host-checks.js +41 -0
  107. package/dist/core/review-host-tools.d.ts +47 -0
  108. package/dist/core/review-host-tools.js +347 -0
  109. package/dist/core/run-heartbeat.d.ts +27 -0
  110. package/dist/core/run-heartbeat.js +54 -0
  111. package/dist/core/runner.d.ts +31 -9
  112. package/dist/core/runner.js +237 -40
  113. package/dist/core/scheduler.d.ts +1 -1
  114. package/dist/core/secrets.d.ts +12 -3
  115. package/dist/core/secrets.js +25 -6
  116. package/dist/core/subagent-memory-tools.d.ts +2 -2
  117. package/dist/core/subagent-memory-tools.js +16 -3
  118. package/dist/core/tool-admin.d.ts +81 -0
  119. package/dist/core/tool-admin.js +129 -0
  120. package/dist/core/tool-names.d.ts +42 -0
  121. package/dist/core/tool-names.js +64 -0
  122. package/dist/core/untrusted-content.d.ts +32 -0
  123. package/dist/core/untrusted-content.js +72 -0
  124. package/dist/core/webhooks.d.ts +9 -2
  125. package/dist/core/webhooks.js +23 -2
  126. package/dist/generated/prisma/browser.d.ts +328 -0
  127. package/dist/generated/prisma/browser.js +17 -0
  128. package/dist/generated/prisma/client.d.ts +347 -0
  129. package/dist/generated/prisma/client.js +34 -0
  130. package/dist/generated/prisma/commonInputTypes.d.ts +839 -0
  131. package/dist/generated/prisma/commonInputTypes.js +10 -0
  132. package/dist/generated/prisma/enums.d.ts +59 -0
  133. package/dist/generated/prisma/enums.js +59 -0
  134. package/dist/generated/prisma/internal/class.d.ts +605 -0
  135. package/dist/generated/prisma/internal/class.js +49 -0
  136. package/dist/generated/prisma/internal/prismaNamespace.d.ts +4494 -0
  137. package/dist/generated/prisma/internal/prismaNamespace.js +628 -0
  138. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +635 -0
  139. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +599 -0
  140. package/dist/generated/prisma/models/Agent.d.ts +3560 -0
  141. package/dist/generated/prisma/models/Agent.js +1 -0
  142. package/dist/generated/prisma/models/AgentDatastore.d.ts +1210 -0
  143. package/dist/generated/prisma/models/AgentDatastore.js +1 -0
  144. package/dist/generated/prisma/models/AgentMemory.d.ts +986 -0
  145. package/dist/generated/prisma/models/AgentMemory.js +1 -0
  146. package/dist/generated/prisma/models/AgentRepository.d.ts +1425 -0
  147. package/dist/generated/prisma/models/AgentRepository.js +1 -0
  148. package/dist/generated/prisma/models/AgentSecret.d.ts +1212 -0
  149. package/dist/generated/prisma/models/AgentSecret.js +1 -0
  150. package/dist/generated/prisma/models/AgentSubAgent.d.ts +1217 -0
  151. package/dist/generated/prisma/models/AgentSubAgent.js +1 -0
  152. package/dist/generated/prisma/models/AgentTool.d.ts +1403 -0
  153. package/dist/generated/prisma/models/AgentTool.js +1 -0
  154. package/dist/generated/prisma/models/AuthFormChallenge.d.ts +1298 -0
  155. package/dist/generated/prisma/models/AuthFormChallenge.js +1 -0
  156. package/dist/generated/prisma/models/AuthLoginKey.d.ts +1245 -0
  157. package/dist/generated/prisma/models/AuthLoginKey.js +1 -0
  158. package/dist/generated/prisma/models/AuthRateLimit.d.ts +979 -0
  159. package/dist/generated/prisma/models/AuthRateLimit.js +1 -0
  160. package/dist/generated/prisma/models/AuthSession.d.ts +1376 -0
  161. package/dist/generated/prisma/models/AuthSession.js +1 -0
  162. package/dist/generated/prisma/models/AuthUser.d.ts +1700 -0
  163. package/dist/generated/prisma/models/AuthUser.js +1 -0
  164. package/dist/generated/prisma/models/BudgetGroup.d.ts +1548 -0
  165. package/dist/generated/prisma/models/BudgetGroup.js +1 -0
  166. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +1681 -0
  167. package/dist/generated/prisma/models/CodingAgentProfile.js +1 -0
  168. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +1749 -0
  169. package/dist/generated/prisma/models/CodingProxyRequest.js +1 -0
  170. package/dist/generated/prisma/models/CodingProxySession.d.ts +1626 -0
  171. package/dist/generated/prisma/models/CodingProxySession.js +1 -0
  172. package/dist/generated/prisma/models/CodingRun.d.ts +3583 -0
  173. package/dist/generated/prisma/models/CodingRun.js +1 -0
  174. package/dist/generated/prisma/models/CodingService.d.ts +1348 -0
  175. package/dist/generated/prisma/models/CodingService.js +1 -0
  176. package/dist/generated/prisma/models/Datastore.d.ts +1434 -0
  177. package/dist/generated/prisma/models/Datastore.js +1 -0
  178. package/dist/generated/prisma/models/DatastoreEntry.d.ts +1314 -0
  179. package/dist/generated/prisma/models/DatastoreEntry.js +1 -0
  180. package/dist/generated/prisma/models/HostEventDelivery.d.ts +946 -0
  181. package/dist/generated/prisma/models/HostEventDelivery.js +1 -0
  182. package/dist/generated/prisma/models/HostIdentity.d.ts +1232 -0
  183. package/dist/generated/prisma/models/HostIdentity.js +1 -0
  184. package/dist/generated/prisma/models/HostIdentityLinkRequest.d.ts +1473 -0
  185. package/dist/generated/prisma/models/HostIdentityLinkRequest.js +1 -0
  186. package/dist/generated/prisma/models/OAuthAuthorizationCode.d.ts +1526 -0
  187. package/dist/generated/prisma/models/OAuthAuthorizationCode.js +1 -0
  188. package/dist/generated/prisma/models/OAuthAuthorizationRequest.d.ts +1350 -0
  189. package/dist/generated/prisma/models/OAuthAuthorizationRequest.js +1 -0
  190. package/dist/generated/prisma/models/OAuthClient.d.ts +1289 -0
  191. package/dist/generated/prisma/models/OAuthClient.js +1 -0
  192. package/dist/generated/prisma/models/OAuthFamily.d.ts +1540 -0
  193. package/dist/generated/prisma/models/OAuthFamily.js +1 -0
  194. package/dist/generated/prisma/models/OAuthGrant.d.ts +1280 -0
  195. package/dist/generated/prisma/models/OAuthGrant.js +1 -0
  196. package/dist/generated/prisma/models/Principal.d.ts +2245 -0
  197. package/dist/generated/prisma/models/Principal.js +1 -0
  198. package/dist/generated/prisma/models/RegistryAllowance.d.ts +1148 -0
  199. package/dist/generated/prisma/models/RegistryAllowance.js +1 -0
  200. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +1219 -0
  201. package/dist/generated/prisma/models/RegistryApprovedVersion.js +1 -0
  202. package/dist/generated/prisma/models/RegistryFetch.d.ts +1428 -0
  203. package/dist/generated/prisma/models/RegistryFetch.js +1 -0
  204. package/dist/generated/prisma/models/RegistryPlanRefusal.d.ts +1294 -0
  205. package/dist/generated/prisma/models/RegistryPlanRefusal.js +1 -0
  206. package/dist/generated/prisma/models/RegistryVersionFact.d.ts +1085 -0
  207. package/dist/generated/prisma/models/RegistryVersionFact.js +1 -0
  208. package/dist/generated/prisma/models/ResourceGrant.d.ts +1437 -0
  209. package/dist/generated/prisma/models/ResourceGrant.js +1 -0
  210. package/dist/generated/prisma/models/Run.d.ts +2669 -0
  211. package/dist/generated/prisma/models/Run.js +1 -0
  212. package/dist/generated/prisma/models/RunHostCheck.d.ts +1239 -0
  213. package/dist/generated/prisma/models/RunHostCheck.js +1 -0
  214. package/dist/generated/prisma/models/RunHostStatus.d.ts +1315 -0
  215. package/dist/generated/prisma/models/RunHostStatus.js +1 -0
  216. package/dist/generated/prisma/models/SchedulerLease.d.ts +970 -0
  217. package/dist/generated/prisma/models/SchedulerLease.js +1 -0
  218. package/dist/generated/prisma/models/Secret.d.ts +1399 -0
  219. package/dist/generated/prisma/models/Secret.js +1 -0
  220. package/dist/generated/prisma/models/SecretElicitationOutcome.d.ts +973 -0
  221. package/dist/generated/prisma/models/SecretElicitationOutcome.js +1 -0
  222. package/dist/generated/prisma/models/Task.d.ts +1176 -0
  223. package/dist/generated/prisma/models/Task.js +1 -0
  224. package/dist/generated/prisma/models/Tool.d.ts +1490 -0
  225. package/dist/generated/prisma/models/Tool.js +1 -0
  226. package/dist/generated/prisma/models/Webhook.d.ts +1386 -0
  227. package/dist/generated/prisma/models/Webhook.js +1 -0
  228. package/dist/generated/prisma/models.d.ts +45 -0
  229. package/dist/generated/prisma/models.js +1 -0
  230. package/dist/help/build.d.ts +1 -0
  231. package/dist/help/build.js +9 -0
  232. package/dist/help/catalog.d.ts +24 -0
  233. package/dist/help/catalog.js +160 -0
  234. package/dist/help/cli.d.ts +2 -0
  235. package/dist/help/cli.js +65 -0
  236. package/dist/help/runtime.d.ts +3 -0
  237. package/dist/help/runtime.js +44 -0
  238. package/dist/help/search.d.ts +9 -0
  239. package/dist/help/search.js +104 -0
  240. package/dist/help-index.json +660 -0
  241. package/dist/import/cli-args.js +3 -2
  242. package/dist/import/create.d.ts +6 -1
  243. package/dist/import/create.js +68 -14
  244. package/dist/import/index.d.ts +1 -1
  245. package/dist/import/index.js +19 -9
  246. package/dist/import/neutral-schema.d.ts +11 -11
  247. package/dist/mcp/auth/access.d.ts +70 -0
  248. package/dist/mcp/auth/access.js +58 -0
  249. package/dist/mcp/auth/grants-cli.d.ts +149 -0
  250. package/dist/mcp/auth/grants-cli.js +518 -0
  251. package/dist/mcp/auth/host-account-cli.d.ts +2 -0
  252. package/dist/mcp/auth/host-account-cli.js +47 -0
  253. package/dist/mcp/auth/ownership.d.ts +37 -63
  254. package/dist/mcp/auth/ownership.js +19 -14
  255. package/dist/mcp/auth/principal.d.ts +1 -1
  256. package/dist/mcp/auth/repo-authorization.d.ts +22 -0
  257. package/dist/mcp/auth/repo-authorization.js +51 -0
  258. package/dist/mcp/auth/resource-server.d.ts +32 -3
  259. package/dist/mcp/auth/resource-server.js +84 -3
  260. package/dist/mcp/auth/self-hosted/browser.js +22 -8
  261. package/dist/mcp/auth/self-hosted/cli.d.ts +1 -1
  262. package/dist/mcp/auth/self-hosted/cli.js +47 -13
  263. package/dist/mcp/auth/self-hosted/credentials.d.ts +21 -3
  264. package/dist/mcp/auth/self-hosted/credentials.js +62 -4
  265. package/dist/mcp/auth/self-hosted/rate-limit.d.ts +1 -1
  266. package/dist/mcp/auth/self-hosted/session.d.ts +3 -2
  267. package/dist/mcp/context.d.ts +28 -2
  268. package/dist/mcp/errors.d.ts +25 -6
  269. package/dist/mcp/errors.js +98 -0
  270. package/dist/mcp/host-events/github-ingress.d.ts +36 -0
  271. package/dist/mcp/host-events/github-ingress.js +92 -0
  272. package/dist/mcp/host-events/github-user-callback.d.ts +18 -0
  273. package/dist/mcp/host-events/github-user-callback.js +50 -0
  274. package/dist/mcp/index.d.ts +8 -1
  275. package/dist/mcp/index.js +106 -16
  276. package/dist/mcp/server.d.ts +1 -1
  277. package/dist/mcp/server.js +27 -9
  278. package/dist/mcp/shared/page-style.d.ts +16 -0
  279. package/dist/mcp/shared/page-style.js +129 -0
  280. package/dist/mcp/tasks/manager.d.ts +1 -1
  281. package/dist/mcp/tools/agents.js +447 -49
  282. package/dist/mcp/tools/budget-groups.js +3 -3
  283. package/dist/mcp/tools/datastore.js +23 -16
  284. package/dist/mcp/tools/grants.d.ts +2 -0
  285. package/dist/mcp/tools/grants.js +239 -0
  286. package/dist/mcp/tools/help.d.ts +5 -0
  287. package/dist/mcp/tools/help.js +67 -0
  288. package/dist/mcp/tools/host-accounts.d.ts +2 -0
  289. package/dist/mcp/tools/host-accounts.js +114 -0
  290. package/dist/mcp/tools/memory.d.ts +7 -1
  291. package/dist/mcp/tools/memory.js +5 -5
  292. package/dist/mcp/tools/repositories.d.ts +2 -0
  293. package/dist/mcp/tools/repositories.js +181 -0
  294. package/dist/mcp/tools/runs.d.ts +6 -0
  295. package/dist/mcp/tools/runs.js +60 -6
  296. package/dist/mcp/tools/scheduling.js +4 -7
  297. package/dist/mcp/tools/secret-elicitation-form.d.ts +1 -1
  298. package/dist/mcp/tools/secret-elicitation-form.js +10 -28
  299. package/dist/mcp/tools/secret-elicitation.d.ts +1 -1
  300. package/dist/mcp/tools/secrets.js +18 -6
  301. package/dist/mcp/tools/services.d.ts +2 -0
  302. package/dist/mcp/tools/services.js +222 -0
  303. package/dist/mcp/tools/subagents.js +53 -17
  304. package/dist/mcp/tools/tools.d.ts +41 -0
  305. package/dist/mcp/tools/tools.js +202 -41
  306. package/dist/mcp/tools/trigger.js +36 -6
  307. package/dist/mcp/tools/webhooks.js +15 -4
  308. package/dist/mcp/transport/streamable-http.d.ts +11 -1
  309. package/dist/mcp/transport/streamable-http.js +32 -2
  310. package/dist/mcp/unattended-schedules.d.ts +1 -1
  311. package/dist/mcp/webhooks/ingress.d.ts +1 -1
  312. package/dist/providers/auth/delegating.d.ts +19 -0
  313. package/dist/providers/auth/delegating.js +71 -0
  314. package/dist/providers/auth/index.d.ts +3 -1
  315. package/dist/providers/auth/index.js +11 -0
  316. package/dist/providers/auth/self-hosted.d.ts +4 -3
  317. package/dist/providers/auth/self-hosted.js +16 -4
  318. package/dist/providers/auth/types.d.ts +6 -0
  319. package/dist/providers/coding-proxy/memory-ledger.d.ts +3 -0
  320. package/dist/providers/coding-proxy/memory-ledger.js +21 -2
  321. package/dist/providers/coding-proxy/metering.d.ts +4 -0
  322. package/dist/providers/coding-proxy/metering.js +28 -2
  323. package/dist/providers/coding-proxy/prisma-ledger.d.ts +18 -1
  324. package/dist/providers/coding-proxy/prisma-ledger.js +50 -5
  325. package/dist/providers/coding-proxy/proxy.d.ts +13 -0
  326. package/dist/providers/coding-proxy/proxy.js +479 -18
  327. package/dist/providers/coding-proxy/registry/audit.d.ts +131 -0
  328. package/dist/providers/coding-proxy/registry/audit.js +380 -0
  329. package/dist/providers/coding-proxy/registry/bounded-fetch.d.ts +16 -0
  330. package/dist/providers/coding-proxy/registry/bounded-fetch.js +77 -0
  331. package/dist/providers/coding-proxy/registry/plan.d.ts +58 -0
  332. package/dist/providers/coding-proxy/registry/plan.js +304 -0
  333. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +34 -0
  334. package/dist/providers/coding-proxy/registry/prisma-store.js +151 -0
  335. package/dist/providers/coding-proxy/registry/service.d.ts +213 -0
  336. package/dist/providers/coding-proxy/registry/service.js +1137 -0
  337. package/dist/providers/coding-proxy/registry/store.d.ts +127 -0
  338. package/dist/providers/coding-proxy/registry/store.js +70 -0
  339. package/dist/providers/coding-proxy/runtime.d.ts +18 -1
  340. package/dist/providers/coding-proxy/runtime.js +63 -0
  341. package/dist/providers/coding-proxy/secure-fetch.js +0 -1
  342. package/dist/providers/coding-proxy/server.d.ts +11 -0
  343. package/dist/providers/coding-proxy/server.js +163 -0
  344. package/dist/providers/coding-proxy/types.d.ts +15 -0
  345. package/dist/providers/datastore/postgres.d.ts +1 -1
  346. package/dist/providers/engine/types.d.ts +10 -0
  347. package/dist/providers/executor/build.d.ts +3 -3
  348. package/dist/providers/executor/composition.d.ts +4 -1
  349. package/dist/providers/executor/composition.js +19 -0
  350. package/dist/providers/executor/container.d.ts +106 -4
  351. package/dist/providers/executor/container.js +305 -22
  352. package/dist/providers/executor/dbos.d.ts +3 -4
  353. package/dist/providers/executor/in-process.d.ts +2 -3
  354. package/dist/providers/executor/routing.d.ts +7 -0
  355. package/dist/providers/executor/routing.js +13 -0
  356. package/dist/providers/executor/types.d.ts +22 -0
  357. package/dist/providers/jobs/claude-tool-setup.d.ts +23 -0
  358. package/dist/providers/jobs/claude-tool-setup.js +50 -0
  359. package/dist/providers/jobs/collect-prune.d.ts +7 -0
  360. package/dist/providers/jobs/collect-prune.js +27 -0
  361. package/dist/providers/jobs/docker-isolation.d.ts +48 -3
  362. package/dist/providers/jobs/docker-isolation.js +213 -22
  363. package/dist/providers/jobs/docker-services.d.ts +35 -0
  364. package/dist/providers/jobs/docker-services.js +191 -0
  365. package/dist/providers/jobs/docker.d.ts +60 -2
  366. package/dist/providers/jobs/docker.js +313 -50
  367. package/dist/providers/jobs/fake-kubernetes-api.d.ts +1 -0
  368. package/dist/providers/jobs/fake-kubernetes-api.js +12 -3
  369. package/dist/providers/jobs/kubernetes-isolation.d.ts +17 -2
  370. package/dist/providers/jobs/kubernetes-isolation.js +238 -57
  371. package/dist/providers/jobs/kubernetes-platform.d.ts +10 -4
  372. package/dist/providers/jobs/kubernetes-platform.js +11 -5
  373. package/dist/providers/jobs/kubernetes-preflight.js +3 -0
  374. package/dist/providers/jobs/kubernetes.d.ts +21 -2
  375. package/dist/providers/jobs/kubernetes.js +117 -31
  376. package/dist/providers/jobs/types.d.ts +20 -0
  377. package/dist/providers/llm/anthropic.js +6 -2
  378. package/dist/providers/llm/bedrock.js +2 -1
  379. package/dist/providers/llm/claude-messages.d.ts +5 -1
  380. package/dist/providers/llm/claude-messages.js +1 -0
  381. package/dist/providers/llm/claude-provider.d.ts +3 -1
  382. package/dist/providers/llm/claude-provider.js +5 -1
  383. package/dist/providers/llm/index.d.ts +1 -1
  384. package/dist/providers/llm/index.js +1 -1
  385. package/dist/providers/llm/pricing-anthropic.d.ts +10 -0
  386. package/dist/providers/llm/pricing-anthropic.js +32 -14
  387. package/dist/providers/llm/pricing-bedrock-claude.d.ts +8 -0
  388. package/dist/providers/llm/pricing-bedrock-claude.js +9 -0
  389. package/dist/providers/llm/routing.d.ts +10 -1
  390. package/dist/providers/llm/routing.js +18 -0
  391. package/dist/providers/llm/types.d.ts +12 -0
  392. package/dist/providers/llm/types.js +8 -1
  393. package/dist/providers/memory/postgres.d.ts +1 -1
  394. package/dist/providers/review-host/diff-lines.d.ts +16 -0
  395. package/dist/providers/review-host/diff-lines.js +59 -0
  396. package/dist/providers/review-host/github-events.d.ts +6 -0
  397. package/dist/providers/review-host/github-events.js +180 -0
  398. package/dist/providers/review-host/github-user-auth.d.ts +38 -0
  399. package/dist/providers/review-host/github-user-auth.js +128 -0
  400. package/dist/providers/review-host/github.d.ts +57 -0
  401. package/dist/providers/review-host/github.js +567 -0
  402. package/dist/providers/review-host/index.d.ts +12 -0
  403. package/dist/providers/review-host/index.js +30 -0
  404. package/dist/providers/review-host/review-format.d.ts +19 -0
  405. package/dist/providers/review-host/review-format.js +59 -0
  406. package/dist/providers/review-host/types.d.ts +284 -0
  407. package/dist/providers/review-host/types.js +24 -0
  408. package/dist/providers/vcs/git.d.ts +16 -6
  409. package/dist/providers/vcs/git.js +79 -14
  410. package/dist/providers/vcs/github.d.ts +74 -3
  411. package/dist/providers/vcs/github.js +195 -15
  412. package/dist/providers/vcs/types.d.ts +42 -4
  413. package/dist/quickstart/index.js +34 -32
  414. package/dist/quickstart/migrate.d.ts +23 -0
  415. package/dist/quickstart/migrate.js +125 -0
  416. package/dist/sandbox/fetch-policy.d.ts +20 -2
  417. package/dist/sandbox/fetch-policy.js +64 -3
  418. package/dist/sandbox/host-functions.d.ts +9 -1
  419. package/dist/sandbox/host-functions.js +12 -5
  420. package/dist/serve.js +1 -1
  421. package/dist/wardby-bin.js +6 -0
  422. package/docs/README.md +30 -0
  423. package/docs/architecture-runtime.md +90 -0
  424. package/docs/assets/brand/wardby-icon-512.png +0 -0
  425. package/docs/assets/brand/wardby-icon.svg +16 -0
  426. package/docs/assets/brand/wardby-mascot-profile-512.png +0 -0
  427. package/docs/assets/brand/wardby-mascot.png +0 -0
  428. package/docs/assets/brand/wardby-mascot.svg +5 -0
  429. package/docs/assets/wardby-workflow.svg +106 -0
  430. package/docs/code-review-agents.md +481 -0
  431. package/docs/coding-agent-setup.md +172 -0
  432. package/docs/coding-packages.md +455 -0
  433. package/docs/coding-services.md +300 -0
  434. package/docs/coding-worker-byo-images.md +98 -0
  435. package/docs/coding-worker-isolation.md +1061 -0
  436. package/docs/getting-started-gke.md +615 -0
  437. package/docs/getting-started-identity-provider.md +308 -0
  438. package/docs/getting-started.md +133 -0
  439. package/docs/observability.md +53 -0
  440. package/docs/release-verification.md +66 -0
  441. package/docs/security-deployment.md +657 -0
  442. package/help/code-review-agents.md +31 -0
  443. package/help/coding-packages.md +31 -0
  444. package/help/coding-services.md +71 -0
  445. package/help/creating-agents.md +68 -0
  446. package/help/deploy-gke.md +39 -0
  447. package/help/deployment-targets.md +39 -0
  448. package/help/errors/budget-group-exhausted.md +25 -0
  449. package/help/errors/docker-isolation-unsupported.md +26 -0
  450. package/help/errors/protected-path.md +45 -0
  451. package/help/errors/repo-access.md +27 -0
  452. package/help/errors/service-declaration-invalid.md +27 -0
  453. package/help/errors/service-declaration-unavailable.md +25 -0
  454. package/help/errors/service-launcher-unsupported.md +30 -0
  455. package/help/errors/service-not-allowed.md +27 -0
  456. package/help/errors/service-unknown.md +23 -0
  457. package/help/errors/service-unready.md +49 -0
  458. package/help/getting-started.md +31 -0
  459. package/help/github.md +30 -0
  460. package/help/identity-and-access.md +39 -0
  461. package/help/mcp.md +30 -0
  462. package/help/native-capabilities.md +30 -0
  463. package/help/observability.md +41 -0
  464. package/help/operating-agents.md +30 -0
  465. package/help/security.md +27 -0
  466. package/help/troubleshooting/budgets.md +26 -0
  467. package/help/troubleshooting/coding-workers.md +47 -0
  468. package/help/troubleshooting/repository-access.md +27 -0
  469. package/package.json +30 -11
  470. package/prisma/migrate.config.mjs +20 -0
  471. package/prisma/migrations/20260925010000_coding_collect_exclude/migration.sql +8 -0
  472. package/prisma/migrations/20260925015000_allowed_egress_default/migration.sql +8 -0
  473. package/prisma/migrations/20260925020000_coding_package_registry/migration.sql +55 -0
  474. package/prisma/migrations/20260925030000_tool_name_per_owner/migration.sql +11 -0
  475. package/prisma/migrations/20260926010000_run_trigger_host_event/migration.sql +7 -0
  476. package/prisma/migrations/20260926020000_code_review_hosts/migration.sql +53 -0
  477. package/prisma/migrations/20260926030000_auth_user_roles/migration.sql +9 -0
  478. package/prisma/migrations/20260926040000_agent_effort/migration.sql +6 -0
  479. package/prisma/migrations/20260926050000_registry_lockfile_plan/migration.sql +32 -0
  480. package/prisma/migrations/20260926050000_repo_access_authorization/migration.sql +82 -0
  481. package/prisma/migrations/20260926060000_registry_plan_refusal/migration.sql +19 -0
  482. package/prisma/migrations/20260926100000_registry_plan_refusal_published_at/migration.sql +5 -0
  483. package/prisma/migrations/20260926190000_run_host_status/migration.sql +18 -0
  484. package/prisma/migrations/20260926210000_run_host_status_at_dispatch/migration.sql +5 -0
  485. package/prisma/migrations/20260927010000_resource_grants/migration.sql +72 -0
  486. package/prisma/migrations/20260927020000_proxy_session_budget_exhausted/migration.sql +3 -0
  487. package/prisma/migrations/20260927030000_coding_debug_trace/migration.sql +4 -0
  488. package/prisma/migrations/20260927040000_proxy_session_upstream_failure/migration.sql +3 -0
  489. package/prisma/migrations/20260927050000_coding_run_services/migration.sql +74 -0
  490. package/prisma/migrations/20260928000000_coding_run_tool_image/migration.sql +5 -0
  491. package/prisma/schema.prisma +417 -23
package/dist/mcp/index.js CHANGED
@@ -1,28 +1,53 @@
1
- import { loadProviderConfig, loadMcpConfig, loadAuthConfig } from "../config/providers.js";
1
+ /**
2
+ * MCP composition root: assembles the real providers, builds one
3
+ * WardbyMcpServer, registers every tool module, and starts whichever
4
+ * transport MCP_TRANSPORT selects. No business logic lives here — this
5
+ * file only wires together pieces every earlier task already built and
6
+ * tested on their own.
7
+ *
8
+ * stdio vs. HTTP diverge on two things a live smoke test surfaced (see the
9
+ * ledger): stdio needs no `MCP_CANONICAL_URI` (there's no HTTP endpoint or
10
+ * OAuth challenge to identify) and constructs no real `AuthProvider` at all
11
+ * (per the design: "stdio local mode: no token; the operator is trusted") —
12
+ * building one unconditionally would make `wardby mcp` over stdio fail on
13
+ * missing `AUTH_JWKS_URI`/`AUTH_SIGNING_KEY` a deployment running stdio-only
14
+ * never needed to set.
15
+ */
16
+ import { loadProviderConfig, loadMcpConfig, loadShutdownDrainSeconds, loadAuthConfig, loadGitHubEventConfig, loadGitHubVcsConfig, } from "../config/providers.js";
2
17
  import { prisma } from "../core/db.js";
18
+ import { waitForInFlightRuns } from "../core/in-flight-runs.js";
3
19
  import { NativeEngine } from "../core/engine-native.js";
4
20
  import { resolveLlmRegistrations, RoutingLlmProvider } from "../providers/llm/index.js";
5
21
  import { PostgresDatastore } from "../providers/datastore/index.js";
6
22
  import { PostgresAgentMemory } from "../providers/memory/index.js";
7
23
  import { buildConfiguredExecutor, buildExecutor } from "../providers/executor/index.js";
8
24
  import { buildSecretCipher } from "../providers/secrets/index.js";
25
+ import { buildHostUserAuthorizers, buildReviewHosts } from "../providers/review-host/index.js";
26
+ import { createRepoAccessGate } from "../core/repo-access.js";
27
+ import { userCallbackPath } from "../core/host-identity-links.js";
9
28
  import { buildAuthProvider } from "../providers/auth/index.js";
29
+ import { GitHubAppClient } from "../providers/vcs/github.js";
10
30
  import { buildMcpServer } from "./server.js";
11
31
  import { countUnattendedSchedules, unattendedSchedulesWarning } from "./unattended-schedules.js";
12
32
  import { runStdioServer } from "./transport/stdio.js";
13
33
  import { startHttpServer } from "./transport/streamable-http.js";
14
34
  import { resolvePrincipal } from "./auth/principal.js";
15
- import { SCOPES_SUPPORTED } from "./auth/resource-server.js";
35
+ import { ROLE_NAMES, SCOPES_SUPPORTED } from "./auth/resource-server.js";
16
36
  import { canonicalUrl } from "./transport/http-limits.js";
17
37
  import { registerAgentTools } from "./tools/agents.js";
38
+ import { registerServiceTools } from "./tools/services.js";
18
39
  import { registerBudgetGroupTools } from "./tools/budget-groups.js";
19
40
  import { registerModelTools } from "./tools/models.js";
41
+ import { registerHelpTools } from "./tools/help.js";
20
42
  import { registerTriggerTool } from "./tools/trigger.js";
21
43
  import { registerToolAuthoringTools } from "./tools/tools.js";
22
44
  import { registerSchedulingTools } from "./tools/scheduling.js";
23
45
  import { registerRunTools } from "./tools/runs.js";
24
46
  import { registerDatastoreTools } from "./tools/datastore.js";
25
47
  import { registerSubAgentTools } from "./tools/subagents.js";
48
+ import { registerGrantTools } from "./tools/grants.js";
49
+ import { registerRepositoryTools } from "./tools/repositories.js";
50
+ import { registerHostAccountTools } from "./tools/host-accounts.js";
26
51
  import { registerMemoryTools } from "./tools/memory.js";
27
52
  import { registerSecretsTools } from "./tools/secrets.js";
28
53
  import { registerWebhookTools } from "./tools/webhooks.js";
@@ -45,17 +70,44 @@ async function warnIfNothingWillFireSchedules() {
45
70
  }
46
71
  /** Placeholder identifier for stdio, which has no HTTP endpoint to name. Never surfaced: stdio's fixed context always holds every scope, so no scope challenge is ever built against it. */
47
72
  const STDIO_PLACEHOLDER_URI = "urn:wardby:local-stdio";
73
+ /**
74
+ * stdio's one fixed identity: the local operator (LOCAL_PRINCIPAL), trusted
75
+ * with every supported scope and every role — whoever can start the
76
+ * process already holds the database and its keys.
77
+ */
78
+ export function localOperatorContext(principal, providers, db) {
79
+ return {
80
+ principal,
81
+ scopes: new Set(SCOPES_SUPPORTED),
82
+ roles: [...ROLE_NAMES],
83
+ // Full access to every resource (resource-sharing grants spec §3.9),
84
+ // but never past the binding rules.
85
+ operator: true,
86
+ canonicalUri: STDIO_PLACEHOLDER_URI,
87
+ providers,
88
+ db,
89
+ clientSupportsTasks: false,
90
+ // Placeholder — server.ts's resolveCtx overwrites this with the
91
+ // current call's real mcpReq on every dispatch.
92
+ mcpReq: { requestState: () => undefined },
93
+ };
94
+ }
48
95
  /** Registers the full Phase 4 tool surface — every module, in one place. */
49
96
  export function registerAllTools(mcp, opts) {
50
97
  registerAgentTools(mcp);
98
+ registerServiceTools(mcp);
51
99
  registerBudgetGroupTools(mcp);
52
100
  registerModelTools(mcp);
101
+ registerHelpTools(mcp);
53
102
  registerTriggerTool(mcp);
54
103
  registerToolAuthoringTools(mcp);
55
104
  registerSchedulingTools(mcp);
56
105
  registerRunTools(mcp);
57
106
  registerDatastoreTools(mcp);
58
107
  registerSubAgentTools(mcp);
108
+ registerGrantTools(mcp);
109
+ registerRepositoryTools(mcp);
110
+ registerHostAccountTools(mcp);
59
111
  registerMemoryTools(mcp);
60
112
  registerSecretsTools(mcp, {
61
113
  buildElicitationUrl: opts.secretElicitationUrl,
@@ -75,6 +127,11 @@ export function buildMcpProviders() {
75
127
  const secrets = buildSecretCipher(providerConfig);
76
128
  const datastore = new PostgresDatastore(prisma, secrets);
77
129
  const memory = new PostgresAgentMemory(prisma);
130
+ const reviewHosts = buildReviewHosts();
131
+ const hostUserAuthorizers = buildHostUserAuthorizers();
132
+ // One gate (and one cache) for the whole process: set-time checks in the
133
+ // MCP tools, repo_* calls in native runs, coding runs, and host events.
134
+ const repoAccess = createRepoAccessGate({ db: prisma, hosts: reviewHosts });
78
135
  // `nativeProviders` is passed by reference into buildExecutor, and native
79
136
  // runs it drives read `this.providers.executor` at call time (not at
80
137
  // construction time) — so patching `.executor` on afterward, once the
@@ -83,11 +140,13 @@ export function buildMcpProviders() {
83
140
  // through the same composed executor everything else uses. There's no
84
141
  // way to hand the native executor a reference to its own wrapping
85
142
  // RoutingExecutor before that wrapper is constructed.
86
- const nativeProviders = { llm, engine, datastore, secrets, memory };
143
+ const nativeProviders = { llm, engine, datastore, secrets, memory, reviewHosts, repoAccess };
87
144
  const nativeExecutor = buildExecutor(providerConfig, nativeProviders, prisma);
88
- const executor = buildConfiguredExecutor({ native: nativeExecutor, db: prisma, providerConfig });
145
+ const executor = buildConfiguredExecutor({ native: nativeExecutor, db: prisma, providerConfig, repoAccess });
89
146
  nativeProviders.executor = executor;
90
- return { providers: { llm, engine, datastore, secrets, executor, memory } };
147
+ return {
148
+ providers: { llm, engine, datastore, secrets, executor, memory, reviewHosts, hostUserAuthorizers, repoAccess },
149
+ };
91
150
  }
92
151
  /** Awaits `promise` (if any), logging and swallowing a rejection instead of propagating it. */
93
152
  async function closeQuietly(promise, what) {
@@ -101,6 +160,8 @@ async function closeQuietly(promise, what) {
101
160
  /** The real CLI entry point: `wardby mcp`. Reads config from the environment, starts stdio or HTTP per MCP_TRANSPORT. */
102
161
  export async function startMcp(options = {}) {
103
162
  const mcpConfig = loadMcpConfig();
163
+ // Parsed up front so a malformed value fails at startup, not at shutdown.
164
+ const drainSeconds = loadShutdownDrainSeconds();
104
165
  const providers = options.providers ?? buildMcpProviders().providers;
105
166
  await providers.executor.launch?.();
106
167
  if (!options.schedulerAttached)
@@ -120,17 +181,7 @@ export async function startMcp(options = {}) {
120
181
  // local identity for the whole connection, per the design's own
121
182
  // "stdio local mode: no token; the operator is trusted."
122
183
  const principal = await resolvePrincipal(mcpConfig.localPrincipal, prisma);
123
- mcp.setFixedContext({
124
- principal,
125
- scopes: new Set(SCOPES_SUPPORTED),
126
- canonicalUri: STDIO_PLACEHOLDER_URI,
127
- providers,
128
- db: prisma,
129
- clientSupportsTasks: false,
130
- // Placeholder — server.ts's resolveCtx overwrites this with the
131
- // current call's real mcpReq on every dispatch.
132
- mcpReq: { requestState: () => undefined },
133
- });
184
+ mcp.setFixedContext(localOperatorContext(principal, providers, prisma));
134
185
  const stdio = runStdioServer(mcp);
135
186
  return {
136
187
  close: async () => {
@@ -159,6 +210,40 @@ export async function startMcp(options = {}) {
159
210
  secretElicitationUrl: (token) => Promise.resolve(`${httpOrigin}${SECRET_ELICITATION_PATH}?t=${encodeURIComponent(token)}`),
160
211
  secretElicitationProtocol: mcpConfig.secretElicitationProtocol,
161
212
  });
213
+ const eventConfig = loadGitHubEventConfig();
214
+ const githubConfig = loadGitHubVcsConfig();
215
+ const reviewHosts = providers.reviewHosts;
216
+ const hostEvents = eventConfig.webhookSecret && reviewHosts?.github && githubConfig.appId && githubConfig.privateKey
217
+ ? {
218
+ github: {
219
+ db: prisma,
220
+ executor: providers.executor,
221
+ hosts: reviewHosts,
222
+ repoAccess: providers.repoAccess ?? createRepoAccessGate({ db: prisma, hosts: reviewHosts }),
223
+ webhookSecret: eventConfig.webhookSecret,
224
+ appIdentity: (() => {
225
+ const client = new GitHubAppClient({
226
+ appId: githubConfig.appId,
227
+ privateKey: githubConfig.privateKey,
228
+ apiVersion: githubConfig.apiVersion,
229
+ });
230
+ return () => client.appIdentity();
231
+ })(),
232
+ },
233
+ }
234
+ : undefined;
235
+ mcpLog.info({ enabled: Boolean(hostEvents) }, "GitHub host events ingress");
236
+ const githubAuthorizer = providers.hostUserAuthorizers?.github;
237
+ const hostUserAuth = githubAuthorizer
238
+ ? {
239
+ github: {
240
+ db: prisma,
241
+ authorizer: githubAuthorizer,
242
+ redirectUri: `${httpOrigin}${userCallbackPath("github")}`,
243
+ },
244
+ }
245
+ : undefined;
246
+ mcpLog.info({ enabled: Boolean(hostUserAuth) }, "GitHub account linking");
162
247
  const http = await startHttpServer({
163
248
  mcp,
164
249
  config: {
@@ -170,6 +255,8 @@ export async function startMcp(options = {}) {
170
255
  },
171
256
  auth: { authProvider, db: prisma, providers },
172
257
  selfHosted,
258
+ hostEvents,
259
+ hostUserAuth,
173
260
  });
174
261
  const cleanupTimer = selfHosted
175
262
  ? setInterval(() => {
@@ -181,6 +268,9 @@ export async function startMcp(options = {}) {
181
268
  if (cleanupTimer)
182
269
  clearInterval(cleanupTimer);
183
270
  await closeQuietly(http.close(), "HTTP transport close");
271
+ // Let the runs this instance is executing finish before the executor
272
+ // closes under them; a run abandoned here is lost, never resumed.
273
+ await waitForInFlightRuns(drainSeconds * 1000);
184
274
  await closeQuietly(providers.executor.close?.(), "executor close");
185
275
  },
186
276
  };
@@ -23,7 +23,7 @@
23
23
  * whole connection.
24
24
  */
25
25
  import { type McpServerFactory, type InputRequiredResult } from "@modelcontextprotocol/server";
26
- import type { PrismaClient } from "@prisma/client";
26
+ import type { PrismaClient } from "#prisma";
27
27
  import type { McpRequestContext, McpProviders } from "./context.js";
28
28
  export interface ToolSpec<Args = Record<string, unknown>> {
29
29
  name: string;
@@ -25,9 +25,10 @@
25
25
  import { McpServer, fromJsonSchema, createRequestStateCodec, CLIENT_CAPABILITIES_META_KEY, } from "@modelcontextprotocol/server";
26
26
  import { randomBytes } from "node:crypto";
27
27
  import { requireScope } from "./auth/resource-server.js";
28
- import { McpError } from "./errors.js";
28
+ import { McpError, mapPrismaError } from "./errors.js";
29
29
  import { TASKS_EXTENSION_ID, clientSupportsTasks } from "./capabilities.js";
30
- import { visibleToPrincipal } from "./auth/ownership.js";
30
+ import { readableAgentsWhere } from "./auth/access.js";
31
+ import { grantedIds } from "../core/grants.js";
31
32
  import { logger } from "../core/logger.js";
32
33
  const REQUEST_STATE_KEY_BYTES = 32;
33
34
  /**
@@ -97,6 +98,7 @@ export function buildMcpServer(opts) {
97
98
  return {
98
99
  principal: extra.principal,
99
100
  scopes: new Set(authInfo.scopes),
101
+ roles: extra.roles ?? [],
100
102
  canonicalUri: opts.config.canonicalUri,
101
103
  providers: opts.providers,
102
104
  db: opts.db,
@@ -130,7 +132,14 @@ export function buildMcpServer(opts) {
130
132
  }, async (args, sdkCtx) => {
131
133
  const ctx = resolveCtx(sdkCtx);
132
134
  requireScope(ctx, opts.config.canonicalUri, ...requiredScopes);
133
- return spec.handler(args, ctx);
135
+ try {
136
+ return await spec.handler(args, ctx);
137
+ }
138
+ catch (err) {
139
+ // A raw Prisma error would reach the client verbatim (the SDK
140
+ // renders any thrown error's message) -- see mapPrismaError.
141
+ throw mapPrismaError(err);
142
+ }
134
143
  });
135
144
  }
136
145
  // Non-spec (extension) methods need a { params, result } schema bundle
@@ -143,7 +152,12 @@ export function buildMcpServer(opts) {
143
152
  mcpServer.server.setRequestHandler(method, { params: PERMISSIVE_SCHEMA }, async (params, sdkCtx) => {
144
153
  const ctx = resolveCtx(sdkCtx);
145
154
  requireScope(ctx, opts.config.canonicalUri, ...scope);
146
- return (await handler(params, ctx));
155
+ try {
156
+ return (await handler(params, ctx));
157
+ }
158
+ catch (err) {
159
+ throw mapPrismaError(err);
160
+ }
147
161
  });
148
162
  }
149
163
  // One MCP prompt per Agent this connection can see, so a client that
@@ -154,12 +168,16 @@ export function buildMcpServer(opts) {
154
168
  // resolves it per-dispatch from the SDK's own per-call ServerContext,
155
169
  // not at factory time) — stdio's fixedContext IS set by now
156
170
  // (mcp/index.ts calls setFixedContext before serveStdio ever invokes
157
- // this factory), so stdio sees every agent it owns plus public ones;
158
- // HTTP conservatively falls back to public-only until this factory can
159
- // see request-scoped identity. A DB hiccup here must not break tool
160
- // registration — this is a discoverability nicety, not core function.
171
+ // this factory), so stdio sees every agent it can read;
172
+ // HTTP conservatively falls back to agents shared with everyone (a
173
+ // grant of at least read) until this factory can see request-scoped
174
+ // identity; stdio sees what its principal can read (the operator: all).
175
+ // A DB hiccup here must not break tool registration — this is a
176
+ // discoverability nicety, not core function.
161
177
  try {
162
- const where = fixedContext ? visibleToPrincipal(fixedContext.principal.id) : { ownerId: null };
178
+ const where = fixedContext
179
+ ? await readableAgentsWhere(fixedContext, opts.db)
180
+ : { id: { in: await grantedIds(opts.db, "agent", null, "read") } };
163
181
  const agents = await opts.db.agent.findMany({ where });
164
182
  for (const agent of agents) {
165
183
  mcpServer.registerPrompt(agent.name, {
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Shared CSS for wardby's server-rendered pages: the self-hosted OAuth
3
+ * browser flow (auth/self-hosted/browser.ts) and the secret-entry form
4
+ * (tools/secret-elicitation-form.ts). Both are publicly reachable,
5
+ * dependency-free surfaces — no CDN fonts, no external stylesheets, no
6
+ * external images — so this module is the one inline stylesheet each page
7
+ * embeds in its own `<style>` tag rather than a `<link>`.
8
+ *
9
+ * Tokens follow the naming used by wardby's marketing/dashboard page so this
10
+ * corner of the product reads as the same system: --cream --gold --ink
11
+ * --line --mint --mint-deep --muted --paper --red --shadow --sky --white.
12
+ * Dark mode redefines the same token names under `prefers-color-scheme` —
13
+ * the source page itself has no dark mode, but these pages already did
14
+ * (the secret form's previous inline styles supported it), so it's kept.
15
+ */
16
+ export declare const PAGE_STYLE = "\n:root {\n color-scheme: light dark;\n --cream: #fffaf0;\n --paper: #f7f4ec;\n --white: #ffffff;\n --ink: #12243c;\n --muted: #657287;\n --line: #dce3e8;\n --mint: #43e6b1;\n --mint-deep: #15b982;\n --gold: #c9aa70;\n --red: #e33d37;\n --sky: #75d4ff;\n --shadow: 0 24px 70px rgba(6, 23, 47, 0.12);\n}\n@media (prefers-color-scheme: dark) {\n :root {\n --paper: #0b1524;\n --white: #142238;\n --ink: #f2f6fa;\n --muted: #9fb0c2;\n --line: #263a52;\n --shadow: 0 24px 70px rgba(0, 0, 0, 0.5);\n }\n}\n* { box-sizing: border-box; }\nbody {\n margin: 0;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n color: var(--ink);\n background:\n radial-gradient(circle at 12% 0%, rgba(67, 230, 177, 0.14), transparent 26rem),\n radial-gradient(circle at 100% 20%, rgba(117, 212, 255, 0.12), transparent 30rem),\n var(--paper);\n font-family: \"Avenir Next\", Avenir, \"Trebuchet MS\", sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n.card {\n width: 100%;\n max-width: 420px;\n padding: 38px 34px;\n border: 1px solid var(--line);\n border-radius: 20px;\n background: var(--white);\n box-shadow: var(--shadow);\n}\n.kicker {\n margin: 0 0 12px;\n color: var(--mint-deep);\n font-size: 11px;\n font-weight: 800;\n letter-spacing: 0.15em;\n text-transform: uppercase;\n}\nh1 {\n margin: 0 0 10px;\n font-family: Futura, \"Avenir Next\", Avenir, sans-serif;\n font-size: 23px;\n line-height: 1.2;\n letter-spacing: -0.02em;\n}\np { margin: 0 0 22px; color: var(--muted); font-size: 14px; line-height: 1.55; }\np:last-child { margin-bottom: 0; }\np strong { color: var(--ink); }\nlabel { display: block; margin-bottom: 18px; font-size: 13px; font-weight: 700; color: var(--muted); }\ninput[type=\"password\"] {\n display: block;\n width: 100%;\n margin-top: 8px;\n padding: 14px 16px;\n font-size: 16px;\n letter-spacing: 0.02em;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n color: var(--ink);\n background: var(--paper);\n border: 1px solid var(--line);\n border-radius: 10px;\n}\ninput[type=\"password\"]:focus {\n outline: none;\n border-color: var(--mint-deep);\n box-shadow: 0 0 0 3px rgba(21, 185, 130, 0.18);\n}\nbutton {\n width: 100%;\n margin-top: 4px;\n padding: 15px;\n font: inherit;\n font-size: 15px;\n font-weight: 700;\n color: var(--cream);\n background: var(--ink);\n border: none;\n border-radius: 10px;\n cursor: pointer;\n transition: background 140ms ease;\n}\nbutton:hover { background: var(--mint-deep); }\nbutton:focus-visible { outline: 3px solid var(--mint-deep); outline-offset: 2px; }\n.actions { display: flex; gap: 10px; margin-top: 4px; }\n.actions button { margin-top: 0; }\n.actions button[value=\"deny\"] {\n color: var(--ink);\n background: var(--paper);\n border: 1px solid var(--line);\n}\n.actions button[value=\"deny\"]:hover { background: var(--line); }\n#auth-error { margin: 16px 0 0; color: var(--red); font-size: 13px; min-height: 1em; }\n";
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Shared CSS for wardby's server-rendered pages: the self-hosted OAuth
3
+ * browser flow (auth/self-hosted/browser.ts) and the secret-entry form
4
+ * (tools/secret-elicitation-form.ts). Both are publicly reachable,
5
+ * dependency-free surfaces — no CDN fonts, no external stylesheets, no
6
+ * external images — so this module is the one inline stylesheet each page
7
+ * embeds in its own `<style>` tag rather than a `<link>`.
8
+ *
9
+ * Tokens follow the naming used by wardby's marketing/dashboard page so this
10
+ * corner of the product reads as the same system: --cream --gold --ink
11
+ * --line --mint --mint-deep --muted --paper --red --shadow --sky --white.
12
+ * Dark mode redefines the same token names under `prefers-color-scheme` —
13
+ * the source page itself has no dark mode, but these pages already did
14
+ * (the secret form's previous inline styles supported it), so it's kept.
15
+ */
16
+ export const PAGE_STYLE = `
17
+ :root {
18
+ color-scheme: light dark;
19
+ --cream: #fffaf0;
20
+ --paper: #f7f4ec;
21
+ --white: #ffffff;
22
+ --ink: #12243c;
23
+ --muted: #657287;
24
+ --line: #dce3e8;
25
+ --mint: #43e6b1;
26
+ --mint-deep: #15b982;
27
+ --gold: #c9aa70;
28
+ --red: #e33d37;
29
+ --sky: #75d4ff;
30
+ --shadow: 0 24px 70px rgba(6, 23, 47, 0.12);
31
+ }
32
+ @media (prefers-color-scheme: dark) {
33
+ :root {
34
+ --paper: #0b1524;
35
+ --white: #142238;
36
+ --ink: #f2f6fa;
37
+ --muted: #9fb0c2;
38
+ --line: #263a52;
39
+ --shadow: 0 24px 70px rgba(0, 0, 0, 0.5);
40
+ }
41
+ }
42
+ * { box-sizing: border-box; }
43
+ body {
44
+ margin: 0;
45
+ min-height: 100vh;
46
+ display: flex;
47
+ align-items: center;
48
+ justify-content: center;
49
+ padding: 24px;
50
+ color: var(--ink);
51
+ background:
52
+ radial-gradient(circle at 12% 0%, rgba(67, 230, 177, 0.14), transparent 26rem),
53
+ radial-gradient(circle at 100% 20%, rgba(117, 212, 255, 0.12), transparent 30rem),
54
+ var(--paper);
55
+ font-family: "Avenir Next", Avenir, "Trebuchet MS", sans-serif;
56
+ -webkit-font-smoothing: antialiased;
57
+ }
58
+ .card {
59
+ width: 100%;
60
+ max-width: 420px;
61
+ padding: 38px 34px;
62
+ border: 1px solid var(--line);
63
+ border-radius: 20px;
64
+ background: var(--white);
65
+ box-shadow: var(--shadow);
66
+ }
67
+ .kicker {
68
+ margin: 0 0 12px;
69
+ color: var(--mint-deep);
70
+ font-size: 11px;
71
+ font-weight: 800;
72
+ letter-spacing: 0.15em;
73
+ text-transform: uppercase;
74
+ }
75
+ h1 {
76
+ margin: 0 0 10px;
77
+ font-family: Futura, "Avenir Next", Avenir, sans-serif;
78
+ font-size: 23px;
79
+ line-height: 1.2;
80
+ letter-spacing: -0.02em;
81
+ }
82
+ p { margin: 0 0 22px; color: var(--muted); font-size: 14px; line-height: 1.55; }
83
+ p:last-child { margin-bottom: 0; }
84
+ p strong { color: var(--ink); }
85
+ label { display: block; margin-bottom: 18px; font-size: 13px; font-weight: 700; color: var(--muted); }
86
+ input[type="password"] {
87
+ display: block;
88
+ width: 100%;
89
+ margin-top: 8px;
90
+ padding: 14px 16px;
91
+ font-size: 16px;
92
+ letter-spacing: 0.02em;
93
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
94
+ color: var(--ink);
95
+ background: var(--paper);
96
+ border: 1px solid var(--line);
97
+ border-radius: 10px;
98
+ }
99
+ input[type="password"]:focus {
100
+ outline: none;
101
+ border-color: var(--mint-deep);
102
+ box-shadow: 0 0 0 3px rgba(21, 185, 130, 0.18);
103
+ }
104
+ button {
105
+ width: 100%;
106
+ margin-top: 4px;
107
+ padding: 15px;
108
+ font: inherit;
109
+ font-size: 15px;
110
+ font-weight: 700;
111
+ color: var(--cream);
112
+ background: var(--ink);
113
+ border: none;
114
+ border-radius: 10px;
115
+ cursor: pointer;
116
+ transition: background 140ms ease;
117
+ }
118
+ button:hover { background: var(--mint-deep); }
119
+ button:focus-visible { outline: 3px solid var(--mint-deep); outline-offset: 2px; }
120
+ .actions { display: flex; gap: 10px; margin-top: 4px; }
121
+ .actions button { margin-top: 0; }
122
+ .actions button[value="deny"] {
123
+ color: var(--ink);
124
+ background: var(--paper);
125
+ border: 1px solid var(--line);
126
+ }
127
+ .actions button[value="deny"]:hover { background: var(--line); }
128
+ #auth-error { margin: 16px 0 0; color: var(--red); font-size: 13px; min-height: 1em; }
129
+ `;
@@ -10,7 +10,7 @@
10
10
  * cancellation is cooperative and eventually consistent, per the
11
11
  * extension's own spec language).
12
12
  */
13
- import type { PrismaClient, Task } from "@prisma/client";
13
+ import type { PrismaClient, Task } from "#prisma";
14
14
  export type TaskStatus = "working" | "input_required" | "completed" | "failed" | "cancelled";
15
15
  export interface JsonRpcErrorObject {
16
16
  code: number;