@wardby/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/.env.example +131 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +2 -0
  4. package/README.md +282 -0
  5. package/bin/wardby.js +3 -0
  6. package/deploy/local/docker-compose.yml +19 -0
  7. package/dist/claude-coding-worker/driver.d.ts +70 -0
  8. package/dist/claude-coding-worker/driver.js +128 -0
  9. package/dist/claude-coding-worker/main.d.ts +2 -0
  10. package/dist/claude-coding-worker/main.js +41 -0
  11. package/dist/claude-coding-worker/sdk.d.ts +4 -0
  12. package/dist/claude-coding-worker/sdk.js +43 -0
  13. package/dist/claude-coding-worker/tool-relay.d.ts +1 -0
  14. package/dist/claude-coding-worker/tool-relay.js +9 -0
  15. package/dist/cli-help.d.ts +1 -0
  16. package/dist/cli-help.js +20 -0
  17. package/dist/cli.d.ts +18 -0
  18. package/dist/cli.js +629 -0
  19. package/dist/coding/observability.d.ts +59 -0
  20. package/dist/coding/observability.js +77 -0
  21. package/dist/coding/profile.d.ts +88 -0
  22. package/dist/coding/profile.js +137 -0
  23. package/dist/coding/protocol.d.ts +345 -0
  24. package/dist/coding/protocol.js +445 -0
  25. package/dist/coding/provider.d.ts +4 -0
  26. package/dist/coding/provider.js +18 -0
  27. package/dist/coding-proxy/main.d.ts +1 -0
  28. package/dist/coding-proxy/main.js +51 -0
  29. package/dist/coding-worker/artifact.d.ts +16 -0
  30. package/dist/coding-worker/artifact.js +37 -0
  31. package/dist/coding-worker/driver.d.ts +46 -0
  32. package/dist/coding-worker/driver.js +158 -0
  33. package/dist/coding-worker/errors.d.ts +1 -0
  34. package/dist/coding-worker/errors.js +23 -0
  35. package/dist/coding-worker/isolation-probe.d.ts +1 -0
  36. package/dist/coding-worker/isolation-probe.js +146 -0
  37. package/dist/coding-worker/keeper.d.ts +4 -0
  38. package/dist/coding-worker/keeper.js +29 -0
  39. package/dist/coding-worker/main.d.ts +2 -0
  40. package/dist/coding-worker/main.js +43 -0
  41. package/dist/coding-worker/sdk.d.ts +26 -0
  42. package/dist/coding-worker/sdk.js +28 -0
  43. package/dist/coding-worker/types.d.ts +64 -0
  44. package/dist/coding-worker/types.js +1 -0
  45. package/dist/config/providers.d.ts +158 -0
  46. package/dist/config/providers.js +162 -0
  47. package/dist/core/budget-groups.d.ts +72 -0
  48. package/dist/core/budget-groups.js +149 -0
  49. package/dist/core/budget.d.ts +63 -0
  50. package/dist/core/budget.js +69 -0
  51. package/dist/core/coding-queue.d.ts +32 -0
  52. package/dist/core/coding-queue.js +54 -0
  53. package/dist/core/cron.d.ts +31 -0
  54. package/dist/core/cron.js +43 -0
  55. package/dist/core/datastores.d.ts +41 -0
  56. package/dist/core/datastores.js +105 -0
  57. package/dist/core/db.d.ts +2 -0
  58. package/dist/core/db.js +2 -0
  59. package/dist/core/dispatch.d.ts +81 -0
  60. package/dist/core/dispatch.js +184 -0
  61. package/dist/core/engine-native.d.ts +29 -0
  62. package/dist/core/engine-native.js +259 -0
  63. package/dist/core/http-runtime.d.ts +7 -0
  64. package/dist/core/http-runtime.js +101 -0
  65. package/dist/core/lease.d.ts +13 -0
  66. package/dist/core/lease.js +22 -0
  67. package/dist/core/logger.d.ts +13 -0
  68. package/dist/core/logger.js +45 -0
  69. package/dist/core/memory-tools.d.ts +11 -0
  70. package/dist/core/memory-tools.js +122 -0
  71. package/dist/core/reconciler.d.ts +45 -0
  72. package/dist/core/reconciler.js +152 -0
  73. package/dist/core/runner.d.ts +87 -0
  74. package/dist/core/runner.js +529 -0
  75. package/dist/core/scheduler.d.ts +47 -0
  76. package/dist/core/scheduler.js +121 -0
  77. package/dist/core/secrets.d.ts +46 -0
  78. package/dist/core/secrets.js +100 -0
  79. package/dist/core/subagent-memory-tools.d.ts +18 -0
  80. package/dist/core/subagent-memory-tools.js +121 -0
  81. package/dist/core/timing.d.ts +7 -0
  82. package/dist/core/timing.js +7 -0
  83. package/dist/core/webhooks.d.ts +23 -0
  84. package/dist/core/webhooks.js +113 -0
  85. package/dist/env.d.ts +11 -0
  86. package/dist/env.js +13 -0
  87. package/dist/import/budgets.d.ts +16 -0
  88. package/dist/import/budgets.js +21 -0
  89. package/dist/import/bundle.d.ts +16 -0
  90. package/dist/import/bundle.js +61 -0
  91. package/dist/import/cli-args.d.ts +2 -0
  92. package/dist/import/cli-args.js +44 -0
  93. package/dist/import/create.d.ts +34 -0
  94. package/dist/import/create.js +363 -0
  95. package/dist/import/index.d.ts +25 -0
  96. package/dist/import/index.js +130 -0
  97. package/dist/import/model-gate.d.ts +1 -0
  98. package/dist/import/model-gate.js +3 -0
  99. package/dist/import/neutral-schema.d.ts +369 -0
  100. package/dist/import/neutral-schema.js +109 -0
  101. package/dist/import/preflight.d.ts +41 -0
  102. package/dist/import/preflight.js +71 -0
  103. package/dist/import/report.d.ts +5 -0
  104. package/dist/import/report.js +98 -0
  105. package/dist/import/tool-scan.d.ts +8 -0
  106. package/dist/import/tool-scan.js +20 -0
  107. package/dist/mcp/auth/ownership.d.ts +113 -0
  108. package/dist/mcp/auth/ownership.js +87 -0
  109. package/dist/mcp/auth/principal.d.ts +9 -0
  110. package/dist/mcp/auth/principal.js +9 -0
  111. package/dist/mcp/auth/resource-server.d.ts +47 -0
  112. package/dist/mcp/auth/resource-server.js +82 -0
  113. package/dist/mcp/auth/self-hosted/browser.d.ts +3 -0
  114. package/dist/mcp/auth/self-hosted/browser.js +273 -0
  115. package/dist/mcp/auth/self-hosted/cli.d.ts +2 -0
  116. package/dist/mcp/auth/self-hosted/cli.js +39 -0
  117. package/dist/mcp/auth/self-hosted/credentials.d.ts +58 -0
  118. package/dist/mcp/auth/self-hosted/credentials.js +106 -0
  119. package/dist/mcp/auth/self-hosted/rate-limit.d.ts +13 -0
  120. package/dist/mcp/auth/self-hosted/rate-limit.js +20 -0
  121. package/dist/mcp/auth/self-hosted/session.d.ts +36 -0
  122. package/dist/mcp/auth/self-hosted/session.js +110 -0
  123. package/dist/mcp/capabilities.d.ts +11 -0
  124. package/dist/mcp/capabilities.js +10 -0
  125. package/dist/mcp/context.d.ts +46 -0
  126. package/dist/mcp/context.js +1 -0
  127. package/dist/mcp/errors.d.ts +13 -0
  128. package/dist/mcp/errors.js +22 -0
  129. package/dist/mcp/index.d.ts +32 -0
  130. package/dist/mcp/index.js +187 -0
  131. package/dist/mcp/jsonrpc.d.ts +8 -0
  132. package/dist/mcp/jsonrpc.js +1 -0
  133. package/dist/mcp/server.d.ts +107 -0
  134. package/dist/mcp/server.js +203 -0
  135. package/dist/mcp/tasks/manager.d.ts +63 -0
  136. package/dist/mcp/tasks/manager.js +103 -0
  137. package/dist/mcp/tools/agents.d.ts +2 -0
  138. package/dist/mcp/tools/agents.js +375 -0
  139. package/dist/mcp/tools/budget-groups.d.ts +2 -0
  140. package/dist/mcp/tools/budget-groups.js +136 -0
  141. package/dist/mcp/tools/datastore.d.ts +2 -0
  142. package/dist/mcp/tools/datastore.js +217 -0
  143. package/dist/mcp/tools/memory.d.ts +3 -0
  144. package/dist/mcp/tools/memory.js +60 -0
  145. package/dist/mcp/tools/models.d.ts +8 -0
  146. package/dist/mcp/tools/models.js +15 -0
  147. package/dist/mcp/tools/runs.d.ts +2 -0
  148. package/dist/mcp/tools/runs.js +61 -0
  149. package/dist/mcp/tools/scheduling.d.ts +2 -0
  150. package/dist/mcp/tools/scheduling.js +48 -0
  151. package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -0
  152. package/dist/mcp/tools/secret-elicitation-form.js +93 -0
  153. package/dist/mcp/tools/secret-elicitation-server.d.ts +5 -0
  154. package/dist/mcp/tools/secret-elicitation-server.js +57 -0
  155. package/dist/mcp/tools/secret-elicitation.d.ts +38 -0
  156. package/dist/mcp/tools/secret-elicitation.js +52 -0
  157. package/dist/mcp/tools/secrets.d.ts +13 -0
  158. package/dist/mcp/tools/secrets.js +124 -0
  159. package/dist/mcp/tools/subagents.d.ts +2 -0
  160. package/dist/mcp/tools/subagents.js +133 -0
  161. package/dist/mcp/tools/text-result.d.ts +6 -0
  162. package/dist/mcp/tools/text-result.js +3 -0
  163. package/dist/mcp/tools/tools.d.ts +2 -0
  164. package/dist/mcp/tools/tools.js +211 -0
  165. package/dist/mcp/tools/trigger.d.ts +2 -0
  166. package/dist/mcp/tools/trigger.js +120 -0
  167. package/dist/mcp/tools/webhooks.d.ts +2 -0
  168. package/dist/mcp/tools/webhooks.js +34 -0
  169. package/dist/mcp/transport/http-limits.d.ts +17 -0
  170. package/dist/mcp/transport/http-limits.js +92 -0
  171. package/dist/mcp/transport/stdio.d.ts +23 -0
  172. package/dist/mcp/transport/stdio.js +6 -0
  173. package/dist/mcp/transport/streamable-http.d.ts +34 -0
  174. package/dist/mcp/transport/streamable-http.js +158 -0
  175. package/dist/mcp/unattended-schedules.d.ts +15 -0
  176. package/dist/mcp/unattended-schedules.js +21 -0
  177. package/dist/mcp/webhooks/ingress.d.ts +17 -0
  178. package/dist/mcp/webhooks/ingress.js +33 -0
  179. package/dist/observability/config.d.ts +6 -0
  180. package/dist/observability/config.js +20 -0
  181. package/dist/observability/metrics-server.d.ts +11 -0
  182. package/dist/observability/metrics-server.js +47 -0
  183. package/dist/observability/metrics.d.ts +36 -0
  184. package/dist/observability/metrics.js +158 -0
  185. package/dist/providers/auth/authorization-server.d.ts +41 -0
  186. package/dist/providers/auth/authorization-server.js +1 -0
  187. package/dist/providers/auth/delegating.d.ts +44 -0
  188. package/dist/providers/auth/delegating.js +105 -0
  189. package/dist/providers/auth/index.d.ts +11 -0
  190. package/dist/providers/auth/index.js +20 -0
  191. package/dist/providers/auth/release-gate.d.ts +1 -0
  192. package/dist/providers/auth/release-gate.js +4 -0
  193. package/dist/providers/auth/self-hosted.d.ts +78 -0
  194. package/dist/providers/auth/self-hosted.js +377 -0
  195. package/dist/providers/auth/subject.d.ts +1 -0
  196. package/dist/providers/auth/subject.js +6 -0
  197. package/dist/providers/auth/types.d.ts +63 -0
  198. package/dist/providers/auth/types.js +22 -0
  199. package/dist/providers/coding-proxy/deny-port.d.ts +5 -0
  200. package/dist/providers/coding-proxy/deny-port.js +45 -0
  201. package/dist/providers/coding-proxy/environment-credentials.d.ts +7 -0
  202. package/dist/providers/coding-proxy/environment-credentials.js +16 -0
  203. package/dist/providers/coding-proxy/index.d.ts +7 -0
  204. package/dist/providers/coding-proxy/index.js +7 -0
  205. package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -0
  206. package/dist/providers/coding-proxy/memory-ledger.js +103 -0
  207. package/dist/providers/coding-proxy/metering.d.ts +20 -0
  208. package/dist/providers/coding-proxy/metering.js +161 -0
  209. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -0
  210. package/dist/providers/coding-proxy/prisma-ledger.js +213 -0
  211. package/dist/providers/coding-proxy/proxy.d.ts +75 -0
  212. package/dist/providers/coding-proxy/proxy.js +721 -0
  213. package/dist/providers/coding-proxy/runtime.d.ts +18 -0
  214. package/dist/providers/coding-proxy/runtime.js +39 -0
  215. package/dist/providers/coding-proxy/secure-fetch.d.ts +9 -0
  216. package/dist/providers/coding-proxy/secure-fetch.js +72 -0
  217. package/dist/providers/coding-proxy/server.d.ts +17 -0
  218. package/dist/providers/coding-proxy/server.js +139 -0
  219. package/dist/providers/coding-proxy/types.d.ts +99 -0
  220. package/dist/providers/coding-proxy/types.js +1 -0
  221. package/dist/providers/datastore/index.d.ts +2 -0
  222. package/dist/providers/datastore/index.js +2 -0
  223. package/dist/providers/datastore/postgres.d.ts +20 -0
  224. package/dist/providers/datastore/postgres.js +130 -0
  225. package/dist/providers/datastore/scoped.d.ts +10 -0
  226. package/dist/providers/datastore/scoped.js +46 -0
  227. package/dist/providers/datastore/types.d.ts +31 -0
  228. package/dist/providers/datastore/types.js +7 -0
  229. package/dist/providers/email/types.d.ts +46 -0
  230. package/dist/providers/email/types.js +8 -0
  231. package/dist/providers/engine/index.d.ts +1 -0
  232. package/dist/providers/engine/index.js +1 -0
  233. package/dist/providers/engine/types.d.ts +67 -0
  234. package/dist/providers/engine/types.js +16 -0
  235. package/dist/providers/executor/build.d.ts +6 -0
  236. package/dist/providers/executor/build.js +15 -0
  237. package/dist/providers/executor/composition.d.ts +14 -0
  238. package/dist/providers/executor/composition.js +123 -0
  239. package/dist/providers/executor/container.d.ts +184 -0
  240. package/dist/providers/executor/container.js +936 -0
  241. package/dist/providers/executor/dbos-status.d.ts +50 -0
  242. package/dist/providers/executor/dbos-status.js +64 -0
  243. package/dist/providers/executor/dbos.d.ts +53 -0
  244. package/dist/providers/executor/dbos.js +269 -0
  245. package/dist/providers/executor/in-process.d.ts +18 -0
  246. package/dist/providers/executor/in-process.js +38 -0
  247. package/dist/providers/executor/index.d.ts +8 -0
  248. package/dist/providers/executor/index.js +8 -0
  249. package/dist/providers/executor/routing.d.ts +48 -0
  250. package/dist/providers/executor/routing.js +70 -0
  251. package/dist/providers/executor/types.d.ts +55 -0
  252. package/dist/providers/executor/types.js +1 -0
  253. package/dist/providers/index.d.ts +43 -0
  254. package/dist/providers/index.js +18 -0
  255. package/dist/providers/jobs/docker-isolation.d.ts +166 -0
  256. package/dist/providers/jobs/docker-isolation.js +724 -0
  257. package/dist/providers/jobs/docker.d.ts +127 -0
  258. package/dist/providers/jobs/docker.js +1027 -0
  259. package/dist/providers/jobs/fake-kubernetes-api.d.ts +98 -0
  260. package/dist/providers/jobs/fake-kubernetes-api.js +142 -0
  261. package/dist/providers/jobs/fake.d.ts +23 -0
  262. package/dist/providers/jobs/fake.js +132 -0
  263. package/dist/providers/jobs/kubernetes-api.d.ts +60 -0
  264. package/dist/providers/jobs/kubernetes-api.js +20 -0
  265. package/dist/providers/jobs/kubernetes-client.d.ts +36 -0
  266. package/dist/providers/jobs/kubernetes-client.js +171 -0
  267. package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +49 -0
  268. package/dist/providers/jobs/kubernetes-dry-run-fixture.js +141 -0
  269. package/dist/providers/jobs/kubernetes-isolation.d.ts +147 -0
  270. package/dist/providers/jobs/kubernetes-isolation.js +607 -0
  271. package/dist/providers/jobs/kubernetes-platform.d.ts +177 -0
  272. package/dist/providers/jobs/kubernetes-platform.js +280 -0
  273. package/dist/providers/jobs/kubernetes-preflight.d.ts +59 -0
  274. package/dist/providers/jobs/kubernetes-preflight.js +339 -0
  275. package/dist/providers/jobs/kubernetes-witness.d.ts +10 -0
  276. package/dist/providers/jobs/kubernetes-witness.js +193 -0
  277. package/dist/providers/jobs/kubernetes.d.ts +127 -0
  278. package/dist/providers/jobs/kubernetes.js +874 -0
  279. package/dist/providers/jobs/safe-extract.d.ts +9 -0
  280. package/dist/providers/jobs/safe-extract.js +325 -0
  281. package/dist/providers/jobs/types.d.ts +78 -0
  282. package/dist/providers/jobs/types.js +6 -0
  283. package/dist/providers/jobs/workspace-swap.d.ts +2 -0
  284. package/dist/providers/jobs/workspace-swap.js +47 -0
  285. package/dist/providers/llm/anthropic.d.ts +13 -0
  286. package/dist/providers/llm/anthropic.js +21 -0
  287. package/dist/providers/llm/bedrock.d.ts +19 -0
  288. package/dist/providers/llm/bedrock.js +33 -0
  289. package/dist/providers/llm/claude-messages.d.ts +106 -0
  290. package/dist/providers/llm/claude-messages.js +157 -0
  291. package/dist/providers/llm/claude-provider.d.ts +40 -0
  292. package/dist/providers/llm/claude-provider.js +31 -0
  293. package/dist/providers/llm/index.d.ts +10 -0
  294. package/dist/providers/llm/index.js +10 -0
  295. package/dist/providers/llm/openai.d.ts +23 -0
  296. package/dist/providers/llm/openai.js +156 -0
  297. package/dist/providers/llm/pricing-anthropic.d.ts +4 -0
  298. package/dist/providers/llm/pricing-anthropic.js +30 -0
  299. package/dist/providers/llm/pricing-bedrock-claude.d.ts +12 -0
  300. package/dist/providers/llm/pricing-bedrock-claude.js +37 -0
  301. package/dist/providers/llm/pricing-core.d.ts +26 -0
  302. package/dist/providers/llm/pricing-core.js +17 -0
  303. package/dist/providers/llm/pricing.d.ts +30 -0
  304. package/dist/providers/llm/pricing.js +74 -0
  305. package/dist/providers/llm/registration.d.ts +8 -0
  306. package/dist/providers/llm/registration.js +39 -0
  307. package/dist/providers/llm/routing.d.ts +25 -0
  308. package/dist/providers/llm/routing.js +32 -0
  309. package/dist/providers/llm/types.d.ts +85 -0
  310. package/dist/providers/llm/types.js +12 -0
  311. package/dist/providers/memory/index.d.ts +2 -0
  312. package/dist/providers/memory/index.js +2 -0
  313. package/dist/providers/memory/postgres.d.ts +20 -0
  314. package/dist/providers/memory/postgres.js +72 -0
  315. package/dist/providers/memory/types.d.ts +32 -0
  316. package/dist/providers/memory/types.js +17 -0
  317. package/dist/providers/secrets/app-key.d.ts +8 -0
  318. package/dist/providers/secrets/app-key.js +50 -0
  319. package/dist/providers/secrets/index.d.ts +10 -0
  320. package/dist/providers/secrets/index.js +13 -0
  321. package/dist/providers/secrets/transfer-envelope.d.ts +12 -0
  322. package/dist/providers/secrets/transfer-envelope.js +35 -0
  323. package/dist/providers/secrets/types.d.ts +18 -0
  324. package/dist/providers/secrets/types.js +12 -0
  325. package/dist/providers/storage/types.d.ts +18 -0
  326. package/dist/providers/storage/types.js +7 -0
  327. package/dist/providers/vcs/git.d.ts +105 -0
  328. package/dist/providers/vcs/git.js +710 -0
  329. package/dist/providers/vcs/github.d.ts +105 -0
  330. package/dist/providers/vcs/github.js +394 -0
  331. package/dist/providers/vcs/index.d.ts +6 -0
  332. package/dist/providers/vcs/index.js +26 -0
  333. package/dist/providers/vcs/types.d.ts +118 -0
  334. package/dist/providers/vcs/types.js +1 -0
  335. package/dist/sandbox/bounded-json.d.ts +2 -0
  336. package/dist/sandbox/bounded-json.js +36 -0
  337. package/dist/sandbox/bridge.d.ts +15 -0
  338. package/dist/sandbox/bridge.js +78 -0
  339. package/dist/sandbox/eval-core.d.ts +37 -0
  340. package/dist/sandbox/eval-core.js +159 -0
  341. package/dist/sandbox/fetch-policy.d.ts +24 -0
  342. package/dist/sandbox/fetch-policy.js +96 -0
  343. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +5 -0
  344. package/dist/sandbox/generated/zod.bundle.js +1 -0
  345. package/dist/sandbox/host-functions.d.ts +29 -0
  346. package/dist/sandbox/host-functions.js +168 -0
  347. package/dist/sandbox/limits.d.ts +39 -0
  348. package/dist/sandbox/limits.js +39 -0
  349. package/dist/sandbox/parser-worker/__fixtures__/crash.d.ts +1 -0
  350. package/dist/sandbox/parser-worker/__fixtures__/crash.js +6 -0
  351. package/dist/sandbox/parser-worker/__fixtures__/echo.d.ts +1 -0
  352. package/dist/sandbox/parser-worker/__fixtures__/echo.js +5 -0
  353. package/dist/sandbox/parser-worker/__fixtures__/reject.d.ts +1 -0
  354. package/dist/sandbox/parser-worker/__fixtures__/reject.js +5 -0
  355. package/dist/sandbox/parser-worker/__fixtures__/spin-forever.d.ts +1 -0
  356. package/dist/sandbox/parser-worker/__fixtures__/spin-forever.js +11 -0
  357. package/dist/sandbox/parser-worker/pool.d.ts +13 -0
  358. package/dist/sandbox/parser-worker/pool.js +111 -0
  359. package/dist/sandbox/parser-worker/worker.d.ts +14 -0
  360. package/dist/sandbox/parser-worker/worker.js +63 -0
  361. package/dist/sandbox/pii-redaction.d.ts +1 -0
  362. package/dist/sandbox/pii-redaction.js +29 -0
  363. package/dist/sandbox/prelude.d.ts +26 -0
  364. package/dist/sandbox/prelude.js +408 -0
  365. package/dist/sandbox/quickjs-module.d.ts +13 -0
  366. package/dist/sandbox/quickjs-module.js +19 -0
  367. package/dist/sandbox/run-in-sandbox.d.ts +34 -0
  368. package/dist/sandbox/run-in-sandbox.js +53 -0
  369. package/dist/sandbox/safe-fetch.d.ts +26 -0
  370. package/dist/sandbox/safe-fetch.js +140 -0
  371. package/dist/sandbox/tool-capabilities.d.ts +66 -0
  372. package/dist/sandbox/tool-capabilities.js +103 -0
  373. package/dist/sandbox/zod-params.d.ts +22 -0
  374. package/dist/sandbox/zod-params.js +60 -0
  375. package/dist/serve.d.ts +14 -0
  376. package/dist/serve.js +54 -0
  377. package/dist/wardby-bin.d.ts +2 -0
  378. package/dist/wardby-bin.js +20 -0
  379. package/package.json +123 -0
  380. package/prisma/migrations/20260905000000_init/migration.sql +34 -0
  381. package/prisma/migrations/20260905010000_scheduler_durability/migration.sql +31 -0
  382. package/prisma/migrations/20260905020000_tools_multiturn/migration.sql +47 -0
  383. package/prisma/migrations/20260905030000_cache_tool_json_schema/migration.sql +13 -0
  384. package/prisma/migrations/20260906000000_mcp_phase4/migration.sql +115 -0
  385. package/prisma/migrations/20260906010000_run_final_text/migration.sql +7 -0
  386. package/prisma/migrations/20260906020000_run_turns/migration.sql +6 -0
  387. package/prisma/migrations/20260906030000_task_principal_id/migration.sql +5 -0
  388. package/prisma/migrations/20260906040000_secure_self_hosted_oauth/migration.sql +67 -0
  389. package/prisma/migrations/20260906050000_phase5_coding_agents/migration.sql +52 -0
  390. package/prisma/migrations/20260906060000_tool_capability_scoping/migration.sql +22 -0
  391. package/prisma/migrations/20260906070000_datastore_pii_flag/migration.sql +6 -0
  392. package/prisma/migrations/20260906080000_secret_elicitation_outcomes/migration.sql +13 -0
  393. package/prisma/migrations/20260907010000_coding_proxy_ledger/migration.sql +57 -0
  394. package/prisma/migrations/20260907020000_budget_groups/migration.sql +24 -0
  395. package/prisma/migrations/20260907030000_coding_webhook_task_override/migration.sql +4 -0
  396. package/prisma/migrations/20260908010000_run_execution_backend/migration.sql +2 -0
  397. package/prisma/migrations/20260908020000_coding_run_audit_metadata/migration.sql +7 -0
  398. package/prisma/migrations/20260910010000_agent_secret_bound_name/migration.sql +16 -0
  399. package/prisma/migrations/20260911010000_coding_worker_toolchains/migration.sql +5 -0
  400. package/prisma/migrations/20260912010000_coding_provider_contract/migration.sql +24 -0
  401. package/prisma/migrations/20260912020000_coding_proxy_protocol/migration.sql +10 -0
  402. package/prisma/migrations/20260912030000_agent_memory/migration.sql +18 -0
  403. package/prisma/migrations/20260912040000_named_shared_datastores/migration.sql +68 -0
  404. package/prisma/migrations/20260913000000_run_trigger_webhook/migration.sql +2 -0
  405. package/prisma/migrations/20260913010000_agent_sub_agent/migration.sql +32 -0
  406. package/prisma/migrations/20260913020000_run_task_override/migration.sql +5 -0
  407. package/prisma/migrations/20260913030000_coding_run_root/migration.sql +11 -0
  408. package/prisma/migrations/20260922010000_coding_run_queued_at/migration.sql +8 -0
  409. package/prisma/migrations/20260922020000_coding_workspace_disk/migration.sql +8 -0
  410. package/prisma/migrations/migration_lock.toml +3 -0
  411. package/prisma/schema.prisma +723 -0
  412. package/scripts/git-askpass.sh +11 -0
@@ -0,0 +1,39 @@
1
+ /** Sandbox resource limits — one module, tunable. All defaulted. */
2
+ /** QuickJS heap ceiling per invocation (bytes). Trips a QuickJS-level OOM error. */
3
+ export const MEMORY_LIMIT_BYTES = 32 * 1024 * 1024; // 32 MiB
4
+ /**
5
+ * Interrupt-handler check budget. Counts interrupt-handler invocations (the
6
+ * interpreter calls this periodically while running bytecode), not wall
7
+ * time — deterministic, can't be gamed by a busy loop that happens to be
8
+ * slow on one machine and fast on another.
9
+ */
10
+ export const MAX_INTERRUPT_CHECKS = 20_000_000;
11
+ /**
12
+ * Wall-time cap per tool invocation. Belt-and-suspenders alongside the
13
+ * instruction cap: the interrupt handler only runs while the interpreter is
14
+ * actively executing bytecode, so it can't bound time spent suspended
15
+ * awaiting a host async call (e.g. a slow `fetch`) — this does.
16
+ */
17
+ export const WALL_TIME_LIMIT_MS = 10_000;
18
+ /** Timeout for the sandbox's `fetch` host bridge, independent of the wall-time cap. */
19
+ export const FETCH_TIMEOUT_MS = 8_000;
20
+ /** QuickJS interpreter stack size cap (bytes). */
21
+ export const MAX_STACK_SIZE_BYTES = 1024 * 1024; // 1 MiB
22
+ export const FETCH_RESPONSE_BYTES = 8 * 1024 * 1024;
23
+ export const MAX_REDIRECTS = 5;
24
+ export const RANDOM_BYTES_LIMIT = 65_536;
25
+ export const BRIDGE_INPUT_BYTES = 1024 * 1024;
26
+ export const BRIDGE_RESULT_BYTES = 12 * 1024 * 1024;
27
+ export const PARSER_INPUT_BYTES = 256 * 1024;
28
+ export const HTML_LINKS_LIMIT = 1000;
29
+ export const LOG_BYTES = 16 * 1024;
30
+ export const MAX_HOST_CALLS = 256;
31
+ export const MAX_PENDING_HOST_CALLS = 8;
32
+ /** Max concurrent parser worker threads across the whole process (html/csv/xml bridge calls share this budget). */
33
+ export const PARSER_WORKER_MAX_CONCURRENCY = 4;
34
+ /** Max callers waiting for a free worker slot before a new call is rejected immediately instead of queueing. */
35
+ export const PARSER_WORKER_QUEUE_LIMIT = 32;
36
+ /** Hard wall-clock budget for one parse call; the worker is forcibly terminated if it runs longer. */
37
+ export const PARSER_WORKER_TIMEOUT_MS = 5_000;
38
+ /** Per-worker V8 old-generation heap cap (resourceLimits) — see plan D2 for its known Buffer-allocation blind spot. */
39
+ export const PARSER_WORKER_MAX_OLD_GEN_MB = 64;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import { parentPort } from "node:worker_threads";
2
+ if (parentPort) {
3
+ parentPort.on("message", () => {
4
+ throw new Error("fixture_crash");
5
+ });
6
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { parentPort } from "node:worker_threads";
2
+ if (parentPort) {
3
+ const port = parentPort;
4
+ port.on("message", (request) => port.postMessage({ ok: true, value: request }));
5
+ }
@@ -0,0 +1,5 @@
1
+ import { parentPort } from "node:worker_threads";
2
+ if (parentPort) {
3
+ const port = parentPort;
4
+ port.on("message", () => port.postMessage({ ok: false, message: "fixture_reject" }));
5
+ }
@@ -0,0 +1,11 @@
1
+ import { parentPort } from "node:worker_threads";
2
+ if (parentPort) {
3
+ parentPort.on("message", () => {
4
+ // Simulates a pathological synchronous parse that never yields — this
5
+ // is what proves the pool's timeout can reclaim a genuinely hung
6
+ // worker, without depending on any real library's specific behavior.
7
+ let _busyWork = 0;
8
+ while (true)
9
+ _busyWork++;
10
+ });
11
+ }
@@ -0,0 +1,13 @@
1
+ export type ParserKind = "html" | "csv" | "xml";
2
+ export interface ParserWorkerPool {
3
+ run(kind: ParserKind, payload: unknown, signal?: AbortSignal): Promise<unknown>;
4
+ }
5
+ export interface ParserWorkerPoolOptions {
6
+ maxConcurrency?: number;
7
+ timeoutMs?: number;
8
+ maxOldGenerationSizeMb?: number;
9
+ queueLimit?: number;
10
+ /** Test-only escape hatch: which worker script to spawn (real workers point fixtures here instead). */
11
+ workerUrl?: URL;
12
+ }
13
+ export declare function createParserWorkerPool(options?: ParserWorkerPoolOptions): ParserWorkerPool;
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Bounds the three parser bridge functions (HTML/CSV/XML) to a fixed
3
+ * number of concurrent, isolated worker threads with a hard per-call
4
+ * timeout. These parsers run fully attacker-controlled (but size-capped)
5
+ * input through third-party libraries in the HOST Node process — QuickJS's
6
+ * own CPU/memory/wall-time limits don't apply to that work at all, and an
7
+ * AbortSignal alone cannot interrupt a synchronous CPU-bound call already
8
+ * in flight. A worker thread's terminate() can (verified: kills a genuine
9
+ * synchronous infinite loop in ~300ms) — this module pairs that
10
+ * termination primitive with a bounded concurrency gate and queue so a
11
+ * pathological input degrades one call, not the whole process.
12
+ *
13
+ * Deliberately spawn-per-call rather than a persistent reused pool: a
14
+ * dead/terminated worker just isn't reused, so there's no "respawn a
15
+ * broken slot" state machine to get wrong after an attack. The cost is a
16
+ * few ms of thread-spawn overhead per call, negligible against the
17
+ * multi-second timeout budget this exists to bound.
18
+ */
19
+ import { existsSync } from "node:fs";
20
+ import { fileURLToPath } from "node:url";
21
+ import { Worker } from "node:worker_threads";
22
+ import { PARSER_WORKER_MAX_CONCURRENCY, PARSER_WORKER_MAX_OLD_GEN_MB, PARSER_WORKER_QUEUE_LIMIT, PARSER_WORKER_TIMEOUT_MS, } from "../limits.js";
23
+ const defaultWorkerJsUrl = new URL("./worker.js", import.meta.url);
24
+ // `new Worker()` loads by literal file URL — it gets none of the NodeNext
25
+ // ".js"-import-resolves-to-".ts" remapping tsx/vitest give normal `import`
26
+ // statements. Under tsx/vitest only worker.ts exists on disk; after
27
+ // `tsc -p tsconfig.build.json` only the compiled worker.js does.
28
+ const DEFAULT_WORKER_URL = existsSync(fileURLToPath(defaultWorkerJsUrl))
29
+ ? defaultWorkerJsUrl
30
+ : new URL("./worker.ts", import.meta.url);
31
+ // A worker spawned from a vitest-run process does NOT inherit a tsx loader
32
+ // via process.execArgv (vitest's own parent process isn't started via
33
+ // `tsx` — only a `tsx`-launched process, e.g. the `cli` script, has that
34
+ // in its execArgv to inherit). worker.ts imports sibling files via
35
+ // NodeNext ".js" specifiers that only resolve to their real ".ts" files
36
+ // under a TS-aware loader, so a .ts worker needs one explicitly rather
37
+ // than relying on inheritance. Verified: without this, spawning worker.ts
38
+ // under vitest fails with "Cannot find module '.../bounded-json.js'".
39
+ const TS_WORKER_EXEC_ARGV = ["--import", "tsx/esm"];
40
+ export function createParserWorkerPool(options = {}) {
41
+ const maxConcurrency = options.maxConcurrency ?? PARSER_WORKER_MAX_CONCURRENCY;
42
+ const timeoutMs = options.timeoutMs ?? PARSER_WORKER_TIMEOUT_MS;
43
+ const maxOldGenerationSizeMb = options.maxOldGenerationSizeMb ?? PARSER_WORKER_MAX_OLD_GEN_MB;
44
+ const queueLimit = options.queueLimit ?? PARSER_WORKER_QUEUE_LIMIT;
45
+ const workerUrl = options.workerUrl ?? DEFAULT_WORKER_URL;
46
+ let active = 0;
47
+ const waiters = [];
48
+ async function acquire() {
49
+ if (active < maxConcurrency) {
50
+ active++;
51
+ return;
52
+ }
53
+ if (waiters.length >= queueLimit)
54
+ throw new Error("parser_pool_saturated");
55
+ await new Promise((resolve) => waiters.push(resolve));
56
+ active++;
57
+ }
58
+ function release() {
59
+ active--;
60
+ const next = waiters.shift();
61
+ if (next)
62
+ next();
63
+ }
64
+ async function run(kind, payload, signal) {
65
+ if (signal?.aborted)
66
+ throw new Error("parser_aborted");
67
+ await acquire();
68
+ if (signal?.aborted) {
69
+ release();
70
+ throw new Error("parser_aborted");
71
+ }
72
+ const worker = new Worker(workerUrl, {
73
+ resourceLimits: { maxOldGenerationSizeMb },
74
+ ...(workerUrl.pathname.endsWith(".ts") ? { execArgv: TS_WORKER_EXEC_ARGV } : {}),
75
+ });
76
+ try {
77
+ return await new Promise((resolve, reject) => {
78
+ let settled = false;
79
+ const cleanup = () => {
80
+ clearTimeout(timer);
81
+ signal?.removeEventListener("abort", onAbort);
82
+ };
83
+ const finish = (fn) => {
84
+ if (settled)
85
+ return;
86
+ settled = true;
87
+ cleanup();
88
+ fn();
89
+ };
90
+ const timer = setTimeout(() => finish(() => reject(new Error("parser_timeout"))), timeoutMs);
91
+ const onAbort = () => finish(() => reject(new Error("parser_aborted")));
92
+ signal?.addEventListener("abort", onAbort, { once: true });
93
+ worker.once("message", (msg) => {
94
+ finish(() => (msg.ok ? resolve(msg.value) : reject(new Error(msg.message ?? "parser_failed"))));
95
+ });
96
+ worker.once("error", (err) => {
97
+ finish(() => reject(new Error(`parser_worker_crashed: ${err.message}`)));
98
+ });
99
+ worker.once("exit", (code) => {
100
+ finish(() => reject(new Error(`parser_worker_terminated: exit code ${code}`)));
101
+ });
102
+ worker.postMessage({ kind, payload });
103
+ });
104
+ }
105
+ finally {
106
+ await worker.terminate().catch(() => { });
107
+ release();
108
+ }
109
+ }
110
+ return { run };
111
+ }
@@ -0,0 +1,14 @@
1
+ export declare function parseHtmlPayload(html: string): {
2
+ title: string | null;
3
+ text: string;
4
+ links: {
5
+ href: string;
6
+ text: string;
7
+ }[];
8
+ };
9
+ export declare function parseCsvPayload(csv: string, header: boolean): {
10
+ data: unknown;
11
+ errors: unknown;
12
+ meta: unknown;
13
+ };
14
+ export declare function parseXmlPayload(xml: string, xmlOptions: Record<string, unknown> | null): unknown;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Runs inside a spawned worker thread (see ./pool.ts) — the actual
3
+ * node-html-parser/papaparse/fast-xml-parser calls happen here, off the
4
+ * main event loop, so a pathological input can only ever hang this one
5
+ * disposable thread. `parentPort` is null when this file is imported
6
+ * directly (e.g. by worker.test.ts), so the message-wiring block below is
7
+ * a no-op in that context — the exported functions are plain, directly
8
+ * testable without spinning up a thread.
9
+ */
10
+ import { parentPort } from "node:worker_threads";
11
+ import { parse as parseHtmlDom } from "node-html-parser";
12
+ import Papa from "papaparse";
13
+ import { XMLParser } from "fast-xml-parser";
14
+ import { boundedJson } from "../bounded-json.js";
15
+ import { BRIDGE_RESULT_BYTES, HTML_LINKS_LIMIT } from "../limits.js";
16
+ export function parseHtmlPayload(html) {
17
+ const root = parseHtmlDom(html);
18
+ const title = root.querySelector("title")?.text?.trim() ?? null;
19
+ const text = root.text.replace(/\s+/g, " ").trim();
20
+ const anchors = root.querySelectorAll("a[href]");
21
+ if (anchors.length > HTML_LINKS_LIMIT)
22
+ throw new Error("html_link_limit");
23
+ const links = [];
24
+ let remaining = BRIDGE_RESULT_BYTES - Buffer.byteLength(boundedJson({ title, text, links }, BRIDGE_RESULT_BYTES));
25
+ // Nested anchors can repeat the same text; bound expansion during extraction.
26
+ for (const a of anchors) {
27
+ const link = { href: a.getAttribute("href") ?? "", text: a.text.trim() };
28
+ remaining -= Buffer.byteLength(boundedJson(link, remaining)) + 1;
29
+ if (remaining < 0)
30
+ throw new Error("bridge_size_limit");
31
+ links.push(link);
32
+ }
33
+ return { title, text, links };
34
+ }
35
+ export function parseCsvPayload(csv, header) {
36
+ const result = Papa.parse(csv, { header, skipEmptyLines: true });
37
+ return { data: result.data, errors: result.errors, meta: result.meta };
38
+ }
39
+ export function parseXmlPayload(xml, xmlOptions) {
40
+ const parser = new XMLParser({ ...xmlOptions, processEntities: false });
41
+ return parser.parse(xml);
42
+ }
43
+ function handle(request) {
44
+ if (request.kind === "html")
45
+ return parseHtmlPayload(request.payload.html);
46
+ if (request.kind === "csv") {
47
+ const { csv, header } = request.payload;
48
+ return parseCsvPayload(csv, header);
49
+ }
50
+ const { xml, xmlOptions } = request.payload;
51
+ return parseXmlPayload(xml, xmlOptions);
52
+ }
53
+ if (parentPort) {
54
+ const port = parentPort;
55
+ port.on("message", (request) => {
56
+ try {
57
+ port.postMessage({ ok: true, value: handle(request) });
58
+ }
59
+ catch (err) {
60
+ port.postMessage({ ok: false, message: err instanceof Error ? err.message : String(err) });
61
+ }
62
+ });
63
+ }
@@ -0,0 +1 @@
1
+ export declare function redactPii(text: string): string;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Best-effort, pattern-based PII redaction for sandboxed tool console
3
+ * output before it reaches the shared pino logger. Unlike host-functions.ts's
4
+ * `redactSecrets` (exact-match against values the tool actually fetched via
5
+ * secrets.get()), PII surfaces in arbitrary fetched web/datastore content —
6
+ * there is no known value to match against, only common structured formats.
7
+ * NOT exhaustive: free-text names, addresses, and anything not matching one
8
+ * of these formats passes through unredacted.
9
+ */
10
+ const PATTERNS = [
11
+ { name: "EMAIL", pattern: /\b[\w.+-]+@[a-z0-9-]+(?:\.[a-z0-9-]+)+\b/gi },
12
+ { name: "SSN", pattern: /\b\d{3}-\d{2}-\d{4}\b/g },
13
+ // `(?<!\d)` rather than a leading `\b`: a leading "+" is a non-word char,
14
+ // so `\b` fails to match right before it and the country code gets left
15
+ // behind unredacted.
16
+ { name: "PHONE", pattern: /(?<!\d)(?:\+?1[-.\s]?)?\(?\d{3}\)?[-.\s]\d{3}[-.\s]\d{4}\b/g },
17
+ // Contiguous or grouped (e.g. 4-4-4-4) digit runs in the credit-card
18
+ // length range. Digits-only, so it never touches alphanumeric ids/tokens.
19
+ // Always ends on a digit (not the optional separator) so it can't eat a
20
+ // trailing space/dash that isn't part of the number.
21
+ { name: "CREDIT_CARD", pattern: /\b\d(?:[ -]?\d){12,18}\b/g },
22
+ ];
23
+ export function redactPii(text) {
24
+ let out = text;
25
+ for (const { name, pattern } of PATTERNS) {
26
+ out = out.replace(pattern, `[REDACTED_${name}]`);
27
+ }
28
+ return out;
29
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The sandbox's Medium host API surface, evaluated once per invocation
3
+ * before the tool's own code. Everything here is either:
4
+ * - pure computation (Buffer, TextEncoder/Decoder, URL/URLSearchParams,
5
+ * atob/btoa, AbortController, Blob, FormData, formatDate) — no host call
6
+ * needed, so these are plain JS classes/functions; or
7
+ * - a thin wrapper over one of the low-level `__bridge_*` functions
8
+ * registered by host-functions.ts (fetch, datastore, parsers, sleep,
9
+ * console, crypto) — every one of those is JSON-string in, JSON-string
10
+ * (or thrown error) out, per bridge.ts.
11
+ *
12
+ * Known, deliberate simplifications (documented, not silent):
13
+ * - `crypto.randomUUID`/`getRandomValues` are ASYNC here (must `await`),
14
+ * unlike the real synchronous Web Crypto API — true randomness needs a
15
+ * real host entropy source, which means crossing the bridge.
16
+ * - `AbortController`/`AbortSignal` are a real but "cosmetic" polyfill: a
17
+ * signal can be checked/thrown-on synchronously, but aborting it does
18
+ * not cancel an in-flight host `fetch` already underway. The per-
19
+ * invocation wall-time cap is the actual backstop for a hung call.
20
+ * - `FormData` is a real data structure but `fetch` does not encode it as
21
+ * multipart/form-data — a tool needing genuine multipart upload isn't
22
+ * fully supported yet.
23
+ *
24
+ * Nothing else is reachable: no `process`, no filesystem, no host `require`.
25
+ */
26
+ export declare const SANDBOX_PRELUDE: string;