@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,80 @@
1
+ import { JsonValue } from "./schema/work.mjs";
2
+ import "./workflows.mjs";
3
+ import { TaskMessageProtocol, TaskMessageProtocols } from "./schema/task-message.mjs";
4
+ import "./tasks.mjs";
5
+ import { z } from "zod";
6
+ //#region src/task-protocols.d.ts
7
+ /** Validates bounded instructions and explicit context for the supplied assignment protocol. */
8
+ declare const assignmentPayloadSchema: z.ZodObject<{
9
+ instructions: z.ZodString;
10
+ context: z.ZodOptional<z.ZodCustom<JsonValue, JsonValue>>;
11
+ }, z.core.$strict>;
12
+ /** Validates a bounded outcome, evidence, and concerns for the supplied handoff protocol. */
13
+ declare const handoffPayloadSchema: z.ZodObject<{
14
+ outcome: z.ZodEnum<{
15
+ failed: "failed";
16
+ completed: "completed";
17
+ needs_input: "needs_input";
18
+ }>;
19
+ summary: z.ZodString;
20
+ output: z.ZodOptional<z.ZodCustom<JsonValue, JsonValue>>;
21
+ artifacts: z.ZodReadonly<z.ZodArray<z.ZodObject<{
22
+ kind: z.ZodString;
23
+ ref: z.ZodString;
24
+ }, z.core.$strict>>>;
25
+ concerns: z.ZodReadonly<z.ZodArray<z.ZodString>>;
26
+ deviations: z.ZodReadonly<z.ZodArray<z.ZodString>>;
27
+ }, z.core.$strict>;
28
+ /** Validated assignment instructions and optional bounded context. */
29
+ type AssignmentPayload = z.infer<typeof assignmentPayloadSchema>;
30
+ /** Validated handoff outcome, evidence, concerns, and deviations. */
31
+ type HandoffPayload = z.infer<typeof handoffPayloadSchema>;
32
+ /** Standard exact `assignment@1` protocol definition. */
33
+ declare const assignmentTaskMessageProtocol: Readonly<TaskMessageProtocol<z.ZodObject<{
34
+ instructions: z.ZodString;
35
+ context: z.ZodOptional<z.ZodCustom<JsonValue, JsonValue>>;
36
+ }, z.core.$strict>, "assignment", 1>>;
37
+ /** Standard exact `handoff@1` protocol definition. */
38
+ declare const handoffTaskMessageProtocol: Readonly<TaskMessageProtocol<z.ZodObject<{
39
+ outcome: z.ZodEnum<{
40
+ failed: "failed";
41
+ completed: "completed";
42
+ needs_input: "needs_input";
43
+ }>;
44
+ summary: z.ZodString;
45
+ output: z.ZodOptional<z.ZodCustom<JsonValue, JsonValue>>;
46
+ artifacts: z.ZodReadonly<z.ZodArray<z.ZodObject<{
47
+ kind: z.ZodString;
48
+ ref: z.ZodString;
49
+ }, z.core.$strict>>>;
50
+ concerns: z.ZodReadonly<z.ZodArray<z.ZodString>>;
51
+ deviations: z.ZodReadonly<z.ZodArray<z.ZodString>>;
52
+ }, z.core.$strict>, "handoff", 1>>;
53
+ /** Replaceable protocol definitions, not mandatory message vocabulary. */
54
+ declare const standardTaskMessageProtocols: readonly (Readonly<TaskMessageProtocol<z.ZodObject<{
55
+ instructions: z.ZodString;
56
+ context: z.ZodOptional<z.ZodCustom<JsonValue, JsonValue>>;
57
+ }, z.core.$strict>, "assignment", 1>> | Readonly<TaskMessageProtocol<z.ZodObject<{
58
+ outcome: z.ZodEnum<{
59
+ failed: "failed";
60
+ completed: "completed";
61
+ needs_input: "needs_input";
62
+ }>;
63
+ summary: z.ZodString;
64
+ output: z.ZodOptional<z.ZodCustom<JsonValue, JsonValue>>;
65
+ artifacts: z.ZodReadonly<z.ZodArray<z.ZodObject<{
66
+ kind: z.ZodString;
67
+ ref: z.ZodString;
68
+ }, z.core.$strict>>>;
69
+ concerns: z.ZodReadonly<z.ZodArray<z.ZodString>>;
70
+ deviations: z.ZodReadonly<z.ZodArray<z.ZodString>>;
71
+ }, z.core.$strict>, "handoff", 1>>)[];
72
+ /** One of the supplied standard Task-message protocol definitions. */
73
+ type StandardTaskMessageProtocol = (typeof standardTaskMessageProtocols)[number];
74
+ /** Registry type containing the supplied standard Task-message protocols. */
75
+ type DefaultTaskMessageProtocols = TaskMessageProtocols<StandardTaskMessageProtocol>;
76
+ /** Creates a registry containing the supplied `assignment@1` and `handoff@1` protocols. */
77
+ declare function createDefaultTaskMessageProtocols(): DefaultTaskMessageProtocols;
78
+ //#endregion
79
+ export { AssignmentPayload, DefaultTaskMessageProtocols, HandoffPayload, StandardTaskMessageProtocol, assignmentPayloadSchema, assignmentTaskMessageProtocol, createDefaultTaskMessageProtocols, handoffPayloadSchema, handoffTaskMessageProtocol, standardTaskMessageProtocols };
80
+ //# sourceMappingURL=task-protocols.d.mts.map
@@ -0,0 +1,47 @@
1
+ import { jsonValueSchema } from "./schema/work.mjs";
2
+ import { defineTaskMessageProtocol, defineTaskMessageProtocols } from "./schema/task-message.mjs";
3
+ import { z } from "zod";
4
+ //#region src/task-protocols.ts
5
+ /** Validates bounded instructions and explicit context for the supplied assignment protocol. */
6
+ const assignmentPayloadSchema = z.strictObject({
7
+ instructions: z.string().min(1).max(16e3).describe("Bounded instructions for the recipient's delegated scope."),
8
+ context: jsonValueSchema.optional().describe("Optional explicit context; not implicit access to another Task's data.")
9
+ });
10
+ /** Validates a bounded outcome, evidence, and concerns for the supplied handoff protocol. */
11
+ const handoffPayloadSchema = z.strictObject({
12
+ outcome: z.enum([
13
+ "completed",
14
+ "failed",
15
+ "needs_input"
16
+ ]).describe("Reported outcome; a message never changes Task lifecycle by itself."),
17
+ summary: z.string().min(1).max(8e3).describe("Summary of work and its result."),
18
+ output: jsonValueSchema.optional().describe("Bounded result; the receiving workflow validates the required output contract."),
19
+ artifacts: z.array(z.strictObject({
20
+ kind: z.string().min(1).max(64).describe("Application-defined artifact kind."),
21
+ ref: z.string().min(1).max(2048).describe("Opaque artifact reference; receiving this reference grants no read authority.")
22
+ })).max(32).readonly().describe("References to evidence and large outputs; not embedded artifact contents."),
23
+ concerns: z.array(z.string().min(1).max(2048)).max(32).readonly().describe("Findings or concerns requiring the scope owner's attention."),
24
+ deviations: z.array(z.string().min(1).max(2048)).max(32).readonly().describe("Departures from the assignment or expected approach.")
25
+ });
26
+ /** Standard exact `assignment@1` protocol definition. */
27
+ const assignmentTaskMessageProtocol = defineTaskMessageProtocol({
28
+ id: "assignment",
29
+ version: 1,
30
+ payload: assignmentPayloadSchema
31
+ });
32
+ /** Standard exact `handoff@1` protocol definition. */
33
+ const handoffTaskMessageProtocol = defineTaskMessageProtocol({
34
+ id: "handoff",
35
+ version: 1,
36
+ payload: handoffPayloadSchema
37
+ });
38
+ /** Replaceable protocol definitions, not mandatory message vocabulary. */
39
+ const standardTaskMessageProtocols = Object.freeze([assignmentTaskMessageProtocol, handoffTaskMessageProtocol]);
40
+ /** Creates a registry containing the supplied `assignment@1` and `handoff@1` protocols. */
41
+ function createDefaultTaskMessageProtocols() {
42
+ return defineTaskMessageProtocols(standardTaskMessageProtocols);
43
+ }
44
+ //#endregion
45
+ export { assignmentPayloadSchema, assignmentTaskMessageProtocol, createDefaultTaskMessageProtocols, handoffPayloadSchema, handoffTaskMessageProtocol, standardTaskMessageProtocols };
46
+
47
+ //# sourceMappingURL=task-protocols.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-protocols.mjs","names":[],"sources":["../src/task-protocols.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n defineTaskMessageProtocol,\n defineTaskMessageProtocols,\n type TaskMessageProtocols,\n} from \"./schema/task-message\";\nimport { jsonValueSchema } from \"./schema/work\";\n\n/** Validates bounded instructions and explicit context for the supplied assignment protocol. */\nexport const assignmentPayloadSchema = z.strictObject({\n instructions: z\n .string()\n .min(1)\n .max(16_000)\n .describe(\"Bounded instructions for the recipient's delegated scope.\"),\n context: jsonValueSchema\n .optional()\n .describe(\"Optional explicit context; not implicit access to another Task's data.\"),\n});\n\n/** Validates a bounded outcome, evidence, and concerns for the supplied handoff protocol. */\nexport const handoffPayloadSchema = z.strictObject({\n outcome: z\n .enum([\"completed\", \"failed\", \"needs_input\"])\n .describe(\"Reported outcome; a message never changes Task lifecycle by itself.\"),\n summary: z.string().min(1).max(8000).describe(\"Summary of work and its result.\"),\n output: jsonValueSchema\n .optional()\n .describe(\"Bounded result; the receiving workflow validates the required output contract.\"),\n artifacts: z\n .array(\n z.strictObject({\n kind: z.string().min(1).max(64).describe(\"Application-defined artifact kind.\"),\n ref: z\n .string()\n .min(1)\n .max(2048)\n .describe(\n \"Opaque artifact reference; receiving this reference grants no read authority.\",\n ),\n }),\n )\n .max(32)\n .readonly()\n .describe(\"References to evidence and large outputs; not embedded artifact contents.\"),\n concerns: z\n .array(z.string().min(1).max(2048))\n .max(32)\n .readonly()\n .describe(\"Findings or concerns requiring the scope owner's attention.\"),\n deviations: z\n .array(z.string().min(1).max(2048))\n .max(32)\n .readonly()\n .describe(\"Departures from the assignment or expected approach.\"),\n});\n\n/** Validated assignment instructions and optional bounded context. */\nexport type AssignmentPayload = z.infer<typeof assignmentPayloadSchema>;\n/** Validated handoff outcome, evidence, concerns, and deviations. */\nexport type HandoffPayload = z.infer<typeof handoffPayloadSchema>;\n\n/** Standard exact `assignment@1` protocol definition. */\nexport const assignmentTaskMessageProtocol = defineTaskMessageProtocol({\n id: \"assignment\",\n version: 1,\n payload: assignmentPayloadSchema,\n});\n\n/** Standard exact `handoff@1` protocol definition. */\nexport const handoffTaskMessageProtocol = defineTaskMessageProtocol({\n id: \"handoff\",\n version: 1,\n payload: handoffPayloadSchema,\n});\n\n/** Replaceable protocol definitions, not mandatory message vocabulary. */\nexport const standardTaskMessageProtocols = Object.freeze([\n assignmentTaskMessageProtocol,\n handoffTaskMessageProtocol,\n]);\n\n/** One of the supplied standard Task-message protocol definitions. */\nexport type StandardTaskMessageProtocol = (typeof standardTaskMessageProtocols)[number];\n/** Registry type containing the supplied standard Task-message protocols. */\nexport type DefaultTaskMessageProtocols = TaskMessageProtocols<StandardTaskMessageProtocol>;\n\n/** Creates a registry containing the supplied `assignment@1` and `handoff@1` protocols. */\nexport function createDefaultTaskMessageProtocols(): DefaultTaskMessageProtocols {\n return defineTaskMessageProtocols(standardTaskMessageProtocols);\n}\n"],"mappings":";;;;;AASA,MAAa,0BAA0B,EAAE,aAAa;CACpD,cAAc,EACX,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,IAAI,IAAM,CAAC,CACX,SAAS,2DAA2D;CACvE,SAAS,gBACN,SAAS,CAAC,CACV,SAAS,wEAAwE;AACtF,CAAC;;AAGD,MAAa,uBAAuB,EAAE,aAAa;CACjD,SAAS,EACN,KAAK;EAAC;EAAa;EAAU;CAAa,CAAC,CAAC,CAC5C,SAAS,qEAAqE;CACjF,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAI,CAAC,CAAC,SAAS,iCAAiC;CAC/E,QAAQ,gBACL,SAAS,CAAC,CACV,SAAS,gFAAgF;CAC5F,WAAW,EACR,MACC,EAAE,aAAa;EACb,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,oCAAoC;EAC7E,KAAK,EACF,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,IAAI,IAAI,CAAC,CACT,SACC,+EACF;CACJ,CAAC,CACH,CAAC,CACA,IAAI,EAAE,CAAC,CACP,SAAS,CAAC,CACV,SAAS,2EAA2E;CACvF,UAAU,EACP,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAClC,IAAI,EAAE,CAAC,CACP,SAAS,CAAC,CACV,SAAS,6DAA6D;CACzE,YAAY,EACT,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAClC,IAAI,EAAE,CAAC,CACP,SAAS,CAAC,CACV,SAAS,sDAAsD;AACpE,CAAC;;AAQD,MAAa,gCAAgC,0BAA0B;CACrE,IAAI;CACJ,SAAS;CACT,SAAS;AACX,CAAC;;AAGD,MAAa,6BAA6B,0BAA0B;CAClE,IAAI;CACJ,SAAS;CACT,SAAS;AACX,CAAC;;AAGD,MAAa,+BAA+B,OAAO,OAAO,CACxD,+BACA,0BACF,CAAC;;AAQD,SAAgB,oCAAiE;CAC/E,OAAO,2BAA2B,4BAA4B;AAChE"}
@@ -0,0 +1,17 @@
1
+ import { ApprovalPolicy, ApprovalPriority, ApprovalRule, ApprovalSubject, allowByDefaultApprovalPolicy, approvalPolicySchema, approvalPrioritySchema, approvalRuleSchema, requiresApproval } from "./approval.mjs";
2
+ import { AnswerId, TaskId, answerIdSchema, taskIdSchema } from "./schema/id.mjs";
3
+ import { ExecutionReference, MessageWaitingTask, NeedsHumanTask, SucceededTask, Task, TaskApproval, TaskKind, TaskOrigin, TaskQuestion, TaskState, TaskUsage, executionReferenceSchema, harnessSchema, isMessageWaitingTask, isNeedsHumanTask, isSucceededTask, standardTaskKinds, taskApprovalSchema, taskExecutionRepositoryIdsSchema, taskKindSchema, taskOriginSchema, taskQuestionSchema, taskSchema, taskStateSchema, taskUsageSchema } from "./schema/task.mjs";
4
+ import { MAX_TASK_INBOX_PENDING, SendTaskMessageInput, TaskInbox, TaskMessage, TaskMessageClaim, TaskMessageDiscard, TaskMessageForProtocol, TaskMessageId, TaskMessageOperationId, TaskMessagePrincipal, TaskMessageProcessing, TaskMessageProtocol, TaskMessageProtocolBinding, TaskMessageProtocolBindingInput, TaskMessageProtocolInput, TaskMessageProtocolInputPayload, TaskMessageProtocolStoredPayload, TaskMessageProtocols, defineTaskMessageProtocol, defineTaskMessageProtocols, parseTaskMessageProtocolBinding, sendTaskMessageInputSchema, taskInboxSchema, taskMessageClaimSchema, taskMessageDiscardSchema, taskMessageIdSchema, taskMessageInput, taskMessageOperationIdSchema, taskMessagePrincipalSchema, taskMessageProcessingSchema, taskMessageProtocolBindingSchema, taskMessageProtocolSchema, taskMessageReservationSchema, taskMessageSchema } from "./schema/task-message.mjs";
5
+ import { AssertTaskMessageClaimInput, ClaimTaskMessageInput, ClaimTaskMessageResult, CompleteTaskMessageInput, CreateTaskMessageStoreOptions, DiscardTaskMessageInput, TaskMessageAction, TaskMessageAuthorizationError, TaskMessageAuthorizationInput, TaskMessageAuthorize, TaskMessageConflictError, TaskMessageEffectKeyInput, TaskMessageError, TaskMessageLeaseError, TaskMessageLookupInput, TaskMessageRecipientInput, TaskMessageSendInput, TaskMessageSourceFenceError, TaskMessageStore, createTaskMessageStore, taskBoundMessagePolicy } from "./store/task-messages.mjs";
6
+ import { MAX_TASK_GRAPH_DEPENDENCIES, MAX_TASK_GRAPH_NODES, TaskGraph, TaskGraphNode, taskGraphAdmissionSchema, taskGraphDependenciesSchema, taskGraphNodeSchema, taskGraphSchema } from "./schema/task-graph.mjs";
7
+ import { AdmitTaskGraphInput, AssertTaskAdmissionInput, CreateTaskGraphStoreOptions, SetTaskGraphDependenciesInput, TaskGraphConflictError, TaskGraphNodeRef, TaskGraphStore, assertTaskAdmission, createTaskGraphStore } from "./store/task-graphs.mjs";
8
+ import { TaskEffect, TaskEffectKey, TaskEffectReference, taskEffectKeySchema, taskEffectReferenceSchema, taskEffectSchema } from "./schema/task-effect.mjs";
9
+ import { CreateTaskEffectStoreOptions, RecordTaskEffectInput, ResolveTaskEffectInput, TaskEffectLookupInput, TaskEffectStore, createTaskEffectStore } from "./store/task-effects.mjs";
10
+ import { CompleteTaskWorkInput, CompleteWorkflowTaskWorkInput, CreateTaskWorkStoreOptions, ResumeTaskWorkInput, TaskWorkStore, TaskWorkStores, TaskWorkUsage, WaitForTaskMessagesInput, createTaskWorkStore } from "./store/task-work.mjs";
11
+ import { AnswerEvent, answerEventSchema } from "./schema/answer.mjs";
12
+ import { AgentSessionBinding, AnswerEventConflictError, AnswerQuestionInput, AnswerQuestionResult, ApprovalDecision, ApprovalError, CreateTaskInput, RejectionDecision, RootTaskOrigin, TaskPatch, TaskTransitionArguments, TaskTransitionOptions } from "./store/engine.mjs";
13
+ import { ApprovalAccess, ApprovalAccessDecisionInput, ApprovalAccessError, ApprovalAccessOptions, ApprovalAccessStores, createApprovalAccess } from "./approval-access.mjs";
14
+ import { taskInitialState, taskTransitions } from "./schema/transitions.mjs";
15
+ import { ProcessTaskMessageOptions, ProcessTaskMessageResult, TaskMessageProcessingStores, processTaskMessage, readTaskMessageDecision } from "./task-message-processing.mjs";
16
+ import { AssignmentPayload, DefaultTaskMessageProtocols, HandoffPayload, StandardTaskMessageProtocol, assignmentPayloadSchema, assignmentTaskMessageProtocol, createDefaultTaskMessageProtocols, handoffPayloadSchema, handoffTaskMessageProtocol, standardTaskMessageProtocols } from "./task-protocols.mjs";
17
+ export { type AdmitTaskGraphInput, type AgentSessionBinding, type AnswerEvent, AnswerEventConflictError, type AnswerId, type AnswerQuestionInput, type AnswerQuestionResult, type ApprovalAccess, type ApprovalAccessDecisionInput, ApprovalAccessError, type ApprovalAccessOptions, type ApprovalAccessStores, type ApprovalDecision, ApprovalError, type ApprovalPolicy, type ApprovalPriority, type ApprovalRule, type ApprovalSubject, type AssertTaskAdmissionInput, type AssertTaskMessageClaimInput, type AssignmentPayload, type ClaimTaskMessageInput, type ClaimTaskMessageResult, type CompleteTaskMessageInput, type CompleteTaskWorkInput, type CompleteWorkflowTaskWorkInput, type CreateTaskEffectStoreOptions, type CreateTaskGraphStoreOptions, type CreateTaskInput, type CreateTaskMessageStoreOptions, type CreateTaskWorkStoreOptions, type DefaultTaskMessageProtocols, type DiscardTaskMessageInput, type ExecutionReference, type HandoffPayload, MAX_TASK_GRAPH_DEPENDENCIES, MAX_TASK_GRAPH_NODES, MAX_TASK_INBOX_PENDING, type MessageWaitingTask, type NeedsHumanTask, type ProcessTaskMessageOptions, type ProcessTaskMessageResult, type RecordTaskEffectInput, type RejectionDecision, type ResolveTaskEffectInput, type ResumeTaskWorkInput, type RootTaskOrigin, type SendTaskMessageInput, type SetTaskGraphDependenciesInput, type StandardTaskMessageProtocol, type SucceededTask, type Task, type TaskApproval, type TaskEffect, type TaskEffectKey, type TaskEffectLookupInput, type TaskEffectReference, type TaskEffectStore, type TaskGraph, TaskGraphConflictError, type TaskGraphNode, type TaskGraphNodeRef, type TaskGraphStore, type TaskId, type TaskInbox, type TaskKind, type TaskMessage, type TaskMessageAction, TaskMessageAuthorizationError, type TaskMessageAuthorizationInput, type TaskMessageAuthorize, type TaskMessageClaim, TaskMessageConflictError, type TaskMessageDiscard, type TaskMessageEffectKeyInput, TaskMessageError, type TaskMessageForProtocol, type TaskMessageId, TaskMessageLeaseError, type TaskMessageLookupInput, type TaskMessageOperationId, type TaskMessagePrincipal, type TaskMessageProcessing, type TaskMessageProcessingStores, type TaskMessageProtocol, type TaskMessageProtocolBinding, type TaskMessageProtocolBindingInput, type TaskMessageProtocolInput, type TaskMessageProtocolInputPayload, type TaskMessageProtocolStoredPayload, type TaskMessageProtocols, type TaskMessageRecipientInput, type TaskMessageSendInput, TaskMessageSourceFenceError, type TaskMessageStore, type TaskOrigin, type TaskPatch, type TaskQuestion, type TaskState, type TaskTransitionArguments, type TaskTransitionOptions, type TaskUsage, type TaskWorkStore, type TaskWorkStores, type TaskWorkUsage, type WaitForTaskMessagesInput, allowByDefaultApprovalPolicy, answerEventSchema, answerIdSchema, approvalPolicySchema, approvalPrioritySchema, approvalRuleSchema, assertTaskAdmission, assignmentPayloadSchema, assignmentTaskMessageProtocol, createApprovalAccess, createDefaultTaskMessageProtocols, createTaskEffectStore, createTaskGraphStore, createTaskMessageStore, createTaskWorkStore, defineTaskMessageProtocol, defineTaskMessageProtocols, executionReferenceSchema, handoffPayloadSchema, handoffTaskMessageProtocol, harnessSchema, isMessageWaitingTask, isNeedsHumanTask, isSucceededTask, parseTaskMessageProtocolBinding, processTaskMessage, readTaskMessageDecision, requiresApproval, sendTaskMessageInputSchema, standardTaskKinds, standardTaskMessageProtocols, taskApprovalSchema, taskBoundMessagePolicy, taskEffectKeySchema, taskEffectReferenceSchema, taskEffectSchema, taskExecutionRepositoryIdsSchema, taskGraphAdmissionSchema, taskGraphDependenciesSchema, taskGraphNodeSchema, taskGraphSchema, taskIdSchema, taskInboxSchema, taskInitialState, taskKindSchema, taskMessageClaimSchema, taskMessageDiscardSchema, taskMessageIdSchema, taskMessageInput, taskMessageOperationIdSchema, taskMessagePrincipalSchema, taskMessageProcessingSchema, taskMessageProtocolBindingSchema, taskMessageProtocolSchema, taskMessageReservationSchema, taskMessageSchema, taskOriginSchema, taskQuestionSchema, taskSchema, taskStateSchema, taskTransitions, taskUsageSchema };
package/dist/tasks.mjs ADDED
@@ -0,0 +1,17 @@
1
+ import { answerIdSchema, taskIdSchema } from "./schema/id.mjs";
2
+ import { allowByDefaultApprovalPolicy, approvalPolicySchema, approvalPrioritySchema, approvalRuleSchema, requiresApproval } from "./approval.mjs";
3
+ import { executionReferenceSchema, harnessSchema, isMessageWaitingTask, isNeedsHumanTask, isSucceededTask, standardTaskKinds, taskApprovalSchema, taskExecutionRepositoryIdsSchema, taskKindSchema, taskOriginSchema, taskQuestionSchema, taskSchema, taskStateSchema, taskUsageSchema } from "./schema/task.mjs";
4
+ import { taskInitialState, taskTransitions } from "./schema/transitions.mjs";
5
+ import { ApprovalAccessError, createApprovalAccess } from "./approval-access.mjs";
6
+ import { answerEventSchema } from "./schema/answer.mjs";
7
+ import { MAX_TASK_GRAPH_DEPENDENCIES, MAX_TASK_GRAPH_NODES, taskGraphAdmissionSchema, taskGraphDependenciesSchema, taskGraphNodeSchema, taskGraphSchema } from "./schema/task-graph.mjs";
8
+ import { MAX_TASK_INBOX_PENDING, defineTaskMessageProtocol, defineTaskMessageProtocols, parseTaskMessageProtocolBinding, sendTaskMessageInputSchema, taskInboxSchema, taskMessageClaimSchema, taskMessageDiscardSchema, taskMessageIdSchema, taskMessageInput, taskMessageOperationIdSchema, taskMessagePrincipalSchema, taskMessageProcessingSchema, taskMessageProtocolBindingSchema, taskMessageProtocolSchema, taskMessageReservationSchema, taskMessageSchema } from "./schema/task-message.mjs";
9
+ import { taskEffectKeySchema, taskEffectReferenceSchema, taskEffectSchema } from "./schema/task-effect.mjs";
10
+ import { TaskGraphConflictError, assertTaskAdmission, createTaskGraphStore } from "./store/task-graphs.mjs";
11
+ import { TaskMessageAuthorizationError, TaskMessageConflictError, TaskMessageError, TaskMessageLeaseError, TaskMessageSourceFenceError, createTaskMessageStore, taskBoundMessagePolicy } from "./store/task-messages.mjs";
12
+ import { createTaskWorkStore } from "./store/task-work.mjs";
13
+ import { createTaskEffectStore } from "./store/task-effects.mjs";
14
+ import { processTaskMessage, readTaskMessageDecision } from "./task-message-processing.mjs";
15
+ import { assignmentPayloadSchema, assignmentTaskMessageProtocol, createDefaultTaskMessageProtocols, handoffPayloadSchema, handoffTaskMessageProtocol, standardTaskMessageProtocols } from "./task-protocols.mjs";
16
+ import { AnswerEventConflictError, ApprovalError } from "./store/engine.mjs";
17
+ export { AnswerEventConflictError, ApprovalAccessError, ApprovalError, MAX_TASK_GRAPH_DEPENDENCIES, MAX_TASK_GRAPH_NODES, MAX_TASK_INBOX_PENDING, TaskGraphConflictError, TaskMessageAuthorizationError, TaskMessageConflictError, TaskMessageError, TaskMessageLeaseError, TaskMessageSourceFenceError, allowByDefaultApprovalPolicy, answerEventSchema, answerIdSchema, approvalPolicySchema, approvalPrioritySchema, approvalRuleSchema, assertTaskAdmission, assignmentPayloadSchema, assignmentTaskMessageProtocol, createApprovalAccess, createDefaultTaskMessageProtocols, createTaskEffectStore, createTaskGraphStore, createTaskMessageStore, createTaskWorkStore, defineTaskMessageProtocol, defineTaskMessageProtocols, executionReferenceSchema, handoffPayloadSchema, handoffTaskMessageProtocol, harnessSchema, isMessageWaitingTask, isNeedsHumanTask, isSucceededTask, parseTaskMessageProtocolBinding, processTaskMessage, readTaskMessageDecision, requiresApproval, sendTaskMessageInputSchema, standardTaskKinds, standardTaskMessageProtocols, taskApprovalSchema, taskBoundMessagePolicy, taskEffectKeySchema, taskEffectReferenceSchema, taskEffectSchema, taskExecutionRepositoryIdsSchema, taskGraphAdmissionSchema, taskGraphDependenciesSchema, taskGraphNodeSchema, taskGraphSchema, taskIdSchema, taskInboxSchema, taskInitialState, taskKindSchema, taskMessageClaimSchema, taskMessageDiscardSchema, taskMessageIdSchema, taskMessageInput, taskMessageOperationIdSchema, taskMessagePrincipalSchema, taskMessageProcessingSchema, taskMessageProtocolBindingSchema, taskMessageProtocolSchema, taskMessageReservationSchema, taskMessageSchema, taskOriginSchema, taskQuestionSchema, taskSchema, taskStateSchema, taskTransitions, taskUsageSchema };
@@ -0,0 +1,21 @@
1
+ import { RepositorySlug } from "./schema/repository.mjs";
2
+ import { GitHubGitTransport } from "./github-transfer.mjs";
3
+ import { Sandbox } from "@vercel/sandbox";
4
+ //#region src/vercel-git.d.ts
5
+ /** Repository and access level used to mint one trusted Git transport token. */
6
+ interface VercelGitHubTokenInput {
7
+ repository: RepositorySlug;
8
+ access: "read" | "write";
9
+ }
10
+ /** Configures fresh trusted sandboxes and repository-scoped Git tokens. */
11
+ interface VercelGitHubGitTransportOptions {
12
+ /** Reads must mint contents:read credentials; writes are confined to the supplied repository. */
13
+ token(input: VercelGitHubTokenInput): Promise<string>;
14
+ /** Creates a fresh sandbox, without a snapshot, repository, or running agent. */
15
+ createSandbox?: () => Promise<Pick<Sandbox, "runCommand" | "writeFiles" | "readFileToBuffer" | "updateNetworkPolicy" | "stop">>;
16
+ }
17
+ /** Transfer Git objects through fresh trusted sandboxes; credentials never reach an agent sandbox. */
18
+ declare function createVercelGitHubGitTransport(options: VercelGitHubGitTransportOptions): GitHubGitTransport;
19
+ //#endregion
20
+ export { VercelGitHubGitTransportOptions, VercelGitHubTokenInput, createVercelGitHubGitTransport };
21
+ //# sourceMappingURL=vercel-git.d.mts.map
@@ -0,0 +1,112 @@
1
+ import { repositorySlugSchema } from "./schema/repository.mjs";
2
+ import { validateGitBundle } from "./github-transfer.mjs";
3
+ import { isSafeGitRef } from "./github-publication.mjs";
4
+ //#region src/vercel-git.ts
5
+ function credentialPolicy(repository, token) {
6
+ return { allow: { "github.com": [{
7
+ match: { path: { startsWith: `/${repository}.git/` } },
8
+ transform: [{ headers: { authorization: `Basic ${Buffer.from(`x-access-token:${token}`).toString("base64")}` } }]
9
+ }] } };
10
+ }
11
+ /** Transfer Git objects through fresh trusted sandboxes; credentials never reach an agent sandbox. */
12
+ function createVercelGitHubGitTransport(options) {
13
+ async function isolated(repository, use) {
14
+ const slug = repositorySlugSchema.parse(repository.toLowerCase());
15
+ const sandbox = options.createSandbox ? await options.createSandbox() : await (await import("@vercel/sandbox")).Sandbox.create({
16
+ runtime: "node24",
17
+ timeout: 18e4,
18
+ networkPolicy: "deny-all"
19
+ });
20
+ async function git(...args) {
21
+ const result = await sandbox.runCommand({
22
+ cmd: "/usr/bin/env",
23
+ args: [
24
+ "-i",
25
+ "PATH=/usr/bin:/bin",
26
+ "HOME=/tmp",
27
+ "GIT_CONFIG_NOSYSTEM=1",
28
+ "GIT_CONFIG_GLOBAL=/dev/null",
29
+ "GIT_TERMINAL_PROMPT=0",
30
+ "git",
31
+ "-c",
32
+ "core.hooksPath=/dev/null",
33
+ "-c",
34
+ "credential.helper=",
35
+ "-c",
36
+ "protocol.ext.allow=never",
37
+ "-c",
38
+ "protocol.file.allow=always",
39
+ "-c",
40
+ "http.followRedirects=false",
41
+ ...args
42
+ ],
43
+ timeoutMs: 12e4
44
+ });
45
+ if (result.exitCode !== 0) throw new Error(`Trusted Git operation failed (${result.exitCode})`);
46
+ return (await result.stdout()).trim();
47
+ }
48
+ try {
49
+ await sandbox.updateNetworkPolicy("deny-all");
50
+ return await use(sandbox, git, slug);
51
+ } finally {
52
+ try {
53
+ await sandbox.updateNetworkPolicy("deny-all");
54
+ } finally {
55
+ await sandbox.stop();
56
+ }
57
+ }
58
+ }
59
+ return {
60
+ async fetch(input) {
61
+ if (input.refs.some((ref) => !ref.startsWith("refs/") || !isSafeGitRef(ref))) throw new Error("Invalid Git fetch ref");
62
+ return isolated(input.repository, async (sandbox, git, slug) => {
63
+ await sandbox.updateNetworkPolicy(credentialPolicy(slug, await options.token({
64
+ repository: slug,
65
+ access: "read"
66
+ })));
67
+ await git("clone", "--bare", "--no-hardlinks", `https://github.com/${slug}.git`, "/tmp/transfer.git");
68
+ if (input.refs.length) await git("-C", "/tmp/transfer.git", "fetch", "--no-tags", "origin", ...input.refs.map((ref) => `+${ref}:${ref}`));
69
+ await sandbox.updateNetworkPolicy("deny-all");
70
+ await git("-C", "/tmp/transfer.git", "bundle", "create", "/tmp/transfer.bundle", "--all");
71
+ const size = await sandbox.runCommand({
72
+ cmd: "stat",
73
+ args: [
74
+ "-c",
75
+ "%s",
76
+ "/tmp/transfer.bundle"
77
+ ]
78
+ });
79
+ const byteLength = Number(await size.stdout());
80
+ if (size.exitCode !== 0 || !Number.isSafeInteger(byteLength) || byteLength < 1 || byteLength > 52428800) throw new Error("Git bundle exceeds transfer limit");
81
+ const data = await sandbox.readFileToBuffer({ path: "/tmp/transfer.bundle" });
82
+ if (!data || data.length > 52428800) throw new Error("Invalid Git bundle size");
83
+ const bundle = { base64: data.toString("base64") };
84
+ validateGitBundle(bundle);
85
+ return bundle;
86
+ });
87
+ },
88
+ async push(input) {
89
+ if (!isSafeGitRef(input.branch) || !/^[a-f0-9]{40}$/.test(input.head) || !/^[a-f0-9]{40}$/.test(input.expectedHead)) throw new Error("Invalid Git publication target");
90
+ const bundle = validateGitBundle(input.bundle);
91
+ await isolated(input.repository, async (sandbox, git, slug) => {
92
+ await git("init", "--bare", "/tmp/transfer.git");
93
+ await sandbox.writeFiles([{
94
+ path: "/tmp/transfer.bundle",
95
+ content: bundle
96
+ }]);
97
+ await git("-C", "/tmp/transfer.git", "bundle", "verify", "/tmp/transfer.bundle");
98
+ await git("-C", "/tmp/transfer.git", "fetch", "/tmp/transfer.bundle", "HEAD:refs/heads/candidate");
99
+ if (await git("-C", "/tmp/transfer.git", "rev-parse", "refs/heads/candidate") !== input.head) throw new Error("Git bundle head does not match publication target");
100
+ await sandbox.updateNetworkPolicy(credentialPolicy(slug, await options.token({
101
+ repository: slug,
102
+ access: "write"
103
+ })));
104
+ await git("-C", "/tmp/transfer.git", "push", `--force-with-lease=refs/heads/${input.branch}:${input.expectedHead}`, `https://github.com/${slug}.git`, `${input.head}:refs/heads/${input.branch}`);
105
+ });
106
+ }
107
+ };
108
+ }
109
+ //#endregion
110
+ export { createVercelGitHubGitTransport };
111
+
112
+ //# sourceMappingURL=vercel-git.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-git.mjs","names":[],"sources":["../src/vercel-git.ts"],"sourcesContent":["import type { Sandbox, NetworkPolicy } from \"@vercel/sandbox\";\nimport { repositorySlugSchema, type RepositorySlug } from \"./schema/repository\";\nimport { isSafeGitRef } from \"./github-publication\";\nimport { maxGitBundleBytes, validateGitBundle, type GitHubGitTransport } from \"./github-transfer\";\n\n/** Repository and access level used to mint one trusted Git transport token. */\nexport interface VercelGitHubTokenInput {\n repository: RepositorySlug;\n access: \"read\" | \"write\";\n}\n\n/** Configures fresh trusted sandboxes and repository-scoped Git tokens. */\nexport interface VercelGitHubGitTransportOptions {\n /** Reads must mint contents:read credentials; writes are confined to the supplied repository. */\n token(input: VercelGitHubTokenInput): Promise<string>;\n /** Creates a fresh sandbox, without a snapshot, repository, or running agent. */\n createSandbox?: () => Promise<\n Pick<Sandbox, \"runCommand\" | \"writeFiles\" | \"readFileToBuffer\" | \"updateNetworkPolicy\" | \"stop\">\n >;\n}\n\nfunction credentialPolicy(repository: RepositorySlug, token: string): NetworkPolicy {\n return {\n allow: {\n \"github.com\": [\n {\n match: { path: { startsWith: `/${repository}.git/` } },\n transform: [\n {\n headers: {\n authorization: `Basic ${Buffer.from(`x-access-token:${token}`).toString(\"base64\")}`,\n },\n },\n ],\n },\n ],\n },\n };\n}\n\n/** Transfer Git objects through fresh trusted sandboxes; credentials never reach an agent sandbox. */\nexport function createVercelGitHubGitTransport(\n options: VercelGitHubGitTransportOptions,\n): GitHubGitTransport {\n async function isolated<T>(\n repository: RepositorySlug,\n use: (\n sandbox: Awaited<ReturnType<NonNullable<VercelGitHubGitTransportOptions[\"createSandbox\"]>>>,\n git: (...args: string[]) => Promise<string>,\n repository: RepositorySlug,\n ) => Promise<T>,\n ): Promise<T> {\n const slug = repositorySlugSchema.parse(repository.toLowerCase());\n const sandbox = options.createSandbox\n ? await options.createSandbox()\n : await (\n await import(\"@vercel/sandbox\")\n ).Sandbox.create({ runtime: \"node24\", timeout: 180_000, networkPolicy: \"deny-all\" });\n async function git(...args: string[]): Promise<string> {\n const result = await sandbox.runCommand({\n cmd: \"/usr/bin/env\",\n args: [\n \"-i\",\n \"PATH=/usr/bin:/bin\",\n \"HOME=/tmp\",\n \"GIT_CONFIG_NOSYSTEM=1\",\n \"GIT_CONFIG_GLOBAL=/dev/null\",\n \"GIT_TERMINAL_PROMPT=0\",\n \"git\",\n \"-c\",\n \"core.hooksPath=/dev/null\",\n \"-c\",\n \"credential.helper=\",\n \"-c\",\n \"protocol.ext.allow=never\",\n \"-c\",\n \"protocol.file.allow=always\",\n \"-c\",\n \"http.followRedirects=false\",\n ...args,\n ],\n timeoutMs: 120_000,\n });\n if (result.exitCode !== 0)\n throw new Error(`Trusted Git operation failed (${result.exitCode})`);\n return (await result.stdout()).trim();\n }\n try {\n await sandbox.updateNetworkPolicy(\"deny-all\");\n return await use(sandbox, git, slug);\n } finally {\n try {\n await sandbox.updateNetworkPolicy(\"deny-all\");\n } finally {\n await sandbox.stop();\n }\n }\n }\n return {\n async fetch(input) {\n if (input.refs.some((ref) => !ref.startsWith(\"refs/\") || !isSafeGitRef(ref)))\n throw new Error(\"Invalid Git fetch ref\");\n return isolated(input.repository, async (sandbox, git, slug) => {\n await sandbox.updateNetworkPolicy(\n credentialPolicy(slug, await options.token({ repository: slug, access: \"read\" })),\n );\n await git(\n \"clone\",\n \"--bare\",\n \"--no-hardlinks\",\n `https://github.com/${slug}.git`,\n \"/tmp/transfer.git\",\n );\n if (input.refs.length)\n await git(\n \"-C\",\n \"/tmp/transfer.git\",\n \"fetch\",\n \"--no-tags\",\n \"origin\",\n ...input.refs.map((ref) => `+${ref}:${ref}`),\n );\n await sandbox.updateNetworkPolicy(\"deny-all\");\n await git(\"-C\", \"/tmp/transfer.git\", \"bundle\", \"create\", \"/tmp/transfer.bundle\", \"--all\");\n const size = await sandbox.runCommand({\n cmd: \"stat\",\n args: [\"-c\", \"%s\", \"/tmp/transfer.bundle\"],\n });\n const byteLength = Number(await size.stdout());\n if (\n size.exitCode !== 0 ||\n !Number.isSafeInteger(byteLength) ||\n byteLength < 1 ||\n byteLength > maxGitBundleBytes\n )\n throw new Error(\"Git bundle exceeds transfer limit\");\n const data = await sandbox.readFileToBuffer({ path: \"/tmp/transfer.bundle\" });\n if (!data || data.length > maxGitBundleBytes) throw new Error(\"Invalid Git bundle size\");\n const bundle = { base64: data.toString(\"base64\") };\n validateGitBundle(bundle);\n return bundle;\n });\n },\n async push(input) {\n if (\n !isSafeGitRef(input.branch) ||\n !/^[a-f0-9]{40}$/.test(input.head) ||\n !/^[a-f0-9]{40}$/.test(input.expectedHead)\n )\n throw new Error(\"Invalid Git publication target\");\n const bundle = validateGitBundle(input.bundle);\n await isolated(input.repository, async (sandbox, git, slug) => {\n await git(\"init\", \"--bare\", \"/tmp/transfer.git\");\n await sandbox.writeFiles([{ path: \"/tmp/transfer.bundle\", content: bundle }]);\n await git(\"-C\", \"/tmp/transfer.git\", \"bundle\", \"verify\", \"/tmp/transfer.bundle\");\n await git(\n \"-C\",\n \"/tmp/transfer.git\",\n \"fetch\",\n \"/tmp/transfer.bundle\",\n \"HEAD:refs/heads/candidate\",\n );\n if (\n (await git(\"-C\", \"/tmp/transfer.git\", \"rev-parse\", \"refs/heads/candidate\")) !== input.head\n )\n throw new Error(\"Git bundle head does not match publication target\");\n await sandbox.updateNetworkPolicy(\n credentialPolicy(slug, await options.token({ repository: slug, access: \"write\" })),\n );\n await git(\n \"-C\",\n \"/tmp/transfer.git\",\n \"push\",\n `--force-with-lease=refs/heads/${input.branch}:${input.expectedHead}`,\n `https://github.com/${slug}.git`,\n `${input.head}:refs/heads/${input.branch}`,\n );\n });\n },\n };\n}\n"],"mappings":"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"}
package/dist/vercel.d.mts CHANGED
@@ -1,4 +1,32 @@
1
+ import { RepositorySlug } from "./schema/repository.mjs";
2
+ import { WorkNotification, WorkNotifications } from "./store/work-notifications.mjs";
3
+ import { VercelGitHubGitTransportOptions, VercelGitHubTokenInput, createVercelGitHubGitTransport } from "./vercel-git.mjs";
1
4
  //#region src/vercel.d.ts
5
+ /** Provider delivery settings applied to one Vercel Queue message. */
6
+ interface VercelQueueSendOptions {
7
+ region: string;
8
+ retentionSeconds: number;
9
+ idempotencyKey: string;
10
+ delaySeconds: number;
11
+ }
12
+ /** Injectable Vercel Queue send operation for one validated Factory work notification. */
13
+ type VercelQueueSend = (topic: string, message: WorkNotification, options: VercelQueueSendOptions) => Promise<unknown>;
14
+ /** Configures Vercel Queue transport, failure reporting, retention, and runtime guards. */
15
+ interface VercelWorkQueueOptions {
16
+ send: VercelQueueSend;
17
+ onError(error: unknown, event: WorkNotification): void;
18
+ topic?: string;
19
+ region?: string;
20
+ retentionSeconds?: number;
21
+ environment?: Readonly<Record<string, string | undefined>>;
22
+ }
23
+ /** Publishes graph wakeups and exposes the hosted-runtime notification adapter. */
24
+ interface VercelWorkQueue {
25
+ publish(event: WorkNotification, delaySeconds?: number): Promise<void>;
26
+ hostedNotifications(): WorkNotifications | undefined;
27
+ }
28
+ /** Configure graph wakeups over Vercel Queues without granting queue messages execution authority. */
29
+ declare function createVercelWorkQueue(options: VercelWorkQueueOptions): VercelWorkQueue;
2
30
  /**
3
31
  * Verify a Vercel webhook signature (the x-vercel-signature header): an
4
32
  * HMAC-SHA1 hex digest of the raw request body. Returns false for missing or
@@ -9,6 +37,7 @@ declare function verifyVercelSignature(options: {
9
37
  payload: string;
10
38
  signature: string | null;
11
39
  }): boolean;
40
+ /** A normalized production deployment observation with optional Git commit identity. */
12
41
  interface VercelProductionDeployment {
13
42
  source: "vercel_production_deployment";
14
43
  deliveryId: string;
@@ -17,7 +46,7 @@ interface VercelProductionDeployment {
17
46
  deploymentUrl: string;
18
47
  projectId: string;
19
48
  /** owner/name from the deployment's git metadata; null for non-git deployments. */
20
- repositorySlug: string | null;
49
+ repositorySlug: RepositorySlug | null;
21
50
  /** Commit the deployment was built from; null for non-git deployments. */
22
51
  commitSha: string | null;
23
52
  }
@@ -27,6 +56,8 @@ interface VercelProductionDeployment {
27
56
  * production. Returns null for other events and non-production targets.
28
57
  */
29
58
  declare function normalizeVercelProductionDeployment(payload: unknown): VercelProductionDeployment | null;
59
+ /** Verify a personal Vercel API token against Vercel; never infer a person from workload OIDC. */
60
+ declare function authenticateVercelUserToken(request: Request, fetcher?: typeof fetch): Promise<string | null>;
30
61
  //#endregion
31
- export { VercelProductionDeployment, normalizeVercelProductionDeployment, verifyVercelSignature };
62
+ export { type VercelGitHubGitTransportOptions, type VercelGitHubTokenInput, VercelProductionDeployment, VercelQueueSend, VercelQueueSendOptions, VercelWorkQueue, VercelWorkQueueOptions, authenticateVercelUserToken, createVercelGitHubGitTransport, createVercelWorkQueue, normalizeVercelProductionDeployment, verifyVercelSignature };
32
63
  //# sourceMappingURL=vercel.d.mts.map
package/dist/vercel.mjs CHANGED
@@ -1,6 +1,35 @@
1
- import { z } from "zod";
1
+ import { repositorySlugSchema } from "./schema/repository.mjs";
2
+ import { workNotificationSchema } from "./store/work-notifications.mjs";
3
+ import { createVercelGitHubGitTransport } from "./vercel-git.mjs";
2
4
  import { createHmac, timingSafeEqual } from "node:crypto";
5
+ import { z } from "zod";
3
6
  //#region src/vercel.ts
7
+ /** Configure graph wakeups over Vercel Queues without granting queue messages execution authority. */
8
+ function createVercelWorkQueue(options) {
9
+ const environment = options.environment ?? process.env;
10
+ const topic = options.topic ?? "factory-work";
11
+ const region = options.region ?? "iad1";
12
+ const retentionSeconds = options.retentionSeconds ?? 604800;
13
+ const hosted = () => environment.VERCEL === "1" && environment.FACTORY_LOCAL_TEST !== "1";
14
+ const publish = async (event, delaySeconds = 0) => {
15
+ if (!hosted()) throw new Error("Vercel work queues require a hosted, non-fixture runtime");
16
+ const message = workNotificationSchema.parse(event);
17
+ await options.send(topic, message, {
18
+ region,
19
+ retentionSeconds,
20
+ idempotencyKey: message.key,
21
+ delaySeconds
22
+ });
23
+ };
24
+ const notifications = {
25
+ publish,
26
+ onError: options.onError
27
+ };
28
+ return Object.freeze({
29
+ publish,
30
+ hostedNotifications: () => hosted() ? notifications : void 0
31
+ });
32
+ }
4
33
  /**
5
34
  * Verify a Vercel webhook signature (the x-vercel-signature header): an
6
35
  * HMAC-SHA1 hex digest of the raw request body. Returns false for missing or
@@ -45,6 +74,7 @@ function normalizeVercelProductionDeployment(payload) {
45
74
  const meta = event.deployment.meta;
46
75
  const org = meta?.githubCommitOrg ?? meta?.githubOrg;
47
76
  const repo = meta?.githubCommitRepo ?? meta?.githubRepo;
77
+ const repositorySlug = org === void 0 || repo === void 0 ? null : repositorySlugSchema.safeParse(`${org}/${repo}`.toLowerCase()).data ?? null;
48
78
  return {
49
79
  source: "vercel_production_deployment",
50
80
  deliveryId: parsed.data.id,
@@ -52,11 +82,26 @@ function normalizeVercelProductionDeployment(payload) {
52
82
  deploymentId: event.deployment.id,
53
83
  deploymentUrl: event.deployment.url,
54
84
  projectId: event.project.id,
55
- repositorySlug: org !== void 0 && repo !== void 0 ? `${org}/${repo}`.toLowerCase() : null,
85
+ repositorySlug,
56
86
  commitSha: meta?.githubCommitSha ?? null
57
87
  };
58
88
  }
89
+ /** Verify a personal Vercel API token against Vercel; never infer a person from workload OIDC. */
90
+ async function authenticateVercelUserToken(request, fetcher = fetch) {
91
+ const authorization = request.headers.get("authorization");
92
+ if (!authorization?.match(/^Bearer \S+$/u)) return null;
93
+ const response = await fetcher("https://api.vercel.com/v2/user", {
94
+ headers: { authorization },
95
+ cache: "no-store",
96
+ redirect: "error",
97
+ signal: AbortSignal.timeout(1e4)
98
+ });
99
+ if (response.status === 401 || response.status === 403) return null;
100
+ if (!response.ok) throw new Error(`Vercel identity lookup failed (${response.status})`);
101
+ const result = z.object({ user: z.object({ id: z.string().min(1) }) }).safeParse(await response.json());
102
+ return result.success ? `vercel:${result.data.user.id}` : null;
103
+ }
59
104
  //#endregion
60
- export { normalizeVercelProductionDeployment, verifyVercelSignature };
105
+ export { authenticateVercelUserToken, createVercelGitHubGitTransport, createVercelWorkQueue, normalizeVercelProductionDeployment, verifyVercelSignature };
61
106
 
62
107
  //# sourceMappingURL=vercel.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vercel.mjs","names":[],"sources":["../src/vercel.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { z } from \"zod\";\n\n/**\n * Verify a Vercel webhook signature (the x-vercel-signature header): an\n * HMAC-SHA1 hex digest of the raw request body. Returns false for missing or\n * malformed signatures instead of throwing.\n */\nexport function verifyVercelSignature(options: {\n secret: string;\n payload: string;\n signature: string | null;\n}): boolean {\n const { secret, payload, signature } = options;\n if (signature === null || !/^[0-9a-f]{40}$/.test(signature)) {\n return false;\n }\n const expected = createHmac(\"sha1\", secret).update(payload).digest(\"hex\");\n return timingSafeEqual(Buffer.from(signature, \"hex\"), Buffer.from(expected, \"hex\"));\n}\n\nconst observedDeploymentEvents = new Set([\"deployment.succeeded\", \"deployment.promoted\"]);\n\nconst deploymentEventSchema = z.looseObject({\n id: z.string().min(1),\n type: z.string(),\n payload: z.looseObject({\n target: z.string().nullable().optional(),\n project: z.looseObject({ id: z.string().min(1) }),\n deployment: z.looseObject({\n id: z.string().min(1),\n url: z.string().min(1),\n meta: z\n .looseObject({\n githubCommitSha: z.string().optional(),\n githubCommitOrg: z.string().optional(),\n githubCommitRepo: z.string().optional(),\n githubOrg: z.string().optional(),\n githubRepo: z.string().optional(),\n })\n .optional(),\n }),\n }),\n});\n\nexport interface VercelProductionDeployment {\n source: \"vercel_production_deployment\";\n deliveryId: string;\n eventType: string;\n deploymentId: string;\n deploymentUrl: string;\n projectId: string;\n /** owner/name from the deployment's git metadata; null for non-git deployments. */\n repositorySlug: string | null;\n /** Commit the deployment was built from; null for non-git deployments. */\n commitSha: string | null;\n}\n\n/**\n * Normalize a deployment.succeeded or deployment.promoted webhook for a\n * production deployment so the factory can observe a merge reaching\n * production. Returns null for other events and non-production targets.\n */\nexport function normalizeVercelProductionDeployment(\n payload: unknown,\n): VercelProductionDeployment | null {\n const parsed = deploymentEventSchema.safeParse(payload);\n if (!parsed.success || !observedDeploymentEvents.has(parsed.data.type)) {\n return null;\n }\n const event = parsed.data.payload;\n if (event.target !== \"production\") {\n return null;\n }\n const meta = event.deployment.meta;\n const org = meta?.githubCommitOrg ?? meta?.githubOrg;\n const repo = meta?.githubCommitRepo ?? meta?.githubRepo;\n return {\n source: \"vercel_production_deployment\",\n deliveryId: parsed.data.id,\n eventType: parsed.data.type,\n deploymentId: event.deployment.id,\n deploymentUrl: event.deployment.url,\n projectId: event.project.id,\n repositorySlug:\n org !== undefined && repo !== undefined ? `${org}/${repo}`.toLowerCase() : null,\n commitSha: meta?.githubCommitSha ?? null,\n };\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,sBAAsB,SAI1B;CACV,MAAM,EAAE,QAAQ,SAAS,cAAc;CACvC,IAAI,cAAc,QAAQ,CAAC,iBAAiB,KAAK,SAAS,GACxD,OAAO;CAET,MAAM,WAAW,WAAW,QAAQ,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK;CACxE,OAAO,gBAAgB,OAAO,KAAK,WAAW,KAAK,GAAG,OAAO,KAAK,UAAU,KAAK,CAAC;AACpF;AAEA,MAAM,2CAA2B,IAAI,IAAI,CAAC,wBAAwB,qBAAqB,CAAC;AAExF,MAAM,wBAAwB,EAAE,YAAY;CAC1C,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACpB,MAAM,EAAE,OAAO;CACf,SAAS,EAAE,YAAY;EACrB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;EACvC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;EAChD,YAAY,EAAE,YAAY;GACxB,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;GACpB,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;GACrB,MAAM,EACH,YAAY;IACX,iBAAiB,EAAE,OAAO,CAAC,CAAC,SAAS;IACrC,iBAAiB,EAAE,OAAO,CAAC,CAAC,SAAS;IACrC,kBAAkB,EAAE,OAAO,CAAC,CAAC,SAAS;IACtC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS;IAC/B,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;GAClC,CAAC,CAAC,CACD,SAAS;EACd,CAAC;CACH,CAAC;AACH,CAAC;;;;;;AAoBD,SAAgB,oCACd,SACmC;CACnC,MAAM,SAAS,sBAAsB,UAAU,OAAO;CACtD,IAAI,CAAC,OAAO,WAAW,CAAC,yBAAyB,IAAI,OAAO,KAAK,IAAI,GACnE,OAAO;CAET,MAAM,QAAQ,OAAO,KAAK;CAC1B,IAAI,MAAM,WAAW,cACnB,OAAO;CAET,MAAM,OAAO,MAAM,WAAW;CAC9B,MAAM,MAAM,MAAM,mBAAmB,MAAM;CAC3C,MAAM,OAAO,MAAM,oBAAoB,MAAM;CAC7C,OAAO;EACL,QAAQ;EACR,YAAY,OAAO,KAAK;EACxB,WAAW,OAAO,KAAK;EACvB,cAAc,MAAM,WAAW;EAC/B,eAAe,MAAM,WAAW;EAChC,WAAW,MAAM,QAAQ;EACzB,gBACE,QAAQ,KAAA,KAAa,SAAS,KAAA,IAAY,GAAG,IAAI,GAAG,OAAO,YAAY,IAAI;EAC7E,WAAW,MAAM,mBAAmB;CACtC;AACF"}
1
+ {"version":3,"file":"vercel.mjs","names":[],"sources":["../src/vercel.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { repositorySlugSchema, type RepositorySlug } from \"./schema/repository\";\nimport {\n workNotificationSchema,\n type WorkNotification,\n type WorkNotifications,\n} from \"./store/work-notifications\";\n\n/** Provider delivery settings applied to one Vercel Queue message. */\nexport interface VercelQueueSendOptions {\n region: string;\n retentionSeconds: number;\n idempotencyKey: string;\n delaySeconds: number;\n}\n\n/** Injectable Vercel Queue send operation for one validated Factory work notification. */\nexport type VercelQueueSend = (\n topic: string,\n message: WorkNotification,\n options: VercelQueueSendOptions,\n) => Promise<unknown>;\n\n/** Configures Vercel Queue transport, failure reporting, retention, and runtime guards. */\nexport interface VercelWorkQueueOptions {\n send: VercelQueueSend;\n onError(error: unknown, event: WorkNotification): void;\n topic?: string;\n region?: string;\n retentionSeconds?: number;\n environment?: Readonly<Record<string, string | undefined>>;\n}\n\n/** Publishes graph wakeups and exposes the hosted-runtime notification adapter. */\nexport interface VercelWorkQueue {\n publish(event: WorkNotification, delaySeconds?: number): Promise<void>;\n hostedNotifications(): WorkNotifications | undefined;\n}\n\nexport {\n createVercelGitHubGitTransport,\n type VercelGitHubGitTransportOptions,\n type VercelGitHubTokenInput,\n} from \"./vercel-git\";\n\n/** Configure graph wakeups over Vercel Queues without granting queue messages execution authority. */\nexport function createVercelWorkQueue(options: VercelWorkQueueOptions): VercelWorkQueue {\n const environment = options.environment ?? process.env;\n const topic = options.topic ?? \"factory-work\";\n const region = options.region ?? \"iad1\";\n const retentionSeconds = options.retentionSeconds ?? 604_800;\n const hosted = () => environment.VERCEL === \"1\" && environment.FACTORY_LOCAL_TEST !== \"1\";\n const publish = async (event: WorkNotification, delaySeconds = 0): Promise<void> => {\n if (!hosted()) throw new Error(\"Vercel work queues require a hosted, non-fixture runtime\");\n const message = workNotificationSchema.parse(event);\n await options.send(topic, message, {\n region,\n retentionSeconds,\n idempotencyKey: message.key,\n delaySeconds,\n });\n };\n const notifications: WorkNotifications = { publish, onError: options.onError };\n return Object.freeze({\n publish,\n hostedNotifications: () => (hosted() ? notifications : undefined),\n });\n}\n\n/**\n * Verify a Vercel webhook signature (the x-vercel-signature header): an\n * HMAC-SHA1 hex digest of the raw request body. Returns false for missing or\n * malformed signatures instead of throwing.\n */\nexport function verifyVercelSignature(options: {\n secret: string;\n payload: string;\n signature: string | null;\n}): boolean {\n const { secret, payload, signature } = options;\n if (signature === null || !/^[0-9a-f]{40}$/.test(signature)) {\n return false;\n }\n const expected = createHmac(\"sha1\", secret).update(payload).digest(\"hex\");\n return timingSafeEqual(Buffer.from(signature, \"hex\"), Buffer.from(expected, \"hex\"));\n}\n\nconst observedDeploymentEvents = new Set([\"deployment.succeeded\", \"deployment.promoted\"]);\n\nconst deploymentEventSchema = z.looseObject({\n id: z.string().min(1),\n type: z.string(),\n payload: z.looseObject({\n target: z.string().nullable().optional(),\n project: z.looseObject({ id: z.string().min(1) }),\n deployment: z.looseObject({\n id: z.string().min(1),\n url: z.string().min(1),\n meta: z\n .looseObject({\n githubCommitSha: z.string().optional(),\n githubCommitOrg: z.string().optional(),\n githubCommitRepo: z.string().optional(),\n githubOrg: z.string().optional(),\n githubRepo: z.string().optional(),\n })\n .optional(),\n }),\n }),\n});\n\n/** A normalized production deployment observation with optional Git commit identity. */\nexport interface VercelProductionDeployment {\n source: \"vercel_production_deployment\";\n deliveryId: string;\n eventType: string;\n deploymentId: string;\n deploymentUrl: string;\n projectId: string;\n /** owner/name from the deployment's git metadata; null for non-git deployments. */\n repositorySlug: RepositorySlug | null;\n /** Commit the deployment was built from; null for non-git deployments. */\n commitSha: string | null;\n}\n\n/**\n * Normalize a deployment.succeeded or deployment.promoted webhook for a\n * production deployment so the factory can observe a merge reaching\n * production. Returns null for other events and non-production targets.\n */\nexport function normalizeVercelProductionDeployment(\n payload: unknown,\n): VercelProductionDeployment | null {\n const parsed = deploymentEventSchema.safeParse(payload);\n if (!parsed.success || !observedDeploymentEvents.has(parsed.data.type)) {\n return null;\n }\n const event = parsed.data.payload;\n if (event.target !== \"production\") {\n return null;\n }\n const meta = event.deployment.meta;\n const org = meta?.githubCommitOrg ?? meta?.githubOrg;\n const repo = meta?.githubCommitRepo ?? meta?.githubRepo;\n const repositorySlug =\n org === undefined || repo === undefined\n ? null\n : (repositorySlugSchema.safeParse(`${org}/${repo}`.toLowerCase()).data ?? null);\n return {\n source: \"vercel_production_deployment\",\n deliveryId: parsed.data.id,\n eventType: parsed.data.type,\n deploymentId: event.deployment.id,\n deploymentUrl: event.deployment.url,\n projectId: event.project.id,\n repositorySlug,\n commitSha: meta?.githubCommitSha ?? null,\n };\n}\n\n/** Verify a personal Vercel API token against Vercel; never infer a person from workload OIDC. */\nexport async function authenticateVercelUserToken(\n request: Request,\n fetcher: typeof fetch = fetch,\n): Promise<string | null> {\n const authorization = request.headers.get(\"authorization\");\n if (!authorization?.match(/^Bearer \\S+$/u)) return null;\n const response = await fetcher(\"https://api.vercel.com/v2/user\", {\n headers: { authorization },\n cache: \"no-store\",\n redirect: \"error\",\n signal: AbortSignal.timeout(10_000),\n });\n if (response.status === 401 || response.status === 403) return null;\n if (!response.ok) throw new Error(`Vercel identity lookup failed (${response.status})`);\n const result = z\n .object({ user: z.object({ id: z.string().min(1) }) })\n .safeParse(await response.json());\n return result.success ? `vercel:${result.data.user.id}` : null;\n}\n"],"mappings":";;;;;;;AA+CA,SAAgB,sBAAsB,SAAkD;CACtF,MAAM,cAAc,QAAQ,eAAe,QAAQ;CACnD,MAAM,QAAQ,QAAQ,SAAS;CAC/B,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,mBAAmB,QAAQ,oBAAoB;CACrD,MAAM,eAAe,YAAY,WAAW,OAAO,YAAY,uBAAuB;CACtF,MAAM,UAAU,OAAO,OAAyB,eAAe,MAAqB;EAClF,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,MAAM,0DAA0D;EACzF,MAAM,UAAU,uBAAuB,MAAM,KAAK;EAClD,MAAM,QAAQ,KAAK,OAAO,SAAS;GACjC;GACA;GACA,gBAAgB,QAAQ;GACxB;EACF,CAAC;CACH;CACA,MAAM,gBAAmC;EAAE;EAAS,SAAS,QAAQ;CAAQ;CAC7E,OAAO,OAAO,OAAO;EACnB;EACA,2BAA4B,OAAO,IAAI,gBAAgB,KAAA;CACzD,CAAC;AACH;;;;;;AAOA,SAAgB,sBAAsB,SAI1B;CACV,MAAM,EAAE,QAAQ,SAAS,cAAc;CACvC,IAAI,cAAc,QAAQ,CAAC,iBAAiB,KAAK,SAAS,GACxD,OAAO;CAET,MAAM,WAAW,WAAW,QAAQ,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK;CACxE,OAAO,gBAAgB,OAAO,KAAK,WAAW,KAAK,GAAG,OAAO,KAAK,UAAU,KAAK,CAAC;AACpF;AAEA,MAAM,2CAA2B,IAAI,IAAI,CAAC,wBAAwB,qBAAqB,CAAC;AAExF,MAAM,wBAAwB,EAAE,YAAY;CAC1C,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACpB,MAAM,EAAE,OAAO;CACf,SAAS,EAAE,YAAY;EACrB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;EACvC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;EAChD,YAAY,EAAE,YAAY;GACxB,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;GACpB,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;GACrB,MAAM,EACH,YAAY;IACX,iBAAiB,EAAE,OAAO,CAAC,CAAC,SAAS;IACrC,iBAAiB,EAAE,OAAO,CAAC,CAAC,SAAS;IACrC,kBAAkB,EAAE,OAAO,CAAC,CAAC,SAAS;IACtC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS;IAC/B,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;GAClC,CAAC,CAAC,CACD,SAAS;EACd,CAAC;CACH,CAAC;AACH,CAAC;;;;;;AAqBD,SAAgB,oCACd,SACmC;CACnC,MAAM,SAAS,sBAAsB,UAAU,OAAO;CACtD,IAAI,CAAC,OAAO,WAAW,CAAC,yBAAyB,IAAI,OAAO,KAAK,IAAI,GACnE,OAAO;CAET,MAAM,QAAQ,OAAO,KAAK;CAC1B,IAAI,MAAM,WAAW,cACnB,OAAO;CAET,MAAM,OAAO,MAAM,WAAW;CAC9B,MAAM,MAAM,MAAM,mBAAmB,MAAM;CAC3C,MAAM,OAAO,MAAM,oBAAoB,MAAM;CAC7C,MAAM,iBACJ,QAAQ,KAAA,KAAa,SAAS,KAAA,IAC1B,OACC,qBAAqB,UAAU,GAAG,IAAI,GAAG,OAAO,YAAY,CAAC,CAAC,CAAC,QAAQ;CAC9E,OAAO;EACL,QAAQ;EACR,YAAY,OAAO,KAAK;EACxB,WAAW,OAAO,KAAK;EACvB,cAAc,MAAM,WAAW;EAC/B,eAAe,MAAM,WAAW;EAChC,WAAW,MAAM,QAAQ;EACzB;EACA,WAAW,MAAM,mBAAmB;CACtC;AACF;;AAGA,eAAsB,4BACpB,SACA,UAAwB,OACA;CACxB,MAAM,gBAAgB,QAAQ,QAAQ,IAAI,eAAe;CACzD,IAAI,CAAC,eAAe,MAAM,eAAe,GAAG,OAAO;CACnD,MAAM,WAAW,MAAM,QAAQ,kCAAkC;EAC/D,SAAS,EAAE,cAAc;EACzB,OAAO;EACP,UAAU;EACV,QAAQ,YAAY,QAAQ,GAAM;CACpC,CAAC;CACD,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK,OAAO;CAC/D,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,kCAAkC,SAAS,OAAO,EAAE;CACtF,MAAM,SAAS,EACZ,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACrD,UAAU,MAAM,SAAS,KAAK,CAAC;CAClC,OAAO,OAAO,UAAU,UAAU,OAAO,KAAK,KAAK,OAAO;AAC5D"}
@@ -0,0 +1,29 @@
1
+ import { RepositoryId } from "../schema/id.mjs";
2
+ import { FactoryStores } from "../store/engine.mjs";
3
+ import { ExistingWorkLookupOptions, ExistingWorkLookupResult } from "./find-existing-work.mjs";
4
+ import { ToolContext, ToolDefinition } from "eve/tools";
5
+ //#region src/work-triage/eve-tool.d.ts
6
+ /** Change, repository, and Task capabilities required by the existing-work tool. */
7
+ type FindExistingWorkToolStores = Pick<FactoryStores, "changes" | "repositories" | "tasks">;
8
+ /** Stores and provider lookup used to construct the existing-work tool. */
9
+ interface FindExistingWorkToolOptions extends ExistingWorkLookupOptions {
10
+ stores: FindExistingWorkToolStores;
11
+ }
12
+ /** Repository selected for a read-only existing-work lookup. */
13
+ interface FindExistingWorkToolInput {
14
+ repositoryId: RepositoryId;
15
+ }
16
+ /** Eve tool that checks a repository for overlapping open work. */
17
+ interface FindExistingWorkTool extends ToolDefinition<FindExistingWorkToolInput, ExistingWorkLookupResult> {
18
+ execute(input: FindExistingWorkToolInput, ctx: ToolContext): Promise<ExistingWorkLookupResult>;
19
+ }
20
+ /**
21
+ * Read-only triage helper: before delegating new work or accepting a signal,
22
+ * check whether an open pull request, a recorded Change, or an in-flight
23
+ * Task already covers the same repository, so Foreman does not duplicate
24
+ * work that is already underway.
25
+ */
26
+ declare function createFindExistingWorkTool(input: FindExistingWorkToolOptions): FindExistingWorkTool;
27
+ //#endregion
28
+ export { FindExistingWorkTool, FindExistingWorkToolInput, FindExistingWorkToolOptions, FindExistingWorkToolStores, createFindExistingWorkTool };
29
+ //# sourceMappingURL=eve-tool.d.mts.map
@@ -0,0 +1,32 @@
1
+ import { repositoryIdSchema } from "../schema/id.mjs";
2
+ import { repositoryIdsForSession } from "../eve/task-session.mjs";
3
+ import { findExistingWork } from "./find-existing-work.mjs";
4
+ import { z } from "zod";
5
+ import { defineTool } from "eve/tools";
6
+ //#region src/work-triage/eve-tool.ts
7
+ /**
8
+ * Read-only triage helper: before delegating new work or accepting a signal,
9
+ * check whether an open pull request, a recorded Change, or an in-flight
10
+ * Task already covers the same repository, so Foreman does not duplicate
11
+ * work that is already underway.
12
+ */
13
+ function createFindExistingWorkTool(input) {
14
+ const { stores, ...options } = input;
15
+ return defineTool({
16
+ description: "Check whether an open pull request, a recorded change, or an in-flight task already covers a repository's pending work. Call this before delegating new work or deciding a signal as accepted, so Factory does not duplicate work already underway. Read-only.",
17
+ inputSchema: z.object({ repositoryId: repositoryIdSchema.describe("Repository the pending signal or request is about.") }),
18
+ async execute({ repositoryId }, ctx) {
19
+ const binding = repositoryIdsForSession(ctx.session.auth.initiator);
20
+ if (binding !== null && !binding.includes(repositoryId)) throw new Error(`Repository ${repositoryId} is outside the connector-authenticated context.`);
21
+ return findExistingWork({
22
+ stores,
23
+ repositoryId,
24
+ ...options
25
+ });
26
+ }
27
+ });
28
+ }
29
+ //#endregion
30
+ export { createFindExistingWorkTool };
31
+
32
+ //# sourceMappingURL=eve-tool.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eve-tool.mjs","names":[],"sources":["../../src/work-triage/eve-tool.ts"],"sourcesContent":["import { defineTool, type ToolContext, type ToolDefinition } from \"eve/tools\";\nimport { z } from \"zod\";\nimport { repositoryIdSchema, type RepositoryId } from \"../schema/id\";\nimport type { FactoryStores } from \"../store/engine\";\nimport {\n findExistingWork,\n type ExistingWorkLookupOptions,\n type ExistingWorkLookupResult,\n} from \"./find-existing-work\";\nimport { repositoryIdsForSession } from \"../eve/task-session\";\n\n/** Change, repository, and Task capabilities required by the existing-work tool. */\nexport type FindExistingWorkToolStores = Pick<FactoryStores, \"changes\" | \"repositories\" | \"tasks\">;\n\n/** Stores and provider lookup used to construct the existing-work tool. */\nexport interface FindExistingWorkToolOptions extends ExistingWorkLookupOptions {\n stores: FindExistingWorkToolStores;\n}\n\n/** Repository selected for a read-only existing-work lookup. */\nexport interface FindExistingWorkToolInput {\n repositoryId: RepositoryId;\n}\n\n/** Eve tool that checks a repository for overlapping open work. */\nexport interface FindExistingWorkTool extends ToolDefinition<\n FindExistingWorkToolInput,\n ExistingWorkLookupResult\n> {\n execute(input: FindExistingWorkToolInput, ctx: ToolContext): Promise<ExistingWorkLookupResult>;\n}\n\n/**\n * Read-only triage helper: before delegating new work or accepting a signal,\n * check whether an open pull request, a recorded Change, or an in-flight\n * Task already covers the same repository, so Foreman does not duplicate\n * work that is already underway.\n */\nexport function createFindExistingWorkTool(\n input: FindExistingWorkToolOptions,\n): FindExistingWorkTool {\n const { stores, ...options } = input;\n return defineTool({\n description:\n \"Check whether an open pull request, a recorded change, or an in-flight task already \" +\n \"covers a repository's pending work. Call this before delegating new work or deciding a \" +\n \"signal as accepted, so Factory does not duplicate work already underway. Read-only.\",\n inputSchema: z.object({\n repositoryId: repositoryIdSchema.describe(\n \"Repository the pending signal or request is about.\",\n ),\n }),\n async execute({ repositoryId }, ctx): Promise<ExistingWorkLookupResult> {\n // The connector binding is an authorization envelope: a steered\n // conversation must not read another repository's in-flight work.\n const binding = repositoryIdsForSession(ctx.session.auth.initiator);\n if (binding !== null && !binding.includes(repositoryId)) {\n throw new Error(\n `Repository ${repositoryId} is outside the connector-authenticated context.`,\n );\n }\n return findExistingWork({ stores, repositoryId, ...options });\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;AAsCA,SAAgB,2BACd,OACsB;CACtB,MAAM,EAAE,QAAQ,GAAG,YAAY;CAC/B,OAAO,WAAW;EAChB,aACE;EAGF,aAAa,EAAE,OAAO,EACpB,cAAc,mBAAmB,SAC/B,oDACF,EACF,CAAC;EACD,MAAM,QAAQ,EAAE,gBAAgB,KAAwC;GAGtE,MAAM,UAAU,wBAAwB,IAAI,QAAQ,KAAK,SAAS;GAClE,IAAI,YAAY,QAAQ,CAAC,QAAQ,SAAS,YAAY,GACpD,MAAM,IAAI,MACR,cAAc,aAAa,iDAC7B;GAEF,OAAO,iBAAiB;IAAE;IAAQ;IAAc,GAAG;GAAQ,CAAC;EAC9D;CACF,CAAC;AACH"}