@wardby/cli 0.6.0 → 0.7.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 (576) hide show
  1. package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
  2. package/dist/claude-coding-worker/driver.d.ts +21 -3
  3. package/dist/claude-coding-worker/driver.js +125 -17
  4. package/dist/claude-coding-worker/main.js +34 -6
  5. package/dist/claude-coding-worker/sdk.js +12 -1
  6. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  7. package/dist/claude-coding-worker/tool-socket.js +111 -0
  8. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  9. package/dist/claude-coding-worker/transcript.js +77 -0
  10. package/dist/cli-help.d.ts +1 -1
  11. package/dist/cli-help.js +1 -0
  12. package/dist/cli.js +24 -10
  13. package/dist/coding/continuation-wording.d.ts +35 -0
  14. package/dist/coding/continuation-wording.js +73 -0
  15. package/dist/coding/linked-issue-note.d.ts +23 -0
  16. package/dist/coding/linked-issue-note.js +47 -0
  17. package/dist/coding/merge-wording.d.ts +28 -0
  18. package/dist/coding/merge-wording.js +78 -0
  19. package/dist/coding/pr-description-note.d.ts +9 -0
  20. package/dist/coding/pr-description-note.js +32 -0
  21. package/dist/coding/profile.d.ts +46 -126
  22. package/dist/coding/profile.js +45 -4
  23. package/dist/coding/protected-path-wording.d.ts +8 -0
  24. package/dist/coding/protected-path-wording.js +1 -1
  25. package/dist/coding/protocol.d.ts +264 -346
  26. package/dist/coding/protocol.js +235 -12
  27. package/dist/coding/redact.d.ts +3 -0
  28. package/dist/coding/redact.js +12 -0
  29. package/dist/coding/registry/allowlist.d.ts +12 -0
  30. package/dist/coding/registry/allowlist.js +14 -1
  31. package/dist/coding/registry/audit-mode.d.ts +153 -0
  32. package/dist/coding/registry/audit-mode.js +304 -0
  33. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  34. package/dist/coding/registry/lockfile-shared.js +128 -0
  35. package/dist/coding/registry/lockfiles.js +1 -1
  36. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  37. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  38. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  39. package/dist/coding/registry/npm-lockfile.js +4 -6
  40. package/dist/coding/registry/npm.js +78 -8
  41. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  42. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  43. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  44. package/dist/coding/registry/pypi-plan.js +406 -0
  45. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  46. package/dist/coding/registry/pypi-requirements.js +155 -0
  47. package/dist/coding/registry/pypi.d.ts +3 -27
  48. package/dist/coding/registry/pypi.js +40 -154
  49. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  50. package/dist/coding/registry/refusal-hints.js +61 -0
  51. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  52. package/dist/coding/registry/refusal-wording.js +56 -0
  53. package/dist/coding/registry/report.d.ts +70 -8
  54. package/dist/coding/registry/report.js +112 -5
  55. package/dist/coding/registry/types.d.ts +58 -8
  56. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  57. package/dist/coding/registry/yarn-lockfile.js +367 -0
  58. package/dist/coding/services/catalog.d.ts +37 -351
  59. package/dist/coding/transcript/claude-code.d.ts +13 -0
  60. package/dist/coding/transcript/claude-code.js +273 -0
  61. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  62. package/dist/coding/transcript/download-protocol.js +18 -0
  63. package/dist/coding/transcript/format.d.ts +20 -0
  64. package/dist/coding/transcript/format.js +32 -0
  65. package/dist/coding/transcript/recorder.d.ts +51 -0
  66. package/dist/coding/transcript/recorder.js +225 -0
  67. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  68. package/dist/coding/transcript/resume/checkout.js +203 -0
  69. package/dist/coding/transcript/resume/command.d.ts +17 -0
  70. package/dist/coding/transcript/resume/command.js +176 -0
  71. package/dist/coding/transcript/resume/download.d.ts +20 -0
  72. package/dist/coding/transcript/resume/download.js +153 -0
  73. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  74. package/dist/coding/transcript/resume/launch.js +128 -0
  75. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  76. package/dist/coding/transcript/resume/session-file.js +79 -0
  77. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  78. package/dist/coding/transcript/resume/stand-in.js +49 -0
  79. package/dist/coding-worker/artifact.d.ts +8 -3
  80. package/dist/coding-worker/artifact.js +3 -1
  81. package/dist/coding-worker/debug-trace.d.ts +6 -5
  82. package/dist/coding-worker/debug-trace.js +13 -18
  83. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  84. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  85. package/dist/coding-worker/driver.d.ts +4 -3
  86. package/dist/coding-worker/driver.js +116 -38
  87. package/dist/coding-worker/errors.d.ts +1 -0
  88. package/dist/coding-worker/errors.js +32 -0
  89. package/dist/coding-worker/task-note.d.ts +11 -0
  90. package/dist/coding-worker/task-note.js +13 -0
  91. package/dist/coding-worker/types.d.ts +11 -0
  92. package/dist/config/dependency-cache.d.ts +23 -0
  93. package/dist/config/dependency-cache.js +32 -0
  94. package/dist/config/providers.d.ts +12 -3
  95. package/dist/config/providers.js +55 -5
  96. package/dist/config/test-simulators.d.ts +82 -0
  97. package/dist/config/test-simulators.js +305 -0
  98. package/dist/core/async-context.d.ts +2 -0
  99. package/dist/core/async-context.js +12 -0
  100. package/dist/core/budget-events.d.ts +108 -0
  101. package/dist/core/budget-events.js +346 -0
  102. package/dist/core/budget-groups.d.ts +50 -1
  103. package/dist/core/budget-groups.js +236 -27
  104. package/dist/core/budget-stopped-head.d.ts +46 -0
  105. package/dist/core/budget-stopped-head.js +81 -0
  106. package/dist/core/budget-topup.d.ts +51 -0
  107. package/dist/core/budget-topup.js +156 -0
  108. package/dist/core/budget-wording.d.ts +16 -2
  109. package/dist/core/budget-wording.js +40 -2
  110. package/dist/core/coding-queue.d.ts +2 -1
  111. package/dist/core/coding-queue.js +7 -0
  112. package/dist/core/cron.d.ts +19 -1
  113. package/dist/core/cron.js +17 -0
  114. package/dist/core/datastores.js +1 -1
  115. package/dist/core/deferred-coding.d.ts +14 -0
  116. package/dist/core/deferred-coding.js +62 -0
  117. package/dist/core/delegation-child.d.ts +25 -0
  118. package/dist/core/delegation-child.js +37 -0
  119. package/dist/core/dispatch.d.ts +42 -0
  120. package/dist/core/dispatch.js +131 -56
  121. package/dist/core/engine-native.js +1 -1
  122. package/dist/core/error-code.d.ts +38 -0
  123. package/dist/core/error-code.js +168 -0
  124. package/dist/core/grants.d.ts +19 -6
  125. package/dist/core/grants.js +55 -6
  126. package/dist/core/host-events.d.ts +18 -2
  127. package/dist/core/host-events.js +284 -24
  128. package/dist/core/host-status.d.ts +85 -3
  129. package/dist/core/host-status.js +298 -20
  130. package/dist/core/issue-bridge.d.ts +50 -6
  131. package/dist/core/issue-bridge.js +124 -33
  132. package/dist/core/issue-events.d.ts +1 -1
  133. package/dist/core/issue-events.js +4 -10
  134. package/dist/core/issue-status.d.ts +1 -1
  135. package/dist/core/issue-status.js +54 -26
  136. package/dist/core/logger.d.ts +5 -0
  137. package/dist/core/logger.js +14 -1
  138. package/dist/core/lost-run-children.d.ts +6 -0
  139. package/dist/core/lost-run-children.js +32 -0
  140. package/dist/core/mark-ready.d.ts +34 -0
  141. package/dist/core/mark-ready.js +152 -0
  142. package/dist/core/markdown-code.d.ts +8 -0
  143. package/dist/core/markdown-code.js +107 -0
  144. package/dist/core/memory-tools.js +7 -0
  145. package/dist/core/merge-order-check.d.ts +2 -1
  146. package/dist/core/merge-order-check.js +8 -1
  147. package/dist/core/notification-templates.d.ts +1 -7
  148. package/dist/core/notification-templates.js +36 -2
  149. package/dist/core/pull-request-state-sync.js +2 -2
  150. package/dist/core/reconciler.d.ts +4 -3
  151. package/dist/core/reconciler.js +8 -1
  152. package/dist/core/related-pull-requests.d.ts +11 -3
  153. package/dist/core/related-pull-requests.js +27 -14
  154. package/dist/core/reply-parts.d.ts +21 -0
  155. package/dist/core/reply-parts.js +73 -0
  156. package/dist/core/review-fix.d.ts +1 -1
  157. package/dist/core/review-fix.js +2 -1
  158. package/dist/core/review-host-checks.d.ts +1 -1
  159. package/dist/core/review-host-tools.d.ts +3 -0
  160. package/dist/core/review-host-tools.js +99 -13
  161. package/dist/core/review-reads.d.ts +55 -0
  162. package/dist/core/review-reads.js +233 -0
  163. package/dist/core/run-status.d.ts +12 -0
  164. package/dist/core/run-status.js +12 -0
  165. package/dist/core/runner.d.ts +80 -34
  166. package/dist/core/runner.js +439 -144
  167. package/dist/core/schedule-start.d.ts +12 -0
  168. package/dist/core/schedule-start.js +14 -0
  169. package/dist/core/secret-broker-config.d.ts +10 -74
  170. package/dist/core/secret-guard.d.ts +46 -0
  171. package/dist/core/secret-guard.js +104 -0
  172. package/dist/core/secret-guarded-stores.d.ts +12 -0
  173. package/dist/core/secret-guarded-stores.js +41 -0
  174. package/dist/core/secret-spans.d.ts +50 -0
  175. package/dist/core/secret-spans.js +94 -0
  176. package/dist/core/stop-run.d.ts +46 -0
  177. package/dist/core/stop-run.js +61 -0
  178. package/dist/core/workflow-events.d.ts +14 -2
  179. package/dist/core/workflow-events.js +4 -0
  180. package/dist/core/workflow-run-events.d.ts +5 -3
  181. package/dist/core/workflow-run-events.js +43 -8
  182. package/dist/core/zod-json-schema.d.ts +4 -0
  183. package/dist/core/zod-json-schema.js +39 -0
  184. package/dist/core/zod3-window.d.ts +35 -0
  185. package/dist/core/zod3-window.js +124 -0
  186. package/dist/generated/prisma/browser.d.ts +34 -3
  187. package/dist/generated/prisma/client.d.ts +34 -3
  188. package/dist/generated/prisma/commonInputTypes.d.ts +220 -60
  189. package/dist/generated/prisma/enums.d.ts +10 -0
  190. package/dist/generated/prisma/enums.js +8 -0
  191. package/dist/generated/prisma/internal/class.d.ts +44 -0
  192. package/dist/generated/prisma/internal/class.js +4 -4
  193. package/dist/generated/prisma/internal/prismaNamespace.d.ts +428 -9
  194. package/dist/generated/prisma/internal/prismaNamespace.js +92 -1
  195. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
  196. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +92 -1
  197. package/dist/generated/prisma/models/Agent.d.ts +106 -8
  198. package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
  199. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +229 -1
  200. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  201. package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
  202. package/dist/generated/prisma/models/CodingRun.d.ts +1637 -1
  203. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  204. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  205. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  206. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  207. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +39 -1
  208. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  209. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  210. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  211. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  212. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  213. package/dist/generated/prisma/models/Run.d.ts +738 -2
  214. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  215. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  216. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  217. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  218. package/dist/generated/prisma/models.d.ts +4 -0
  219. package/dist/help-index.json +1320 -69
  220. package/dist/import/create.js +32 -3
  221. package/dist/import/neutral-schema.d.ts +50 -281
  222. package/dist/import/neutral-schema.js +5 -4
  223. package/dist/knowledge/check.d.ts +1 -1
  224. package/dist/knowledge/cli.d.ts +11 -1
  225. package/dist/knowledge/cli.js +37 -4
  226. package/dist/knowledge/concept.d.ts +3 -19
  227. package/dist/knowledge/location.d.ts +31 -0
  228. package/dist/knowledge/location.js +78 -0
  229. package/dist/mcp/auth/access.d.ts +10 -2
  230. package/dist/mcp/auth/access.js +15 -1
  231. package/dist/mcp/auth/ownership.d.ts +7 -7
  232. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  233. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  234. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  235. package/dist/mcp/host-events/github-ingress.js +2 -1
  236. package/dist/mcp/index.d.ts +6 -0
  237. package/dist/mcp/index.js +58 -10
  238. package/dist/mcp/server.d.ts +13 -0
  239. package/dist/mcp/server.js +33 -14
  240. package/dist/mcp/tools/agents.d.ts +4 -0
  241. package/dist/mcp/tools/agents.js +198 -16
  242. package/dist/mcp/tools/datastore.js +17 -8
  243. package/dist/mcp/tools/grants.js +9 -3
  244. package/dist/mcp/tools/memory.js +11 -1
  245. package/dist/mcp/tools/notification-channels.js +2 -2
  246. package/dist/mcp/tools/packages.d.ts +2 -0
  247. package/dist/mcp/tools/packages.js +195 -0
  248. package/dist/mcp/tools/repositories.js +18 -5
  249. package/dist/mcp/tools/run-access.d.ts +16 -0
  250. package/dist/mcp/tools/run-access.js +25 -0
  251. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  252. package/dist/mcp/tools/run-transcript-download.js +129 -0
  253. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  254. package/dist/mcp/tools/run-transcript.js +70 -0
  255. package/dist/mcp/tools/runs.js +34 -12
  256. package/dist/mcp/tools/scheduling.js +3 -1
  257. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  258. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  259. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  260. package/dist/mcp/tools/secrets.js +2 -2
  261. package/dist/mcp/tools/stop-run.d.ts +2 -0
  262. package/dist/mcp/tools/stop-run.js +82 -0
  263. package/dist/mcp/tools/subagents.js +2 -2
  264. package/dist/mcp/tools/tools.d.ts +1 -1
  265. package/dist/mcp/tools/tools.js +25 -9
  266. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  267. package/dist/mcp/transport/stdio-link-host.js +67 -0
  268. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  269. package/dist/mcp/transport/streamable-http.js +41 -1
  270. package/dist/native-worker/docker-launcher.d.ts +38 -2
  271. package/dist/native-worker/docker-launcher.js +65 -5
  272. package/dist/native-worker/gateway-server.d.ts +41 -3
  273. package/dist/native-worker/gateway-server.js +124 -27
  274. package/dist/native-worker/gateway.d.ts +27 -1
  275. package/dist/native-worker/gateway.js +70 -4
  276. package/dist/native-worker/http-server.d.ts +3 -1
  277. package/dist/native-worker/http-server.js +11 -7
  278. package/dist/native-worker/http-transport.js +1 -1
  279. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  280. package/dist/native-worker/kubernetes-launcher.js +43 -3
  281. package/dist/native-worker/launch.d.ts +18 -1
  282. package/dist/native-worker/launch.js +6 -1
  283. package/dist/native-worker/ledger.d.ts +18 -2
  284. package/dist/native-worker/ledger.js +57 -4
  285. package/dist/native-worker/loopback.js +3 -8
  286. package/dist/native-worker/main.d.ts +2 -1
  287. package/dist/native-worker/main.js +14 -3
  288. package/dist/native-worker/protocol.d.ts +129 -577
  289. package/dist/native-worker/protocol.js +47 -1
  290. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  291. package/dist/native-worker/sandbox-executor.js +78 -4
  292. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  293. package/dist/native-worker/stderr-redaction.js +237 -0
  294. package/dist/native-worker/stdio.d.ts +1 -1
  295. package/dist/native-worker/stdio.js +6 -5
  296. package/dist/native-worker/warm-pool.d.ts +2 -2
  297. package/dist/native-worker/warm-pool.js +4 -4
  298. package/dist/native-worker/worker.js +28 -2
  299. package/dist/observability/metrics.js +6 -1
  300. package/dist/providers/auth/self-hosted.d.ts +1 -1
  301. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  302. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  303. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  304. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  305. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  306. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  307. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  308. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  309. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  310. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  311. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  312. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  313. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  314. package/dist/providers/coding-proxy/hold.js +86 -0
  315. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  316. package/dist/providers/coding-proxy/interrupted.js +104 -0
  317. package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
  318. package/dist/providers/coding-proxy/memory-ledger.js +84 -8
  319. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  320. package/dist/providers/coding-proxy/metering.js +27 -4
  321. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
  322. package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
  323. package/dist/providers/coding-proxy/proxy.d.ts +14 -1
  324. package/dist/providers/coding-proxy/proxy.js +166 -14
  325. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  326. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  327. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  328. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  329. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  330. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  331. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  332. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  333. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  334. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  335. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  336. package/dist/providers/coding-proxy/registry/service.js +579 -112
  337. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  338. package/dist/providers/coding-proxy/registry/store.js +54 -1
  339. package/dist/providers/coding-proxy/runtime.d.ts +4 -0
  340. package/dist/providers/coding-proxy/runtime.js +78 -16
  341. package/dist/providers/coding-proxy/server.d.ts +6 -1
  342. package/dist/providers/coding-proxy/server.js +45 -1
  343. package/dist/providers/coding-proxy/types.d.ts +65 -1
  344. package/dist/providers/datastore/types.d.ts +5 -0
  345. package/dist/providers/engine/types.d.ts +17 -2
  346. package/dist/providers/engine/types.js +17 -0
  347. package/dist/providers/executor/composition.d.ts +10 -3
  348. package/dist/providers/executor/composition.js +47 -7
  349. package/dist/providers/executor/container.d.ts +361 -8
  350. package/dist/providers/executor/container.js +1136 -91
  351. package/dist/providers/executor/dbos-status.d.ts +31 -0
  352. package/dist/providers/executor/dbos-status.js +64 -0
  353. package/dist/providers/executor/dbos.d.ts +50 -1
  354. package/dist/providers/executor/dbos.js +207 -20
  355. package/dist/providers/executor/deferred.d.ts +12 -24
  356. package/dist/providers/executor/deferred.js +10 -29
  357. package/dist/providers/executor/in-process.d.ts +9 -1
  358. package/dist/providers/executor/in-process.js +14 -4
  359. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  360. package/dist/providers/executor/linked-issue-reader.js +30 -0
  361. package/dist/providers/executor/routing.d.ts +2 -0
  362. package/dist/providers/executor/routing.js +4 -0
  363. package/dist/providers/executor/types.d.ts +13 -0
  364. package/dist/providers/index.d.ts +2 -1
  365. package/dist/providers/issue-tracker/types.d.ts +17 -0
  366. package/dist/providers/issue-tracker/types.js +39 -1
  367. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  368. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  369. package/dist/providers/jobs/docker-isolation.d.ts +8 -0
  370. package/dist/providers/jobs/docker-isolation.js +17 -0
  371. package/dist/providers/jobs/docker.d.ts +1 -0
  372. package/dist/providers/jobs/docker.js +27 -2
  373. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  374. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  375. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  376. package/dist/providers/jobs/kubernetes-api.js +10 -0
  377. package/dist/providers/jobs/kubernetes-client.js +10 -1
  378. package/dist/providers/jobs/kubernetes-isolation.d.ts +2 -0
  379. package/dist/providers/jobs/kubernetes-isolation.js +17 -1
  380. package/dist/providers/jobs/kubernetes.d.ts +6 -1
  381. package/dist/providers/jobs/kubernetes.js +105 -16
  382. package/dist/providers/jobs/types.d.ts +33 -0
  383. package/dist/providers/jobs/types.js +13 -1
  384. package/dist/providers/llm/anthropic.js +5 -1
  385. package/dist/providers/llm/bedrock.d.ts +0 -12
  386. package/dist/providers/llm/bedrock.js +4 -0
  387. package/dist/providers/llm/claude-messages.d.ts +3 -1
  388. package/dist/providers/llm/claude-messages.js +4 -1
  389. package/dist/providers/llm/claude-provider.d.ts +2 -2
  390. package/dist/providers/llm/claude-provider.js +2 -2
  391. package/dist/providers/llm/openai.d.ts +2 -2
  392. package/dist/providers/llm/openai.js +6 -2
  393. package/dist/providers/llm/routing.d.ts +2 -2
  394. package/dist/providers/llm/routing.js +2 -2
  395. package/dist/providers/llm/types.d.ts +12 -2
  396. package/dist/providers/review-host/github-events.d.ts +9 -1
  397. package/dist/providers/review-host/github-events.js +34 -12
  398. package/dist/providers/review-host/github.d.ts +29 -2
  399. package/dist/providers/review-host/github.js +224 -29
  400. package/dist/providers/review-host/local.d.ts +8 -4
  401. package/dist/providers/review-host/local.js +49 -31
  402. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  403. package/dist/providers/review-host/patch-pages.js +176 -0
  404. package/dist/providers/review-host/review-format.d.ts +19 -1
  405. package/dist/providers/review-host/review-format.js +38 -7
  406. package/dist/providers/review-host/types.d.ts +134 -2
  407. package/dist/providers/review-host/types.js +8 -0
  408. package/dist/providers/storage/gcs.d.ts +63 -0
  409. package/dist/providers/storage/gcs.js +69 -0
  410. package/dist/providers/storage/index.d.ts +15 -0
  411. package/dist/providers/storage/index.js +14 -0
  412. package/dist/providers/storage/local.d.ts +24 -0
  413. package/dist/providers/storage/local.js +92 -0
  414. package/dist/providers/storage/meter.d.ts +14 -0
  415. package/dist/providers/storage/meter.js +34 -0
  416. package/dist/providers/storage/s3.d.ts +41 -0
  417. package/dist/providers/storage/s3.js +107 -0
  418. package/dist/providers/storage/types.d.ts +37 -3
  419. package/dist/providers/storage/types.js +21 -4
  420. package/dist/providers/vcs/git.d.ts +33 -2
  421. package/dist/providers/vcs/git.js +324 -22
  422. package/dist/providers/vcs/github-remote.d.ts +26 -3
  423. package/dist/providers/vcs/github-remote.js +124 -14
  424. package/dist/providers/vcs/github.d.ts +214 -6
  425. package/dist/providers/vcs/github.js +447 -45
  426. package/dist/providers/vcs/index.js +8 -1
  427. package/dist/providers/vcs/pr-description.d.ts +127 -0
  428. package/dist/providers/vcs/pr-description.js +270 -0
  429. package/dist/providers/vcs/remote.d.ts +33 -1
  430. package/dist/providers/vcs/routing.d.ts +4 -2
  431. package/dist/providers/vcs/routing.js +6 -0
  432. package/dist/providers/vcs/types.d.ts +80 -3
  433. package/dist/quickstart/coding-seed.d.ts +14 -3
  434. package/dist/quickstart/coding-seed.js +213 -4
  435. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  436. package/dist/quickstart/reviewer-prompt.js +6 -6
  437. package/dist/quickstart-images.json +1 -1
  438. package/dist/sandbox/generated/zod.bundle.js +62 -1
  439. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  440. package/dist/sandbox/host-functions.d.ts +1 -0
  441. package/dist/sandbox/host-functions.js +6 -11
  442. package/dist/sandbox/secret-broker.js +3 -4
  443. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  444. package/dist/sandbox/zod-params.d.ts +37 -5
  445. package/dist/sandbox/zod-params.js +181 -26
  446. package/dist/serve.js +8 -1
  447. package/dist/viewer/api-schema.d.ts +349 -2627
  448. package/dist/viewer/api-schema.js +7 -0
  449. package/dist/viewer/build-schemas.js +6 -2
  450. package/dist/viewer/openapi.js +2 -4
  451. package/dist/wardby-bin.js +10 -0
  452. package/docs/agent-recipes.md +58 -20
  453. package/docs/code-review-agents.md +551 -41
  454. package/docs/coding-agent-setup.md +489 -7
  455. package/docs/coding-packages.md +1033 -90
  456. package/docs/coding-services.md +27 -12
  457. package/docs/coding-worker-byo-images.md +20 -0
  458. package/docs/coding-worker-isolation.md +105 -30
  459. package/docs/getting-started-gke.md +124 -137
  460. package/docs/getting-started-identity-provider.md +10 -1
  461. package/docs/getting-started.md +9 -0
  462. package/docs/jira-agents.md +17 -8
  463. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  464. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  465. package/docs/knowledge/delegation-admission-slots.md +52 -0
  466. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  467. package/docs/knowledge/import-rename-target.md +52 -0
  468. package/docs/knowledge/index.md +57 -0
  469. package/docs/knowledge/log.md +9 -0
  470. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  471. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  472. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  473. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  474. package/docs/knowledge/overview-cli.md +74 -0
  475. package/docs/knowledge/overview-coding-proxy.md +72 -0
  476. package/docs/knowledge/overview-coding.md +72 -0
  477. package/docs/knowledge/overview-config.md +60 -0
  478. package/docs/knowledge/overview-core.md +72 -0
  479. package/docs/knowledge/overview-deploy.md +83 -0
  480. package/docs/knowledge/overview-mcp.md +61 -0
  481. package/docs/knowledge/overview-prisma.md +72 -0
  482. package/docs/knowledge/overview-providers.md +89 -0
  483. package/docs/knowledge/overview-sandbox.md +83 -0
  484. package/docs/knowledge/overview-surfaces.md +83 -0
  485. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  486. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  487. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  488. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  489. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  490. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  491. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  492. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  493. package/docs/knowledge/warm-input-publication.md +30 -0
  494. package/docs/knowledge/workspace-staging-failure.md +54 -0
  495. package/docs/knowledge.md +54 -14
  496. package/docs/native-sandbox.md +119 -23
  497. package/docs/observability.md +4 -0
  498. package/docs/security-deployment.md +33 -2
  499. package/docs/slack-notifications.md +35 -19
  500. package/docs/tool-secrets.md +42 -10
  501. package/docs/viewer-api.openapi.yml +1 -1
  502. package/help/admin-viewer.md +24 -2
  503. package/help/architecture-agent.md +11 -6
  504. package/help/build-worker-image.md +3 -1
  505. package/help/builder-agent.md +19 -6
  506. package/help/code-review-agents.md +177 -6
  507. package/help/coding-packages.md +156 -6
  508. package/help/cost-attribution.md +9 -5
  509. package/help/creating-agents.md +14 -1
  510. package/help/dependency-cache.md +143 -0
  511. package/help/deploy-gke.md +15 -8
  512. package/help/errors/budget-exhausted.md +187 -0
  513. package/help/errors/budget-group-exhausted.md +5 -1
  514. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  515. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  516. package/help/errors/continuation-closed.md +9 -12
  517. package/help/errors/delegation-conflict.md +24 -0
  518. package/help/errors/file-list-truncated.md +45 -0
  519. package/help/errors/full-read-required.md +49 -0
  520. package/help/errors/github-account-not-allowed.md +4 -0
  521. package/help/errors/graph-incomplete.md +43 -0
  522. package/help/errors/graph-limit.md +43 -0
  523. package/help/errors/merge-conflict.md +49 -0
  524. package/help/errors/native-sandbox-gateway-error.md +20 -0
  525. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  526. package/help/errors/native-sandbox-worker-exited.md +3 -2
  527. package/help/errors/package-not-allowed-pending.md +52 -0
  528. package/help/errors/package-not-allowed.md +51 -0
  529. package/help/errors/package-refusals.md +43 -0
  530. package/help/errors/patch-cursor-malformed.md +31 -0
  531. package/help/errors/run-lost.md +39 -0
  532. package/help/errors/run-transcript-download.md +44 -0
  533. package/help/errors/secret-in-value.md +69 -0
  534. package/help/errors/target-merge.md +40 -0
  535. package/help/fix-merge-conflicts.md +73 -0
  536. package/help/github-app-setup.md +132 -0
  537. package/help/github.md +22 -0
  538. package/help/identity-and-access.md +2 -0
  539. package/help/jira.md +23 -6
  540. package/help/knowledge.md +16 -7
  541. package/help/local-repositories.md +1 -1
  542. package/help/low-power-mode.md +7 -1
  543. package/help/merge-order-check.md +5 -0
  544. package/help/native-capabilities.md +29 -1
  545. package/help/native-sandbox.md +15 -1
  546. package/help/operating-agents.md +5 -0
  547. package/help/package-audit-mode.md +91 -0
  548. package/help/related-pull-requests.md +10 -7
  549. package/help/resume-runs-locally.md +131 -0
  550. package/help/review-fix-rounds.md +33 -1
  551. package/help/sharing-agents.md +59 -0
  552. package/help/slack-notifications.md +19 -5
  553. package/help/status-comments.md +31 -0
  554. package/help/stop-run.md +58 -0
  555. package/help/troubleshooting/budgets.md +28 -0
  556. package/help/troubleshooting/coding-workers.md +78 -7
  557. package/package.json +17 -10
  558. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  559. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  560. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  561. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  562. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  563. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  564. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  565. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  566. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  567. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  568. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  569. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  570. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  571. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  572. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  573. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  574. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  575. package/prisma/schema.prisma +311 -97
  576. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Where a repository's knowledge bundle lives (docs/knowledge.md, "Where the
3
+ * bundle lives"): the folder `.wardby/knowledge.yaml` names, else
4
+ * DEFAULT_KNOWLEDGE_BUNDLE_PATH. A missing, unreadable, or invalid file never
5
+ * fails anything: it degrades to the default, with a warning when the file
6
+ * exists but cannot be used.
7
+ */
8
+ export declare const KNOWLEDGE_CONFIG_PATH = ".wardby/knowledge.yaml";
9
+ export declare const KNOWLEDGE_CONFIG_MAX_BYTES: number;
10
+ export interface KnowledgeLocation {
11
+ bundlePath: string;
12
+ /** Set when `.wardby/knowledge.yaml` exists but was ignored, saying why. */
13
+ warning?: string;
14
+ }
15
+ export type KnowledgeConfigParse = {
16
+ ok: true;
17
+ bundlePath: string;
18
+ } | {
19
+ ok: false;
20
+ error: string;
21
+ };
22
+ /** `path: <repo-relative folder>`, the file's only key. */
23
+ export declare function parseKnowledgeConfig(text: string): KnowledgeConfigParse;
24
+ /** A repo-relative POSIX folder, without `./` or trailing slashes, outside `.wardby/` and `.git/`. */
25
+ export declare function normalizeBundlePath(raw: string): KnowledgeConfigParse;
26
+ /**
27
+ * The bundle location, given a reader for `.wardby/knowledge.yaml` that
28
+ * returns null when the file does not exist. A reader that throws, like an
29
+ * invalid file, yields the default with a warning.
30
+ */
31
+ export declare function resolveKnowledgeLocation(readConfig: () => Promise<string | null | undefined>): Promise<KnowledgeLocation>;
@@ -0,0 +1,78 @@
1
+ import { parse as parseYaml } from "yaml";
2
+ import { DEFAULT_KNOWLEDGE_BUNDLE_PATH } from "./concept.js";
3
+ /**
4
+ * Where a repository's knowledge bundle lives (docs/knowledge.md, "Where the
5
+ * bundle lives"): the folder `.wardby/knowledge.yaml` names, else
6
+ * DEFAULT_KNOWLEDGE_BUNDLE_PATH. A missing, unreadable, or invalid file never
7
+ * fails anything: it degrades to the default, with a warning when the file
8
+ * exists but cannot be used.
9
+ */
10
+ export const KNOWLEDGE_CONFIG_PATH = ".wardby/knowledge.yaml";
11
+ export const KNOWLEDGE_CONFIG_MAX_BYTES = 4 * 1024;
12
+ const MAX_BUNDLE_PATH_LENGTH = 200;
13
+ /** `path: <repo-relative folder>`, the file's only key. */
14
+ export function parseKnowledgeConfig(text) {
15
+ let doc;
16
+ try {
17
+ doc = parseYaml(text);
18
+ }
19
+ catch {
20
+ return { ok: false, error: "it is not valid YAML" };
21
+ }
22
+ if (typeof doc !== "object" || doc === null || Array.isArray(doc))
23
+ return { ok: false, error: "it must be a mapping with a `path` key" };
24
+ const keys = Object.keys(doc);
25
+ const unknown = keys.filter((k) => k !== "path");
26
+ if (unknown.length > 0)
27
+ return { ok: false, error: `unknown key ${unknown.map((k) => `\`${k}\``).join(", ")}` };
28
+ const { path } = doc;
29
+ if (typeof path !== "string")
30
+ return { ok: false, error: "`path` must be a string" };
31
+ return normalizeBundlePath(path);
32
+ }
33
+ /** A repo-relative POSIX folder, without `./` or trailing slashes, outside `.wardby/` and `.git/`. */
34
+ export function normalizeBundlePath(raw) {
35
+ let path = raw.trim();
36
+ while (path.startsWith("./"))
37
+ path = path.slice(2);
38
+ path = path.replace(/\/+$/, "");
39
+ if (path === "" || path === ".")
40
+ return { ok: false, error: "`path` must name a folder inside the repository" };
41
+ if (path.length > MAX_BUNDLE_PATH_LENGTH)
42
+ return { ok: false, error: `\`path\` must be at most ${MAX_BUNDLE_PATH_LENGTH} characters` };
43
+ // eslint-disable-next-line no-control-regex
44
+ if (/[\u0000-\u001f\u007f\\]/.test(path))
45
+ return { ok: false, error: "`path` must be a plain POSIX path" };
46
+ if (path.startsWith("/"))
47
+ return { ok: false, error: "`path` must be relative to the repository root" };
48
+ const segments = path.split("/");
49
+ if (segments.some((s) => s === "" || s === "." || s === ".."))
50
+ return { ok: false, error: "`path` must not contain empty, `.` or `..` segments" };
51
+ if (segments[0] === ".wardby" || segments[0] === ".git")
52
+ return { ok: false, error: "`path` must not be inside `.wardby/` or `.git/`" };
53
+ return { ok: true, bundlePath: path };
54
+ }
55
+ /**
56
+ * The bundle location, given a reader for `.wardby/knowledge.yaml` that
57
+ * returns null when the file does not exist. A reader that throws, like an
58
+ * invalid file, yields the default with a warning.
59
+ */
60
+ export async function resolveKnowledgeLocation(readConfig) {
61
+ let text;
62
+ try {
63
+ text = await readConfig();
64
+ }
65
+ catch (err) {
66
+ const reason = err instanceof Error ? err.message : String(err);
67
+ return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH, warning: ignoredWarning(`it could not be read (${reason})`) };
68
+ }
69
+ if (text === null || text === undefined)
70
+ return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH };
71
+ const parsed = parseKnowledgeConfig(text);
72
+ if (!parsed.ok)
73
+ return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH, warning: ignoredWarning(parsed.error) };
74
+ return { bundlePath: parsed.bundlePath };
75
+ }
76
+ function ignoredWarning(reason) {
77
+ return `${KNOWLEDGE_CONFIG_PATH} was ignored because ${reason}; using ${DEFAULT_KNOWLEDGE_BUNDLE_PATH}/.`;
78
+ }
@@ -38,16 +38,17 @@ export declare function assertAgentAccess<A extends AgentRef>(ctx: McpRequestCon
38
38
  export declare function requireAgentAccess(ctx: McpRequestContext, id: string, required: AgentLevel | "owner", db?: Pick<PrismaClient, "agent" | "resourceGrant">): Promise<{
39
39
  agent: {
40
40
  name: string;
41
+ updatedAt: Date;
41
42
  model: string;
42
43
  budgetUsd: import("@prisma/client-runtime-utils").Decimal;
43
44
  maxTurns: number;
44
- createdAt: Date;
45
- updatedAt: Date;
46
45
  kind: import("#prisma").AgentKind;
46
+ createdAt: Date;
47
47
  id: string;
48
48
  ownerId: string | null;
49
49
  nativeExecutionMode: import("#prisma").NativeExecutionMode;
50
50
  systemPrompt: string;
51
+ allowedOverrunPercent: number;
51
52
  schedule: string | null;
52
53
  timezone: string;
53
54
  scheduleEnabled: boolean;
@@ -68,6 +69,13 @@ export declare function requireAgentAccess(ctx: McpRequestContext, id: string, r
68
69
  * it can adopt the agent first (make_owner / grants adopt-public).
69
70
  */
70
71
  export declare function requireBindingOwner(ctx: McpRequestContext, agent: AgentRef): void;
72
+ /**
73
+ * requireBindingOwner, plus: nothing owner-held may be bound to an agent
74
+ * everyone can write (anyone could then rewrite it to use the binding).
75
+ */
76
+ export declare function requireBindable(ctx: McpRequestContext, agent: AgentRef, db?: GrantDb): Promise<void>;
77
+ /** The public-write half of requireBindable, for paths that skip the owner check (an admin's adminOverride). */
78
+ export declare function requireNotPublicWritable(agent: AgentRef, db: GrantDb): Promise<void>;
71
79
  /** Prisma where for agent listings: own rows plus rows granted >= read; the operator sees all. */
72
80
  export declare function readableAgentsWhere(ctx: McpRequestContext, db?: GrantDb): Promise<Prisma.AgentWhereInput>;
73
81
  /** One grant lookup for a whole listing: returns agent -> the caller's access. */
@@ -1,4 +1,4 @@
1
- import { atLeast, effectiveAccess, grantedAccessMap, grantedIds } from "../../core/grants.js";
1
+ import { atLeast, effectiveAccess, grantedAccessMap, grantedIds, isPublicWritable, } from "../../core/grants.js";
2
2
  import { McpError } from "../errors.js";
3
3
  export function agentNotFound(id) {
4
4
  return new McpError(404, `Agent "${id}" not found.`);
@@ -42,6 +42,20 @@ export function requireBindingOwner(ctx, agent) {
42
42
  throw new McpError(403, `Only the owner of agent "${agent.id}" can change its bindings.`);
43
43
  }
44
44
  }
45
+ /**
46
+ * requireBindingOwner, plus: nothing owner-held may be bound to an agent
47
+ * everyone can write (anyone could then rewrite it to use the binding).
48
+ */
49
+ export async function requireBindable(ctx, agent, db = ctx.db) {
50
+ requireBindingOwner(ctx, agent);
51
+ await requireNotPublicWritable(agent, db);
52
+ }
53
+ /** The public-write half of requireBindable, for paths that skip the owner check (an admin's adminOverride). */
54
+ export async function requireNotPublicWritable(agent, db) {
55
+ if (await isPublicWritable(db, agent.id)) {
56
+ throw new McpError(409, `Agent "${agent.id}" is writable by everyone, so nothing can be bound to it; revoke or lower the everyone grant first.`);
57
+ }
58
+ }
45
59
  /** Prisma where for agent listings: own rows plus rows granted >= read; the operator sees all. */
46
60
  export async function readableAgentsWhere(ctx, db = ctx.db) {
47
61
  if (ctx.operator)
@@ -26,8 +26,8 @@ export declare function visibleToPrincipal(principalId: string): {
26
26
  };
27
27
  export declare function requireOwnedBudgetGroup(db: PrismaClient, id: string, principalId: string): Promise<{
28
28
  name: string;
29
- createdAt: Date;
30
29
  updatedAt: Date;
30
+ createdAt: Date;
31
31
  id: string;
32
32
  ownerId: string | null;
33
33
  dailyBudgetUsd: import("@prisma/client-runtime-utils").Decimal | null;
@@ -37,8 +37,8 @@ export declare function requireOwnedBudgetGroup(db: PrismaClient, id: string, pr
37
37
  }>;
38
38
  export declare function requireReadableBudgetGroup(db: Pick<PrismaClient, "budgetGroup">, id: string, principalId: string): Promise<{
39
39
  name: string;
40
- createdAt: Date;
41
40
  updatedAt: Date;
41
+ createdAt: Date;
42
42
  id: string;
43
43
  ownerId: string | null;
44
44
  dailyBudgetUsd: import("@prisma/client-runtime-utils").Decimal | null;
@@ -50,8 +50,8 @@ export declare function requireOwnedSecret(db: PrismaClient, id: string, princip
50
50
  export declare function requireOwnedWebhook(db: PrismaClient, id: string, principalId: string): Promise<void>;
51
51
  export declare function requireOwnedDatastore(db: PrismaClient, id: string, principalId: string): Promise<{
52
52
  name: string;
53
- createdAt: Date;
54
53
  updatedAt: Date;
54
+ createdAt: Date;
55
55
  id: string;
56
56
  ownerId: string | null;
57
57
  }>;
@@ -72,14 +72,14 @@ export declare function assertStrictlyOwnedTool(tool: Tool | null, id: string, p
72
72
  * triggered them. No canRead/null=public path exists here on purpose.
73
73
  */
74
74
  export declare function requireOwnedTask(db: PrismaClient, taskId: string, principalId: string): Promise<{
75
+ updatedAt: Date;
75
76
  error: import("@prisma/client/runtime/client").JsonValue | null;
76
- status: import("#prisma").TaskStatus;
77
77
  runId: string | null;
78
- createdAt: Date;
79
- updatedAt: Date;
80
- kind: import("#prisma").TaskKind;
81
78
  result: import("@prisma/client/runtime/client").JsonValue | null;
79
+ kind: import("#prisma").TaskKind;
80
+ createdAt: Date;
82
81
  id: string;
82
+ status: import("#prisma").TaskStatus;
83
83
  principalId: string | null;
84
84
  inputRequests: import("@prisma/client/runtime/client").JsonValue | null;
85
85
  inputResponses: import("@prisma/client/runtime/client").JsonValue | null;
@@ -23,10 +23,10 @@ export declare function lockUser(tx: AuthDb, id: string): Promise<{
23
23
  subject: string;
24
24
  };
25
25
  } & {
26
- status: string;
27
- createdAt: Date;
28
26
  updatedAt: Date;
27
+ createdAt: Date;
29
28
  id: string;
29
+ status: string;
30
30
  roles: string[];
31
31
  displayName: string | null;
32
32
  principalId: string;
@@ -58,11 +58,11 @@ export declare class IdentityService {
58
58
  }>;
59
59
  revokeKey(keyId: string): Promise<void>;
60
60
  listUsers(): Prisma.PrismaPromise<{
61
+ id: string;
61
62
  status: string;
62
63
  principal: {
63
64
  subject: string;
64
65
  };
65
- id: string;
66
66
  roles: string[];
67
67
  displayName: string | null;
68
68
  }[]>;
@@ -16,10 +16,10 @@ export declare class Sessions {
16
16
  subject: string;
17
17
  };
18
18
  } & {
19
- status: string;
20
- createdAt: Date;
21
19
  updatedAt: Date;
20
+ createdAt: Date;
22
21
  id: string;
22
+ status: string;
23
23
  roles: string[];
24
24
  displayName: string | null;
25
25
  principalId: string;
@@ -33,6 +33,8 @@ export interface GitHubIngressDeps {
33
33
  }>;
34
34
  /** Accounts served in addition to the App's owner (WARDBY_GITHUB_ALLOWED_ACCOUNTS). */
35
35
  allowedAccounts: () => ReadonlySet<string>;
36
+ /** False = no reply explaining why a mention started nothing (WARDBY_MENTION_EXPLANATIONS). */
37
+ mentionExplanations?: boolean;
36
38
  /** Removes the App from an installation on an account that isn't served; absent = ignore only. */
37
39
  uninstallInstallation?: (installationId: number) => Promise<void>;
38
40
  now?: () => Date;
@@ -99,7 +99,7 @@ export async function handleGitHubEventIngress(req, deps) {
99
99
  : {}),
100
100
  };
101
101
  }
102
- const event = normalizeGitHubEvent(eventName, payload, app);
102
+ const event = normalizeGitHubEvent(eventName, payload, app, (dropped) => log.info({ ...dropped, deliveryId }, "mention ignored: its author did not pass the pre-filter"));
103
103
  // An event we don't act on must never claim the delivery id: recording it
104
104
  // here would let a later, real delivery of the same id (GitHub does reuse
105
105
  // ids across distinct redeliveries of what it considers the same event)
@@ -130,6 +130,7 @@ export async function handleGitHubEventIngress(req, deps) {
130
130
  repoAccess: deps.repoAccess,
131
131
  ...(deps.issueTrackers ? { issueTrackers: deps.issueTrackers } : {}),
132
132
  mentionHandle: app.slug,
133
+ ...(deps.mentionExplanations === false ? { mentionExplanations: false } : {}),
133
134
  });
134
135
  log.info({ event: event.kind, repository: event.repository, deliveryId, runIds: routed.runIds }, "host event routed");
135
136
  return {
@@ -12,6 +12,12 @@ export declare function localOperatorContext(principal: Principal, providers: Mc
12
12
  export declare function registerAllTools(mcp: WardbyMcpServer, opts: {
13
13
  secretElicitationUrl: SecretElicitationUrlBuilder;
14
14
  secretElicitationProtocol: boolean;
15
+ /** Builds a get_run_transcript download URL for a minted token; absent = transcripts are not served. */
16
+ runTranscriptUrl?: (token: string) => Promise<string>;
17
+ /** Whether a blob store is configured to serve run transcripts from. */
18
+ blobStoreConfigured?: boolean;
19
+ /** Which host serves those links (default http). */
20
+ runTranscriptAudience?: "stdio" | "http";
15
21
  /** Rebuilds the process's installed model CatalogStore after set_model/disable_model/reset_model. */
16
22
  refreshModelCatalog?: () => Promise<void>;
17
23
  }): void;
package/dist/mcp/index.js CHANGED
@@ -13,8 +13,11 @@
13
13
  * missing `AUTH_JWKS_URI`/`AUTH_SIGNING_KEY` a deployment running stdio-only
14
14
  * never needed to set.
15
15
  */
16
- import { loadProviderConfig, loadMcpConfig, loadShutdownDrainSeconds, loadAuthConfig, loadGitHubEventConfig, loadJiraConfig, loadGitHubVcsConfig, } from "../config/providers.js";
16
+ import { startupTestSimulators } from "../config/test-simulators.js";
17
+ import { loadProviderConfig, loadMcpConfig, loadShutdownDrainSeconds, loadAuthConfig, loadGitHubEventConfig, loadJiraConfig, loadGitHubVcsConfig, loadBlobStoreConfig, } from "../config/providers.js";
17
18
  import { prisma } from "../core/db.js";
19
+ import { guardDatastore, guardAgentMemory } from "../core/secret-guarded-stores.js";
20
+ import { createDbSecretWriteGuard } from "../core/secret-guard.js";
18
21
  import { waitForInFlightRuns } from "../core/in-flight-runs.js";
19
22
  import { NativeEngine } from "../core/engine-native.js";
20
23
  import { resolveLlmRegistrations, RoutingLlmProvider } from "../providers/llm/index.js";
@@ -35,6 +38,7 @@ import { loadGitHubAllowedAccounts } from "../config/github-allowed-accounts.js"
35
38
  import { buildMcpServer } from "./server.js";
36
39
  import { buildPower } from "../core/power-composition.js";
37
40
  import { countUnattendedSchedules, unattendedSchedulesWarning } from "./unattended-schedules.js";
41
+ import { logZod3ToolWarnings } from "../core/zod3-window.js";
38
42
  import { runStdioServer } from "./transport/stdio.js";
39
43
  import { startHttpServer } from "./transport/streamable-http.js";
40
44
  import { resolvePrincipal } from "./auth/principal.js";
@@ -53,6 +57,7 @@ import { registerTriggerTool } from "./tools/trigger.js";
53
57
  import { registerToolAuthoringTools } from "./tools/tools.js";
54
58
  import { registerSchedulingTools } from "./tools/scheduling.js";
55
59
  import { registerRunTools } from "./tools/runs.js";
60
+ import { registerStopRunTool } from "./tools/stop-run.js";
56
61
  import { registerCostReportTools } from "./tools/cost-report.js";
57
62
  import { registerDatastoreTools } from "./tools/datastore.js";
58
63
  import { registerSubAgentTools } from "./tools/subagents.js";
@@ -62,9 +67,14 @@ import { registerIssueProjectTools } from "./tools/issue-projects.js";
62
67
  import { registerNotificationChannelTools } from "./tools/notification-channels.js";
63
68
  import { registerHostAccountTools } from "./tools/host-accounts.js";
64
69
  import { registerMemoryTools } from "./tools/memory.js";
70
+ import { registerPackageTools } from "./tools/packages.js";
65
71
  import { registerSecretsTools } from "./tools/secrets.js";
66
72
  import { registerWebhookTools } from "./tools/webhooks.js";
67
- import { createStdioSecretElicitationHost } from "./tools/secret-elicitation-server.js";
73
+ import { STDIO_SECRET_PATH, secretFormRoute } from "./tools/secret-elicitation-server.js";
74
+ import { createStdioLinkHost } from "./transport/stdio-link-host.js";
75
+ import { registerRunTranscriptTool } from "./tools/run-transcript.js";
76
+ import { handleRunTranscriptDownload, RUN_TRANSCRIPT_DOWNLOAD_PATH } from "./tools/run-transcript-download.js";
77
+ import { createBlobStore } from "../providers/storage/index.js";
68
78
  import { SECRET_ELICITATION_PATH } from "./tools/secret-elicitation-form.js";
69
79
  import { installWorkflowEventRecorder } from "../core/notifications.js";
70
80
  import { logger } from "../core/logger.js";
@@ -118,6 +128,13 @@ export function registerAllTools(mcp, opts) {
118
128
  registerToolAuthoringTools(mcp);
119
129
  registerSchedulingTools(mcp);
120
130
  registerRunTools(mcp);
131
+ const runTranscriptUrl = opts.runTranscriptUrl;
132
+ registerRunTranscriptTool(mcp, {
133
+ downloadUrl: runTranscriptUrl ?? (() => Promise.reject(new Error("run transcripts are not served here"))),
134
+ blobStoreConfigured: runTranscriptUrl !== undefined && opts.blobStoreConfigured === true,
135
+ audience: opts.runTranscriptAudience ?? "http",
136
+ });
137
+ registerStopRunTool(mcp);
121
138
  registerCostReportTools(mcp);
122
139
  registerDatastoreTools(mcp);
123
140
  registerSubAgentTools(mcp);
@@ -127,6 +144,7 @@ export function registerAllTools(mcp, opts) {
127
144
  registerNotificationChannelTools(mcp);
128
145
  registerHostAccountTools(mcp);
129
146
  registerMemoryTools(mcp);
147
+ registerPackageTools(mcp);
130
148
  registerSecretsTools(mcp, {
131
149
  buildElicitationUrl: opts.secretElicitationUrl,
132
150
  protocolElicitation: opts.secretElicitationProtocol,
@@ -143,8 +161,9 @@ export function buildMcpProviders() {
143
161
  const llm = new RoutingLlmProvider(llmResult.registrations);
144
162
  const engine = new NativeEngine();
145
163
  const secrets = buildSecretCipher(providerConfig);
146
- const datastore = new PostgresDatastore(prisma, secrets);
147
- const memory = new PostgresAgentMemory(prisma);
164
+ const secretGuard = createDbSecretWriteGuard(prisma, secrets);
165
+ const datastore = guardDatastore(new PostgresDatastore(prisma, secrets), secretGuard);
166
+ const memory = guardAgentMemory(new PostgresAgentMemory(prisma), secretGuard);
148
167
  const reviewHosts = buildReviewHosts(process.env, prisma);
149
168
  const issueTrackers = buildIssueTrackers();
150
169
  const hostUserAuthorizers = buildHostUserAuthorizers();
@@ -183,6 +202,7 @@ export function buildMcpProviders() {
183
202
  providerConfig,
184
203
  repoAccess,
185
204
  power,
205
+ secretCipher: secrets,
186
206
  // Sandbox-mode native runs (docs/native-sandbox.md); undefined when NATIVE_SANDBOX_LAUNCHER is unset.
187
207
  nativeSandbox: buildNativeSandboxExecutor({ db: prisma, providers: nativeProviders, power }),
188
208
  });
@@ -233,6 +253,8 @@ export function warmUpExecutor(executor) {
233
253
  /** The real CLI entry point: `wardby mcp`. Reads config from the environment, starts stdio or HTTP per MCP_TRANSPORT. */
234
254
  export async function startMcp(options = {}) {
235
255
  const mcpConfig = loadMcpConfig();
256
+ // WARDBY_TEST_SIMULATORS (test only): refuses to start beside production configuration.
257
+ startupTestSimulators("server");
236
258
  // Parsed up front so a malformed value fails at startup, not at shutdown.
237
259
  const drainSeconds = loadShutdownDrainSeconds();
238
260
  // Parsed now so a malformed list stops startup instead of failing every event.
@@ -251,15 +273,32 @@ export async function startMcp(options = {}) {
251
273
  warmUpExecutor(providers.executor);
252
274
  if (!options.schedulerAttached)
253
275
  await warnIfNothingWillFireSchedules();
276
+ // Zod 3 compatibility window: one warning per custom tool the next release breaks. In the background.
277
+ void logZod3ToolWarnings(prisma, mcpLog);
278
+ // Run transcripts (get_run_transcript) are served from the blob store they were stored in.
279
+ const blobStoreConfig = loadBlobStoreConfig();
280
+ const blobs = blobStoreConfig ? createBlobStore(blobStoreConfig) : undefined;
254
281
  if (mcpConfig.transport === "stdio") {
255
282
  const mcp = buildMcpServer({ providers, db: prisma, config: { canonicalUri: STDIO_PLACEHOLDER_URI } });
256
- const secretElicitationHost = createStdioSecretElicitationHost({
257
- verify: (token) => mcp.verifyRequestState(token),
258
- secrets: providers.secrets,
259
- db: prisma,
283
+ // One loopback server for every signed link a stdio tool hands out.
284
+ const linkHost = createStdioLinkHost({
285
+ [STDIO_SECRET_PATH]: secretFormRoute({
286
+ verify: (token) => mcp.verifyRequestState(token),
287
+ secrets: providers.secrets,
288
+ db: prisma,
289
+ }),
290
+ [RUN_TRANSCRIPT_DOWNLOAD_PATH]: (req, res, token) => handleRunTranscriptDownload(req.method, token, res, {
291
+ verify: (t) => mcp.verifyRequestState(t),
292
+ audience: "stdio",
293
+ db: prisma,
294
+ blobs,
295
+ }),
260
296
  });
261
297
  registerAllTools(mcp, {
262
- secretElicitationUrl: (token) => secretElicitationHost.urlFor(token),
298
+ secretElicitationUrl: (token) => linkHost.urlFor(STDIO_SECRET_PATH, token),
299
+ runTranscriptUrl: (token) => linkHost.urlFor(RUN_TRANSCRIPT_DOWNLOAD_PATH, token),
300
+ runTranscriptAudience: "stdio",
301
+ blobStoreConfigured: blobs !== undefined,
263
302
  secretElicitationProtocol: mcpConfig.secretElicitationProtocol,
264
303
  refreshModelCatalog: () => modelCatalog.refreshNow(),
265
304
  });
@@ -291,10 +330,17 @@ export async function startMcp(options = {}) {
291
330
  const authProviderKind = providerConfig.auth === "self-hosted" ? "self-hosted" : "delegating";
292
331
  const authProvider = buildAuthProvider(providerConfig.auth, authConfig, prisma);
293
332
  const selfHosted = authProviderKind === "self-hosted" ? authProvider : undefined;
294
- const mcp = buildMcpServer({ providers, db: prisma, config: { canonicalUri: mcpConfig.canonicalUri } });
333
+ const mcp = buildMcpServer({
334
+ providers,
335
+ db: prisma,
336
+ config: { canonicalUri: mcpConfig.canonicalUri },
337
+ deriveRequestStateKey: true,
338
+ });
295
339
  const httpOrigin = canonicalUrl(mcpConfig.canonicalUri).origin;
296
340
  registerAllTools(mcp, {
297
341
  secretElicitationUrl: (token) => Promise.resolve(`${httpOrigin}${SECRET_ELICITATION_PATH}?t=${encodeURIComponent(token)}`),
342
+ runTranscriptUrl: (token) => Promise.resolve(`${httpOrigin}${RUN_TRANSCRIPT_DOWNLOAD_PATH}?t=${encodeURIComponent(token)}`),
343
+ blobStoreConfigured: blobs !== undefined,
298
344
  secretElicitationProtocol: mcpConfig.secretElicitationProtocol,
299
345
  refreshModelCatalog: () => modelCatalog.refreshNow(),
300
346
  });
@@ -319,6 +365,7 @@ export async function startMcp(options = {}) {
319
365
  webhookSecret: eventConfig.webhookSecret,
320
366
  appIdentity: (opts) => githubApp.appIdentity(opts),
321
367
  allowedAccounts: () => allowedAccounts,
368
+ mentionExplanations: eventConfig.mentionExplanations,
322
369
  uninstallInstallation: (id) => githubApp.deleteInstallation(id),
323
370
  },
324
371
  }
@@ -385,6 +432,7 @@ export async function startMcp(options = {}) {
385
432
  hostEvents,
386
433
  hostUserAuth,
387
434
  viewer,
435
+ blobs,
388
436
  });
389
437
  const cleanupTimer = selfHosted
390
438
  ? setInterval(() => {
@@ -25,6 +25,14 @@
25
25
  import { type McpServerFactory, type InputRequiredResult } from "@modelcontextprotocol/server";
26
26
  import type { PrismaClient } from "#prisma";
27
27
  import type { McpRequestContext, McpProviders } from "./context.js";
28
+ /**
29
+ * Most array elements plus object members one `tools/call` may carry
30
+ * (GHSA-46jr-4wx8-v453). Validating an argument tree costs memory per node, so
31
+ * without a bound one request inside the 1 MiB body limit could hold a very
32
+ * large tree. The largest legitimate input is a datastore value, itself capped
33
+ * at 1 MiB; 100,000 nodes leaves ample room for any realistic value.
34
+ */
35
+ export declare const MAX_TOOL_INPUT_ELEMENTS = 100000;
28
36
  export interface ToolSpec<Args = Record<string, unknown>> {
29
37
  name: string;
30
38
  description?: string;
@@ -58,6 +66,11 @@ export interface BuildMcpServerOptions {
58
66
  config: McpServerConfig;
59
67
  /** Testability hook for REQUEST_STATE_KEY — defaults to process.env, matching buildSecretCipher's convention. */
60
68
  env?: NodeJS.ProcessEnv;
69
+ /**
70
+ * HTTP transport: with REQUEST_STATE_KEY unset, derive the requestState key from SECRET_APP_KEY so
71
+ * every instance sharing that key verifies every other instance's tokens. stdio leaves it off.
72
+ */
73
+ deriveRequestStateKey?: boolean;
61
74
  }
62
75
  export interface DiscoverResultLike {
63
76
  capabilities: {
@@ -23,7 +23,7 @@
23
23
  * whole connection.
24
24
  */
25
25
  import { McpServer, fromJsonSchema, createRequestStateCodec, CLIENT_CAPABILITIES_META_KEY, } from "@modelcontextprotocol/server";
26
- import { randomBytes } from "node:crypto";
26
+ import { hkdfSync, randomBytes } from "node:crypto";
27
27
  import { readFileSync } from "node:fs";
28
28
  import { requireScope } from "./auth/resource-server.js";
29
29
  import { McpError, mapPrismaError } from "./errors.js";
@@ -33,17 +33,35 @@ import { grantedIds } from "../core/grants.js";
33
33
  import { logger } from "../core/logger.js";
34
34
  /** The package version, reported in MCP server info (package.json sits two levels up from src/mcp and dist/mcp). */
35
35
  const SERVER_VERSION = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
36
+ /**
37
+ * Most array elements plus object members one `tools/call` may carry
38
+ * (GHSA-46jr-4wx8-v453). Validating an argument tree costs memory per node, so
39
+ * without a bound one request inside the 1 MiB body limit could hold a very
40
+ * large tree. The largest legitimate input is a datastore value, itself capped
41
+ * at 1 MiB; 100,000 nodes leaves ample room for any realistic value.
42
+ */
43
+ export const MAX_TOOL_INPUT_ELEMENTS = 100_000;
36
44
  const REQUEST_STATE_KEY_BYTES = 32;
45
+ /** HKDF info for the requestState key derived from SECRET_APP_KEY; never reused for another key. */
46
+ const REQUEST_STATE_KEY_INFO = "wardby/mcp/request-state/http/v1";
37
47
  /**
38
48
  * REQUEST_STATE_KEY (hex, 32 bytes) shares the requestState HMAC key across
39
- * instances — see the requestStateCodec construction below. Unset falls back
40
- * to a fresh random key, which is correct for stdio and single-instance HTTP
41
- * and is NOT an error: only a multi-instance HTTP deployment needs this set.
49
+ * instances — see the requestStateCodec construction below. Unset, the HTTP
50
+ * transport derives it from SECRET_APP_KEY (HKDF-SHA256, a label of its own),
51
+ * which every instance of one deployment already shares, so a multi-instance
52
+ * deployment needs no extra setting; the derived key reveals nothing about
53
+ * SECRET_APP_KEY. Without either, or on stdio, it is a fresh random key per
54
+ * process, which is correct when nothing outside that process verifies its
55
+ * tokens (and keeps stdio tokens from verifying on the HTTP server).
42
56
  */
43
- function loadRequestStateKey(env) {
57
+ function loadRequestStateKey(env, derive) {
44
58
  const hex = env.REQUEST_STATE_KEY;
45
- if (!hex)
46
- return randomBytes(REQUEST_STATE_KEY_BYTES);
59
+ if (!hex) {
60
+ const appKey = derive && env.SECRET_APP_KEY ? Buffer.from(env.SECRET_APP_KEY, "hex") : undefined;
61
+ if (appKey?.length !== REQUEST_STATE_KEY_BYTES)
62
+ return randomBytes(REQUEST_STATE_KEY_BYTES);
63
+ return new Uint8Array(hkdfSync("sha256", appKey, Buffer.alloc(0), REQUEST_STATE_KEY_INFO, REQUEST_STATE_KEY_BYTES));
64
+ }
47
65
  const key = Buffer.from(hex, "hex");
48
66
  if (key.length !== REQUEST_STATE_KEY_BYTES) {
49
67
  throw new Error(`REQUEST_STATE_KEY must be ${REQUEST_STATE_KEY_BYTES} bytes of hex (${REQUEST_STATE_KEY_BYTES * 2} hex chars); got ${key.length} bytes.`);
@@ -76,16 +94,16 @@ export function buildMcpServer(opts) {
76
94
  // against the codec's implementation) — safe to call verifyRequestState()
77
95
  // from outside a real MCP request (the secret-elicitation browser form).
78
96
  //
79
- // REQUEST_STATE_KEY, when set, lets a token minted by one process verify
80
- // on another — required for the secret-elicitation round trip (mint,
81
- // browser-form POST, polling retry) to work under a multi-instance HTTP
97
+ // REQUEST_STATE_KEY (or, over HTTP, the key derived from SECRET_APP_KEY)
98
+ // lets a token minted by one process verify on another — required for the
99
+ // secret-elicitation round trip (mint, browser-form POST, polling retry)
100
+ // and the run-transcript download to work under a multi-instance HTTP
82
101
  // deployment, where those three legs can land on three different
83
102
  // processes (see secret-elicitation.ts's matching Postgres-backed outcome
84
- // store). stdio and single-instance HTTP need no configuration: with the
85
- // env var unset, a fresh random key per process is fine, since nothing
86
- // outside this same running server ever needs to verify a token it minted.
103
+ // store). stdio needs no configuration: a fresh random key per process is
104
+ // fine, since nothing outside that running server verifies its tokens.
87
105
  const requestStateCodec = createRequestStateCodec({
88
- key: loadRequestStateKey(opts.env ?? process.env),
106
+ key: loadRequestStateKey(opts.env ?? process.env, opts.deriveRequestStateKey ?? false),
89
107
  ttlSeconds: 600,
90
108
  });
91
109
  function mcpReqOf(sdkCtx) {
@@ -125,6 +143,7 @@ export function buildMcpServer(opts) {
125
143
  const mcpServer = new McpServer({ name: "wardby", version: SERVER_VERSION }, {
126
144
  requestState: { verify: (state, ctx) => requestStateCodec.verify(state, ctx) },
127
145
  instructions: SERVER_INSTRUCTIONS,
146
+ maxToolInputElements: MAX_TOOL_INPUT_ELEMENTS,
128
147
  });
129
148
  mcpServer.server.registerCapabilities({ extensions: { [TASKS_EXTENSION_ID]: {} } });
130
149
  for (const spec of specs) {
@@ -1,2 +1,6 @@
1
1
  import type { WardbyMcpServer } from "../server.js";
2
+ /** The warning create_agent / update_agent return (not a refusal): wardby can't tell how old a custom image is. */
3
+ export declare const DEPENDENCY_CACHE_IMAGE_WARNING = "dependencyCache is on and this agent runs its own worker image (workerImageRef): rebuild that image FROM the wardby release that includes the dependency cache before its next run, or the run fails at input (worker_input_failed). See the dependency-cache help article.";
4
+ export declare const SESSION_RESUME_IMAGE_WARNING = "sessionResume is on and this agent runs its own worker image (workerImageRef): rebuild that image FROM the wardby release that includes session resume before its next run, or the run fails at input (worker_input_failed).";
5
+ export declare const SESSION_RESUME_NO_STORE_WARNING = "sessionResume is on but this server has no blob store (BLOB_STORE), so transcripts are not kept. See the resume-runs-locally help article.";
2
6
  export declare function registerAgentTools(mcp: WardbyMcpServer): void;