@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 @@
1
+ {"version":3,"file":"engine.mjs","names":[],"sources":["../../src/store/engine.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { z, type ZodType } from \"zod\";\nimport { defaultTaskWorkflow, defineWorkflows, type WorkflowRegistry } from \"../workflows\";\nimport { parseAgentRouteBinding, routeTaskWork } from \"../agent-routes\";\nimport { jsonValueSchema, taskWorkSchema } from \"../schema/work\";\nimport { defineTaskMessageProtocols, type TaskMessageProtocols } from \"../schema/task-message\";\nimport {\n createTaskMessageStore,\n type TaskMessageAuthorize,\n type TaskMessageStore,\n} from \"./task-messages\";\nimport { createTaskGraphStore, type TaskGraphStore } from \"./task-graphs\";\nimport { createTaskEffectStore, type TaskEffectStore } from \"./task-effects\";\nimport { taskGraphDependenciesSchema } from \"../schema/task-graph\";\nimport { createTaskWorkStore, type TaskWorkStore } from \"./task-work\";\nimport { createWorkNotifier, type WorkNotifications } from \"./work-notifications\";\nimport {\n imageAttachmentSchema,\n imageAttachmentsSchema,\n imageUploadSchema,\n imageIdSchema,\n type ImageAttachment,\n type ImageId,\n} from \"../image-input\";\nimport { answerEventSchema, type AnswerEvent } from \"../schema/answer\";\nimport {\n agentSessionIdSchema,\n agentSessionSchema,\n type AgentSession,\n type AgentSessionId,\n} from \"../schema/session\";\nimport { externalSessionSchema, storedSessionSchema } from \"../schema/stored-session\";\nimport {\n SCHEMA_VERSION,\n replyToSchema,\n usdSchema,\n type IsoDateTimeClock,\n type ReplyTo,\n} from \"../schema/common\";\nimport { communicationEventSchema, type CommunicationEvent } from \"../schema/communication\";\nimport {\n answerIdSchema,\n changeIdSchema,\n outboxIdSchema,\n repositoryIdsSchema,\n taskIdSchema,\n type AnswerId,\n type ChangeId,\n type FactoryId,\n type OutboxId,\n type ReceiptId,\n type RepositoryId,\n type RepositoryIds,\n type SignalId,\n type TaskId,\n} from \"../schema/id\";\nimport { budgetSchema, type Budget, type BudgetMonth } from \"../schema/budget\";\nimport {\n changeSchema,\n type Change,\n type ChangeInState,\n type ChangeState,\n type ChangeLevel,\n} from \"../schema/change\";\nimport { outboxMessageSchema, outboxQueueSchema, type OutboxMessage } from \"../schema/outbox\";\nimport {\n changeCatalogSchema,\n sessionCatalogSchema,\n externalSessionCatalogSchema,\n taskCatalogSchema,\n taskRouteSchema,\n} from \"../schema/catalog\";\nimport { storedTaskSchema } from \"../schema/stored-task\";\nimport { transcriptSnapshotSchema, type TranscriptSnapshot } from \"../schema/transcript\";\nimport { questionRouteSchema } from \"../schema/question-route\";\nimport {\n costSchema,\n receiptSchema,\n type Cost,\n type Receipt,\n type ReceiptDelivery,\n type ReceiptKind,\n type ReceiptPhase,\n type ReceiptState,\n type StandardReceiptKind,\n type StandardReceiptPhase,\n type StandardReceiptState,\n} from \"../schema/receipt\";\nimport { repositorySchema, type Repository } from \"../schema/repository\";\nimport {\n signalSchema,\n type SignalTriage,\n type Signal,\n type SignalOutcome,\n type SignalSource,\n} from \"../schema/signal\";\nimport {\n taskSchema,\n taskKindSchema,\n taskOriginSchema,\n taskQuestionSchema,\n type ExecutionReference,\n type Task,\n type TaskOrigin,\n type TaskQuestion,\n type TaskState,\n type TaskUsage,\n} from \"../schema/task\";\nimport {\n assertTransition,\n changeInitialState,\n changeTransitions,\n InvalidTransitionError,\n legalNextStates,\n signalOutcomeTransitions,\n signalTriageTransitions,\n taskInitialState,\n taskTransitions,\n} from \"../schema/transitions\";\nimport {\n RecordExistsError,\n RecordNotFoundError,\n TransientStoreError,\n VersionConflictError,\n type CollectionName,\n type StoreDriver,\n} from \"./driver\";\n\nconst storedImageSchema = imageAttachmentSchema\n .extend({\n schemaVersion: z.literal(SCHEMA_VERSION).describe(\"Stored image schema version.\"),\n owner: z.string().min(1).describe(\"Authenticated image owner.\"),\n base64: imageUploadSchema.shape.base64,\n createdAt: z.iso.datetime().describe(\"Image creation time.\"),\n })\n .refine((image) => {\n const bytes = Buffer.from(image.base64, \"base64\");\n if (bytes.length !== image.size || bytes.toString(\"base64\") !== image.base64) return false;\n if (image.mediaType === \"image/png\")\n return (\n bytes.length >= 24 &&\n bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]))\n );\n if (image.mediaType === \"image/jpeg\")\n return bytes.length >= 4 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255;\n return (\n bytes.length >= 16 &&\n bytes.toString(\"ascii\", 0, 4) === \"RIFF\" &&\n bytes.toString(\"ascii\", 8, 12) === \"WEBP\"\n );\n }, \"Image bytes do not match the declared PNG, JPEG, or WebP format\");\ntype StoredImage = z.infer<typeof storedImageSchema>;\nconst storedTranscriptSchema = z.object({\n schemaVersion: z.literal(SCHEMA_VERSION),\n execution: z.object({ provider: z.string().min(1), sessionId: z.string().min(1) }),\n snapshot: transcriptSnapshotSchema,\n updatedAt: z.iso.datetime(),\n});\n/** Error raised when uploaded image bytes, ownership, or attachment metadata is invalid. */\nexport class ImageInputError extends Error {}\n\n/** An approval decision that does not apply to the task's current approval or state. */\nexport class ApprovalError extends Error {\n readonly taskId: TaskId;\n readonly reason: string;\n\n constructor(taskId: TaskId, reason: string) {\n super(`approval decision on \"${taskId}\" refused: ${reason}`);\n this.name = \"ApprovalError\";\n this.taskId = taskId;\n this.reason = reason;\n }\n}\n\n/** A settlement that does not apply to the task's current state. */\nexport class SettlementError extends Error {\n readonly taskId: TaskId;\n readonly reason: string;\n\n constructor(taskId: TaskId, reason: string) {\n super(`settlement on \"${taskId}\" refused: ${reason}`);\n this.name = \"SettlementError\";\n this.taskId = taskId;\n this.reason = reason;\n }\n}\n\n/** Error raised when a Task is not authorized to create or update a requested Change. */\nexport class ChangeAssociationError extends Error {\n readonly taskId: TaskId;\n readonly repositoryId: RepositoryId;\n readonly reason: string;\n\n constructor(taskId: TaskId, repositoryId: RepositoryId, reason: string) {\n super(`change for task \"${taskId}\" refused: ${reason}`);\n this.name = \"ChangeAssociationError\";\n this.taskId = taskId;\n this.repositoryId = repositoryId;\n this.reason = reason;\n }\n}\n\n/** Error raised when a stable outbox event ID is reused with different content. */\nexport class OutboxEventConflictError extends Error {\n constructor(eventId: string) {\n super(`outbox event \"${eventId}\" was reused with different content`);\n this.name = \"OutboxEventConflictError\";\n }\n}\n\n/** Error raised when a QuestionTask already has a different immutable answer event. */\nexport class AnswerEventConflictError extends Error {\n constructor(questionTaskId: TaskId) {\n super(`question \"${questionTaskId}\" already has a different answer event`);\n this.name = \"AnswerEventConflictError\";\n }\n}\n\n/** Normalized, authenticated input required to persist one inbound Signal. */\nexport interface CreateSignalInput {\n repositoryId: RepositoryId;\n source: SignalSource;\n deliveryId: string;\n replyTo: ReplyTo;\n payload: unknown;\n}\n\n/** Outcome and optional human-readable context for one Signal decision. */\nexport interface DecideSignalInput {\n readonly outcome: SignalOutcome;\n readonly detail?: string;\n readonly reason?: string;\n}\n\ninterface CreateTaskInputBase {\n repositoryIds: RepositoryIds;\n kind: Task[\"kind\"];\n replyTo: ReplyTo;\n /** Same key creates one task and returns it on workflow retries. */\n dedupeKey?: string;\n area?: string;\n changeId?: ChangeId;\n /** Stamp the task as needing a human decision before dispatch. */\n approval?: \"required\";\n /** Required explicit versioned workflow contract. */\n work: Task[\"work\"];\n /** Graph prerequisites that must succeed before this Task can run. */\n dependencies?: readonly TaskId[];\n}\n\n/** Provenance required when admitting a root Task with no parent to inherit from. */\nexport type RootTaskOrigin =\n | { signalId: SignalId; operator?: string }\n | { signalId?: SignalId; operator: string };\n\n/** Explicit work, graph placement, provenance, and policy input for Task admission. */\nexport type CreateTaskInput = CreateTaskInputBase &\n (\n | {\n origin: RootTaskOrigin;\n parentTaskId?: never;\n parentTaskAttempt?: never;\n question?: TaskQuestion;\n }\n | ({ origin: TaskOrigin; parentTaskId: TaskId } & (\n | { question?: undefined; parentTaskAttempt?: never }\n | { question: TaskQuestion; parentTaskAttempt?: number }\n ))\n );\n\nconst createTaskInputSchema = z.strictObject({\n repositoryIds: repositoryIdsSchema,\n kind: taskKindSchema,\n origin: taskOriginSchema,\n replyTo: replyToSchema,\n dedupeKey: z\n .string()\n .min(1)\n .refine((key) => key.trim().length > 0)\n .optional()\n .describe(\"Stable key for retryable task admission; omitted for one-shot creation.\"),\n area: z.string().min(1).optional(),\n changeId: changeIdSchema.optional(),\n question: taskQuestionSchema.optional(),\n approval: z.literal(\"required\").optional().describe(\"Require approval before execution.\"),\n work: taskWorkSchema,\n parentTaskId: taskIdSchema.optional(),\n parentTaskAttempt: z.number().int().positive().optional(),\n dependencies: taskGraphDependenciesSchema.optional(),\n});\n\n/** Authenticated operator and optional rationale for an immutable approval decision. */\nexport interface ApprovalDecision {\n /** Authenticated operator making the decision. */\n by: string;\n reason?: string;\n}\n\n/** Authenticated operator and required rationale for denying a Task approval. */\nexport interface RejectionDecision {\n /** Authenticated operator making the decision. */\n by: string;\n /** Human-readable reason retained on the immutable rejection receipt. */\n reason: string;\n}\n\n/** Authenticated answer submitted for one open QuestionTask. */\nexport interface AnswerQuestionInput {\n questionTaskId: TaskId;\n answer: string;\n answeredBy: string;\n}\n\n/** Persisted answer and affected question/parent Tasks after answering a question. */\nexport interface AnswerQuestionResult {\n readonly answerEvent: AnswerEvent;\n readonly questionTask: Task;\n readonly parentTask: Task | null;\n}\n\n/** Exclusive binding of a Factory interaction to a Task or provider execution. */\nexport type AgentSessionBinding =\n | { taskId: TaskId; execution?: never }\n | { execution: ExecutionReference; taskId?: never };\n\n/** Continuation Task, prompt context, and optional images cached on one Agent Session. */\nexport interface CacheContinuationContextInput {\n readonly taskId: TaskId;\n readonly context: string;\n readonly attachments?: readonly ImageAttachment[];\n}\n\n// settledUsd is deliberately excluded: it is written only by tasks.settle,\n// which is receipt-first. Setting it through a transition patch would settle a\n// task with no receipt, so it is rejected at runtime as well as in the type.\n// usage is excluded likewise; only recordUsage writes it.\n/** Lifecycle-transition fields that may be changed without bypassing settlement or usage APIs. */\nexport type TaskPatch = Partial<\n Pick<Task, \"changeId\" | \"reportRef\" | \"reservedUsd\" | \"reservedAt\" | \"question\">\n>;\n\n/** One completed model step's usage, as eve's step.completed event carries it. */\nconst stepUsageSchema = z.strictObject({\n turnId: z.string().min(1).describe(\"Provider turn containing the completed step.\"),\n stepIndex: z.number().int().nonnegative().describe(\"Nonnegative index of the completed step.\"),\n costUsd: usdSchema.optional().describe(\"Measured cost for this step.\"),\n inputTokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Input tokens charged for this step.\"),\n outputTokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Output tokens charged for this step.\"),\n cacheReadTokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Cached input tokens read for this step.\"),\n cacheWriteTokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Input tokens written to cache for this step.\"),\n});\n/** Measured usage for one completed provider turn step, used for idempotent accounting. */\nexport type StepUsage = z.infer<typeof stepUsageSchema>;\n\n/** Attempt and provider execution that must still own a Task usage observation. */\nexport interface TaskExecutionFence {\n readonly attempt: number;\n readonly execution: ExecutionReference;\n}\n\n/** Provider execution and optional attempt fence recorded on one running Task. */\nexport interface RecordTaskExecutionInput {\n readonly execution: ExecutionReference;\n readonly expectAttempt?: number;\n}\n\n/** One measured usage step and optional exact-execution fence for a Task. */\nexport interface RecordTaskUsageInput {\n readonly step: StepUsage;\n readonly fence?: TaskExecutionFence;\n}\n\ninterface TaskTransitionContext {\n patch?: TaskPatch;\n reason?: string;\n /** Classifies the transition receipt for lifecycle communication. */\n phase?: ReceiptPhase;\n /**\n * Refuse unless the task is in this state at write time. Closes\n * check-then-act races where the transition would also be legal from the\n * state a concurrent writer moved the task into.\n */\n expectFrom?: TaskState;\n /** Refuse late events from a previous execution attempt. */\n expectAttempt?: number;\n /** Refuse completion from a provider execution that has been replaced. */\n expectExecution?: ExecutionReference;\n /** Refuse cleanup or answers for a question that no longer blocks this task. */\n expectQuestionTaskId?: TaskId;\n}\n\n/** Destination-correlated data and concurrency fences for one Task transition. */\nexport type TaskTransitionOptions<To extends TaskState = TaskState> = To extends \"needs_human\"\n ? TaskTransitionContext & {\n /** Actionable description required whenever a Task enters needs_human. */\n needsHumanAction: string;\n /** Open child question required when the Task is not itself a QuestionTask. */\n questionTaskId?: TaskId;\n output?: never;\n reuseRecordedOutput?: never;\n }\n : To extends \"succeeded\"\n ? TaskTransitionContext &\n (\n | {\n /** Candidate output validated against the Task's exact workflow. */\n output: unknown;\n reuseRecordedOutput?: never;\n }\n | {\n output?: never;\n /** Explicitly finish with output already persisted by the work store. */\n reuseRecordedOutput: true;\n }\n ) & {\n needsHumanAction?: never;\n questionTaskId?: never;\n }\n : TaskTransitionContext & {\n output?: never;\n reuseRecordedOutput?: never;\n needsHumanAction?: never;\n questionTaskId?: never;\n };\n\n/** Argument tuple requiring destination-specific data only for constrained transitions. */\nexport type TaskTransitionArguments<To extends TaskState> = To extends \"needs_human\" | \"succeeded\"\n ? [options: TaskTransitionOptions<To>]\n : [options?: TaskTransitionOptions<To>];\n\n/** Pull-request identity, ownership, and initial trust evidence used to create a Change. */\nexport interface CreateChangeInput {\n repositoryId: RepositoryId;\n taskId?: TaskId;\n groupId?: TaskId;\n prNumber: number;\n prUrl: string;\n author: string;\n risk: ChangeLevel;\n confidence: ChangeLevel;\n evidence: Change[\"evidence\"];\n}\n\n/** Verification and merge fields that may accompany a legal Change transition. */\nexport type ChangePatch = Partial<\n Pick<Change, \"confidence\" | \"evidence\" | \"decidedBy\" | \"mergeSha\">\n>;\n\ninterface ChangeTransitionContext {\n patch?: ChangePatch;\n reason?: string;\n}\n\n/** Destination-correlated patch and audit reason accompanying a Change transition. */\nexport type ChangeTransitionOptions<To extends ChangeState = ChangeState> = To extends \"merged\"\n ? Omit<ChangeTransitionContext, \"patch\"> & {\n /** The merge actor must be recorded when a Change first enters its merged lifecycle. */\n patch: ChangePatch & { decidedBy: string };\n }\n : ChangeTransitionContext;\n\n/** Argument tuple requiring merge attribution for the transition into merged. */\nexport type ChangeTransitionArguments<To extends ChangeState> = To extends \"merged\"\n ? [options: ChangeTransitionOptions<To>]\n : [options?: ChangeTransitionOptions<To>];\n\n/** Factory, month, and configured limits used to create or refresh a monthly Budget. */\nexport interface EnsureBudgetInput {\n factoryId: FactoryId;\n month: BudgetMonth;\n limits: Budget[\"limits\"];\n}\n\n/** Monthly Budget returned with whether this call durably stamped a notice. */\nexport interface BudgetNoticeStampResult {\n readonly budget: Budget;\n readonly stamped: boolean;\n}\n\n/** Measured cost and optional audit reason used to settle one terminal Task. */\nexport interface SettleTaskInput {\n readonly cost: Cost;\n readonly reason?: string;\n}\n\n/** Delivery attempt, failure reason, and retry delay for one outbox message. */\nexport interface RetryOutboxMessageInput {\n readonly attempt: number;\n readonly reason: string;\n readonly delayMs: number;\n}\n\ninterface AppendReceiptInputBase<State extends ReceiptState, Kind extends ReceiptKind> {\n repositoryIds: RepositoryIds;\n taskId?: TaskId;\n changeId?: ChangeId;\n kind: Kind;\n state: State;\n reason?: string;\n attempt?: number;\n execution?: ExecutionReference;\n /** Same key twice appends one receipt and returns the existing one. */\n dedupeKey?: string;\n}\n\ntype AppendReceiptCost<State extends ReceiptState> = State extends \"settled\"\n ? { cost: Cost }\n : { cost?: never };\n\ntype AppendReceiptDelivery<Phase extends ReceiptPhase | undefined> = Phase extends \"communication\"\n ? { phase: Phase; delivery?: ReceiptDelivery }\n : { phase?: Phase; delivery?: never };\n\ntype AppendReceiptDecision<\n Kind extends ReceiptKind,\n State extends ReceiptState,\n> = Kind extends \"change\"\n ? { decidedBy?: string }\n : State extends \"approved\" | \"rejected\"\n ? { decidedBy?: string }\n : { decidedBy?: never };\n\ntype AppendReceiptCallInput<\n State extends ReceiptState,\n Kind extends ReceiptKind,\n Phase extends ReceiptPhase | undefined,\n> = AppendReceiptInputBase<State, Kind> &\n AppendReceiptCost<State> &\n AppendReceiptDelivery<Phase> &\n AppendReceiptDecision<Kind, State>;\n\n/** Subject, event, cost, and deduplication input for appending immutable audit evidence. */\nexport type AppendReceiptInput<\n State extends ReceiptState = StandardReceiptState,\n Kind extends ReceiptKind = StandardReceiptKind,\n Phase extends ReceiptPhase | undefined =\n | StandardReceiptPhase\n | \"communication\"\n | \"workflow\"\n | undefined,\n> = State extends ReceiptState\n ? Kind extends ReceiptKind\n ? Phase extends ReceiptPhase | undefined\n ? AppendReceiptInputBase<State, Kind> &\n AppendReceiptCost<State> &\n AppendReceiptDelivery<Phase> &\n AppendReceiptDecision<Kind, State>\n : never\n : never\n : never;\n\n/** Error raised when an idempotent session operation conflicts with its original intent. */\nexport class SessionConflictError extends Error {}\n\nfunction sameStoredValue(left: unknown, right: unknown): boolean {\n // JSON persistence omits optional undefined fields; admission retries must compare the persisted representation.\n return isDeepStrictEqual(JSON.parse(JSON.stringify(left)), JSON.parse(JSON.stringify(right)));\n}\n\n/**\n * Whether an operator's answer matches one of the question's declared\n * closing options (trimmed, case-insensitive). The asker judged that these\n * exact replies mean no further attempt can help, so answering with one\n * resolves the parent task instead of requeuing it for identical retry.\n */\nfunction isClosingAnswer(closingOptions: readonly string[] | undefined, answer: string): boolean {\n if (closingOptions === undefined || closingOptions.length === 0) return false;\n const normalized = answer.trim().toLowerCase();\n return closingOptions.some((option) => option.trim().toLowerCase() === normalized);\n}\n\n/** Validating engine API for all canonical Factory state and auxiliary persistence. */\nexport interface FactoryStores {\n driverName: string;\n /** Trusted workflow records bound to the same persistence backend as every validating store. */\n workflowRecords: Pick<StoreDriver, \"get\" | \"insert\" | \"update\">;\n /** Durable, task-scoped external-effect references and reconciliation stamps. */\n taskEffects: TaskEffectStore;\n /** Trusted workflow capabilities; application transports must authenticate and authorize callers. */\n graphs: TaskGraphStore;\n messages: TaskMessageStore;\n work: TaskWorkStore;\n transcripts: {\n get(execution: ExecutionReference): Promise<TranscriptSnapshot | null>;\n /** Persist only forward progress; safe to repeat from response-boundary hooks. */\n put(execution: ExecutionReference, snapshot: TranscriptSnapshot): Promise<TranscriptSnapshot>;\n };\n images: {\n put(owner: string, input: z.infer<typeof imageUploadSchema>): Promise<ImageAttachment>;\n get(owner: string, id: ImageId): Promise<StoredImage | null>;\n validate(\n owner: string,\n attachments: readonly ImageAttachment[],\n ): Promise<readonly ImageAttachment[]>;\n };\n sessions: {\n create(\n input: Omit<\n AgentSession,\n | \"schemaVersion\"\n | \"id\"\n | \"createdAt\"\n | \"execution\"\n | \"taskId\"\n | \"notifications\"\n | \"attached\"\n | \"continuations\"\n | \"external\"\n > & { operationId: string },\n ): Promise<AgentSession>;\n attachTask(input: {\n owner: string;\n taskId: TaskId;\n agent: string;\n message: string;\n }): Promise<AgentSession>;\n attachConversation(input: {\n owner: string;\n agent: string;\n message: string;\n execution: ExecutionReference;\n external: NonNullable<AgentSession[\"external\"]>;\n createdAt?: string;\n }): Promise<AgentSession>;\n cacheContinuationContext(\n id: AgentSessionId,\n input: CacheContinuationContextInput,\n ): Promise<string>;\n continue(\n id: AgentSessionId,\n input: {\n operationId: string;\n parentTaskId: TaskId;\n agent: string;\n message: string;\n attachments?: readonly ImageAttachment[];\n },\n ): Promise<AgentSession>;\n get(id: AgentSessionId): Promise<AgentSession | null>;\n list(): Promise<readonly AgentSession[]>;\n /** Compact session snapshots from fixed shards for discovery; large cached continuation context is omitted. */\n summaries(): Promise<readonly AgentSession[]>;\n bind(id: AgentSessionId, reference: AgentSessionBinding): Promise<AgentSession>;\n notify(event: CommunicationEvent): Promise<void>;\n };\n repositories: {\n put(repository: Repository): Promise<Repository>;\n get(id: RepositoryId): Promise<Repository | null>;\n list(): Promise<readonly Repository[]>;\n };\n signals: {\n create(input: CreateSignalInput): Promise<Signal>;\n get(id: SignalId): Promise<Signal | null>;\n beginTriage(id: SignalId, options: { expectedAttempt: number; by: string }): Promise<Signal>;\n updateTriage(\n id: SignalId,\n attempt: number,\n observation: Pick<SignalTriage, \"state\" | \"failure\" | \"sessionId\">,\n ): Promise<Signal>;\n decide(id: SignalId, input: DecideSignalInput): Promise<Signal>;\n list(): Promise<readonly Signal[]>;\n };\n tasks: {\n create(input: CreateTaskInput): Promise<Task>;\n get(id: TaskId): Promise<Task | null>;\n findOpenQuestions(replyTo: ReplyTo): Promise<readonly Task[]>;\n transition<To extends TaskState>(\n id: TaskId,\n to: To,\n ...args: TaskTransitionArguments<NoInfer<To>>\n ): Promise<Task>;\n /** Remove a receipt after its CommunicationEvent is durable in the outbox. */\n acknowledgeCommunication(id: TaskId, receiptId: ReceiptId): Promise<Task>;\n answerQuestion(input: AnswerQuestionInput): Promise<AnswerQuestionResult>;\n /** Grant a required approval. The task stays queued; dispatch may now take it. */\n approve(id: TaskId, decision: ApprovalDecision): Promise<Task>;\n /** Immutable human decision, addressed directly by Task ID. */\n approvalReceipt(id: TaskId): Promise<Receipt | null>;\n /** Deny a required approval. The task is cancelled with the reason. */\n reject(id: TaskId, decision: RejectionDecision): Promise<Task>;\n /**\n * Record the provider's handle on the running attempt's execution, so the\n * reconciler can inspect or cancel it. Refused unless the task is running.\n */\n recordExecution(id: TaskId, input: RecordTaskExecutionInput): Promise<Task>;\n /** Add one model step's usage to the task. Idempotent per (turnId, stepIndex). Never settles. */\n recordUsage(id: TaskId, input: RecordTaskUsageInput): Promise<Task>;\n /**\n * Record measured cost on a terminal task. Idempotent: an already settled\n * task returns unchanged and writes no second receipt.\n */\n settle(id: TaskId, input: SettleTaskInput): Promise<Task>;\n /**\n * Stamp a QuestionTask and the parent it currently blocks after Slack delivery.\n * An attempt guard rejects confirmations from an earlier question episode.\n * Retrying repairs either stamp independently; persistence errors propagate.\n */\n recordNeedsHumanDelivery(\n id: TaskId,\n options?: { at?: string; attempt?: number },\n ): Promise<Task>;\n /** Tasks addressed to one connector or operator conversation without a collection scan. */\n forReplyTo(replyTo: ReplyTo): Promise<readonly Task[]>;\n list(): Promise<readonly Task[]>;\n };\n changes: {\n create(input: CreateChangeInput): Promise<Change>;\n get(id: ChangeId): Promise<Change | null>;\n transition<To extends ChangeState>(\n id: ChangeId,\n to: To,\n ...args: ChangeTransitionArguments<NoInfer<To>>\n ): Promise<ChangeInState<To>>;\n list(): Promise<readonly Change[]>;\n };\n receipts: {\n append<\n const State extends ReceiptState,\n const Kind extends ReceiptKind,\n const Phase extends ReceiptPhase | undefined = undefined,\n >(\n input: AppendReceiptCallInput<State, Kind, Phase> & {\n state: State;\n kind: Kind;\n phase?: Phase;\n },\n ): Promise<Receipt>;\n get(id: ReceiptId): Promise<Receipt | null>;\n list(): Promise<readonly Receipt[]>;\n };\n budgets: {\n /**\n * Insert-once per month; refreshes limits when configuration changed and\n * preserves notices. Safe under concurrent sweeps.\n */\n ensure(input: EnsureBudgetInput): Promise<Budget>;\n get(month: BudgetMonth): Promise<Budget | null>;\n /**\n * Write-once notice stamp. `stamped` is false when the notice was already\n * set or a concurrent stamp won, so callers notify at most once.\n */\n stampNotice(\n month: BudgetMonth,\n notice: \"warning\" | \"exhausted\",\n ): Promise<BudgetNoticeStampResult>;\n };\n answers: {\n get(id: AnswerId): Promise<AnswerEvent | null>;\n };\n outbox: {\n enqueue(event: CommunicationEvent): Promise<OutboxMessage>;\n get(id: OutboxId): Promise<OutboxMessage | null>;\n claim(id: OutboxId, leaseMs?: number): Promise<OutboxMessage | null>;\n retry(id: OutboxId, input: RetryOutboxMessageInput): Promise<OutboxMessage | null>;\n complete(id: OutboxId, attempt: number): Promise<OutboxMessage | null>;\n pending(limit?: number): Promise<readonly OutboxMessage[]>;\n };\n}\n\n/** Persistence, workflow, messaging, clock, and wakeup configuration for the Factory engine. */\nexport interface CreateStoresOptions {\n driver: StoreDriver;\n /** Awaited post-commit wakeups. Canonical work remains recoverable if publishing fails. */\n workNotifications?: WorkNotifications;\n now?: IsoDateTimeClock;\n workflows?: WorkflowRegistry;\n messages?: {\n protocols: TaskMessageProtocols;\n authorize: TaskMessageAuthorize;\n };\n}\n\nconst taskReceiptStates: Partial<Record<TaskState, ReceiptState>> = {\n queued: \"queued\",\n running: \"dispatched\",\n stalled: \"stalled\",\n succeeded: \"succeeded\",\n failed: \"failed\",\n needs_human: \"needs_human\",\n cancelled: \"cancelled\",\n};\n\nfunction needsLifecycleCommunication(\n task: Task,\n state: ReceiptState,\n phase: ReceiptPhase | undefined,\n): boolean {\n if (state === \"needs_human\") return task.question !== undefined;\n if (task.parentTaskId !== undefined) return false;\n if (state === \"dispatched\") return phase === \"retry\";\n if (state === \"failed\" || state === \"cancelled\") return true;\n if (state !== \"succeeded\") return false;\n return task.question === undefined && task.changeId === undefined;\n}\n\nconst changeReceiptStates: Partial<Record<ChangeState, ReceiptState>> = {\n verifying: \"verifying\",\n ready: \"ready\",\n merged: \"merged\",\n deployed: \"deployed\",\n rolled_out: \"rolled_out\",\n rolled_back: \"rolled_back\",\n};\n\nfunction randomId<const Prefix extends string>(prefix: Prefix): `${Prefix}_${string}` {\n return `${prefix}_${randomUUID().replaceAll(\"-\", \"\")}`;\n}\n\nfunction derivedId<const Prefix extends string>(\n prefix: Prefix,\n key: string,\n): `${Prefix}_${string}` {\n return `${prefix}_${createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 32)}`;\n}\n\nfunction bumpsAttempt(from: TaskState, to: TaskState): boolean {\n return to === \"queued\" || (from === \"verifying\" && to === \"running\");\n}\n\nconst emptyUsage: TaskUsage = {\n costUsd: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n steps: {},\n};\n\nconst unverifiedEvidence: Change[\"evidence\"] = {\n reproVerified: false,\n testsAdded: 0,\n checksGreen: false,\n attackPassed: false,\n scopeMatches: false,\n};\n\n// Integer micro-dollars, the precision settle stores, so many small steps cannot drift.\nfunction addUsd(a: number, b: number): number {\n return (Math.round(a * 1_000_000) + Math.round(b * 1_000_000)) / 1_000_000;\n}\n\n// recordUsage and recordExecution are called far more often than a task\n// transitions (once per model step, once per launch), so a Blob outage that\n// briefly returns 5xx/network errors should not immediately drop usage or\n// lose the execution handle a healthy running task needs. Bounded by both\n// attempts and total elapsed time so a real outage still surfaces as a\n// failure instead of hanging the caller (an eve event hook or dispatch\n// cycle) indefinitely. Version conflicts are a different, already-retried\n// concern and are left untouched by this helper.\nconst TRANSIENT_RETRY_ATTEMPTS = 5;\nconst TRANSIENT_RETRY_BASE_MS = 200;\nconst TRANSIENT_RETRY_MAX_TOTAL_MS = 10_000;\n\n/**\n * Backs off and returns the next attempt count, or rethrows `error` once\n * the bound (attempts or total elapsed time) is reached.\n */\nasync function nextTransientRetry(\n error: TransientStoreError,\n attempt: number,\n startedAt: number,\n): Promise<number> {\n const nextDelayMs = TRANSIENT_RETRY_BASE_MS * 2 ** attempt;\n if (\n attempt >= TRANSIENT_RETRY_ATTEMPTS - 1 ||\n Date.now() - startedAt + nextDelayMs > TRANSIENT_RETRY_MAX_TOTAL_MS\n ) {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, nextDelayMs));\n return attempt + 1;\n}\n\n/** Creates the validating Factory store engine over a deliberately policy-free driver. */\nexport function createStores(options: CreateStoresOptions): FactoryStores {\n const { driver } = options;\n const now = options.now ?? (() => new Date().toISOString());\n const workflows = options.workflows ?? defineWorkflows([defaultTaskWorkflow]);\n const notifications = createWorkNotifier(options.workNotifications);\n\n function validateTaskWork(task: Task): void {\n workflows.validateStoredInput(task.work.workflow, task.work.input);\n if (task.workResult !== undefined)\n workflows.validateStoredOutput(task.work.workflow, task.workResult.output);\n }\n\n async function read<T>(\n collection: CollectionName,\n id: string,\n schema: ZodType<T>,\n ): Promise<{ value: T; version: number } | null> {\n const record = await driver.get(collection, id);\n if (record === null) {\n return null;\n }\n const value = schema.parse(record.value);\n if (collection === \"tasks\") {\n const task = taskSchema.parse(value);\n if (task.id !== id) throw new Error(`Task ${id} does not match its storage key`);\n validateTaskWork(task);\n }\n return { value, version: record.version };\n }\n\n async function mustRead<T>(\n collection: CollectionName,\n id: string,\n schema: ZodType<T>,\n ): Promise<{ value: T; version: number }> {\n const record = await read(collection, id, schema);\n if (record === null) {\n throw new RecordNotFoundError(collection, id);\n }\n return record;\n }\n\n async function listAll<T>(collection: CollectionName, schema: ZodType<T>): Promise<T[]> {\n const entries = await driver.list(collection);\n return entries.map((entry) => schema.parse(entry.record.value));\n }\n\n async function forEachConcurrent<T>(\n values: readonly T[],\n limit: number,\n operation: (value: T) => Promise<void>,\n ): Promise<void> {\n let next = 0;\n await Promise.all(\n Array.from({ length: Math.min(limit, values.length) }, async () => {\n while (next < values.length) await operation(values[next++]!);\n }),\n );\n }\n\n const catalogShards = \"0123456789abcdef\".split(\"\");\n const shardFor = (id: string) => createHash(\"sha256\").update(id).digest(\"hex\")[0]!;\n\n function sessionSummary(session: AgentSession): AgentSession {\n return agentSessionSchema.parse({\n ...session,\n continuations: session.continuations?.map(\n ({ context: _context, ...continuation }) => continuation,\n ),\n });\n }\n\n async function projectCatalogEntry<T extends { id: string }>(\n collection: \"taskCatalogs\" | \"changeCatalogs\" | \"sessionCatalogs\" | \"externalSessionCatalogs\",\n prefix: \"tasks\" | \"changes\" | \"sessions\" | \"external-sessions\",\n schema:\n | typeof taskCatalogSchema\n | typeof changeCatalogSchema\n | typeof sessionCatalogSchema\n | typeof externalSessionCatalogSchema,\n value: T,\n sourceVersion: number,\n ): Promise<void> {\n const id = `${prefix}-${shardFor(value.id)}`;\n for (;;) {\n const existing = await driver.get(collection, id);\n const parsed = existing === null ? null : schema.parse(existing.value);\n const previous = parsed?.entries.find((entry) => entry.value.id === value.id);\n const repairs =\n parsed?.repairs.filter(\n (repair) => repair.id !== value.id || repair.sourceVersion > sourceVersion,\n ) ?? [];\n if (\n previous !== undefined &&\n previous.sourceVersion >= sourceVersion &&\n repairs.length === parsed?.repairs.length\n )\n return;\n const entries =\n previous !== undefined && previous.sourceVersion >= sourceVersion\n ? (parsed?.entries ?? [])\n : [\n ...(parsed?.entries.filter((entry) => entry.value.id !== value.id) ?? []),\n { sourceVersion, value },\n ];\n const next = schema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n entries,\n repairs,\n updatedAt: now(),\n });\n try {\n if (existing === null) await driver.insert({ collection, id, value: next });\n else\n await driver.update({ collection, id, value: next, expectedVersion: existing.version });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n }\n\n const projectTaskCatalog = (value: Task, sourceVersion: number) =>\n projectCatalogEntry(\"taskCatalogs\", \"tasks\", taskCatalogSchema, value, sourceVersion);\n const projectChangeCatalog = (value: Change, sourceVersion: number) =>\n projectCatalogEntry(\"changeCatalogs\", \"changes\", changeCatalogSchema, value, sourceVersion);\n const projectSessionCatalog = (value: AgentSession, sourceVersion: number) =>\n projectCatalogEntry(\n \"sessionCatalogs\",\n \"sessions\",\n sessionCatalogSchema,\n sessionSummary(value),\n sourceVersion,\n );\n const projectExternalSessionCatalog = (value: AgentSession, sourceVersion: number) =>\n projectCatalogEntry(\n \"externalSessionCatalogs\",\n \"external-sessions\",\n externalSessionCatalogSchema,\n sessionSummary(value),\n sourceVersion,\n );\n\n async function markCatalogRepair(\n collection: \"taskCatalogs\" | \"changeCatalogs\" | \"sessionCatalogs\" | \"externalSessionCatalogs\",\n prefix: \"tasks\" | \"changes\" | \"sessions\" | \"external-sessions\",\n schema:\n | typeof taskCatalogSchema\n | typeof changeCatalogSchema\n | typeof sessionCatalogSchema\n | typeof externalSessionCatalogSchema,\n sourceId: string,\n sourceVersion: number,\n ): Promise<void> {\n const id = `${prefix}-${shardFor(sourceId)}`;\n for (;;) {\n const existing = await driver.get(collection, id);\n const parsed = existing === null ? null : schema.parse(existing.value);\n const previous = parsed?.repairs.find((repair) => repair.id === sourceId);\n if (previous !== undefined && previous.sourceVersion >= sourceVersion) return;\n const repairs = parsed?.repairs.filter((repair) => repair.id !== sourceId) ?? [];\n const next = schema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n entries: parsed?.entries ?? [],\n repairs: [...repairs, { id: sourceId, sourceVersion }],\n updatedAt: now(),\n });\n try {\n if (existing === null) await driver.insert({ collection, id, value: next });\n else\n await driver.update({ collection, id, value: next, expectedVersion: existing.version });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n }\n\n const markTaskCatalogRepair = (id: TaskId, sourceVersion: number) =>\n markCatalogRepair(\"taskCatalogs\", \"tasks\", taskCatalogSchema, id, sourceVersion);\n const markChangeCatalogRepair = (id: ChangeId, sourceVersion: number) =>\n markCatalogRepair(\"changeCatalogs\", \"changes\", changeCatalogSchema, id, sourceVersion);\n const markSessionCatalogRepair = (id: string, sourceVersion: number) =>\n markCatalogRepair(\"sessionCatalogs\", \"sessions\", sessionCatalogSchema, id, sourceVersion);\n const markExternalSessionCatalogRepair = (id: string, sourceVersion: number) =>\n markCatalogRepair(\n \"externalSessionCatalogs\",\n \"external-sessions\",\n externalSessionCatalogSchema,\n id,\n sourceVersion,\n );\n\n async function projectTaskRoute(value: Task, sourceVersion: number): Promise<void> {\n if (value.replyTo.channel !== \"api\") return;\n const id = derivedId(\n \"task-route\",\n JSON.stringify([value.replyTo.channel, value.replyTo.address]),\n );\n for (;;) {\n const existing = await read(\"taskRoutes\", id, taskRouteSchema);\n const previous = existing?.value.entries.find((entry) => entry.value.id === value.id);\n const repairs =\n existing?.value.repairs.filter(\n (repair) => repair.id !== value.id || repair.sourceVersion > sourceVersion,\n ) ?? [];\n if (\n previous !== undefined &&\n previous.sourceVersion >= sourceVersion &&\n repairs.length === existing?.value.repairs.length\n )\n return;\n const entries =\n previous !== undefined && previous.sourceVersion >= sourceVersion\n ? (existing?.value.entries ?? [])\n : [\n ...(existing?.value.entries.filter((entry) => entry.value.id !== value.id) ?? []),\n { sourceVersion, value },\n ];\n const next = taskRouteSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n replyTo: value.replyTo,\n entries,\n repairs,\n updatedAt: now(),\n });\n try {\n if (existing === null) await driver.insert({ collection: \"taskRoutes\", id, value: next });\n else\n await driver.update({\n collection: \"taskRoutes\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n }\n\n async function markTaskRouteRepair(value: Task, sourceVersion: number): Promise<void> {\n if (value.replyTo.channel !== \"api\") return;\n const id = derivedId(\n \"task-route\",\n JSON.stringify([value.replyTo.channel, value.replyTo.address]),\n );\n for (;;) {\n const existing = await read(\"taskRoutes\", id, taskRouteSchema);\n const previous = existing?.value.repairs.find((repair) => repair.id === value.id);\n if (previous !== undefined && previous.sourceVersion >= sourceVersion) return;\n const repairs = existing?.value.repairs.filter((repair) => repair.id !== value.id) ?? [];\n const next = taskRouteSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n replyTo: value.replyTo,\n entries: existing?.value.entries ?? [],\n repairs: [...repairs, { id: value.id, sourceVersion }],\n updatedAt: now(),\n });\n try {\n if (existing === null) await driver.insert({ collection: \"taskRoutes\", id, value: next });\n else\n await driver.update({\n collection: \"taskRoutes\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n }\n\n async function prepareTaskProjection(value: Task, sourceVersion: number): Promise<void> {\n await Promise.all([\n markTaskCatalogRepair(value.id, sourceVersion),\n markTaskRouteRepair(value, sourceVersion),\n ]);\n }\n\n async function projectTask(value: Task, sourceVersion: number): Promise<void> {\n await Promise.all([\n projectTaskCatalog(value, sourceVersion),\n projectTaskRoute(value, sourceVersion),\n ]);\n }\n\n // Projection repair markers are durable before the canonical write. Once\n // that write commits, readers can overlay and repair its canonical value,\n // so a projection outage does not turn success into a client retry.\n async function projectSafely(project: () => Promise<void>): Promise<void> {\n try {\n await project();\n } catch {\n return;\n }\n }\n\n async function catalogValues<T extends { id: string }>(\n source: \"tasks\" | \"changes\" | \"sessions\" | \"externalSessions\",\n collection: \"taskCatalogs\" | \"changeCatalogs\" | \"sessionCatalogs\" | \"externalSessionCatalogs\",\n prefix: \"tasks\" | \"changes\" | \"sessions\" | \"external-sessions\",\n sourceSchema: ZodType<T>,\n catalogSchema:\n | typeof taskCatalogSchema\n | typeof changeCatalogSchema\n | typeof sessionCatalogSchema\n | typeof externalSessionCatalogSchema,\n project: (value: T, sourceVersion: number) => Promise<void>,\n fallbackValue: (value: T) => T = (value) => value,\n ): Promise<T[]> {\n let catalogs = await Promise.all(\n catalogShards.map((shard) => driver.get(collection, `${prefix}-${shard}`)),\n );\n if (catalogs.some((catalog) => catalog === null)) {\n const entries = await driver.list(source);\n const values = entries.map((entry) => fallbackValue(sourceSchema.parse(entry.record.value)));\n let projectionFailed = false;\n await forEachConcurrent(entries, 16, async (entry) => {\n try {\n await project(sourceSchema.parse(entry.record.value), entry.record.version);\n } catch {\n projectionFailed = true;\n }\n });\n if (!projectionFailed) {\n for (const shard of catalogShards) {\n const id = `${prefix}-${shard}`;\n if ((await driver.get(collection, id)) !== null) continue;\n const empty = catalogSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n entries: [],\n updatedAt: now(),\n });\n try {\n await driver.insert({ collection, id, value: empty });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) projectionFailed = true;\n }\n }\n }\n if (projectionFailed) return values;\n catalogs = await Promise.all(\n catalogShards.map((shard) => driver.get(collection, `${prefix}-${shard}`)),\n );\n if (catalogs.some((catalog) => catalog === null)) return values;\n }\n const parsedCatalogs = catalogs.flatMap((catalog) =>\n catalog === null ? [] : [catalogSchema.parse(catalog.value)],\n );\n const values = new Map<string, T>();\n for (const catalog of parsedCatalogs) {\n for (const entry of catalog.entries) {\n const value = sourceSchema.parse(entry.value);\n values.set(value.id, value);\n }\n }\n const repairs = new Map<string, number>();\n for (const catalog of parsedCatalogs) {\n for (const repair of catalog.repairs) {\n repairs.set(repair.id, Math.max(repairs.get(repair.id) ?? 0, repair.sourceVersion));\n }\n }\n await forEachConcurrent([...repairs.keys()], 16, async (id) => {\n const record = await driver.get(source, id);\n if (record === null) {\n values.delete(id);\n return;\n }\n const canonical = sourceSchema.parse(record.value);\n values.set(id, fallbackValue(canonical));\n await projectSafely(() => project(canonical, record.version));\n });\n return [...values.values()];\n }\n\n async function updateTask(input: Task, expectedVersion: number): Promise<void> {\n const value = taskSchema.parse(input);\n validateTaskWork(value);\n const previous = options.workNotifications\n ? await mustRead(\"tasks\", value.id, storedTaskSchema)\n : null;\n await prepareTaskProjection(value, expectedVersion + 1);\n await driver.update({ collection: \"tasks\", id: value.id, value, expectedVersion });\n await projectSafely(() => projectTask(value, expectedVersion + 1));\n await notifications.task(value, previous?.value ?? null, expectedVersion + 1);\n }\n\n async function updateChange(value: Change, expectedVersion: number): Promise<void> {\n await markChangeCatalogRepair(value.id, expectedVersion + 1);\n await driver.update({ collection: \"changes\", id: value.id, value, expectedVersion });\n await projectSafely(() => projectChangeCatalog(value, expectedVersion + 1));\n }\n\n async function updateSession(value: AgentSession, expectedVersion: number): Promise<void> {\n await markSessionCatalogRepair(value.id, expectedVersion + 1);\n await driver.update({ collection: \"sessions\", id: value.id, value, expectedVersion });\n await projectSafely(() => projectSessionCatalog(value, expectedVersion + 1));\n }\n\n // Receipts are append-only and their inserts are idempotent: an existing id\n // returns the stored receipt instead of writing a second one. Transition\n // receipts use ids derived from their content key and are written before\n // the entity transition persists, so a failed write leaves the transition\n // unpersisted and a retry re-runs both.\n async function insertReceipt(\n receiptId: ReceiptId,\n receipt: Omit<Receipt, \"schemaVersion\" | \"receiptId\" | \"recordedAt\">,\n ): Promise<Receipt> {\n const reason = receipt.reason?.trim().slice(0, 2000) || undefined;\n const full = receiptSchema.parse({\n ...receipt,\n reason,\n schemaVersion: SCHEMA_VERSION,\n receiptId,\n recordedAt: now(),\n });\n try {\n await driver.insert({ collection: \"receipts\", id: receiptId, value: full });\n return full;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n const existing = await mustRead(\"receipts\", receiptId, receiptSchema);\n return existing.value;\n }\n throw error;\n }\n }\n\n async function readApprovalReceipt(task: Task): Promise<Receipt | null> {\n const current = await read(\n \"receipts\",\n derivedId(\"rcpt\", `task:${task.id}:approval`),\n receiptSchema,\n );\n if (current) return current.value;\n return null;\n }\n\n async function decideApproval(\n id: TaskId,\n state: \"approved\" | \"rejected\",\n decision: ApprovalDecision | RejectionDecision,\n ): Promise<Task> {\n const by = z.string().trim().min(1).parse(decision.by);\n const reason =\n state === \"rejected\"\n ? z.string().trim().min(1).max(2000).parse(decision.reason)\n : decision.reason?.trim().slice(0, 2000) || undefined;\n const receiptId = derivedId(\"rcpt\", `task:${id}:approval`);\n for (;;) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n const task = existing.value;\n const saved = await readApprovalReceipt(task);\n if (saved && (saved.state !== state || saved.decidedBy !== by || saved.reason !== reason)) {\n throw new ApprovalError(id, \"a different decision has already been recorded\");\n }\n const approval = state === \"approved\" ? \"granted\" : \"denied\";\n if (saved && task.approval === approval) {\n await projectSafely(() => projectTask(task, existing.version));\n return task;\n }\n if (task.approval !== \"required\")\n throw new ApprovalError(id, `approval is ${task.approval ?? \"not required\"}`);\n if (task.state !== \"queued\") throw new ApprovalError(id, `task is ${task.state}`);\n // A single immutable receipt arbitrates competing actors and opposite decisions before the Task projection.\n const receipt =\n saved ??\n (await insertReceipt(receiptId, {\n repositoryIds: task.repositoryIds,\n taskId: id,\n kind: task.kind,\n state,\n phase: \"approval\",\n reason,\n attempt: task.attempt,\n decidedBy: by,\n }));\n if (receipt.state !== state || receipt.decidedBy !== by || receipt.reason !== reason) {\n throw new ApprovalError(id, \"a different decision has already been recorded\");\n }\n if (state === \"rejected\") {\n assertTransition(taskTransitions, { from: task.state, to: \"cancelled\" });\n }\n let next = taskSchema.parse({\n ...task,\n approval,\n state: state === \"rejected\" ? \"cancelled\" : task.state,\n updatedAt: now(),\n });\n if (state === \"rejected\") {\n const cancelled = await appendReceipt(`task:${id}:cancelled:${task.attempt}`, {\n repositoryIds: task.repositoryIds,\n taskId: id,\n kind: task.kind,\n state: \"cancelled\",\n phase: \"approval\",\n reason: reason ?? `rejected by ${by}`,\n attempt: task.attempt,\n });\n if (needsLifecycleCommunication(next, \"cancelled\", \"approval\"))\n next = taskSchema.parse({\n ...next,\n pendingCommunicationReceiptIds: [\n ...new Set([...(next.pendingCommunicationReceiptIds ?? []), cancelled.receiptId]),\n ],\n });\n }\n try {\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n }\n\n async function appendReceipt(\n key: string,\n receipt: Omit<Receipt, \"schemaVersion\" | \"receiptId\" | \"recordedAt\">,\n ): Promise<Receipt> {\n return insertReceipt(derivedId(\"rcpt\", key), receipt);\n }\n\n async function setQuestionRoute(\n replyTo: ReplyTo,\n questionTaskId: TaskId,\n present: boolean,\n ): Promise<void> {\n const id = derivedId(\"qroute\", JSON.stringify([replyTo.channel, replyTo.address]));\n for (;;) {\n const existing = await read(\"questionRoutes\", id, questionRouteSchema);\n const currentIds = existing?.value.questionTaskIds ?? [];\n const questionTaskIds = present\n ? [...new Set([...currentIds, questionTaskId])]\n : currentIds.filter((candidate) => candidate !== questionTaskId);\n if (existing !== null && questionTaskIds.length === existing.value.questionTaskIds.length) {\n return;\n }\n const next = questionRouteSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n replyTo,\n questionTaskIds,\n updatedAt: now(),\n });\n try {\n if (existing === null)\n await driver.insert({ collection: \"questionRoutes\", id, value: next });\n else\n await driver.update({\n collection: \"questionRoutes\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError)) {\n throw error;\n }\n }\n }\n }\n\n const stores: FactoryStores = {\n driverName: driver.name,\n workflowRecords: {\n get: driver.get.bind(driver),\n insert: driver.insert.bind(driver),\n update: driver.update.bind(driver),\n },\n taskEffects: createTaskEffectStore({\n driver,\n now,\n getTask: (id: TaskId) => stores.tasks.get(id),\n }),\n graphs: createTaskGraphStore({\n driver,\n now,\n getTask: (id) => stores.tasks.get(id),\n validateTask: validateTaskWork,\n notify: notifications.publish,\n }),\n messages: createTaskMessageStore({\n driver,\n now: () => new Date(now()),\n getTask: (id: TaskId) => stores.tasks.get(id),\n protocols: options.messages?.protocols ?? defineTaskMessageProtocols([]),\n authorize: options.messages?.authorize ?? (() => false),\n notify: notifications.publish,\n }),\n work: createTaskWorkStore({\n driver,\n now,\n stores: () => stores,\n workflows,\n update: async (task, version) => {\n await updateTask(task, version);\n },\n restore: async (task) => {\n validateTaskWork(task);\n await prepareTaskProjection(task, 1);\n try {\n await driver.insert({ collection: \"tasks\", id: task.id, value: task });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n }\n const existing = await mustRead(\"tasks\", task.id, taskSchema);\n await projectSafely(() => projectTask(existing.value, existing.version));\n await notifications.task(existing.value, null, existing.version);\n return existing.value;\n },\n }),\n\n transcripts: {\n async get(execution) {\n const id = derivedId(\n \"transcript\",\n JSON.stringify([execution.provider, execution.sessionId]),\n );\n const record = await read(\"transcripts\", id, storedTranscriptSchema);\n if (record === null) return null;\n if (\n record.value.execution.provider !== execution.provider ||\n record.value.execution.sessionId !== execution.sessionId\n ) {\n throw new Error(\"Transcript execution key does not match its stored value\");\n }\n return record.value.snapshot;\n },\n async put(execution, value) {\n const snapshot = transcriptSnapshotSchema.parse(value);\n const id = derivedId(\n \"transcript\",\n JSON.stringify([execution.provider, execution.sessionId]),\n );\n for (;;) {\n const existing = await read(\"transcripts\", id, storedTranscriptSchema);\n if (existing !== null && existing.value.snapshot.cursor >= snapshot.cursor)\n return existing.value.snapshot;\n const next = storedTranscriptSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n execution,\n snapshot,\n updatedAt: now(),\n });\n try {\n if (existing === null)\n await driver.insert({ collection: \"transcripts\", id, value: next });\n else\n await driver.update({\n collection: \"transcripts\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return snapshot;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n },\n },\n\n images: {\n async put(owner, input) {\n const parsed = imageUploadSchema.parse(input);\n const id = imageIdSchema.parse(\n `img_${createHash(\"sha256\")\n .update(JSON.stringify([owner, parsed.filename, parsed.mediaType, parsed.base64]))\n .digest(\"hex\")}`,\n );\n const image = storedImageSchema.parse({\n ...parsed,\n id,\n owner,\n schemaVersion: SCHEMA_VERSION,\n size: Buffer.from(parsed.base64, \"base64\").length,\n createdAt: now(),\n });\n try {\n await driver.insert({ collection: \"images\", id, value: image });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n await stores.images.get(owner, id);\n }\n return imageAttachmentSchema.parse({\n id,\n filename: image.filename,\n mediaType: image.mediaType,\n size: image.size,\n });\n },\n async get(owner, id) {\n imageIdSchema.parse(id);\n const record = await driver.get(\"images\", id);\n if (!record) return null;\n const image = storedImageSchema.parse(record.value);\n return image.owner === owner ? image : null;\n },\n async validate(owner, attachments) {\n imageAttachmentsSchema.parse(attachments);\n return Promise.all(\n attachments.map(async (attachment) => {\n const image = await stores.images.get(owner, attachment.id);\n if (!image) throw new ImageInputError(\"Image is unavailable; upload it again\");\n const ref = {\n id: image.id,\n filename: image.filename,\n mediaType: image.mediaType,\n size: image.size,\n };\n if (!sameStoredValue(ref, attachment))\n throw new ImageInputError(\"Image metadata does not match the uploaded image\");\n return ref;\n }),\n );\n },\n },\n\n sessions: {\n async create({ operationId, ...input }) {\n if (operationId.trim().length === 0 || operationId.length > 200)\n throw new Error(\"operationId must contain 1–200 characters\");\n const id = derivedId(\"ses\", JSON.stringify([input.owner, operationId]));\n const candidate = storedSessionSchema.parse({\n ...input,\n id,\n schemaVersion: SCHEMA_VERSION,\n createdAt: now(),\n });\n await stores.images.validate(input.owner, input.attachments ?? []);\n await markSessionCatalogRepair(candidate.id, 1);\n try {\n await driver.insert({ collection: \"sessions\", id, value: candidate });\n await projectSafely(() => projectSessionCatalog(candidate, 1));\n return candidate;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const record = await mustRead(\"sessions\", id, storedSessionSchema);\n await projectSafely(() => projectSessionCatalog(record.value, record.version));\n const existing = record.value;\n const {\n createdAt: _at,\n execution: _execution,\n taskId: _task,\n notifications: _notifications,\n continuations: _continuations,\n ...intent\n } = existing;\n const { createdAt: _newAt, notifications: _newNotifications, ...nextIntent } = candidate;\n if (!sameStoredValue(intent, nextIntent))\n throw new SessionConflictError(\"Session operationId was reused with different input\");\n return existing;\n }\n },\n async attachConversation(input) {\n const id = derivedId(\n \"ses\",\n JSON.stringify([\n \"conversation\",\n input.owner,\n input.execution.provider,\n input.execution.sessionId,\n ]),\n );\n const candidate = externalSessionSchema.parse({\n ...input,\n id,\n schemaVersion: SCHEMA_VERSION,\n createdAt: input.createdAt ?? now(),\n });\n await markExternalSessionCatalogRepair(id, 1);\n try {\n await driver.insert({ collection: \"externalSessions\", id, value: candidate });\n await projectSafely(() => projectExternalSessionCatalog(candidate, 1));\n return candidate;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const record = await mustRead(\"externalSessions\", id, externalSessionSchema);\n const existing = record.value;\n if (\n existing.owner !== candidate.owner ||\n existing.agent !== candidate.agent ||\n !sameStoredValue(existing.external, candidate.external) ||\n !sameStoredValue(existing.execution, candidate.execution)\n )\n throw new SessionConflictError(\"External conversation binding cannot be replaced\");\n await projectSafely(() => projectExternalSessionCatalog(existing, record.version));\n return existing;\n }\n },\n async attachTask(input) {\n const task = (await mustRead(\"tasks\", input.taskId, storedTaskSchema)).value;\n if (task.repositoryIds.length !== 1) {\n throw new SessionConflictError(\"Only single-repository tasks can be opened\");\n }\n if (task.replyTo.channel === \"api\") {\n const original = await stores.sessions.get(\n agentSessionIdSchema.parse(task.replyTo.address),\n );\n if (original?.owner !== input.owner)\n throw new SessionConflictError(\"Task belongs to another operator interaction\");\n const record = await mustRead(\"sessions\", original.id, storedSessionSchema);\n await projectSafely(() => projectSessionCatalog(record.value, record.version));\n return original;\n }\n if (task.work.route === undefined) {\n throw new SessionConflictError(\"Only tasks with an exact agent route can be opened\");\n }\n const id = derivedId(\"ses\", JSON.stringify([\"task\", input.owner, task.id]));\n const candidate = storedSessionSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n owner: input.owner,\n agent: input.agent,\n route: task.work.route,\n repositoryId: task.repositoryIds[0],\n message: input.message,\n taskId: task.id,\n attached: true,\n createdAt: task.createdAt,\n });\n await markSessionCatalogRepair(candidate.id, 1);\n try {\n await driver.insert({ collection: \"sessions\", id, value: candidate });\n await projectSafely(() => projectSessionCatalog(candidate, 1));\n return candidate;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const existing = await mustRead(\"sessions\", id, storedSessionSchema);\n await projectSafely(() => projectSessionCatalog(existing.value, existing.version));\n return existing.value;\n }\n },\n async cacheContinuationContext(id, input) {\n const { taskId, context, attachments } = input;\n for (;;) {\n const record = await mustRead(\"sessions\", id, storedSessionSchema);\n const continuation = record.value.continuations?.find((item) => item.taskId === taskId);\n if (!continuation)\n throw new SessionConflictError(\"Task is not a conversation continuation\");\n if (continuation.context !== undefined) return continuation.context;\n await stores.images.validate(record.value.owner, attachments ?? []);\n const next = storedSessionSchema.parse({\n ...record.value,\n continuations: record.value.continuations?.map((item) =>\n item.taskId === taskId\n ? {\n ...item,\n context,\n ...(attachments?.length ? { contextAttachments: attachments } : {}),\n }\n : item,\n ),\n });\n try {\n await updateSession(next, record.version);\n return context;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async continue(id, input) {\n if (input.operationId.trim().length === 0 || input.operationId.length > 200)\n throw new SessionConflictError(\"operationId must contain 1–200 characters\");\n const dedupeKey = `session:${id}:follow-up:${input.operationId}`;\n for (;;) {\n const record = await mustRead(\"sessions\", id, storedSessionSchema);\n const session = record.value;\n await stores.images.validate(session.owner, input.attachments ?? []);\n if (session.repositoryId === undefined || session.taskId === undefined)\n throw new SessionConflictError(\n \"Follow-up work requires a repository-bound task conversation\",\n );\n const parent = (await mustRead(\"tasks\", input.parentTaskId, storedTaskSchema)).value;\n if (\n parent.id !== session.taskId &&\n !(parent.replyTo.channel === \"api\" && parent.replyTo.address === id)\n )\n throw new SessionConflictError(\"Follow-up parent is outside this conversation\");\n if (parent.repositoryIds.length !== 1 || parent.repositoryIds[0] !== session.repositoryId)\n throw new SessionConflictError(\"Follow-up repository differs from its conversation\");\n const previous = session.continuations?.find(\n (item) => item.operationId === input.operationId,\n );\n if (\n previous !== undefined &&\n !sameStoredValue(\n {\n operationId: input.operationId,\n parentTaskId: input.parentTaskId,\n agent: input.agent,\n message: input.message,\n attachments: input.attachments ?? [],\n },\n {\n operationId: previous.operationId,\n parentTaskId: previous.parentTaskId,\n agent: previous.agent,\n message: previous.message,\n attachments: previous.attachments ?? [],\n },\n )\n )\n throw new SessionConflictError(\"Follow-up operationId was reused with different input\");\n const continuation = previous ?? {\n ...input,\n taskId: derivedId(\"task\", JSON.stringify([\"task\", parent.id, dedupeKey])),\n createdAt: now(),\n };\n let next: AgentSession = session;\n if (previous === undefined) {\n if (![\"succeeded\", \"failed\", \"cancelled\", \"verifying\"].includes(parent.state))\n throw new SessionConflictError(\n \"Wait for this task or answer its pending question before starting a follow-up\",\n );\n const latest = session.continuations?.at(-1);\n if (latest !== undefined && latest.taskId !== parent.id) {\n let ancestor: Task | null = parent;\n const visited = new Set<string>();\n while (ancestor && ancestor.id !== latest.taskId && !visited.has(ancestor.id)) {\n visited.add(ancestor.id);\n ancestor = ancestor.parentTaskId\n ? await stores.tasks.get(ancestor.parentTaskId)\n : null;\n }\n if (ancestor?.id !== latest.taskId)\n throw new SessionConflictError(\n \"Conversation changed; refresh before sending another follow-up\",\n );\n const latestTask = await stores.tasks.get(latest.taskId);\n if (\n latestTask === null ||\n ![\"succeeded\", \"failed\", \"cancelled\"].includes(latestTask.state)\n )\n throw new SessionConflictError(\n \"A follow-up is already being started; refresh the conversation\",\n );\n }\n next = storedSessionSchema.parse({\n ...session,\n continuations: [...(session.continuations ?? []), continuation],\n });\n try {\n await updateSession(next, record.version);\n } catch (error) {\n if (error instanceof VersionConflictError) continue;\n throw error;\n }\n }\n const replyTo = { channel: \"api\", address: id };\n const signal = await stores.signals.create({\n repositoryId: session.repositoryId,\n source: \"api\",\n deliveryId: dedupeKey,\n replyTo,\n payload: { message: continuation.message, parentTaskId: parent.id },\n });\n if (signal.outcome === \"pending\") {\n try {\n await stores.signals.decide(signal.id, {\n outcome: \"accepted\",\n ...{\n reason: `Follow-up requested by ${session.owner}`,\n },\n });\n } catch (error) {\n if (\n !(error instanceof VersionConflictError || error instanceof InvalidTransitionError)\n )\n throw error;\n }\n }\n await stores.tasks.create({\n repositoryIds: [session.repositoryId],\n kind: \"investigation\",\n area: \"conversation\",\n origin: { operator: session.owner, signalId: signal.id },\n parentTaskId: parent.id,\n work: routeTaskWork({\n route: parseAgentRouteBinding({ id: \"conversation\", version: 1 }),\n title: \"Conversation follow-up\",\n input: { message: continuation.message },\n }),\n replyTo,\n dedupeKey,\n changeId: parent.changeId,\n });\n return next;\n }\n },\n async get(id) {\n const records = (\n await Promise.all([\n read(\"sessions\", id, storedSessionSchema),\n read(\"externalSessions\", id, externalSessionSchema),\n ])\n ).filter((record) => record !== null);\n if (records.length > 1)\n throw new SessionConflictError(\"Session ID exists in multiple collections\");\n return records[0]?.value ?? null;\n },\n async list() {\n return (\n await Promise.all([\n listAll(\"sessions\", storedSessionSchema),\n listAll(\"externalSessions\", externalSessionSchema),\n ])\n ).flat();\n },\n async summaries() {\n return (\n await Promise.all([\n catalogValues(\n \"sessions\",\n \"sessionCatalogs\",\n \"sessions\",\n storedSessionSchema,\n sessionCatalogSchema,\n projectSessionCatalog,\n sessionSummary,\n ),\n catalogValues(\n \"externalSessions\",\n \"externalSessionCatalogs\",\n \"external-sessions\",\n externalSessionSchema,\n externalSessionCatalogSchema,\n projectExternalSessionCatalog,\n sessionSummary,\n ),\n ])\n ).flat();\n },\n async bind(id, reference) {\n const external = await read(\"externalSessions\", id, externalSessionSchema);\n if (external) {\n if (\n !(\"execution\" in reference) ||\n !sameStoredValue(external.value.execution, reference.execution)\n )\n throw new SessionConflictError(\"Session execution binding cannot be replaced\");\n await projectSafely(() =>\n projectExternalSessionCatalog(external.value, external.version),\n );\n return external.value;\n }\n for (;;) {\n const existing = await mustRead(\"sessions\", id, storedSessionSchema);\n if (reference.taskId !== undefined) {\n const task = (await mustRead(\"tasks\", reference.taskId, storedTaskSchema)).value;\n if (\n task.origin.operator !== existing.value.owner ||\n task.replyTo.channel !== \"api\" ||\n task.replyTo.address !== id ||\n task.repositoryIds[0] !== existing.value.repositoryId\n ) {\n throw new SessionConflictError(\"Task does not belong to this session\");\n }\n }\n const previous =\n existing.value.taskId === undefined\n ? existing.value.execution === undefined\n ? undefined\n : { execution: existing.value.execution }\n : { taskId: existing.value.taskId };\n if (previous !== undefined) {\n if (!sameStoredValue(previous, reference))\n throw new SessionConflictError(\"Session execution binding cannot be replaced\");\n await projectSafely(() => projectSessionCatalog(existing.value, existing.version));\n return existing.value;\n }\n const next = storedSessionSchema.parse({ ...existing.value, ...reference });\n try {\n await updateSession(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async notify(input) {\n const event = communicationEventSchema.parse(input);\n if (event.replyTo.channel !== \"api\")\n throw new SessionConflictError(\"Expected an API notification\");\n for (;;) {\n const record = await mustRead(\"sessions\", event.replyTo.address, storedSessionSchema);\n const existing = record.value.notifications.find(\n (item) => item.eventId === event.eventId,\n );\n if (existing !== undefined) {\n if (!sameStoredValue(existing, event))\n throw new SessionConflictError(\"Notification eventId was reused\");\n return;\n }\n const next = storedSessionSchema.parse({\n ...record.value,\n notifications: [...record.value.notifications, event],\n });\n try {\n await updateSession(next, record.version);\n return;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n },\n\n repositories: {\n async put(repository) {\n const parsed = repositorySchema.parse(repository);\n const existing = await read(\"repositories\", parsed.id, repositorySchema);\n if (existing === null) {\n await driver.insert({ collection: \"repositories\", id: parsed.id, value: parsed });\n } else {\n await driver.update({\n collection: \"repositories\",\n id: parsed.id,\n value: parsed,\n expectedVersion: existing.version,\n });\n }\n return parsed;\n },\n async get(id) {\n const record = await read(\"repositories\", id, repositorySchema);\n return record === null ? null : record.value;\n },\n list() {\n return listAll(\"repositories\", repositorySchema);\n },\n },\n\n signals: {\n async create(input) {\n const id = derivedId(\"sig\", `${input.source}:${input.deliveryId}`);\n const signal = signalSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n repositoryId: input.repositoryId,\n source: input.source,\n deliveryId: input.deliveryId,\n replyTo: input.replyTo,\n payload: input.payload,\n receivedAt: now(),\n outcome: \"pending\",\n });\n try {\n await driver.insert({ collection: \"signals\", id, value: signal });\n return signal;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n return existing.value;\n }\n throw error;\n }\n },\n async get(id) {\n const record = await read(\"signals\", id, signalSchema);\n return record === null ? null : record.value;\n },\n async beginTriage(id, options) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n const current = existing.value;\n if (\n current.outcome !== \"pending\" ||\n (current.triage?.attempt ?? 0) !== options.expectedAttempt\n ) {\n throw new VersionConflictError(\"signals\", id, existing.version);\n }\n if (current.triage)\n assertTransition(signalTriageTransitions, { from: current.triage.state, to: \"running\" });\n const timestamp = now();\n const next = signalSchema.parse({\n ...current,\n triage: {\n attempt: options.expectedAttempt + 1,\n state: \"running\",\n by: options.by,\n startedAt: timestamp,\n updatedAt: timestamp,\n },\n });\n await driver.update({\n collection: \"signals\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return next;\n },\n async updateTriage(id, attempt, observation) {\n for (let retry = 0; retry < 5; retry++) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n const current = existing.value;\n const triage = current.triage;\n if (\n current.outcome !== \"pending\" ||\n triage?.attempt !== attempt ||\n triage.state === \"blocked\"\n )\n return current;\n if (\n triage.sessionId &&\n observation.sessionId &&\n triage.sessionId !== observation.sessionId\n )\n return current;\n if (triage.state !== observation.state)\n assertTransition(signalTriageTransitions, {\n from: triage.state,\n to: observation.state,\n });\n const next = signalSchema.parse({\n ...current,\n triage: {\n ...triage,\n ...observation,\n sessionId: observation.sessionId ?? triage.sessionId,\n updatedAt: now(),\n },\n });\n try {\n await driver.update({\n collection: \"signals\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError) || retry === 4) throw error;\n }\n }\n throw new Error(\"Triage update retries exhausted\");\n },\n async decide(id, input) {\n const { outcome, detail, reason } = input;\n const existing = await mustRead(\"signals\", id, signalSchema);\n assertTransition(signalOutcomeTransitions, {\n from: existing.value.outcome,\n to: outcome,\n });\n const next = signalSchema.parse({\n ...existing.value,\n outcome,\n detail,\n reason,\n decidedAt: now(),\n });\n await driver.update({\n collection: \"signals\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return next;\n },\n list() {\n return listAll(\"signals\", signalSchema);\n },\n },\n\n tasks: {\n async create(value) {\n const input = createTaskInputSchema.parse(value);\n const timestamp = now();\n const id =\n input.dedupeKey === undefined\n ? randomId(\"task\")\n : derivedId(\n \"task\",\n JSON.stringify([\"task\", input.parentTaskId ?? null, input.dedupeKey]),\n );\n const parsedWork = structuredClone(taskWorkSchema.parse(input.work));\n const work = {\n ...parsedWork,\n input: workflows.validateInput(parsedWork.workflow, parsedWork.input),\n };\n const parent =\n input.parentTaskId === undefined ? null : await stores.tasks.get(input.parentTaskId);\n if (input.parentTaskId !== undefined && parent === null) {\n throw new Error(\"Child Tasks require an existing parent\");\n }\n if (\n input.parentTaskAttempt !== undefined &&\n (parent === null ||\n input.question === undefined ||\n input.parentTaskAttempt !== parent.attempt)\n ) {\n throw new Error(\"Child questions must bind the current parent execution attempt\");\n }\n const origin = taskOriginSchema.parse(input.origin);\n let task = taskSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n repositoryIds: input.repositoryIds,\n kind: input.kind,\n area: input.area,\n state: taskInitialState,\n approval: input.approval,\n origin:\n origin.signalId === undefined && origin.operator === undefined && parent\n ? parent.origin\n : origin,\n work,\n rootTaskId: parent?.rootTaskId ?? id,\n parentTaskId: input.parentTaskId,\n parentTaskAttempt: input.question === undefined ? undefined : parent?.attempt,\n replyTo: input.replyTo,\n attempt: 1,\n question: input.question,\n changeId: input.changeId,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n validateTaskWork(task);\n await stores.graphs.admit({ task, dependencies: input.dependencies });\n const graph = await stores.graphs.get(task.rootTaskId);\n const admission = graph?.nodes.find((node) => node.taskId === id)?.admission;\n if (admission === undefined) throw new Error(`Task ${id} has no durable graph admission`);\n task = admission;\n await prepareTaskProjection(task, 1);\n try {\n await driver.insert({ collection: \"tasks\", id: task.id, value: task });\n await projectSafely(() => projectTask(task, 1));\n await notifications.task(task, null, 1);\n return task;\n } catch (error) {\n if (input.dedupeKey !== undefined && error instanceof RecordExistsError) {\n const existing = await mustRead(\"tasks\", task.id, storedTaskSchema);\n await projectSafely(() => projectTask(existing.value, existing.version));\n await notifications.task(existing.value, null, existing.version);\n return existing.value;\n }\n throw error;\n }\n },\n approve: (id, decision) => decideApproval(id, \"approved\", decision),\n reject: (id, decision) => decideApproval(id, \"rejected\", decision),\n async approvalReceipt(id) {\n return readApprovalReceipt((await mustRead(\"tasks\", id, storedTaskSchema)).value);\n },\n async recordExecution(id, input) {\n const { execution, expectAttempt } = input;\n // A transient Blob failure (5xx, network error) on either the read\n // or the write is retried here, bounded by attempts and elapsed\n // time: this is the only durable record of a running attempt's\n // execution handle, so losing it to a blip lets the reconciler\n // treat a healthy running task as unreachable. Version conflicts\n // are a different concern and are not retried here, unchanged.\n const startedAt = Date.now();\n for (let retries = 0; ;) {\n try {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n const task = existing.value;\n if (task.state !== \"running\") {\n throw new InvalidTransitionError(\n task.state,\n \"running\",\n legalNextStates(taskTransitions, task.state),\n );\n }\n if (expectAttempt !== undefined && task.attempt !== expectAttempt) {\n throw new Error(`task ${id} is on attempt ${task.attempt}, not ${expectAttempt}`);\n }\n if (expectAttempt !== undefined && task.execution) {\n if (!sameStoredValue(task.execution, execution))\n throw new Error(\n `Task ${id} already has a different execution for attempt ${expectAttempt}`,\n );\n return task;\n }\n const timestamp = now();\n const next = taskSchema.parse({\n ...task,\n execution,\n lastProgressAt: timestamp,\n updatedAt: timestamp,\n });\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof TransientStoreError)) throw error;\n retries = await nextTransientRetry(error, retries, startedAt);\n }\n }\n },\n async recordUsage(id, input) {\n const step = stepUsageSchema.parse(input.step);\n const { fence } = input;\n // A version conflict means another writer bumped the row, not that\n // this step was counted; retry until the mark shows it or we land.\n // A transient Blob failure (5xx, network error) is retried too, but\n // bounded by attempts and elapsed time so a real outage surfaces as\n // a failure instead of spinning forever; it does not change the\n // unbounded version-conflict retry above.\n const startedAt = Date.now();\n let transientAttempt = 0;\n for (;;) {\n let existing;\n try {\n existing = await mustRead(\"tasks\", id, storedTaskSchema);\n } catch (error) {\n if (!(error instanceof TransientStoreError)) throw error;\n transientAttempt = await nextTransientRetry(error, transientAttempt, startedAt);\n continue;\n }\n const task = existing.value;\n if (\n fence &&\n (task.attempt !== fence.attempt || !sameStoredValue(task.execution, fence.execution))\n ) {\n throw new Error(`Usage for task ${id} belongs to a replaced execution`);\n }\n const usage = task.usage ?? emptyUsage;\n const recordedIndex = Object.hasOwn(usage.steps, step.turnId)\n ? usage.steps[step.turnId]\n : undefined;\n if (\n task.settledUsd !== undefined &&\n (recordedIndex === undefined || step.stepIndex > recordedIndex)\n ) {\n throw new SettlementError(\n id,\n \"task is already settled; new usage cannot be silently added\",\n );\n }\n if (recordedIndex !== undefined && step.stepIndex <= recordedIndex) {\n await projectSafely(() => projectTask(task, existing.version));\n return task;\n }\n const timestamp = now();\n const next = taskSchema.parse({\n ...task,\n lastProgressAt: timestamp,\n usage: {\n costUsd: addUsd(usage.costUsd, step.costUsd ?? 0),\n inputTokens: usage.inputTokens + (step.inputTokens ?? 0),\n outputTokens: usage.outputTokens + (step.outputTokens ?? 0),\n cacheReadTokens: usage.cacheReadTokens + (step.cacheReadTokens ?? 0),\n cacheWriteTokens: usage.cacheWriteTokens + (step.cacheWriteTokens ?? 0),\n steps: { ...usage.steps, [step.turnId]: step.stepIndex },\n },\n updatedAt: timestamp,\n });\n try {\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (error instanceof VersionConflictError) {\n continue;\n }\n if (error instanceof TransientStoreError) {\n transientAttempt = await nextTransientRetry(error, transientAttempt, startedAt);\n continue;\n }\n throw error;\n }\n }\n },\n async settle(id, input) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n const task = existing.value;\n if (task.settledUsd !== undefined) {\n await projectSafely(() => projectTask(task, existing.version));\n return task;\n }\n if (task.state !== \"succeeded\" && task.state !== \"failed\" && task.state !== \"cancelled\") {\n throw new SettlementError(id, `task is ${task.state}, not terminal`);\n }\n // Validate before normalizing: arithmetic would coerce null or a\n // negative amount into a valid-looking zero, so the schema check must\n // see the raw input first. Then round to the ledger's micro-dollar\n // precision so the receipt and settledUsd carry the same value.\n const validated = costSchema.parse(input.cost);\n const normalized = { totalUsd: Math.round(validated.totalUsd * 1_000_000) / 1_000_000 };\n // The receipt is written first, keyed by task and attempt (not by\n // cost), and is immutable, so it is the authority: a retry after a\n // lost task write (a measured settlement, then the zero-settle sweep)\n // finds the first receipt and records THAT cost, keeping receipt and\n // settledUsd in agreement.\n let recorded = normalized;\n if (task.repositoryIds !== undefined) {\n const receipt = await appendReceipt(`task:${id}:settled:${task.attempt}`, {\n repositoryIds: task.repositoryIds,\n taskId: id,\n changeId: task.changeId,\n kind: task.kind,\n state: \"settled\",\n phase: \"budget\",\n reason: input.reason,\n attempt: task.attempt,\n cost: normalized,\n });\n recorded = receipt.cost ?? normalized;\n }\n const next = taskSchema.parse({ ...task, settledUsd: recorded.totalUsd, updatedAt: now() });\n await updateTask(next, existing.version);\n return next;\n },\n async get(id) {\n const record = await read(\"tasks\", id, storedTaskSchema);\n return record === null ? null : record.value;\n },\n async findOpenQuestions(replyTo) {\n const id = derivedId(\"qroute\", JSON.stringify([replyTo.channel, replyTo.address]));\n const route = await read(\"questionRoutes\", id, questionRouteSchema);\n if (route === null) return [];\n const questions = await Promise.all(\n route.value.questionTaskIds.map((taskId) => stores.tasks.get(taskId)),\n );\n const openQuestions = questions.filter(\n (task): task is Task =>\n task !== null &&\n task.question !== undefined &&\n task.state === \"needs_human\" &&\n task.replyTo.channel === replyTo.channel &&\n task.replyTo.address === replyTo.address,\n );\n const openIds = new Set(openQuestions.map((task) => task.id));\n for (const taskId of route.value.questionTaskIds) {\n if (!openIds.has(taskId)) {\n await setQuestionRoute(replyTo, taskId, false);\n }\n }\n return openQuestions;\n },\n async answerQuestion(input) {\n const question = await mustRead(\"tasks\", input.questionTaskId, storedTaskSchema);\n if (question.value.question === undefined) {\n throw new Error(`task ${input.questionTaskId} is not a question`);\n }\n if (question.value.state !== \"needs_human\" && question.value.state !== \"succeeded\") {\n throw new Error(\n `question task ${input.questionTaskId} is ${question.value.state}, not waiting`,\n );\n }\n const questionDetails = question.value.question;\n const id = answerIdSchema.parse(derivedId(\"ans\", input.questionTaskId));\n const candidate = answerEventSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n questionTaskId: input.questionTaskId,\n parentTaskId: question.value.parentTaskId,\n repositoryIds: question.value.repositoryIds,\n replyTo: question.value.replyTo,\n question: questionDetails.text,\n answer: input.answer,\n answeredBy: input.answeredBy,\n recordedAt: now(),\n });\n const answerOutput = jsonValueSchema.parse({\n answer: candidate.answer,\n answeredBy: candidate.answeredBy,\n questionTaskId: candidate.questionTaskId,\n });\n let answerEvent = candidate;\n try {\n await driver.insert({ collection: \"answers\", id, value: candidate });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const existing = await mustRead(\"answers\", id, answerEventSchema);\n const { recordedAt: _existingAt, ...existingIntent } = existing.value;\n const { recordedAt: _candidateAt, ...candidateIntent } = candidate;\n if (!isDeepStrictEqual(existingIntent, candidateIntent)) {\n throw new AnswerEventConflictError(input.questionTaskId);\n }\n answerEvent = existing.value;\n }\n\n let parentTask: Task | null = null;\n if (answerEvent.parentTaskId !== undefined) {\n parentTask = await stores.tasks.get(answerEvent.parentTaskId);\n if (parentTask === null) {\n throw new Error(`parent task ${answerEvent.parentTaskId} does not exist`);\n }\n for (;;) {\n const parent = await mustRead(\"tasks\", answerEvent.parentTaskId, storedTaskSchema);\n if (parent.value.answerEventIds?.includes(answerEvent.id) === true) {\n parentTask = parent.value;\n break;\n }\n const projected = taskSchema.parse({\n ...parent.value,\n answerEventIds: [...(parent.value.answerEventIds ?? []), answerEvent.id],\n updatedAt: now(),\n });\n try {\n await updateTask(projected, parent.version);\n parentTask = projected;\n break;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n if (\n parentTask.state === \"needs_human\" &&\n parentTask.questionTaskId === input.questionTaskId\n ) {\n const closes = isClosingAnswer(questionDetails.closingOptions, answerEvent.answer);\n parentTask = await stores.tasks.transition(\n parentTask.id,\n closes ? \"cancelled\" : \"queued\",\n {\n expectFrom: \"needs_human\",\n expectAttempt: parentTask.attempt,\n expectQuestionTaskId: input.questionTaskId,\n reason: closes\n ? `question ${answerEvent.questionTaskId} answered by ${answerEvent.answeredBy}: ${answerEvent.answer}`\n : `question ${answerEvent.questionTaskId} answered by ${answerEvent.answeredBy}`,\n },\n );\n }\n }\n\n let questionTask = await mustRead(\"tasks\", input.questionTaskId, storedTaskSchema).then(\n (record) => record.value,\n );\n if (questionTask.state === \"needs_human\") {\n questionTask = await stores.tasks.transition(questionTask.id, \"succeeded\", {\n patch: {\n question: {\n ...questionDetails,\n answer: answerEvent.answer,\n answeredBy: answerEvent.answeredBy,\n },\n },\n output: answerOutput,\n reason: \"question answered by authenticated operator\",\n });\n } else if (\n questionTask.state !== \"succeeded\" ||\n questionTask.question?.answer !== answerEvent.answer ||\n questionTask.question.answeredBy !== answerEvent.answeredBy\n ) {\n throw new Error(`question task ${questionTask.id} is ${questionTask.state}, not waiting`);\n }\n return { answerEvent, questionTask, parentTask };\n },\n async transition(id, to, ...args) {\n const transitionOptions = args[0] ?? {};\n if (transitionOptions.patch !== undefined && \"settledUsd\" in transitionOptions.patch) {\n throw new SettlementError(id, \"settledUsd is set only by settle, not a transition\");\n }\n if (transitionOptions.patch !== undefined && \"usage\" in transitionOptions.patch) {\n throw new SettlementError(id, \"usage is set only by recordUsage, not a transition\");\n }\n let existing = await mustRead(\"tasks\", id, storedTaskSchema);\n if (\n transitionOptions.expectFrom !== undefined &&\n existing.value.state !== transitionOptions.expectFrom\n ) {\n throw new InvalidTransitionError(\n existing.value.state,\n to,\n legalNextStates(taskTransitions, existing.value.state),\n );\n }\n if (\n transitionOptions.expectAttempt !== undefined &&\n existing.value.attempt !== transitionOptions.expectAttempt\n ) {\n throw new Error(\n `task ${id} is on attempt ${existing.value.attempt}, not ${transitionOptions.expectAttempt}`,\n );\n }\n if (\n transitionOptions.expectExecution !== undefined &&\n !sameStoredValue(existing.value.execution, transitionOptions.expectExecution)\n ) {\n throw new Error(`Task ${id} execution has been replaced`);\n }\n if (\n transitionOptions.expectQuestionTaskId !== undefined &&\n existing.value.questionTaskId !== transitionOptions.expectQuestionTaskId\n ) {\n throw new Error(\n `task ${id} is no longer waiting for question ${transitionOptions.expectQuestionTaskId}`,\n );\n }\n assertTransition(taskTransitions, { from: existing.value.state, to });\n if (\n transitionOptions.patch !== undefined &&\n Object.keys(transitionOptions.patch).some(\n (key) =>\n ![\"changeId\", \"reportRef\", \"reservedUsd\", \"reservedAt\", \"question\"].includes(key),\n )\n ) {\n throw new Error(\"Task transitions cannot replace workflow-owned fields\");\n }\n if (\n to !== \"succeeded\" &&\n (transitionOptions.output !== undefined || transitionOptions.reuseRecordedOutput === true)\n ) {\n throw new Error(\"Workflow output can only be recorded when succeeding\");\n }\n if (\n to === \"succeeded\" &&\n transitionOptions.output === undefined &&\n transitionOptions.reuseRecordedOutput !== true\n ) {\n throw new Error(\n \"Succeeded transitions require output or reuseRecordedOutput after work completion\",\n );\n }\n if (\n to === \"succeeded\" &&\n transitionOptions.output !== undefined &&\n transitionOptions.reuseRecordedOutput === true\n ) {\n throw new Error(\"Choose output or reuseRecordedOutput, not both\");\n }\n if (\n to !== \"needs_human\" &&\n (transitionOptions.needsHumanAction !== undefined ||\n transitionOptions.questionTaskId !== undefined)\n ) {\n throw new Error(\"Question context is only valid when entering needs_human\");\n }\n if (to === \"running\") {\n if (existing.value.approval !== undefined && existing.value.approval !== \"granted\") {\n throw new Error(`Task ${id} requires approval before execution`);\n }\n }\n const timestamp = now();\n let workResult = existing.value.workResult;\n if (to === \"succeeded\") {\n const output =\n transitionOptions.output === undefined\n ? existing.value.workResult?.output\n : workflows.validateOutput(existing.value.work.workflow, transitionOptions.output);\n if (output === undefined)\n throw new Error(`Task ${id} requires validated output to succeed`);\n if (\n existing.value.workResult &&\n !isDeepStrictEqual(existing.value.workResult.output, output)\n ) {\n throw new Error(`Task ${id} already recorded a different workflow output`);\n }\n workResult ??= { output, completedAt: timestamp };\n }\n if (to === \"stalled\" && existing.value.waitingForMessages) {\n throw new Error(`Task ${id} is waiting for messages, not stalled execution`);\n }\n if (bumpsAttempt(existing.value.state, to) && existing.value.settledUsd !== undefined) {\n throw new Error(\n `Task ${id} is settled; create new work rather than silently losing retry costs`,\n );\n }\n if (to === \"needs_human\" && existing.value.question === undefined) {\n if (transitionOptions.questionTaskId === undefined) {\n throw new Error(`task ${id} cannot enter needs_human without a QuestionTask id`);\n }\n const question = await mustRead(\n \"tasks\",\n transitionOptions.questionTaskId,\n storedTaskSchema,\n );\n if (\n question.value.question === undefined ||\n question.value.state !== \"needs_human\" ||\n question.value.parentTaskId !== id ||\n question.value.rootTaskId !== existing.value.rootTaskId ||\n question.value.parentTaskAttempt !== existing.value.attempt ||\n !sameStoredValue(question.value.replyTo, existing.value.replyTo)\n ) {\n throw new Error(\n `task ${id} cannot enter needs_human for question ${question.value.id}`,\n );\n }\n }\n // Every needs_human entry must carry a populated, actionable\n // reason a human can act on. This is enforced here (a direct read,\n // never inferred) as well as in the schema, so it is never possible\n // to persist a needs_human task without one.\n const needsHumanAction = transitionOptions.needsHumanAction?.trim();\n if (to === \"needs_human\" && (needsHumanAction === undefined || needsHumanAction === \"\")) {\n throw new Error(\n `task ${id} cannot enter needs_human without an actionable needsHumanAction`,\n );\n }\n const bumps = bumpsAttempt(existing.value.state, to);\n // A new attempt gets a new execution; stall stamps describe only the\n // stalled state; running starts the progress clock.\n const {\n stalledAt: _stalledAt,\n stalledReason: _stalledReason,\n questionTaskId: _questionTaskId,\n needsHumanAction: _needsHumanAction,\n needsHumanNotifiedAt: _needsHumanNotifiedAt,\n failureReceiptId: _failureReceiptId,\n ...cleared\n } = existing.value;\n let next = taskSchema.parse({\n ...cleared,\n workResult,\n ...(bumps ? { execution: undefined, workResult: undefined } : {}),\n waitingForMessages: undefined,\n ...transitionOptions.patch,\n ...(to === \"needs_human\" && existing.value.question === undefined\n ? { questionTaskId: transitionOptions.questionTaskId }\n : {}),\n ...(to === \"needs_human\" ? { needsHumanAction } : {}),\n ...(to === \"stalled\"\n ? { stalledAt: timestamp, stalledReason: transitionOptions.reason }\n : {}),\n ...(to === \"running\" ? { lastProgressAt: timestamp } : {}),\n state: to,\n attempt: bumps ? existing.value.attempt + 1 : existing.value.attempt,\n updatedAt: timestamp,\n });\n validateTaskWork(next);\n if (to === \"running\")\n await stores.graphs.seal({ rootTaskId: existing.value.rootTaskId, taskId: id });\n if (existing.value.question !== undefined && to === \"needs_human\") {\n await setQuestionRoute(existing.value.replyTo, existing.value.id, true);\n }\n await projectSafely(() => projectTask(existing.value, existing.version));\n if (to === \"succeeded\" && existing.value.workResult === undefined) {\n // Validate the full transition first, then persist canonical output before its receipt.\n const prepared = taskSchema.parse({\n ...existing.value,\n workResult: next.workResult,\n updatedAt: timestamp,\n });\n await updateTask(prepared, existing.version);\n existing = { value: prepared, version: existing.version + 1 };\n }\n const receiptState = taskReceiptStates[to];\n if (receiptState !== undefined && next.repositoryIds !== undefined) {\n // The key is derived from every receipt-bearing field of the\n // transition, so a crash retry of the same write dedupes while a\n // different intent (a different change or reason produced by a\n // later write at the same state and attempt) gets its own receipt.\n // A lost write's orphan receipt can never stand in for a different\n // one, so it cannot poison a genuine transition's evidence.\n const receipt = await appendReceipt(\n JSON.stringify([\n \"task\",\n id,\n receiptState,\n next.attempt,\n next.changeId ?? null,\n transitionOptions.phase ?? null,\n transitionOptions.reason ?? null,\n ]),\n {\n repositoryIds: next.repositoryIds,\n taskId: id,\n changeId: next.changeId,\n kind: next.kind,\n state: receiptState,\n phase: transitionOptions.phase,\n reason: transitionOptions.reason,\n attempt: next.attempt,\n execution: next.execution,\n },\n );\n if (to === \"failed\")\n next = taskSchema.parse({ ...next, failureReceiptId: receipt.receiptId });\n if (needsLifecycleCommunication(next, receiptState, transitionOptions.phase)) {\n next = taskSchema.parse({\n ...next,\n pendingCommunicationReceiptIds: [\n ...(next.pendingCommunicationReceiptIds ?? []),\n receipt.receiptId,\n ],\n });\n }\n }\n if (\n existing.value.question !== undefined &&\n existing.value.state === \"needs_human\" &&\n to !== \"needs_human\" &&\n existing.value.parentTaskId !== undefined\n ) {\n const parent = await stores.tasks.get(existing.value.parentTaskId);\n if (\n parent?.state === \"needs_human\" &&\n parent.questionTaskId === id &&\n parent.attempt === existing.value.parentTaskAttempt\n ) {\n await stores.tasks.transition(parent.id, \"queued\", {\n expectFrom: \"needs_human\",\n expectAttempt: parent.attempt,\n expectQuestionTaskId: id,\n reason: `question ${id} is no longer waiting`,\n });\n }\n }\n await updateTask(next, existing.version);\n if (\n existing.value.question !== undefined &&\n existing.value.state === \"needs_human\" &&\n to !== \"needs_human\"\n ) {\n await setQuestionRoute(existing.value.replyTo, existing.value.id, false);\n }\n return next;\n },\n async acknowledgeCommunication(id, receiptId) {\n for (;;) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n const pending = existing.value.pendingCommunicationReceiptIds ?? [];\n if (!pending.includes(receiptId)) {\n await projectSafely(() => projectTask(existing.value, existing.version));\n return existing.value;\n }\n const remaining = pending.filter((candidate) => candidate !== receiptId);\n const { pendingCommunicationReceiptIds: _pending, ...task } = existing.value;\n const next = taskSchema.parse({\n ...task,\n ...(remaining.length === 0 ? {} : { pendingCommunicationReceiptIds: remaining }),\n updatedAt: now(),\n });\n try {\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async recordNeedsHumanDelivery(id, deliveryOptions = {}) {\n const at = deliveryOptions.at ?? now();\n let question: Task;\n for (;;) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n if (existing.value.question === undefined)\n throw new Error(`task ${id} is not a QuestionTask`);\n if (\n existing.value.state !== \"needs_human\" ||\n (deliveryOptions.attempt !== undefined &&\n existing.value.attempt !== deliveryOptions.attempt)\n ) {\n return existing.value;\n }\n if (existing.value.needsHumanNotifiedAt !== undefined) {\n question = existing.value;\n break;\n }\n const next = taskSchema.parse({\n ...existing.value,\n needsHumanNotifiedAt: existing.value.needsHumanNotifiedAt ?? at,\n updatedAt: now(),\n });\n try {\n await updateTask(next, existing.version);\n question = next;\n break;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n const parentId = question.parentTaskId;\n if (parentId !== undefined) {\n for (;;) {\n const parent = await mustRead(\"tasks\", parentId, storedTaskSchema);\n if (\n parent.value.state !== \"needs_human\" ||\n parent.value.questionTaskId !== id ||\n parent.value.attempt !== question.parentTaskAttempt ||\n parent.value.needsHumanNotifiedAt !== undefined\n )\n break;\n // Read after the parent so any new wait also invalidates its CAS version.\n const current = await mustRead(\"tasks\", id, storedTaskSchema);\n if (current.value.state !== \"needs_human\" || current.value.attempt !== question.attempt)\n break;\n const next = taskSchema.parse({\n ...parent.value,\n needsHumanNotifiedAt: question.needsHumanNotifiedAt,\n updatedAt: now(),\n });\n try {\n await updateTask(next, parent.version);\n break;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n }\n return question;\n },\n async forReplyTo(replyTo) {\n const id = derivedId(\"task-route\", JSON.stringify([replyTo.channel, replyTo.address]));\n let route = await read(\"taskRoutes\", id, taskRouteSchema);\n let discovered: Task[] = [];\n if (route === null) {\n discovered = (await stores.tasks.list()).filter(\n (task) =>\n task.replyTo.channel === replyTo.channel && task.replyTo.address === replyTo.address,\n );\n for (const task of discovered) {\n const record = await mustRead(\"tasks\", task.id, storedTaskSchema);\n await projectSafely(() => projectTaskRoute(record.value, record.version));\n }\n if (discovered.length === 0) {\n const empty = taskRouteSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n replyTo,\n entries: [],\n updatedAt: now(),\n });\n await projectSafely(async () => {\n try {\n await driver.insert({ collection: \"taskRoutes\", id, value: empty });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n }\n });\n }\n route = await read(\"taskRoutes\", id, taskRouteSchema);\n }\n if (route === null) return discovered;\n const values = new Map(route.value.entries.map((entry) => [entry.value.id, entry.value]));\n await forEachConcurrent(route.value.repairs, 16, async (repair) => {\n const repairTaskId = taskIdSchema.parse(repair.id);\n const record = await driver.get(\"tasks\", repairTaskId);\n if (record === null) {\n values.delete(repairTaskId);\n return;\n }\n const canonical = storedTaskSchema.parse(record.value);\n if (\n canonical.replyTo.channel === replyTo.channel &&\n canonical.replyTo.address === replyTo.address\n )\n values.set(canonical.id, canonical);\n else values.delete(canonical.id);\n await projectSafely(() => projectTaskRoute(canonical, record.version));\n });\n const tasks = [...values.values()];\n for (const task of tasks) validateTaskWork(task);\n return tasks;\n },\n async list() {\n const tasks = await catalogValues(\n \"tasks\",\n \"taskCatalogs\",\n \"tasks\",\n storedTaskSchema,\n taskCatalogSchema,\n projectTaskCatalog,\n );\n for (const task of tasks) validateTaskWork(task);\n return tasks;\n },\n },\n\n changes: {\n async create(input) {\n const timestamp = now();\n const id = derivedId(\"chg\", `${input.repositoryId}:github-pr:${input.prNumber}`);\n const change = changeSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n repositoryId: input.repositoryId,\n taskId: input.taskId,\n groupId: input.groupId,\n prNumber: input.prNumber,\n prUrl: input.prUrl,\n author: input.author,\n risk: input.risk,\n confidence: input.confidence,\n evidence: input.evidence,\n state: changeInitialState,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n await mustRead(\"repositories\", change.repositoryId, repositorySchema);\n if (change.taskId !== undefined) {\n const task = (await mustRead(\"tasks\", change.taskId, storedTaskSchema)).value;\n const taskRepositoryId = task.repositoryIds[0];\n if (!task.repositoryIds.includes(change.repositoryId)) {\n throw new ChangeAssociationError(\n change.taskId,\n change.repositoryId,\n `repository \"${change.repositoryId}\" does not match task repository \"${taskRepositoryId}\"`,\n );\n }\n }\n await markChangeCatalogRepair(change.id, 1);\n try {\n await driver.insert({ collection: \"changes\", id: change.id, value: change });\n await projectSafely(() => projectChangeCatalog(change, 1));\n return change;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n const existing = await mustRead(\"changes\", change.id, changeSchema);\n await projectSafely(() => projectChangeCatalog(existing.value, existing.version));\n return existing.value;\n }\n throw error;\n }\n },\n async get(id) {\n const record = await read(\"changes\", id, changeSchema);\n return record === null ? null : record.value;\n },\n async transition(id, to, ...args) {\n const transitionOptions = args[0] ?? {};\n const existing = await mustRead(\"changes\", id, changeSchema);\n await projectSafely(() => projectChangeCatalog(existing.value, existing.version));\n assertTransition(changeTransitions, { from: existing.value.state, to });\n const invalidated = existing.value.state === \"ready\" && to === \"verifying\";\n const next = changeSchema.parse({\n ...existing.value,\n ...transitionOptions.patch,\n ...(invalidated ? { confidence: \"low\", evidence: unverifiedEvidence } : {}),\n state: to,\n updatedAt: now(),\n });\n const receiptState = changeReceiptStates[to];\n if (receiptState !== undefined) {\n await appendReceipt(`change:${id}:${receiptState}`, {\n repositoryIds: [next.repositoryId],\n taskId: next.taskId,\n changeId: id,\n kind: \"change\",\n state: receiptState,\n reason: transitionOptions.reason,\n attempt: 1,\n decidedBy: next.decidedBy,\n });\n }\n await updateChange(next, existing.version);\n return next as ChangeInState<typeof to>;\n },\n list() {\n return catalogValues(\n \"changes\",\n \"changeCatalogs\",\n \"changes\",\n changeSchema,\n changeCatalogSchema,\n projectChangeCatalog,\n );\n },\n },\n\n receipts: {\n append(input) {\n const { dedupeKey, attempt, ...fields } = input;\n const receiptId =\n dedupeKey === undefined ? randomId(\"rcpt\") : derivedId(\"rcpt\", `custom:${dedupeKey}`);\n return insertReceipt(receiptId, { ...fields, attempt: attempt ?? 1 });\n },\n async get(id) {\n const record = await read(\"receipts\", id, receiptSchema);\n return record === null ? null : record.value;\n },\n list() {\n return listAll(\"receipts\", receiptSchema);\n },\n },\n\n budgets: {\n async ensure(input) {\n const budget = budgetSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n factoryId: input.factoryId,\n month: input.month,\n limits: input.limits,\n notices: {},\n });\n try {\n await driver.insert({ collection: \"budgets\", id: input.month, value: budget });\n return budget;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) {\n throw error;\n }\n }\n const existing = await mustRead(\"budgets\", input.month, budgetSchema);\n const refreshed = budgetSchema.parse({ ...existing.value, limits: input.limits });\n if (JSON.stringify(refreshed) === JSON.stringify(existing.value)) {\n return existing.value;\n }\n try {\n await driver.update({\n collection: \"budgets\",\n id: input.month,\n value: refreshed,\n expectedVersion: existing.version,\n });\n return refreshed;\n } catch (error) {\n if (error instanceof VersionConflictError) {\n const latest = await mustRead(\"budgets\", input.month, budgetSchema);\n return latest.value;\n }\n throw error;\n }\n },\n async get(month) {\n const record = await read(\"budgets\", month, budgetSchema);\n return record === null ? null : record.value;\n },\n async stampNotice(month, notice) {\n const field = notice === \"warning\" ? \"warningAt\" : \"exhaustedAt\";\n // A version conflict does not mean this notice was stamped: a limits\n // refresh or the other notice also bumps the row. Retry until the\n // notice is actually present or our write lands, so `stamped: false`\n // always means \"someone else stamped it\" and the caller never\n // delivers a notice twice. The loop terminates because every conflict\n // proves another write completed, and the budget row receives only\n // notice stamps and limits refreshes.\n for (;;) {\n const existing = await mustRead(\"budgets\", month, budgetSchema);\n if (existing.value.notices[field] !== undefined) {\n return { budget: existing.value, stamped: false };\n }\n const next = budgetSchema.parse({\n ...existing.value,\n notices: { ...existing.value.notices, [field]: now() },\n });\n try {\n await driver.update({\n collection: \"budgets\",\n id: month,\n value: next,\n expectedVersion: existing.version,\n });\n return { budget: next, stamped: true };\n } catch (error) {\n if (!(error instanceof VersionConflictError)) {\n throw error;\n }\n }\n }\n },\n },\n answers: {\n async get(id) {\n const record = await read(\"answers\", id, answerEventSchema);\n return record?.value ?? null;\n },\n },\n outbox: {\n async enqueue(input) {\n const event = communicationEventSchema.parse(input);\n const id = outboxIdSchema.parse(derivedId(\"out\", event.eventId));\n const delivered = await read(\"outboxDeliveries\", id, outboxMessageSchema);\n if (delivered !== null) {\n if (!isDeepStrictEqual(delivered.value.event, event)) {\n throw new OutboxEventConflictError(event.eventId);\n }\n return delivered.value;\n }\n const queueId = `communication-${id.slice(4, 5)}`;\n for (;;) {\n const existing = await read(\"outboxQueues\", queueId, outboxQueueSchema);\n const duplicate = existing?.value.messages.find((message) => message.id === id);\n if (duplicate !== undefined) {\n if (!isDeepStrictEqual(duplicate.event, event)) {\n throw new OutboxEventConflictError(event.eventId);\n }\n return duplicate;\n }\n const timestamp = now();\n const message = outboxMessageSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n event,\n state: \"pending\",\n attempt: 0,\n availableAt: timestamp,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n const queue = outboxQueueSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id: queueId,\n messages: [...(existing?.value.messages ?? []), message],\n updatedAt: timestamp,\n });\n try {\n if (existing === null)\n await driver.insert({ collection: \"outboxQueues\", id: queueId, value: queue });\n else\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: queue,\n expectedVersion: existing.version,\n });\n return message;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError)) {\n throw error;\n }\n }\n }\n },\n async get(id) {\n const delivered = await read(\"outboxDeliveries\", id, outboxMessageSchema);\n if (delivered !== null) return delivered.value;\n const queueId = `communication-${id.slice(4, 5)}`;\n const queue = await read(\"outboxQueues\", queueId, outboxQueueSchema);\n return queue?.value.messages.find((message) => message.id === id) ?? null;\n },\n async claim(id, leaseMs = 60_000) {\n if (!Number.isSafeInteger(leaseMs) || leaseMs <= 0) {\n throw new Error(\"outbox leaseMs must be a positive safe integer\");\n }\n const queueId = `communication-${id.slice(4, 5)}`;\n for (;;) {\n const queue = await mustRead(\"outboxQueues\", queueId, outboxQueueSchema);\n const index = queue.value.messages.findIndex((message) => message.id === id);\n if (index < 0) return null;\n if ((await read(\"outboxDeliveries\", id, outboxMessageSchema)) !== null) {\n const messages = queue.value.messages.filter((message) => message.id !== id);\n try {\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: now() }),\n expectedVersion: queue.version,\n });\n return null;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n continue;\n }\n }\n const message = queue.value.messages[index]!;\n const timestamp = now();\n const eligible =\n (message.state === \"pending\" && message.availableAt <= timestamp) ||\n (message.state === \"delivering\" &&\n message.leaseUntil !== undefined &&\n message.leaseUntil <= timestamp);\n if (!eligible) return null;\n const next = outboxMessageSchema.parse({\n ...message,\n state: \"delivering\",\n attempt: message.attempt + 1,\n leaseUntil: new Date(Date.parse(timestamp) + leaseMs).toISOString(),\n updatedAt: timestamp,\n });\n const messages = [...queue.value.messages];\n messages[index] = next;\n try {\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n expectedVersion: queue.version,\n });\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async retry(id, input) {\n const { attempt, reason, delayMs } = input;\n if (!Number.isSafeInteger(delayMs) || delayMs < 0) {\n throw new Error(\"outbox delayMs must be a nonnegative safe integer\");\n }\n const queueId = `communication-${id.slice(4, 5)}`;\n for (;;) {\n const queue = await mustRead(\"outboxQueues\", queueId, outboxQueueSchema);\n const index = queue.value.messages.findIndex((message) => message.id === id);\n if (index < 0) return null;\n const message = queue.value.messages[index]!;\n if (message.state !== \"delivering\" || message.attempt !== attempt) return null;\n const timestamp = now();\n const { leaseUntil: _leaseUntil, ...leased } = message;\n const next = outboxMessageSchema.parse({\n ...leased,\n state: \"pending\",\n availableAt: new Date(Date.parse(timestamp) + delayMs).toISOString(),\n lastError: reason.trim().slice(0, 2000) || \"delivery failed\",\n updatedAt: timestamp,\n });\n const messages = [...queue.value.messages];\n messages[index] = next;\n try {\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n expectedVersion: queue.version,\n });\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async complete(id, attempt) {\n const queueId = `communication-${id.slice(4, 5)}`;\n let delivered = await read(\"outboxDeliveries\", id, outboxMessageSchema);\n for (;;) {\n const queue = await mustRead(\"outboxQueues\", queueId, outboxQueueSchema);\n const index = queue.value.messages.findIndex((message) => message.id === id);\n if (index < 0) return delivered?.value ?? null;\n const message = queue.value.messages[index]!;\n const timestamp = now();\n if (delivered === null) {\n if (message.state !== \"delivering\" || message.attempt !== attempt) return null;\n const { leaseUntil: _leaseUntil, lastError: _lastError, ...leased } = message;\n const next = outboxMessageSchema.parse({\n ...leased,\n state: \"delivered\",\n deliveredAt: timestamp,\n updatedAt: timestamp,\n });\n try {\n await driver.insert({ collection: \"outboxDeliveries\", id, value: next });\n delivered = { value: next, version: 1 };\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n delivered = await mustRead(\"outboxDeliveries\", id, outboxMessageSchema);\n if (!isDeepStrictEqual(delivered.value.event, message.event)) {\n throw new OutboxEventConflictError(message.event.eventId);\n }\n }\n }\n const messages = queue.value.messages.filter((candidate) => candidate.id !== id);\n try {\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n expectedVersion: queue.version,\n });\n return delivered.value;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async pending(limit = 100) {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"outbox pending limit must be a positive safe integer\");\n }\n const queues = await Promise.all(\n \"0123456789abcdef\"\n .split(\"\")\n .map((shard) => read(\"outboxQueues\", `communication-${shard}`, outboxQueueSchema)),\n );\n const timestamp = now();\n return queues\n .flatMap((queue) => queue?.value.messages ?? [])\n .filter(\n (message) =>\n (message.state === \"pending\" && message.availableAt <= timestamp) ||\n (message.state === \"delivering\" &&\n message.leaseUntil !== undefined &&\n message.leaseUntil <= timestamp),\n )\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt))\n .slice(0, limit);\n },\n },\n };\n return stores;\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { StoreDriver } from "./driver.mjs";
2
+ //#region src/store/memory.d.ts
3
+ /** Creates a process-local, non-durable StoreDriver for development and tests. */
4
+ declare function createInMemoryDriver(): StoreDriver;
5
+ //#endregion
6
+ export { createInMemoryDriver };
7
+ //# sourceMappingURL=memory.d.mts.map
@@ -0,0 +1,52 @@
1
+ import { RecordExistsError, RecordNotFoundError, VersionConflictError } from "./driver.mjs";
2
+ //#region src/store/memory.ts
3
+ /** Creates a process-local, non-durable StoreDriver for development and tests. */
4
+ function createInMemoryDriver() {
5
+ const collections = /* @__PURE__ */ new Map();
6
+ function collection(name) {
7
+ let existing = collections.get(name);
8
+ if (existing === void 0) {
9
+ existing = /* @__PURE__ */ new Map();
10
+ collections.set(name, existing);
11
+ }
12
+ return existing;
13
+ }
14
+ return {
15
+ name: "memory",
16
+ get(name, id) {
17
+ const record = collection(name).get(id);
18
+ return Promise.resolve(record === void 0 ? null : structuredClone(record));
19
+ },
20
+ insert({ collection: name, id, value }) {
21
+ const records = collection(name);
22
+ if (records.has(id)) return Promise.reject(new RecordExistsError(name, id));
23
+ records.set(id, {
24
+ value: structuredClone(value),
25
+ version: 1
26
+ });
27
+ return Promise.resolve();
28
+ },
29
+ update({ collection: name, id, value, expectedVersion }) {
30
+ const records = collection(name);
31
+ const existing = records.get(id);
32
+ if (existing === void 0) return Promise.reject(new RecordNotFoundError(name, id));
33
+ if (existing.version !== expectedVersion) return Promise.reject(new VersionConflictError(name, id, expectedVersion));
34
+ records.set(id, {
35
+ value: structuredClone(value),
36
+ version: existing.version + 1
37
+ });
38
+ return Promise.resolve();
39
+ },
40
+ list(name) {
41
+ const entries = [...collection(name)].map(([id, record]) => ({
42
+ id,
43
+ record: structuredClone(record)
44
+ }));
45
+ return Promise.resolve(entries);
46
+ }
47
+ };
48
+ }
49
+ //#endregion
50
+ export { createInMemoryDriver };
51
+
52
+ //# sourceMappingURL=memory.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.mjs","names":[],"sources":["../../src/store/memory.ts"],"sourcesContent":["import {\n RecordExistsError,\n RecordNotFoundError,\n VersionConflictError,\n type CollectionName,\n type StoredEntry,\n type StoredRecord,\n type StoreDriver,\n} from \"./driver\";\n\n/** Creates a process-local, non-durable StoreDriver for development and tests. */\nexport function createInMemoryDriver(): StoreDriver {\n const collections = new Map<CollectionName, Map<string, StoredRecord>>();\n\n function collection(name: CollectionName): Map<string, StoredRecord> {\n let existing = collections.get(name);\n if (existing === undefined) {\n existing = new Map();\n collections.set(name, existing);\n }\n return existing;\n }\n\n return {\n name: \"memory\",\n\n get(name, id) {\n const record = collection(name).get(id);\n return Promise.resolve(record === undefined ? null : structuredClone(record));\n },\n\n insert({ collection: name, id, value }) {\n const records = collection(name);\n if (records.has(id)) {\n return Promise.reject(new RecordExistsError(name, id));\n }\n records.set(id, { value: structuredClone(value), version: 1 });\n return Promise.resolve();\n },\n\n update({ collection: name, id, value, expectedVersion }) {\n const records = collection(name);\n const existing = records.get(id);\n if (existing === undefined) {\n return Promise.reject(new RecordNotFoundError(name, id));\n }\n if (existing.version !== expectedVersion) {\n return Promise.reject(new VersionConflictError(name, id, expectedVersion));\n }\n records.set(id, { value: structuredClone(value), version: existing.version + 1 });\n return Promise.resolve();\n },\n\n list(name) {\n const entries: StoredEntry[] = [...collection(name)].map(([id, record]) => ({\n id,\n record: structuredClone(record),\n }));\n return Promise.resolve(entries);\n },\n };\n}\n"],"mappings":";;;AAWA,SAAgB,uBAAoC;CAClD,MAAM,8BAAc,IAAI,IAA+C;CAEvE,SAAS,WAAW,MAAiD;EACnE,IAAI,WAAW,YAAY,IAAI,IAAI;EACnC,IAAI,aAAa,KAAA,GAAW;GAC1B,2BAAW,IAAI,IAAI;GACnB,YAAY,IAAI,MAAM,QAAQ;EAChC;EACA,OAAO;CACT;CAEA,OAAO;EACL,MAAM;EAEN,IAAI,MAAM,IAAI;GACZ,MAAM,SAAS,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE;GACtC,OAAO,QAAQ,QAAQ,WAAW,KAAA,IAAY,OAAO,gBAAgB,MAAM,CAAC;EAC9E;EAEA,OAAO,EAAE,YAAY,MAAM,IAAI,SAAS;GACtC,MAAM,UAAU,WAAW,IAAI;GAC/B,IAAI,QAAQ,IAAI,EAAE,GAChB,OAAO,QAAQ,OAAO,IAAI,kBAAkB,MAAM,EAAE,CAAC;GAEvD,QAAQ,IAAI,IAAI;IAAE,OAAO,gBAAgB,KAAK;IAAG,SAAS;GAAE,CAAC;GAC7D,OAAO,QAAQ,QAAQ;EACzB;EAEA,OAAO,EAAE,YAAY,MAAM,IAAI,OAAO,mBAAmB;GACvD,MAAM,UAAU,WAAW,IAAI;GAC/B,MAAM,WAAW,QAAQ,IAAI,EAAE;GAC/B,IAAI,aAAa,KAAA,GACf,OAAO,QAAQ,OAAO,IAAI,oBAAoB,MAAM,EAAE,CAAC;GAEzD,IAAI,SAAS,YAAY,iBACvB,OAAO,QAAQ,OAAO,IAAI,qBAAqB,MAAM,IAAI,eAAe,CAAC;GAE3E,QAAQ,IAAI,IAAI;IAAE,OAAO,gBAAgB,KAAK;IAAG,SAAS,SAAS,UAAU;GAAE,CAAC;GAChF,OAAO,QAAQ,QAAQ;EACzB;EAEA,KAAK,MAAM;GACT,MAAM,UAAyB,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,aAAa;IAC1E;IACA,QAAQ,gBAAgB,MAAM;GAChC,EAAE;GACF,OAAO,QAAQ,QAAQ,OAAO;EAChC;CACF;AACF"}
@@ -0,0 +1,38 @@
1
+ import { TaskId } from "../schema/id.mjs";
2
+ import { Task } from "../schema/task.mjs";
3
+ import { IsoDateTimeClock } from "../schema/common.mjs";
4
+ import { StoreDriver } from "./driver.mjs";
5
+ import { TaskEffect, TaskEffectKey, TaskEffectReference } from "../schema/task-effect.mjs";
6
+ //#region src/store/task-effects.d.ts
7
+ /** Persistence, clock, and Task lookup dependencies for the Task effect store. */
8
+ interface CreateTaskEffectStoreOptions {
9
+ driver: StoreDriver;
10
+ now: IsoDateTimeClock;
11
+ getTask: (id: TaskId) => Promise<Task | null>;
12
+ }
13
+ /** Task identity and namespaced key identifying one durable external effect. */
14
+ interface TaskEffectLookupInput {
15
+ readonly taskId: TaskId;
16
+ readonly key: TaskEffectKey;
17
+ }
18
+ /** Task-scoped effect key and first external-resource reference to record. */
19
+ interface RecordTaskEffectInput extends TaskEffectLookupInput {
20
+ readonly reference: TaskEffectReference;
21
+ }
22
+ /** Task-scoped effect key and optional explicit resolution timestamp. */
23
+ interface ResolveTaskEffectInput extends TaskEffectLookupInput {
24
+ readonly at?: string;
25
+ }
26
+ /** Durable, Task-scoped external-resource references and write-once resolution stamps. */
27
+ interface TaskEffectStore {
28
+ get(input: TaskEffectLookupInput): Promise<TaskEffect | null>;
29
+ /** Record the first external resource created for this key. Replays return that first record. */
30
+ record(input: RecordTaskEffectInput): Promise<TaskEffect>;
31
+ /** Stamp the effect resolved once, including when no external resource was found. */
32
+ resolve(input: ResolveTaskEffectInput): Promise<TaskEffect>;
33
+ }
34
+ /** Creates a CAS-protected store for idempotent Task effect reconciliation. */
35
+ declare function createTaskEffectStore(options: CreateTaskEffectStoreOptions): TaskEffectStore;
36
+ //#endregion
37
+ export { CreateTaskEffectStoreOptions, RecordTaskEffectInput, ResolveTaskEffectInput, TaskEffectLookupInput, TaskEffectStore, createTaskEffectStore };
38
+ //# sourceMappingURL=task-effects.d.mts.map