@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,97 @@
1
+ import { taskIdSchema } from "./id.mjs";
2
+ import { isoDateTimeSchema, schemaVersionSchema } from "./common.mjs";
3
+ import { taskSchema } from "./task.mjs";
4
+ import { z } from "zod";
5
+ //#region src/schema/task-graph.ts
6
+ /** Maximum number of Tasks admitted to one canonical root graph. */
7
+ const MAX_TASK_GRAPH_NODES = 256;
8
+ /** Maximum explicit dependencies allowed on one Task graph node. */
9
+ const MAX_TASK_GRAPH_DEPENDENCIES = 255;
10
+ /** Validates a bounded, duplicate-free list of canonical Task dependencies. */
11
+ const taskGraphDependenciesSchema = z.array(taskIdSchema).max(255).refine((ids) => new Set(ids).size === ids.length, "Duplicate dependencies are not allowed").describe("Distinct registered dependency Task IDs; at most 255, excluding self and relatives.").readonly();
12
+ /** Validates the immutable queued Task snapshot retained for creation recovery. */
13
+ const taskGraphAdmissionSchema = taskSchema.refine((task) => task.state === "queued", "Graph admission requires a queued creation snapshot").describe("Immutable queued Task creation snapshot, retained for interrupted creation recovery.");
14
+ /** Validates one Task's membership, ownership, dependencies, and admission intent. */
15
+ const taskGraphNodeSchema = z.strictObject({
16
+ taskId: taskIdSchema.describe("Task registered in this graph."),
17
+ parentTaskId: taskIdSchema.optional().describe("Single owning parent; absent only on the root."),
18
+ dependencies: taskGraphDependenciesSchema.describe("Current dependency edges, separate from the Task snapshot."),
19
+ sealed: z.boolean().describe("Dependencies permanently frozen at first execution admission, including failed launches; persisted explicitly on writes."),
20
+ admission: taskGraphAdmissionSchema,
21
+ admissionDependencies: taskGraphDependenciesSchema.describe("Immutable original admission dependencies used to compare creation retries.")
22
+ });
23
+ function hasCycle(edges) {
24
+ const incoming = new Map([...edges.keys()].map((id) => [id, 0]));
25
+ for (const targets of edges.values()) for (const id of targets) incoming.set(id, (incoming.get(id) ?? 0) + 1);
26
+ const ready = [...incoming].filter(([, count]) => count === 0).map(([id]) => id);
27
+ for (let index = 0; index < ready.length; index++) for (const id of edges.get(ready[index]) ?? []) {
28
+ const count = (incoming.get(id) ?? 0) - 1;
29
+ incoming.set(id, count);
30
+ if (count === 0) ready.push(id);
31
+ }
32
+ return ready.length !== edges.size;
33
+ }
34
+ /** Validates a bounded, acyclic canonical Task graph owned by one root Task. */
35
+ const taskGraphSchema = z.strictObject({
36
+ schemaVersion: schemaVersionSchema,
37
+ rootTaskId: taskIdSchema.describe("Root Task ID and directly addressed storage key."),
38
+ revision: z.number().int().positive().describe("Graph revision; starts at 1 and increments on every mutation."),
39
+ nodes: z.array(taskGraphNodeSchema).min(1).max(256).describe("Bounded graph membership, including its one root; at most 256 nodes.").readonly(),
40
+ createdAt: isoDateTimeSchema.describe("When the graph was first admitted."),
41
+ updatedAt: isoDateTimeSchema.describe("When graph membership or edges last changed.")
42
+ }).superRefine((graph, ctx) => {
43
+ const issue = (message) => ctx.addIssue({
44
+ code: "custom",
45
+ message
46
+ });
47
+ if (graph.nodes.length > 256) return;
48
+ const nodes = new Map(graph.nodes.map((node) => [node.taskId, node]));
49
+ if (nodes.size !== graph.nodes.length) issue("Duplicate Task membership is not allowed");
50
+ if (!nodes.has(graph.rootTaskId)) issue("Graph must contain its root Task");
51
+ const parents = /* @__PURE__ */ new Map();
52
+ for (const node of graph.nodes) {
53
+ const task = node.admission;
54
+ if (task.id !== node.taskId || task.rootTaskId !== graph.rootTaskId || task.parentTaskId !== node.parentTaskId) issue(`Task ${node.taskId} admission must match graph root and parent membership`);
55
+ parents.set(node.taskId, node.parentTaskId ? [node.parentTaskId] : []);
56
+ if (node.taskId === graph.rootTaskId) {
57
+ if (node.parentTaskId !== void 0) issue("Root Task cannot have a parent");
58
+ } else {
59
+ const parent = node.parentTaskId ? nodes.get(node.parentTaskId) : void 0;
60
+ if (!parent) issue(`Task ${node.taskId} requires a registered parent in the same graph`);
61
+ else if (!task.repositoryIds.every((id) => parent.admission.repositoryIds.includes(id))) issue(`Task ${node.taskId} repository scope must be a subset of its parent`);
62
+ }
63
+ }
64
+ if (hasCycle(parents)) {
65
+ issue("Parent tree contains a cycle or unknown parent");
66
+ return;
67
+ }
68
+ const ancestors = /* @__PURE__ */ new Map();
69
+ for (const node of graph.nodes) {
70
+ const ids = /* @__PURE__ */ new Set();
71
+ let parent = node.parentTaskId;
72
+ while (parent !== void 0 && !ids.has(parent)) {
73
+ ids.add(parent);
74
+ parent = nodes.get(parent)?.parentTaskId;
75
+ }
76
+ ancestors.set(node.taskId, ids);
77
+ }
78
+ for (const field of ["dependencies", "admissionDependencies"]) {
79
+ const edges = /* @__PURE__ */ new Map();
80
+ for (const node of graph.nodes) {
81
+ edges.set(node.taskId, [...node[field]]);
82
+ for (const dependency of node[field]) {
83
+ if (!nodes.has(dependency)) issue(`Unknown dependency ${dependency}; dependencies must be registered in the same graph`);
84
+ if (dependency === node.taskId) issue(`Task ${node.taskId} cannot depend on itself`);
85
+ if (ancestors.get(node.taskId)?.has(dependency) || ancestors.get(dependency)?.has(node.taskId)) issue(`Task ${node.taskId} cannot depend on an ancestor or descendant`);
86
+ }
87
+ }
88
+ if (field === "admissionDependencies") continue;
89
+ if (hasCycle(edges)) issue(`${field} contains a cycle or unknown dependency`);
90
+ for (const node of graph.nodes) if (node.parentTaskId) edges.get(node.parentTaskId)?.push(node.taskId);
91
+ if (hasCycle(edges)) issue(`${field} creates a dependency/parent waiting cycle`);
92
+ }
93
+ }).describe("Single per-root CAS record owning Task membership and dependency edges.");
94
+ //#endregion
95
+ export { MAX_TASK_GRAPH_DEPENDENCIES, MAX_TASK_GRAPH_NODES, taskGraphAdmissionSchema, taskGraphDependenciesSchema, taskGraphNodeSchema, taskGraphSchema };
96
+
97
+ //# sourceMappingURL=task-graph.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-graph.mjs","names":[],"sources":["../../src/schema/task-graph.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { isoDateTimeSchema, schemaVersionSchema } from \"./common\";\nimport { taskIdSchema } from \"./id\";\nimport { taskSchema } from \"./task\";\n\n/** Maximum number of Tasks admitted to one canonical root graph. */\nexport const MAX_TASK_GRAPH_NODES = 256;\n/** Maximum explicit dependencies allowed on one Task graph node. */\nexport const MAX_TASK_GRAPH_DEPENDENCIES = MAX_TASK_GRAPH_NODES - 1;\n\n/** Validates a bounded, duplicate-free list of canonical Task dependencies. */\nexport const taskGraphDependenciesSchema = z\n .array(taskIdSchema)\n .max(MAX_TASK_GRAPH_DEPENDENCIES)\n .refine((ids) => new Set(ids).size === ids.length, \"Duplicate dependencies are not allowed\")\n .describe(\"Distinct registered dependency Task IDs; at most 255, excluding self and relatives.\")\n .readonly();\n\n/** Validates the immutable queued Task snapshot retained for creation recovery. */\nexport const taskGraphAdmissionSchema = taskSchema\n .refine((task) => task.state === \"queued\", \"Graph admission requires a queued creation snapshot\")\n .describe(\"Immutable queued Task creation snapshot, retained for interrupted creation recovery.\");\n\n/** Validates one Task's membership, ownership, dependencies, and admission intent. */\nexport const taskGraphNodeSchema = z.strictObject({\n taskId: taskIdSchema.describe(\"Task registered in this graph.\"),\n parentTaskId: taskIdSchema.optional().describe(\"Single owning parent; absent only on the root.\"),\n dependencies: taskGraphDependenciesSchema.describe(\n \"Current dependency edges, separate from the Task snapshot.\",\n ),\n sealed: z\n .boolean()\n .describe(\n \"Dependencies permanently frozen at first execution admission, including failed launches; persisted explicitly on writes.\",\n ),\n admission: taskGraphAdmissionSchema,\n admissionDependencies: taskGraphDependenciesSchema.describe(\n \"Immutable original admission dependencies used to compare creation retries.\",\n ),\n});\n\n/** Canonical graph membership and dependency record for one Task. */\nexport type TaskGraphNode = z.infer<typeof taskGraphNodeSchema>;\n\nfunction hasCycle(edges: ReadonlyMap<string, readonly string[]>): boolean {\n const incoming = new Map([...edges.keys()].map((id) => [id, 0]));\n for (const targets of edges.values()) {\n for (const id of targets) incoming.set(id, (incoming.get(id) ?? 0) + 1);\n }\n const ready = [...incoming].filter(([, count]) => count === 0).map(([id]) => id);\n for (let index = 0; index < ready.length; index++) {\n for (const id of edges.get(ready[index]) ?? []) {\n const count = (incoming.get(id) ?? 0) - 1;\n incoming.set(id, count);\n if (count === 0) ready.push(id);\n }\n }\n return ready.length !== edges.size;\n}\n\n/** Validates a bounded, acyclic canonical Task graph owned by one root Task. */\nexport const taskGraphSchema = z\n .strictObject({\n schemaVersion: schemaVersionSchema,\n rootTaskId: taskIdSchema.describe(\"Root Task ID and directly addressed storage key.\"),\n revision: z\n .number()\n .int()\n .positive()\n .describe(\"Graph revision; starts at 1 and increments on every mutation.\"),\n nodes: z\n .array(taskGraphNodeSchema)\n .min(1)\n .max(MAX_TASK_GRAPH_NODES)\n .describe(\"Bounded graph membership, including its one root; at most 256 nodes.\")\n .readonly(),\n createdAt: isoDateTimeSchema.describe(\"When the graph was first admitted.\"),\n updatedAt: isoDateTimeSchema.describe(\"When graph membership or edges last changed.\"),\n })\n .superRefine((graph, ctx) => {\n const issue = (message: string) => ctx.addIssue({ code: \"custom\", message });\n // Stop before graph traversal if a persisted record exceeds the explicit bound.\n if (graph.nodes.length > MAX_TASK_GRAPH_NODES) return;\n const nodes = new Map(graph.nodes.map((node) => [node.taskId, node]));\n if (nodes.size !== graph.nodes.length) issue(\"Duplicate Task membership is not allowed\");\n if (!nodes.has(graph.rootTaskId)) issue(\"Graph must contain its root Task\");\n const parents = new Map<string, string[]>();\n for (const node of graph.nodes) {\n const task = node.admission;\n if (\n task.id !== node.taskId ||\n task.rootTaskId !== graph.rootTaskId ||\n task.parentTaskId !== node.parentTaskId\n ) {\n issue(`Task ${node.taskId} admission must match graph root and parent membership`);\n }\n parents.set(node.taskId, node.parentTaskId ? [node.parentTaskId] : []);\n if (node.taskId === graph.rootTaskId) {\n if (node.parentTaskId !== undefined) issue(\"Root Task cannot have a parent\");\n } else {\n const parent = node.parentTaskId ? nodes.get(node.parentTaskId) : undefined;\n if (!parent) issue(`Task ${node.taskId} requires a registered parent in the same graph`);\n else if (!task.repositoryIds.every((id) => parent.admission.repositoryIds.includes(id))) {\n issue(`Task ${node.taskId} repository scope must be a subset of its parent`);\n }\n }\n }\n if (hasCycle(parents)) {\n issue(\"Parent tree contains a cycle or unknown parent\");\n return;\n }\n const ancestors = new Map<string, Set<string>>();\n for (const node of graph.nodes) {\n const ids = new Set<string>();\n let parent = node.parentTaskId;\n while (parent !== undefined && !ids.has(parent)) {\n ids.add(parent);\n parent = nodes.get(parent)?.parentTaskId;\n }\n ancestors.set(node.taskId, ids);\n }\n for (const field of [\"dependencies\", \"admissionDependencies\"] as const) {\n const edges = new Map<string, string[]>();\n for (const node of graph.nodes) {\n edges.set(node.taskId, [...node[field]]);\n for (const dependency of node[field]) {\n if (!nodes.has(dependency))\n issue(\n `Unknown dependency ${dependency}; dependencies must be registered in the same graph`,\n );\n if (dependency === node.taskId) issue(`Task ${node.taskId} cannot depend on itself`);\n if (\n ancestors.get(node.taskId)?.has(dependency) ||\n ancestors.get(dependency)?.has(node.taskId)\n ) {\n issue(`Task ${node.taskId} cannot depend on an ancestor or descendant`);\n }\n }\n }\n // Historical admission edges are retry evidence, not simultaneous active waits.\n if (field === \"admissionDependencies\") continue;\n if (hasCycle(edges)) issue(`${field} contains a cycle or unknown dependency`);\n // Parents may wait for children: include those implicit waits to reject cross-subtree deadlocks.\n for (const node of graph.nodes) {\n if (node.parentTaskId) edges.get(node.parentTaskId)?.push(node.taskId);\n }\n if (hasCycle(edges)) issue(`${field} creates a dependency/parent waiting cycle`);\n }\n })\n .describe(\"Single per-root CAS record owning Task membership and dependency edges.\");\n\n/** Directly addressed CAS snapshot owning one root's Task membership and dependencies. */\nexport type TaskGraph = z.infer<typeof taskGraphSchema>;\n"],"mappings":"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"}
@@ -0,0 +1,254 @@
1
+ import { JsonValue } from "./work.mjs";
2
+ import { z } from "zod";
3
+ //#region src/schema/task-message.d.ts
4
+ /** Maximum number of unacknowledged envelopes retained in one Task inbox. */
5
+ declare const MAX_TASK_INBOX_PENDING = 256;
6
+ /** Validates the content-derived identity of an immutable Task message. */
7
+ declare const taskMessageIdSchema: z.ZodType<`msg_${string}`, string>;
8
+ /** Validates an exact registered Task-message protocol identity and version. */
9
+ declare const taskMessageProtocolBindingSchema: z.core.$ZodBranded<z.ZodObject<{
10
+ id: z.ZodString;
11
+ version: z.ZodNumber;
12
+ }, z.core.$strict>, "TaskMessageProtocolBinding", "out">;
13
+ declare const taskMessagePayloadType: unique symbol;
14
+ declare const taskMessageStoredPayloadType: unique symbol;
15
+ /** Exact Task-message protocol identity carrying its accepted and canonical stored payload types. */
16
+ type TaskMessageProtocolBinding<Payload extends JsonValue = JsonValue, Id extends string = string, Version extends number = number, StoredPayload extends JsonValue = Payload> = z.infer<typeof taskMessageProtocolBindingSchema> & {
17
+ readonly id: Id;
18
+ readonly version: Version;
19
+ readonly [taskMessagePayloadType]?: Payload;
20
+ readonly [taskMessageStoredPayloadType]?: StoredPayload;
21
+ };
22
+ /** Plain identifier and version accepted when constructing a Task-message protocol binding. */
23
+ interface TaskMessageProtocolBindingInput<Id extends string = string, Version extends number = number> {
24
+ readonly id: Id;
25
+ readonly version: Version;
26
+ }
27
+ /** Validates and brands an exact Task-message protocol binding while preserving literal identity. */
28
+ declare function parseTaskMessageProtocolBinding<const Input extends TaskMessageProtocolBindingInput>(input: Input): TaskMessageProtocolBinding<JsonValue, Input["id"], Input["version"]>;
29
+ /** Validates a stable caller operation identity scoped to one source Task. */
30
+ declare const taskMessageOperationIdSchema: z.ZodString;
31
+ /** Validates an application-authenticated principal and optional trusted Task binding. */
32
+ declare const taskMessagePrincipalSchema: z.ZodObject<{
33
+ id: z.ZodString;
34
+ taskId: z.ZodOptional<z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>>;
35
+ }, z.core.$strict>;
36
+ /** Validates an idempotent, attempt-fenced request to send a Task message. */
37
+ declare const sendTaskMessageInputSchema: z.ZodObject<{
38
+ operationId: z.ZodString;
39
+ fromTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
40
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
41
+ type: z.core.$ZodBranded<z.ZodObject<{
42
+ id: z.ZodString;
43
+ version: z.ZodNumber;
44
+ }, z.core.$strict>, "TaskMessageProtocolBinding", "out">;
45
+ payload: z.ZodCustom<JsonValue, JsonValue>;
46
+ causationId: z.ZodOptional<z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>>;
47
+ expectAttempt: z.ZodNumber;
48
+ }, z.core.$strict>;
49
+ /** Validates an immutable, protocol-versioned Task message envelope. */
50
+ declare const taskMessageSchema: z.ZodObject<{
51
+ operationId: z.ZodString;
52
+ fromTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
53
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
54
+ type: z.core.$ZodBranded<z.ZodObject<{
55
+ id: z.ZodString;
56
+ version: z.ZodNumber;
57
+ }, z.core.$strict>, "TaskMessageProtocolBinding", "out">;
58
+ payload: z.ZodCustom<JsonValue, JsonValue>;
59
+ causationId: z.ZodOptional<z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>>;
60
+ expectAttempt: z.ZodNumber;
61
+ schemaVersion: z.ZodLiteral<1>;
62
+ id: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
63
+ createdAt: z.ZodISODateTime;
64
+ delivery: z.ZodOptional<z.ZodLiteral<"result">>;
65
+ }, z.core.$strict>;
66
+ /** Validates a time-bounded claim on the current head of a Task inbox. */
67
+ declare const taskMessageClaimSchema: z.ZodObject<{
68
+ messageId: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
69
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
70
+ generation: z.ZodNumber;
71
+ principalId: z.ZodString;
72
+ attempt: z.ZodNumber;
73
+ expiresAt: z.ZodISODateTime;
74
+ }, z.core.$strict>;
75
+ /** Validates the immutable acknowledgment that a claimed message's effects committed. */
76
+ declare const taskMessageProcessingSchema: z.ZodObject<{
77
+ messageId: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
78
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
79
+ generation: z.ZodNumber;
80
+ principalId: z.ZodString;
81
+ attempt: z.ZodNumber;
82
+ expiresAt: z.ZodISODateTime;
83
+ schemaVersion: z.ZodLiteral<1>;
84
+ effectsCommitted: z.ZodLiteral<true>;
85
+ completedAt: z.ZodISODateTime;
86
+ }, z.core.$strict>;
87
+ /** Validates an explicitly authorized discard of an unleased inbox head. */
88
+ declare const taskMessageDiscardSchema: z.ZodObject<{
89
+ schemaVersion: z.ZodLiteral<1>;
90
+ messageId: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
91
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
92
+ reason: z.ZodString;
93
+ by: z.ZodObject<{
94
+ id: z.ZodString;
95
+ taskId: z.ZodOptional<z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>>;
96
+ }, z.core.$strict>;
97
+ discardedAt: z.ZodISODateTime;
98
+ }, z.core.$strict>;
99
+ /** Validates immutable send intent reserved before inbox and envelope persistence complete. */
100
+ declare const taskMessageReservationSchema: z.ZodObject<{
101
+ schemaVersion: z.ZodLiteral<1>;
102
+ message: z.ZodObject<{
103
+ operationId: z.ZodString;
104
+ fromTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
105
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
106
+ type: z.core.$ZodBranded<z.ZodObject<{
107
+ id: z.ZodString;
108
+ version: z.ZodNumber;
109
+ }, z.core.$strict>, "TaskMessageProtocolBinding", "out">;
110
+ payload: z.ZodCustom<JsonValue, JsonValue>;
111
+ causationId: z.ZodOptional<z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>>;
112
+ expectAttempt: z.ZodNumber;
113
+ schemaVersion: z.ZodLiteral<1>;
114
+ id: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
115
+ createdAt: z.ZodISODateTime;
116
+ delivery: z.ZodOptional<z.ZodLiteral<"result">>;
117
+ }, z.core.$strict>;
118
+ expectAttempt: z.ZodNumber;
119
+ }, z.core.$strict>;
120
+ /** Validates the bounded, directly addressed processing queue for one recipient Task. */
121
+ declare const taskInboxSchema: z.ZodObject<{
122
+ schemaVersion: z.ZodLiteral<1>;
123
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
124
+ generation: z.ZodNumber;
125
+ pending: z.ZodReadonly<z.ZodArray<z.ZodObject<{
126
+ operationId: z.ZodString;
127
+ fromTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
128
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
129
+ type: z.core.$ZodBranded<z.ZodObject<{
130
+ id: z.ZodString;
131
+ version: z.ZodNumber;
132
+ }, z.core.$strict>, "TaskMessageProtocolBinding", "out">;
133
+ payload: z.ZodCustom<JsonValue, JsonValue>;
134
+ causationId: z.ZodOptional<z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>>;
135
+ expectAttempt: z.ZodNumber;
136
+ schemaVersion: z.ZodLiteral<1>;
137
+ id: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
138
+ createdAt: z.ZodISODateTime;
139
+ delivery: z.ZodOptional<z.ZodLiteral<"result">>;
140
+ }, z.core.$strict>>>;
141
+ lease: z.ZodOptional<z.ZodObject<{
142
+ messageId: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
143
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
144
+ generation: z.ZodNumber;
145
+ principalId: z.ZodString;
146
+ attempt: z.ZodNumber;
147
+ expiresAt: z.ZodISODateTime;
148
+ }, z.core.$strict>>;
149
+ completion: z.ZodOptional<z.ZodObject<{
150
+ messageId: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
151
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
152
+ generation: z.ZodNumber;
153
+ principalId: z.ZodString;
154
+ attempt: z.ZodNumber;
155
+ expiresAt: z.ZodISODateTime;
156
+ schemaVersion: z.ZodLiteral<1>;
157
+ effectsCommitted: z.ZodLiteral<true>;
158
+ completedAt: z.ZodISODateTime;
159
+ }, z.core.$strict>>;
160
+ rejection: z.ZodOptional<z.ZodObject<{
161
+ schemaVersion: z.ZodLiteral<1>;
162
+ messageId: z.ZodType<`msg_${string}`, string, z.core.$ZodTypeInternals<`msg_${string}`, string>>;
163
+ toTaskId: z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>;
164
+ reason: z.ZodString;
165
+ by: z.ZodObject<{
166
+ id: z.ZodString;
167
+ taskId: z.ZodOptional<z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>>;
168
+ }, z.core.$strict>;
169
+ discardedAt: z.ZodISODateTime;
170
+ }, z.core.$strict>>;
171
+ }, z.core.$strict>;
172
+ /** Content-derived identity of an immutable Task message. */
173
+ type TaskMessageId = z.infer<typeof taskMessageIdSchema>;
174
+ /** Stable caller operation identity scoped to one source Task. */
175
+ type TaskMessageOperationId = z.infer<typeof taskMessageOperationIdSchema>;
176
+ /** Input payload accepted by one exact Task-message protocol binding. */
177
+ type TaskMessageProtocolInputPayload<Type extends TaskMessageProtocolBinding> = Type extends TaskMessageProtocolBinding<infer Payload, infer _Id, infer _Version, infer _StoredPayload> ? Payload : JsonValue;
178
+ /** Canonical payload stored by one exact Task-message protocol binding. */
179
+ type TaskMessageProtocolStoredPayload<Type extends TaskMessageProtocolBinding> = Type extends TaskMessageProtocolBinding<infer _Payload, infer _Id, infer _Version, infer StoredPayload> ? StoredPayload : JsonValue;
180
+ /** Caller-supplied idempotent intent with a payload correlated to its protocol binding. */
181
+ type SendTaskMessageInput<Type extends TaskMessageProtocolBinding = TaskMessageProtocolBinding> = Readonly<Omit<z.infer<typeof sendTaskMessageInputSchema>, "type" | "payload">> & {
182
+ readonly type: Type;
183
+ readonly payload: NoInfer<TaskMessageProtocolInputPayload<Type>>;
184
+ };
185
+ /** Immutable versioned-protocol envelope exchanged by authorized Tasks in one graph. */
186
+ type TaskMessage<Type extends TaskMessageProtocolBinding = TaskMessageProtocolBinding> = Readonly<Omit<z.infer<typeof taskMessageSchema>, "type" | "payload">> & {
187
+ readonly type: Type;
188
+ readonly payload: TaskMessageProtocolStoredPayload<Type>;
189
+ };
190
+ /** Application-authenticated identity used to authorize Task message operations. */
191
+ type TaskMessagePrincipal = Readonly<z.infer<typeof taskMessagePrincipalSchema>>;
192
+ /** Time-bounded, generation-fenced claim on a recipient's inbox head. */
193
+ type TaskMessageClaim = Readonly<z.infer<typeof taskMessageClaimSchema>>;
194
+ /** Immutable evidence that a claimed message's effects were committed and acknowledged. */
195
+ type TaskMessageProcessing = Readonly<z.infer<typeof taskMessageProcessingSchema>>;
196
+ /** Immutable evidence that an inbox head was explicitly discarded without applying effects. */
197
+ type TaskMessageDiscard = Readonly<z.infer<typeof taskMessageDiscardSchema>>;
198
+ /** Bounded durable queue and current processing state for one recipient Task. */
199
+ type TaskInbox = z.infer<typeof taskInboxSchema>;
200
+ /** Caller input accepted when defining one exact Task-message protocol. */
201
+ interface TaskMessageProtocolInput<Payload extends z.ZodType = z.ZodType, Id extends string = string, Version extends number = number> {
202
+ readonly id: Id;
203
+ readonly version: Version;
204
+ readonly payload: Payload;
205
+ /** Required when the input transform changes shape. Stored validation must preserve the canonical JSON. */
206
+ readonly storedPayload?: z.ZodType<NoInfer<z.output<Payload>>>;
207
+ /** Defaults to attempt; task scope is an explicit trusted workflow initial/reconcile capability. */
208
+ readonly sourceFence?: "attempt" | "task";
209
+ }
210
+ type TaskMessageJsonPayload<Value> = Value extends JsonValue ? Value : Value & JsonValue;
211
+ /** Exact protocol contract with a typed binding for constructing message input. */
212
+ interface TaskMessageProtocol<Payload extends z.ZodType = z.ZodType, Id extends string = string, Version extends number = number> extends TaskMessageProtocolInput<Payload, Id, Version> {
213
+ readonly binding: TaskMessageProtocolBinding<TaskMessageJsonPayload<z.input<Payload>>, Id, Version, TaskMessageJsonPayload<z.output<Payload>>>;
214
+ }
215
+ /** Immutable message envelope validated against one exact Task-message protocol. */
216
+ type TaskMessageForProtocol<Protocol extends TaskMessageProtocol> = Protocol extends TaskMessageProtocol ? TaskMessage<Protocol["binding"]> : never;
217
+ type TaskMessageProtocolForBinding<Protocol extends TaskMessageProtocol, Binding extends TaskMessageProtocolBinding> = Protocol extends TaskMessageProtocol ? Binding extends {
218
+ readonly id: Protocol["id"];
219
+ readonly version: Protocol["version"];
220
+ } ? Protocol : Protocol extends {
221
+ readonly id: Binding["id"];
222
+ readonly version: Binding["version"];
223
+ } ? Protocol : never : never;
224
+ /** Immutable registry of exact Task message protocol versions. */
225
+ interface TaskMessageProtocols<Protocol extends TaskMessageProtocol = TaskMessageProtocol> {
226
+ readonly definitions: readonly Readonly<Protocol>[];
227
+ resolve<const Binding extends TaskMessageProtocolBinding>(type: Binding): Readonly<TaskMessageProtocolForBinding<Protocol, Binding>>;
228
+ sourceFence(type: TaskMessageProtocolBinding): "attempt" | "task";
229
+ validate<const Binding extends TaskMessageProtocolBinding>(type: Binding, payload: unknown): TaskMessageProtocolStoredPayload<Binding>;
230
+ validateStored<const Binding extends TaskMessageProtocolBinding>(type: Binding, payload: unknown): TaskMessageProtocolStoredPayload<Binding>;
231
+ }
232
+ /** Validates a Task-message protocol definition before it is registered. */
233
+ declare const taskMessageProtocolSchema: z.ZodObject<{
234
+ payload: z.ZodCustom<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
235
+ storedPayload: z.ZodOptional<z.ZodCustom<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>;
236
+ sourceFence: z.ZodDefault<z.ZodEnum<{
237
+ task: "task";
238
+ attempt: "attempt";
239
+ }>>;
240
+ id: z.ZodString;
241
+ version: z.ZodNumber;
242
+ }, z.core.$strict>;
243
+ type RegisteredTaskMessageProtocol<Definition extends TaskMessageProtocolInput> = Definition extends TaskMessageProtocolInput<infer Payload, infer Id, infer Version> ? TaskMessageProtocol<Payload, Id, Version> : never;
244
+ /** Validates, snapshots, and freezes one exact Task-message protocol definition. */
245
+ declare function defineTaskMessageProtocol<Payload extends z.ZodType, const Id extends string, const Version extends number>(definition: TaskMessageProtocolInput<Payload, Id, Version>): Readonly<TaskMessageProtocol<Payload, Id, Version>>;
246
+ /** Builds an exact-version protocol registry and rejects duplicate definitions. */
247
+ declare function defineTaskMessageProtocols<const Definition extends TaskMessageProtocolInput>(definitions: readonly Definition[]): TaskMessageProtocols<RegisteredTaskMessageProtocol<Definition>>;
248
+ /** Constructs a send intent whose payload is checked against its protocol schema type. */
249
+ declare function taskMessageInput<Payload extends z.ZodType, const Id extends string, const Version extends number>(protocol: TaskMessageProtocol<Payload, Id, Version>, input: Omit<SendTaskMessageInput, "type" | "payload"> & {
250
+ readonly payload: NoInfer<TaskMessageJsonPayload<z.input<Payload>>>;
251
+ }): SendTaskMessageInput<TaskMessageProtocolBinding<TaskMessageJsonPayload<z.input<Payload>>, Id, Version, TaskMessageJsonPayload<z.output<Payload>>>>;
252
+ //#endregion
253
+ export { MAX_TASK_INBOX_PENDING, SendTaskMessageInput, TaskInbox, TaskMessage, TaskMessageClaim, TaskMessageDiscard, TaskMessageForProtocol, TaskMessageId, TaskMessageOperationId, TaskMessagePrincipal, TaskMessageProcessing, TaskMessageProtocol, TaskMessageProtocolBinding, TaskMessageProtocolBindingInput, TaskMessageProtocolInput, TaskMessageProtocolInputPayload, TaskMessageProtocolStoredPayload, TaskMessageProtocols, defineTaskMessageProtocol, defineTaskMessageProtocols, parseTaskMessageProtocolBinding, sendTaskMessageInputSchema, taskInboxSchema, taskMessageClaimSchema, taskMessageDiscardSchema, taskMessageIdSchema, taskMessageInput, taskMessageOperationIdSchema, taskMessagePrincipalSchema, taskMessageProcessingSchema, taskMessageProtocolBindingSchema, taskMessageProtocolSchema, taskMessageReservationSchema, taskMessageSchema };
254
+ //# sourceMappingURL=task-message.d.mts.map
@@ -0,0 +1,189 @@
1
+ import { taskIdSchema } from "./id.mjs";
2
+ import { isoDateTimeSchema, schemaVersionSchema } from "./common.mjs";
3
+ import { jsonValueSchema } from "./work.mjs";
4
+ import { z } from "zod";
5
+ import { isDeepStrictEqual } from "node:util";
6
+ //#region src/schema/task-message.ts
7
+ /** Maximum number of unacknowledged envelopes retained in one Task inbox. */
8
+ const MAX_TASK_INBOX_PENDING = 256;
9
+ /** Validates the content-derived identity of an immutable Task message. */
10
+ const taskMessageIdSchema = z.string().regex(/^msg_[a-f0-9]{64}$/u, "Expected msg_ followed by exactly 64 lowercase hexadecimal characters").describe("Source Task and operation ID SHA-256 identity.");
11
+ /** Validates an exact Task-message protocol identity and version. */
12
+ const taskMessageProtocolBindingFields = {
13
+ id: z.string().max(64).regex(/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/, "Expected a lowercase hyphenated or snake_case protocol name").describe("Registered Task-message protocol name."),
14
+ version: z.number().int().positive().describe("Exact positive integer version of the registered protocol.")
15
+ };
16
+ /** Validates an exact registered Task-message protocol identity and version. */
17
+ const taskMessageProtocolBindingSchema = z.strictObject(taskMessageProtocolBindingFields).describe("Exact registered Task-message protocol identity and version.").brand();
18
+ /** Validates and brands an exact Task-message protocol binding while preserving literal identity. */
19
+ function parseTaskMessageProtocolBinding(input) {
20
+ return taskMessageProtocolBindingSchema.parse(input);
21
+ }
22
+ /** Validates a stable caller operation identity scoped to one source Task. */
23
+ const taskMessageOperationIdSchema = z.string().min(1).max(256).describe("Stable caller operation ID, scoped to the source Task.");
24
+ /** Validates an application-authenticated principal and optional trusted Task binding. */
25
+ const taskMessagePrincipalSchema = z.strictObject({
26
+ id: z.string().min(1).max(256).describe("Identity authenticated by the trusted application, not by this store."),
27
+ taskId: taskIdSchema.optional().describe("Optional trusted Task binding; never derived from a payload.")
28
+ });
29
+ /** Validates an idempotent, attempt-fenced request to send a Task message. */
30
+ const sendTaskMessageInputSchema = z.strictObject({
31
+ operationId: taskMessageOperationIdSchema,
32
+ fromTaskId: taskIdSchema.describe("Task sending the message."),
33
+ toTaskId: taskIdSchema.describe("Recipient in the same root Task graph."),
34
+ type: taskMessageProtocolBindingSchema,
35
+ payload: jsonValueSchema.describe("Protocol input; validated as bounded JSON before and after transformation."),
36
+ causationId: taskMessageIdSchema.optional().describe("Optional preceding message in this Task graph."),
37
+ expectAttempt: z.number().int().positive().describe("Source attempt retained in the immutable envelope for consumer fencing; Task lifecycle checks and inbox writes are not atomic.")
38
+ });
39
+ /** Validates an immutable, protocol-versioned Task message envelope. */
40
+ const taskMessageSchema = sendTaskMessageInputSchema.extend({
41
+ schemaVersion: schemaVersionSchema,
42
+ id: taskMessageIdSchema,
43
+ createdAt: isoDateTimeSchema.describe("Engine timestamp fixed at operation reservation."),
44
+ delivery: z.literal("result").optional().describe("Engine-controlled delivery from a terminal source Task under explicit workflow authorization.")
45
+ });
46
+ /** Validates a time-bounded claim on the current head of a Task inbox. */
47
+ const taskMessageClaimSchema = z.strictObject({
48
+ messageId: taskMessageIdSchema,
49
+ toTaskId: taskIdSchema.describe("Recipient whose processing is serialized by this lease."),
50
+ generation: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).describe("Monotonically increasing inbox CAS fence, not an authorization credential."),
51
+ principalId: taskMessagePrincipalSchema.shape.id,
52
+ attempt: z.number().int().positive().describe("Recipient attempt when the lease was claimed."),
53
+ expiresAt: isoDateTimeSchema.describe("Completion must be accepted before this engine timestamp.")
54
+ });
55
+ /** Validates the immutable acknowledgment that a claimed message's effects committed. */
56
+ const taskMessageProcessingSchema = taskMessageClaimSchema.extend({
57
+ schemaVersion: schemaVersionSchema,
58
+ effectsCommitted: z.literal(true).describe("Caller attests its effects committed before processing acknowledgment; not exactly-once execution."),
59
+ completedAt: isoDateTimeSchema.describe("Time the inbox CAS durably accepted the acknowledgment.")
60
+ });
61
+ /** Validates an explicitly authorized discard of an unleased inbox head. */
62
+ const taskMessageDiscardSchema = z.strictObject({
63
+ schemaVersion: schemaVersionSchema,
64
+ messageId: taskMessageIdSchema,
65
+ toTaskId: taskIdSchema.describe("Recipient whose pending head was discarded."),
66
+ reason: z.string().trim().min(1).max(2048).describe("Explicit authorized recovery reason, at most 2048 characters."),
67
+ by: taskMessagePrincipalSchema.describe("Trusted application principal that authorized discarding, never payload identity."),
68
+ discardedAt: isoDateTimeSchema.describe("Time the inbox CAS accepted the discard intent, not an effects acknowledgment.")
69
+ });
70
+ /** Validates immutable send intent reserved before inbox and envelope persistence complete. */
71
+ const taskMessageReservationSchema = z.strictObject({
72
+ schemaVersion: schemaVersionSchema,
73
+ message: taskMessageSchema.describe("Immutable reserved intent; delivery exists only after inbox enqueue and envelope insertion."),
74
+ expectAttempt: sendTaskMessageInputSchema.shape.expectAttempt
75
+ }).refine((reservation) => reservation.expectAttempt === reservation.message.expectAttempt, { message: "Reservation and immutable envelope must retain the same source attempt" });
76
+ /** Validates the bounded, directly addressed processing queue for one recipient Task. */
77
+ const taskInboxSchema = z.strictObject({
78
+ schemaVersion: schemaVersionSchema,
79
+ toTaskId: taskIdSchema.describe("Directly addressed recipient inbox identity."),
80
+ generation: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).describe("Last allocated lease generation; never reset when the inbox drains."),
81
+ pending: z.array(taskMessageSchema).max(256).readonly().describe("Bounded durable envelope intents, retained until processing acknowledgment or explicit authorized discard."),
82
+ lease: taskMessageClaimSchema.optional().describe("At most one active recipient processing claim."),
83
+ completion: taskMessageProcessingSchema.optional().describe("CAS-accepted completion awaiting immutable processing-record repair."),
84
+ rejection: taskMessageDiscardSchema.optional().describe("CAS-accepted discard awaiting immutable discard-record repair; excludes active leases and completion.")
85
+ }).superRefine((inbox, context) => {
86
+ if (new Set(inbox.pending.map((message) => message.id)).size !== inbox.pending.length || inbox.pending.some((message) => message.toTaskId !== inbox.toTaskId)) context.addIssue({
87
+ code: "custom",
88
+ message: "Inbox intents must have unique IDs and match the recipient"
89
+ });
90
+ if (inbox.lease && (inbox.lease.toTaskId !== inbox.toTaskId || inbox.lease.generation !== inbox.generation || inbox.lease.messageId !== inbox.pending[0]?.id)) context.addIssue({
91
+ code: "custom",
92
+ message: "Inbox lease must fence its first pending message at the current generation"
93
+ });
94
+ if (inbox.rejection && (inbox.lease || inbox.completion || inbox.rejection.toTaskId !== inbox.toTaskId || inbox.rejection.messageId !== inbox.pending[0]?.id)) context.addIssue({
95
+ code: "custom",
96
+ message: "Discard must identify the pending head and exclude leases and processing completion"
97
+ });
98
+ if (inbox.completion) {
99
+ const { schemaVersion: _schemaVersion, effectsCommitted: _effectsCommitted, completedAt: _completedAt, ...lease } = inbox.completion;
100
+ if (!isDeepStrictEqual(lease, inbox.lease)) context.addIssue({
101
+ code: "custom",
102
+ message: "Completion must match the active lease"
103
+ });
104
+ }
105
+ });
106
+ /** Validates a Task-message protocol definition before it is registered. */
107
+ const taskMessageProtocolSchema = z.strictObject({
108
+ ...taskMessageProtocolBindingFields,
109
+ payload: z.instanceof(z.ZodType).describe("Zod schema validating protocol input."),
110
+ storedPayload: z.instanceof(z.ZodType).optional().describe("Canonical-preserving Zod schema validating stored payloads."),
111
+ sourceFence: z.enum(["attempt", "task"]).default("attempt").describe("Source attempt fence; task scope requires explicit trusted workflow configuration.")
112
+ });
113
+ const cloneProtocol = (definition) => Object.freeze({
114
+ ...definition,
115
+ binding: Object.freeze(parseTaskMessageProtocolBinding({
116
+ id: definition.binding.id,
117
+ version: definition.binding.version
118
+ })),
119
+ payload: definition.payload.clone(),
120
+ ...definition.storedPayload === void 0 ? {} : { storedPayload: definition.storedPayload.clone() }
121
+ });
122
+ /** Validates, snapshots, and freezes one exact Task-message protocol definition. */
123
+ function defineTaskMessageProtocol(definition) {
124
+ const input = "binding" in definition ? (({ binding: _binding, ...rest }) => rest)(definition) : definition;
125
+ const parsed = taskMessageProtocolSchema.parse(input);
126
+ const protocol = {
127
+ id: definition.id,
128
+ version: definition.version,
129
+ binding: Object.freeze(parseTaskMessageProtocolBinding({
130
+ id: definition.id,
131
+ version: definition.version
132
+ })),
133
+ payload: definition.payload,
134
+ ...definition.storedPayload === void 0 ? {} : { storedPayload: definition.storedPayload },
135
+ sourceFence: parsed.sourceFence
136
+ };
137
+ return cloneProtocol(protocol);
138
+ }
139
+ /** Builds an exact-version protocol registry and rejects duplicate definitions. */
140
+ function defineTaskMessageProtocols(definitions) {
141
+ const registry = /* @__PURE__ */ new Map();
142
+ for (const definition of definitions) {
143
+ const protocol = defineTaskMessageProtocol(definition);
144
+ const key = `${protocol.id}@${protocol.version}`;
145
+ if (registry.has(key)) throw new Error(`Duplicate message protocol ${key}`);
146
+ registry.set(key, protocol);
147
+ }
148
+ function resolve(type) {
149
+ const { id, version } = taskMessageProtocolBindingSchema.parse(type);
150
+ const definition = registry.get(`${id}@${version}`);
151
+ if (!definition) throw new Error(`Unknown message protocol ${id}@${version}. Registered protocols: ${[...registry.keys()].join(", ") || "none"}`);
152
+ return definition;
153
+ }
154
+ const validateStored = (type, payload) => {
155
+ const definition = resolve(type);
156
+ const json = jsonValueSchema.parse(payload);
157
+ const validated = jsonValueSchema.parse((definition.storedPayload ?? definition.payload).parse(structuredClone(json)));
158
+ if (!isDeepStrictEqual(json, validated)) throw new Error("Stored message protocol validation must preserve canonical JSON; provide storedPayload for transforming protocols");
159
+ return structuredClone(validated);
160
+ };
161
+ const resolveSnapshot = (type) => cloneProtocol(resolve(type));
162
+ return Object.freeze({
163
+ get definitions() {
164
+ return Object.freeze([...registry.values()].map(cloneProtocol));
165
+ },
166
+ resolve: resolveSnapshot,
167
+ sourceFence(type) {
168
+ return resolve(type).sourceFence ?? "attempt";
169
+ },
170
+ validateStored,
171
+ validate(type, payload) {
172
+ const json = jsonValueSchema.parse(payload);
173
+ return validateStored(type, jsonValueSchema.parse(resolve(type).payload.parse(structuredClone(json))));
174
+ }
175
+ });
176
+ }
177
+ /** Constructs a send intent whose payload is checked against its protocol schema type. */
178
+ function taskMessageInput(protocol, input) {
179
+ const value = {
180
+ ...input,
181
+ type: protocol.binding
182
+ };
183
+ sendTaskMessageInputSchema.parse(value);
184
+ return structuredClone(value);
185
+ }
186
+ //#endregion
187
+ export { MAX_TASK_INBOX_PENDING, defineTaskMessageProtocol, defineTaskMessageProtocols, parseTaskMessageProtocolBinding, sendTaskMessageInputSchema, taskInboxSchema, taskMessageClaimSchema, taskMessageDiscardSchema, taskMessageIdSchema, taskMessageInput, taskMessageOperationIdSchema, taskMessagePrincipalSchema, taskMessageProcessingSchema, taskMessageProtocolBindingSchema, taskMessageProtocolSchema, taskMessageReservationSchema, taskMessageSchema };
188
+
189
+ //# sourceMappingURL=task-message.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-message.mjs","names":[],"sources":["../../src/schema/task-message.ts"],"sourcesContent":["import { isDeepStrictEqual } from \"node:util\";\nimport { z } from \"zod\";\nimport { isoDateTimeSchema, schemaVersionSchema } from \"./common\";\nimport { taskIdSchema } from \"./id\";\nimport { jsonValueSchema, type JsonValue } from \"./work\";\n\n/** Maximum number of unacknowledged envelopes retained in one Task inbox. */\nexport const MAX_TASK_INBOX_PENDING = 256;\n/** Validates the content-derived identity of an immutable Task message. */\nexport const taskMessageIdSchema = z\n .string()\n .regex(\n /^msg_[a-f0-9]{64}$/u,\n \"Expected msg_ followed by exactly 64 lowercase hexadecimal characters\",\n )\n .describe(\"Source Task and operation ID SHA-256 identity.\") as z.ZodType<`msg_${string}`, string>;\n/** Validates an exact Task-message protocol identity and version. */\nconst taskMessageProtocolBindingFields = {\n id: z\n .string()\n .max(64)\n .regex(\n /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/,\n \"Expected a lowercase hyphenated or snake_case protocol name\",\n )\n .describe(\"Registered Task-message protocol name.\"),\n version: z\n .number()\n .int()\n .positive()\n .describe(\"Exact positive integer version of the registered protocol.\"),\n} as const;\n/** Validates an exact registered Task-message protocol identity and version. */\nexport const taskMessageProtocolBindingSchema = z\n .strictObject(taskMessageProtocolBindingFields)\n .describe(\"Exact registered Task-message protocol identity and version.\")\n .brand<\"TaskMessageProtocolBinding\">();\ndeclare const taskMessagePayloadType: unique symbol;\ndeclare const taskMessageStoredPayloadType: unique symbol;\n\n/** Exact Task-message protocol identity carrying its accepted and canonical stored payload types. */\nexport type TaskMessageProtocolBinding<\n Payload extends JsonValue = JsonValue,\n Id extends string = string,\n Version extends number = number,\n StoredPayload extends JsonValue = Payload,\n> = z.infer<typeof taskMessageProtocolBindingSchema> & {\n readonly id: Id;\n readonly version: Version;\n readonly [taskMessagePayloadType]?: Payload;\n readonly [taskMessageStoredPayloadType]?: StoredPayload;\n};\n\n/** Plain identifier and version accepted when constructing a Task-message protocol binding. */\nexport interface TaskMessageProtocolBindingInput<\n Id extends string = string,\n Version extends number = number,\n> {\n readonly id: Id;\n readonly version: Version;\n}\n\n/** Validates and brands an exact Task-message protocol binding while preserving literal identity. */\nexport function parseTaskMessageProtocolBinding<\n const Input extends TaskMessageProtocolBindingInput,\n>(input: Input): TaskMessageProtocolBinding<JsonValue, Input[\"id\"], Input[\"version\"]> {\n return taskMessageProtocolBindingSchema.parse(input) as TaskMessageProtocolBinding<\n JsonValue,\n Input[\"id\"],\n Input[\"version\"]\n >;\n}\n\n/** Validates a stable caller operation identity scoped to one source Task. */\nexport const taskMessageOperationIdSchema = z\n .string()\n .min(1)\n .max(256)\n .describe(\"Stable caller operation ID, scoped to the source Task.\");\n/** Validates an application-authenticated principal and optional trusted Task binding. */\nexport const taskMessagePrincipalSchema = z.strictObject({\n id: z\n .string()\n .min(1)\n .max(256)\n .describe(\"Identity authenticated by the trusted application, not by this store.\"),\n taskId: taskIdSchema\n .optional()\n .describe(\"Optional trusted Task binding; never derived from a payload.\"),\n});\n/** Validates an idempotent, attempt-fenced request to send a Task message. */\nexport const sendTaskMessageInputSchema = z.strictObject({\n operationId: taskMessageOperationIdSchema,\n fromTaskId: taskIdSchema.describe(\"Task sending the message.\"),\n toTaskId: taskIdSchema.describe(\"Recipient in the same root Task graph.\"),\n type: taskMessageProtocolBindingSchema,\n payload: jsonValueSchema.describe(\n \"Protocol input; validated as bounded JSON before and after transformation.\",\n ),\n causationId: taskMessageIdSchema\n .optional()\n .describe(\"Optional preceding message in this Task graph.\"),\n expectAttempt: z\n .number()\n .int()\n .positive()\n .describe(\n \"Source attempt retained in the immutable envelope for consumer fencing; Task lifecycle checks and inbox writes are not atomic.\",\n ),\n});\n/** Validates an immutable, protocol-versioned Task message envelope. */\nexport const taskMessageSchema = sendTaskMessageInputSchema.extend({\n schemaVersion: schemaVersionSchema,\n id: taskMessageIdSchema,\n createdAt: isoDateTimeSchema.describe(\"Engine timestamp fixed at operation reservation.\"),\n delivery: z\n .literal(\"result\")\n .optional()\n .describe(\n \"Engine-controlled delivery from a terminal source Task under explicit workflow authorization.\",\n ),\n});\n/** Validates a time-bounded claim on the current head of a Task inbox. */\nexport const taskMessageClaimSchema = z.strictObject({\n messageId: taskMessageIdSchema,\n toTaskId: taskIdSchema.describe(\"Recipient whose processing is serialized by this lease.\"),\n generation: z\n .number()\n .int()\n .positive()\n .max(Number.MAX_SAFE_INTEGER)\n .describe(\"Monotonically increasing inbox CAS fence, not an authorization credential.\"),\n principalId: taskMessagePrincipalSchema.shape.id,\n attempt: z.number().int().positive().describe(\"Recipient attempt when the lease was claimed.\"),\n expiresAt: isoDateTimeSchema.describe(\n \"Completion must be accepted before this engine timestamp.\",\n ),\n});\n/** Validates the immutable acknowledgment that a claimed message's effects committed. */\nexport const taskMessageProcessingSchema = taskMessageClaimSchema.extend({\n schemaVersion: schemaVersionSchema,\n effectsCommitted: z\n .literal(true)\n .describe(\n \"Caller attests its effects committed before processing acknowledgment; not exactly-once execution.\",\n ),\n completedAt: isoDateTimeSchema.describe(\n \"Time the inbox CAS durably accepted the acknowledgment.\",\n ),\n});\n/** Validates an explicitly authorized discard of an unleased inbox head. */\nexport const taskMessageDiscardSchema = z.strictObject({\n schemaVersion: schemaVersionSchema,\n messageId: taskMessageIdSchema,\n toTaskId: taskIdSchema.describe(\"Recipient whose pending head was discarded.\"),\n reason: z\n .string()\n .trim()\n .min(1)\n .max(2048)\n .describe(\"Explicit authorized recovery reason, at most 2048 characters.\"),\n by: taskMessagePrincipalSchema.describe(\n \"Trusted application principal that authorized discarding, never payload identity.\",\n ),\n discardedAt: isoDateTimeSchema.describe(\n \"Time the inbox CAS accepted the discard intent, not an effects acknowledgment.\",\n ),\n});\n/** Validates immutable send intent reserved before inbox and envelope persistence complete. */\nexport const taskMessageReservationSchema = z\n .strictObject({\n schemaVersion: schemaVersionSchema,\n message: taskMessageSchema.describe(\n \"Immutable reserved intent; delivery exists only after inbox enqueue and envelope insertion.\",\n ),\n expectAttempt: sendTaskMessageInputSchema.shape.expectAttempt,\n })\n .refine((reservation) => reservation.expectAttempt === reservation.message.expectAttempt, {\n message: \"Reservation and immutable envelope must retain the same source attempt\",\n });\n/** Validates the bounded, directly addressed processing queue for one recipient Task. */\nexport const taskInboxSchema = z\n .strictObject({\n schemaVersion: schemaVersionSchema,\n toTaskId: taskIdSchema.describe(\"Directly addressed recipient inbox identity.\"),\n generation: z\n .number()\n .int()\n .nonnegative()\n .max(Number.MAX_SAFE_INTEGER)\n .describe(\"Last allocated lease generation; never reset when the inbox drains.\"),\n pending: z\n .array(taskMessageSchema)\n .max(MAX_TASK_INBOX_PENDING)\n .readonly()\n .describe(\n \"Bounded durable envelope intents, retained until processing acknowledgment or explicit authorized discard.\",\n ),\n lease: taskMessageClaimSchema\n .optional()\n .describe(\"At most one active recipient processing claim.\"),\n completion: taskMessageProcessingSchema\n .optional()\n .describe(\"CAS-accepted completion awaiting immutable processing-record repair.\"),\n rejection: taskMessageDiscardSchema\n .optional()\n .describe(\n \"CAS-accepted discard awaiting immutable discard-record repair; excludes active leases and completion.\",\n ),\n })\n .superRefine((inbox, context) => {\n const ids = new Set(inbox.pending.map((message) => message.id));\n if (\n ids.size !== inbox.pending.length ||\n inbox.pending.some((message) => message.toTaskId !== inbox.toTaskId)\n ) {\n context.addIssue({\n code: \"custom\",\n message: \"Inbox intents must have unique IDs and match the recipient\",\n });\n }\n if (\n inbox.lease &&\n (inbox.lease.toTaskId !== inbox.toTaskId ||\n inbox.lease.generation !== inbox.generation ||\n inbox.lease.messageId !== inbox.pending[0]?.id)\n ) {\n context.addIssue({\n code: \"custom\",\n message: \"Inbox lease must fence its first pending message at the current generation\",\n });\n }\n if (\n inbox.rejection &&\n (inbox.lease ||\n inbox.completion ||\n inbox.rejection.toTaskId !== inbox.toTaskId ||\n inbox.rejection.messageId !== inbox.pending[0]?.id)\n ) {\n context.addIssue({\n code: \"custom\",\n message:\n \"Discard must identify the pending head and exclude leases and processing completion\",\n });\n }\n if (inbox.completion) {\n const {\n schemaVersion: _schemaVersion,\n effectsCommitted: _effectsCommitted,\n completedAt: _completedAt,\n ...lease\n } = inbox.completion;\n if (!isDeepStrictEqual(lease, inbox.lease))\n context.addIssue({ code: \"custom\", message: \"Completion must match the active lease\" });\n }\n });\n\n/** Content-derived identity of an immutable Task message. */\nexport type TaskMessageId = z.infer<typeof taskMessageIdSchema>;\n/** Stable caller operation identity scoped to one source Task. */\nexport type TaskMessageOperationId = z.infer<typeof taskMessageOperationIdSchema>;\n/** Input payload accepted by one exact Task-message protocol binding. */\nexport type TaskMessageProtocolInputPayload<Type extends TaskMessageProtocolBinding> =\n Type extends TaskMessageProtocolBinding<\n infer Payload,\n infer _Id,\n infer _Version,\n infer _StoredPayload\n >\n ? Payload\n : JsonValue;\n/** Canonical payload stored by one exact Task-message protocol binding. */\nexport type TaskMessageProtocolStoredPayload<Type extends TaskMessageProtocolBinding> =\n Type extends TaskMessageProtocolBinding<\n infer _Payload,\n infer _Id,\n infer _Version,\n infer StoredPayload\n >\n ? StoredPayload\n : JsonValue;\n/** Caller-supplied idempotent intent with a payload correlated to its protocol binding. */\nexport type SendTaskMessageInput<\n Type extends TaskMessageProtocolBinding = TaskMessageProtocolBinding,\n> = Readonly<Omit<z.infer<typeof sendTaskMessageInputSchema>, \"type\" | \"payload\">> & {\n readonly type: Type;\n readonly payload: NoInfer<TaskMessageProtocolInputPayload<Type>>;\n};\n/** Immutable versioned-protocol envelope exchanged by authorized Tasks in one graph. */\nexport type TaskMessage<Type extends TaskMessageProtocolBinding = TaskMessageProtocolBinding> =\n Readonly<Omit<z.infer<typeof taskMessageSchema>, \"type\" | \"payload\">> & {\n readonly type: Type;\n readonly payload: TaskMessageProtocolStoredPayload<Type>;\n };\n/** Application-authenticated identity used to authorize Task message operations. */\nexport type TaskMessagePrincipal = Readonly<z.infer<typeof taskMessagePrincipalSchema>>;\n/** Time-bounded, generation-fenced claim on a recipient's inbox head. */\nexport type TaskMessageClaim = Readonly<z.infer<typeof taskMessageClaimSchema>>;\n/** Immutable evidence that a claimed message's effects were committed and acknowledged. */\nexport type TaskMessageProcessing = Readonly<z.infer<typeof taskMessageProcessingSchema>>;\n/** Immutable evidence that an inbox head was explicitly discarded without applying effects. */\nexport type TaskMessageDiscard = Readonly<z.infer<typeof taskMessageDiscardSchema>>;\n/** Bounded durable queue and current processing state for one recipient Task. */\nexport type TaskInbox = z.infer<typeof taskInboxSchema>;\n\n/** Caller input accepted when defining one exact Task-message protocol. */\nexport interface TaskMessageProtocolInput<\n Payload extends z.ZodType = z.ZodType,\n Id extends string = string,\n Version extends number = number,\n> {\n readonly id: Id;\n readonly version: Version;\n readonly payload: Payload;\n /** Required when the input transform changes shape. Stored validation must preserve the canonical JSON. */\n readonly storedPayload?: z.ZodType<NoInfer<z.output<Payload>>>;\n /** Defaults to attempt; task scope is an explicit trusted workflow initial/reconcile capability. */\n readonly sourceFence?: \"attempt\" | \"task\";\n}\ntype TaskMessageJsonPayload<Value> = Value extends JsonValue ? Value : Value & JsonValue;\n\n/** Exact protocol contract with a typed binding for constructing message input. */\nexport interface TaskMessageProtocol<\n Payload extends z.ZodType = z.ZodType,\n Id extends string = string,\n Version extends number = number,\n> extends TaskMessageProtocolInput<Payload, Id, Version> {\n readonly binding: TaskMessageProtocolBinding<\n TaskMessageJsonPayload<z.input<Payload>>,\n Id,\n Version,\n TaskMessageJsonPayload<z.output<Payload>>\n >;\n}\n/** Immutable message envelope validated against one exact Task-message protocol. */\nexport type TaskMessageForProtocol<Protocol extends TaskMessageProtocol> =\n Protocol extends TaskMessageProtocol ? TaskMessage<Protocol[\"binding\"]> : never;\ntype TaskMessageProtocolForBinding<\n Protocol extends TaskMessageProtocol,\n Binding extends TaskMessageProtocolBinding,\n> = Protocol extends TaskMessageProtocol\n ? Binding extends {\n readonly id: Protocol[\"id\"];\n readonly version: Protocol[\"version\"];\n }\n ? Protocol\n : Protocol extends {\n readonly id: Binding[\"id\"];\n readonly version: Binding[\"version\"];\n }\n ? Protocol\n : never\n : never;\n/** Immutable registry of exact Task message protocol versions. */\nexport interface TaskMessageProtocols<Protocol extends TaskMessageProtocol = TaskMessageProtocol> {\n readonly definitions: readonly Readonly<Protocol>[];\n resolve<const Binding extends TaskMessageProtocolBinding>(\n type: Binding,\n ): Readonly<TaskMessageProtocolForBinding<Protocol, Binding>>;\n sourceFence(type: TaskMessageProtocolBinding): \"attempt\" | \"task\";\n validate<const Binding extends TaskMessageProtocolBinding>(\n type: Binding,\n payload: unknown,\n ): TaskMessageProtocolStoredPayload<Binding>;\n validateStored<const Binding extends TaskMessageProtocolBinding>(\n type: Binding,\n payload: unknown,\n ): TaskMessageProtocolStoredPayload<Binding>;\n}\n\n/** Validates a Task-message protocol definition before it is registered. */\nexport const taskMessageProtocolSchema = z.strictObject({\n ...taskMessageProtocolBindingFields,\n payload: z.instanceof(z.ZodType).describe(\"Zod schema validating protocol input.\"),\n storedPayload: z\n .instanceof(z.ZodType)\n .optional()\n .describe(\"Canonical-preserving Zod schema validating stored payloads.\"),\n sourceFence: z\n .enum([\"attempt\", \"task\"])\n .default(\"attempt\")\n .describe(\"Source attempt fence; task scope requires explicit trusted workflow configuration.\"),\n});\ntype RegisteredTaskMessageProtocol<Definition extends TaskMessageProtocolInput> =\n Definition extends TaskMessageProtocolInput<infer Payload, infer Id, infer Version>\n ? TaskMessageProtocol<Payload, Id, Version>\n : never;\n\nconst cloneProtocol = <Protocol extends TaskMessageProtocol>(\n definition: Protocol,\n): Readonly<Protocol> =>\n Object.freeze({\n ...definition,\n binding: Object.freeze(\n parseTaskMessageProtocolBinding({\n id: definition.binding.id,\n version: definition.binding.version,\n }),\n ),\n payload: definition.payload.clone(),\n ...(definition.storedPayload === undefined\n ? {}\n : { storedPayload: definition.storedPayload.clone() }),\n }) as Readonly<Protocol>;\n\n/** Validates, snapshots, and freezes one exact Task-message protocol definition. */\nexport function defineTaskMessageProtocol<\n Payload extends z.ZodType,\n const Id extends string,\n const Version extends number,\n>(\n definition: TaskMessageProtocolInput<Payload, Id, Version>,\n): Readonly<TaskMessageProtocol<Payload, Id, Version>> {\n const input =\n \"binding\" in definition ? (({ binding: _binding, ...rest }) => rest)(definition) : definition;\n const parsed = taskMessageProtocolSchema.parse(input);\n const protocol: TaskMessageProtocol<Payload, Id, Version> = {\n id: definition.id,\n version: definition.version,\n binding: Object.freeze(\n parseTaskMessageProtocolBinding({\n id: definition.id,\n version: definition.version,\n }),\n ) as TaskMessageProtocolBinding<\n TaskMessageJsonPayload<z.input<Payload>>,\n Id,\n Version,\n TaskMessageJsonPayload<z.output<Payload>>\n >,\n payload: definition.payload,\n ...(definition.storedPayload === undefined ? {} : { storedPayload: definition.storedPayload }),\n sourceFence: parsed.sourceFence,\n };\n return cloneProtocol(protocol);\n}\n\n/** Builds an exact-version protocol registry and rejects duplicate definitions. */\nexport function defineTaskMessageProtocols<const Definition extends TaskMessageProtocolInput>(\n definitions: readonly Definition[],\n): TaskMessageProtocols<RegisteredTaskMessageProtocol<Definition>> {\n type Protocol = RegisteredTaskMessageProtocol<Definition>;\n const registry = new Map<string, Readonly<Protocol>>();\n for (const definition of definitions) {\n const protocol = defineTaskMessageProtocol(definition) as unknown as Readonly<Protocol>;\n const key = `${protocol.id}@${protocol.version}`;\n if (registry.has(key)) throw new Error(`Duplicate message protocol ${key}`);\n registry.set(key, protocol);\n }\n function resolve<const Binding extends TaskMessageProtocolBinding>(\n type: Binding,\n ): Readonly<TaskMessageProtocolForBinding<Protocol, Binding>>;\n function resolve(type: TaskMessageProtocolBinding): Readonly<Protocol> {\n const { id, version } = taskMessageProtocolBindingSchema.parse(type);\n const definition = registry.get(`${id}@${version}`);\n if (!definition)\n throw new Error(\n `Unknown message protocol ${id}@${version}. Registered protocols: ${[...registry.keys()].join(\", \") || \"none\"}`,\n );\n return definition;\n }\n const validateStored = <const Binding extends TaskMessageProtocolBinding>(\n type: Binding,\n payload: unknown,\n ): TaskMessageProtocolStoredPayload<Binding> => {\n const definition = resolve(type);\n const json = jsonValueSchema.parse(payload);\n const validated = jsonValueSchema.parse(\n (definition.storedPayload ?? definition.payload).parse(structuredClone(json)),\n );\n if (!isDeepStrictEqual(json, validated))\n throw new Error(\n \"Stored message protocol validation must preserve canonical JSON; provide storedPayload for transforming protocols\",\n );\n return structuredClone(validated) as TaskMessageProtocolStoredPayload<Binding>;\n };\n const resolveSnapshot = <const Binding extends TaskMessageProtocolBinding>(\n type: Binding,\n ): Readonly<TaskMessageProtocolForBinding<Protocol, Binding>> => cloneProtocol(resolve(type));\n return Object.freeze({\n get definitions() {\n return Object.freeze([...registry.values()].map(cloneProtocol));\n },\n resolve: resolveSnapshot,\n sourceFence(type: TaskMessageProtocolBinding): \"attempt\" | \"task\" {\n return resolve(type).sourceFence ?? \"attempt\";\n },\n validateStored,\n validate<const Binding extends TaskMessageProtocolBinding>(\n type: Binding,\n payload: unknown,\n ): TaskMessageProtocolStoredPayload<Binding> {\n const json = jsonValueSchema.parse(payload);\n return validateStored(\n type,\n jsonValueSchema.parse(resolve(type).payload.parse(structuredClone(json))),\n );\n },\n });\n}\n\n/** Constructs a send intent whose payload is checked against its protocol schema type. */\nexport function taskMessageInput<\n Payload extends z.ZodType,\n const Id extends string,\n const Version extends number,\n>(\n protocol: TaskMessageProtocol<Payload, Id, Version>,\n input: Omit<SendTaskMessageInput, \"type\" | \"payload\"> & {\n readonly payload: NoInfer<TaskMessageJsonPayload<z.input<Payload>>>;\n },\n): SendTaskMessageInput<\n TaskMessageProtocolBinding<\n TaskMessageJsonPayload<z.input<Payload>>,\n Id,\n Version,\n TaskMessageJsonPayload<z.output<Payload>>\n >\n> {\n const value = { ...input, type: protocol.binding };\n sendTaskMessageInputSchema.parse(value);\n return structuredClone(value) as SendTaskMessageInput<\n TaskMessageProtocolBinding<\n TaskMessageJsonPayload<z.input<Payload>>,\n Id,\n Version,\n TaskMessageJsonPayload<z.output<Payload>>\n >\n >;\n}\n"],"mappings":"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"}