@vercel/factory 0.0.14 → 0.0.16

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 (510) hide show
  1. package/CHANGELOG.md +356 -0
  2. package/README.md +96 -2
  3. package/dist/agent-routes.d.mts +113 -0
  4. package/dist/agent-routes.mjs +91 -0
  5. package/dist/agent-routes.mjs.map +1 -0
  6. package/dist/api-contracts.d.mts +1768 -0
  7. package/dist/api-contracts.mjs +119 -0
  8. package/dist/api-contracts.mjs.map +1 -0
  9. package/dist/api-images.d.mts +30 -0
  10. package/dist/api-images.mjs +28 -0
  11. package/dist/api-images.mjs.map +1 -0
  12. package/dist/api-task-graph.mjs +57 -0
  13. package/dist/api-task-graph.mjs.map +1 -0
  14. package/dist/api.d.mts +111 -216
  15. package/dist/api.mjs +1063 -99
  16. package/dist/api.mjs.map +1 -1
  17. package/dist/approval-access.d.mts +39 -0
  18. package/dist/approval-access.mjs +62 -0
  19. package/dist/approval-access.mjs.map +1 -0
  20. package/dist/approval-contracts.d.mts +698 -0
  21. package/dist/approval-contracts.mjs +27 -0
  22. package/dist/approval-contracts.mjs.map +1 -0
  23. package/dist/approval.d.mts +49 -0
  24. package/dist/approval.mjs +39 -0
  25. package/dist/approval.mjs.map +1 -0
  26. package/dist/blob/artifacts.d.mts +37 -0
  27. package/dist/blob/artifacts.mjs +45 -0
  28. package/dist/blob/artifacts.mjs.map +1 -0
  29. package/dist/blob/index.d.mts +84 -12
  30. package/dist/blob/index.mjs +179 -45
  31. package/dist/blob/index.mjs.map +1 -1
  32. package/dist/budget.d.mts +115 -0
  33. package/dist/budget.mjs +147 -0
  34. package/dist/budget.mjs.map +1 -0
  35. package/dist/budgets.d.mts +4 -0
  36. package/dist/budgets.mjs +4 -0
  37. package/dist/build-factory.d.mts +7 -4
  38. package/dist/build-factory.mjs +2 -1
  39. package/dist/build-factory.mjs.map +1 -1
  40. package/dist/change-verification/brief.d.mts +9 -0
  41. package/dist/change-verification/brief.mjs +13 -0
  42. package/dist/change-verification/brief.mjs.map +1 -0
  43. package/dist/change-verification/dispatch.d.mts +37 -0
  44. package/dist/change-verification/dispatch.mjs +83 -0
  45. package/dist/change-verification/dispatch.mjs.map +1 -0
  46. package/dist/change-verification/eve-tool.d.mts +61 -0
  47. package/dist/change-verification/eve-tool.mjs +89 -0
  48. package/dist/change-verification/eve-tool.mjs.map +1 -0
  49. package/dist/change-verification/result.mjs +130 -0
  50. package/dist/change-verification/result.mjs.map +1 -0
  51. package/dist/changes/eve-record-change.d.mts +56 -0
  52. package/dist/changes/eve-record-change.mjs +131 -0
  53. package/dist/changes/eve-record-change.mjs.map +1 -0
  54. package/dist/changes/presentation.d.mts +14 -0
  55. package/dist/changes.d.mts +24 -0
  56. package/dist/changes.mjs +29 -0
  57. package/dist/changes.mjs.map +1 -0
  58. package/dist/client-events.d.mts +25 -0
  59. package/dist/client-events.mjs +45 -0
  60. package/dist/client-events.mjs.map +1 -0
  61. package/dist/client-stream.d.mts +28 -0
  62. package/dist/client-stream.mjs +210 -0
  63. package/dist/client-stream.mjs.map +1 -0
  64. package/dist/client-transcript.d.mts +41 -0
  65. package/dist/client-transcript.mjs +233 -0
  66. package/dist/client-transcript.mjs.map +1 -0
  67. package/dist/client.d.mts +343 -0
  68. package/dist/client.mjs +366 -0
  69. package/dist/client.mjs.map +1 -0
  70. package/dist/code-review/contracts.d.mts +27 -0
  71. package/dist/code-review/eve-post-review.d.mts +70 -0
  72. package/dist/code-review/eve-post-review.mjs +195 -0
  73. package/dist/code-review/eve-post-review.mjs.map +1 -0
  74. package/dist/code-review/eve-review-comments.d.mts +75 -0
  75. package/dist/code-review/eve-review-comments.mjs +193 -0
  76. package/dist/code-review/eve-review-comments.mjs.map +1 -0
  77. package/dist/code-review/github-contracts.d.mts +10 -0
  78. package/dist/code-review/github-reporter.d.mts +46 -0
  79. package/dist/code-review/github-reporter.mjs +262 -0
  80. package/dist/code-review/github-reporter.mjs.map +1 -0
  81. package/dist/code-review/preparation.d.mts +34 -0
  82. package/dist/code-review/preparation.mjs +23 -0
  83. package/dist/code-review/preparation.mjs.map +1 -0
  84. package/dist/code-review/stall.d.mts +17 -0
  85. package/dist/code-review/stall.mjs +30 -0
  86. package/dist/code-review/stall.mjs.map +1 -0
  87. package/dist/code-review.d.mts +7 -0
  88. package/dist/code-review.mjs +5 -0
  89. package/dist/communication.d.mts +9 -0
  90. package/dist/communication.mjs +9 -0
  91. package/dist/connectors/github.d.mts +26 -0
  92. package/dist/connectors/github.mjs +55 -0
  93. package/dist/connectors/github.mjs.map +1 -0
  94. package/dist/connectors/index.d.mts +35 -3
  95. package/dist/connectors/index.mjs +3 -52
  96. package/dist/connectors/index.mjs.map +1 -1
  97. package/dist/connectors/outbox.d.mts +34 -0
  98. package/dist/connectors/outbox.mjs +50 -0
  99. package/dist/connectors/outbox.mjs.map +1 -0
  100. package/dist/connectors/slack-approval-blocks.mjs +136 -0
  101. package/dist/connectors/slack-approval-blocks.mjs.map +1 -0
  102. package/dist/connectors/slack-approvals.d.mts +29 -0
  103. package/dist/connectors/slack-approvals.mjs +346 -0
  104. package/dist/connectors/slack-approvals.mjs.map +1 -0
  105. package/dist/connectors/slack.d.mts +35 -52
  106. package/dist/connectors/slack.mjs +13 -85
  107. package/dist/connectors/slack.mjs.map +1 -1
  108. package/dist/deepsec/eve-tool.d.mts +110 -0
  109. package/dist/deepsec/eve-tool.mjs +166 -0
  110. package/dist/deepsec/eve-tool.mjs.map +1 -0
  111. package/dist/deepsec/finding.d.mts +84 -0
  112. package/dist/deepsec/finding.mjs +56 -0
  113. package/dist/deepsec/finding.mjs.map +1 -0
  114. package/dist/deepsec.d.mts +3 -0
  115. package/dist/delivery-metrics/metrics.d.mts +93 -0
  116. package/dist/delivery-metrics/metrics.mjs +200 -0
  117. package/dist/delivery-metrics/metrics.mjs.map +1 -0
  118. package/dist/delivery-metrics.d.mts +2 -0
  119. package/dist/delivery-metrics.mjs +2 -0
  120. package/dist/dispatch.d.mts +152 -0
  121. package/dist/dispatch.mjs +199 -0
  122. package/dist/dispatch.mjs.map +1 -0
  123. package/dist/errors.d.mts +15 -0
  124. package/dist/errors.mjs +38 -0
  125. package/dist/errors.mjs.map +1 -0
  126. package/dist/eve/index.d.mts +209 -1277
  127. package/dist/eve/index.mjs +312 -1073
  128. package/dist/eve/index.mjs.map +1 -1
  129. package/dist/eve/invoke.d.mts +144 -0
  130. package/dist/eve/invoke.mjs +254 -0
  131. package/dist/eve/invoke.mjs.map +1 -0
  132. package/dist/eve/session-client.d.mts +186 -0
  133. package/dist/eve/session-client.mjs +245 -0
  134. package/dist/eve/session-client.mjs.map +1 -0
  135. package/dist/eve/task-execution.d.mts +380 -0
  136. package/dist/eve/task-execution.mjs +73 -0
  137. package/dist/eve/task-execution.mjs.map +1 -0
  138. package/dist/eve/task-session.d.mts +129 -0
  139. package/dist/eve/task-session.mjs +245 -0
  140. package/dist/eve/task-session.mjs.map +1 -0
  141. package/dist/eve/transcript.d.mts +37 -0
  142. package/dist/eve/transcript.mjs +69 -0
  143. package/dist/eve/transcript.mjs.map +1 -0
  144. package/dist/execution-public.d.mts +8 -0
  145. package/dist/execution-public.mjs +7 -0
  146. package/dist/execution.d.mts +183 -0
  147. package/dist/execution.mjs +223 -0
  148. package/dist/execution.mjs.map +1 -0
  149. package/dist/finding-remediation/admission.d.mts +53 -0
  150. package/dist/finding-remediation/admission.mjs +90 -0
  151. package/dist/finding-remediation/admission.mjs.map +1 -0
  152. package/dist/finding-remediation/brief.d.mts +14 -0
  153. package/dist/finding-remediation/brief.mjs +25 -0
  154. package/dist/finding-remediation/brief.mjs.map +1 -0
  155. package/dist/finding-remediation/eve-tool.d.mts +29 -0
  156. package/dist/finding-remediation/eve-tool.mjs +34 -0
  157. package/dist/finding-remediation/eve-tool.mjs.map +1 -0
  158. package/dist/findings/fingerprint.d.mts +14 -0
  159. package/dist/findings/fingerprint.mjs +28 -0
  160. package/dist/findings/fingerprint.mjs.map +1 -0
  161. package/dist/findings.d.mts +7 -0
  162. package/dist/findings.mjs +6 -0
  163. package/dist/github-app.d.mts +54 -0
  164. package/dist/github-app.mjs +121 -0
  165. package/dist/github-app.mjs.map +1 -0
  166. package/dist/github-publication.d.mts +199 -0
  167. package/dist/github-publication.mjs +442 -0
  168. package/dist/github-publication.mjs.map +1 -0
  169. package/dist/github-transfer.d.mts +81 -0
  170. package/dist/github-transfer.mjs +273 -0
  171. package/dist/github-transfer.mjs.map +1 -0
  172. package/dist/github.d.mts +446 -2
  173. package/dist/github.mjs +357 -56
  174. package/dist/github.mjs.map +1 -1
  175. package/dist/image-input.d.mts +51 -0
  176. package/dist/image-input.mjs +63 -0
  177. package/dist/image-input.mjs.map +1 -0
  178. package/dist/inbox-activity.d.mts +53 -0
  179. package/dist/inbox-activity.mjs +41 -0
  180. package/dist/inbox-activity.mjs.map +1 -0
  181. package/dist/index.d.mts +16 -484
  182. package/dist/index.mjs +15 -522
  183. package/dist/intake-contracts.d.mts +55 -0
  184. package/dist/intake-contracts.mjs +33 -0
  185. package/dist/intake-contracts.mjs.map +1 -0
  186. package/dist/integrations/deepsec.d.mts +5 -0
  187. package/dist/integrations/deepsec.mjs +3 -0
  188. package/dist/integrations/github.d.mts +11 -0
  189. package/dist/integrations/github.mjs +9 -0
  190. package/dist/integrations/slack.d.mts +5 -0
  191. package/dist/integrations/slack.mjs +5 -0
  192. package/dist/integrations/vercel.d.mts +5 -0
  193. package/dist/integrations/vercel.mjs +4 -0
  194. package/dist/merge-resolution/contracts.d.mts +17 -0
  195. package/dist/merge-resolution/contracts.mjs +19 -0
  196. package/dist/merge-resolution/contracts.mjs.map +1 -0
  197. package/dist/merge-resolution/eve-tools.d.mts +47 -0
  198. package/dist/merge-resolution/eve-tools.mjs +122 -0
  199. package/dist/merge-resolution/eve-tools.mjs.map +1 -0
  200. package/dist/model-settings.d.mts +41 -0
  201. package/dist/model-settings.mjs +35 -0
  202. package/dist/model-settings.mjs.map +1 -0
  203. package/dist/multi-repository-changes/coordination.d.mts +49 -0
  204. package/dist/multi-repository-changes/coordination.mjs +115 -0
  205. package/dist/multi-repository-changes/coordination.mjs.map +1 -0
  206. package/dist/planning/cancellation.mjs +82 -0
  207. package/dist/planning/cancellation.mjs.map +1 -0
  208. package/dist/planning/configuration.d.mts +23 -0
  209. package/dist/planning/configuration.mjs +56 -0
  210. package/dist/planning/configuration.mjs.map +1 -0
  211. package/dist/planning/contracts.d.mts +136 -0
  212. package/dist/planning/contracts.mjs +42 -0
  213. package/dist/planning/contracts.mjs.map +1 -0
  214. package/dist/planning/dependencies.mjs +44 -0
  215. package/dist/planning/dependencies.mjs.map +1 -0
  216. package/dist/planning/effects.mjs +122 -0
  217. package/dist/planning/effects.mjs.map +1 -0
  218. package/dist/planning/reconcile.mjs +279 -0
  219. package/dist/planning/reconcile.mjs.map +1 -0
  220. package/dist/planning/runtime.d.mts +27 -0
  221. package/dist/planning/runtime.mjs +25 -0
  222. package/dist/planning/runtime.mjs.map +1 -0
  223. package/dist/planning/state.mjs +92 -0
  224. package/dist/planning/state.mjs.map +1 -0
  225. package/dist/planning/turns.mjs +262 -0
  226. package/dist/planning/turns.mjs.map +1 -0
  227. package/dist/planning/validation.mjs +106 -0
  228. package/dist/planning/validation.mjs.map +1 -0
  229. package/dist/postgres/index.d.mts +48 -1
  230. package/dist/postgres/index.mjs +45 -3
  231. package/dist/postgres/index.mjs.map +1 -1
  232. package/dist/presets/software-development/approval.d.mts +14 -0
  233. package/dist/presets/software-development/approval.mjs +21 -0
  234. package/dist/presets/software-development/approval.mjs.map +1 -0
  235. package/dist/presets/software-development/deepsec-brief.d.mts +8 -0
  236. package/dist/presets/software-development/deepsec-brief.mjs +14 -0
  237. package/dist/presets/software-development/deepsec-brief.mjs.map +1 -0
  238. package/dist/presets/software-development/dispatch.d.mts +56 -0
  239. package/dist/presets/software-development/dispatch.mjs +67 -0
  240. package/dist/presets/software-development/dispatch.mjs.map +1 -0
  241. package/dist/presets/software-development/eve-delegation-policy.d.mts +7 -0
  242. package/dist/presets/software-development/eve-delegation-policy.mjs +34 -0
  243. package/dist/presets/software-development/eve-delegation-policy.mjs.map +1 -0
  244. package/dist/presets/software-development/eve.d.mts +18 -0
  245. package/dist/presets/software-development/eve.mjs +19 -0
  246. package/dist/presets/software-development/eve.mjs.map +1 -0
  247. package/dist/presets/software-development/finish-task-policy.d.mts +7 -0
  248. package/dist/presets/software-development/finish-task-policy.mjs +9 -0
  249. package/dist/presets/software-development/finish-task-policy.mjs.map +1 -0
  250. package/dist/presets/software-development/recovery.d.mts +32 -0
  251. package/dist/presets/software-development/recovery.mjs +120 -0
  252. package/dist/presets/software-development/recovery.mjs.map +1 -0
  253. package/dist/presets/software-development/task-communication.d.mts +24 -0
  254. package/dist/presets/software-development/task-communication.mjs +157 -0
  255. package/dist/presets/software-development/task-communication.mjs.map +1 -0
  256. package/dist/presets/software-development.d.mts +10 -0
  257. package/dist/presets/software-development.mjs +9 -0
  258. package/dist/pull-requests/contracts.d.mts +72 -0
  259. package/dist/pull-requests/eve-fetch.d.mts +57 -0
  260. package/dist/pull-requests/eve-fetch.mjs +151 -0
  261. package/dist/pull-requests/eve-fetch.mjs.map +1 -0
  262. package/dist/pull-requests/github-label-manager.d.mts +27 -0
  263. package/dist/pull-requests/github-label-manager.mjs +40 -0
  264. package/dist/pull-requests/github-label-manager.mjs.map +1 -0
  265. package/dist/pull-requests/github-publisher.d.mts +67 -0
  266. package/dist/pull-requests/github-publisher.mjs +405 -0
  267. package/dist/pull-requests/github-publisher.mjs.map +1 -0
  268. package/dist/pull-requests.d.mts +6 -0
  269. package/dist/pull-requests.mjs +4 -0
  270. package/dist/receipts.d.mts +4 -0
  271. package/dist/receipts.mjs +3 -0
  272. package/dist/repositories.d.mts +18 -0
  273. package/dist/repositories.mjs +33 -0
  274. package/dist/repositories.mjs.map +1 -0
  275. package/dist/sandbox/command.d.mts +18 -0
  276. package/dist/sandbox/execution-abort.d.mts +16 -0
  277. package/dist/sandbox/execution-abort.mjs +49 -0
  278. package/dist/sandbox/execution-abort.mjs.map +1 -0
  279. package/dist/sandbox/execution-environment.d.mts +25 -0
  280. package/dist/sandbox/execution-run-ledger.d.mts +115 -0
  281. package/dist/sandbox/execution-run-ledger.mjs +209 -0
  282. package/dist/sandbox/execution-run-ledger.mjs.map +1 -0
  283. package/dist/sandbox/execution.d.mts +54 -0
  284. package/dist/sandbox/execution.mjs +228 -0
  285. package/dist/sandbox/execution.mjs.map +1 -0
  286. package/dist/sandbox/harness-runner.d.mts +79 -0
  287. package/dist/sandbox/harness-runner.mjs +162 -0
  288. package/dist/sandbox/harness-runner.mjs.map +1 -0
  289. package/dist/sandbox/index.d.mts +10 -0
  290. package/dist/sandbox/index.mjs +7 -0
  291. package/dist/sandbox/task-environment.d.mts +50 -0
  292. package/dist/sandbox/task-environment.mjs +140 -0
  293. package/dist/sandbox/task-environment.mjs.map +1 -0
  294. package/dist/sandbox/workspace.d.mts +29 -0
  295. package/dist/sandbox/workspace.mjs +28 -0
  296. package/dist/sandbox/workspace.mjs.map +1 -0
  297. package/dist/schema/agent-route.d.mts +40 -0
  298. package/dist/schema/agent-route.mjs +33 -0
  299. package/dist/schema/agent-route.mjs.map +1 -0
  300. package/dist/schema/answer.d.mts +23 -0
  301. package/dist/schema/answer.mjs +21 -0
  302. package/dist/schema/answer.mjs.map +1 -0
  303. package/dist/schema/budget.d.mts +38 -0
  304. package/dist/schema/budget.mjs +30 -0
  305. package/dist/schema/budget.mjs.map +1 -0
  306. package/dist/schema/catalog.mjs +72 -0
  307. package/dist/schema/catalog.mjs.map +1 -0
  308. package/dist/schema/change.d.mts +117 -0
  309. package/dist/schema/change.mjs +68 -0
  310. package/dist/schema/change.mjs.map +1 -0
  311. package/dist/schema/common.d.mts +33 -0
  312. package/dist/{id-BLIkCVue.mjs → schema/common.mjs} +7 -16
  313. package/dist/schema/common.mjs.map +1 -0
  314. package/dist/schema/communication.d.mts +52 -0
  315. package/dist/{communication-Kd9nU5RP.mjs → schema/communication.mjs} +8 -3
  316. package/dist/schema/communication.mjs.map +1 -0
  317. package/dist/schema/execution.d.mts +101 -0
  318. package/dist/schema/execution.mjs +86 -0
  319. package/dist/schema/execution.mjs.map +1 -0
  320. package/dist/schema/factory-config.d.mts +122 -0
  321. package/dist/schema/factory-config.mjs +90 -0
  322. package/dist/schema/factory-config.mjs.map +1 -0
  323. package/dist/schema/finding.d.mts +125 -0
  324. package/dist/schema/finding.mjs +67 -0
  325. package/dist/schema/finding.mjs.map +1 -0
  326. package/dist/schema/id.d.mts +43 -0
  327. package/dist/schema/id.mjs +32 -0
  328. package/dist/schema/id.mjs.map +1 -0
  329. package/dist/schema/outbox.d.mts +240 -0
  330. package/dist/schema/outbox.mjs +53 -0
  331. package/dist/schema/outbox.mjs.map +1 -0
  332. package/dist/schema/question-route.mjs +16 -0
  333. package/dist/schema/question-route.mjs.map +1 -0
  334. package/dist/schema/receipt.d.mts +81 -0
  335. package/dist/schema/receipt.mjs +94 -0
  336. package/dist/schema/receipt.mjs.map +1 -0
  337. package/dist/schema/repository.d.mts +30 -0
  338. package/dist/schema/repository.mjs +29 -0
  339. package/dist/schema/repository.mjs.map +1 -0
  340. package/dist/schema/session.d.mts +136 -0
  341. package/dist/schema/session.mjs +54 -0
  342. package/dist/schema/session.mjs.map +1 -0
  343. package/dist/schema/signal.d.mts +105 -0
  344. package/dist/schema/signal.mjs +81 -0
  345. package/dist/schema/signal.mjs.map +1 -0
  346. package/dist/schema/slack-pr-notifications.d.mts +12 -0
  347. package/dist/schema/slack-pr-notifications.mjs +11 -0
  348. package/dist/schema/slack-pr-notifications.mjs.map +1 -0
  349. package/dist/schema/stored-session.mjs +10 -0
  350. package/dist/schema/stored-session.mjs.map +1 -0
  351. package/dist/schema/stored-task.mjs +20 -0
  352. package/dist/schema/stored-task.mjs.map +1 -0
  353. package/dist/schema/task-effect.d.mts +39 -0
  354. package/dist/schema/task-effect.mjs +29 -0
  355. package/dist/schema/task-effect.mjs.map +1 -0
  356. package/dist/schema/task-graph.d.mts +3173 -0
  357. package/dist/schema/task-graph.mjs +97 -0
  358. package/dist/schema/task-graph.mjs.map +1 -0
  359. package/dist/schema/task-message.d.mts +254 -0
  360. package/dist/schema/task-message.mjs +189 -0
  361. package/dist/schema/task-message.mjs.map +1 -0
  362. package/dist/schema/task.d.mts +273 -0
  363. package/dist/schema/task.mjs +200 -0
  364. package/dist/schema/task.mjs.map +1 -0
  365. package/dist/schema/transcript.d.mts +176 -0
  366. package/dist/schema/transcript.mjs +87 -0
  367. package/dist/schema/transcript.mjs.map +1 -0
  368. package/dist/schema/transitions.d.mts +50 -0
  369. package/dist/schema/transitions.mjs +303 -0
  370. package/dist/schema/transitions.mjs.map +1 -0
  371. package/dist/schema/work.d.mts +150 -0
  372. package/dist/schema/work.mjs +102 -0
  373. package/dist/schema/work.mjs.map +1 -0
  374. package/dist/session-previews.d.mts +76 -0
  375. package/dist/session-previews.mjs +55 -0
  376. package/dist/session-previews.mjs.map +1 -0
  377. package/dist/session-review.d.mts +120 -0
  378. package/dist/session-review.mjs +79 -0
  379. package/dist/session-review.mjs.map +1 -0
  380. package/dist/signal-triage.d.mts +20 -0
  381. package/dist/signal-triage.mjs +85 -0
  382. package/dist/signal-triage.mjs.map +1 -0
  383. package/dist/signals.d.mts +20 -0
  384. package/dist/signals.mjs +19 -0
  385. package/dist/signals.mjs.map +1 -0
  386. package/dist/stall.d.mts +41 -0
  387. package/dist/stall.mjs +83 -0
  388. package/dist/stall.mjs.map +1 -0
  389. package/dist/storage.d.mts +4 -0
  390. package/dist/storage.mjs +4 -0
  391. package/dist/store/driver.d.mts +65 -0
  392. package/dist/store/driver.mjs +42 -0
  393. package/dist/store/driver.mjs.map +1 -0
  394. package/dist/store/engine.d.mts +683 -0
  395. package/dist/store/engine.mjs +2309 -0
  396. package/dist/store/engine.mjs.map +1 -0
  397. package/dist/store/memory.d.mts +24 -0
  398. package/dist/store/memory.mjs +69 -0
  399. package/dist/store/memory.mjs.map +1 -0
  400. package/dist/store/slack-pr-notifications.d.mts +44 -0
  401. package/dist/store/slack-pr-notifications.mjs +121 -0
  402. package/dist/store/slack-pr-notifications.mjs.map +1 -0
  403. package/dist/store/task-effects.d.mts +38 -0
  404. package/dist/store/task-effects.mjs +118 -0
  405. package/dist/store/task-effects.mjs.map +1 -0
  406. package/dist/store/task-graphs.d.mts +60 -0
  407. package/dist/store/task-graphs.mjs +212 -0
  408. package/dist/store/task-graphs.mjs.map +1 -0
  409. package/dist/store/task-messages.d.mts +136 -0
  410. package/dist/store/task-messages.mjs +475 -0
  411. package/dist/store/task-messages.mjs.map +1 -0
  412. package/dist/store/task-work.d.mts +180 -0
  413. package/dist/store/task-work.mjs +137 -0
  414. package/dist/store/task-work.mjs.map +1 -0
  415. package/dist/store/work-notifications.d.mts +19 -0
  416. package/dist/store/work-notifications.mjs +48 -0
  417. package/dist/store/work-notifications.mjs.map +1 -0
  418. package/dist/sweep.d.mts +79 -0
  419. package/dist/sweep.mjs +171 -0
  420. package/dist/sweep.mjs.map +1 -0
  421. package/dist/task-communication.d.mts +35 -0
  422. package/dist/task-communication.mjs +47 -0
  423. package/dist/task-communication.mjs.map +1 -0
  424. package/dist/task-graph-view.d.mts +267 -0
  425. package/dist/task-graph-view.mjs +17 -0
  426. package/dist/task-graph-view.mjs.map +1 -0
  427. package/dist/task-message-processing.d.mts +60 -0
  428. package/dist/task-message-processing.mjs +200 -0
  429. package/dist/task-message-processing.mjs.map +1 -0
  430. package/dist/task-protocols.d.mts +80 -0
  431. package/dist/task-protocols.mjs +47 -0
  432. package/dist/task-protocols.mjs.map +1 -0
  433. package/dist/tasks.d.mts +17 -0
  434. package/dist/tasks.mjs +17 -0
  435. package/dist/vercel-git.d.mts +53 -0
  436. package/dist/vercel-git.mjs +344 -0
  437. package/dist/vercel-git.mjs.map +1 -0
  438. package/dist/vercel-github-api.d.mts +103 -0
  439. package/dist/vercel-github-api.mjs +363 -0
  440. package/dist/vercel-github-api.mjs.map +1 -0
  441. package/dist/vercel.d.mts +34 -2
  442. package/dist/vercel.mjs +49 -3
  443. package/dist/vercel.mjs.map +1 -1
  444. package/dist/work-triage/eve-tool.d.mts +29 -0
  445. package/dist/work-triage/eve-tool.mjs +32 -0
  446. package/dist/work-triage/eve-tool.mjs.map +1 -0
  447. package/dist/work-triage/find-existing-work.d.mts +32 -0
  448. package/dist/work-triage/find-existing-work.mjs +31 -0
  449. package/dist/work-triage/find-existing-work.mjs.map +1 -0
  450. package/dist/work-triage/github.d.mts +15 -0
  451. package/dist/work-triage/github.mjs +14 -0
  452. package/dist/work-triage/github.mjs.map +1 -0
  453. package/dist/work-triage.d.mts +4 -0
  454. package/dist/work-triage.mjs +3 -0
  455. package/dist/workflows.d.mts +146 -0
  456. package/dist/workflows.mjs +139 -0
  457. package/dist/workflows.mjs.map +1 -0
  458. package/dist/workspace-diff-assembly.d.mts +33 -0
  459. package/dist/workspace-diff-assembly.mjs +95 -0
  460. package/dist/workspace-diff-assembly.mjs.map +1 -0
  461. package/dist/workspace-diff.d.mts +90 -0
  462. package/dist/workspace-diff.mjs +61 -0
  463. package/dist/workspace-diff.mjs.map +1 -0
  464. package/dist/workspace-files-git.d.mts +15 -0
  465. package/dist/workspace-files-git.mjs +61 -0
  466. package/dist/workspace-files-git.mjs.map +1 -0
  467. package/dist/workspace-files.d.mts +107 -0
  468. package/dist/workspace-files.mjs +74 -0
  469. package/dist/workspace-files.mjs.map +1 -0
  470. package/dist/workspace-snapshot.d.mts +26 -0
  471. package/dist/workspace-snapshot.mjs +80 -0
  472. package/dist/workspace-snapshot.mjs.map +1 -0
  473. package/docs/getting-started.md +104 -0
  474. package/docs/index.md +100 -0
  475. package/docs/recipes/cancellation.md +215 -0
  476. package/docs/recipes/custom-workflow.md +153 -0
  477. package/docs/recipes/dependent-tasks.md +207 -0
  478. package/docs/recipes/eve-agent.md +277 -0
  479. package/docs/recipes/human-input.md +204 -0
  480. package/docs/recipes/persistence-recovery.md +268 -0
  481. package/docs/recipes/retry-recovery.md +241 -0
  482. package/docs/recipes/task-messaging.md +215 -0
  483. package/docs/recipes/typed-eve-result.md +161 -0
  484. package/docs/runtime-integration.md +137 -0
  485. package/package.json +142 -46
  486. package/dist/approval-JX2Px9IC.mjs +0 -132
  487. package/dist/approval-JX2Px9IC.mjs.map +0 -1
  488. package/dist/budget-DzSiIA4t.mjs +0 -42
  489. package/dist/budget-DzSiIA4t.mjs.map +0 -1
  490. package/dist/change-D2U6v7Ek.mjs +0 -554
  491. package/dist/change-D2U6v7Ek.mjs.map +0 -1
  492. package/dist/communication-Kd9nU5RP.mjs.map +0 -1
  493. package/dist/coordination-Cq08hb1l.mjs +0 -76
  494. package/dist/coordination-Cq08hb1l.mjs.map +0 -1
  495. package/dist/dispatch-BaZS3PT8.d.mts +0 -76
  496. package/dist/driver-BC0Mt5KG.d.mts +0 -34
  497. package/dist/driver-Bbd25rNM.mjs +0 -23
  498. package/dist/driver-Bbd25rNM.mjs.map +0 -1
  499. package/dist/engine-DFHU2Pe-.d.mts +0 -781
  500. package/dist/engine-WaUM2cGA.mjs +0 -1068
  501. package/dist/engine-WaUM2cGA.mjs.map +0 -1
  502. package/dist/factory-config-BoRXOw43.mjs +0 -50
  503. package/dist/factory-config-BoRXOw43.mjs.map +0 -1
  504. package/dist/factory-config-D2yU3G0c.d.mts +0 -58
  505. package/dist/github-C5HNBN6p.d.mts +0 -279
  506. package/dist/id-BLIkCVue.mjs.map +0 -1
  507. package/dist/index-Bw6hggoH.d.mts +0 -40
  508. package/dist/index.mjs.map +0 -1
  509. package/dist/task-CcOyOJ3k.mjs +0 -154
  510. package/dist/task-CcOyOJ3k.mjs.map +0 -1
@@ -0,0 +1,56 @@
1
+ import { Task } from "../schema/task.mjs";
2
+ import { Change } from "../schema/change.mjs";
3
+ import { FactoryStores } from "../store/engine.mjs";
4
+ import { ChangePresenter } from "./presentation.mjs";
5
+ import { PullRequestPublicationGateResult } from "../pull-requests/contracts.mjs";
6
+ import { z } from "zod";
7
+ import { ToolContext, ToolDefinition } from "eve/tools";
8
+ //#region src/changes/eve-record-change.d.ts
9
+ /** Change and Task capabilities required by the record-change tool. */
10
+ type RecordChangeToolStores = Pick<FactoryStores, "changes" | "tasks">;
11
+ declare const recordChangeInputSchema: z.ZodObject<{
12
+ taskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
13
+ repositoryId: z.ZodType<`repo_${string}`, string, z.core.$ZodTypeInternals<`repo_${string}`, string>>;
14
+ prNumber: z.ZodNumber;
15
+ prUrl: z.ZodURL;
16
+ risk: z.ZodEnum<{
17
+ low: "low";
18
+ medium: "medium";
19
+ high: "high";
20
+ }>;
21
+ confidence: z.ZodEnum<{
22
+ low: "low";
23
+ medium: "medium";
24
+ high: "high";
25
+ }>;
26
+ summary: z.ZodString;
27
+ }, z.core.$strip>;
28
+ /** Validated input accepted by the tool that links a pull request to its producing Task. */
29
+ type RecordChangeInput = z.infer<typeof recordChangeInputSchema>;
30
+ /** Configures policy gates and durable presentation for the software record-change tool. */
31
+ interface RecordChangeToolOptions {
32
+ /**
33
+ * PR association gate, run as an Eve approval policy and again after
34
+ * authentication before recording. Refusals include the gate's reason.
35
+ * Gates must fail closed: when they cannot verify, they refuse.
36
+ */
37
+ recordChangeGate?: (input: RecordChangeInput) => Promise<PullRequestPublicationGateResult>;
38
+ /** Whether recorded code changes wait for an independent verification task. Default: required. */
39
+ verification?: "required" | "disabled";
40
+ /** Present the pull request after record_change persists its durable state. */
41
+ presentChange?: ChangePresenter;
42
+ }
43
+ /** Change and producing Task returned after a pull request is recorded. */
44
+ interface RecordChangeResult {
45
+ readonly change: Change;
46
+ readonly task: Task;
47
+ }
48
+ /** Eve outcome tool that links a pull request to its producing Task. */
49
+ interface RecordChangeTool extends ToolDefinition<RecordChangeInput, RecordChangeResult> {
50
+ execute(input: RecordChangeInput, ctx: ToolContext): Promise<RecordChangeResult>;
51
+ }
52
+ /** Create the supplied software workflow's pull-request outcome tool. */
53
+ declare function createRecordChangeTool(stores: RecordChangeToolStores, options?: RecordChangeToolOptions): RecordChangeTool;
54
+ //#endregion
55
+ export { RecordChangeInput, RecordChangeResult, RecordChangeTool, RecordChangeToolOptions, RecordChangeToolStores, createRecordChangeTool };
56
+ //# sourceMappingURL=eve-record-change.d.mts.map
@@ -0,0 +1,131 @@
1
+ import { repositoryIdSchema, taskIdSchema } from "../schema/id.mjs";
2
+ import { requireTaskExecution, requireTaskExecutionIdentity } from "../eve/task-execution.mjs";
3
+ import { changeLevelSchema } from "../schema/change.mjs";
4
+ import { z } from "zod";
5
+ import { defineTool } from "eve/tools";
6
+ //#region src/changes/eve-record-change.ts
7
+ const recordChangeInputSchema = z.object({
8
+ taskId: taskIdSchema,
9
+ repositoryId: repositoryIdSchema,
10
+ prNumber: z.number().int().min(1),
11
+ prUrl: z.url(),
12
+ risk: changeLevelSchema.describe("Blast radius of the change if it is wrong."),
13
+ confidence: changeLevelSchema.describe("How certain you are the change is correct."),
14
+ summary: z.string().min(1).describe("One-sentence description of the change.")
15
+ });
16
+ /** Create the supplied software workflow's pull-request outcome tool. */
17
+ function createRecordChangeTool(stores, options = {}) {
18
+ const recordChangeGate = options.recordChangeGate;
19
+ const verification = options.verification ?? "required";
20
+ return defineTool({
21
+ description: verification === "required" ? "Record the pull request produced for a code_change task. Creates the change, links it to the task, and moves the task to verifying." : "Record the pull request produced for a code_change task. Creates the change and marks it ready for human review without independent verification.",
22
+ inputSchema: recordChangeInputSchema,
23
+ ...recordChangeGate === void 0 ? {} : { approval: async ({ toolInput }) => {
24
+ const parsed = recordChangeInputSchema.safeParse(toolInput);
25
+ if (!parsed.success) return {
26
+ type: "denied",
27
+ reason: "record_change input is malformed; fix the arguments and retry"
28
+ };
29
+ const verdict = await recordChangeGate(parsed.data);
30
+ return verdict.ok ? "not-applicable" : {
31
+ type: "denied",
32
+ reason: verdict.reason
33
+ };
34
+ } },
35
+ async execute({ taskId, repositoryId, prNumber, prUrl, risk, confidence, summary }, ctx) {
36
+ const currentTask = await requireTaskExecutionIdentity(stores, ctx, taskId);
37
+ if (currentTask.state !== "running" && currentTask.state !== "verifying" && currentTask.state !== "succeeded") throw new Error(`task ${taskId} is ${currentTask.state}, not running`);
38
+ if (currentTask.repositoryIds.length !== 1 || currentTask.repositoryIds[0] !== repositoryId) throw new Error("Repository does not match the authenticated Task");
39
+ if (currentTask.state !== "running" && currentTask.changeId === void 0) throw new Error(`task ${taskId} has no recorded change`);
40
+ const linkedChange = currentTask.changeId === void 0 ? void 0 : await stores.changes.get(currentTask.changeId);
41
+ if (currentTask.changeId !== void 0 && linkedChange === null) throw new Error(`change ${currentTask.changeId} does not exist`);
42
+ let change = linkedChange ?? (await stores.changes.list()).find((candidate) => candidate.taskId === taskId);
43
+ if (change !== void 0 && (change.repositoryId !== repositoryId || change.prNumber !== prNumber || change.prUrl !== prUrl)) throw new Error("Pull request does not match the Task's recorded Change");
44
+ if (currentTask.state === "running") {
45
+ await requireTaskExecution(stores, ctx, taskId);
46
+ if (recordChangeGate !== void 0) {
47
+ const verdict = await recordChangeGate({
48
+ taskId,
49
+ repositoryId,
50
+ prNumber,
51
+ prUrl,
52
+ risk,
53
+ confidence,
54
+ summary
55
+ });
56
+ if (!verdict.ok) throw new Error(verdict.reason);
57
+ }
58
+ await requireTaskExecution(stores, ctx, taskId);
59
+ }
60
+ if (change === void 0) {
61
+ if (currentTask.state !== "running") throw new Error(`task ${taskId} has no recorded change`);
62
+ change = await stores.changes.create({
63
+ repositoryId,
64
+ taskId,
65
+ prNumber,
66
+ prUrl,
67
+ author: "factory",
68
+ risk,
69
+ confidence,
70
+ evidence: {
71
+ reproVerified: false,
72
+ testsAdded: 0,
73
+ checksGreen: false,
74
+ attackPassed: false,
75
+ scopeMatches: false
76
+ }
77
+ });
78
+ }
79
+ if (change === void 0) throw new Error(`task ${taskId} has no recorded change`);
80
+ let recordedChange = change;
81
+ if (currentTask.state === "succeeded") return {
82
+ change: recordedChange,
83
+ task: currentTask
84
+ };
85
+ if (currentTask.state === "running") {
86
+ await requireTaskExecution(stores, ctx, taskId);
87
+ await options.presentChange?.({
88
+ taskId,
89
+ changeId: recordedChange.id,
90
+ verification,
91
+ summary
92
+ });
93
+ }
94
+ let task = currentTask;
95
+ if (task.state === "running") task = await stores.tasks.transition(taskId, "verifying", {
96
+ expectFrom: "running",
97
+ expectAttempt: currentTask.attempt,
98
+ expectExecution: currentTask.execution,
99
+ patch: { changeId: recordedChange.id },
100
+ reason: summary
101
+ });
102
+ if (verification === "required") return {
103
+ change: recordedChange,
104
+ task
105
+ };
106
+ const completion = await requireTaskExecutionIdentity(stores, ctx, taskId);
107
+ if (completion.state !== "verifying" || completion.changeId !== recordedChange.id) throw new Error("Task is no longer awaiting this Change's completion");
108
+ if (recordedChange.state === "verifying") recordedChange = await stores.changes.transition(recordedChange.id, "ready", { reason: "independent verification is not configured" });
109
+ if (task.state === "verifying") task = await stores.tasks.transition(taskId, "succeeded", {
110
+ expectFrom: "verifying",
111
+ expectAttempt: currentTask.attempt,
112
+ expectExecution: currentTask.execution,
113
+ reason: "change recorded for human review without independent verification",
114
+ output: {
115
+ changeId: recordedChange.id,
116
+ prUrl: recordedChange.prUrl,
117
+ summary,
118
+ verification
119
+ }
120
+ });
121
+ return {
122
+ change: recordedChange,
123
+ task
124
+ };
125
+ }
126
+ });
127
+ }
128
+ //#endregion
129
+ export { createRecordChangeTool };
130
+
131
+ //# sourceMappingURL=eve-record-change.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eve-record-change.mjs","names":[],"sources":["../../src/changes/eve-record-change.ts"],"sourcesContent":["import { defineTool, type ToolContext, type ToolDefinition } from \"eve/tools\";\nimport { z } from \"zod\";\nimport type { ChangePresenter } from \"./presentation\";\nimport { changeLevelSchema, type Change } from \"../schema/change\";\nimport { repositoryIdSchema, taskIdSchema } from \"../schema/id\";\nimport type { Task } from \"../schema/task\";\nimport type { PullRequestPublicationGateResult } from \"../pull-requests/contracts\";\nimport type { FactoryStores } from \"../store/engine\";\nimport { requireTaskExecution, requireTaskExecutionIdentity } from \"../eve/task-execution\";\n\n/** Change and Task capabilities required by the record-change tool. */\nexport type RecordChangeToolStores = Pick<FactoryStores, \"changes\" | \"tasks\">;\n\nconst recordChangeInputSchema = z.object({\n taskId: taskIdSchema,\n repositoryId: repositoryIdSchema,\n prNumber: z.number().int().min(1),\n prUrl: z.url(),\n risk: changeLevelSchema.describe(\"Blast radius of the change if it is wrong.\"),\n confidence: changeLevelSchema.describe(\"How certain you are the change is correct.\"),\n summary: z.string().min(1).describe(\"One-sentence description of the change.\"),\n});\n\n/** Validated input accepted by the tool that links a pull request to its producing Task. */\nexport type RecordChangeInput = z.infer<typeof recordChangeInputSchema>;\n\n/** Configures policy gates and durable presentation for the software record-change tool. */\nexport interface RecordChangeToolOptions {\n /**\n * PR association gate, run as an Eve approval policy and again after\n * authentication before recording. Refusals include the gate's reason.\n * Gates must fail closed: when they cannot verify, they refuse.\n */\n recordChangeGate?: (input: RecordChangeInput) => Promise<PullRequestPublicationGateResult>;\n /** Whether recorded code changes wait for an independent verification task. Default: required. */\n verification?: \"required\" | \"disabled\";\n /** Present the pull request after record_change persists its durable state. */\n presentChange?: ChangePresenter;\n}\n\n/** Change and producing Task returned after a pull request is recorded. */\nexport interface RecordChangeResult {\n readonly change: Change;\n readonly task: Task;\n}\n\n/** Eve outcome tool that links a pull request to its producing Task. */\nexport interface RecordChangeTool extends ToolDefinition<RecordChangeInput, RecordChangeResult> {\n execute(input: RecordChangeInput, ctx: ToolContext): Promise<RecordChangeResult>;\n}\n\n/** Create the supplied software workflow's pull-request outcome tool. */\nexport function createRecordChangeTool(\n stores: RecordChangeToolStores,\n options: RecordChangeToolOptions = {},\n): RecordChangeTool {\n const recordChangeGate = options.recordChangeGate;\n const verification = options.verification ?? \"required\";\n return defineTool({\n description:\n verification === \"required\"\n ? \"Record the pull request produced for a code_change task. Creates the change, links it to the task, and moves the task to verifying.\"\n : \"Record the pull request produced for a code_change task. Creates the change and marks it ready for human review without independent verification.\",\n inputSchema: recordChangeInputSchema,\n ...(recordChangeGate === undefined\n ? {}\n : {\n approval: async ({ toolInput }: { toolInput?: unknown }) => {\n const parsed = recordChangeInputSchema.safeParse(toolInput);\n if (!parsed.success) {\n return {\n type: \"denied\" as const,\n reason: \"record_change input is malformed; fix the arguments and retry\",\n };\n }\n const verdict = await recordChangeGate(parsed.data);\n return verdict.ok\n ? (\"not-applicable\" as const)\n : { type: \"denied\" as const, reason: verdict.reason };\n },\n }),\n async execute(\n { taskId, repositoryId, prNumber, prUrl, risk, confidence, summary },\n ctx,\n ): Promise<RecordChangeResult> {\n const currentTask = await requireTaskExecutionIdentity(stores, ctx, taskId);\n if (\n currentTask.state !== \"running\" &&\n currentTask.state !== \"verifying\" &&\n currentTask.state !== \"succeeded\"\n ) {\n throw new Error(`task ${taskId} is ${currentTask.state}, not running`);\n }\n if (currentTask.repositoryIds.length !== 1 || currentTask.repositoryIds[0] !== repositoryId) {\n throw new Error(\"Repository does not match the authenticated Task\");\n }\n if (currentTask.state !== \"running\" && currentTask.changeId === undefined) {\n throw new Error(`task ${taskId} has no recorded change`);\n }\n const linkedChange =\n currentTask.changeId === undefined\n ? undefined\n : await stores.changes.get(currentTask.changeId);\n if (currentTask.changeId !== undefined && linkedChange === null) {\n throw new Error(`change ${currentTask.changeId} does not exist`);\n }\n let change =\n linkedChange ??\n (await stores.changes.list()).find((candidate) => candidate.taskId === taskId);\n\n if (\n change !== undefined &&\n (change.repositoryId !== repositoryId ||\n change.prNumber !== prNumber ||\n change.prUrl !== prUrl)\n ) {\n throw new Error(\"Pull request does not match the Task's recorded Change\");\n }\n if (currentTask.state === \"running\") {\n await requireTaskExecution(stores, ctx, taskId);\n if (recordChangeGate !== undefined) {\n const verdict = await recordChangeGate({\n taskId,\n repositoryId,\n prNumber,\n prUrl,\n risk,\n confidence,\n summary,\n });\n if (!verdict.ok) throw new Error(verdict.reason);\n }\n await requireTaskExecution(stores, ctx, taskId);\n }\n\n if (change === undefined) {\n if (currentTask.state !== \"running\") {\n throw new Error(`task ${taskId} has no recorded change`);\n }\n change = await stores.changes.create({\n repositoryId,\n taskId,\n prNumber,\n prUrl,\n author: \"factory\",\n risk,\n confidence,\n evidence: {\n reproVerified: false,\n testsAdded: 0,\n checksGreen: false,\n attackPassed: false,\n scopeMatches: false,\n },\n });\n }\n if (change === undefined) throw new Error(`task ${taskId} has no recorded change`);\n let recordedChange = change;\n\n if (currentTask.state === \"succeeded\") return { change: recordedChange, task: currentTask };\n\n if (currentTask.state === \"running\") {\n await requireTaskExecution(stores, ctx, taskId);\n await options.presentChange?.({\n taskId,\n changeId: recordedChange.id,\n verification,\n summary,\n });\n }\n\n let task: Task = currentTask;\n if (task.state === \"running\") {\n task = await stores.tasks.transition(taskId, \"verifying\", {\n expectFrom: \"running\",\n expectAttempt: currentTask.attempt,\n expectExecution: currentTask.execution,\n patch: { changeId: recordedChange.id },\n reason: summary,\n });\n }\n if (verification === \"required\") return { change: recordedChange, task };\n\n const completion = await requireTaskExecutionIdentity(stores, ctx, taskId);\n if (completion.state !== \"verifying\" || completion.changeId !== recordedChange.id) {\n throw new Error(\"Task is no longer awaiting this Change's completion\");\n }\n if (recordedChange.state === \"verifying\") {\n recordedChange = await stores.changes.transition(recordedChange.id, \"ready\", {\n reason: \"independent verification is not configured\",\n });\n }\n if (task.state === \"verifying\") {\n task = await stores.tasks.transition(taskId, \"succeeded\", {\n expectFrom: \"verifying\",\n expectAttempt: currentTask.attempt,\n expectExecution: currentTask.execution,\n reason: \"change recorded for human review without independent verification\",\n output: {\n changeId: recordedChange.id,\n prUrl: recordedChange.prUrl,\n summary,\n verification,\n },\n });\n }\n return { change: recordedChange, task };\n },\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ChangeId, TaskId } from "../schema/id.mjs";
2
+ //#region src/changes/presentation.d.ts
3
+ /** Details presented after a pull request is durably recorded as a Change. */
4
+ interface PresentChangeInput {
5
+ taskId: TaskId;
6
+ changeId: ChangeId;
7
+ verification: "required" | "disabled";
8
+ summary: string;
9
+ }
10
+ /** Presents a newly recorded Change through an application-owned channel. */
11
+ type ChangePresenter = (input: PresentChangeInput) => Promise<void>;
12
+ //#endregion
13
+ export { ChangePresenter, PresentChangeInput };
14
+ //# sourceMappingURL=presentation.d.mts.map
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ import { ChangeId, RepositoryId, changeIdSchema } from "./schema/id.mjs";
3
+ import { Change, ChangeEvidence, ChangeInState, ChangeLevel, ChangeState, changeEvidenceSchema, changeLevelSchema, changeSchema, changeStateSchema } from "./schema/change.mjs";
4
+ import { ChangeAssociationError, ChangePatch, ChangeTransitionArguments, ChangeTransitionOptions, CreateChangeInput, FactoryStores, UpdateChangeEvidenceInput } from "./store/engine.mjs";
5
+ import { changeInitialState, changeTransitions } from "./schema/transitions.mjs";
6
+ import { ChangePresenter, PresentChangeInput } from "./changes/presentation.mjs";
7
+ import { RecordChangeInput, RecordChangeResult, RecordChangeTool, RecordChangeToolOptions, RecordChangeToolStores, createRecordChangeTool } from "./changes/eve-record-change.mjs";
8
+ import { formatChangeVerificationBrief } from "./change-verification/brief.mjs";
9
+ import { PresentVerificationResultInput, RecordVerificationInput, RecordVerificationRefusal, RecordVerificationResult, RecordVerificationSuccess, RecordVerificationTool, RecordVerificationToolOptions, RecordVerificationToolStores, createRecordVerificationTool } from "./change-verification/eve-tool.mjs";
10
+ import { ChangeVerificationStores, EnsureChangeVerificationTasksOptions, EnsureChangeVerificationTasksResult, RecoverChangeVerificationResultOptions, ensureChangeVerificationTasks, recoverChangeVerificationResult } from "./change-verification/dispatch.mjs";
11
+ import { CreateMultiRepositoryChangeTasksInput, CreateMultiRepositoryChangeTasksStores, MultiRepositoryChangePlan, ReconcileMultiRepositoryChangeTasksResult, ReconcileMultiRepositoryChangeTasksStores, createMultiRepositoryChangeTasks, reconcileMultiRepositoryChangeTasks } from "./multi-repository-changes/coordination.mjs";
12
+ //#region src/changes.d.ts
13
+ /** Provider identity and author required to represent an existing pull request as a Change. */
14
+ interface AdoptPullRequestInput {
15
+ repositoryId: RepositoryId;
16
+ prNumber: number;
17
+ prUrl: string;
18
+ author: string;
19
+ }
20
+ /** Create a conservative, unverified Change for a pull request not authored by Factory. */
21
+ declare function adoptPullRequest(stores: Pick<FactoryStores, "changes">, input: AdoptPullRequestInput): Promise<Change>;
22
+ //#endregion
23
+ export { AdoptPullRequestInput, type Change, ChangeAssociationError, type ChangeEvidence, type ChangeId, type ChangeInState, type ChangeLevel, type ChangePatch, type ChangePresenter, type ChangeState, type ChangeTransitionArguments, type ChangeTransitionOptions, type ChangeVerificationStores, type CreateChangeInput, type CreateMultiRepositoryChangeTasksInput, type CreateMultiRepositoryChangeTasksStores, type EnsureChangeVerificationTasksOptions, type EnsureChangeVerificationTasksResult, type MultiRepositoryChangePlan, type PresentChangeInput, type PresentVerificationResultInput, type ReconcileMultiRepositoryChangeTasksResult, type ReconcileMultiRepositoryChangeTasksStores, type RecordChangeInput, type RecordChangeResult, type RecordChangeTool, type RecordChangeToolOptions, type RecordChangeToolStores, type RecordVerificationInput, type RecordVerificationRefusal, type RecordVerificationResult, type RecordVerificationSuccess, type RecordVerificationTool, type RecordVerificationToolOptions, type RecordVerificationToolStores, type RecoverChangeVerificationResultOptions, type UpdateChangeEvidenceInput, adoptPullRequest, changeEvidenceSchema, changeIdSchema, changeInitialState, changeLevelSchema, changeSchema, changeStateSchema, changeTransitions, createMultiRepositoryChangeTasks, createRecordChangeTool, createRecordVerificationTool, ensureChangeVerificationTasks, formatChangeVerificationBrief, reconcileMultiRepositoryChangeTasks, recoverChangeVerificationResult };
24
+ //# sourceMappingURL=changes.d.mts.map
@@ -0,0 +1,29 @@
1
+ import { changeIdSchema } from "./schema/id.mjs";
2
+ import { changeInitialState, changeTransitions } from "./schema/transitions.mjs";
3
+ import { changeEvidenceSchema, changeLevelSchema, changeSchema, changeStateSchema } from "./schema/change.mjs";
4
+ import { ChangeAssociationError } from "./store/engine.mjs";
5
+ import { createRecordChangeTool } from "./changes/eve-record-change.mjs";
6
+ import { formatChangeVerificationBrief } from "./change-verification/brief.mjs";
7
+ import { ensureChangeVerificationTasks, recoverChangeVerificationResult } from "./change-verification/dispatch.mjs";
8
+ import { createRecordVerificationTool } from "./change-verification/eve-tool.mjs";
9
+ import { createMultiRepositoryChangeTasks, reconcileMultiRepositoryChangeTasks } from "./multi-repository-changes/coordination.mjs";
10
+ //#region src/changes.ts
11
+ /** Create a conservative, unverified Change for a pull request not authored by Factory. */
12
+ async function adoptPullRequest(stores, input) {
13
+ return stores.changes.create({
14
+ ...input,
15
+ risk: "low",
16
+ confidence: "low",
17
+ evidence: {
18
+ reproVerified: false,
19
+ testsAdded: 0,
20
+ checksGreen: false,
21
+ attackPassed: false,
22
+ scopeMatches: false
23
+ }
24
+ });
25
+ }
26
+ //#endregion
27
+ export { ChangeAssociationError, adoptPullRequest, changeEvidenceSchema, changeIdSchema, changeInitialState, changeLevelSchema, changeSchema, changeStateSchema, changeTransitions, createMultiRepositoryChangeTasks, createRecordChangeTool, createRecordVerificationTool, ensureChangeVerificationTasks, formatChangeVerificationBrief, reconcileMultiRepositoryChangeTasks, recoverChangeVerificationResult };
28
+
29
+ //# sourceMappingURL=changes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.mjs","names":[],"sources":["../src/changes.ts"],"sourcesContent":["import type { Change } from \"./schema/change\";\nimport type { RepositoryId } from \"./schema/id\";\nimport type { FactoryStores } from \"./store/engine\";\n\nexport { type ChangePresenter, type PresentChangeInput } from \"./changes/presentation\";\nexport {\n createRecordChangeTool,\n type RecordChangeInput,\n type RecordChangeResult,\n type RecordChangeTool,\n type RecordChangeToolStores,\n type RecordChangeToolOptions,\n} from \"./changes/eve-record-change\";\nexport { formatChangeVerificationBrief } from \"./change-verification/brief\";\nexport {\n ensureChangeVerificationTasks,\n recoverChangeVerificationResult,\n type ChangeVerificationStores,\n type EnsureChangeVerificationTasksOptions,\n type EnsureChangeVerificationTasksResult,\n type RecoverChangeVerificationResultOptions,\n} from \"./change-verification/dispatch\";\nexport {\n createRecordVerificationTool,\n type PresentVerificationResultInput,\n type RecordVerificationInput,\n type RecordVerificationRefusal,\n type RecordVerificationResult,\n type RecordVerificationSuccess,\n type RecordVerificationTool,\n type RecordVerificationToolStores,\n type RecordVerificationToolOptions,\n} from \"./change-verification/eve-tool\";\nexport {\n createMultiRepositoryChangeTasks,\n reconcileMultiRepositoryChangeTasks,\n type CreateMultiRepositoryChangeTasksInput,\n type CreateMultiRepositoryChangeTasksStores,\n type MultiRepositoryChangePlan,\n type ReconcileMultiRepositoryChangeTasksResult,\n type ReconcileMultiRepositoryChangeTasksStores,\n} from \"./multi-repository-changes/coordination\";\n\n/** Provider identity and author required to represent an existing pull request as a Change. */\nexport interface AdoptPullRequestInput {\n repositoryId: RepositoryId;\n prNumber: number;\n prUrl: string;\n author: string;\n}\n\n/** Create a conservative, unverified Change for a pull request not authored by Factory. */\nexport async function adoptPullRequest(\n stores: Pick<FactoryStores, \"changes\">,\n input: AdoptPullRequestInput,\n): Promise<Change> {\n return stores.changes.create({\n ...input,\n risk: \"low\",\n confidence: \"low\",\n evidence: {\n reproVerified: false,\n testsAdded: 0,\n checksGreen: false,\n attackPassed: false,\n scopeMatches: false,\n },\n });\n}\n\nexport {\n changeEvidenceSchema,\n changeSchema,\n changeStateSchema,\n changeLevelSchema,\n type Change,\n type ChangeEvidence,\n type ChangeInState,\n type ChangeState,\n type ChangeLevel,\n} from \"./schema/change\";\nexport { changeIdSchema, type ChangeId } from \"./schema/id\";\nexport { changeInitialState, changeTransitions } from \"./schema/transitions\";\nexport {\n ChangeAssociationError,\n type ChangePatch,\n type ChangeTransitionOptions,\n type ChangeTransitionArguments,\n type CreateChangeInput,\n type UpdateChangeEvidenceInput,\n} from \"./store/engine\";\n"],"mappings":";;;;;;;;;;;AAoDA,eAAsB,iBACpB,QACA,OACiB;CACjB,OAAO,OAAO,QAAQ,OAAO;EAC3B,GAAG;EACH,MAAM;EACN,YAAY;EACZ,UAAU;GACR,eAAe;GACf,YAAY;GACZ,aAAa;GACb,cAAc;GACd,cAAc;EAChB;CACF,CAAC;AACH"}
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ //#region src/client-events.d.ts
3
+ /** Validates an execution stream event, normalizing payloadless completion events. */
4
+ declare const streamEventSchema: z.ZodUnion<[z.ZodObject<{
5
+ type: z.ZodString;
6
+ data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
7
+ meta: z.ZodOptional<z.ZodObject<{
8
+ id: z.ZodOptional<z.ZodString>;
9
+ at: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strip>>;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ meta: z.ZodOptional<z.ZodObject<{
13
+ id: z.ZodOptional<z.ZodString>;
14
+ at: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>>;
16
+ type: z.ZodLiteral<"session.completed">;
17
+ data: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
18
+ }, z.core.$strip>]>;
19
+ /** One validated event received from a Factory execution stream. */
20
+ type StreamEvent = z.infer<typeof streamEventSchema>;
21
+ /** Parses validated newline-delimited events from a response body. */
22
+ declare function readEvents(body: ReadableStream<Uint8Array>): AsyncGenerator<StreamEvent>;
23
+ //#endregion
24
+ export { StreamEvent, readEvents, streamEventSchema };
25
+ //# sourceMappingURL=client-events.d.mts.map
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ //#region src/client-events.ts
3
+ const eventWithDataSchema = z.object({
4
+ type: z.string(),
5
+ data: z.record(z.string(), z.unknown()),
6
+ meta: z.object({
7
+ id: z.string().optional(),
8
+ at: z.string().optional()
9
+ }).optional()
10
+ });
11
+ /** Validates an execution stream event, normalizing payloadless completion events. */
12
+ const streamEventSchema = eventWithDataSchema.or(eventWithDataSchema.extend({
13
+ type: z.literal("session.completed"),
14
+ data: z.record(z.string(), z.unknown()).default({})
15
+ }));
16
+ /** Parses validated newline-delimited events from a response body. */
17
+ async function* readEvents(body) {
18
+ const reader = body.getReader();
19
+ const decoder = new TextDecoder();
20
+ let pending = "";
21
+ try {
22
+ for (;;) {
23
+ const { done, value } = await reader.read();
24
+ pending += done ? decoder.decode() : decoder.decode(value, { stream: true });
25
+ let newline;
26
+ while ((newline = pending.indexOf("\n")) >= 0) {
27
+ const line = pending.slice(0, newline).trim();
28
+ pending = pending.slice(newline + 1);
29
+ if (line) yield streamEventSchema.parse(JSON.parse(line));
30
+ }
31
+ if (pending.length > 2e6) throw new Error("Stream event exceeds the 2 MB limit");
32
+ if (done) {
33
+ if (pending.trim()) yield streamEventSchema.parse(JSON.parse(pending));
34
+ return;
35
+ }
36
+ }
37
+ } finally {
38
+ await reader.cancel().catch(() => {});
39
+ reader.releaseLock();
40
+ }
41
+ }
42
+ //#endregion
43
+ export { readEvents, streamEventSchema };
44
+
45
+ //# sourceMappingURL=client-events.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-events.mjs","names":[],"sources":["../src/client-events.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst eventWithDataSchema = z.object({\n type: z.string(),\n data: z.record(z.string(), z.unknown()),\n meta: z.object({ id: z.string().optional(), at: z.string().optional() }).optional(),\n});\n/** Validates an execution stream event, normalizing payloadless completion events. */\nexport const streamEventSchema = eventWithDataSchema.or(\n eventWithDataSchema.extend({\n type: z.literal(\"session.completed\"),\n data: z.record(z.string(), z.unknown()).default({}),\n }),\n);\n/** One validated event received from a Factory execution stream. */\nexport type StreamEvent = z.infer<typeof streamEventSchema>;\n\n/** Parses validated newline-delimited events from a response body. */\nexport async function* readEvents(body: ReadableStream<Uint8Array>): AsyncGenerator<StreamEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let pending = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n pending += done ? decoder.decode() : decoder.decode(value, { stream: true });\n let newline: number;\n while ((newline = pending.indexOf(\"\\n\")) >= 0) {\n const line = pending.slice(0, newline).trim();\n pending = pending.slice(newline + 1);\n if (line) yield streamEventSchema.parse(JSON.parse(line));\n }\n if (pending.length > 2_000_000) throw new Error(\"Stream event exceeds the 2 MB limit\");\n if (done) {\n if (pending.trim()) yield streamEventSchema.parse(JSON.parse(pending));\n return;\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n"],"mappings":";;AAEA,MAAM,sBAAsB,EAAE,OAAO;CACnC,MAAM,EAAE,OAAO;CACf,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;CACtC,MAAM,EAAE,OAAO;EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS;EAAG,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS;CAAE,CAAC,CAAC,CAAC,SAAS;AACpF,CAAC;;AAED,MAAa,oBAAoB,oBAAoB,GACnD,oBAAoB,OAAO;CACzB,MAAM,EAAE,QAAQ,mBAAmB;CACnC,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC,CACH;;AAKA,gBAAuB,WAAW,MAA+D;CAC/F,MAAM,SAAS,KAAK,UAAU;CAC9B,MAAM,UAAU,IAAI,YAAY;CAChC,IAAI,UAAU;CACd,IAAI;EACF,SAAS;GACP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;GAC1C,WAAW,OAAO,QAAQ,OAAO,IAAI,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;GAC3E,IAAI;GACJ,QAAQ,UAAU,QAAQ,QAAQ,IAAI,MAAM,GAAG;IAC7C,MAAM,OAAO,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC,KAAK;IAC5C,UAAU,QAAQ,MAAM,UAAU,CAAC;IACnC,IAAI,MAAM,MAAM,kBAAkB,MAAM,KAAK,MAAM,IAAI,CAAC;GAC1D;GACA,IAAI,QAAQ,SAAS,KAAW,MAAM,IAAI,MAAM,qCAAqC;GACrF,IAAI,MAAM;IACR,IAAI,QAAQ,KAAK,GAAG,MAAM,kBAAkB,MAAM,KAAK,MAAM,OAAO,CAAC;IACrE;GACF;EACF;CACF,UAAU;EACR,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;EACpC,OAAO,YAAY;CACrB;AACF"}
@@ -0,0 +1,28 @@
1
+ import { TaskId } from "./schema/id.mjs";
2
+ import { AgentSessionId } from "./schema/session.mjs";
3
+ import { Transcript } from "./client-transcript.mjs";
4
+ import { FactoryClient } from "./client.mjs";
5
+ import { SessionView } from "./api-contracts.mjs";
6
+ //#region src/client-stream.d.ts
7
+ /** Client operations required to hydrate and follow a Factory session stream. */
8
+ type SessionStreamClient = Pick<FactoryClient, "getSessionTranscriptResponse" | "getSessionEventStreamResponse">;
9
+ /** Callbacks and exact execution identity used while following a session stream. */
10
+ interface FollowSessionStreamOptions {
11
+ readonly sessionId: AgentSessionId;
12
+ readonly executionId: string | null;
13
+ readonly taskId?: TaskId;
14
+ readonly history?: readonly NonNullable<SessionView["history"]>[number][];
15
+ readonly transcript: Transcript;
16
+ readonly signal: AbortSignal;
17
+ readonly pollIntervalMs?: number;
18
+ readonly onHydrated: () => void;
19
+ readonly onChange: () => void;
20
+ readonly onConnection: (state: "connected" | "reconnecting") => void;
21
+ readonly onError: (error: unknown) => void;
22
+ readonly onConflict: () => Promise<void>;
23
+ }
24
+ /** Hydrates a transcript and follows its current execution until completion or disconnection. */
25
+ declare function followSessionStream(client: SessionStreamClient, options: FollowSessionStreamOptions): Promise<void>;
26
+ //#endregion
27
+ export { FollowSessionStreamOptions, SessionStreamClient, followSessionStream };
28
+ //# sourceMappingURL=client-stream.d.mts.map
@@ -0,0 +1,210 @@
1
+ import { readEvents } from "./client-events.mjs";
2
+ import { transcriptSnapshotSchema } from "./schema/transcript.mjs";
3
+ import { Transcript } from "./client-transcript.mjs";
4
+ import { ApiError } from "./client.mjs";
5
+ //#region src/client-stream.ts
6
+ function pause(ms, signal) {
7
+ return new Promise((resolve) => {
8
+ const finish = () => {
9
+ clearTimeout(timer);
10
+ signal.removeEventListener("abort", finish);
11
+ resolve();
12
+ };
13
+ const timer = setTimeout(finish, ms);
14
+ signal.addEventListener("abort", finish, { once: true });
15
+ if (signal.aborted) finish();
16
+ });
17
+ }
18
+ async function readSnapshot(client, input) {
19
+ let failures = 0;
20
+ while (!input.signal.aborted) try {
21
+ const requestSignal = AbortSignal.any([input.signal, AbortSignal.timeout(15e3)]);
22
+ const response = await client.getSessionTranscriptResponse({
23
+ sessionId: input.sessionId,
24
+ executionId: input.executionId,
25
+ ...input.taskId === void 0 ? {} : { taskId: input.taskId },
26
+ ...input.history ? { history: true } : {},
27
+ signal: requestSignal
28
+ });
29
+ input.transcript.hydrate(transcriptSnapshotSchema.parse(await response.json()));
30
+ return;
31
+ } catch (error) {
32
+ if (input.signal.aborted) return;
33
+ if (error instanceof ApiError) throw error;
34
+ input.onRetry?.(error);
35
+ failures++;
36
+ await pause(Math.min(15e3, input.pollIntervalMs * 2 ** Math.min(failures, 3)), input.signal);
37
+ }
38
+ }
39
+ async function loadHistory(client, options) {
40
+ const entries = options.history ?? [];
41
+ const results = /* @__PURE__ */ new Map();
42
+ let next = 0;
43
+ await Promise.all(Array.from({ length: Math.min(4, entries.length) }, async () => {
44
+ while (next < entries.length) {
45
+ const index = next++;
46
+ const entry = entries[index];
47
+ if (!entry) throw new Error("Historical transcript index is unavailable");
48
+ const id = entry.execution.sessionId;
49
+ const previous = new Transcript(entry.message, entry.attachments);
50
+ const header = {
51
+ id: "run",
52
+ kind: "status",
53
+ title: entry.agent,
54
+ text: entry.taskId ? `Earlier work · ${entry.taskId}` : "Earlier execution"
55
+ };
56
+ try {
57
+ const historySignal = AbortSignal.any([options.signal, AbortSignal.timeout(15e3)]);
58
+ await readSnapshot(client, {
59
+ sessionId: options.sessionId,
60
+ executionId: id,
61
+ history: true,
62
+ transcript: previous,
63
+ signal: historySignal,
64
+ pollIntervalMs: options.pollIntervalMs ?? 2e3
65
+ });
66
+ if (historySignal.aborted && !options.signal.aborted) throw new Error("Historical transcript loading timed out");
67
+ } catch (error) {
68
+ if (options.signal.aborted) return;
69
+ if (error instanceof ApiError && [401, 403].includes(error.status)) throw error;
70
+ previous.put({
71
+ id: "unavailable",
72
+ kind: "status",
73
+ title: "History unavailable",
74
+ text: "This execution's transcript could not be loaded."
75
+ });
76
+ }
77
+ previous.blocks.unshift(header);
78
+ results.set(index, {
79
+ id,
80
+ transcript: previous
81
+ });
82
+ }
83
+ }));
84
+ return entries.map((_, index) => {
85
+ const result = results.get(index);
86
+ if (!result) throw new Error("Historical transcript loading did not complete");
87
+ return result;
88
+ });
89
+ }
90
+ async function hydrateCurrent(client, options) {
91
+ const executionId = options.executionId;
92
+ if (executionId === null) return true;
93
+ let failures = 0;
94
+ while (!options.signal.aborted) try {
95
+ await readSnapshot(client, {
96
+ sessionId: options.sessionId,
97
+ executionId,
98
+ taskId: options.taskId,
99
+ history: false,
100
+ transcript: options.transcript,
101
+ signal: options.signal,
102
+ pollIntervalMs: options.pollIntervalMs ?? 2e3,
103
+ onRetry: (error) => {
104
+ options.onConnection("reconnecting");
105
+ options.onError(error);
106
+ }
107
+ });
108
+ if (options.signal.aborted) return false;
109
+ options.onConnection("connected");
110
+ return true;
111
+ } catch (error) {
112
+ if (options.signal.aborted) return false;
113
+ options.onConnection("reconnecting");
114
+ failures++;
115
+ options.onError(error);
116
+ if (error instanceof ApiError && [
117
+ 0,
118
+ 301,
119
+ 302,
120
+ 303,
121
+ 307,
122
+ 308,
123
+ 401,
124
+ 403
125
+ ].includes(error.status)) return false;
126
+ if (error instanceof ApiError && error.status === 404) return false;
127
+ if (error instanceof ApiError && error.status === 409) {
128
+ await options.onConflict();
129
+ return false;
130
+ }
131
+ await pause(Math.min(15e3, (options.pollIntervalMs ?? 2e3) * 2 ** Math.min(failures, 3)), options.signal);
132
+ }
133
+ return false;
134
+ }
135
+ /** Hydrates a transcript and follows its current execution until completion or disconnection. */
136
+ async function followSessionStream(client, options) {
137
+ const { sessionId, executionId, transcript, signal } = options;
138
+ let history;
139
+ let hydrated;
140
+ try {
141
+ [history, hydrated] = await Promise.all([loadHistory(client, options), hydrateCurrent(client, options)]);
142
+ } catch (error) {
143
+ if (!signal.aborted) options.onError(error);
144
+ return;
145
+ }
146
+ if (signal.aborted || !hydrated) return;
147
+ transcript.prependHistory(history);
148
+ if (executionId === null) transcript.state = "waiting";
149
+ options.onHydrated();
150
+ if (executionId === null || ["completed", "failed"].includes(transcript.state)) return;
151
+ let failures = 0;
152
+ while (!signal.aborted) {
153
+ const recycle = AbortSignal.timeout(6e4);
154
+ let established = false;
155
+ try {
156
+ const response = await client.getSessionEventStreamResponse({
157
+ sessionId,
158
+ executionId,
159
+ cursor: transcript.cursor,
160
+ ...options.taskId === void 0 ? {} : { taskId: options.taskId },
161
+ signal: AbortSignal.any([signal, recycle])
162
+ });
163
+ if (!response.body) throw new Error("The factory returned an empty stream");
164
+ established = true;
165
+ options.onConnection("connected");
166
+ for await (const event of readEvents(response.body)) {
167
+ if (signal.aborted) return;
168
+ transcript.accept(event);
169
+ failures = 0;
170
+ options.onChange();
171
+ }
172
+ if (["completed", "failed"].includes(transcript.state)) return;
173
+ } catch (error) {
174
+ if (signal.aborted) return;
175
+ options.onConnection("reconnecting");
176
+ if (recycle.aborted && established) {
177
+ failures = 0;
178
+ continue;
179
+ }
180
+ failures++;
181
+ options.onError(error);
182
+ if (error instanceof ApiError && [
183
+ 0,
184
+ 301,
185
+ 302,
186
+ 303,
187
+ 307,
188
+ 308,
189
+ 401,
190
+ 403
191
+ ].includes(error.status)) return;
192
+ if (error instanceof ApiError && error.status === 404) {
193
+ if (transcript.state === "running") {
194
+ transcript.state = "connecting";
195
+ options.onChange();
196
+ }
197
+ return;
198
+ }
199
+ if (error instanceof ApiError && error.status === 409) {
200
+ await options.onConflict();
201
+ return;
202
+ }
203
+ }
204
+ await pause(Math.min(15e3, (options.pollIntervalMs ?? 2e3) * 2 ** Math.min(failures, 3)), signal);
205
+ }
206
+ }
207
+ //#endregion
208
+ export { followSessionStream };
209
+
210
+ //# sourceMappingURL=client-stream.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-stream.mjs","names":[],"sources":["../src/client-stream.ts"],"sourcesContent":["import { ApiError, type FactoryClient } from \"./client\";\nimport { readEvents } from \"./client-events\";\nimport { Transcript } from \"./client-transcript\";\nimport type { SessionView } from \"./api-contracts\";\nimport type { TaskId } from \"./schema/id\";\nimport type { AgentSessionId } from \"./schema/session\";\nimport { transcriptSnapshotSchema } from \"./schema/transcript\";\n\n/** Client operations required to hydrate and follow a Factory session stream. */\nexport type SessionStreamClient = Pick<\n FactoryClient,\n \"getSessionTranscriptResponse\" | \"getSessionEventStreamResponse\"\n>;\n\n/** Callbacks and exact execution identity used while following a session stream. */\nexport interface FollowSessionStreamOptions {\n readonly sessionId: AgentSessionId;\n readonly executionId: string | null;\n readonly taskId?: TaskId;\n readonly history?: readonly NonNullable<SessionView[\"history\"]>[number][];\n readonly transcript: Transcript;\n readonly signal: AbortSignal;\n readonly pollIntervalMs?: number;\n readonly onHydrated: () => void;\n readonly onChange: () => void;\n readonly onConnection: (state: \"connected\" | \"reconnecting\") => void;\n readonly onError: (error: unknown) => void;\n readonly onConflict: () => Promise<void>;\n}\n\nfunction pause(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const finish = () => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timer = setTimeout(finish, ms);\n signal.addEventListener(\"abort\", finish, { once: true });\n if (signal.aborted) finish();\n });\n}\n\nasync function readSnapshot(\n client: SessionStreamClient,\n input: {\n sessionId: AgentSessionId;\n executionId: string;\n taskId?: TaskId;\n history: boolean;\n transcript: Transcript;\n signal: AbortSignal;\n pollIntervalMs: number;\n onRetry?(error: unknown): void;\n },\n) {\n let failures = 0;\n while (!input.signal.aborted) {\n try {\n const requestSignal = AbortSignal.any([input.signal, AbortSignal.timeout(15_000)]);\n const response = await client.getSessionTranscriptResponse({\n sessionId: input.sessionId,\n executionId: input.executionId,\n ...(input.taskId === undefined ? {} : { taskId: input.taskId }),\n ...(input.history ? { history: true } : {}),\n signal: requestSignal,\n });\n input.transcript.hydrate(transcriptSnapshotSchema.parse(await response.json()));\n return;\n } catch (error) {\n if (input.signal.aborted) return;\n if (error instanceof ApiError) throw error;\n input.onRetry?.(error);\n failures++;\n await pause(\n Math.min(15_000, input.pollIntervalMs * 2 ** Math.min(failures, 3)),\n input.signal,\n );\n }\n }\n}\n\nasync function loadHistory(\n client: SessionStreamClient,\n options: FollowSessionStreamOptions,\n): Promise<{ id: string; transcript: Transcript }[]> {\n const entries = options.history ?? [];\n const results = new Map<number, { id: string; transcript: Transcript }>();\n let next = 0;\n await Promise.all(\n Array.from({ length: Math.min(4, entries.length) }, async () => {\n while (next < entries.length) {\n const index = next++;\n const entry = entries[index];\n if (!entry) throw new Error(\"Historical transcript index is unavailable\");\n const id = entry.execution.sessionId;\n const previous = new Transcript(entry.message, entry.attachments);\n const header = {\n id: \"run\",\n kind: \"status\",\n title: entry.agent,\n text: entry.taskId ? `Earlier work · ${entry.taskId}` : \"Earlier execution\",\n } as const;\n try {\n const historySignal = AbortSignal.any([options.signal, AbortSignal.timeout(15_000)]);\n await readSnapshot(client, {\n sessionId: options.sessionId,\n executionId: id,\n history: true,\n transcript: previous,\n signal: historySignal,\n pollIntervalMs: options.pollIntervalMs ?? 2000,\n });\n if (historySignal.aborted && !options.signal.aborted)\n throw new Error(\"Historical transcript loading timed out\");\n } catch (error) {\n if (options.signal.aborted) return;\n if (error instanceof ApiError && [401, 403].includes(error.status)) throw error;\n previous.put({\n id: \"unavailable\",\n kind: \"status\",\n title: \"History unavailable\",\n text: \"This execution's transcript could not be loaded.\",\n });\n }\n previous.blocks.unshift(header);\n results.set(index, { id, transcript: previous });\n }\n }),\n );\n return entries.map((_, index) => {\n const result = results.get(index);\n if (!result) throw new Error(\"Historical transcript loading did not complete\");\n return result;\n });\n}\n\nasync function hydrateCurrent(\n client: SessionStreamClient,\n options: FollowSessionStreamOptions,\n): Promise<boolean> {\n const executionId = options.executionId;\n if (executionId === null) return true;\n let failures = 0;\n while (!options.signal.aborted) {\n try {\n await readSnapshot(client, {\n sessionId: options.sessionId,\n executionId,\n taskId: options.taskId,\n history: false,\n transcript: options.transcript,\n signal: options.signal,\n pollIntervalMs: options.pollIntervalMs ?? 2000,\n onRetry: (error) => {\n options.onConnection(\"reconnecting\");\n options.onError(error);\n },\n });\n if (options.signal.aborted) return false;\n options.onConnection(\"connected\");\n return true;\n } catch (error) {\n if (options.signal.aborted) return false;\n options.onConnection(\"reconnecting\");\n failures++;\n options.onError(error);\n if (\n error instanceof ApiError &&\n [0, 301, 302, 303, 307, 308, 401, 403].includes(error.status)\n )\n return false;\n if (error instanceof ApiError && error.status === 404) return false;\n if (error instanceof ApiError && error.status === 409) {\n await options.onConflict();\n return false;\n }\n await pause(\n Math.min(15_000, (options.pollIntervalMs ?? 2000) * 2 ** Math.min(failures, 3)),\n options.signal,\n );\n }\n }\n return false;\n}\n\n/** Hydrates a transcript and follows its current execution until completion or disconnection. */\nexport async function followSessionStream(\n client: SessionStreamClient,\n options: FollowSessionStreamOptions,\n): Promise<void> {\n const { sessionId, executionId, transcript, signal } = options;\n let history: { id: string; transcript: Transcript }[];\n let hydrated: boolean;\n try {\n [history, hydrated] = await Promise.all([\n loadHistory(client, options),\n hydrateCurrent(client, options),\n ]);\n } catch (error) {\n if (!signal.aborted) options.onError(error);\n return;\n }\n if (signal.aborted || !hydrated) return;\n transcript.prependHistory(history);\n if (executionId === null) transcript.state = \"waiting\";\n options.onHydrated();\n if (executionId === null || [\"completed\", \"failed\"].includes(transcript.state)) return;\n let failures = 0;\n while (!signal.aborted) {\n const recycle = AbortSignal.timeout(60_000);\n let established = false;\n try {\n const response = await client.getSessionEventStreamResponse({\n sessionId,\n executionId,\n cursor: transcript.cursor,\n ...(options.taskId === undefined ? {} : { taskId: options.taskId }),\n signal: AbortSignal.any([signal, recycle]),\n });\n if (!response.body) throw new Error(\"The factory returned an empty stream\");\n established = true;\n options.onConnection(\"connected\");\n for await (const event of readEvents(response.body)) {\n if (signal.aborted) return;\n transcript.accept(event);\n failures = 0;\n options.onChange();\n }\n if ([\"completed\", \"failed\"].includes(transcript.state)) return;\n } catch (error) {\n if (signal.aborted) return;\n options.onConnection(\"reconnecting\");\n if (recycle.aborted && established) {\n failures = 0;\n continue;\n }\n failures++;\n options.onError(error);\n if (\n error instanceof ApiError &&\n [0, 301, 302, 303, 307, 308, 401, 403].includes(error.status)\n )\n return;\n if (error instanceof ApiError && error.status === 404) {\n if (transcript.state === \"running\") {\n transcript.state = \"connecting\";\n options.onChange();\n }\n return;\n }\n if (error instanceof ApiError && error.status === 409) {\n await options.onConflict();\n return;\n }\n }\n await pause(\n Math.min(15_000, (options.pollIntervalMs ?? 2000) * 2 ** Math.min(failures, 3)),\n signal,\n );\n }\n}\n"],"mappings":"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"}