@vercel/factory 0.0.13 → 0.0.15

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 (458) hide show
  1. package/README.md +307 -1
  2. package/dist/agent-routes.d.mts +69 -0
  3. package/dist/agent-routes.mjs +64 -0
  4. package/dist/agent-routes.mjs.map +1 -0
  5. package/dist/api-contracts.d.mts +1749 -0
  6. package/dist/api-contracts.mjs +118 -0
  7. package/dist/api-contracts.mjs.map +1 -0
  8. package/dist/api-images.d.mts +30 -0
  9. package/dist/api-images.mjs +28 -0
  10. package/dist/api-images.mjs.map +1 -0
  11. package/dist/api-task-graph.mjs +57 -0
  12. package/dist/api-task-graph.mjs.map +1 -0
  13. package/dist/api.d.mts +77 -0
  14. package/dist/api.mjs +1087 -0
  15. package/dist/api.mjs.map +1 -0
  16. package/dist/approval-access.d.mts +39 -0
  17. package/dist/approval-access.mjs +62 -0
  18. package/dist/approval-access.mjs.map +1 -0
  19. package/dist/approval-contracts.d.mts +692 -0
  20. package/dist/approval-contracts.mjs +27 -0
  21. package/dist/approval-contracts.mjs.map +1 -0
  22. package/dist/approval.d.mts +49 -0
  23. package/dist/approval.mjs +39 -0
  24. package/dist/approval.mjs.map +1 -0
  25. package/dist/blob/artifacts.d.mts +37 -0
  26. package/dist/blob/artifacts.mjs +45 -0
  27. package/dist/blob/artifacts.mjs.map +1 -0
  28. package/dist/blob/index.d.mts +44 -8
  29. package/dist/blob/index.mjs +159 -35
  30. package/dist/blob/index.mjs.map +1 -1
  31. package/dist/budget.d.mts +108 -0
  32. package/dist/budget.mjs +141 -0
  33. package/dist/budget.mjs.map +1 -0
  34. package/dist/budgets.d.mts +4 -0
  35. package/dist/budgets.mjs +4 -0
  36. package/dist/build-factory.d.mts +6 -4
  37. package/dist/build-factory.mjs +2 -1
  38. package/dist/build-factory.mjs.map +1 -1
  39. package/dist/change-verification/brief.d.mts +9 -0
  40. package/dist/change-verification/brief.mjs +13 -0
  41. package/dist/change-verification/brief.mjs.map +1 -0
  42. package/dist/change-verification/dispatch.d.mts +24 -0
  43. package/dist/change-verification/dispatch.mjs +45 -0
  44. package/dist/change-verification/dispatch.mjs.map +1 -0
  45. package/dist/change-verification/eve-tool.d.mts +60 -0
  46. package/dist/change-verification/eve-tool.mjs +101 -0
  47. package/dist/change-verification/eve-tool.mjs.map +1 -0
  48. package/dist/changes/eve-record-change.d.mts +56 -0
  49. package/dist/changes/eve-record-change.mjs +97 -0
  50. package/dist/changes/eve-record-change.mjs.map +1 -0
  51. package/dist/changes/presentation.d.mts +14 -0
  52. package/dist/changes.d.mts +23 -0
  53. package/dist/changes.mjs +29 -0
  54. package/dist/changes.mjs.map +1 -0
  55. package/dist/client-events.d.mts +18 -0
  56. package/dist/client-events.mjs +41 -0
  57. package/dist/client-events.mjs.map +1 -0
  58. package/dist/client-stream.d.mts +28 -0
  59. package/dist/client-stream.mjs +204 -0
  60. package/dist/client-stream.mjs.map +1 -0
  61. package/dist/client-transcript.d.mts +41 -0
  62. package/dist/client-transcript.mjs +229 -0
  63. package/dist/client-transcript.mjs.map +1 -0
  64. package/dist/client.d.mts +234 -0
  65. package/dist/client.mjs +258 -0
  66. package/dist/client.mjs.map +1 -0
  67. package/dist/code-review/contracts.d.mts +26 -0
  68. package/dist/code-review/eve-post-review.d.mts +70 -0
  69. package/dist/code-review/eve-post-review.mjs +183 -0
  70. package/dist/code-review/eve-post-review.mjs.map +1 -0
  71. package/dist/code-review/eve-review-comments.d.mts +64 -0
  72. package/dist/code-review/eve-review-comments.mjs +159 -0
  73. package/dist/code-review/eve-review-comments.mjs.map +1 -0
  74. package/dist/code-review/github-contracts.d.mts +10 -0
  75. package/dist/code-review/github-reporter.d.mts +44 -0
  76. package/dist/code-review/github-reporter.mjs +260 -0
  77. package/dist/code-review/github-reporter.mjs.map +1 -0
  78. package/dist/code-review/preparation.d.mts +34 -0
  79. package/dist/code-review/preparation.mjs +23 -0
  80. package/dist/code-review/preparation.mjs.map +1 -0
  81. package/dist/code-review/stall.d.mts +17 -0
  82. package/dist/code-review/stall.mjs +30 -0
  83. package/dist/code-review/stall.mjs.map +1 -0
  84. package/dist/code-review.d.mts +6 -0
  85. package/dist/code-review.mjs +5 -0
  86. package/dist/communication.d.mts +9 -0
  87. package/dist/communication.mjs +9 -0
  88. package/dist/connectors/github.d.mts +26 -0
  89. package/dist/connectors/github.mjs +55 -0
  90. package/dist/connectors/github.mjs.map +1 -0
  91. package/dist/connectors/index.d.mts +35 -2
  92. package/dist/connectors/index.mjs +4 -26
  93. package/dist/connectors/index.mjs.map +1 -1
  94. package/dist/connectors/outbox.d.mts +34 -0
  95. package/dist/connectors/outbox.mjs +50 -0
  96. package/dist/connectors/outbox.mjs.map +1 -0
  97. package/dist/connectors/slack-approval-blocks.mjs +136 -0
  98. package/dist/connectors/slack-approval-blocks.mjs.map +1 -0
  99. package/dist/connectors/slack-approvals.d.mts +29 -0
  100. package/dist/connectors/slack-approvals.mjs +346 -0
  101. package/dist/connectors/slack-approvals.mjs.map +1 -0
  102. package/dist/connectors/slack.d.mts +35 -41
  103. package/dist/connectors/slack.mjs +13 -69
  104. package/dist/connectors/slack.mjs.map +1 -1
  105. package/dist/deepsec/eve-tool.d.mts +110 -0
  106. package/dist/deepsec/eve-tool.mjs +164 -0
  107. package/dist/deepsec/eve-tool.mjs.map +1 -0
  108. package/dist/deepsec/finding.d.mts +84 -0
  109. package/dist/deepsec/finding.mjs +56 -0
  110. package/dist/deepsec/finding.mjs.map +1 -0
  111. package/dist/deepsec.d.mts +3 -0
  112. package/dist/delivery-metrics/metrics.d.mts +93 -0
  113. package/dist/delivery-metrics/metrics.mjs +200 -0
  114. package/dist/delivery-metrics/metrics.mjs.map +1 -0
  115. package/dist/delivery-metrics.d.mts +2 -0
  116. package/dist/delivery-metrics.mjs +2 -0
  117. package/dist/dispatch.d.mts +81 -0
  118. package/dist/dispatch.mjs +140 -0
  119. package/dist/dispatch.mjs.map +1 -0
  120. package/dist/errors.d.mts +15 -0
  121. package/dist/errors.mjs +38 -0
  122. package/dist/errors.mjs.map +1 -0
  123. package/dist/eve/index.d.mts +143 -1561
  124. package/dist/eve/index.mjs +244 -1063
  125. package/dist/eve/index.mjs.map +1 -1
  126. package/dist/eve/invoke.d.mts +144 -0
  127. package/dist/eve/invoke.mjs +241 -0
  128. package/dist/eve/invoke.mjs.map +1 -0
  129. package/dist/eve/session-client.d.mts +68 -0
  130. package/dist/eve/session-client.mjs +131 -0
  131. package/dist/eve/session-client.mjs.map +1 -0
  132. package/dist/eve/task-execution.mjs +18 -0
  133. package/dist/eve/task-execution.mjs.map +1 -0
  134. package/dist/eve/task-session.d.mts +87 -0
  135. package/dist/eve/task-session.mjs +203 -0
  136. package/dist/eve/task-session.mjs.map +1 -0
  137. package/dist/eve/transcript.d.mts +37 -0
  138. package/dist/eve/transcript.mjs +65 -0
  139. package/dist/eve/transcript.mjs.map +1 -0
  140. package/dist/execution-public.d.mts +8 -0
  141. package/dist/execution-public.mjs +7 -0
  142. package/dist/execution.d.mts +75 -0
  143. package/dist/execution.mjs +153 -0
  144. package/dist/execution.mjs.map +1 -0
  145. package/dist/finding-remediation/admission.d.mts +51 -0
  146. package/dist/finding-remediation/admission.mjs +87 -0
  147. package/dist/finding-remediation/admission.mjs.map +1 -0
  148. package/dist/finding-remediation/brief.d.mts +14 -0
  149. package/dist/finding-remediation/brief.mjs +25 -0
  150. package/dist/finding-remediation/brief.mjs.map +1 -0
  151. package/dist/finding-remediation/eve-tool.d.mts +29 -0
  152. package/dist/finding-remediation/eve-tool.mjs +34 -0
  153. package/dist/finding-remediation/eve-tool.mjs.map +1 -0
  154. package/dist/findings/fingerprint.d.mts +14 -0
  155. package/dist/findings/fingerprint.mjs +28 -0
  156. package/dist/findings/fingerprint.mjs.map +1 -0
  157. package/dist/findings.d.mts +6 -0
  158. package/dist/findings.mjs +6 -0
  159. package/dist/github-app.d.mts +54 -0
  160. package/dist/github-app.mjs +121 -0
  161. package/dist/github-app.mjs.map +1 -0
  162. package/dist/github-publication.d.mts +198 -0
  163. package/dist/github-publication.mjs +429 -0
  164. package/dist/github-publication.mjs.map +1 -0
  165. package/dist/github-transfer.d.mts +72 -0
  166. package/dist/github-transfer.mjs +125 -0
  167. package/dist/github-transfer.mjs.map +1 -0
  168. package/dist/github.d.mts +406 -2
  169. package/dist/github.mjs +250 -37
  170. package/dist/github.mjs.map +1 -1
  171. package/dist/image-input.d.mts +51 -0
  172. package/dist/image-input.mjs +63 -0
  173. package/dist/image-input.mjs.map +1 -0
  174. package/dist/index.d.mts +14 -314
  175. package/dist/index.mjs +14 -1124
  176. package/dist/intake-contracts.d.mts +56 -0
  177. package/dist/intake-contracts.mjs +33 -0
  178. package/dist/intake-contracts.mjs.map +1 -0
  179. package/dist/integrations/deepsec.d.mts +4 -0
  180. package/dist/integrations/deepsec.mjs +3 -0
  181. package/dist/integrations/github.d.mts +11 -0
  182. package/dist/integrations/github.mjs +9 -0
  183. package/dist/integrations/slack.d.mts +3 -0
  184. package/dist/integrations/slack.mjs +3 -0
  185. package/dist/integrations/vercel.d.mts +3 -0
  186. package/dist/integrations/vercel.mjs +3 -0
  187. package/dist/merge-resolution/contracts.d.mts +17 -0
  188. package/dist/merge-resolution/contracts.mjs +19 -0
  189. package/dist/merge-resolution/contracts.mjs.map +1 -0
  190. package/dist/merge-resolution/eve-tools.d.mts +46 -0
  191. package/dist/merge-resolution/eve-tools.mjs +117 -0
  192. package/dist/merge-resolution/eve-tools.mjs.map +1 -0
  193. package/dist/multi-repository-changes/coordination.d.mts +49 -0
  194. package/dist/multi-repository-changes/coordination.mjs +115 -0
  195. package/dist/multi-repository-changes/coordination.mjs.map +1 -0
  196. package/dist/planning/cancellation.mjs +82 -0
  197. package/dist/planning/cancellation.mjs.map +1 -0
  198. package/dist/planning/configuration.d.mts +23 -0
  199. package/dist/planning/configuration.mjs +56 -0
  200. package/dist/planning/configuration.mjs.map +1 -0
  201. package/dist/planning/contracts.d.mts +136 -0
  202. package/dist/planning/contracts.mjs +42 -0
  203. package/dist/planning/contracts.mjs.map +1 -0
  204. package/dist/planning/dependencies.mjs +44 -0
  205. package/dist/planning/dependencies.mjs.map +1 -0
  206. package/dist/planning/effects.mjs +122 -0
  207. package/dist/planning/effects.mjs.map +1 -0
  208. package/dist/planning/reconcile.mjs +273 -0
  209. package/dist/planning/reconcile.mjs.map +1 -0
  210. package/dist/planning/runtime.d.mts +27 -0
  211. package/dist/planning/runtime.mjs +25 -0
  212. package/dist/planning/runtime.mjs.map +1 -0
  213. package/dist/planning/state.mjs +92 -0
  214. package/dist/planning/state.mjs.map +1 -0
  215. package/dist/planning/turns.mjs +262 -0
  216. package/dist/planning/turns.mjs.map +1 -0
  217. package/dist/planning/validation.mjs +106 -0
  218. package/dist/planning/validation.mjs.map +1 -0
  219. package/dist/postgres/index.d.mts +7 -1
  220. package/dist/postgres/index.mjs +7 -3
  221. package/dist/postgres/index.mjs.map +1 -1
  222. package/dist/presets/software-development/approval.d.mts +14 -0
  223. package/dist/presets/software-development/approval.mjs +21 -0
  224. package/dist/presets/software-development/approval.mjs.map +1 -0
  225. package/dist/presets/software-development/deepsec-brief.d.mts +8 -0
  226. package/dist/presets/software-development/deepsec-brief.mjs +14 -0
  227. package/dist/presets/software-development/deepsec-brief.mjs.map +1 -0
  228. package/dist/presets/software-development/dispatch.d.mts +53 -0
  229. package/dist/presets/software-development/dispatch.mjs +66 -0
  230. package/dist/presets/software-development/dispatch.mjs.map +1 -0
  231. package/dist/presets/software-development/eve-delegation-policy.d.mts +7 -0
  232. package/dist/presets/software-development/eve-delegation-policy.mjs +34 -0
  233. package/dist/presets/software-development/eve-delegation-policy.mjs.map +1 -0
  234. package/dist/presets/software-development/eve.d.mts +18 -0
  235. package/dist/presets/software-development/eve.mjs +19 -0
  236. package/dist/presets/software-development/eve.mjs.map +1 -0
  237. package/dist/presets/software-development/finish-task-policy.d.mts +7 -0
  238. package/dist/presets/software-development/finish-task-policy.mjs +9 -0
  239. package/dist/presets/software-development/finish-task-policy.mjs.map +1 -0
  240. package/dist/presets/software-development/recovery.d.mts +32 -0
  241. package/dist/presets/software-development/recovery.mjs +120 -0
  242. package/dist/presets/software-development/recovery.mjs.map +1 -0
  243. package/dist/presets/software-development/task-communication.d.mts +23 -0
  244. package/dist/presets/software-development/task-communication.mjs +120 -0
  245. package/dist/presets/software-development/task-communication.mjs.map +1 -0
  246. package/dist/presets/software-development.d.mts +9 -0
  247. package/dist/presets/software-development.mjs +9 -0
  248. package/dist/pull-requests/contracts.d.mts +72 -0
  249. package/dist/pull-requests/eve-fetch.d.mts +57 -0
  250. package/dist/pull-requests/eve-fetch.mjs +151 -0
  251. package/dist/pull-requests/eve-fetch.mjs.map +1 -0
  252. package/dist/pull-requests/github-label-manager.d.mts +27 -0
  253. package/dist/pull-requests/github-label-manager.mjs +40 -0
  254. package/dist/pull-requests/github-label-manager.mjs.map +1 -0
  255. package/dist/pull-requests/github-publisher.d.mts +53 -0
  256. package/dist/pull-requests/github-publisher.mjs +345 -0
  257. package/dist/pull-requests/github-publisher.mjs.map +1 -0
  258. package/dist/pull-requests.d.mts +5 -0
  259. package/dist/pull-requests.mjs +4 -0
  260. package/dist/receipts.d.mts +4 -0
  261. package/dist/receipts.mjs +3 -0
  262. package/dist/repositories.d.mts +18 -0
  263. package/dist/repositories.mjs +33 -0
  264. package/dist/repositories.mjs.map +1 -0
  265. package/dist/sandbox/command.d.mts +18 -0
  266. package/dist/sandbox/execution-abort.d.mts +16 -0
  267. package/dist/sandbox/execution-abort.mjs +49 -0
  268. package/dist/sandbox/execution-abort.mjs.map +1 -0
  269. package/dist/sandbox/execution-environment.d.mts +25 -0
  270. package/dist/sandbox/execution-run-ledger.d.mts +115 -0
  271. package/dist/sandbox/execution-run-ledger.mjs +209 -0
  272. package/dist/sandbox/execution-run-ledger.mjs.map +1 -0
  273. package/dist/sandbox/execution.d.mts +54 -0
  274. package/dist/sandbox/execution.mjs +228 -0
  275. package/dist/sandbox/execution.mjs.map +1 -0
  276. package/dist/sandbox/harness-runner.d.mts +79 -0
  277. package/dist/sandbox/harness-runner.mjs +162 -0
  278. package/dist/sandbox/harness-runner.mjs.map +1 -0
  279. package/dist/sandbox/index.d.mts +9 -0
  280. package/dist/sandbox/index.mjs +7 -0
  281. package/dist/sandbox/task-environment.d.mts +50 -0
  282. package/dist/sandbox/task-environment.mjs +140 -0
  283. package/dist/sandbox/task-environment.mjs.map +1 -0
  284. package/dist/sandbox/workspace.d.mts +29 -0
  285. package/dist/sandbox/workspace.mjs +28 -0
  286. package/dist/sandbox/workspace.mjs.map +1 -0
  287. package/dist/schema/agent-route.d.mts +22 -0
  288. package/dist/schema/agent-route.mjs +15 -0
  289. package/dist/schema/agent-route.mjs.map +1 -0
  290. package/dist/schema/answer.d.mts +23 -0
  291. package/dist/schema/answer.mjs +21 -0
  292. package/dist/schema/answer.mjs.map +1 -0
  293. package/dist/schema/budget.d.mts +38 -0
  294. package/dist/schema/budget.mjs +30 -0
  295. package/dist/schema/budget.mjs.map +1 -0
  296. package/dist/schema/catalog.mjs +72 -0
  297. package/dist/schema/catalog.mjs.map +1 -0
  298. package/dist/schema/change.d.mts +117 -0
  299. package/dist/schema/change.mjs +68 -0
  300. package/dist/schema/change.mjs.map +1 -0
  301. package/dist/schema/common.d.mts +33 -0
  302. package/dist/{id-DwCihQr4.mjs → schema/common.mjs} +7 -14
  303. package/dist/schema/common.mjs.map +1 -0
  304. package/dist/schema/communication.d.mts +52 -0
  305. package/dist/schema/communication.mjs +35 -0
  306. package/dist/schema/communication.mjs.map +1 -0
  307. package/dist/schema/execution.d.mts +101 -0
  308. package/dist/schema/execution.mjs +86 -0
  309. package/dist/schema/execution.mjs.map +1 -0
  310. package/dist/schema/factory-config.d.mts +95 -0
  311. package/dist/schema/factory-config.mjs +60 -0
  312. package/dist/schema/factory-config.mjs.map +1 -0
  313. package/dist/schema/finding.d.mts +125 -0
  314. package/dist/schema/finding.mjs +67 -0
  315. package/dist/schema/finding.mjs.map +1 -0
  316. package/dist/schema/id.d.mts +43 -0
  317. package/dist/schema/id.mjs +32 -0
  318. package/dist/schema/id.mjs.map +1 -0
  319. package/dist/schema/outbox.d.mts +240 -0
  320. package/dist/schema/outbox.mjs +53 -0
  321. package/dist/schema/outbox.mjs.map +1 -0
  322. package/dist/schema/question-route.mjs +16 -0
  323. package/dist/schema/question-route.mjs.map +1 -0
  324. package/dist/schema/receipt.d.mts +81 -0
  325. package/dist/schema/receipt.mjs +94 -0
  326. package/dist/schema/receipt.mjs.map +1 -0
  327. package/dist/schema/repository.d.mts +26 -0
  328. package/dist/schema/repository.mjs +25 -0
  329. package/dist/schema/repository.mjs.map +1 -0
  330. package/dist/schema/session.d.mts +135 -0
  331. package/dist/schema/session.mjs +53 -0
  332. package/dist/schema/session.mjs.map +1 -0
  333. package/dist/schema/signal.d.mts +105 -0
  334. package/dist/schema/signal.mjs +81 -0
  335. package/dist/schema/signal.mjs.map +1 -0
  336. package/dist/schema/stored-session.mjs +10 -0
  337. package/dist/schema/stored-session.mjs.map +1 -0
  338. package/dist/schema/stored-task.mjs +20 -0
  339. package/dist/schema/stored-task.mjs.map +1 -0
  340. package/dist/schema/task-effect.d.mts +39 -0
  341. package/dist/schema/task-effect.mjs +29 -0
  342. package/dist/schema/task-effect.mjs.map +1 -0
  343. package/dist/schema/task-graph.d.mts +3134 -0
  344. package/dist/schema/task-graph.mjs +97 -0
  345. package/dist/schema/task-graph.mjs.map +1 -0
  346. package/dist/schema/task-message.d.mts +254 -0
  347. package/dist/schema/task-message.mjs +189 -0
  348. package/dist/schema/task-message.mjs.map +1 -0
  349. package/dist/schema/task.d.mts +272 -0
  350. package/dist/schema/task.mjs +199 -0
  351. package/dist/schema/task.mjs.map +1 -0
  352. package/dist/schema/transcript.d.mts +170 -0
  353. package/dist/schema/transcript.mjs +86 -0
  354. package/dist/schema/transcript.mjs.map +1 -0
  355. package/dist/schema/transitions.d.mts +50 -0
  356. package/dist/schema/transitions.mjs +303 -0
  357. package/dist/schema/transitions.mjs.map +1 -0
  358. package/dist/schema/work.d.mts +101 -0
  359. package/dist/schema/work.mjs +102 -0
  360. package/dist/schema/work.mjs.map +1 -0
  361. package/dist/signal-triage.d.mts +20 -0
  362. package/dist/signal-triage.mjs +85 -0
  363. package/dist/signal-triage.mjs.map +1 -0
  364. package/dist/signals.d.mts +19 -0
  365. package/dist/signals.mjs +19 -0
  366. package/dist/signals.mjs.map +1 -0
  367. package/dist/stall.d.mts +38 -0
  368. package/dist/stall.mjs +79 -0
  369. package/dist/stall.mjs.map +1 -0
  370. package/dist/storage.d.mts +4 -0
  371. package/dist/storage.mjs +4 -0
  372. package/dist/store/driver.d.mts +65 -0
  373. package/dist/store/driver.mjs +42 -0
  374. package/dist/store/driver.mjs.map +1 -0
  375. package/dist/store/engine.d.mts +485 -0
  376. package/dist/store/engine.mjs +2175 -0
  377. package/dist/store/engine.mjs.map +1 -0
  378. package/dist/store/memory.d.mts +7 -0
  379. package/dist/store/memory.mjs +52 -0
  380. package/dist/store/memory.mjs.map +1 -0
  381. package/dist/store/task-effects.d.mts +38 -0
  382. package/dist/store/task-effects.mjs +118 -0
  383. package/dist/store/task-effects.mjs.map +1 -0
  384. package/dist/store/task-graphs.d.mts +60 -0
  385. package/dist/store/task-graphs.mjs +212 -0
  386. package/dist/store/task-graphs.mjs.map +1 -0
  387. package/dist/store/task-messages.d.mts +136 -0
  388. package/dist/store/task-messages.mjs +475 -0
  389. package/dist/store/task-messages.mjs.map +1 -0
  390. package/dist/store/task-work.d.mts +65 -0
  391. package/dist/store/task-work.mjs +134 -0
  392. package/dist/store/task-work.mjs.map +1 -0
  393. package/dist/store/work-notifications.d.mts +19 -0
  394. package/dist/store/work-notifications.mjs +48 -0
  395. package/dist/store/work-notifications.mjs.map +1 -0
  396. package/dist/sweep.d.mts +57 -0
  397. package/dist/sweep.mjs +143 -0
  398. package/dist/sweep.mjs.map +1 -0
  399. package/dist/task-communication.d.mts +35 -0
  400. package/dist/task-communication.mjs +47 -0
  401. package/dist/task-communication.mjs.map +1 -0
  402. package/dist/task-graph-view.d.mts +264 -0
  403. package/dist/task-graph-view.mjs +17 -0
  404. package/dist/task-graph-view.mjs.map +1 -0
  405. package/dist/task-message-processing.d.mts +60 -0
  406. package/dist/task-message-processing.mjs +200 -0
  407. package/dist/task-message-processing.mjs.map +1 -0
  408. package/dist/task-protocols.d.mts +80 -0
  409. package/dist/task-protocols.mjs +47 -0
  410. package/dist/task-protocols.mjs.map +1 -0
  411. package/dist/tasks.d.mts +17 -0
  412. package/dist/tasks.mjs +17 -0
  413. package/dist/vercel-git.d.mts +21 -0
  414. package/dist/vercel-git.mjs +112 -0
  415. package/dist/vercel-git.mjs.map +1 -0
  416. package/dist/vercel.d.mts +33 -2
  417. package/dist/vercel.mjs +48 -3
  418. package/dist/vercel.mjs.map +1 -1
  419. package/dist/work-triage/eve-tool.d.mts +29 -0
  420. package/dist/work-triage/eve-tool.mjs +32 -0
  421. package/dist/work-triage/eve-tool.mjs.map +1 -0
  422. package/dist/work-triage/find-existing-work.d.mts +32 -0
  423. package/dist/work-triage/find-existing-work.mjs +31 -0
  424. package/dist/work-triage/find-existing-work.mjs.map +1 -0
  425. package/dist/work-triage/github.d.mts +15 -0
  426. package/dist/work-triage/github.mjs +14 -0
  427. package/dist/work-triage/github.mjs.map +1 -0
  428. package/dist/work-triage.d.mts +3 -0
  429. package/dist/work-triage.mjs +3 -0
  430. package/dist/workflows.d.mts +48 -0
  431. package/dist/workflows.mjs +86 -0
  432. package/dist/workflows.mjs.map +1 -0
  433. package/dist/workspace-diff-assembly.d.mts +33 -0
  434. package/dist/workspace-diff-assembly.mjs +95 -0
  435. package/dist/workspace-diff-assembly.mjs.map +1 -0
  436. package/dist/workspace-diff.d.mts +90 -0
  437. package/dist/workspace-diff.mjs +61 -0
  438. package/dist/workspace-diff.mjs.map +1 -0
  439. package/dist/workspace-snapshot.d.mts +26 -0
  440. package/dist/workspace-snapshot.mjs +80 -0
  441. package/dist/workspace-snapshot.mjs.map +1 -0
  442. package/package.json +129 -40
  443. package/dist/approval-CwhTP1XB.mjs +0 -269
  444. package/dist/approval-CwhTP1XB.mjs.map +0 -1
  445. package/dist/change-CzEAoFVE.mjs +0 -620
  446. package/dist/change-CzEAoFVE.mjs.map +0 -1
  447. package/dist/dispatch-B77cuPxh.d.mts +0 -713
  448. package/dist/driver-BJutB0PE.d.mts +0 -34
  449. package/dist/driver-Bbd25rNM.mjs +0 -23
  450. package/dist/driver-Bbd25rNM.mjs.map +0 -1
  451. package/dist/factory-config-BJcjsPKl.mjs +0 -86
  452. package/dist/factory-config-BJcjsPKl.mjs.map +0 -1
  453. package/dist/factory-config-D2yU3G0c.d.mts +0 -58
  454. package/dist/github-DXsxboUL.d.mts +0 -271
  455. package/dist/id-DwCihQr4.mjs.map +0 -1
  456. package/dist/index-Cy4jfXh5.d.mts +0 -67
  457. package/dist/index.mjs.map +0 -1
  458. package/dist/signal-CHVEmzvI.d.mts +0 -59
@@ -0,0 +1,32 @@
1
+ import { RepositoryId } from "../schema/id.mjs";
2
+ import { RepositorySlug } from "../schema/repository.mjs";
3
+ import { Task } from "../schema/task.mjs";
4
+ import { Change } from "../schema/change.mjs";
5
+ import { FactoryStores } from "../store/engine.mjs";
6
+ import { OpenPullRequest } from "../pull-requests/contracts.mjs";
7
+ //#region src/work-triage/find-existing-work.d.ts
8
+ /** Provider-neutral readers used to discover work already in progress. */
9
+ interface ExistingWorkLookupOptions {
10
+ listOpenPullRequests: (repository: RepositorySlug) => Promise<readonly OpenPullRequest[]>;
11
+ }
12
+ /** Stores, repository identity, and provider lookup used for one existing-work query. */
13
+ interface FindExistingWorkInput extends ExistingWorkLookupOptions {
14
+ stores: Pick<FactoryStores, "changes" | "repositories" | "tasks">;
15
+ repositoryId: RepositoryId;
16
+ }
17
+ /** The refusal or existing pull requests, Changes, and active Tasks found during triage. */
18
+ type ExistingWorkLookupResult = {
19
+ found: false;
20
+ reasonCode: "repository_not_found";
21
+ reason: string;
22
+ } | {
23
+ found: true;
24
+ openPullRequests: readonly OpenPullRequest[];
25
+ openChanges: readonly Change[];
26
+ activeTasks: readonly Task[];
27
+ };
28
+ /** Find open pull requests, Changes, and active Tasks for one repository. */
29
+ declare function findExistingWork(input: FindExistingWorkInput): Promise<ExistingWorkLookupResult>;
30
+ //#endregion
31
+ export { ExistingWorkLookupOptions, ExistingWorkLookupResult, FindExistingWorkInput, findExistingWork };
32
+ //# sourceMappingURL=find-existing-work.d.mts.map
@@ -0,0 +1,31 @@
1
+ //#region src/work-triage/find-existing-work.ts
2
+ const openChangeStates = /* @__PURE__ */ new Set(["verifying", "ready"]);
3
+ const activeTaskStates = /* @__PURE__ */ new Set([
4
+ "queued",
5
+ "running",
6
+ "needs_human"
7
+ ]);
8
+ /** Find open pull requests, Changes, and active Tasks for one repository. */
9
+ async function findExistingWork(input) {
10
+ const repository = await input.stores.repositories.get(input.repositoryId);
11
+ if (repository === null) return {
12
+ found: false,
13
+ reasonCode: "repository_not_found",
14
+ reason: `repository ${input.repositoryId} does not exist`
15
+ };
16
+ const [openPullRequests, changes, tasks] = await Promise.all([
17
+ input.listOpenPullRequests(repository.slug),
18
+ input.stores.changes.list(),
19
+ input.stores.tasks.list()
20
+ ]);
21
+ return {
22
+ found: true,
23
+ openPullRequests,
24
+ openChanges: changes.filter((change) => change.repositoryId === input.repositoryId && openChangeStates.has(change.state)),
25
+ activeTasks: tasks.filter((task) => task.repositoryIds.includes(input.repositoryId) && activeTaskStates.has(task.state))
26
+ };
27
+ }
28
+ //#endregion
29
+ export { findExistingWork };
30
+
31
+ //# sourceMappingURL=find-existing-work.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-existing-work.mjs","names":[],"sources":["../../src/work-triage/find-existing-work.ts"],"sourcesContent":["import type { Change } from \"../schema/change\";\nimport type { Task } from \"../schema/task\";\nimport type { FactoryStores } from \"../store/engine\";\nimport type { OpenPullRequest } from \"../pull-requests/contracts\";\nimport type { RepositoryId } from \"../schema/id\";\nimport type { RepositorySlug } from \"../schema/repository\";\n\n/** Provider-neutral readers used to discover work already in progress. */\nexport interface ExistingWorkLookupOptions {\n listOpenPullRequests: (repository: RepositorySlug) => Promise<readonly OpenPullRequest[]>;\n}\n\n/** Stores, repository identity, and provider lookup used for one existing-work query. */\nexport interface FindExistingWorkInput extends ExistingWorkLookupOptions {\n stores: Pick<FactoryStores, \"changes\" | \"repositories\" | \"tasks\">;\n repositoryId: RepositoryId;\n}\n\n/** The refusal or existing pull requests, Changes, and active Tasks found during triage. */\nexport type ExistingWorkLookupResult =\n | { found: false; reasonCode: \"repository_not_found\"; reason: string }\n | {\n found: true;\n openPullRequests: readonly OpenPullRequest[];\n openChanges: readonly Change[];\n activeTasks: readonly Task[];\n };\n\nconst openChangeStates: ReadonlySet<Change[\"state\"]> = new Set([\"verifying\", \"ready\"]);\nconst activeTaskStates: ReadonlySet<Task[\"state\"]> = new Set([\"queued\", \"running\", \"needs_human\"]);\n\n/** Find open pull requests, Changes, and active Tasks for one repository. */\nexport async function findExistingWork(\n input: FindExistingWorkInput,\n): Promise<ExistingWorkLookupResult> {\n const repository = await input.stores.repositories.get(input.repositoryId);\n if (repository === null) {\n return {\n found: false,\n reasonCode: \"repository_not_found\",\n reason: `repository ${input.repositoryId} does not exist`,\n };\n }\n const [openPullRequests, changes, tasks] = await Promise.all([\n input.listOpenPullRequests(repository.slug),\n input.stores.changes.list(),\n input.stores.tasks.list(),\n ]);\n return {\n found: true,\n openPullRequests,\n openChanges: changes.filter(\n (change) => change.repositoryId === input.repositoryId && openChangeStates.has(change.state),\n ),\n activeTasks: tasks.filter(\n (task) => task.repositoryIds.includes(input.repositoryId) && activeTaskStates.has(task.state),\n ),\n };\n}\n"],"mappings":";AA4BA,MAAM,mCAAiD,IAAI,IAAI,CAAC,aAAa,OAAO,CAAC;AACrF,MAAM,mCAA+C,IAAI,IAAI;CAAC;CAAU;CAAW;AAAa,CAAC;;AAGjG,eAAsB,iBACpB,OACmC;CACnC,MAAM,aAAa,MAAM,MAAM,OAAO,aAAa,IAAI,MAAM,YAAY;CACzE,IAAI,eAAe,MACjB,OAAO;EACL,OAAO;EACP,YAAY;EACZ,QAAQ,cAAc,MAAM,aAAa;CAC3C;CAEF,MAAM,CAAC,kBAAkB,SAAS,SAAS,MAAM,QAAQ,IAAI;EAC3D,MAAM,qBAAqB,WAAW,IAAI;EAC1C,MAAM,OAAO,QAAQ,KAAK;EAC1B,MAAM,OAAO,MAAM,KAAK;CAC1B,CAAC;CACD,OAAO;EACL,OAAO;EACP;EACA,aAAa,QAAQ,QAClB,WAAW,OAAO,iBAAiB,MAAM,gBAAgB,iBAAiB,IAAI,OAAO,KAAK,CAC7F;EACA,aAAa,MAAM,QAChB,SAAS,KAAK,cAAc,SAAS,MAAM,YAAY,KAAK,iBAAiB,IAAI,KAAK,KAAK,CAC9F;CACF;AACF"}
@@ -0,0 +1,15 @@
1
+ import { RepositorySlug } from "../schema/repository.mjs";
2
+ import { OpenPullRequest } from "../pull-requests/contracts.mjs";
3
+ //#region src/work-triage/github.d.ts
4
+ /** Lists open GitHub pull requests for one repository during work triage. */
5
+ type GitHubOpenPullRequestLister = (repository: RepositorySlug) => Promise<readonly OpenPullRequest[]>;
6
+ /** GitHub credentials and transport used to list open pull requests during work triage. */
7
+ interface GitHubOpenPullRequestListerOptions {
8
+ tokenForRepository: (repository: RepositorySlug) => Promise<string>;
9
+ fetch?: typeof globalThis.fetch;
10
+ }
11
+ /** Create the GitHub open-pull-request reader consumed by provider-neutral work triage. */
12
+ declare function createGitHubOpenPullRequestLister(options: GitHubOpenPullRequestListerOptions): GitHubOpenPullRequestLister;
13
+ //#endregion
14
+ export { GitHubOpenPullRequestLister, GitHubOpenPullRequestListerOptions, createGitHubOpenPullRequestLister };
15
+ //# sourceMappingURL=github.d.mts.map
@@ -0,0 +1,14 @@
1
+ import { listOpenPullRequests } from "../github.mjs";
2
+ //#region src/work-triage/github.ts
3
+ /** Create the GitHub open-pull-request reader consumed by provider-neutral work triage. */
4
+ function createGitHubOpenPullRequestLister(options) {
5
+ return async (repository) => listOpenPullRequests({
6
+ repository,
7
+ token: await options.tokenForRepository(repository),
8
+ fetch: options.fetch
9
+ });
10
+ }
11
+ //#endregion
12
+ export { createGitHubOpenPullRequestLister };
13
+
14
+ //# sourceMappingURL=github.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.mjs","names":[],"sources":["../../src/work-triage/github.ts"],"sourcesContent":["import { listOpenPullRequests } from \"../github\";\nimport type { OpenPullRequest } from \"../pull-requests/contracts\";\nimport type { RepositorySlug } from \"../schema/repository\";\n\n/** Lists open GitHub pull requests for one repository during work triage. */\nexport type GitHubOpenPullRequestLister = (\n repository: RepositorySlug,\n) => Promise<readonly OpenPullRequest[]>;\n\n/** GitHub credentials and transport used to list open pull requests during work triage. */\nexport interface GitHubOpenPullRequestListerOptions {\n tokenForRepository: (repository: RepositorySlug) => Promise<string>;\n fetch?: typeof globalThis.fetch;\n}\n\n/** Create the GitHub open-pull-request reader consumed by provider-neutral work triage. */\nexport function createGitHubOpenPullRequestLister(\n options: GitHubOpenPullRequestListerOptions,\n): GitHubOpenPullRequestLister {\n return async (repository) =>\n listOpenPullRequests({\n repository,\n token: await options.tokenForRepository(repository),\n fetch: options.fetch,\n });\n}\n"],"mappings":";;;AAgBA,SAAgB,kCACd,SAC6B;CAC7B,OAAO,OAAO,eACZ,qBAAqB;EACnB;EACA,OAAO,MAAM,QAAQ,mBAAmB,UAAU;EAClD,OAAO,QAAQ;CACjB,CAAC;AACL"}
@@ -0,0 +1,3 @@
1
+ import { ExistingWorkLookupOptions, ExistingWorkLookupResult, FindExistingWorkInput, findExistingWork } from "./work-triage/find-existing-work.mjs";
2
+ import { FindExistingWorkTool, FindExistingWorkToolInput, FindExistingWorkToolOptions, FindExistingWorkToolStores, createFindExistingWorkTool } from "./work-triage/eve-tool.mjs";
3
+ export { type ExistingWorkLookupOptions, type ExistingWorkLookupResult, type FindExistingWorkInput, type FindExistingWorkTool, type FindExistingWorkToolInput, type FindExistingWorkToolOptions, type FindExistingWorkToolStores, createFindExistingWorkTool, findExistingWork };
@@ -0,0 +1,3 @@
1
+ import { findExistingWork } from "./work-triage/find-existing-work.mjs";
2
+ import { createFindExistingWorkTool } from "./work-triage/eve-tool.mjs";
3
+ export { createFindExistingWorkTool, findExistingWork };
@@ -0,0 +1,48 @@
1
+ import { AgentRouteBinding, AgentRouteBindingInput, agentRouteBindingSchema, parseAgentRouteBinding } from "./schema/agent-route.mjs";
2
+ import { JsonValue, MAX_WORK_JSON_BYTES, MAX_WORK_JSON_DEPTH, TaskWork, TaskWorkOptions, TaskWorkResult, WorkflowBinding, WorkflowBindingInput, WorkflowReference, WorkflowReferenceInput, WorkflowTaskWorkOptions, jsonValueSchema, parseWorkflowBinding, taskWork, taskWorkResultSchema, taskWorkSchema, workflowBindingSchema } from "./schema/work.mjs";
3
+ import { AgentRoute, AgentRouteInput, AgentRouteKey, AgentRouteRegistry, RouteTaskWorkOptions, RoutedTaskWork, agentRouteSchema, defineAgentRoutes, routeKey, routeTaskWork } from "./agent-routes.mjs";
4
+ import { z } from "zod";
5
+ //#region src/workflows.d.ts
6
+ /** Generic `task@1` workflow accepting bounded JSON input and output. */
7
+ declare const defaultTaskWorkflow: Readonly<WorkflowDefinition<z.ZodCustom<JsonValue, JsonValue>, z.ZodCustom<JsonValue, JsonValue>, "task", 1>>;
8
+ /** Caller input accepted when defining one exact workflow contract. */
9
+ interface WorkflowDefinitionInput<Input extends z.ZodType = z.ZodType, Output extends z.ZodType = z.ZodType, Id extends string = string, Version extends number = number> {
10
+ readonly id: Id;
11
+ readonly version: Version;
12
+ readonly input: Input;
13
+ readonly output: Output;
14
+ /** Required when input transformation changes the stored shape; must preserve canonical JSON. */
15
+ readonly storedInput?: z.ZodType<NoInfer<z.output<Input>>>;
16
+ /** Required when output transformation changes the stored shape; must preserve canonical JSON. */
17
+ readonly storedOutput?: z.ZodType<NoInfer<z.output<Output>>>;
18
+ }
19
+ /** Exact-version workflow contract with a typed binding for constructing work. */
20
+ interface WorkflowDefinition<Input extends z.ZodType = z.ZodType, Output extends z.ZodType = z.ZodType, Id extends string = string, Version extends number = number> extends WorkflowDefinitionInput<Input, Output, Id, Version>, WorkflowReference<Input, WorkflowBinding<z.input<Input> & JsonValue, z.input<Output> & JsonValue, Id, Version>> {}
21
+ /** JSON input accepted by a workflow definition before its schema transforms it. */
22
+ type WorkflowInput<Definition extends WorkflowDefinition> = z.input<Definition["input"]> & JsonValue;
23
+ /** JSON output accepted by a workflow definition before its schema transforms it. */
24
+ type WorkflowOutput<Definition extends WorkflowDefinition> = z.input<Definition["output"]> & JsonValue;
25
+ type RegisteredWorkflow<Definition extends WorkflowDefinitionInput> = Definition extends WorkflowDefinitionInput<infer Input, infer Output, infer Id, infer Version> ? WorkflowDefinition<Input, Output, Id, Version> : never;
26
+ type WorkflowForBinding<Definition extends WorkflowDefinition, Binding extends WorkflowBinding> = Definition extends WorkflowDefinition ? Binding extends {
27
+ readonly id: Definition["id"];
28
+ readonly version: Definition["version"];
29
+ } ? Definition : Definition extends {
30
+ readonly id: Binding["id"];
31
+ readonly version: Binding["version"];
32
+ } ? Definition : never : never;
33
+ /** Immutable registry that validates data against exact workflow versions. */
34
+ interface WorkflowRegistry<Definition extends WorkflowDefinition = WorkflowDefinition> {
35
+ readonly definitions: readonly Readonly<Definition>[];
36
+ resolve<const Binding extends WorkflowBinding>(binding: Binding): Readonly<WorkflowForBinding<Definition, Binding>>;
37
+ validateInput(binding: WorkflowBinding, value: unknown): JsonValue;
38
+ validateOutput(binding: WorkflowBinding, value: unknown): JsonValue;
39
+ validateStoredInput(binding: WorkflowBinding, value: unknown): JsonValue;
40
+ validateStoredOutput(binding: WorkflowBinding, value: unknown): JsonValue;
41
+ }
42
+ /** Validates and freezes one exact workflow definition without executing it. */
43
+ declare function defineWorkflow<Input extends z.ZodType, Output extends z.ZodType, const Id extends string, const Version extends number>(definition: WorkflowDefinitionInput<Input, Output, Id, Version>): Readonly<WorkflowDefinition<Input, Output, Id, Version>>;
44
+ /** Builds an exact-version workflow registry and rejects duplicate definitions. */
45
+ declare function defineWorkflows<const Definition extends WorkflowDefinitionInput>(definitions: readonly Definition[]): WorkflowRegistry<RegisteredWorkflow<Definition>>;
46
+ //#endregion
47
+ export { type AgentRoute, type AgentRouteBinding, type AgentRouteBindingInput, type AgentRouteInput, type AgentRouteKey, type AgentRouteRegistry, type JsonValue, MAX_WORK_JSON_BYTES, MAX_WORK_JSON_DEPTH, type RouteTaskWorkOptions, type RoutedTaskWork, type TaskWork, type TaskWorkOptions, type TaskWorkResult, type WorkflowBinding, type WorkflowBindingInput, WorkflowDefinition, WorkflowDefinitionInput, WorkflowInput, WorkflowOutput, type WorkflowReference, type WorkflowReferenceInput, WorkflowRegistry, type WorkflowTaskWorkOptions, agentRouteBindingSchema, agentRouteSchema, defaultTaskWorkflow, defineAgentRoutes, defineWorkflow, defineWorkflows, jsonValueSchema, parseAgentRouteBinding, parseWorkflowBinding, routeKey, routeTaskWork, taskWork, taskWorkResultSchema, taskWorkSchema, workflowBindingSchema };
48
+ //# sourceMappingURL=workflows.d.mts.map
@@ -0,0 +1,86 @@
1
+ import { agentRouteBindingSchema, parseAgentRouteBinding } from "./schema/agent-route.mjs";
2
+ import { MAX_WORK_JSON_BYTES, MAX_WORK_JSON_DEPTH, jsonValueSchema, parseWorkflowBinding, taskWork, taskWorkResultSchema, taskWorkSchema, workflowBindingSchema } from "./schema/work.mjs";
3
+ import { agentRouteSchema, defineAgentRoutes, routeKey, routeTaskWork } from "./agent-routes.mjs";
4
+ import { z } from "zod";
5
+ import { isDeepStrictEqual } from "node:util";
6
+ //#region src/workflows.ts
7
+ /** Generic `task@1` workflow accepting bounded JSON input and output. */
8
+ const defaultTaskWorkflow = defineWorkflow({
9
+ id: "task",
10
+ version: 1,
11
+ input: jsonValueSchema,
12
+ output: jsonValueSchema
13
+ });
14
+ /** Validates and freezes one exact workflow definition without executing it. */
15
+ function defineWorkflow(definition) {
16
+ const parsedBinding = parseWorkflowBinding({
17
+ id: definition.id,
18
+ version: definition.version
19
+ });
20
+ if (!(definition.input instanceof z.ZodType) || !(definition.output instanceof z.ZodType)) throw new Error(`Workflow ${definition.id}@${definition.version} requires Zod input and output schemas`);
21
+ for (const field of ["storedInput", "storedOutput"]) if (definition[field] !== void 0 && !(definition[field] instanceof z.ZodType)) throw new Error(`Workflow ${definition.id}@${definition.version} requires a Zod ${field} schema`);
22
+ const binding = Object.freeze(parsedBinding);
23
+ return Object.freeze({
24
+ id: definition.id,
25
+ version: definition.version,
26
+ binding,
27
+ input: definition.input,
28
+ output: definition.output,
29
+ storedInput: definition.storedInput,
30
+ storedOutput: definition.storedOutput
31
+ });
32
+ }
33
+ /** Builds an exact-version workflow registry and rejects duplicate definitions. */
34
+ function defineWorkflows(definitions) {
35
+ const registered = definitions.map((definition) => defineWorkflow(definition));
36
+ const byBinding = /* @__PURE__ */ new Map();
37
+ for (const definition of registered) {
38
+ const key = `${definition.id}@${definition.version}`;
39
+ if (byBinding.has(key)) throw new Error(`Duplicate workflow definition ${key}; register each id and version exactly once`);
40
+ byBinding.set(key, definition);
41
+ }
42
+ function resolve(binding) {
43
+ const { id, version } = workflowBindingSchema.parse(binding);
44
+ const key = `${id}@${version}`;
45
+ const definition = byBinding.get(key);
46
+ if (!definition) {
47
+ const alternatives = [...byBinding.keys()].sort().join(", ") || "none";
48
+ throw new Error(`Unknown workflow ${key}. Registered workflows: ${alternatives}`);
49
+ }
50
+ return definition;
51
+ }
52
+ const validateStored = (binding, value, field) => {
53
+ const definition = resolve(binding);
54
+ const storedField = field === "input" ? "storedInput" : "storedOutput";
55
+ const storedSchema = definition[storedField];
56
+ const json = structuredClone(jsonValueSchema.parse(value));
57
+ let parsed;
58
+ try {
59
+ parsed = (storedSchema ?? definition[field]).parse(structuredClone(json));
60
+ } catch (cause) {
61
+ if (storedSchema !== void 0) throw cause;
62
+ throw new Error(`Workflow ${definition.id}@${definition.version} cannot validate stored ${field}; provide ${storedField} when the ${field} transform changes shape`, { cause });
63
+ }
64
+ const validated = jsonValueSchema.parse(parsed);
65
+ if (!isDeepStrictEqual(json, validated)) throw new Error(`Workflow ${definition.id}@${definition.version} stored ${field} validation must preserve canonical JSON; provide a non-transforming ${storedField} schema`);
66
+ return structuredClone(validated);
67
+ };
68
+ const validate = (binding, value, field) => {
69
+ const definition = resolve(binding);
70
+ const json = jsonValueSchema.parse(value);
71
+ const parsed = jsonValueSchema.parse(definition[field].parse(structuredClone(json)));
72
+ return validateStored(binding, parsed, field);
73
+ };
74
+ return Object.freeze({
75
+ definitions: Object.freeze(registered),
76
+ resolve,
77
+ validateInput: (binding, value) => validate(binding, value, "input"),
78
+ validateOutput: (binding, value) => validate(binding, value, "output"),
79
+ validateStoredInput: (binding, value) => validateStored(binding, value, "input"),
80
+ validateStoredOutput: (binding, value) => validateStored(binding, value, "output")
81
+ });
82
+ }
83
+ //#endregion
84
+ export { MAX_WORK_JSON_BYTES, MAX_WORK_JSON_DEPTH, agentRouteBindingSchema, agentRouteSchema, defaultTaskWorkflow, defineAgentRoutes, defineWorkflow, defineWorkflows, jsonValueSchema, parseAgentRouteBinding, parseWorkflowBinding, routeKey, routeTaskWork, taskWork, taskWorkResultSchema, taskWorkSchema, workflowBindingSchema };
85
+
86
+ //# sourceMappingURL=workflows.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.mjs","names":[],"sources":["../src/workflows.ts"],"sourcesContent":["import { isDeepStrictEqual } from \"node:util\";\nimport { z } from \"zod\";\nimport {\n jsonValueSchema,\n parseWorkflowBinding,\n workflowBindingSchema,\n type JsonValue,\n type WorkflowBinding,\n type WorkflowReference,\n} from \"./schema/work\";\n\nexport {\n jsonValueSchema,\n MAX_WORK_JSON_BYTES,\n MAX_WORK_JSON_DEPTH,\n taskWork,\n taskWorkResultSchema,\n taskWorkSchema,\n parseWorkflowBinding,\n workflowBindingSchema,\n} from \"./schema/work\";\nexport {\n agentRouteBindingSchema,\n agentRouteSchema,\n defineAgentRoutes,\n parseAgentRouteBinding,\n routeKey,\n routeTaskWork,\n type AgentRoute,\n type AgentRouteBinding,\n type AgentRouteBindingInput,\n type AgentRouteInput,\n type AgentRouteKey,\n type AgentRouteRegistry,\n type RouteTaskWorkOptions,\n type RoutedTaskWork,\n} from \"./agent-routes\";\n\n/** Generic `task@1` workflow accepting bounded JSON input and output. */\nexport const defaultTaskWorkflow = defineWorkflow({\n id: \"task\",\n version: 1,\n input: jsonValueSchema,\n output: jsonValueSchema,\n});\nexport type {\n JsonValue,\n TaskWork,\n TaskWorkOptions,\n TaskWorkResult,\n WorkflowBinding,\n WorkflowBindingInput,\n WorkflowReference,\n WorkflowReferenceInput,\n WorkflowTaskWorkOptions,\n} from \"./schema/work\";\n\n/** Caller input accepted when defining one exact workflow contract. */\nexport interface WorkflowDefinitionInput<\n Input extends z.ZodType = z.ZodType,\n Output extends z.ZodType = z.ZodType,\n Id extends string = string,\n Version extends number = number,\n> {\n readonly id: Id;\n readonly version: Version;\n readonly input: Input;\n readonly output: Output;\n /** Required when input transformation changes the stored shape; must preserve canonical JSON. */\n readonly storedInput?: z.ZodType<NoInfer<z.output<Input>>>;\n /** Required when output transformation changes the stored shape; must preserve canonical JSON. */\n readonly storedOutput?: z.ZodType<NoInfer<z.output<Output>>>;\n}\n\n/** Exact-version workflow contract with a typed binding for constructing work. */\nexport interface WorkflowDefinition<\n Input extends z.ZodType = z.ZodType,\n Output extends z.ZodType = z.ZodType,\n Id extends string = string,\n Version extends number = number,\n>\n extends\n WorkflowDefinitionInput<Input, Output, Id, Version>,\n WorkflowReference<\n Input,\n WorkflowBinding<z.input<Input> & JsonValue, z.input<Output> & JsonValue, Id, Version>\n > {}\n\n/** JSON input accepted by a workflow definition before its schema transforms it. */\nexport type WorkflowInput<Definition extends WorkflowDefinition> = z.input<Definition[\"input\"]> &\n JsonValue;\n\n/** JSON output accepted by a workflow definition before its schema transforms it. */\nexport type WorkflowOutput<Definition extends WorkflowDefinition> = z.input<Definition[\"output\"]> &\n JsonValue;\n\ntype RegisteredWorkflow<Definition extends WorkflowDefinitionInput> =\n Definition extends WorkflowDefinitionInput<infer Input, infer Output, infer Id, infer Version>\n ? WorkflowDefinition<Input, Output, Id, Version>\n : never;\n\ntype WorkflowForBinding<\n Definition extends WorkflowDefinition,\n Binding extends WorkflowBinding,\n> = Definition extends WorkflowDefinition\n ? Binding extends {\n readonly id: Definition[\"id\"];\n readonly version: Definition[\"version\"];\n }\n ? Definition\n : Definition extends {\n readonly id: Binding[\"id\"];\n readonly version: Binding[\"version\"];\n }\n ? Definition\n : never\n : never;\n\n/** Immutable registry that validates data against exact workflow versions. */\nexport interface WorkflowRegistry<Definition extends WorkflowDefinition = WorkflowDefinition> {\n readonly definitions: readonly Readonly<Definition>[];\n resolve<const Binding extends WorkflowBinding>(\n binding: Binding,\n ): Readonly<WorkflowForBinding<Definition, Binding>>;\n validateInput(binding: WorkflowBinding, value: unknown): JsonValue;\n validateOutput(binding: WorkflowBinding, value: unknown): JsonValue;\n validateStoredInput(binding: WorkflowBinding, value: unknown): JsonValue;\n validateStoredOutput(binding: WorkflowBinding, value: unknown): JsonValue;\n}\n\n/** Validates and freezes one exact workflow definition without executing it. */\nexport function defineWorkflow<\n Input extends z.ZodType,\n Output extends z.ZodType,\n const Id extends string,\n const Version extends number,\n>(\n definition: WorkflowDefinitionInput<Input, Output, Id, Version>,\n): Readonly<WorkflowDefinition<Input, Output, Id, Version>> {\n const parsedBinding = parseWorkflowBinding({\n id: definition.id,\n version: definition.version,\n });\n if (!(definition.input instanceof z.ZodType) || !(definition.output instanceof z.ZodType)) {\n throw new Error(\n `Workflow ${definition.id}@${definition.version} requires Zod input and output schemas`,\n );\n }\n for (const field of [\"storedInput\", \"storedOutput\"] as const) {\n if (definition[field] !== undefined && !(definition[field] instanceof z.ZodType)) {\n throw new Error(\n `Workflow ${definition.id}@${definition.version} requires a Zod ${field} schema`,\n );\n }\n }\n const binding: WorkflowBinding<\n z.input<Input> & JsonValue,\n z.input<Output> & JsonValue,\n Id,\n Version\n > = Object.freeze(parsedBinding) as WorkflowBinding<\n z.input<Input> & JsonValue,\n z.input<Output> & JsonValue,\n Id,\n Version\n >;\n return Object.freeze({\n id: definition.id,\n version: definition.version,\n binding,\n input: definition.input,\n output: definition.output,\n storedInput: definition.storedInput,\n storedOutput: definition.storedOutput,\n });\n}\n\n/** Builds an exact-version workflow registry and rejects duplicate definitions. */\nexport function defineWorkflows<const Definition extends WorkflowDefinitionInput>(\n definitions: readonly Definition[],\n): WorkflowRegistry<RegisteredWorkflow<Definition>> {\n const registered = definitions.map((definition) =>\n defineWorkflow(definition),\n ) as unknown as readonly Readonly<RegisteredWorkflow<Definition>>[];\n const byBinding = new Map<string, Readonly<RegisteredWorkflow<Definition>>>();\n for (const definition of registered) {\n const key = `${definition.id}@${definition.version}`;\n if (byBinding.has(key)) {\n throw new Error(\n `Duplicate workflow definition ${key}; register each id and version exactly once`,\n );\n }\n byBinding.set(key, definition);\n }\n\n function resolve<const Binding extends WorkflowBinding>(\n binding: Binding,\n ): Readonly<WorkflowForBinding<RegisteredWorkflow<Definition>, Binding>>;\n function resolve(binding: WorkflowBinding): Readonly<RegisteredWorkflow<Definition>> {\n const { id, version } = workflowBindingSchema.parse(binding);\n const key = `${id}@${version}`;\n const definition = byBinding.get(key);\n if (!definition) {\n const alternatives = [...byBinding.keys()].sort().join(\", \") || \"none\";\n throw new Error(`Unknown workflow ${key}. Registered workflows: ${alternatives}`);\n }\n return definition;\n }\n const validateStored = (\n binding: WorkflowBinding,\n value: unknown,\n field: \"input\" | \"output\",\n ): JsonValue => {\n const definition = resolve(binding);\n const storedField = field === \"input\" ? \"storedInput\" : \"storedOutput\";\n const storedSchema = definition[storedField];\n const json = structuredClone(jsonValueSchema.parse(value));\n let parsed: unknown;\n try {\n parsed = (storedSchema ?? definition[field]).parse(structuredClone(json));\n } catch (cause) {\n if (storedSchema !== undefined) throw cause;\n throw new Error(\n `Workflow ${definition.id}@${definition.version} cannot validate stored ${field}; provide ${storedField} when the ${field} transform changes shape`,\n { cause },\n );\n }\n const validated = jsonValueSchema.parse(parsed);\n if (!isDeepStrictEqual(json, validated)) {\n throw new Error(\n `Workflow ${definition.id}@${definition.version} stored ${field} validation must preserve canonical JSON; provide a non-transforming ${storedField} schema`,\n );\n }\n return structuredClone(validated);\n };\n const validate = (\n binding: WorkflowBinding,\n value: unknown,\n field: \"input\" | \"output\",\n ): JsonValue => {\n const definition = resolve(binding);\n const json = jsonValueSchema.parse(value);\n const parsed = jsonValueSchema.parse(definition[field].parse(structuredClone(json)));\n return validateStored(binding, parsed, field);\n };\n\n return Object.freeze({\n definitions: Object.freeze(registered),\n resolve,\n validateInput: (binding: WorkflowBinding, value: unknown) => validate(binding, value, \"input\"),\n validateOutput: (binding: WorkflowBinding, value: unknown) =>\n validate(binding, value, \"output\"),\n validateStoredInput: (binding: WorkflowBinding, value: unknown) =>\n validateStored(binding, value, \"input\"),\n validateStoredOutput: (binding: WorkflowBinding, value: unknown) =>\n validateStored(binding, value, \"output\"),\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { WorkspaceDiff } from "./workspace-diff.mjs";
2
+ import { WorkspaceSnapshot } from "./workspace-snapshot.mjs";
3
+ //#region src/workspace-diff-assembly.d.ts
4
+ /** Metadata for one file in the pinned comparison base tree. */
5
+ interface WorkspaceBaseEntry {
6
+ readonly sha: string;
7
+ readonly size: number;
8
+ }
9
+ /** Encoded contents and metadata for one pinned base-tree blob. */
10
+ interface WorkspaceBaseBlob {
11
+ readonly content: string;
12
+ readonly encoding: string;
13
+ readonly size: number | null;
14
+ }
15
+ /** Pinned inputs and display limits used to assemble a workspace diff. */
16
+ interface WorkspaceDiffAssemblyOptions {
17
+ readonly executionId: string;
18
+ readonly baseSha: string;
19
+ readonly headSha: string;
20
+ readonly capturedAt: string;
21
+ readonly snapshot: WorkspaceSnapshot;
22
+ readonly baseEntries: readonly WorkspaceBaseEntry[];
23
+ readonly readBaseBlob: (sha: string) => Promise<WorkspaceBaseBlob>;
24
+ readonly signal?: AbortSignal;
25
+ readonly maxBlobBytes?: number;
26
+ readonly maxPatchBytes?: number;
27
+ readonly maxTotalPatchBytes?: number;
28
+ }
29
+ /** Assemble bounded unified patches from a sandbox snapshot and pinned base blobs. */
30
+ declare function assembleWorkspaceDiff(options: WorkspaceDiffAssemblyOptions): Promise<WorkspaceDiff>;
31
+ //#endregion
32
+ export { WorkspaceBaseBlob, WorkspaceBaseEntry, WorkspaceDiffAssemblyOptions, assembleWorkspaceDiff };
33
+ //# sourceMappingURL=workspace-diff-assembly.d.mts.map
@@ -0,0 +1,95 @@
1
+ import { workspaceDiffSchema } from "./workspace-diff.mjs";
2
+ import { workspaceSnapshotSchema } from "./workspace-snapshot.mjs";
3
+ import { Buffer } from "node:buffer";
4
+ import { formatPatch, structuredPatch } from "diff";
5
+ //#region src/workspace-diff-assembly.ts
6
+ /** Assemble bounded unified patches from a sandbox snapshot and pinned base blobs. */
7
+ async function assembleWorkspaceDiff(options) {
8
+ const snapshot = workspaceSnapshotSchema.parse(options.snapshot);
9
+ const maxBlobBytes = options.maxBlobBytes ?? 2e5;
10
+ const maxPatchBytes = options.maxPatchBytes ?? 1e5;
11
+ const maxTotalPatchBytes = options.maxTotalPatchBytes ?? 2e6;
12
+ const sizes = new Map(options.baseEntries.map((entry) => [entry.sha, entry.size]));
13
+ const renamed = /* @__PURE__ */ new Set();
14
+ const renames = /* @__PURE__ */ new Map();
15
+ for (const added of snapshot.files.filter((file) => file.oldMode === null && file.newSha !== null)) {
16
+ const previous = snapshot.files.find((file) => file.newMode === null && file.oldSha === added.newSha && !renamed.has(file.path));
17
+ if (previous) {
18
+ renames.set(added.path, previous);
19
+ renamed.add(previous.path);
20
+ }
21
+ }
22
+ const files = [];
23
+ let patchBytes = 0;
24
+ for (const file of snapshot.files) {
25
+ options.signal?.throwIfAborted();
26
+ if (renamed.has(file.path)) continue;
27
+ const rename = renames.get(file.path);
28
+ const oldSha = rename?.oldSha ?? file.oldSha;
29
+ const oldMode = rename?.oldMode ?? file.oldMode;
30
+ let binary = file.binary;
31
+ let omitted = file.omitted || (sizes.get(oldSha ?? "") ?? 0) > maxBlobBytes || oldMode === "160000" || file.newMode === "160000";
32
+ let before = "";
33
+ if (oldSha && !binary && !omitted && !rename) {
34
+ const blob = await options.readBaseBlob(oldSha);
35
+ if (blob.size === null || blob.size > maxBlobBytes || blob.encoding !== "base64") omitted = true;
36
+ else {
37
+ const bytes = Buffer.from(blob.content, "base64");
38
+ binary = bytes.includes(0);
39
+ if (!binary) try {
40
+ before = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
41
+ } catch {
42
+ binary = true;
43
+ }
44
+ }
45
+ }
46
+ let patch = "";
47
+ let additions = null;
48
+ let deletions = null;
49
+ if (!binary && !omitted) {
50
+ if (rename) before = file.content ?? "";
51
+ const diff = structuredPatch(rename?.path ?? file.path, file.path, before, file.content ?? "", void 0, void 0, {
52
+ context: 3,
53
+ timeout: 100,
54
+ maxEditLength: 2e4
55
+ });
56
+ if (!diff) omitted = true;
57
+ else {
58
+ patch = diff.hunks.length ? formatPatch(diff) : "";
59
+ if (patch.length > maxPatchBytes || patchBytes + Buffer.byteLength(patch) > maxTotalPatchBytes) {
60
+ patch = "";
61
+ omitted = true;
62
+ } else {
63
+ patchBytes += Buffer.byteLength(patch);
64
+ additions = diff.hunks.reduce((sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("+")).length, 0);
65
+ deletions = diff.hunks.reduce((sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("-")).length, 0);
66
+ }
67
+ }
68
+ }
69
+ files.push({
70
+ path: file.path,
71
+ ...rename ? { previousPath: rename.path } : {},
72
+ status: rename ? "renamed" : oldMode === null ? "added" : file.newMode === null ? "deleted" : "modified",
73
+ oldMode,
74
+ newMode: file.newMode,
75
+ additions,
76
+ deletions,
77
+ patch,
78
+ binary,
79
+ omitted
80
+ });
81
+ }
82
+ return workspaceDiffSchema.parse({
83
+ executionId: options.executionId,
84
+ state: "ready",
85
+ base: { sha: options.baseSha },
86
+ head: { sha: options.headSha },
87
+ capturedAt: options.capturedAt,
88
+ files,
89
+ truncated: snapshot.truncated || files.some((file) => file.omitted)
90
+ });
91
+ }
92
+ //#endregion
93
+ export { assembleWorkspaceDiff };
94
+
95
+ //# sourceMappingURL=workspace-diff-assembly.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-diff-assembly.mjs","names":[],"sources":["../src/workspace-diff-assembly.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { formatPatch, structuredPatch } from \"diff\";\nimport { workspaceDiffSchema, type WorkspaceDiff, type WorkspaceDiffFile } from \"./workspace-diff\";\nimport { workspaceSnapshotSchema, type WorkspaceSnapshot } from \"./workspace-snapshot\";\n\n/** Metadata for one file in the pinned comparison base tree. */\nexport interface WorkspaceBaseEntry {\n readonly sha: string;\n readonly size: number;\n}\n\n/** Encoded contents and metadata for one pinned base-tree blob. */\nexport interface WorkspaceBaseBlob {\n readonly content: string;\n readonly encoding: string;\n readonly size: number | null;\n}\n\n/** Pinned inputs and display limits used to assemble a workspace diff. */\nexport interface WorkspaceDiffAssemblyOptions {\n readonly executionId: string;\n readonly baseSha: string;\n readonly headSha: string;\n readonly capturedAt: string;\n readonly snapshot: WorkspaceSnapshot;\n readonly baseEntries: readonly WorkspaceBaseEntry[];\n readonly readBaseBlob: (sha: string) => Promise<WorkspaceBaseBlob>;\n readonly signal?: AbortSignal;\n readonly maxBlobBytes?: number;\n readonly maxPatchBytes?: number;\n readonly maxTotalPatchBytes?: number;\n}\n\n/** Assemble bounded unified patches from a sandbox snapshot and pinned base blobs. */\nexport async function assembleWorkspaceDiff(\n options: WorkspaceDiffAssemblyOptions,\n): Promise<WorkspaceDiff> {\n const snapshot = workspaceSnapshotSchema.parse(options.snapshot);\n const maxBlobBytes = options.maxBlobBytes ?? 200_000;\n const maxPatchBytes = options.maxPatchBytes ?? 100_000;\n const maxTotalPatchBytes = options.maxTotalPatchBytes ?? 2_000_000;\n const sizes = new Map(options.baseEntries.map((entry) => [entry.sha, entry.size]));\n const renamed = new Set<string>();\n const renames = new Map<string, (typeof snapshot.files)[number]>();\n for (const added of snapshot.files.filter(\n (file) => file.oldMode === null && file.newSha !== null,\n )) {\n const previous = snapshot.files.find(\n (file) => file.newMode === null && file.oldSha === added.newSha && !renamed.has(file.path),\n );\n if (previous) {\n renames.set(added.path, previous);\n renamed.add(previous.path);\n }\n }\n\n const files: WorkspaceDiffFile[] = [];\n let patchBytes = 0;\n for (const file of snapshot.files) {\n options.signal?.throwIfAborted();\n if (renamed.has(file.path)) continue;\n const rename = renames.get(file.path);\n const oldSha = rename?.oldSha ?? file.oldSha;\n const oldMode = rename?.oldMode ?? file.oldMode;\n let binary = file.binary;\n let omitted =\n file.omitted ||\n (sizes.get(oldSha ?? \"\") ?? 0) > maxBlobBytes ||\n oldMode === \"160000\" ||\n file.newMode === \"160000\";\n let before = \"\";\n if (oldSha && !binary && !omitted && !rename) {\n const blob = await options.readBaseBlob(oldSha);\n if (blob.size === null || blob.size > maxBlobBytes || blob.encoding !== \"base64\") {\n omitted = true;\n } else {\n const bytes = Buffer.from(blob.content, \"base64\");\n binary = bytes.includes(0);\n if (!binary) {\n try {\n before = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n } catch {\n binary = true;\n }\n }\n }\n }\n let patch = \"\";\n let additions: number | null = null;\n let deletions: number | null = null;\n if (!binary && !omitted) {\n if (rename) before = file.content ?? \"\";\n const diff = structuredPatch(\n rename?.path ?? file.path,\n file.path,\n before,\n file.content ?? \"\",\n undefined,\n undefined,\n { context: 3, timeout: 100, maxEditLength: 20_000 },\n );\n if (!diff) {\n omitted = true;\n } else {\n patch = diff.hunks.length ? formatPatch(diff) : \"\";\n if (\n patch.length > maxPatchBytes ||\n patchBytes + Buffer.byteLength(patch) > maxTotalPatchBytes\n ) {\n patch = \"\";\n omitted = true;\n } else {\n patchBytes += Buffer.byteLength(patch);\n additions = diff.hunks.reduce(\n (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith(\"+\")).length,\n 0,\n );\n deletions = diff.hunks.reduce(\n (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith(\"-\")).length,\n 0,\n );\n }\n }\n }\n files.push({\n path: file.path,\n ...(rename ? { previousPath: rename.path } : {}),\n status: rename\n ? \"renamed\"\n : oldMode === null\n ? \"added\"\n : file.newMode === null\n ? \"deleted\"\n : \"modified\",\n oldMode,\n newMode: file.newMode,\n additions,\n deletions,\n patch,\n binary,\n omitted,\n });\n }\n return workspaceDiffSchema.parse({\n executionId: options.executionId,\n state: \"ready\",\n base: { sha: options.baseSha },\n head: { sha: options.headSha },\n capturedAt: options.capturedAt,\n files,\n truncated: snapshot.truncated || files.some((file) => file.omitted),\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { z } from "zod";
2
+ //#region src/workspace-diff.d.ts
3
+ /** Validates one changed file in a bounded workspace comparison. */
4
+ declare const workspaceDiffFileSchema: z.ZodObject<{
5
+ path: z.ZodString;
6
+ previousPath: z.ZodOptional<z.ZodString>;
7
+ status: z.ZodEnum<{
8
+ added: "added";
9
+ deleted: "deleted";
10
+ modified: "modified";
11
+ renamed: "renamed";
12
+ }>;
13
+ oldMode: z.ZodNullable<z.ZodString>;
14
+ newMode: z.ZodNullable<z.ZodString>;
15
+ additions: z.ZodNullable<z.ZodNumber>;
16
+ deletions: z.ZodNullable<z.ZodNumber>;
17
+ patch: z.ZodString;
18
+ binary: z.ZodBoolean;
19
+ omitted: z.ZodBoolean;
20
+ }, z.core.$strict>;
21
+ /** One changed file in a bounded workspace comparison. */
22
+ type WorkspaceDiffFile = Readonly<z.infer<typeof workspaceDiffFileSchema>>;
23
+ /** Validates either a ready comparison with pinned commits or an unavailable response with a reason. */
24
+ declare const workspaceDiffSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
25
+ state: z.ZodLiteral<"ready">;
26
+ executionId: z.ZodString;
27
+ reason: z.ZodOptional<z.ZodNever>;
28
+ base: z.ZodObject<{
29
+ sha: z.ZodString;
30
+ }, z.core.$strict>;
31
+ head: z.ZodObject<{
32
+ sha: z.ZodString;
33
+ }, z.core.$strict>;
34
+ truncated: z.ZodBoolean;
35
+ files: z.ZodReadonly<z.ZodArray<z.ZodObject<{
36
+ path: z.ZodString;
37
+ previousPath: z.ZodOptional<z.ZodString>;
38
+ status: z.ZodEnum<{
39
+ added: "added";
40
+ deleted: "deleted";
41
+ modified: "modified";
42
+ renamed: "renamed";
43
+ }>;
44
+ oldMode: z.ZodNullable<z.ZodString>;
45
+ newMode: z.ZodNullable<z.ZodString>;
46
+ additions: z.ZodNullable<z.ZodNumber>;
47
+ deletions: z.ZodNullable<z.ZodNumber>;
48
+ patch: z.ZodString;
49
+ binary: z.ZodBoolean;
50
+ omitted: z.ZodBoolean;
51
+ }, z.core.$strict>>>;
52
+ capturedAt: z.ZodISODateTime;
53
+ }, z.core.$strict>, z.ZodObject<{
54
+ state: z.ZodLiteral<"unavailable">;
55
+ executionId: z.ZodNullable<z.ZodString>;
56
+ reason: z.ZodString;
57
+ base: z.ZodNull;
58
+ head: z.ZodNull;
59
+ truncated: z.ZodLiteral<false>;
60
+ files: z.ZodReadonly<z.ZodArray<z.ZodObject<{
61
+ path: z.ZodString;
62
+ previousPath: z.ZodOptional<z.ZodString>;
63
+ status: z.ZodEnum<{
64
+ added: "added";
65
+ deleted: "deleted";
66
+ modified: "modified";
67
+ renamed: "renamed";
68
+ }>;
69
+ oldMode: z.ZodNullable<z.ZodString>;
70
+ newMode: z.ZodNullable<z.ZodString>;
71
+ additions: z.ZodNullable<z.ZodNumber>;
72
+ deletions: z.ZodNullable<z.ZodNumber>;
73
+ patch: z.ZodString;
74
+ binary: z.ZodBoolean;
75
+ omitted: z.ZodBoolean;
76
+ }, z.core.$strict>>>;
77
+ capturedAt: z.ZodISODateTime;
78
+ }, z.core.$strict>], "state">;
79
+ /** A ready workspace comparison or an unavailable response carrying its reason. */
80
+ type WorkspaceDiff = Readonly<z.infer<typeof workspaceDiffSchema>>;
81
+ /** Identifies an execution and the reason its workspace comparison is unavailable. */
82
+ interface UnavailableWorkspaceDiffInput {
83
+ readonly executionId: string | null;
84
+ readonly reason: string;
85
+ }
86
+ /** Creates an unavailable workspace-diff response with a stable empty projection. */
87
+ declare function unavailableWorkspaceDiff(input: UnavailableWorkspaceDiffInput): WorkspaceDiff;
88
+ //#endregion
89
+ export { UnavailableWorkspaceDiffInput, WorkspaceDiff, WorkspaceDiffFile, unavailableWorkspaceDiff, workspaceDiffFileSchema, workspaceDiffSchema };
90
+ //# sourceMappingURL=workspace-diff.d.mts.map
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ //#region src/workspace-diff.ts
3
+ const gitCommitSchema = z.strictObject({ sha: z.string().regex(/^[a-f0-9]{40,64}$/u).describe("Pinned commit used for every file in this response.") });
4
+ /** Validates one changed file in a bounded workspace comparison. */
5
+ const workspaceDiffFileSchema = z.strictObject({
6
+ path: z.string().describe("Repository-relative current path, or deleted path."),
7
+ previousPath: z.string().optional().describe("Original path of an exact-content rename."),
8
+ status: z.enum([
9
+ "added",
10
+ "deleted",
11
+ "modified",
12
+ "renamed"
13
+ ]).describe("Change between the pinned base and current branch HEAD."),
14
+ oldMode: z.string().nullable().describe("Git file mode at the base, or null for additions."),
15
+ newMode: z.string().nullable().describe("Git file mode at HEAD, or null for deletions."),
16
+ additions: z.number().int().nonnegative().nullable().describe("Added lines; null when content is omitted."),
17
+ deletions: z.number().int().nonnegative().nullable().describe("Deleted lines; null when content is omitted."),
18
+ patch: z.string().max(1e5).describe("Unified patch; empty for binary, oversized, or mode-only changes."),
19
+ binary: z.boolean().describe("Content is binary or not valid UTF-8."),
20
+ omitted: z.boolean().describe("Content could not be displayed within inspection limits.")
21
+ });
22
+ const workspaceDiffCommon = { capturedAt: z.iso.datetime().describe("Time the branch inspection began; all returned commit SHAs are pinned.") };
23
+ const readyWorkspaceDiffSchema = z.strictObject({
24
+ ...workspaceDiffCommon,
25
+ state: z.literal("ready").describe("The workspace comparison completed."),
26
+ executionId: z.string().min(1).describe("Execution whose current branch was inspected."),
27
+ reason: z.never().optional().describe("Ready comparisons have no unavailability reason."),
28
+ base: gitCommitSchema.describe("Pinned comparison base."),
29
+ head: gitCommitSchema.describe("Pinned current branch HEAD."),
30
+ truncated: z.boolean().describe("Some files or patches were omitted because of response limits."),
31
+ files: z.array(workspaceDiffFileSchema).max(200).describe("Bounded changed-file list; untracked files are excluded.").readonly()
32
+ });
33
+ const unavailableWorkspaceDiffSchema = z.strictObject({
34
+ ...workspaceDiffCommon,
35
+ state: z.literal("unavailable").describe("The workspace comparison could not be produced."),
36
+ executionId: z.string().min(1).nullable().describe("Execution that could not be inspected, or null when no execution exists."),
37
+ reason: z.string().min(1).describe("Why the workspace comparison could not be read."),
38
+ base: z.null().describe("No comparison base is available."),
39
+ head: z.null().describe("No workspace HEAD is available."),
40
+ truncated: z.literal(false).describe("Unavailable comparisons never contain partial results."),
41
+ files: z.array(workspaceDiffFileSchema).max(0).describe("Unavailable comparisons contain no changed files.").readonly()
42
+ });
43
+ /** Validates either a ready comparison with pinned commits or an unavailable response with a reason. */
44
+ const workspaceDiffSchema = z.discriminatedUnion("state", [readyWorkspaceDiffSchema, unavailableWorkspaceDiffSchema]);
45
+ /** Creates an unavailable workspace-diff response with a stable empty projection. */
46
+ function unavailableWorkspaceDiff(input) {
47
+ return {
48
+ executionId: input.executionId,
49
+ state: "unavailable",
50
+ reason: input.reason,
51
+ base: null,
52
+ head: null,
53
+ capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
54
+ truncated: false,
55
+ files: []
56
+ };
57
+ }
58
+ //#endregion
59
+ export { unavailableWorkspaceDiff, workspaceDiffFileSchema, workspaceDiffSchema };
60
+
61
+ //# sourceMappingURL=workspace-diff.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-diff.mjs","names":[],"sources":["../src/workspace-diff.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst gitCommitSchema = z.strictObject({\n sha: z\n .string()\n .regex(/^[a-f0-9]{40,64}$/u)\n .describe(\"Pinned commit used for every file in this response.\"),\n});\n\n/** Validates one changed file in a bounded workspace comparison. */\nexport const workspaceDiffFileSchema = z.strictObject({\n path: z.string().describe(\"Repository-relative current path, or deleted path.\"),\n previousPath: z.string().optional().describe(\"Original path of an exact-content rename.\"),\n status: z\n .enum([\"added\", \"deleted\", \"modified\", \"renamed\"])\n .describe(\"Change between the pinned base and current branch HEAD.\"),\n oldMode: z.string().nullable().describe(\"Git file mode at the base, or null for additions.\"),\n newMode: z.string().nullable().describe(\"Git file mode at HEAD, or null for deletions.\"),\n additions: z\n .number()\n .int()\n .nonnegative()\n .nullable()\n .describe(\"Added lines; null when content is omitted.\"),\n deletions: z\n .number()\n .int()\n .nonnegative()\n .nullable()\n .describe(\"Deleted lines; null when content is omitted.\"),\n patch: z\n .string()\n .max(100_000)\n .describe(\"Unified patch; empty for binary, oversized, or mode-only changes.\"),\n binary: z.boolean().describe(\"Content is binary or not valid UTF-8.\"),\n omitted: z.boolean().describe(\"Content could not be displayed within inspection limits.\"),\n});\n\n/** One changed file in a bounded workspace comparison. */\nexport type WorkspaceDiffFile = Readonly<z.infer<typeof workspaceDiffFileSchema>>;\n\nconst workspaceDiffCommon = {\n capturedAt: z.iso\n .datetime()\n .describe(\"Time the branch inspection began; all returned commit SHAs are pinned.\"),\n};\n\nconst readyWorkspaceDiffSchema = z.strictObject({\n ...workspaceDiffCommon,\n state: z.literal(\"ready\").describe(\"The workspace comparison completed.\"),\n executionId: z.string().min(1).describe(\"Execution whose current branch was inspected.\"),\n reason: z.never().optional().describe(\"Ready comparisons have no unavailability reason.\"),\n base: gitCommitSchema.describe(\"Pinned comparison base.\"),\n head: gitCommitSchema.describe(\"Pinned current branch HEAD.\"),\n truncated: z.boolean().describe(\"Some files or patches were omitted because of response limits.\"),\n files: z\n .array(workspaceDiffFileSchema)\n .max(200)\n .describe(\"Bounded changed-file list; untracked files are excluded.\")\n .readonly(),\n});\n\nconst unavailableWorkspaceDiffSchema = z.strictObject({\n ...workspaceDiffCommon,\n state: z.literal(\"unavailable\").describe(\"The workspace comparison could not be produced.\"),\n executionId: z\n .string()\n .min(1)\n .nullable()\n .describe(\"Execution that could not be inspected, or null when no execution exists.\"),\n reason: z.string().min(1).describe(\"Why the workspace comparison could not be read.\"),\n base: z.null().describe(\"No comparison base is available.\"),\n head: z.null().describe(\"No workspace HEAD is available.\"),\n truncated: z.literal(false).describe(\"Unavailable comparisons never contain partial results.\"),\n files: z\n .array(workspaceDiffFileSchema)\n .max(0)\n .describe(\"Unavailable comparisons contain no changed files.\")\n .readonly(),\n});\n\n/** Validates either a ready comparison with pinned commits or an unavailable response with a reason. */\nexport const workspaceDiffSchema = z.discriminatedUnion(\"state\", [\n readyWorkspaceDiffSchema,\n unavailableWorkspaceDiffSchema,\n]);\n\n/** A ready workspace comparison or an unavailable response carrying its reason. */\nexport type WorkspaceDiff = Readonly<z.infer<typeof workspaceDiffSchema>>;\n\n/** Identifies an execution and the reason its workspace comparison is unavailable. */\nexport interface UnavailableWorkspaceDiffInput {\n readonly executionId: string | null;\n readonly reason: string;\n}\n\n/** Creates an unavailable workspace-diff response with a stable empty projection. */\nexport function unavailableWorkspaceDiff(input: UnavailableWorkspaceDiffInput): WorkspaceDiff {\n return {\n executionId: input.executionId,\n state: \"unavailable\",\n reason: input.reason,\n base: null,\n head: null,\n capturedAt: new Date().toISOString(),\n truncated: false,\n files: [],\n };\n}\n"],"mappings":";;AAEA,MAAM,kBAAkB,EAAE,aAAa,EACrC,KAAK,EACF,OAAO,CAAC,CACR,MAAM,oBAAoB,CAAC,CAC3B,SAAS,qDAAqD,EACnE,CAAC;;AAGD,MAAa,0BAA0B,EAAE,aAAa;CACpD,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,oDAAoD;CAC9E,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,2CAA2C;CACxF,QAAQ,EACL,KAAK;EAAC;EAAS;EAAW;EAAY;CAAS,CAAC,CAAC,CACjD,SAAS,yDAAyD;CACrE,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,mDAAmD;CAC3F,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,+CAA+C;CACvF,WAAW,EACR,OAAO,CAAC,CACR,IAAI,CAAC,CACL,YAAY,CAAC,CACb,SAAS,CAAC,CACV,SAAS,4CAA4C;CACxD,WAAW,EACR,OAAO,CAAC,CACR,IAAI,CAAC,CACL,YAAY,CAAC,CACb,SAAS,CAAC,CACV,SAAS,8CAA8C;CAC1D,OAAO,EACJ,OAAO,CAAC,CACR,IAAI,GAAO,CAAC,CACZ,SAAS,mEAAmE;CAC/E,QAAQ,EAAE,QAAQ,CAAC,CAAC,SAAS,uCAAuC;CACpE,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS,0DAA0D;AAC1F,CAAC;AAKD,MAAM,sBAAsB,EAC1B,YAAY,EAAE,IACX,SAAS,CAAC,CACV,SAAS,wEAAwE,EACtF;AAEA,MAAM,2BAA2B,EAAE,aAAa;CAC9C,GAAG;CACH,OAAO,EAAE,QAAQ,OAAO,CAAC,CAAC,SAAS,qCAAqC;CACxE,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,+CAA+C;CACvF,QAAQ,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,kDAAkD;CACxF,MAAM,gBAAgB,SAAS,yBAAyB;CACxD,MAAM,gBAAgB,SAAS,6BAA6B;CAC5D,WAAW,EAAE,QAAQ,CAAC,CAAC,SAAS,gEAAgE;CAChG,OAAO,EACJ,MAAM,uBAAuB,CAAC,CAC9B,IAAI,GAAG,CAAC,CACR,SAAS,0DAA0D,CAAC,CACpE,SAAS;AACd,CAAC;AAED,MAAM,iCAAiC,EAAE,aAAa;CACpD,GAAG;CACH,OAAO,EAAE,QAAQ,aAAa,CAAC,CAAC,SAAS,iDAAiD;CAC1F,aAAa,EACV,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,SAAS,CAAC,CACV,SAAS,0EAA0E;CACtF,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,iDAAiD;CACpF,MAAM,EAAE,KAAK,CAAC,CAAC,SAAS,kCAAkC;CAC1D,MAAM,EAAE,KAAK,CAAC,CAAC,SAAS,iCAAiC;CACzD,WAAW,EAAE,QAAQ,KAAK,CAAC,CAAC,SAAS,wDAAwD;CAC7F,OAAO,EACJ,MAAM,uBAAuB,CAAC,CAC9B,IAAI,CAAC,CAAC,CACN,SAAS,mDAAmD,CAAC,CAC7D,SAAS;AACd,CAAC;;AAGD,MAAa,sBAAsB,EAAE,mBAAmB,SAAS,CAC/D,0BACA,8BACF,CAAC;;AAYD,SAAgB,yBAAyB,OAAqD;CAC5F,OAAO;EACL,aAAa,MAAM;EACnB,OAAO;EACP,QAAQ,MAAM;EACd,MAAM;EACN,MAAM;EACN,6BAAY,IAAI,KAAK,EAAA,CAAE,YAAY;EACnC,WAAW;EACX,OAAO,CAAC;CACV;AACF"}
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ //#region src/workspace-snapshot.d.ts
3
+ /** Validates the bounded committed-tree snapshot captured inside an execution workspace. */
4
+ declare const workspaceSnapshotSchema: z.ZodObject<{
5
+ truncated: z.ZodBoolean;
6
+ files: z.ZodReadonly<z.ZodArray<z.ZodObject<{
7
+ path: z.ZodString;
8
+ oldMode: z.ZodNullable<z.ZodString>;
9
+ newMode: z.ZodNullable<z.ZodString>;
10
+ oldSha: z.ZodNullable<z.ZodString>;
11
+ newSha: z.ZodNullable<z.ZodString>;
12
+ content: z.ZodNullable<z.ZodString>;
13
+ binary: z.ZodBoolean;
14
+ omitted: z.ZodBoolean;
15
+ }, z.core.$strip>>>;
16
+ }, z.core.$strip>;
17
+ /** A bounded committed-tree snapshot captured inside an execution workspace. */
18
+ type WorkspaceSnapshot = z.infer<typeof workspaceSnapshotSchema>;
19
+ /**
20
+ * Captures a bounded committed-tree snapshot using only sandbox Node.js built-ins without
21
+ * writing the checkout or Git index.
22
+ */
23
+ declare const workspaceSnapshotScript: string;
24
+ //#endregion
25
+ export { WorkspaceSnapshot, workspaceSnapshotSchema, workspaceSnapshotScript };
26
+ //# sourceMappingURL=workspace-snapshot.d.mts.map