@wardby/cli 0.6.0 → 0.8.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 (740) hide show
  1. package/.env.example +5 -5
  2. package/README.md +6 -1
  3. package/deploy/local/docker-compose.quickstart-coding.yml +19 -0
  4. package/dist/claude-coding-worker/driver.d.ts +33 -3
  5. package/dist/claude-coding-worker/driver.js +151 -21
  6. package/dist/claude-coding-worker/main.js +38 -6
  7. package/dist/claude-coding-worker/sdk.js +29 -2
  8. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  9. package/dist/claude-coding-worker/tool-socket.js +111 -0
  10. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  11. package/dist/claude-coding-worker/transcript.js +77 -0
  12. package/dist/claude-plugin/command.d.ts +61 -0
  13. package/dist/claude-plugin/command.js +376 -0
  14. package/dist/cli-help.d.ts +1 -1
  15. package/dist/cli-help.js +3 -1
  16. package/dist/cli.js +71 -13
  17. package/dist/coding/code-host.d.ts +16 -0
  18. package/dist/coding/code-host.js +60 -0
  19. package/dist/coding/continuation-wording.d.ts +35 -0
  20. package/dist/coding/continuation-wording.js +73 -0
  21. package/dist/coding/linked-issue-note.d.ts +23 -0
  22. package/dist/coding/linked-issue-note.js +47 -0
  23. package/dist/coding/mcp-token.d.ts +12 -0
  24. package/dist/coding/mcp-token.js +26 -0
  25. package/dist/coding/merge-wording.d.ts +28 -0
  26. package/dist/coding/merge-wording.js +78 -0
  27. package/dist/coding/pr-description-note.d.ts +9 -0
  28. package/dist/coding/pr-description-note.js +32 -0
  29. package/dist/coding/profile.d.ts +46 -126
  30. package/dist/coding/profile.js +45 -4
  31. package/dist/coding/protected-path-wording.d.ts +8 -0
  32. package/dist/coding/protected-path-wording.js +1 -1
  33. package/dist/coding/protocol.d.ts +264 -346
  34. package/dist/coding/protocol.js +237 -12
  35. package/dist/coding/redact.d.ts +3 -0
  36. package/dist/coding/redact.js +17 -0
  37. package/dist/coding/registry/allowlist.d.ts +12 -0
  38. package/dist/coding/registry/allowlist.js +14 -1
  39. package/dist/coding/registry/audit-mode.d.ts +153 -0
  40. package/dist/coding/registry/audit-mode.js +304 -0
  41. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  42. package/dist/coding/registry/lockfile-shared.js +128 -0
  43. package/dist/coding/registry/lockfiles.js +1 -1
  44. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  45. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  46. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  47. package/dist/coding/registry/npm-lockfile.js +4 -6
  48. package/dist/coding/registry/npm.js +78 -8
  49. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  50. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  51. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  52. package/dist/coding/registry/pypi-plan.js +406 -0
  53. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  54. package/dist/coding/registry/pypi-requirements.js +155 -0
  55. package/dist/coding/registry/pypi.d.ts +3 -27
  56. package/dist/coding/registry/pypi.js +40 -154
  57. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  58. package/dist/coding/registry/refusal-hints.js +61 -0
  59. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  60. package/dist/coding/registry/refusal-wording.js +56 -0
  61. package/dist/coding/registry/report.d.ts +70 -8
  62. package/dist/coding/registry/report.js +112 -5
  63. package/dist/coding/registry/types.d.ts +58 -8
  64. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  65. package/dist/coding/registry/yarn-lockfile.js +367 -0
  66. package/dist/coding/services/catalog.d.ts +37 -351
  67. package/dist/coding/transcript/claude-code.d.ts +13 -0
  68. package/dist/coding/transcript/claude-code.js +273 -0
  69. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  70. package/dist/coding/transcript/download-protocol.js +18 -0
  71. package/dist/coding/transcript/format.d.ts +20 -0
  72. package/dist/coding/transcript/format.js +32 -0
  73. package/dist/coding/transcript/recorder.d.ts +52 -0
  74. package/dist/coding/transcript/recorder.js +225 -0
  75. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  76. package/dist/coding/transcript/resume/checkout.js +203 -0
  77. package/dist/coding/transcript/resume/command.d.ts +17 -0
  78. package/dist/coding/transcript/resume/command.js +176 -0
  79. package/dist/coding/transcript/resume/download.d.ts +20 -0
  80. package/dist/coding/transcript/resume/download.js +153 -0
  81. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  82. package/dist/coding/transcript/resume/launch.js +128 -0
  83. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  84. package/dist/coding/transcript/resume/session-file.js +79 -0
  85. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  86. package/dist/coding/transcript/resume/stand-in.js +49 -0
  87. package/dist/coding-worker/artifact.d.ts +8 -3
  88. package/dist/coding-worker/artifact.js +3 -1
  89. package/dist/coding-worker/debug-trace.d.ts +9 -6
  90. package/dist/coding-worker/debug-trace.js +16 -19
  91. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  92. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  93. package/dist/coding-worker/driver.d.ts +4 -3
  94. package/dist/coding-worker/driver.js +124 -39
  95. package/dist/coding-worker/errors.d.ts +1 -0
  96. package/dist/coding-worker/errors.js +32 -0
  97. package/dist/coding-worker/main.js +5 -1
  98. package/dist/coding-worker/mcp-config.d.ts +27 -0
  99. package/dist/coding-worker/mcp-config.js +32 -0
  100. package/dist/coding-worker/sdk.d.ts +36 -0
  101. package/dist/coding-worker/sdk.js +28 -1
  102. package/dist/coding-worker/task-note.d.ts +11 -0
  103. package/dist/coding-worker/task-note.js +13 -0
  104. package/dist/coding-worker/types.d.ts +15 -0
  105. package/dist/config/dependency-cache.d.ts +23 -0
  106. package/dist/config/dependency-cache.js +32 -0
  107. package/dist/config/mcp-call-limit.d.ts +8 -0
  108. package/dist/config/mcp-call-limit.js +18 -0
  109. package/dist/config/mcp-servers.d.ts +8 -0
  110. package/dist/config/mcp-servers.js +12 -0
  111. package/dist/config/providers.d.ts +12 -3
  112. package/dist/config/providers.js +55 -5
  113. package/dist/config/test-simulators.d.ts +92 -0
  114. package/dist/config/test-simulators.js +333 -0
  115. package/dist/config/tool-timeout.d.ts +1 -0
  116. package/dist/config/tool-timeout.js +18 -0
  117. package/dist/core/async-context.d.ts +2 -0
  118. package/dist/core/async-context.js +12 -0
  119. package/dist/core/budget-events.d.ts +108 -0
  120. package/dist/core/budget-events.js +346 -0
  121. package/dist/core/budget-groups.d.ts +50 -1
  122. package/dist/core/budget-groups.js +236 -27
  123. package/dist/core/budget-stopped-head.d.ts +46 -0
  124. package/dist/core/budget-stopped-head.js +81 -0
  125. package/dist/core/budget-topup.d.ts +51 -0
  126. package/dist/core/budget-topup.js +156 -0
  127. package/dist/core/budget-wording.d.ts +16 -2
  128. package/dist/core/budget-wording.js +40 -2
  129. package/dist/core/coding-mcp.d.ts +36 -0
  130. package/dist/core/coding-mcp.js +253 -0
  131. package/dist/core/coding-queue.d.ts +2 -1
  132. package/dist/core/coding-queue.js +7 -0
  133. package/dist/core/coding-repository.d.ts +46 -0
  134. package/dist/core/coding-repository.js +92 -0
  135. package/dist/core/cron.d.ts +19 -1
  136. package/dist/core/cron.js +17 -0
  137. package/dist/core/datastores.js +1 -1
  138. package/dist/core/deferred-coding.d.ts +14 -0
  139. package/dist/core/deferred-coding.js +62 -0
  140. package/dist/core/delegation-child.d.ts +25 -0
  141. package/dist/core/delegation-child.js +37 -0
  142. package/dist/core/delegation-slots.d.ts +27 -0
  143. package/dist/core/delegation-slots.js +44 -0
  144. package/dist/core/dispatch.d.ts +48 -2
  145. package/dist/core/dispatch.js +166 -66
  146. package/dist/core/engine-native.js +1 -1
  147. package/dist/core/error-code.d.ts +38 -0
  148. package/dist/core/error-code.js +169 -0
  149. package/dist/core/grants.d.ts +46 -8
  150. package/dist/core/grants.js +99 -8
  151. package/dist/core/host-events.d.ts +18 -2
  152. package/dist/core/host-events.js +291 -27
  153. package/dist/core/host-status.d.ts +85 -3
  154. package/dist/core/host-status.js +300 -22
  155. package/dist/core/issue-bridge.d.ts +50 -6
  156. package/dist/core/issue-bridge.js +124 -33
  157. package/dist/core/issue-events.d.ts +1 -1
  158. package/dist/core/issue-events.js +4 -10
  159. package/dist/core/issue-status.d.ts +1 -1
  160. package/dist/core/issue-status.js +58 -29
  161. package/dist/core/logger.d.ts +5 -0
  162. package/dist/core/logger.js +14 -1
  163. package/dist/core/lost-run-children.d.ts +6 -0
  164. package/dist/core/lost-run-children.js +32 -0
  165. package/dist/core/mark-ready.d.ts +34 -0
  166. package/dist/core/mark-ready.js +152 -0
  167. package/dist/core/markdown-code.d.ts +8 -0
  168. package/dist/core/markdown-code.js +107 -0
  169. package/dist/core/mcp-client/client.d.ts +47 -0
  170. package/dist/core/mcp-client/client.js +141 -0
  171. package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
  172. package/dist/core/mcp-client/jsonrpc.js +54 -0
  173. package/dist/core/mcp-client/results.d.ts +13 -0
  174. package/dist/core/mcp-client/results.js +42 -0
  175. package/dist/core/mcp-servers.d.ts +90 -0
  176. package/dist/core/mcp-servers.js +230 -0
  177. package/dist/core/mcp-tools.d.ts +108 -0
  178. package/dist/core/mcp-tools.js +287 -0
  179. package/dist/core/memory-tools.js +7 -0
  180. package/dist/core/merge-order-check.d.ts +2 -1
  181. package/dist/core/merge-order-check.js +44 -18
  182. package/dist/core/notification-dispatcher.js +2 -1
  183. package/dist/core/notification-templates.d.ts +1 -7
  184. package/dist/core/notification-templates.js +36 -2
  185. package/dist/core/pull-request-state-sync.js +2 -2
  186. package/dist/core/reconciler.d.ts +4 -3
  187. package/dist/core/reconciler.js +8 -1
  188. package/dist/core/related-pull-requests.d.ts +11 -3
  189. package/dist/core/related-pull-requests.js +49 -20
  190. package/dist/core/reply-parts.d.ts +21 -0
  191. package/dist/core/reply-parts.js +73 -0
  192. package/dist/core/review-fix.d.ts +1 -1
  193. package/dist/core/review-fix.js +4 -3
  194. package/dist/core/review-host-checks.d.ts +1 -1
  195. package/dist/core/review-host-tools.d.ts +3 -0
  196. package/dist/core/review-host-tools.js +102 -14
  197. package/dist/core/review-reads.d.ts +55 -0
  198. package/dist/core/review-reads.js +233 -0
  199. package/dist/core/run-status.d.ts +12 -0
  200. package/dist/core/run-status.js +12 -0
  201. package/dist/core/runner.d.ts +145 -49
  202. package/dist/core/runner.js +719 -216
  203. package/dist/core/schedule-start.d.ts +12 -0
  204. package/dist/core/schedule-start.js +14 -0
  205. package/dist/core/secret-broker-config.d.ts +12 -74
  206. package/dist/core/secret-broker-config.js +1 -1
  207. package/dist/core/secret-guard.d.ts +49 -0
  208. package/dist/core/secret-guard.js +119 -0
  209. package/dist/core/secret-guarded-stores.d.ts +12 -0
  210. package/dist/core/secret-guarded-stores.js +41 -0
  211. package/dist/core/secret-spans.d.ts +50 -0
  212. package/dist/core/secret-spans.js +94 -0
  213. package/dist/core/secrets.d.ts +11 -1
  214. package/dist/core/secrets.js +27 -1
  215. package/dist/core/serializable-retry.d.ts +18 -0
  216. package/dist/core/serializable-retry.js +43 -0
  217. package/dist/core/stop-run.d.ts +46 -0
  218. package/dist/core/stop-run.js +61 -0
  219. package/dist/core/tool-admin.d.ts +5 -1
  220. package/dist/core/tool-admin.js +7 -2
  221. package/dist/core/tool-names.d.ts +13 -0
  222. package/dist/core/tool-names.js +20 -0
  223. package/dist/core/webhooks.d.ts +4 -0
  224. package/dist/core/webhooks.js +68 -49
  225. package/dist/core/workflow-events.d.ts +14 -2
  226. package/dist/core/workflow-events.js +4 -0
  227. package/dist/core/workflow-run-events.d.ts +5 -3
  228. package/dist/core/workflow-run-events.js +45 -9
  229. package/dist/core/zod-json-schema.d.ts +4 -0
  230. package/dist/core/zod-json-schema.js +39 -0
  231. package/dist/core/zod3-window.d.ts +35 -0
  232. package/dist/core/zod3-window.js +124 -0
  233. package/dist/generated/prisma/browser.d.ts +65 -3
  234. package/dist/generated/prisma/client.d.ts +65 -3
  235. package/dist/generated/prisma/commonInputTypes.d.ts +266 -106
  236. package/dist/generated/prisma/enums.d.ts +10 -0
  237. package/dist/generated/prisma/enums.js +8 -0
  238. package/dist/generated/prisma/internal/class.d.ts +110 -0
  239. package/dist/generated/prisma/internal/class.js +4 -4
  240. package/dist/generated/prisma/internal/prismaNamespace.d.ts +957 -9
  241. package/dist/generated/prisma/internal/prismaNamespace.js +166 -2
  242. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +174 -0
  243. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +166 -2
  244. package/dist/generated/prisma/models/Agent.d.ts +377 -8
  245. package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
  246. package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
  247. package/dist/generated/prisma/models/AgentRepository.d.ts +81 -1
  248. package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
  249. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +228 -7
  250. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  251. package/dist/generated/prisma/models/CodingProxySession.d.ts +232 -2
  252. package/dist/generated/prisma/models/CodingRun.d.ts +1712 -1
  253. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  254. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  255. package/dist/generated/prisma/models/HostProvider.d.ts +2176 -0
  256. package/dist/generated/prisma/models/HostProvider.js +1 -0
  257. package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
  258. package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
  259. package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
  260. package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
  261. package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
  262. package/dist/generated/prisma/models/HostProviderTrustedAccount.js +1 -0
  263. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  264. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  265. package/dist/generated/prisma/models/McpServer.d.ts +1500 -0
  266. package/dist/generated/prisma/models/McpServer.js +1 -0
  267. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +77 -1
  268. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  269. package/dist/generated/prisma/models/Principal.d.ts +167 -0
  270. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  271. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  272. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  273. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  274. package/dist/generated/prisma/models/ResourceGrant.d.ts +1 -1
  275. package/dist/generated/prisma/models/Run.d.ts +738 -2
  276. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  277. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  278. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  279. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  280. package/dist/generated/prisma/models/Secret.d.ts +387 -0
  281. package/dist/generated/prisma/models/Tool.d.ts +223 -1
  282. package/dist/generated/prisma/models.d.ts +10 -0
  283. package/dist/help/search.js +12 -3
  284. package/dist/help-index.json +2033 -110
  285. package/dist/import/create.js +48 -4
  286. package/dist/import/neutral-schema.d.ts +51 -281
  287. package/dist/import/neutral-schema.js +7 -4
  288. package/dist/knowledge/check.d.ts +1 -1
  289. package/dist/knowledge/cli.d.ts +11 -1
  290. package/dist/knowledge/cli.js +37 -4
  291. package/dist/knowledge/concept.d.ts +3 -19
  292. package/dist/knowledge/location.d.ts +31 -0
  293. package/dist/knowledge/location.js +78 -0
  294. package/dist/mcp/auth/access.d.ts +10 -2
  295. package/dist/mcp/auth/access.js +15 -1
  296. package/dist/mcp/auth/grants-cli.d.ts +6 -4
  297. package/dist/mcp/auth/grants-cli.js +42 -3
  298. package/dist/mcp/auth/ownership.d.ts +7 -7
  299. package/dist/mcp/auth/resource-server.d.ts +3 -1
  300. package/dist/mcp/auth/resource-server.js +17 -2
  301. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  302. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  303. package/dist/mcp/context.d.ts +3 -0
  304. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  305. package/dist/mcp/host-events/github-ingress.js +2 -1
  306. package/dist/mcp/index.d.ts +6 -0
  307. package/dist/mcp/index.js +69 -10
  308. package/dist/mcp/server.d.ts +13 -0
  309. package/dist/mcp/server.js +33 -14
  310. package/dist/mcp/tools/agents.d.ts +4 -0
  311. package/dist/mcp/tools/agents.js +295 -28
  312. package/dist/mcp/tools/datastore.js +17 -8
  313. package/dist/mcp/tools/grants.js +73 -29
  314. package/dist/mcp/tools/host-providers.d.ts +2 -0
  315. package/dist/mcp/tools/host-providers.js +215 -0
  316. package/dist/mcp/tools/mcp-servers.d.ts +26 -0
  317. package/dist/mcp/tools/mcp-servers.js +481 -0
  318. package/dist/mcp/tools/memory.js +11 -1
  319. package/dist/mcp/tools/notification-channels.js +2 -2
  320. package/dist/mcp/tools/packages.d.ts +2 -0
  321. package/dist/mcp/tools/packages.js +195 -0
  322. package/dist/mcp/tools/repositories.js +65 -12
  323. package/dist/mcp/tools/run-access.d.ts +16 -0
  324. package/dist/mcp/tools/run-access.js +25 -0
  325. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  326. package/dist/mcp/tools/run-transcript-download.js +129 -0
  327. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  328. package/dist/mcp/tools/run-transcript.js +70 -0
  329. package/dist/mcp/tools/runs.js +209 -27
  330. package/dist/mcp/tools/scheduling.js +3 -1
  331. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  332. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  333. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  334. package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
  335. package/dist/mcp/tools/secret-elicitation.js +25 -2
  336. package/dist/mcp/tools/secrets.js +40 -6
  337. package/dist/mcp/tools/stop-run.d.ts +2 -0
  338. package/dist/mcp/tools/stop-run.js +82 -0
  339. package/dist/mcp/tools/subagents.js +2 -2
  340. package/dist/mcp/tools/tools.d.ts +7 -5
  341. package/dist/mcp/tools/tools.js +64 -16
  342. package/dist/mcp/tools/trigger.js +28 -6
  343. package/dist/mcp/transport/http-limits.d.ts +2 -0
  344. package/dist/mcp/transport/http-limits.js +6 -2
  345. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  346. package/dist/mcp/transport/stdio-link-host.js +67 -0
  347. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  348. package/dist/mcp/transport/streamable-http.js +41 -1
  349. package/dist/mcp/webhooks/ingress.js +10 -0
  350. package/dist/native-worker/docker-launcher.d.ts +38 -2
  351. package/dist/native-worker/docker-launcher.js +65 -5
  352. package/dist/native-worker/gateway-server.d.ts +55 -3
  353. package/dist/native-worker/gateway-server.js +152 -34
  354. package/dist/native-worker/gateway.d.ts +29 -1
  355. package/dist/native-worker/gateway.js +74 -4
  356. package/dist/native-worker/http-server.d.ts +7 -1
  357. package/dist/native-worker/http-server.js +62 -7
  358. package/dist/native-worker/http-transport.js +1 -1
  359. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  360. package/dist/native-worker/kubernetes-launcher.js +43 -3
  361. package/dist/native-worker/launch.d.ts +18 -1
  362. package/dist/native-worker/launch.js +6 -1
  363. package/dist/native-worker/ledger.d.ts +24 -4
  364. package/dist/native-worker/ledger.js +62 -8
  365. package/dist/native-worker/loopback.js +3 -8
  366. package/dist/native-worker/main.d.ts +2 -1
  367. package/dist/native-worker/main.js +14 -3
  368. package/dist/native-worker/protocol.d.ts +130 -577
  369. package/dist/native-worker/protocol.js +51 -2
  370. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  371. package/dist/native-worker/sandbox-executor.js +78 -4
  372. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  373. package/dist/native-worker/stderr-redaction.js +237 -0
  374. package/dist/native-worker/stdio.d.ts +1 -1
  375. package/dist/native-worker/stdio.js +6 -5
  376. package/dist/native-worker/warm-pool.d.ts +2 -2
  377. package/dist/native-worker/warm-pool.js +4 -4
  378. package/dist/native-worker/worker.js +28 -2
  379. package/dist/observability/metrics.js +6 -1
  380. package/dist/providers/auth/self-hosted.d.ts +1 -1
  381. package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
  382. package/dist/providers/coding-proxy/capability-hash.js +5 -0
  383. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  384. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  385. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  386. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  387. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  388. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  389. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  390. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  391. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  392. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  393. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  394. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  395. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  396. package/dist/providers/coding-proxy/hold.js +86 -0
  397. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  398. package/dist/providers/coding-proxy/interrupted.js +104 -0
  399. package/dist/providers/coding-proxy/mcp-route.d.ts +34 -0
  400. package/dist/providers/coding-proxy/mcp-route.js +166 -0
  401. package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -2
  402. package/dist/providers/coding-proxy/memory-ledger.js +99 -8
  403. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  404. package/dist/providers/coding-proxy/metering.js +27 -4
  405. package/dist/providers/coding-proxy/prisma-ledger.d.ts +16 -2
  406. package/dist/providers/coding-proxy/prisma-ledger.js +209 -69
  407. package/dist/providers/coding-proxy/proxy.d.ts +21 -2
  408. package/dist/providers/coding-proxy/proxy.js +300 -48
  409. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  410. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  411. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  412. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  413. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  414. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  415. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  416. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  417. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  418. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  419. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  420. package/dist/providers/coding-proxy/registry/service.js +579 -112
  421. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  422. package/dist/providers/coding-proxy/registry/store.js +54 -1
  423. package/dist/providers/coding-proxy/runtime.d.ts +10 -0
  424. package/dist/providers/coding-proxy/runtime.js +109 -16
  425. package/dist/providers/coding-proxy/server.d.ts +9 -1
  426. package/dist/providers/coding-proxy/server.js +55 -1
  427. package/dist/providers/coding-proxy/types.d.ts +78 -1
  428. package/dist/providers/datastore/types.d.ts +5 -0
  429. package/dist/providers/engine/types.d.ts +17 -2
  430. package/dist/providers/engine/types.js +17 -0
  431. package/dist/providers/executor/composition.d.ts +10 -3
  432. package/dist/providers/executor/composition.js +52 -7
  433. package/dist/providers/executor/container.d.ts +394 -9
  434. package/dist/providers/executor/container.js +1210 -96
  435. package/dist/providers/executor/dbos-status.d.ts +31 -0
  436. package/dist/providers/executor/dbos-status.js +64 -0
  437. package/dist/providers/executor/dbos.d.ts +50 -1
  438. package/dist/providers/executor/dbos.js +207 -20
  439. package/dist/providers/executor/deferred.d.ts +12 -24
  440. package/dist/providers/executor/deferred.js +10 -29
  441. package/dist/providers/executor/in-process.d.ts +9 -1
  442. package/dist/providers/executor/in-process.js +14 -4
  443. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  444. package/dist/providers/executor/linked-issue-reader.js +30 -0
  445. package/dist/providers/executor/routing.d.ts +2 -0
  446. package/dist/providers/executor/routing.js +4 -0
  447. package/dist/providers/executor/types.d.ts +13 -0
  448. package/dist/providers/host-tools/invoke.d.ts +37 -0
  449. package/dist/providers/host-tools/invoke.js +117 -0
  450. package/dist/providers/host-tools/operations.d.ts +65 -0
  451. package/dist/providers/host-tools/operations.js +149 -0
  452. package/dist/providers/host-tools/registry.d.ts +79 -0
  453. package/dist/providers/host-tools/registry.js +362 -0
  454. package/dist/providers/host-tools/request-guard.d.ts +17 -0
  455. package/dist/providers/host-tools/request-guard.js +99 -0
  456. package/dist/providers/host-tools/self-test.d.ts +64 -0
  457. package/dist/providers/host-tools/self-test.js +142 -0
  458. package/dist/providers/index.d.ts +2 -1
  459. package/dist/providers/issue-tracker/types.d.ts +17 -0
  460. package/dist/providers/issue-tracker/types.js +39 -1
  461. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  462. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  463. package/dist/providers/jobs/docker-isolation.d.ts +10 -2
  464. package/dist/providers/jobs/docker-isolation.js +47 -8
  465. package/dist/providers/jobs/docker.d.ts +9 -0
  466. package/dist/providers/jobs/docker.js +60 -11
  467. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  468. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  469. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  470. package/dist/providers/jobs/kubernetes-api.js +10 -0
  471. package/dist/providers/jobs/kubernetes-client.js +10 -1
  472. package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
  473. package/dist/providers/jobs/kubernetes-isolation.js +32 -3
  474. package/dist/providers/jobs/kubernetes.d.ts +11 -1
  475. package/dist/providers/jobs/kubernetes.js +111 -17
  476. package/dist/providers/jobs/types.d.ts +39 -0
  477. package/dist/providers/jobs/types.js +13 -1
  478. package/dist/providers/llm/anthropic.js +5 -1
  479. package/dist/providers/llm/bedrock.d.ts +0 -12
  480. package/dist/providers/llm/bedrock.js +4 -0
  481. package/dist/providers/llm/claude-messages.d.ts +3 -1
  482. package/dist/providers/llm/claude-messages.js +4 -1
  483. package/dist/providers/llm/claude-provider.d.ts +2 -2
  484. package/dist/providers/llm/claude-provider.js +2 -2
  485. package/dist/providers/llm/openai.d.ts +2 -2
  486. package/dist/providers/llm/openai.js +6 -2
  487. package/dist/providers/llm/routing.d.ts +2 -2
  488. package/dist/providers/llm/routing.js +2 -2
  489. package/dist/providers/llm/types.d.ts +12 -2
  490. package/dist/providers/review-host/github-events.d.ts +9 -1
  491. package/dist/providers/review-host/github-events.js +34 -12
  492. package/dist/providers/review-host/github.d.ts +29 -2
  493. package/dist/providers/review-host/github.js +224 -29
  494. package/dist/providers/review-host/local.d.ts +8 -4
  495. package/dist/providers/review-host/local.js +49 -31
  496. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  497. package/dist/providers/review-host/patch-pages.js +176 -0
  498. package/dist/providers/review-host/review-format.d.ts +19 -1
  499. package/dist/providers/review-host/review-format.js +38 -7
  500. package/dist/providers/review-host/types.d.ts +140 -6
  501. package/dist/providers/review-host/types.js +9 -1
  502. package/dist/providers/storage/gcs.d.ts +63 -0
  503. package/dist/providers/storage/gcs.js +69 -0
  504. package/dist/providers/storage/index.d.ts +15 -0
  505. package/dist/providers/storage/index.js +14 -0
  506. package/dist/providers/storage/local.d.ts +24 -0
  507. package/dist/providers/storage/local.js +92 -0
  508. package/dist/providers/storage/meter.d.ts +14 -0
  509. package/dist/providers/storage/meter.js +34 -0
  510. package/dist/providers/storage/s3.d.ts +41 -0
  511. package/dist/providers/storage/s3.js +107 -0
  512. package/dist/providers/storage/types.d.ts +37 -3
  513. package/dist/providers/storage/types.js +21 -4
  514. package/dist/providers/vcs/git.d.ts +39 -4
  515. package/dist/providers/vcs/git.js +339 -26
  516. package/dist/providers/vcs/github-remote.d.ts +26 -3
  517. package/dist/providers/vcs/github-remote.js +124 -14
  518. package/dist/providers/vcs/github.d.ts +183 -44
  519. package/dist/providers/vcs/github.js +455 -56
  520. package/dist/providers/vcs/index.d.ts +1 -1
  521. package/dist/providers/vcs/index.js +9 -2
  522. package/dist/providers/vcs/pr-description.d.ts +127 -0
  523. package/dist/providers/vcs/pr-description.js +270 -0
  524. package/dist/providers/vcs/remote.d.ts +37 -1
  525. package/dist/providers/vcs/remote.js +7 -1
  526. package/dist/providers/vcs/routing.d.ts +16 -8
  527. package/dist/providers/vcs/routing.js +27 -6
  528. package/dist/providers/vcs/types.d.ts +150 -5
  529. package/dist/quickstart/coding-seed.d.ts +14 -3
  530. package/dist/quickstart/coding-seed.js +213 -4
  531. package/dist/quickstart/index.d.ts +5 -0
  532. package/dist/quickstart/index.js +21 -0
  533. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  534. package/dist/quickstart/reviewer-prompt.js +6 -6
  535. package/dist/quickstart-images.json +1 -1
  536. package/dist/sandbox/eval-core.d.ts +12 -2
  537. package/dist/sandbox/eval-core.js +20 -4
  538. package/dist/sandbox/generated/zod.bundle.js +62 -1
  539. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  540. package/dist/sandbox/host-functions.d.ts +5 -0
  541. package/dist/sandbox/host-functions.js +13 -13
  542. package/dist/sandbox/limits.d.ts +4 -1
  543. package/dist/sandbox/limits.js +4 -1
  544. package/dist/sandbox/run-in-sandbox.d.ts +6 -0
  545. package/dist/sandbox/run-in-sandbox.js +14 -2
  546. package/dist/sandbox/safe-fetch.d.ts +2 -0
  547. package/dist/sandbox/safe-fetch.js +1 -1
  548. package/dist/sandbox/secret-broker.d.ts +1 -0
  549. package/dist/sandbox/secret-broker.js +4 -5
  550. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  551. package/dist/sandbox/tool-timeout.d.ts +32 -0
  552. package/dist/sandbox/tool-timeout.js +52 -0
  553. package/dist/sandbox/user-tool.d.ts +8 -1
  554. package/dist/sandbox/user-tool.js +9 -3
  555. package/dist/sandbox/zod-params.d.ts +37 -5
  556. package/dist/sandbox/zod-params.js +181 -26
  557. package/dist/serve.js +8 -1
  558. package/dist/viewer/api-schema.d.ts +349 -2627
  559. package/dist/viewer/api-schema.js +7 -0
  560. package/dist/viewer/build-schemas.js +6 -2
  561. package/dist/viewer/graph.js +2 -1
  562. package/dist/viewer/openapi.js +2 -4
  563. package/dist/wardby-bin.js +15 -0
  564. package/docs/README.md +11 -1
  565. package/docs/agent-recipes.md +95 -24
  566. package/docs/architecture-runtime.md +1 -1
  567. package/docs/claude-code-plugin.md +164 -0
  568. package/docs/code-review-agents.md +557 -41
  569. package/docs/coding-agent-setup.md +566 -8
  570. package/docs/coding-packages.md +1033 -90
  571. package/docs/coding-services.md +27 -12
  572. package/docs/coding-worker-byo-images.md +24 -2
  573. package/docs/coding-worker-isolation.md +183 -37
  574. package/docs/debugging-agent-runs.md +242 -0
  575. package/docs/getting-started-gke.md +129 -141
  576. package/docs/getting-started-identity-provider.md +53 -38
  577. package/docs/getting-started.md +17 -0
  578. package/docs/host-providers.md +294 -0
  579. package/docs/jira-agents.md +17 -8
  580. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  581. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  582. package/docs/knowledge/delegation-admission-slots.md +52 -0
  583. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  584. package/docs/knowledge/import-rename-target.md +52 -0
  585. package/docs/knowledge/index.md +57 -0
  586. package/docs/knowledge/log.md +9 -0
  587. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  588. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  589. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  590. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  591. package/docs/knowledge/overview-cli.md +74 -0
  592. package/docs/knowledge/overview-coding-proxy.md +72 -0
  593. package/docs/knowledge/overview-coding.md +72 -0
  594. package/docs/knowledge/overview-config.md +60 -0
  595. package/docs/knowledge/overview-core.md +72 -0
  596. package/docs/knowledge/overview-deploy.md +83 -0
  597. package/docs/knowledge/overview-mcp.md +61 -0
  598. package/docs/knowledge/overview-prisma.md +72 -0
  599. package/docs/knowledge/overview-providers.md +89 -0
  600. package/docs/knowledge/overview-sandbox.md +83 -0
  601. package/docs/knowledge/overview-surfaces.md +83 -0
  602. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  603. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  604. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  605. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  606. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  607. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  608. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  609. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  610. package/docs/knowledge/warm-input-publication.md +30 -0
  611. package/docs/knowledge/workspace-staging-failure.md +54 -0
  612. package/docs/knowledge.md +54 -14
  613. package/docs/mcp-servers.md +254 -0
  614. package/docs/native-sandbox.md +143 -31
  615. package/docs/observability.md +4 -0
  616. package/docs/security-deployment.md +139 -29
  617. package/docs/slack-notifications.md +35 -19
  618. package/docs/tool-secrets.md +45 -10
  619. package/docs/viewer-api.md +6 -0
  620. package/docs/viewer-api.openapi.yml +1 -1
  621. package/help/admin-viewer.md +28 -2
  622. package/help/agent-recipes.md +33 -2
  623. package/help/architecture-agent.md +11 -6
  624. package/help/brokered-secrets.md +3 -0
  625. package/help/build-claude-code-image.md +1 -1
  626. package/help/build-worker-image.md +3 -1
  627. package/help/builder-agent.md +19 -6
  628. package/help/claude-code-run-pane.md +40 -0
  629. package/help/code-review-agents.md +177 -6
  630. package/help/coding-packages.md +156 -6
  631. package/help/cost-attribution.md +9 -5
  632. package/help/creating-agents.md +14 -1
  633. package/help/dependency-cache.md +143 -0
  634. package/help/deploy-gke.md +15 -8
  635. package/help/errors/budget-exhausted.md +187 -0
  636. package/help/errors/budget-group-exhausted.md +5 -1
  637. package/help/errors/coding-mcp-pins-unavailable.md +35 -0
  638. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  639. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  640. package/help/errors/continuation-closed.md +9 -12
  641. package/help/errors/database-auth-invalid.md +1 -1
  642. package/help/errors/delegation-conflict.md +24 -0
  643. package/help/errors/file-list-truncated.md +45 -0
  644. package/help/errors/full-read-required.md +49 -0
  645. package/help/errors/github-account-not-allowed.md +4 -0
  646. package/help/errors/graph-incomplete.md +43 -0
  647. package/help/errors/graph-limit.md +43 -0
  648. package/help/errors/host-provider-error.md +40 -0
  649. package/help/errors/host-tool-failed.md +36 -0
  650. package/help/errors/mcp-call-limit.md +22 -0
  651. package/help/errors/mcp-call-timeout.md +22 -0
  652. package/help/errors/mcp-server-auth-failed.md +22 -0
  653. package/help/errors/mcp-server-credentials-unavailable.md +45 -0
  654. package/help/errors/mcp-server-error.md +28 -0
  655. package/help/errors/mcp-server-unreachable.md +22 -0
  656. package/help/errors/mcp-servers-off.md +21 -0
  657. package/help/errors/mcp-tool-not-allowed.md +26 -0
  658. package/help/errors/mcp-tool-removed.md +22 -0
  659. package/help/errors/mcp-unavailable.md +25 -0
  660. package/help/errors/merge-conflict.md +49 -0
  661. package/help/errors/native-sandbox-capacity.md +1 -1
  662. package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
  663. package/help/errors/native-sandbox-docker-failed.md +1 -1
  664. package/help/errors/native-sandbox-gateway-error.md +20 -0
  665. package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
  666. package/help/errors/native-sandbox-image-not-pinned.md +1 -1
  667. package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
  668. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  669. package/help/errors/native-sandbox-network-unenforced.md +1 -1
  670. package/help/errors/native-sandbox-requires-catalog.md +1 -1
  671. package/help/errors/native-sandbox-unavailable.md +1 -1
  672. package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
  673. package/help/errors/native-sandbox-worker-exited.md +4 -3
  674. package/help/errors/native-sandbox-worker-lost.md +1 -1
  675. package/help/errors/native-sandbox-worker-unready.md +1 -1
  676. package/help/errors/package-not-allowed-pending.md +52 -0
  677. package/help/errors/package-not-allowed.md +51 -0
  678. package/help/errors/package-refusals.md +43 -0
  679. package/help/errors/patch-cursor-malformed.md +31 -0
  680. package/help/errors/repository-not-listed.md +36 -0
  681. package/help/errors/repository-required.md +36 -0
  682. package/help/errors/run-lost.md +39 -0
  683. package/help/errors/run-transcript-download.md +44 -0
  684. package/help/errors/secret-in-value.md +69 -0
  685. package/help/errors/target-merge.md +40 -0
  686. package/help/errors/tool-timeout.md +38 -0
  687. package/help/fix-merge-conflicts.md +73 -0
  688. package/help/github-app-setup.md +132 -0
  689. package/help/github.md +22 -0
  690. package/help/host-providers.md +40 -0
  691. package/help/identity-and-access.md +6 -1
  692. package/help/jira.md +23 -6
  693. package/help/knowledge.md +16 -7
  694. package/help/local-repositories.md +1 -1
  695. package/help/low-power-mode.md +7 -1
  696. package/help/mcp-servers.md +73 -0
  697. package/help/mcp.md +7 -2
  698. package/help/merge-order-check.md +5 -0
  699. package/help/native-capabilities.md +55 -1
  700. package/help/native-sandbox.md +16 -2
  701. package/help/operating-agents.md +21 -0
  702. package/help/package-audit-mode.md +91 -0
  703. package/help/related-pull-requests.md +17 -10
  704. package/help/repo-instructions-and-skills.md +3 -1
  705. package/help/resume-runs-locally.md +134 -0
  706. package/help/review-fix-rounds.md +33 -1
  707. package/help/sharing-agents.md +59 -0
  708. package/help/slack-notifications.md +19 -5
  709. package/help/status-comments.md +31 -0
  710. package/help/stop-run.md +58 -0
  711. package/help/troubleshooting/budgets.md +28 -0
  712. package/help/troubleshooting/coding-workers.md +86 -7
  713. package/help/troubleshooting/debugging-agent-runs.md +29 -0
  714. package/package.json +18 -10
  715. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  716. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  717. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  718. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  719. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  720. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  721. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  722. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  723. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  724. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  725. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  726. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  727. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  728. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  729. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  730. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  731. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  732. package/prisma/migrations/20261102000000_host_providers/migration.sql +56 -0
  733. package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
  734. package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
  735. package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
  736. package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
  737. package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
  738. package/prisma/schema.prisma +468 -109
  739. package/scripts/git-askpass.sh +1 -1
  740. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -1,4 +1,5 @@
1
1
  import { createConnection } from "node:net";
2
+ import { BUDGET_MEASURE_TIMEOUT_MS, DEFAULT_TIMEOUTS, dependencyCacheTimeLimit, } from "../coding-worker/dependency-cache.mjs";
2
3
  /** Where the tool runner listens (claude-tool-runner/main.mjs) and the relay connects (tool-relay.ts). */
3
4
  export const TOOL_SOCKET_PATH = "/run/wardby/tool/runner.sock";
4
5
  /**
@@ -24,3 +25,113 @@ export async function assertToolRunnerReachable(socketPath = TOOL_SOCKET_PATH, t
24
25
  });
25
26
  });
26
27
  }
28
+ /** The tool runner's internal tool (claude-tool-runner/main.mjs); the agent's SDK options disallow it (sdk.ts). */
29
+ export const PREPARE_DEPENDENCIES_TOOL = "wardby_prepare_dependencies";
30
+ /** Room for the tool runner and the socket on top of the module's own bounds. */
31
+ const PREPARE_DEPENDENCIES_MARGIN_MS = 60_000;
32
+ /**
33
+ * Derived from the dependency cache's own bounds (dependency-cache.mjs, the same file the tool runner
34
+ * runs): the budget walk, then the whole prepare (totalMs) and its settle grace, plus a margin. A
35
+ * worker that stops waiting earlier is still safe: the tool runner holds the first command until
36
+ * the cache has finished, and seals before it.
37
+ */
38
+ export const PREPARE_DEPENDENCIES_TIMEOUT_MS = BUDGET_MEASURE_TIMEOUT_MS + DEFAULT_TIMEOUTS.totalMs + DEFAULT_TIMEOUTS.settleMs + PREPARE_DEPENDENCIES_MARGIN_MS;
39
+ const MAX_RESPONSE_LINE_BYTES = 256 * 1024;
40
+ /** How long the worker waits for the prepare tool on a run with this deadline. */
41
+ export function prepareDependenciesTimeoutMs(deadlineAt, now = Date.now()) {
42
+ if (deadlineAt === undefined)
43
+ return PREPARE_DEPENDENCIES_TIMEOUT_MS;
44
+ return Math.min(PREPARE_DEPENDENCIES_TIMEOUT_MS, dependencyCacheTimeLimit(deadlineAt, now) + DEFAULT_TIMEOUTS.settleMs + PREPARE_DEPENDENCIES_MARGIN_MS);
45
+ }
46
+ /**
47
+ * The worker's one call to the tool runner on a dependency-cache run, before the agent starts: a
48
+ * minimal MCP client (newline-delimited JSON-RPC, as the relay carries) that initializes and calls
49
+ * PREPARE_DEPENDENCIES_TOOL once. Resolves with the tool's JSON (unchecked: the caller bounds it).
50
+ * Fails only with `dependency_cache_tool_unavailable` (a tool runner without the tool) or
51
+ * `dependency_cache_tool_failed`; never with the tool runner's text.
52
+ */
53
+ export async function callPrepareDependencies({ socketPath = TOOL_SOCKET_PATH, deadlineAt, timeoutMs = prepareDependenciesTimeoutMs(deadlineAt), signal, } = {}) {
54
+ const failed = () => new Error("dependency_cache_tool_failed");
55
+ if (signal?.aborted)
56
+ throw failed();
57
+ const socket = createConnection(socketPath);
58
+ socket.setEncoding("utf8");
59
+ const pending = new Map();
60
+ let buffered = "";
61
+ let settle;
62
+ const broken = new Promise((_, reject) => {
63
+ settle = reject;
64
+ });
65
+ // Every waiter races `broken`; keep an unobserved rejection from surfacing.
66
+ broken.catch(() => undefined);
67
+ const fail = (error) => settle?.(error);
68
+ const timer = setTimeout(() => fail(failed()), timeoutMs);
69
+ const onAbort = () => fail(failed());
70
+ signal?.addEventListener("abort", onAbort, { once: true });
71
+ socket.on("error", () => fail(failed()));
72
+ socket.once("close", () => fail(failed()));
73
+ socket.on("data", (chunk) => {
74
+ buffered += chunk;
75
+ let end;
76
+ while ((end = buffered.indexOf("\n")) >= 0) {
77
+ const line = buffered.slice(0, end);
78
+ buffered = buffered.slice(end + 1);
79
+ let message;
80
+ try {
81
+ message = JSON.parse(line);
82
+ }
83
+ catch {
84
+ fail(failed());
85
+ return;
86
+ }
87
+ if (typeof message?.id === "number")
88
+ pending.get(message.id)?.resolve(message);
89
+ }
90
+ if (Buffer.byteLength(buffered) > MAX_RESPONSE_LINE_BYTES)
91
+ fail(failed());
92
+ });
93
+ let nextId = 0;
94
+ const request = (method, params) => {
95
+ const id = ++nextId;
96
+ const answered = new Promise((resolve) => pending.set(id, { resolve }));
97
+ socket.write(`${JSON.stringify({ jsonrpc: "2.0", id, method, params })}\n`);
98
+ return Promise.race([answered, broken]);
99
+ };
100
+ try {
101
+ await Promise.race([new Promise((resolve) => socket.once("connect", () => resolve())), broken]);
102
+ const initialized = await request("initialize", {
103
+ protocolVersion: "2025-03-26",
104
+ capabilities: {},
105
+ clientInfo: { name: "wardby-claude-worker", version: "1.0.0" },
106
+ });
107
+ if (!initialized.result)
108
+ throw failed();
109
+ socket.write(`${JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized" })}\n`);
110
+ const called = await request("tools/call", {
111
+ name: PREPARE_DEPENDENCIES_TOOL,
112
+ arguments: deadlineAt === undefined ? {} : { deadline_at: deadlineAt },
113
+ });
114
+ const result = called.result;
115
+ if (called.error || !result || result.isError)
116
+ throw new Error("dependency_cache_tool_unavailable");
117
+ const text = result.content?.find((item) => item.type === "text")?.text;
118
+ if (typeof text !== "string")
119
+ throw failed();
120
+ try {
121
+ return JSON.parse(text);
122
+ }
123
+ catch {
124
+ throw failed();
125
+ }
126
+ }
127
+ catch (error) {
128
+ if (error instanceof Error && error.message === "dependency_cache_tool_unavailable")
129
+ throw error;
130
+ throw failed();
131
+ }
132
+ finally {
133
+ clearTimeout(timer);
134
+ signal?.removeEventListener("abort", onAbort);
135
+ socket.destroy();
136
+ }
137
+ }
@@ -0,0 +1,18 @@
1
+ export declare const TRANSCRIPT_OUTPUT_PATH = "/run/wardby/output/session.jsonl";
2
+ interface WriteOptions {
3
+ configDir: string;
4
+ sessionId: string;
5
+ outputPath: string;
6
+ /** Used when Claude Code wrote no title (the worker turns off the background call that makes one). */
7
+ title?: string;
8
+ }
9
+ /** "wardby run <runId>: <first line of the request>", for the session picker. */
10
+ export declare function runTitle(runId: string, task: string): string;
11
+ /**
12
+ * Writes the run's sanitised session transcript next to its result, for the control plane to collect
13
+ * (it sanitises and redacts again before storing anything). Writes nothing when the SDK left no
14
+ * session file. Throws only fixed codes.
15
+ */
16
+ export declare function writeWorkerTranscript(options: WriteOptions): Promise<void>;
17
+ export declare function writeWorkerTranscriptWithLimit(options: WriteOptions, maxBytes: number): Promise<void>;
18
+ export {};
@@ -0,0 +1,77 @@
1
+ import { readdir, rename, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { readBoundedRegularFile } from "../coding-worker/artifact.js";
4
+ import { sanitizeClaudeTranscript } from "../coding/transcript/claude-code.js";
5
+ import { formatTranscriptFile, MAX_RAW_TRANSCRIPT_BYTES, MAX_TRANSCRIPT_BYTES, } from "../coding/transcript/format.js";
6
+ export const TRANSCRIPT_OUTPUT_PATH = "/run/wardby/output/session.jsonl";
7
+ const MAX_TITLE_CHARS = 80;
8
+ /** "wardby run <runId>: <first line of the request>", for the session picker. */
9
+ export function runTitle(runId, task) {
10
+ const request = task.includes("\n\nRequest:\n") ? task.slice(task.lastIndexOf("\n\nRequest:\n") + 11) : task;
11
+ const firstLine = request.split("\n").find((line) => line.trim()) ?? "";
12
+ const title = `wardby run ${runId}: ${firstLine.trim().replace(/\s+/g, " ")}`;
13
+ return title.length > MAX_TITLE_CHARS ? `${title.slice(0, MAX_TITLE_CHARS - 1)}…` : title;
14
+ }
15
+ /**
16
+ * Writes the run's sanitised session transcript next to its result, for the control plane to collect
17
+ * (it sanitises and redacts again before storing anything). Writes nothing when the SDK left no
18
+ * session file. Throws only fixed codes.
19
+ */
20
+ export function writeWorkerTranscript(options) {
21
+ return writeWorkerTranscriptWithLimit(options, MAX_TRANSCRIPT_BYTES);
22
+ }
23
+ export async function writeWorkerTranscriptWithLimit(options, maxBytes) {
24
+ const source = await findSessionFile(options.configDir, options.sessionId);
25
+ if (!source)
26
+ return;
27
+ const header = (status) => ({
28
+ type: "wardby-transcript",
29
+ version: 1,
30
+ provider: "claude-code",
31
+ sessionId: options.sessionId,
32
+ status,
33
+ });
34
+ let file;
35
+ try {
36
+ const raw = await readBoundedRegularFile(source, MAX_RAW_TRANSCRIPT_BYTES, "transcript_too_large");
37
+ const sanitized = sanitizeClaudeTranscript(raw, options.title);
38
+ file = sanitized
39
+ ? formatTranscriptFile(header("ok"), sanitized.lines)
40
+ : formatTranscriptFile(header("no_complete_turn"), []);
41
+ }
42
+ catch (error) {
43
+ if (!(error instanceof Error && error.message === "transcript_too_large")) {
44
+ throw new Error("transcript_capture_failed", { cause: error });
45
+ }
46
+ file = formatTranscriptFile(header("too_large"), []);
47
+ }
48
+ if (Buffer.byteLength(file) > maxBytes)
49
+ file = formatTranscriptFile(header("too_large"), []);
50
+ const temporary = `${options.outputPath}.tmp`;
51
+ await writeFile(temporary, file, { mode: 0o600 });
52
+ await rename(temporary, options.outputPath);
53
+ }
54
+ const SESSION_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
55
+ /** The SDK's file for this session: <configDir>/projects/<encoded cwd>/<sessionId>.jsonl. */
56
+ async function findSessionFile(configDir, sessionId) {
57
+ // The id comes from the SDK's init message; only a UUID is ever used to build a path.
58
+ if (!SESSION_ID.test(sessionId))
59
+ return undefined;
60
+ const projects = join(configDir, "projects");
61
+ const name = `${sessionId}.jsonl`;
62
+ let entries;
63
+ try {
64
+ entries = await readdir(projects, { withFileTypes: true });
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ for (const entry of entries) {
70
+ if (!entry.isDirectory())
71
+ continue;
72
+ const files = await readdir(join(projects, entry.name)).catch(() => []);
73
+ if (files.includes(name))
74
+ return join(projects, entry.name, name);
75
+ }
76
+ return undefined;
77
+ }
@@ -0,0 +1,61 @@
1
+ export declare const PLUGIN = "wardby-runs";
2
+ export declare const DEFAULT_MARKETPLACE = "wardby/wardby";
3
+ export declare const MCP_SERVER = "wardby";
4
+ /** The pane's read-only tools on a server: what auto mode needs allowed. stop_run is never added: it changes a run. */
5
+ export declare function paneTools(server: string): string[];
6
+ export declare const PANE_TOOLS: string[];
7
+ export declare const CLAUDE_PLUGIN_USAGE = "usage: wardby claude-plugin install [--marketplace <owner/repo|path>] [--server-url <url>]\n [--allow-tools | --no-allow-tools] [--fullscreen] [--yes]\n wardby claude-plugin uninstall\n wardby claude-plugin status\n\nSet up the wardby-runs Claude Code plugin: a pane listing your wardby runs.\n\n --server-name <name> The MCP server the pane uses, as /mcp lists it (default wardby); its\n allow rules follow the name\n --marketplace <src> Where to install it from (default wardby/wardby; an operator's own\n marketplace repository or a local folder works too)\n --server-url <url> Register the wardby MCP server at this URL first (for example\n https://wardby.example.com/mcp) when Claude Code has none named wardby\n --allow-tools Allow the pane's read-only wardby tools for auto mode without asking\n --no-allow-tools Leave permission rules alone\n --fullscreen Also switch Claude Code's terminal to its fullscreen view, where the pane\n is a side bar that takes clicks (applies to every session)\n --yes, -y Answer yes to every question";
8
+ /** The record of what install changed, so uninstall removes exactly that. */
9
+ export type InstallRecord = {
10
+ settingsPath: string;
11
+ rules: string[];
12
+ tui: boolean;
13
+ };
14
+ export type ClaudePluginDeps = {
15
+ /** Runs a command; resolves its exit code and output. */
16
+ run: (command: string, args: string[]) => {
17
+ status: number;
18
+ stdout: string;
19
+ stderr: string;
20
+ };
21
+ /** Asks a yes/no question; false when there's nobody to ask. */
22
+ confirm: (question: string) => Promise<boolean>;
23
+ /** Where Claude Code keeps its settings: CLAUDE_CONFIG_DIR, else ~/.claude. */
24
+ claudeConfigDir: string;
25
+ /** Where wardby keeps the install record: ~/.wardby. */
26
+ wardbyDir: string;
27
+ out: (line: string) => void;
28
+ };
29
+ /** The real machine: spawns `claude`, asks on the terminal, uses CLAUDE_CONFIG_DIR or ~/.claude. */
30
+ export declare function claudePluginDeps(): ClaudePluginDeps;
31
+ export declare function installPlugin(options: {
32
+ marketplace: string;
33
+ serverName?: string;
34
+ serverUrl?: string;
35
+ allowTools?: boolean;
36
+ fullscreen: boolean;
37
+ yes: boolean;
38
+ }, deps: ClaudePluginDeps): Promise<number>;
39
+ export declare function uninstallPlugin(deps: ClaudePluginDeps): Promise<number>;
40
+ export declare function pluginStatus(deps: ClaudePluginDeps, serverName?: string): number;
41
+ /**
42
+ * Quickstart's offer of the pane, once it connected Claude Code: asks unless a flag answered it,
43
+ * never in a non-interactive run, and installs on a yes. A failed install is a warning, not a stop.
44
+ */
45
+ export declare function quickstartPaneStep(options: {
46
+ client: string;
47
+ mcpConfigured: boolean;
48
+ flag?: boolean;
49
+ nonInteractive: boolean;
50
+ yes: boolean;
51
+ }, steps: {
52
+ ask: (question: string) => Promise<boolean>;
53
+ install: (options: Parameters<typeof installPlugin>[0]) => Promise<number>;
54
+ warn: (line: string) => void;
55
+ }): Promise<"skipped" | "installed" | "failed">;
56
+ /**
57
+ * `wardby doctor`'s lines for the pane: none without Claude Code. The pane is optional, so nothing
58
+ * here is a failure (✗): a missing plugin is "○", a missing server or rule a warning ("!").
59
+ */
60
+ export declare function claudePluginDoctorLines(deps: ClaudePluginDeps, serverName?: string): string[];
61
+ export declare function claudePluginCommand(args: string[], deps?: ClaudePluginDeps): Promise<number>;
@@ -0,0 +1,376 @@
1
+ /**
2
+ * `wardby claude-plugin install | uninstall | status`: sets up the wardby-runs
3
+ * Claude Code plugin (plugins/claude-code) on this machine. Install adds the
4
+ * plugin from a marketplace (wardby/wardby by default, or an operator's own),
5
+ * can register the wardby MCP server, and offers the allow rules auto mode
6
+ * needs for the pane's read-only tools. Uninstall removes the plugin and only
7
+ * the settings install added. Status reports all three.
8
+ *
9
+ * Runs without a database or any server configuration. It prints the commands
10
+ * it runs and their outcome, never a token: the MCP server's sign-in is Claude
11
+ * Code's own, at first use.
12
+ */
13
+ import { spawnSync } from "node:child_process";
14
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
15
+ import { homedir } from "node:os";
16
+ import { dirname, join } from "node:path";
17
+ import { createInterface } from "node:readline";
18
+ import { parseArgs } from "node:util";
19
+ export const PLUGIN = "wardby-runs";
20
+ export const DEFAULT_MARKETPLACE = "wardby/wardby";
21
+ export const MCP_SERVER = "wardby";
22
+ /** The pane's read-only tools on a server: what auto mode needs allowed. stop_run is never added: it changes a run. */
23
+ export function paneTools(server) {
24
+ return ["list_runs", "list_agents", "get_run", "get_run_transcript"].map((tool) => `mcp__${server}__${tool}`);
25
+ }
26
+ export const PANE_TOOLS = paneTools(MCP_SERVER);
27
+ /** How long one `claude` call may take: `claude mcp get` can check its server, which shouldn't stall doctor. */
28
+ const CLAUDE_TIMEOUT_MS = 20_000;
29
+ export const CLAUDE_PLUGIN_USAGE = `usage: wardby claude-plugin install [--marketplace <owner/repo|path>] [--server-url <url>]
30
+ [--allow-tools | --no-allow-tools] [--fullscreen] [--yes]
31
+ wardby claude-plugin uninstall
32
+ wardby claude-plugin status
33
+
34
+ Set up the wardby-runs Claude Code plugin: a pane listing your wardby runs.
35
+
36
+ --server-name <name> The MCP server the pane uses, as /mcp lists it (default ${MCP_SERVER}); its
37
+ allow rules follow the name
38
+ --marketplace <src> Where to install it from (default ${DEFAULT_MARKETPLACE}; an operator's own
39
+ marketplace repository or a local folder works too)
40
+ --server-url <url> Register the wardby MCP server at this URL first (for example
41
+ https://wardby.example.com/mcp) when Claude Code has none named ${MCP_SERVER}
42
+ --allow-tools Allow the pane's read-only wardby tools for auto mode without asking
43
+ --no-allow-tools Leave permission rules alone
44
+ --fullscreen Also switch Claude Code's terminal to its fullscreen view, where the pane
45
+ is a side bar that takes clicks (applies to every session)
46
+ --yes, -y Answer yes to every question`;
47
+ /** The real machine: spawns `claude`, asks on the terminal, uses CLAUDE_CONFIG_DIR or ~/.claude. */
48
+ export function claudePluginDeps() {
49
+ return {
50
+ run: (command, args) => {
51
+ const result = spawnSync(command, args, { encoding: "utf8", timeout: CLAUDE_TIMEOUT_MS });
52
+ return {
53
+ status: result.error ? 127 : (result.status ?? 1),
54
+ stdout: result.stdout ?? "",
55
+ stderr: result.stderr ?? "",
56
+ };
57
+ },
58
+ confirm: async (question) => {
59
+ if (!process.stdin.isTTY)
60
+ return false;
61
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
62
+ try {
63
+ const answer = await new Promise((resolve) => rl.question(`${question} [y/N] `, resolve));
64
+ return /^y(es)?$/i.test(answer.trim());
65
+ }
66
+ finally {
67
+ rl.close();
68
+ }
69
+ },
70
+ claudeConfigDir: process.env.CLAUDE_CONFIG_DIR?.trim() || join(homedir(), ".claude"),
71
+ wardbyDir: join(homedir(), ".wardby"),
72
+ out: (line) => process.stdout.write(`${line}\n`),
73
+ };
74
+ }
75
+ const recordPath = (deps) => join(deps.wardbyDir, "claude-plugin.json");
76
+ /** A settings file as an object: {} when absent; refuses a file that isn't a JSON object rather than overwrite it. */
77
+ function readSettings(path) {
78
+ if (!existsSync(path))
79
+ return {};
80
+ const text = readFileSync(path, "utf8");
81
+ let parsed;
82
+ try {
83
+ parsed = JSON.parse(text);
84
+ }
85
+ catch {
86
+ throw new Error(`${path} isn't valid JSON; fix it, then run this again. Nothing was changed.`);
87
+ }
88
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
89
+ throw new Error(`${path} isn't a JSON object; nothing was changed.`);
90
+ }
91
+ return parsed;
92
+ }
93
+ /** Writes a settings file whole, through a temporary file, so a failure never leaves half a file. */
94
+ function writeSettings(path, settings) {
95
+ mkdirSync(dirname(path), { recursive: true });
96
+ const temp = `${path}.wardby-${process.pid}.tmp`;
97
+ writeFileSync(temp, `${JSON.stringify(settings, null, 2)}\n`, { mode: 0o600 });
98
+ renameSync(temp, path);
99
+ }
100
+ function allowList(settings) {
101
+ const permissions = settings.permissions;
102
+ if (typeof permissions !== "object" || permissions === null)
103
+ return [];
104
+ const allow = permissions.allow;
105
+ return Array.isArray(allow) ? allow.filter((rule) => typeof rule === "string") : [];
106
+ }
107
+ function withAllowList(settings, allow) {
108
+ const permissions = typeof settings.permissions === "object" && settings.permissions !== null
109
+ ? settings.permissions
110
+ : {};
111
+ return { ...settings, permissions: { ...permissions, allow } };
112
+ }
113
+ function readRecord(deps) {
114
+ try {
115
+ const record = JSON.parse(readFileSync(recordPath(deps), "utf8"));
116
+ return typeof record.settingsPath === "string" && Array.isArray(record.rules) ? record : null;
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ function claudeAvailable(deps) {
123
+ return deps.run("claude", ["--version"]).status === 0;
124
+ }
125
+ function hasMcpServer(deps, server = MCP_SERVER) {
126
+ return deps.run("claude", ["mcp", "get", server]).status === 0;
127
+ }
128
+ function pluginInstalled(deps) {
129
+ const list = deps.run("claude", ["plugin", "list"]);
130
+ return list.status === 0 && new RegExp(`\\b${PLUGIN}@`).test(list.stdout);
131
+ }
132
+ /** The first line of a failed command's output, for the message. */
133
+ const firstLine = (result) => (result.stderr || result.stdout).trim().split("\n")[0]?.slice(0, 300) ?? "";
134
+ export async function installPlugin(options, deps) {
135
+ if (!claudeAvailable(deps)) {
136
+ deps.out("Claude Code (claude) wasn't found on PATH. Install it, then run this again.");
137
+ return 1;
138
+ }
139
+ const server = options.serverName ?? MCP_SERVER;
140
+ if (!/^[A-Za-z0-9_-]{1,64}$/.test(server)) {
141
+ deps.out(`--server-name "${server}" isn't a server name (letters, digits, - and _).`);
142
+ return 1;
143
+ }
144
+ const tools = paneTools(server);
145
+ // Read the settings file before changing anything, so a broken one stops the install cleanly.
146
+ const settingsPath = join(deps.claudeConfigDir, "settings.json");
147
+ let settings;
148
+ try {
149
+ settings = readSettings(settingsPath);
150
+ }
151
+ catch (error) {
152
+ deps.out(error instanceof Error ? error.message : String(error));
153
+ return 1;
154
+ }
155
+ // 1. The MCP server the pane talks to.
156
+ if (hasMcpServer(deps, server)) {
157
+ deps.out(`✓ Claude Code has an MCP server named ${server}.`);
158
+ }
159
+ else if (options.serverUrl) {
160
+ let url;
161
+ try {
162
+ url = new URL(options.serverUrl);
163
+ }
164
+ catch {
165
+ deps.out(`--server-url "${options.serverUrl}" isn't a URL.`);
166
+ return 1;
167
+ }
168
+ if (url.protocol !== "https:" &&
169
+ !(url.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname))) {
170
+ deps.out("--server-url must be https (or http on localhost).");
171
+ return 1;
172
+ }
173
+ const added = deps.run("claude", ["mcp", "add", "--transport", "http", "--scope", "user", server, url.href]);
174
+ if (added.status !== 0) {
175
+ deps.out(`Adding the ${server} MCP server failed: ${firstLine(added)}`);
176
+ return 1;
177
+ }
178
+ deps.out(`✓ Added the ${server} MCP server (${url.href}). Sign in with /mcp in Claude Code.`);
179
+ }
180
+ else {
181
+ deps.out(`! Claude Code has no MCP server named ${server}. The pane needs one: run this again with ` +
182
+ "--server-url <your wardby URL>/mcp, or run `wardby quickstart`.");
183
+ }
184
+ // 2. The plugin itself.
185
+ const installed = deps.run("claude", ["plugin", "install", PLUGIN, "--marketplace", options.marketplace]);
186
+ if (installed.status !== 0) {
187
+ deps.out(`Installing the ${PLUGIN} plugin from ${options.marketplace} failed: ${firstLine(installed)}`);
188
+ return 1;
189
+ }
190
+ deps.out(`✓ Installed the ${PLUGIN} plugin from ${options.marketplace}.`);
191
+ // 3. Allow rules for auto mode, and the fullscreen view: each only when asked for or agreed to.
192
+ const record = readRecord(deps) ?? { settingsPath, rules: [], tui: false };
193
+ let changed = false;
194
+ const allowTools = options.allowTools ??
195
+ (options.yes ||
196
+ (await deps.confirm(`Allow the pane's read-only wardby tools (${tools.map((t) => t.replace(`mcp__${server}__`, "")).join(", ")}) ` +
197
+ `in ${settingsPath}? Auto mode refuses the pane's calls without them.`)));
198
+ if (allowTools) {
199
+ const current = allowList(settings);
200
+ const missing = tools.filter((rule) => !current.includes(rule));
201
+ if (missing.length > 0) {
202
+ settings = withAllowList(settings, [...current, ...missing]);
203
+ record.rules = [...new Set([...record.rules, ...missing])];
204
+ changed = true;
205
+ deps.out(`✓ Allowed ${missing.join(", ")}.`);
206
+ }
207
+ else {
208
+ deps.out("✓ The pane's tools are already allowed.");
209
+ }
210
+ }
211
+ else {
212
+ deps.out(`Left permission rules alone. Under auto mode, allow ${tools.join(", ")} in /permissions.`);
213
+ }
214
+ if (options.fullscreen && settings.tui !== "fullscreen") {
215
+ settings = { ...settings, tui: "fullscreen" };
216
+ record.tui = true;
217
+ changed = true;
218
+ deps.out("✓ Switched Claude Code to its fullscreen view (restart Claude Code to see it).");
219
+ }
220
+ if (changed) {
221
+ writeSettings(settingsPath, settings);
222
+ mkdirSync(deps.wardbyDir, { recursive: true });
223
+ writeFileSync(recordPath(deps), `${JSON.stringify({ ...record, settingsPath }, null, 2)}\n`, { mode: 0o600 });
224
+ }
225
+ deps.out("Open the pane in Claude Code with /wardby-runs (in a new session, or after /reload-plugins).");
226
+ return 0;
227
+ }
228
+ export async function uninstallPlugin(deps) {
229
+ if (!claudeAvailable(deps)) {
230
+ deps.out("Claude Code (claude) wasn't found on PATH.");
231
+ return 1;
232
+ }
233
+ const removed = deps.run("claude", ["plugin", "uninstall", PLUGIN]);
234
+ if (removed.status === 0)
235
+ deps.out(`✓ Uninstalled the ${PLUGIN} plugin.`);
236
+ else
237
+ deps.out(`The ${PLUGIN} plugin wasn't uninstalled: ${firstLine(removed)}`);
238
+ // Only what install added: rules it added, and the fullscreen view if it switched it on. The file is
239
+ // written only when one of those is still there; a broken file is reported, not rewritten.
240
+ const record = readRecord(deps);
241
+ if (record && existsSync(record.settingsPath)) {
242
+ let settings;
243
+ try {
244
+ settings = readSettings(record.settingsPath);
245
+ }
246
+ catch (error) {
247
+ deps.out(`${error instanceof Error ? error.message : String(error)} Remove ${record.rules.join(", ")} yourself.`);
248
+ return 1;
249
+ }
250
+ const current = allowList(settings);
251
+ const kept = current.filter((rule) => !record.rules.includes(rule));
252
+ let changed = false;
253
+ if (kept.length !== current.length) {
254
+ settings = withAllowList(settings, kept);
255
+ changed = true;
256
+ deps.out(`✓ Removed the rules install added: ${current.filter((rule) => !kept.includes(rule)).join(", ")}.`);
257
+ }
258
+ if (record.tui && settings.tui === "fullscreen") {
259
+ const { tui: _tui, ...rest } = settings;
260
+ settings = rest;
261
+ changed = true;
262
+ deps.out("✓ Switched the fullscreen view back off.");
263
+ }
264
+ if (changed)
265
+ writeSettings(record.settingsPath, settings);
266
+ }
267
+ if (record)
268
+ writeFileSync(recordPath(deps), "{}\n", { mode: 0o600 });
269
+ deps.out(`The ${MCP_SERVER} MCP server was left in place (remove it with: claude mcp remove ${MCP_SERVER} -s user).`);
270
+ return removed.status === 0 ? 0 : 1;
271
+ }
272
+ export function pluginStatus(deps, serverName = MCP_SERVER) {
273
+ if (!claudeAvailable(deps)) {
274
+ deps.out("✗ Claude Code (claude) wasn't found on PATH.");
275
+ return 1;
276
+ }
277
+ const plugin = pluginInstalled(deps);
278
+ const server = hasMcpServer(deps, serverName);
279
+ const settingsPath = join(deps.claudeConfigDir, "settings.json");
280
+ let allowed = [];
281
+ try {
282
+ allowed = allowList(readSettings(settingsPath));
283
+ }
284
+ catch (error) {
285
+ deps.out(`! ${error instanceof Error ? error.message : String(error)}`);
286
+ }
287
+ const missing = paneTools(serverName).filter((rule) => !allowed.includes(rule));
288
+ deps.out(`${plugin ? "✓" : "✗"} ${PLUGIN} plugin ${plugin ? "installed" : "not installed"}`);
289
+ deps.out(`${server ? "✓" : "✗"} ${serverName} MCP server ${server ? "configured" : "not configured"}`);
290
+ deps.out(missing.length === 0
291
+ ? `✓ the pane's tools are allowed in ${settingsPath}`
292
+ : `! not allowed in ${settingsPath} (auto mode refuses them): ${missing.join(", ")}`);
293
+ return plugin && server ? 0 : 1;
294
+ }
295
+ /**
296
+ * Quickstart's offer of the pane, once it connected Claude Code: asks unless a flag answered it,
297
+ * never in a non-interactive run, and installs on a yes. A failed install is a warning, not a stop.
298
+ */
299
+ export async function quickstartPaneStep(options, steps) {
300
+ if (!options.mcpConfigured || (options.client !== "claude" && options.client !== "both"))
301
+ return "skipped";
302
+ const wanted = options.flag ??
303
+ (!options.nonInteractive && (await steps.ask("Add the wardby runs pane to Claude Code (the wardby-runs plugin)?")));
304
+ if (!wanted)
305
+ return "skipped";
306
+ const status = await steps.install({ marketplace: DEFAULT_MARKETPLACE, fullscreen: false, yes: options.yes });
307
+ if (status === 0)
308
+ return "installed";
309
+ steps.warn("! The runs pane wasn't installed; try again with: npx @wardby/cli@latest claude-plugin install");
310
+ return "failed";
311
+ }
312
+ /**
313
+ * `wardby doctor`'s lines for the pane: none without Claude Code. The pane is optional, so nothing
314
+ * here is a failure (✗): a missing plugin is "○", a missing server or rule a warning ("!").
315
+ */
316
+ export function claudePluginDoctorLines(deps, serverName = MCP_SERVER) {
317
+ if (!claudeAvailable(deps))
318
+ return [];
319
+ if (!pluginInstalled(deps)) {
320
+ return [`○ Claude Code runs pane not installed (optional: npx @wardby/cli@latest claude-plugin install)`];
321
+ }
322
+ const lines = [`✓ ${PLUGIN} Claude Code plugin installed`];
323
+ lines.push(hasMcpServer(deps, serverName)
324
+ ? `✓ ${serverName} MCP server configured in Claude Code`
325
+ : `! Claude Code has no MCP server named ${serverName}: the pane has nothing to show (claude-plugin install --server-url <url>)`);
326
+ const settingsPath = join(deps.claudeConfigDir, "settings.json");
327
+ let missing = paneTools(serverName);
328
+ try {
329
+ const allowed = allowList(readSettings(settingsPath));
330
+ missing = paneTools(serverName).filter((rule) => !allowed.includes(rule));
331
+ }
332
+ catch {
333
+ // An unreadable settings file reads as no rules: the warning below says what to allow.
334
+ }
335
+ lines.push(missing.length === 0
336
+ ? "✓ the pane's tools are allowed for auto mode"
337
+ : `! not allowed for auto mode in ${settingsPath}: ${missing.join(", ")} (needed only in auto mode)`);
338
+ return lines;
339
+ }
340
+ export async function claudePluginCommand(args, deps = claudePluginDeps()) {
341
+ const [sub, ...rest] = args;
342
+ if (sub === undefined || sub === "--help" || sub === "-h") {
343
+ deps.out(CLAUDE_PLUGIN_USAGE);
344
+ return sub === undefined ? 1 : 0;
345
+ }
346
+ if (sub === "install") {
347
+ const { values } = parseArgs({
348
+ args: rest,
349
+ allowNegative: true,
350
+ options: {
351
+ marketplace: { type: "string" },
352
+ "server-name": { type: "string" },
353
+ "server-url": { type: "string" },
354
+ "allow-tools": { type: "boolean" },
355
+ fullscreen: { type: "boolean" },
356
+ yes: { type: "boolean", short: "y" },
357
+ },
358
+ });
359
+ return installPlugin({
360
+ marketplace: values.marketplace ?? DEFAULT_MARKETPLACE,
361
+ serverName: values["server-name"],
362
+ serverUrl: values["server-url"],
363
+ allowTools: values["allow-tools"],
364
+ fullscreen: values.fullscreen ?? false,
365
+ yes: values.yes ?? false,
366
+ }, deps);
367
+ }
368
+ if (sub === "uninstall")
369
+ return uninstallPlugin(deps);
370
+ if (sub === "status") {
371
+ const { values } = parseArgs({ args: rest, options: { "server-name": { type: "string" } } });
372
+ return pluginStatus(deps, values["server-name"] ?? MCP_SERVER);
373
+ }
374
+ deps.out(`Unknown claude-plugin command "${sub}".\n${CLAUDE_PLUGIN_USAGE}`);
375
+ return 1;
376
+ }
@@ -1 +1 @@
1
- export declare const CLI_USAGE = "usage:\n wardby quickstart [--provider openai|anthropic] [--model <m>] [--budget <usd>] [--client none|codex|claude|both] [--skip-demo] [--non-interactive --yes]\n wardby doctor\n wardby status\n wardby logs [--tail N] [--follow]\n wardby down [--volumes]\n wardby knowledge check [dir] [--root <dir>] [--strict] [--json] Validate a knowledge bundle (offline)\n wardby help [list]\n wardby help search <terms>\n wardby help open <article-id>\n wardby agent create --name <n> --model <m> --prompt <p> --budget <usd> [--schedule \"<cron>\"] [--timezone <tz>] [--max-turns <n>] [--owner <subject>] [--public] [--native-execution-mode control-plane|sandbox]\n (owned by --owner or LOCAL_PRINCIPAL; --public shares it with everyone at execute;\n sandbox needs NATIVE_SANDBOX_LAUNCHER set in this environment)\n wardby agent list\n wardby agent mode <name> control-plane|sandbox (native agents; applies to runs created after the change)\n wardby agent schedule <name> --cron \"<expr>\" [--timezone <tz>] [--disable]\n wardby tool create --name <n> --description <d> --params <file> --code <file>\n wardby tool attach <tool-name|tool-id> <agent-name> (grants the capabilities in the agent owner's name)\n wardby tool detach <tool-name|tool-id> <agent-name>\n wardby tool update <tool-name|tool-id> [--description <d>] [--params <file>] [--code <file>]\n wardby tool delete <tool-name|tool-id> [--detach]\n wardby tool list [--agent <name>]\n wardby run <name>\n wardby runs [--agent <name>] [--limit N] [--status <s>]\n wardby coding preflight (JOB_LAUNCHER=docker or kubernetes)\n wardby coding cleanup --run-id <id>\n wardby scheduler [--scope default]\n wardby native-gateway (the native sandbox gateway only; NATIVE_GATEWAY_LISTEN, default 0.0.0.0:8790)\n wardby mcp (MCP_TRANSPORT=stdio|http selects the transport)\n wardby serve [--scope default] (mcp + scheduler + reconciler in one process; http only)\n wardby grants migration-report [--json]\n wardby grants adopt-public --owner <subject> [--dry-run] [--keep-everyone-execute]\n wardby grants prune-bindings [--dry-run]\n wardby import <bundle-dir> [--owner <subject>] [--public] [--include-secrets --transfer-key <pem>] [--default-budget <usd>] [--dry-run] [--prefix <p>] [--on-conflict fail|skip|rename] [--allow-open-fetch]\n\noptions:\n -h, --help Show this help\n -v, --version Show the installed Wardby version";
1
+ export declare const CLI_USAGE = "usage:\n wardby quickstart [--provider openai|anthropic] [--model <m>] [--budget <usd>] [--client none|codex|claude|both] [--claude-plugin | --no-claude-plugin] [--skip-demo] [--non-interactive --yes]\n wardby doctor\n wardby status\n wardby logs [--tail N] [--follow]\n wardby down [--volumes]\n wardby knowledge check [dir] [--root <dir>] [--strict] [--json] Validate a knowledge bundle (offline)\n wardby resume - [--dir <path> | --here] [--force] [--print] Continue a coding run's Claude Code session locally (paste the get_run_transcript link)\n wardby claude-plugin install|uninstall|status [options] Set up the wardby-runs Claude Code pane (plugin, MCP server, allow rules)\n wardby help [list]\n wardby help search <terms>\n wardby help open <article-id>\n wardby agent create --name <n> --model <m> --prompt <p> --budget <usd> [--schedule \"<cron>\"] [--timezone <tz>] [--max-turns <n>] [--owner <subject>] [--public] [--native-execution-mode control-plane|sandbox]\n (owned by --owner or LOCAL_PRINCIPAL; --public shares it with everyone at execute;\n sandbox needs NATIVE_SANDBOX_LAUNCHER set in this environment)\n wardby agent list\n wardby agent mode <name> control-plane|sandbox (native agents; applies to runs created after the change)\n wardby agent schedule <name> --cron \"<expr>\" [--timezone <tz>] [--disable]\n wardby tool create --name <n> --description <d> --params <file> --code <file>\n wardby tool attach <tool-name|tool-id> <agent-name> (grants the capabilities in the agent owner's name)\n wardby tool detach <tool-name|tool-id> <agent-name>\n wardby tool update <tool-name|tool-id> [--description <d>] [--params <file>] [--code <file>]\n wardby tool delete <tool-name|tool-id> [--detach]\n wardby tool list [--agent <name>]\n wardby run <name>\n wardby runs [--agent <name>] [--limit N] [--status <s>]\n wardby coding preflight (JOB_LAUNCHER=docker or kubernetes)\n wardby coding cleanup --run-id <id>\n wardby scheduler [--scope default]\n wardby native-gateway (the native sandbox gateway only; NATIVE_GATEWAY_LISTEN, default 0.0.0.0:8790)\n wardby mcp (MCP_TRANSPORT=stdio|http selects the transport)\n wardby serve [--scope default] (mcp + scheduler + reconciler in one process; http only)\n wardby grants migration-report [--json]\n wardby grants adopt-public --owner <subject> [--dry-run] [--keep-everyone-execute]\n wardby grants prune-bindings [--dry-run]\n wardby import <bundle-dir> [--owner <subject>] [--public] [--include-secrets --transfer-key <pem>] [--default-budget <usd>] [--dry-run] [--prefix <p>] [--on-conflict fail|skip|rename] [--allow-open-fetch]\n\noptions:\n -h, --help Show this help\n -v, --version Show the installed Wardby version";