@vercel/factory 0.0.14 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/CHANGELOG.md +356 -0
  2. package/README.md +96 -2
  3. package/dist/agent-routes.d.mts +113 -0
  4. package/dist/agent-routes.mjs +91 -0
  5. package/dist/agent-routes.mjs.map +1 -0
  6. package/dist/api-contracts.d.mts +1768 -0
  7. package/dist/api-contracts.mjs +119 -0
  8. package/dist/api-contracts.mjs.map +1 -0
  9. package/dist/api-images.d.mts +30 -0
  10. package/dist/api-images.mjs +28 -0
  11. package/dist/api-images.mjs.map +1 -0
  12. package/dist/api-task-graph.mjs +57 -0
  13. package/dist/api-task-graph.mjs.map +1 -0
  14. package/dist/api.d.mts +111 -216
  15. package/dist/api.mjs +1063 -99
  16. package/dist/api.mjs.map +1 -1
  17. package/dist/approval-access.d.mts +39 -0
  18. package/dist/approval-access.mjs +62 -0
  19. package/dist/approval-access.mjs.map +1 -0
  20. package/dist/approval-contracts.d.mts +698 -0
  21. package/dist/approval-contracts.mjs +27 -0
  22. package/dist/approval-contracts.mjs.map +1 -0
  23. package/dist/approval.d.mts +49 -0
  24. package/dist/approval.mjs +39 -0
  25. package/dist/approval.mjs.map +1 -0
  26. package/dist/blob/artifacts.d.mts +37 -0
  27. package/dist/blob/artifacts.mjs +45 -0
  28. package/dist/blob/artifacts.mjs.map +1 -0
  29. package/dist/blob/index.d.mts +84 -12
  30. package/dist/blob/index.mjs +179 -45
  31. package/dist/blob/index.mjs.map +1 -1
  32. package/dist/budget.d.mts +115 -0
  33. package/dist/budget.mjs +147 -0
  34. package/dist/budget.mjs.map +1 -0
  35. package/dist/budgets.d.mts +4 -0
  36. package/dist/budgets.mjs +4 -0
  37. package/dist/build-factory.d.mts +7 -4
  38. package/dist/build-factory.mjs +2 -1
  39. package/dist/build-factory.mjs.map +1 -1
  40. package/dist/change-verification/brief.d.mts +9 -0
  41. package/dist/change-verification/brief.mjs +13 -0
  42. package/dist/change-verification/brief.mjs.map +1 -0
  43. package/dist/change-verification/dispatch.d.mts +37 -0
  44. package/dist/change-verification/dispatch.mjs +83 -0
  45. package/dist/change-verification/dispatch.mjs.map +1 -0
  46. package/dist/change-verification/eve-tool.d.mts +61 -0
  47. package/dist/change-verification/eve-tool.mjs +89 -0
  48. package/dist/change-verification/eve-tool.mjs.map +1 -0
  49. package/dist/change-verification/result.mjs +130 -0
  50. package/dist/change-verification/result.mjs.map +1 -0
  51. package/dist/changes/eve-record-change.d.mts +56 -0
  52. package/dist/changes/eve-record-change.mjs +131 -0
  53. package/dist/changes/eve-record-change.mjs.map +1 -0
  54. package/dist/changes/presentation.d.mts +14 -0
  55. package/dist/changes.d.mts +24 -0
  56. package/dist/changes.mjs +29 -0
  57. package/dist/changes.mjs.map +1 -0
  58. package/dist/client-events.d.mts +25 -0
  59. package/dist/client-events.mjs +45 -0
  60. package/dist/client-events.mjs.map +1 -0
  61. package/dist/client-stream.d.mts +28 -0
  62. package/dist/client-stream.mjs +210 -0
  63. package/dist/client-stream.mjs.map +1 -0
  64. package/dist/client-transcript.d.mts +41 -0
  65. package/dist/client-transcript.mjs +233 -0
  66. package/dist/client-transcript.mjs.map +1 -0
  67. package/dist/client.d.mts +343 -0
  68. package/dist/client.mjs +366 -0
  69. package/dist/client.mjs.map +1 -0
  70. package/dist/code-review/contracts.d.mts +27 -0
  71. package/dist/code-review/eve-post-review.d.mts +70 -0
  72. package/dist/code-review/eve-post-review.mjs +195 -0
  73. package/dist/code-review/eve-post-review.mjs.map +1 -0
  74. package/dist/code-review/eve-review-comments.d.mts +75 -0
  75. package/dist/code-review/eve-review-comments.mjs +193 -0
  76. package/dist/code-review/eve-review-comments.mjs.map +1 -0
  77. package/dist/code-review/github-contracts.d.mts +10 -0
  78. package/dist/code-review/github-reporter.d.mts +46 -0
  79. package/dist/code-review/github-reporter.mjs +262 -0
  80. package/dist/code-review/github-reporter.mjs.map +1 -0
  81. package/dist/code-review/preparation.d.mts +34 -0
  82. package/dist/code-review/preparation.mjs +23 -0
  83. package/dist/code-review/preparation.mjs.map +1 -0
  84. package/dist/code-review/stall.d.mts +17 -0
  85. package/dist/code-review/stall.mjs +30 -0
  86. package/dist/code-review/stall.mjs.map +1 -0
  87. package/dist/code-review.d.mts +7 -0
  88. package/dist/code-review.mjs +5 -0
  89. package/dist/communication.d.mts +9 -0
  90. package/dist/communication.mjs +9 -0
  91. package/dist/connectors/github.d.mts +26 -0
  92. package/dist/connectors/github.mjs +55 -0
  93. package/dist/connectors/github.mjs.map +1 -0
  94. package/dist/connectors/index.d.mts +35 -3
  95. package/dist/connectors/index.mjs +3 -52
  96. package/dist/connectors/index.mjs.map +1 -1
  97. package/dist/connectors/outbox.d.mts +34 -0
  98. package/dist/connectors/outbox.mjs +50 -0
  99. package/dist/connectors/outbox.mjs.map +1 -0
  100. package/dist/connectors/slack-approval-blocks.mjs +136 -0
  101. package/dist/connectors/slack-approval-blocks.mjs.map +1 -0
  102. package/dist/connectors/slack-approvals.d.mts +29 -0
  103. package/dist/connectors/slack-approvals.mjs +346 -0
  104. package/dist/connectors/slack-approvals.mjs.map +1 -0
  105. package/dist/connectors/slack.d.mts +35 -52
  106. package/dist/connectors/slack.mjs +13 -85
  107. package/dist/connectors/slack.mjs.map +1 -1
  108. package/dist/deepsec/eve-tool.d.mts +110 -0
  109. package/dist/deepsec/eve-tool.mjs +166 -0
  110. package/dist/deepsec/eve-tool.mjs.map +1 -0
  111. package/dist/deepsec/finding.d.mts +84 -0
  112. package/dist/deepsec/finding.mjs +56 -0
  113. package/dist/deepsec/finding.mjs.map +1 -0
  114. package/dist/deepsec.d.mts +3 -0
  115. package/dist/delivery-metrics/metrics.d.mts +93 -0
  116. package/dist/delivery-metrics/metrics.mjs +200 -0
  117. package/dist/delivery-metrics/metrics.mjs.map +1 -0
  118. package/dist/delivery-metrics.d.mts +2 -0
  119. package/dist/delivery-metrics.mjs +2 -0
  120. package/dist/dispatch.d.mts +152 -0
  121. package/dist/dispatch.mjs +199 -0
  122. package/dist/dispatch.mjs.map +1 -0
  123. package/dist/errors.d.mts +15 -0
  124. package/dist/errors.mjs +38 -0
  125. package/dist/errors.mjs.map +1 -0
  126. package/dist/eve/index.d.mts +209 -1277
  127. package/dist/eve/index.mjs +312 -1073
  128. package/dist/eve/index.mjs.map +1 -1
  129. package/dist/eve/invoke.d.mts +144 -0
  130. package/dist/eve/invoke.mjs +254 -0
  131. package/dist/eve/invoke.mjs.map +1 -0
  132. package/dist/eve/session-client.d.mts +186 -0
  133. package/dist/eve/session-client.mjs +245 -0
  134. package/dist/eve/session-client.mjs.map +1 -0
  135. package/dist/eve/task-execution.d.mts +380 -0
  136. package/dist/eve/task-execution.mjs +73 -0
  137. package/dist/eve/task-execution.mjs.map +1 -0
  138. package/dist/eve/task-session.d.mts +129 -0
  139. package/dist/eve/task-session.mjs +245 -0
  140. package/dist/eve/task-session.mjs.map +1 -0
  141. package/dist/eve/transcript.d.mts +37 -0
  142. package/dist/eve/transcript.mjs +69 -0
  143. package/dist/eve/transcript.mjs.map +1 -0
  144. package/dist/execution-public.d.mts +8 -0
  145. package/dist/execution-public.mjs +7 -0
  146. package/dist/execution.d.mts +183 -0
  147. package/dist/execution.mjs +223 -0
  148. package/dist/execution.mjs.map +1 -0
  149. package/dist/finding-remediation/admission.d.mts +53 -0
  150. package/dist/finding-remediation/admission.mjs +90 -0
  151. package/dist/finding-remediation/admission.mjs.map +1 -0
  152. package/dist/finding-remediation/brief.d.mts +14 -0
  153. package/dist/finding-remediation/brief.mjs +25 -0
  154. package/dist/finding-remediation/brief.mjs.map +1 -0
  155. package/dist/finding-remediation/eve-tool.d.mts +29 -0
  156. package/dist/finding-remediation/eve-tool.mjs +34 -0
  157. package/dist/finding-remediation/eve-tool.mjs.map +1 -0
  158. package/dist/findings/fingerprint.d.mts +14 -0
  159. package/dist/findings/fingerprint.mjs +28 -0
  160. package/dist/findings/fingerprint.mjs.map +1 -0
  161. package/dist/findings.d.mts +7 -0
  162. package/dist/findings.mjs +6 -0
  163. package/dist/github-app.d.mts +54 -0
  164. package/dist/github-app.mjs +121 -0
  165. package/dist/github-app.mjs.map +1 -0
  166. package/dist/github-publication.d.mts +199 -0
  167. package/dist/github-publication.mjs +442 -0
  168. package/dist/github-publication.mjs.map +1 -0
  169. package/dist/github-transfer.d.mts +81 -0
  170. package/dist/github-transfer.mjs +273 -0
  171. package/dist/github-transfer.mjs.map +1 -0
  172. package/dist/github.d.mts +446 -2
  173. package/dist/github.mjs +357 -56
  174. package/dist/github.mjs.map +1 -1
  175. package/dist/image-input.d.mts +51 -0
  176. package/dist/image-input.mjs +63 -0
  177. package/dist/image-input.mjs.map +1 -0
  178. package/dist/inbox-activity.d.mts +53 -0
  179. package/dist/inbox-activity.mjs +41 -0
  180. package/dist/inbox-activity.mjs.map +1 -0
  181. package/dist/index.d.mts +16 -484
  182. package/dist/index.mjs +15 -522
  183. package/dist/intake-contracts.d.mts +55 -0
  184. package/dist/intake-contracts.mjs +33 -0
  185. package/dist/intake-contracts.mjs.map +1 -0
  186. package/dist/integrations/deepsec.d.mts +5 -0
  187. package/dist/integrations/deepsec.mjs +3 -0
  188. package/dist/integrations/github.d.mts +11 -0
  189. package/dist/integrations/github.mjs +9 -0
  190. package/dist/integrations/slack.d.mts +5 -0
  191. package/dist/integrations/slack.mjs +5 -0
  192. package/dist/integrations/vercel.d.mts +5 -0
  193. package/dist/integrations/vercel.mjs +4 -0
  194. package/dist/merge-resolution/contracts.d.mts +17 -0
  195. package/dist/merge-resolution/contracts.mjs +19 -0
  196. package/dist/merge-resolution/contracts.mjs.map +1 -0
  197. package/dist/merge-resolution/eve-tools.d.mts +47 -0
  198. package/dist/merge-resolution/eve-tools.mjs +122 -0
  199. package/dist/merge-resolution/eve-tools.mjs.map +1 -0
  200. package/dist/model-settings.d.mts +41 -0
  201. package/dist/model-settings.mjs +35 -0
  202. package/dist/model-settings.mjs.map +1 -0
  203. package/dist/multi-repository-changes/coordination.d.mts +49 -0
  204. package/dist/multi-repository-changes/coordination.mjs +115 -0
  205. package/dist/multi-repository-changes/coordination.mjs.map +1 -0
  206. package/dist/planning/cancellation.mjs +82 -0
  207. package/dist/planning/cancellation.mjs.map +1 -0
  208. package/dist/planning/configuration.d.mts +23 -0
  209. package/dist/planning/configuration.mjs +56 -0
  210. package/dist/planning/configuration.mjs.map +1 -0
  211. package/dist/planning/contracts.d.mts +136 -0
  212. package/dist/planning/contracts.mjs +42 -0
  213. package/dist/planning/contracts.mjs.map +1 -0
  214. package/dist/planning/dependencies.mjs +44 -0
  215. package/dist/planning/dependencies.mjs.map +1 -0
  216. package/dist/planning/effects.mjs +122 -0
  217. package/dist/planning/effects.mjs.map +1 -0
  218. package/dist/planning/reconcile.mjs +279 -0
  219. package/dist/planning/reconcile.mjs.map +1 -0
  220. package/dist/planning/runtime.d.mts +27 -0
  221. package/dist/planning/runtime.mjs +25 -0
  222. package/dist/planning/runtime.mjs.map +1 -0
  223. package/dist/planning/state.mjs +92 -0
  224. package/dist/planning/state.mjs.map +1 -0
  225. package/dist/planning/turns.mjs +262 -0
  226. package/dist/planning/turns.mjs.map +1 -0
  227. package/dist/planning/validation.mjs +106 -0
  228. package/dist/planning/validation.mjs.map +1 -0
  229. package/dist/postgres/index.d.mts +48 -1
  230. package/dist/postgres/index.mjs +45 -3
  231. package/dist/postgres/index.mjs.map +1 -1
  232. package/dist/presets/software-development/approval.d.mts +14 -0
  233. package/dist/presets/software-development/approval.mjs +21 -0
  234. package/dist/presets/software-development/approval.mjs.map +1 -0
  235. package/dist/presets/software-development/deepsec-brief.d.mts +8 -0
  236. package/dist/presets/software-development/deepsec-brief.mjs +14 -0
  237. package/dist/presets/software-development/deepsec-brief.mjs.map +1 -0
  238. package/dist/presets/software-development/dispatch.d.mts +56 -0
  239. package/dist/presets/software-development/dispatch.mjs +67 -0
  240. package/dist/presets/software-development/dispatch.mjs.map +1 -0
  241. package/dist/presets/software-development/eve-delegation-policy.d.mts +7 -0
  242. package/dist/presets/software-development/eve-delegation-policy.mjs +34 -0
  243. package/dist/presets/software-development/eve-delegation-policy.mjs.map +1 -0
  244. package/dist/presets/software-development/eve.d.mts +18 -0
  245. package/dist/presets/software-development/eve.mjs +19 -0
  246. package/dist/presets/software-development/eve.mjs.map +1 -0
  247. package/dist/presets/software-development/finish-task-policy.d.mts +7 -0
  248. package/dist/presets/software-development/finish-task-policy.mjs +9 -0
  249. package/dist/presets/software-development/finish-task-policy.mjs.map +1 -0
  250. package/dist/presets/software-development/recovery.d.mts +32 -0
  251. package/dist/presets/software-development/recovery.mjs +120 -0
  252. package/dist/presets/software-development/recovery.mjs.map +1 -0
  253. package/dist/presets/software-development/task-communication.d.mts +24 -0
  254. package/dist/presets/software-development/task-communication.mjs +157 -0
  255. package/dist/presets/software-development/task-communication.mjs.map +1 -0
  256. package/dist/presets/software-development.d.mts +10 -0
  257. package/dist/presets/software-development.mjs +9 -0
  258. package/dist/pull-requests/contracts.d.mts +72 -0
  259. package/dist/pull-requests/eve-fetch.d.mts +57 -0
  260. package/dist/pull-requests/eve-fetch.mjs +151 -0
  261. package/dist/pull-requests/eve-fetch.mjs.map +1 -0
  262. package/dist/pull-requests/github-label-manager.d.mts +27 -0
  263. package/dist/pull-requests/github-label-manager.mjs +40 -0
  264. package/dist/pull-requests/github-label-manager.mjs.map +1 -0
  265. package/dist/pull-requests/github-publisher.d.mts +67 -0
  266. package/dist/pull-requests/github-publisher.mjs +405 -0
  267. package/dist/pull-requests/github-publisher.mjs.map +1 -0
  268. package/dist/pull-requests.d.mts +6 -0
  269. package/dist/pull-requests.mjs +4 -0
  270. package/dist/receipts.d.mts +4 -0
  271. package/dist/receipts.mjs +3 -0
  272. package/dist/repositories.d.mts +18 -0
  273. package/dist/repositories.mjs +33 -0
  274. package/dist/repositories.mjs.map +1 -0
  275. package/dist/sandbox/command.d.mts +18 -0
  276. package/dist/sandbox/execution-abort.d.mts +16 -0
  277. package/dist/sandbox/execution-abort.mjs +49 -0
  278. package/dist/sandbox/execution-abort.mjs.map +1 -0
  279. package/dist/sandbox/execution-environment.d.mts +25 -0
  280. package/dist/sandbox/execution-run-ledger.d.mts +115 -0
  281. package/dist/sandbox/execution-run-ledger.mjs +209 -0
  282. package/dist/sandbox/execution-run-ledger.mjs.map +1 -0
  283. package/dist/sandbox/execution.d.mts +54 -0
  284. package/dist/sandbox/execution.mjs +228 -0
  285. package/dist/sandbox/execution.mjs.map +1 -0
  286. package/dist/sandbox/harness-runner.d.mts +79 -0
  287. package/dist/sandbox/harness-runner.mjs +162 -0
  288. package/dist/sandbox/harness-runner.mjs.map +1 -0
  289. package/dist/sandbox/index.d.mts +10 -0
  290. package/dist/sandbox/index.mjs +7 -0
  291. package/dist/sandbox/task-environment.d.mts +50 -0
  292. package/dist/sandbox/task-environment.mjs +140 -0
  293. package/dist/sandbox/task-environment.mjs.map +1 -0
  294. package/dist/sandbox/workspace.d.mts +29 -0
  295. package/dist/sandbox/workspace.mjs +28 -0
  296. package/dist/sandbox/workspace.mjs.map +1 -0
  297. package/dist/schema/agent-route.d.mts +40 -0
  298. package/dist/schema/agent-route.mjs +33 -0
  299. package/dist/schema/agent-route.mjs.map +1 -0
  300. package/dist/schema/answer.d.mts +23 -0
  301. package/dist/schema/answer.mjs +21 -0
  302. package/dist/schema/answer.mjs.map +1 -0
  303. package/dist/schema/budget.d.mts +38 -0
  304. package/dist/schema/budget.mjs +30 -0
  305. package/dist/schema/budget.mjs.map +1 -0
  306. package/dist/schema/catalog.mjs +72 -0
  307. package/dist/schema/catalog.mjs.map +1 -0
  308. package/dist/schema/change.d.mts +117 -0
  309. package/dist/schema/change.mjs +68 -0
  310. package/dist/schema/change.mjs.map +1 -0
  311. package/dist/schema/common.d.mts +33 -0
  312. package/dist/{id-BLIkCVue.mjs → schema/common.mjs} +7 -16
  313. package/dist/schema/common.mjs.map +1 -0
  314. package/dist/schema/communication.d.mts +52 -0
  315. package/dist/{communication-Kd9nU5RP.mjs → schema/communication.mjs} +8 -3
  316. package/dist/schema/communication.mjs.map +1 -0
  317. package/dist/schema/execution.d.mts +101 -0
  318. package/dist/schema/execution.mjs +86 -0
  319. package/dist/schema/execution.mjs.map +1 -0
  320. package/dist/schema/factory-config.d.mts +122 -0
  321. package/dist/schema/factory-config.mjs +90 -0
  322. package/dist/schema/factory-config.mjs.map +1 -0
  323. package/dist/schema/finding.d.mts +125 -0
  324. package/dist/schema/finding.mjs +67 -0
  325. package/dist/schema/finding.mjs.map +1 -0
  326. package/dist/schema/id.d.mts +43 -0
  327. package/dist/schema/id.mjs +32 -0
  328. package/dist/schema/id.mjs.map +1 -0
  329. package/dist/schema/outbox.d.mts +240 -0
  330. package/dist/schema/outbox.mjs +53 -0
  331. package/dist/schema/outbox.mjs.map +1 -0
  332. package/dist/schema/question-route.mjs +16 -0
  333. package/dist/schema/question-route.mjs.map +1 -0
  334. package/dist/schema/receipt.d.mts +81 -0
  335. package/dist/schema/receipt.mjs +94 -0
  336. package/dist/schema/receipt.mjs.map +1 -0
  337. package/dist/schema/repository.d.mts +30 -0
  338. package/dist/schema/repository.mjs +29 -0
  339. package/dist/schema/repository.mjs.map +1 -0
  340. package/dist/schema/session.d.mts +136 -0
  341. package/dist/schema/session.mjs +54 -0
  342. package/dist/schema/session.mjs.map +1 -0
  343. package/dist/schema/signal.d.mts +105 -0
  344. package/dist/schema/signal.mjs +81 -0
  345. package/dist/schema/signal.mjs.map +1 -0
  346. package/dist/schema/slack-pr-notifications.d.mts +12 -0
  347. package/dist/schema/slack-pr-notifications.mjs +11 -0
  348. package/dist/schema/slack-pr-notifications.mjs.map +1 -0
  349. package/dist/schema/stored-session.mjs +10 -0
  350. package/dist/schema/stored-session.mjs.map +1 -0
  351. package/dist/schema/stored-task.mjs +20 -0
  352. package/dist/schema/stored-task.mjs.map +1 -0
  353. package/dist/schema/task-effect.d.mts +39 -0
  354. package/dist/schema/task-effect.mjs +29 -0
  355. package/dist/schema/task-effect.mjs.map +1 -0
  356. package/dist/schema/task-graph.d.mts +3173 -0
  357. package/dist/schema/task-graph.mjs +97 -0
  358. package/dist/schema/task-graph.mjs.map +1 -0
  359. package/dist/schema/task-message.d.mts +254 -0
  360. package/dist/schema/task-message.mjs +189 -0
  361. package/dist/schema/task-message.mjs.map +1 -0
  362. package/dist/schema/task.d.mts +273 -0
  363. package/dist/schema/task.mjs +200 -0
  364. package/dist/schema/task.mjs.map +1 -0
  365. package/dist/schema/transcript.d.mts +176 -0
  366. package/dist/schema/transcript.mjs +87 -0
  367. package/dist/schema/transcript.mjs.map +1 -0
  368. package/dist/schema/transitions.d.mts +50 -0
  369. package/dist/schema/transitions.mjs +303 -0
  370. package/dist/schema/transitions.mjs.map +1 -0
  371. package/dist/schema/work.d.mts +150 -0
  372. package/dist/schema/work.mjs +102 -0
  373. package/dist/schema/work.mjs.map +1 -0
  374. package/dist/session-previews.d.mts +76 -0
  375. package/dist/session-previews.mjs +55 -0
  376. package/dist/session-previews.mjs.map +1 -0
  377. package/dist/session-review.d.mts +120 -0
  378. package/dist/session-review.mjs +79 -0
  379. package/dist/session-review.mjs.map +1 -0
  380. package/dist/signal-triage.d.mts +20 -0
  381. package/dist/signal-triage.mjs +85 -0
  382. package/dist/signal-triage.mjs.map +1 -0
  383. package/dist/signals.d.mts +20 -0
  384. package/dist/signals.mjs +19 -0
  385. package/dist/signals.mjs.map +1 -0
  386. package/dist/stall.d.mts +41 -0
  387. package/dist/stall.mjs +83 -0
  388. package/dist/stall.mjs.map +1 -0
  389. package/dist/storage.d.mts +4 -0
  390. package/dist/storage.mjs +4 -0
  391. package/dist/store/driver.d.mts +65 -0
  392. package/dist/store/driver.mjs +42 -0
  393. package/dist/store/driver.mjs.map +1 -0
  394. package/dist/store/engine.d.mts +683 -0
  395. package/dist/store/engine.mjs +2309 -0
  396. package/dist/store/engine.mjs.map +1 -0
  397. package/dist/store/memory.d.mts +24 -0
  398. package/dist/store/memory.mjs +69 -0
  399. package/dist/store/memory.mjs.map +1 -0
  400. package/dist/store/slack-pr-notifications.d.mts +44 -0
  401. package/dist/store/slack-pr-notifications.mjs +121 -0
  402. package/dist/store/slack-pr-notifications.mjs.map +1 -0
  403. package/dist/store/task-effects.d.mts +38 -0
  404. package/dist/store/task-effects.mjs +118 -0
  405. package/dist/store/task-effects.mjs.map +1 -0
  406. package/dist/store/task-graphs.d.mts +60 -0
  407. package/dist/store/task-graphs.mjs +212 -0
  408. package/dist/store/task-graphs.mjs.map +1 -0
  409. package/dist/store/task-messages.d.mts +136 -0
  410. package/dist/store/task-messages.mjs +475 -0
  411. package/dist/store/task-messages.mjs.map +1 -0
  412. package/dist/store/task-work.d.mts +180 -0
  413. package/dist/store/task-work.mjs +137 -0
  414. package/dist/store/task-work.mjs.map +1 -0
  415. package/dist/store/work-notifications.d.mts +19 -0
  416. package/dist/store/work-notifications.mjs +48 -0
  417. package/dist/store/work-notifications.mjs.map +1 -0
  418. package/dist/sweep.d.mts +79 -0
  419. package/dist/sweep.mjs +171 -0
  420. package/dist/sweep.mjs.map +1 -0
  421. package/dist/task-communication.d.mts +35 -0
  422. package/dist/task-communication.mjs +47 -0
  423. package/dist/task-communication.mjs.map +1 -0
  424. package/dist/task-graph-view.d.mts +267 -0
  425. package/dist/task-graph-view.mjs +17 -0
  426. package/dist/task-graph-view.mjs.map +1 -0
  427. package/dist/task-message-processing.d.mts +60 -0
  428. package/dist/task-message-processing.mjs +200 -0
  429. package/dist/task-message-processing.mjs.map +1 -0
  430. package/dist/task-protocols.d.mts +80 -0
  431. package/dist/task-protocols.mjs +47 -0
  432. package/dist/task-protocols.mjs.map +1 -0
  433. package/dist/tasks.d.mts +17 -0
  434. package/dist/tasks.mjs +17 -0
  435. package/dist/vercel-git.d.mts +53 -0
  436. package/dist/vercel-git.mjs +344 -0
  437. package/dist/vercel-git.mjs.map +1 -0
  438. package/dist/vercel-github-api.d.mts +103 -0
  439. package/dist/vercel-github-api.mjs +363 -0
  440. package/dist/vercel-github-api.mjs.map +1 -0
  441. package/dist/vercel.d.mts +34 -2
  442. package/dist/vercel.mjs +49 -3
  443. package/dist/vercel.mjs.map +1 -1
  444. package/dist/work-triage/eve-tool.d.mts +29 -0
  445. package/dist/work-triage/eve-tool.mjs +32 -0
  446. package/dist/work-triage/eve-tool.mjs.map +1 -0
  447. package/dist/work-triage/find-existing-work.d.mts +32 -0
  448. package/dist/work-triage/find-existing-work.mjs +31 -0
  449. package/dist/work-triage/find-existing-work.mjs.map +1 -0
  450. package/dist/work-triage/github.d.mts +15 -0
  451. package/dist/work-triage/github.mjs +14 -0
  452. package/dist/work-triage/github.mjs.map +1 -0
  453. package/dist/work-triage.d.mts +4 -0
  454. package/dist/work-triage.mjs +3 -0
  455. package/dist/workflows.d.mts +146 -0
  456. package/dist/workflows.mjs +139 -0
  457. package/dist/workflows.mjs.map +1 -0
  458. package/dist/workspace-diff-assembly.d.mts +33 -0
  459. package/dist/workspace-diff-assembly.mjs +95 -0
  460. package/dist/workspace-diff-assembly.mjs.map +1 -0
  461. package/dist/workspace-diff.d.mts +90 -0
  462. package/dist/workspace-diff.mjs +61 -0
  463. package/dist/workspace-diff.mjs.map +1 -0
  464. package/dist/workspace-files-git.d.mts +15 -0
  465. package/dist/workspace-files-git.mjs +61 -0
  466. package/dist/workspace-files-git.mjs.map +1 -0
  467. package/dist/workspace-files.d.mts +107 -0
  468. package/dist/workspace-files.mjs +74 -0
  469. package/dist/workspace-files.mjs.map +1 -0
  470. package/dist/workspace-snapshot.d.mts +26 -0
  471. package/dist/workspace-snapshot.mjs +80 -0
  472. package/dist/workspace-snapshot.mjs.map +1 -0
  473. package/docs/getting-started.md +104 -0
  474. package/docs/index.md +100 -0
  475. package/docs/recipes/cancellation.md +215 -0
  476. package/docs/recipes/custom-workflow.md +153 -0
  477. package/docs/recipes/dependent-tasks.md +207 -0
  478. package/docs/recipes/eve-agent.md +277 -0
  479. package/docs/recipes/human-input.md +204 -0
  480. package/docs/recipes/persistence-recovery.md +268 -0
  481. package/docs/recipes/retry-recovery.md +241 -0
  482. package/docs/recipes/task-messaging.md +215 -0
  483. package/docs/recipes/typed-eve-result.md +161 -0
  484. package/docs/runtime-integration.md +137 -0
  485. package/package.json +142 -46
  486. package/dist/approval-JX2Px9IC.mjs +0 -132
  487. package/dist/approval-JX2Px9IC.mjs.map +0 -1
  488. package/dist/budget-DzSiIA4t.mjs +0 -42
  489. package/dist/budget-DzSiIA4t.mjs.map +0 -1
  490. package/dist/change-D2U6v7Ek.mjs +0 -554
  491. package/dist/change-D2U6v7Ek.mjs.map +0 -1
  492. package/dist/communication-Kd9nU5RP.mjs.map +0 -1
  493. package/dist/coordination-Cq08hb1l.mjs +0 -76
  494. package/dist/coordination-Cq08hb1l.mjs.map +0 -1
  495. package/dist/dispatch-BaZS3PT8.d.mts +0 -76
  496. package/dist/driver-BC0Mt5KG.d.mts +0 -34
  497. package/dist/driver-Bbd25rNM.mjs +0 -23
  498. package/dist/driver-Bbd25rNM.mjs.map +0 -1
  499. package/dist/engine-DFHU2Pe-.d.mts +0 -781
  500. package/dist/engine-WaUM2cGA.mjs +0 -1068
  501. package/dist/engine-WaUM2cGA.mjs.map +0 -1
  502. package/dist/factory-config-BoRXOw43.mjs +0 -50
  503. package/dist/factory-config-BoRXOw43.mjs.map +0 -1
  504. package/dist/factory-config-D2yU3G0c.d.mts +0 -58
  505. package/dist/github-C5HNBN6p.d.mts +0 -279
  506. package/dist/id-BLIkCVue.mjs.map +0 -1
  507. package/dist/index-Bw6hggoH.d.mts +0 -40
  508. package/dist/index.mjs.map +0 -1
  509. package/dist/task-CcOyOJ3k.mjs +0 -154
  510. package/dist/task-CcOyOJ3k.mjs.map +0 -1
@@ -0,0 +1,82 @@
1
+ import { taskIdSchema } from "../schema/id.mjs";
2
+ import { isoDateTimeSchema, schemaVersionSchema } from "../schema/common.mjs";
3
+ import { taskSchema } from "../schema/task.mjs";
4
+ import { RecordExistsError } from "../store/driver.mjs";
5
+ import { createHash } from "node:crypto";
6
+ import { z } from "zod";
7
+ //#region src/planning/cancellation.ts
8
+ const confirmationSchema = z.strictObject({
9
+ schemaVersion: schemaVersionSchema,
10
+ taskId: taskIdSchema.describe("Cancelled Task owning the execution."),
11
+ attempt: z.number().int().positive().describe("Cancelled execution attempt."),
12
+ provider: z.string().min(1).describe("Execution provider that acknowledged cancellation."),
13
+ sessionId: z.string().min(1).describe("Exact provider session whose cancellation was acknowledged."),
14
+ confirmedAt: isoDateTimeSchema.describe("Time the callback succeeded; not a provider lifecycle mirror.")
15
+ });
16
+ /** Shared per invocation, including decision replay. Confirmation is durable; ambiguous provider writes must be safe to repeat. */
17
+ function plannerCancellationBatch(options) {
18
+ const driver = options.stores.workflowRecords;
19
+ let attempts = 0;
20
+ const attempted = /* @__PURE__ */ new Set();
21
+ const pending = /* @__PURE__ */ new Set();
22
+ const errors = [];
23
+ async function stop(input) {
24
+ const task = taskSchema.parse(input);
25
+ if (task.state !== "cancelled" || !task.execution) return "not_needed";
26
+ const identity = {
27
+ taskId: task.id,
28
+ attempt: task.attempt,
29
+ provider: task.execution.provider,
30
+ sessionId: task.execution.sessionId
31
+ };
32
+ const id = `cancel_${createHash("sha256").update(JSON.stringify(identity)).digest("hex")}`;
33
+ async function confirmed() {
34
+ const stored = await driver.get("plannerCancellations", id);
35
+ if (!stored) return false;
36
+ const value = confirmationSchema.parse(stored.value);
37
+ if (value.taskId !== identity.taskId || value.attempt !== identity.attempt || value.provider !== identity.provider || value.sessionId !== identity.sessionId) throw new Error("Planner cancellation confirmation identity mismatch");
38
+ pending.delete(task.id);
39
+ return true;
40
+ }
41
+ if (await confirmed()) return "confirmed";
42
+ if (!options.cancelExecution) return "unconfigured";
43
+ pending.add(task.id);
44
+ if (attempts >= 32 || attempted.has(id)) return "pending";
45
+ attempted.add(id);
46
+ attempts++;
47
+ try {
48
+ await options.cancelExecution(task);
49
+ const record = confirmationSchema.parse({
50
+ ...identity,
51
+ schemaVersion: 1,
52
+ confirmedAt: (options.now ?? (() => (/* @__PURE__ */ new Date()).toISOString()))()
53
+ });
54
+ try {
55
+ await driver.insert({
56
+ collection: "plannerCancellations",
57
+ id,
58
+ value: record
59
+ });
60
+ } catch (error) {
61
+ if (!(error instanceof RecordExistsError) || !await confirmed()) throw error;
62
+ }
63
+ pending.delete(task.id);
64
+ return "confirmed";
65
+ } catch (error) {
66
+ errors.push({
67
+ taskId: task.id,
68
+ message: (error instanceof Error ? error.message : String(error)).slice(0, 1e3)
69
+ });
70
+ return "pending";
71
+ }
72
+ }
73
+ return {
74
+ stop,
75
+ pending,
76
+ errors
77
+ };
78
+ }
79
+ //#endregion
80
+ export { plannerCancellationBatch };
81
+
82
+ //# sourceMappingURL=cancellation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.mjs","names":[],"sources":["../../src/planning/cancellation.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { isoDateTimeSchema, schemaVersionSchema } from \"../schema/common\";\nimport { taskIdSchema, type TaskId } from \"../schema/id\";\nimport { taskSchema, type Task } from \"../schema/task\";\nimport { RecordExistsError } from \"../store/driver\";\nimport type { PlannerRuntimeOptions } from \"./contracts\";\n\nconst confirmationSchema = z.strictObject({\n schemaVersion: schemaVersionSchema,\n taskId: taskIdSchema.describe(\"Cancelled Task owning the execution.\"),\n attempt: z.number().int().positive().describe(\"Cancelled execution attempt.\"),\n provider: z.string().min(1).describe(\"Execution provider that acknowledged cancellation.\"),\n sessionId: z\n .string()\n .min(1)\n .describe(\"Exact provider session whose cancellation was acknowledged.\"),\n confirmedAt: isoDateTimeSchema.describe(\n \"Time the callback succeeded; not a provider lifecycle mirror.\",\n ),\n});\n\n/** Shared per invocation, including decision replay. Confirmation is durable; ambiguous provider writes must be safe to repeat. */\nexport function plannerCancellationBatch(options: PlannerRuntimeOptions) {\n const driver = options.stores.workflowRecords;\n let attempts = 0;\n const attempted = new Set<string>();\n const pending = new Set<TaskId>();\n const errors: { taskId: TaskId; message: string }[] = [];\n async function stop(\n input: Task,\n ): Promise<\"confirmed\" | \"pending\" | \"unconfigured\" | \"not_needed\"> {\n const task = taskSchema.parse(input);\n if (task.state !== \"cancelled\" || !task.execution) return \"not_needed\";\n const identity = {\n taskId: task.id,\n attempt: task.attempt,\n provider: task.execution.provider,\n sessionId: task.execution.sessionId,\n };\n const id = `cancel_${createHash(\"sha256\").update(JSON.stringify(identity)).digest(\"hex\")}`;\n async function confirmed(): Promise<boolean> {\n const stored = await driver.get(\"plannerCancellations\", id);\n if (!stored) return false;\n const value = confirmationSchema.parse(stored.value);\n if (\n value.taskId !== identity.taskId ||\n value.attempt !== identity.attempt ||\n value.provider !== identity.provider ||\n value.sessionId !== identity.sessionId\n )\n throw new Error(\"Planner cancellation confirmation identity mismatch\");\n pending.delete(task.id);\n return true;\n }\n if (await confirmed()) return \"confirmed\";\n if (!options.cancelExecution) return \"unconfigured\";\n pending.add(task.id);\n if (attempts >= 32 || attempted.has(id)) return \"pending\";\n attempted.add(id);\n attempts++;\n try {\n await options.cancelExecution(task);\n const record = confirmationSchema.parse({\n ...identity,\n schemaVersion: 1,\n confirmedAt: (options.now ?? (() => new Date().toISOString()))(),\n });\n try {\n await driver.insert({ collection: \"plannerCancellations\", id, value: record });\n } catch (error) {\n if (!(error instanceof RecordExistsError) || !(await confirmed())) throw error;\n }\n pending.delete(task.id);\n return \"confirmed\";\n } catch (error) {\n errors.push({\n taskId: task.id,\n message: (error instanceof Error ? error.message : String(error)).slice(0, 1000),\n });\n return \"pending\";\n }\n }\n return { stop, pending, errors };\n}\nexport type PlannerCancellationBatch = ReturnType<typeof plannerCancellationBatch>;\n"],"mappings":";;;;;;;AAQA,MAAM,qBAAqB,EAAE,aAAa;CACxC,eAAe;CACf,QAAQ,aAAa,SAAS,sCAAsC;CACpE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,8BAA8B;CAC5E,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,oDAAoD;CACzF,WAAW,EACR,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,SAAS,6DAA6D;CACzE,aAAa,kBAAkB,SAC7B,+DACF;AACF,CAAC;;AAGD,SAAgB,yBAAyB,SAAgC;CACvE,MAAM,SAAS,QAAQ,OAAO;CAC9B,IAAI,WAAW;CACf,MAAM,4BAAY,IAAI,IAAY;CAClC,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,SAAgD,CAAC;CACvD,eAAe,KACb,OACkE;EAClE,MAAM,OAAO,WAAW,MAAM,KAAK;EACnC,IAAI,KAAK,UAAU,eAAe,CAAC,KAAK,WAAW,OAAO;EAC1D,MAAM,WAAW;GACf,QAAQ,KAAK;GACb,SAAS,KAAK;GACd,UAAU,KAAK,UAAU;GACzB,WAAW,KAAK,UAAU;EAC5B;EACA,MAAM,KAAK,UAAU,WAAW,QAAQ,CAAC,CAAC,OAAO,KAAK,UAAU,QAAQ,CAAC,CAAC,CAAC,OAAO,KAAK;EACvF,eAAe,YAA8B;GAC3C,MAAM,SAAS,MAAM,OAAO,IAAI,wBAAwB,EAAE;GAC1D,IAAI,CAAC,QAAQ,OAAO;GACpB,MAAM,QAAQ,mBAAmB,MAAM,OAAO,KAAK;GACnD,IACE,MAAM,WAAW,SAAS,UAC1B,MAAM,YAAY,SAAS,WAC3B,MAAM,aAAa,SAAS,YAC5B,MAAM,cAAc,SAAS,WAE7B,MAAM,IAAI,MAAM,qDAAqD;GACvE,QAAQ,OAAO,KAAK,EAAE;GACtB,OAAO;EACT;EACA,IAAI,MAAM,UAAU,GAAG,OAAO;EAC9B,IAAI,CAAC,QAAQ,iBAAiB,OAAO;EACrC,QAAQ,IAAI,KAAK,EAAE;EACnB,IAAI,YAAY,MAAM,UAAU,IAAI,EAAE,GAAG,OAAO;EAChD,UAAU,IAAI,EAAE;EAChB;EACA,IAAI;GACF,MAAM,QAAQ,gBAAgB,IAAI;GAClC,MAAM,SAAS,mBAAmB,MAAM;IACtC,GAAG;IACH,eAAe;IACf,cAAc,QAAQ,+BAAc,IAAI,KAAK,EAAA,CAAE,YAAY,GAAA,CAAI;GACjE,CAAC;GACD,IAAI;IACF,MAAM,OAAO,OAAO;KAAE,YAAY;KAAwB;KAAI,OAAO;IAAO,CAAC;GAC/E,SAAS,OAAO;IACd,IAAI,EAAE,iBAAiB,sBAAsB,CAAE,MAAM,UAAU,GAAI,MAAM;GAC3E;GACA,QAAQ,OAAO,KAAK,EAAE;GACtB,OAAO;EACT,SAAS,OAAO;GACd,OAAO,KAAK;IACV,QAAQ,KAAK;IACb,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAA,CAAG,MAAM,GAAG,GAAI;GACjF,CAAC;GACD,OAAO;EACT;CACF;CACA,OAAO;EAAE;EAAM;EAAS;CAAO;AACjC"}
@@ -0,0 +1,23 @@
1
+ import { AgentRouteBinding } from "../schema/agent-route.mjs";
2
+ import "../schema/task.mjs";
3
+ import "../agent-routes.mjs";
4
+ import { TaskMessageProtocol, TaskMessageProtocols } from "../schema/task-message.mjs";
5
+ import { TaskMessageAuthorize } from "../store/task-messages.mjs";
6
+ import { StandardTaskMessageProtocol } from "../task-protocols.mjs";
7
+ import "../tasks.mjs";
8
+ import "./contracts.mjs";
9
+ import { z } from "zod";
10
+ //#region src/planning/configuration.d.ts
11
+ /** Exact task-scoped protocol that activates an initial or recovery planner turn. */
12
+ declare const plannerStartTaskMessageProtocol: Readonly<TaskMessageProtocol<z.ZodObject<{
13
+ reason: z.ZodString;
14
+ }, z.core.$strict>, "planner-start", 1>>;
15
+ /** Registry containing the standard protocols and the exact planner-start protocol. */
16
+ type PlannerMessageProtocols = TaskMessageProtocols<StandardTaskMessageProtocol | typeof plannerStartTaskMessageProtocol>;
17
+ /** Creates the standard task-message protocol registry used by planners. */
18
+ declare function createPlannerMessageProtocols(): PlannerMessageProtocols;
19
+ /** Only trusted server code may construct this identity; agent tools authenticate a Task binding separately. */
20
+ declare function createPlannerMessagePolicy(plannerRoute: AgentRouteBinding, workerRoutes?: readonly AgentRouteBinding[]): TaskMessageAuthorize;
21
+ //#endregion
22
+ export { PlannerMessageProtocols, createPlannerMessagePolicy, createPlannerMessageProtocols, plannerStartTaskMessageProtocol };
23
+ //# sourceMappingURL=configuration.d.mts.map
@@ -0,0 +1,56 @@
1
+ import { agentRouteBindingSchema } from "../schema/agent-route.mjs";
2
+ import { routeKey } from "../agent-routes.mjs";
3
+ import { defineTaskMessageProtocol, defineTaskMessageProtocols } from "../schema/task-message.mjs";
4
+ import { standardTaskMessageProtocols } from "../task-protocols.mjs";
5
+ import { z } from "zod";
6
+ //#region src/planning/configuration.ts
7
+ /** Exact task-scoped protocol that activates an initial or recovery planner turn. */
8
+ const plannerStartTaskMessageProtocol = defineTaskMessageProtocol({
9
+ id: "planner-start",
10
+ version: 1,
11
+ sourceFence: "task",
12
+ payload: z.strictObject({ reason: z.string().min(1).max(1e3).describe("Durable initial or recovery turn reason, not execution instructions.") })
13
+ });
14
+ /** Creates the standard task-message protocol registry used by planners. */
15
+ function createPlannerMessageProtocols() {
16
+ return defineTaskMessageProtocols([...standardTaskMessageProtocols, plannerStartTaskMessageProtocol]);
17
+ }
18
+ /** Only trusted server code may construct this identity; agent tools authenticate a Task binding separately. */
19
+ function createPlannerMessagePolicy(plannerRoute, workerRoutes = []) {
20
+ const planner = routeKey(agentRouteBindingSchema.parse(plannerRoute));
21
+ const workers = new Set(workerRoutes.map((route) => routeKey(agentRouteBindingSchema.parse(route))));
22
+ const isPlanner = (task) => task.work.route !== void 0 && routeKey(task.work.route) === planner;
23
+ const ownedChild = (child, parent) => child.parentTaskId === parent.id && child.rootTaskId === parent.rootTaskId && isPlanner(parent) && (isPlanner(child) || child.work.route !== void 0 && workers.has(routeKey(child.work.route)));
24
+ return ({ principal, action, fromTask, toTask }) => {
25
+ if (principal.id !== "factory:planner-runtime" || principal.taskId !== void 0) return false;
26
+ if (!fromTask) return isPlanner(toTask) && action !== "send" && action !== "send_result";
27
+ if (fromTask.rootTaskId !== toTask.rootTaskId) return false;
28
+ if (action === "send_result") return ownedChild(fromTask, toTask);
29
+ if (action === "send") return isPlanner(fromTask) && fromTask.id === toTask.id || ownedChild(toTask, fromTask);
30
+ return isPlanner(toTask) && (fromTask.id === toTask.id || ownedChild(fromTask, toTask) || ownedChild(toTask, fromTask));
31
+ };
32
+ }
33
+ function plannerConfiguration(options) {
34
+ const plannerRoute = agentRouteBindingSchema.parse(options.plannerRoute);
35
+ const workerRoutes = options.workerRoutes.map((route) => agentRouteBindingSchema.parse(route));
36
+ const allowed = new Map([plannerRoute, ...workerRoutes].map((binding) => {
37
+ const route = options.routes.get(binding);
38
+ if (!route) throw new Error(`Planner route ${routeKey(binding)} is not registered`);
39
+ return [routeKey(binding), structuredClone(route)];
40
+ }));
41
+ if (allowed.size > 32) throw new Error("At most 32 planner and worker routes may be configured");
42
+ return {
43
+ allowed,
44
+ limits: Object.freeze(z.strictObject({
45
+ maxDepth: z.number().int().min(0).max(255).default(4).describe("Maximum child depth below the graph root."),
46
+ maxChildren: z.number().int().min(1).max(32).default(32).describe("Total direct children per planner, including previous batches."),
47
+ maxTurns: z.number().int().min(1).max(256).default(16).describe("Maximum execution attempts per planner, including recovery turns.")
48
+ }).parse(options.limits ?? {})),
49
+ plannerRoute,
50
+ isPlanner: (task) => task.work.route !== void 0 && routeKey(task.work.route) === routeKey(plannerRoute)
51
+ };
52
+ }
53
+ //#endregion
54
+ export { createPlannerMessagePolicy, createPlannerMessageProtocols, plannerConfiguration, plannerStartTaskMessageProtocol };
55
+
56
+ //# sourceMappingURL=configuration.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.mjs","names":[],"sources":["../../src/planning/configuration.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { agentRouteBindingSchema, routeKey, type AgentRouteBinding } from \"../agent-routes\";\nimport type { Task } from \"../schema/task\";\nimport {\n defineTaskMessageProtocol,\n defineTaskMessageProtocols,\n type TaskMessageProtocols,\n} from \"../schema/task-message\";\nimport type { TaskMessageAuthorize } from \"../store/task-messages\";\nimport { standardTaskMessageProtocols, type StandardTaskMessageProtocol } from \"../task-protocols\";\nimport type { PlannerRuntimeOptions } from \"./contracts\";\n\n/** Exact task-scoped protocol that activates an initial or recovery planner turn. */\nexport const plannerStartTaskMessageProtocol = defineTaskMessageProtocol({\n id: \"planner-start\",\n version: 1,\n sourceFence: \"task\",\n payload: z.strictObject({\n reason: z\n .string()\n .min(1)\n .max(1000)\n .describe(\"Durable initial or recovery turn reason, not execution instructions.\"),\n }),\n});\n\n/** Registry containing the standard protocols and the exact planner-start protocol. */\nexport type PlannerMessageProtocols = TaskMessageProtocols<\n StandardTaskMessageProtocol | typeof plannerStartTaskMessageProtocol\n>;\n\n/** Creates the standard task-message protocol registry used by planners. */\nexport function createPlannerMessageProtocols(): PlannerMessageProtocols {\n return defineTaskMessageProtocols([\n ...standardTaskMessageProtocols,\n plannerStartTaskMessageProtocol,\n ]);\n}\n\n/** Only trusted server code may construct this identity; agent tools authenticate a Task binding separately. */\nexport function createPlannerMessagePolicy(\n plannerRoute: AgentRouteBinding,\n workerRoutes: readonly AgentRouteBinding[] = [],\n): TaskMessageAuthorize {\n const planner = routeKey(agentRouteBindingSchema.parse(plannerRoute));\n const workers = new Set(\n workerRoutes.map((route) => routeKey(agentRouteBindingSchema.parse(route))),\n );\n const isPlanner = (task: Task) =>\n task.work.route !== undefined && routeKey(task.work.route) === planner;\n const ownedChild = (child: Task, parent: Task) =>\n child.parentTaskId === parent.id &&\n child.rootTaskId === parent.rootTaskId &&\n isPlanner(parent) &&\n (isPlanner(child) ||\n (child.work.route !== undefined && workers.has(routeKey(child.work.route))));\n return ({ principal, action, fromTask, toTask }) => {\n if (principal.id !== \"factory:planner-runtime\" || principal.taskId !== undefined) return false;\n if (!fromTask) return isPlanner(toTask) && action !== \"send\" && action !== \"send_result\";\n if (fromTask.rootTaskId !== toTask.rootTaskId) return false;\n if (action === \"send_result\") return ownedChild(fromTask, toTask);\n if (action === \"send\")\n return (isPlanner(fromTask) && fromTask.id === toTask.id) || ownedChild(toTask, fromTask);\n return (\n isPlanner(toTask) &&\n (fromTask.id === toTask.id || ownedChild(fromTask, toTask) || ownedChild(toTask, fromTask))\n );\n };\n}\n\nexport function plannerConfiguration(options: PlannerRuntimeOptions) {\n const plannerRoute = agentRouteBindingSchema.parse(options.plannerRoute);\n const workerRoutes = options.workerRoutes.map((route) => agentRouteBindingSchema.parse(route));\n const allowed = new Map(\n [plannerRoute, ...workerRoutes].map((binding) => {\n const route = options.routes.get(binding);\n if (!route) throw new Error(`Planner route ${routeKey(binding)} is not registered`);\n return [routeKey(binding), structuredClone(route)] as const;\n }),\n );\n if (allowed.size > 32) throw new Error(\"At most 32 planner and worker routes may be configured\");\n const limits = Object.freeze(\n z\n .strictObject({\n maxDepth: z\n .number()\n .int()\n .min(0)\n .max(255)\n .default(4)\n .describe(\"Maximum child depth below the graph root.\"),\n maxChildren: z\n .number()\n .int()\n .min(1)\n .max(32)\n .default(32)\n .describe(\"Total direct children per planner, including previous batches.\"),\n maxTurns: z\n .number()\n .int()\n .min(1)\n .max(256)\n .default(16)\n .describe(\"Maximum execution attempts per planner, including recovery turns.\"),\n })\n .parse(options.limits ?? {}),\n );\n return {\n allowed,\n limits,\n plannerRoute,\n isPlanner: (task: Task) =>\n task.work.route !== undefined && routeKey(task.work.route) === routeKey(plannerRoute),\n };\n}\nexport type PlannerConfiguration = ReturnType<typeof plannerConfiguration>;\n"],"mappings":";;;;;;;AAaA,MAAa,kCAAkC,0BAA0B;CACvE,IAAI;CACJ,SAAS;CACT,aAAa;CACb,SAAS,EAAE,aAAa,EACtB,QAAQ,EACL,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,IAAI,GAAI,CAAC,CACT,SAAS,sEAAsE,EACpF,CAAC;AACH,CAAC;;AAQD,SAAgB,gCAAyD;CACvE,OAAO,2BAA2B,CAChC,GAAG,8BACH,+BACF,CAAC;AACH;;AAGA,SAAgB,2BACd,cACA,eAA6C,CAAC,GACxB;CACtB,MAAM,UAAU,SAAS,wBAAwB,MAAM,YAAY,CAAC;CACpE,MAAM,UAAU,IAAI,IAClB,aAAa,KAAK,UAAU,SAAS,wBAAwB,MAAM,KAAK,CAAC,CAAC,CAC5E;CACA,MAAM,aAAa,SACjB,KAAK,KAAK,UAAU,KAAA,KAAa,SAAS,KAAK,KAAK,KAAK,MAAM;CACjE,MAAM,cAAc,OAAa,WAC/B,MAAM,iBAAiB,OAAO,MAC9B,MAAM,eAAe,OAAO,cAC5B,UAAU,MAAM,MACf,UAAU,KAAK,KACb,MAAM,KAAK,UAAU,KAAA,KAAa,QAAQ,IAAI,SAAS,MAAM,KAAK,KAAK,CAAC;CAC7E,QAAQ,EAAE,WAAW,QAAQ,UAAU,aAAa;EAClD,IAAI,UAAU,OAAO,6BAA6B,UAAU,WAAW,KAAA,GAAW,OAAO;EACzF,IAAI,CAAC,UAAU,OAAO,UAAU,MAAM,KAAK,WAAW,UAAU,WAAW;EAC3E,IAAI,SAAS,eAAe,OAAO,YAAY,OAAO;EACtD,IAAI,WAAW,eAAe,OAAO,WAAW,UAAU,MAAM;EAChE,IAAI,WAAW,QACb,OAAQ,UAAU,QAAQ,KAAK,SAAS,OAAO,OAAO,MAAO,WAAW,QAAQ,QAAQ;EAC1F,OACE,UAAU,MAAM,MACf,SAAS,OAAO,OAAO,MAAM,WAAW,UAAU,MAAM,KAAK,WAAW,QAAQ,QAAQ;CAE7F;AACF;AAEA,SAAgB,qBAAqB,SAAgC;CACnE,MAAM,eAAe,wBAAwB,MAAM,QAAQ,YAAY;CACvE,MAAM,eAAe,QAAQ,aAAa,KAAK,UAAU,wBAAwB,MAAM,KAAK,CAAC;CAC7F,MAAM,UAAU,IAAI,IAClB,CAAC,cAAc,GAAG,YAAY,CAAC,CAAC,KAAK,YAAY;EAC/C,MAAM,QAAQ,QAAQ,OAAO,IAAI,OAAO;EACxC,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,iBAAiB,SAAS,OAAO,EAAE,mBAAmB;EAClF,OAAO,CAAC,SAAS,OAAO,GAAG,gBAAgB,KAAK,CAAC;CACnD,CAAC,CACH;CACA,IAAI,QAAQ,OAAO,IAAI,MAAM,IAAI,MAAM,wDAAwD;CA4B/F,OAAO;EACL;EACA,QA7Ba,OAAO,OACpB,EACG,aAAa;GACZ,UAAU,EACP,OAAO,CAAC,CACR,IAAI,CAAC,CACL,IAAI,CAAC,CAAC,CACN,IAAI,GAAG,CAAC,CACR,QAAQ,CAAC,CAAC,CACV,SAAS,2CAA2C;GACvD,aAAa,EACV,OAAO,CAAC,CACR,IAAI,CAAC,CACL,IAAI,CAAC,CAAC,CACN,IAAI,EAAE,CAAC,CACP,QAAQ,EAAE,CAAC,CACX,SAAS,gEAAgE;GAC5E,UAAU,EACP,OAAO,CAAC,CACR,IAAI,CAAC,CACL,IAAI,CAAC,CAAC,CACN,IAAI,GAAG,CAAC,CACR,QAAQ,EAAE,CAAC,CACX,SAAS,mEAAmE;EACjF,CAAC,CAAC,CACD,MAAM,QAAQ,UAAU,CAAC,CAAC,CAIxB;EACL;EACA,YAAY,SACV,KAAK,KAAK,UAAU,KAAA,KAAa,SAAS,KAAK,KAAK,KAAK,MAAM,SAAS,YAAY;CACxF;AACF"}
@@ -0,0 +1,136 @@
1
+ import { RepositoryId, TaskId } from "../schema/id.mjs";
2
+ import { AgentRouteBinding } from "../schema/agent-route.mjs";
3
+ import { ExecutionReference, Task } from "../schema/task.mjs";
4
+ import { AgentRouteRegistry } from "../agent-routes.mjs";
5
+ import { TaskMessageId, TaskMessageProtocolBinding } from "../schema/task-message.mjs";
6
+ import { IsoDateTimeClock, MaybePromise } from "../schema/common.mjs";
7
+ import { TaskAttemptRef } from "../schema/execution.mjs";
8
+ import { FactoryStores } from "../store/engine.mjs";
9
+ import { DispatchBudget } from "../dispatch.mjs";
10
+ import { z } from "zod";
11
+ //#region src/planning/contracts.d.ts
12
+ /** Minimal persistence capabilities required by the recursive planner runtime. */
13
+ type PlannerStores = Pick<FactoryStores, "answers" | "graphs" | "messages" | "receipts" | "tasks" | "work" | "workflowRecords">;
14
+ /** Validates one bounded, durable decision produced by a planner turn. */
15
+ declare const plannerDecisionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
16
+ action: z.ZodLiteral<"delegate">;
17
+ summary: z.ZodString;
18
+ children: z.ZodReadonly<z.ZodArray<z.ZodObject<{
19
+ key: z.ZodString;
20
+ title: z.ZodString;
21
+ instructions: z.ZodString;
22
+ route: z.core.$ZodBranded<z.ZodObject<{
23
+ id: z.ZodString;
24
+ version: z.ZodNumber;
25
+ }, z.core.$strict>, "AgentRouteBinding", "out">;
26
+ repositoryIds: z.ZodReadonly<z.ZodArray<z.ZodType<`repo_${string}`, string, z.core.$ZodTypeInternals<`repo_${string}`, string>>>>;
27
+ completionCriteria: z.ZodReadonly<z.ZodArray<z.ZodString>>;
28
+ dependsOn: z.ZodReadonly<z.ZodArray<z.ZodString>>;
29
+ }, z.core.$strict>>>;
30
+ }, z.core.$strict>, z.ZodObject<{
31
+ action: z.ZodLiteral<"wait">;
32
+ summary: z.ZodString;
33
+ }, z.core.$strict>, z.ZodObject<{
34
+ action: z.ZodLiteral<"complete">;
35
+ summary: z.ZodString;
36
+ output: z.ZodJSONSchema;
37
+ evidenceTaskIds: z.ZodReadonly<z.ZodArray<z.ZodType<`task_${string}`, string, z.core.$ZodTypeInternals<`task_${string}`, string>>>>;
38
+ }, z.core.$strict>, z.ZodObject<{
39
+ action: z.ZodLiteral<"fail">;
40
+ reason: z.ZodString;
41
+ }, z.core.$strict>], "action">;
42
+ /** A bounded planner decision that can delegate, wait, complete, or fail. */
43
+ type PlannerDecision = z.infer<typeof plannerDecisionSchema>;
44
+ /** Result of submitting one exact planner trigger for durable decision processing. */
45
+ type PlannerSubmitResult = {
46
+ readonly status: "busy";
47
+ readonly messageId: TaskMessageId;
48
+ } | {
49
+ readonly status: "processed" | "already_processed";
50
+ readonly messageId: TaskMessageId;
51
+ readonly decision: PlannerDecision;
52
+ };
53
+ /** Trigger and provider prompt prepared for one exact planner attempt. */
54
+ interface PlannerPrepareResult {
55
+ readonly triggerId: TaskMessageId;
56
+ readonly prompt: string;
57
+ }
58
+ /** Structural limits applied to one recursive planner. */
59
+ interface PlannerLimits {
60
+ readonly maxDepth: number;
61
+ readonly maxChildren: number;
62
+ readonly maxTurns: number;
63
+ }
64
+ /** Dependencies, policies, and limits required to run a durable planner. */
65
+ interface PlannerRuntimeOptions {
66
+ readonly stores: PlannerStores;
67
+ readonly routes: AgentRouteRegistry;
68
+ readonly plannerRoute: AgentRouteBinding;
69
+ readonly workerRoutes: readonly AgentRouteBinding[];
70
+ readonly budget?: DispatchBudget;
71
+ /** Publish after the provider turn-finished marker is durable, including idempotent replays. */
72
+ onTurnFinished?(task: Task): Promise<void>;
73
+ readonly now?: IsoDateTimeClock;
74
+ readonly limits?: Partial<PlannerLimits>;
75
+ /** Launch a fresh Task/attempt-bound session, never a followup. Stable provider keys do not guarantee exactly-once creation. */
76
+ launchPlanner(task: Task, prompt: string): Promise<ExecutionReference>;
77
+ canUseRepository?(repositoryId: RepositoryId, task: Task): MaybePromise<boolean>;
78
+ /** Stop after canonical cancellation. Confirmations are durable; ambiguous failures and concurrent calls must be safe to repeat. */
79
+ cancelExecution?(task: Task): Promise<void>;
80
+ }
81
+ /** Bounded graph and workflow context supplied to a planner turn. */
82
+ interface PlannerContext extends TaskAttemptRef {
83
+ readonly triggerId: TaskMessageId;
84
+ readonly trigger: {
85
+ readonly fromTaskId: TaskId;
86
+ readonly type: TaskMessageProtocolBinding;
87
+ readonly content: string;
88
+ readonly truncated: boolean;
89
+ };
90
+ readonly title: string;
91
+ readonly repositoryIds: readonly RepositoryId[];
92
+ readonly repositoriesTruncated: boolean;
93
+ readonly completionCriteria: readonly string[];
94
+ readonly criteriaTruncated: boolean;
95
+ readonly input: string;
96
+ readonly inputTruncated: boolean;
97
+ readonly children: readonly {
98
+ readonly taskId: TaskId;
99
+ readonly title: string;
100
+ readonly state: Task["state"];
101
+ readonly summary: string;
102
+ readonly truncated: boolean;
103
+ }[];
104
+ readonly childrenTruncated: boolean;
105
+ readonly answers: readonly {
106
+ readonly question: string;
107
+ readonly answer: string;
108
+ readonly answeredBy: string;
109
+ }[];
110
+ readonly answersTruncated: boolean;
111
+ readonly limits: PlannerLimits;
112
+ readonly routes: readonly {
113
+ readonly id: string;
114
+ readonly version: number;
115
+ readonly description: string;
116
+ }[];
117
+ }
118
+ /** Effects and recovery outcomes produced by one planner reconciliation pass. */
119
+ interface PlannerReconcileResult {
120
+ readonly queued: readonly TaskId[];
121
+ readonly dispatched: readonly TaskId[];
122
+ readonly delivered: number;
123
+ readonly recovered: number;
124
+ readonly discarded: number;
125
+ readonly cancelled: readonly TaskId[];
126
+ /** Configured provider stops deferred by the shared callback budget or an ambiguous failure. */
127
+ readonly cancellationPending?: readonly TaskId[];
128
+ readonly failed: readonly TaskId[];
129
+ readonly errors: readonly {
130
+ readonly taskId: TaskId;
131
+ readonly message: string;
132
+ }[];
133
+ }
134
+ //#endregion
135
+ export { PlannerContext, PlannerDecision, PlannerLimits, PlannerPrepareResult, PlannerReconcileResult, PlannerRuntimeOptions, PlannerStores, PlannerSubmitResult, plannerDecisionSchema };
136
+ //# sourceMappingURL=contracts.d.mts.map
@@ -0,0 +1,42 @@
1
+ import { repositoryIdSchema, taskIdSchema } from "../schema/id.mjs";
2
+ import { agentRouteBindingSchema } from "../schema/agent-route.mjs";
3
+ import { jsonValueSchema } from "../schema/work.mjs";
4
+ import { z } from "zod";
5
+ //#region src/planning/contracts.ts
6
+ const summary = z.string().trim().min(1).max(1e3).describe("Bounded explanation of the planner's decision.");
7
+ const plannerOutputSchema = z.json().refine((value) => jsonValueSchema.safeParse(value).success, "Completion output is too large").describe("Required bounded JSON completion output.");
8
+ const childSchema = z.strictObject({
9
+ key: z.string().regex(/^[a-z][a-z0-9-]{0,63}$/).describe("Unique sibling key within this delegation batch."),
10
+ title: z.string().trim().min(1).max(256).describe("Child work title."),
11
+ instructions: z.string().trim().min(1).max(16e3).describe("Instructions stored in the child's work input."),
12
+ route: agentRouteBindingSchema.describe("Exact configured worker or recursive planner route."),
13
+ repositoryIds: z.array(repositoryIdSchema).min(1).max(32).readonly().describe("Distinct repositories, restricted to the parent's scope."),
14
+ completionCriteria: z.array(z.string().trim().min(1).max(2048)).max(32).readonly().describe("Explicit child completion criteria."),
15
+ dependsOn: z.array(z.string().min(1).max(69)).max(255).readonly().describe("Sibling keys in this batch or existing same-root Task IDs.")
16
+ });
17
+ /** Validates one bounded, durable decision produced by a planner turn. */
18
+ const plannerDecisionSchema = z.discriminatedUnion("action", [
19
+ z.strictObject({
20
+ action: z.literal("delegate").describe("Admit bounded children and wait for results."),
21
+ summary,
22
+ children: z.array(childSchema).min(1).max(8).readonly().describe("At most eight new children, validated together before effects.")
23
+ }),
24
+ z.strictObject({
25
+ action: z.literal("wait").describe("Wait only while a direct child is outstanding."),
26
+ summary
27
+ }),
28
+ z.strictObject({
29
+ action: z.literal("complete").describe("Explicitly complete after all direct children are terminal."),
30
+ summary,
31
+ output: plannerOutputSchema,
32
+ evidenceTaskIds: z.array(taskIdSchema).max(32).readonly().describe("Successful owned direct children deliberately supporting completion.")
33
+ }),
34
+ z.strictObject({
35
+ action: z.literal("fail").describe("Fail this planner and reconcile cancellation of unfinished descendants."),
36
+ reason: summary.describe("Reason for failing the planner.")
37
+ })
38
+ ]).refine((value) => jsonValueSchema.safeParse(value).success, "Decision must fit bounded work JSON");
39
+ //#endregion
40
+ export { plannerDecisionSchema };
41
+
42
+ //# sourceMappingURL=contracts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.mjs","names":[],"sources":["../../src/planning/contracts.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IsoDateTimeClock, MaybePromise } from \"../schema/common\";\nimport {\n agentRouteBindingSchema,\n type AgentRouteBinding,\n type AgentRouteRegistry,\n} from \"../agent-routes\";\nimport type { DispatchBudget } from \"../dispatch\";\nimport type { TaskAttemptRef } from \"../schema/execution\";\nimport { repositoryIdSchema, taskIdSchema, type RepositoryId, type TaskId } from \"../schema/id\";\nimport type { ExecutionReference, Task } from \"../schema/task\";\nimport type { TaskMessageId, TaskMessageProtocolBinding } from \"../schema/task-message\";\nimport { jsonValueSchema } from \"../schema/work\";\nimport type { FactoryStores } from \"../store/engine\";\n\n/** Minimal persistence capabilities required by the recursive planner runtime. */\nexport type PlannerStores = Pick<\n FactoryStores,\n \"answers\" | \"graphs\" | \"messages\" | \"receipts\" | \"tasks\" | \"work\" | \"workflowRecords\"\n>;\n\nconst summary = z\n .string()\n .trim()\n .min(1)\n .max(1000)\n .describe(\"Bounded explanation of the planner's decision.\");\nconst plannerOutputSchema = z\n .json()\n .refine((value) => jsonValueSchema.safeParse(value).success, \"Completion output is too large\")\n .describe(\"Required bounded JSON completion output.\");\nconst childSchema = z.strictObject({\n key: z\n .string()\n .regex(/^[a-z][a-z0-9-]{0,63}$/)\n .describe(\"Unique sibling key within this delegation batch.\"),\n title: z.string().trim().min(1).max(256).describe(\"Child work title.\"),\n instructions: z\n .string()\n .trim()\n .min(1)\n .max(16_000)\n .describe(\"Instructions stored in the child's work input.\"),\n route: agentRouteBindingSchema.describe(\"Exact configured worker or recursive planner route.\"),\n repositoryIds: z\n .array(repositoryIdSchema)\n .min(1)\n .max(32)\n .readonly()\n .describe(\"Distinct repositories, restricted to the parent's scope.\"),\n completionCriteria: z\n .array(z.string().trim().min(1).max(2048))\n .max(32)\n .readonly()\n .describe(\"Explicit child completion criteria.\"),\n dependsOn: z\n .array(z.string().min(1).max(69))\n .max(255)\n .readonly()\n .describe(\"Sibling keys in this batch or existing same-root Task IDs.\"),\n});\n/** Validates one bounded, durable decision produced by a planner turn. */\nexport const plannerDecisionSchema = z\n .discriminatedUnion(\"action\", [\n z.strictObject({\n action: z.literal(\"delegate\").describe(\"Admit bounded children and wait for results.\"),\n summary,\n children: z\n .array(childSchema)\n .min(1)\n .max(8)\n .readonly()\n .describe(\"At most eight new children, validated together before effects.\"),\n }),\n z.strictObject({\n action: z.literal(\"wait\").describe(\"Wait only while a direct child is outstanding.\"),\n summary,\n }),\n z.strictObject({\n action: z\n .literal(\"complete\")\n .describe(\"Explicitly complete after all direct children are terminal.\"),\n summary,\n output: plannerOutputSchema,\n evidenceTaskIds: z\n .array(taskIdSchema)\n .max(32)\n .readonly()\n .describe(\"Successful owned direct children deliberately supporting completion.\"),\n }),\n z.strictObject({\n action: z\n .literal(\"fail\")\n .describe(\"Fail this planner and reconcile cancellation of unfinished descendants.\"),\n reason: summary.describe(\"Reason for failing the planner.\"),\n }),\n ])\n .refine(\n (value) => jsonValueSchema.safeParse(value).success,\n \"Decision must fit bounded work JSON\",\n );\n\n/** A bounded planner decision that can delegate, wait, complete, or fail. */\nexport type PlannerDecision = z.infer<typeof plannerDecisionSchema>;\n\n/** Result of submitting one exact planner trigger for durable decision processing. */\nexport type PlannerSubmitResult =\n | { readonly status: \"busy\"; readonly messageId: TaskMessageId }\n | {\n readonly status: \"processed\" | \"already_processed\";\n readonly messageId: TaskMessageId;\n readonly decision: PlannerDecision;\n };\n\n/** Trigger and provider prompt prepared for one exact planner attempt. */\nexport interface PlannerPrepareResult {\n readonly triggerId: TaskMessageId;\n readonly prompt: string;\n}\n\n/** Structural limits applied to one recursive planner. */\nexport interface PlannerLimits {\n readonly maxDepth: number;\n readonly maxChildren: number;\n readonly maxTurns: number;\n}\n/** Dependencies, policies, and limits required to run a durable planner. */\nexport interface PlannerRuntimeOptions {\n readonly stores: PlannerStores;\n readonly routes: AgentRouteRegistry;\n readonly plannerRoute: AgentRouteBinding;\n readonly workerRoutes: readonly AgentRouteBinding[];\n readonly budget?: DispatchBudget;\n /** Publish after the provider turn-finished marker is durable, including idempotent replays. */\n onTurnFinished?(task: Task): Promise<void>;\n readonly now?: IsoDateTimeClock;\n readonly limits?: Partial<PlannerLimits>;\n /** Launch a fresh Task/attempt-bound session, never a followup. Stable provider keys do not guarantee exactly-once creation. */\n launchPlanner(task: Task, prompt: string): Promise<ExecutionReference>;\n canUseRepository?(repositoryId: RepositoryId, task: Task): MaybePromise<boolean>;\n /** Stop after canonical cancellation. Confirmations are durable; ambiguous failures and concurrent calls must be safe to repeat. */\n cancelExecution?(task: Task): Promise<void>;\n}\n/** Bounded graph and workflow context supplied to a planner turn. */\nexport interface PlannerContext extends TaskAttemptRef {\n readonly triggerId: TaskMessageId;\n readonly trigger: {\n readonly fromTaskId: TaskId;\n readonly type: TaskMessageProtocolBinding;\n readonly content: string;\n readonly truncated: boolean;\n };\n readonly title: string;\n readonly repositoryIds: readonly RepositoryId[];\n readonly repositoriesTruncated: boolean;\n readonly completionCriteria: readonly string[];\n readonly criteriaTruncated: boolean;\n readonly input: string;\n readonly inputTruncated: boolean;\n readonly children: readonly {\n readonly taskId: TaskId;\n readonly title: string;\n readonly state: Task[\"state\"];\n readonly summary: string;\n readonly truncated: boolean;\n }[];\n readonly childrenTruncated: boolean;\n readonly answers: readonly {\n readonly question: string;\n readonly answer: string;\n readonly answeredBy: string;\n }[];\n readonly answersTruncated: boolean;\n readonly limits: PlannerLimits;\n readonly routes: readonly {\n readonly id: string;\n readonly version: number;\n readonly description: string;\n }[];\n}\n/** Effects and recovery outcomes produced by one planner reconciliation pass. */\nexport interface PlannerReconcileResult {\n readonly queued: readonly TaskId[];\n readonly dispatched: readonly TaskId[];\n readonly delivered: number;\n readonly recovered: number;\n readonly discarded: number;\n readonly cancelled: readonly TaskId[];\n /** Configured provider stops deferred by the shared callback budget or an ambiguous failure. */\n readonly cancellationPending?: readonly TaskId[];\n readonly failed: readonly TaskId[];\n readonly errors: readonly { readonly taskId: TaskId; readonly message: string }[];\n}\n"],"mappings":";;;;;AAqBA,MAAM,UAAU,EACb,OAAO,CAAC,CACR,KAAK,CAAC,CACN,IAAI,CAAC,CAAC,CACN,IAAI,GAAI,CAAC,CACT,SAAS,gDAAgD;AAC5D,MAAM,sBAAsB,EACzB,KAAK,CAAC,CACN,QAAQ,UAAU,gBAAgB,UAAU,KAAK,CAAC,CAAC,SAAS,gCAAgC,CAAC,CAC7F,SAAS,0CAA0C;AACtD,MAAM,cAAc,EAAE,aAAa;CACjC,KAAK,EACF,OAAO,CAAC,CACR,MAAM,wBAAwB,CAAC,CAC/B,SAAS,kDAAkD;CAC9D,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,mBAAmB;CACrE,cAAc,EACX,OAAO,CAAC,CACR,KAAK,CAAC,CACN,IAAI,CAAC,CAAC,CACN,IAAI,IAAM,CAAC,CACX,SAAS,gDAAgD;CAC5D,OAAO,wBAAwB,SAAS,qDAAqD;CAC7F,eAAe,EACZ,MAAM,kBAAkB,CAAC,CACzB,IAAI,CAAC,CAAC,CACN,IAAI,EAAE,CAAC,CACP,SAAS,CAAC,CACV,SAAS,0DAA0D;CACtE,oBAAoB,EACjB,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CACzC,IAAI,EAAE,CAAC,CACP,SAAS,CAAC,CACV,SAAS,qCAAqC;CACjD,WAAW,EACR,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAChC,IAAI,GAAG,CAAC,CACR,SAAS,CAAC,CACV,SAAS,4DAA4D;AAC1E,CAAC;;AAED,MAAa,wBAAwB,EAClC,mBAAmB,UAAU;CAC5B,EAAE,aAAa;EACb,QAAQ,EAAE,QAAQ,UAAU,CAAC,CAAC,SAAS,8CAA8C;EACrF;EACA,UAAU,EACP,MAAM,WAAW,CAAC,CAClB,IAAI,CAAC,CAAC,CACN,IAAI,CAAC,CAAC,CACN,SAAS,CAAC,CACV,SAAS,gEAAgE;CAC9E,CAAC;CACD,EAAE,aAAa;EACb,QAAQ,EAAE,QAAQ,MAAM,CAAC,CAAC,SAAS,gDAAgD;EACnF;CACF,CAAC;CACD,EAAE,aAAa;EACb,QAAQ,EACL,QAAQ,UAAU,CAAC,CACnB,SAAS,6DAA6D;EACzE;EACA,QAAQ;EACR,iBAAiB,EACd,MAAM,YAAY,CAAC,CACnB,IAAI,EAAE,CAAC,CACP,SAAS,CAAC,CACV,SAAS,sEAAsE;CACpF,CAAC;CACD,EAAE,aAAa;EACb,QAAQ,EACL,QAAQ,MAAM,CAAC,CACf,SAAS,yEAAyE;EACrF,QAAQ,QAAQ,SAAS,iCAAiC;CAC5D,CAAC;AACH,CAAC,CAAC,CACD,QACE,UAAU,gBAAgB,UAAU,KAAK,CAAC,CAAC,SAC5C,qCACF"}
@@ -0,0 +1,44 @@
1
+ import { routeKey } from "../agent-routes.mjs";
2
+ //#region src/planning/dependencies.ts
3
+ /** Only the configured planner's owned routed children participate; graph edges, never kind or PR state, establish failure. */
4
+ async function cancelBlockedPlannerChildren(options, config, rootTaskId) {
5
+ const graph = await options.stores.graphs.get(rootTaskId);
6
+ if (!graph) throw new Error("Planner graph missing during dependency reconciliation");
7
+ const cancelled = [];
8
+ for (let pass = 0; pass < graph.nodes.length; pass++) {
9
+ let changed = false;
10
+ for (const node of graph.nodes) {
11
+ const parent = graph.nodes.find((entry) => entry.taskId === node.parentTaskId)?.admission;
12
+ const route = node.admission.work.route;
13
+ if (!parent || !config.isPlanner(parent) || !route || !config.allowed.has(routeKey(route)) || node.admission.question) continue;
14
+ const task = await options.stores.tasks.get(node.taskId);
15
+ if (!task || task.state !== "queued") continue;
16
+ const dependencies = (await options.stores.graphs.get(rootTaskId))?.nodes.find((entry) => entry.taskId === task.id)?.dependencies;
17
+ if (!dependencies) throw new Error("Planner dependency membership missing");
18
+ const failed = [];
19
+ for (const id of dependencies) {
20
+ const dependency = await options.stores.tasks.get(id);
21
+ if (dependency?.state === "failed" || dependency?.state === "cancelled") failed.push(id);
22
+ }
23
+ if (!failed.length) continue;
24
+ try {
25
+ const stopped = await options.stores.tasks.transition(task.id, "cancelled", {
26
+ expectFrom: "queued",
27
+ expectAttempt: task.attempt,
28
+ phase: "workflow",
29
+ reason: `Planner dependency failed or cancelled: ${failed.join(", ")}`.slice(0, 1e3)
30
+ });
31
+ cancelled.push(stopped);
32
+ changed = true;
33
+ } catch (error) {
34
+ if ((await options.stores.tasks.get(task.id))?.state === "queued") throw error;
35
+ }
36
+ }
37
+ if (!changed) break;
38
+ }
39
+ return cancelled;
40
+ }
41
+ //#endregion
42
+ export { cancelBlockedPlannerChildren };
43
+
44
+ //# sourceMappingURL=dependencies.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.mjs","names":[],"sources":["../../src/planning/dependencies.ts"],"sourcesContent":["import { routeKey } from \"../agent-routes\";\nimport type { TaskId } from \"../schema/id\";\nimport type { Task } from \"../schema/task\";\nimport type { PlannerConfiguration } from \"./configuration\";\nimport type { PlannerRuntimeOptions } from \"./contracts\";\n\n/** Only the configured planner's owned routed children participate; graph edges, never kind or PR state, establish failure. */\nexport async function cancelBlockedPlannerChildren(\n options: PlannerRuntimeOptions,\n config: PlannerConfiguration,\n rootTaskId: TaskId,\n): Promise<Task[]> {\n const graph = await options.stores.graphs.get(rootTaskId);\n if (!graph) throw new Error(\"Planner graph missing during dependency reconciliation\");\n const cancelled: Task[] = [];\n for (let pass = 0; pass < graph.nodes.length; pass++) {\n let changed = false;\n for (const node of graph.nodes) {\n const parent = graph.nodes.find((entry) => entry.taskId === node.parentTaskId)?.admission;\n const route = node.admission.work.route;\n if (\n !parent ||\n !config.isPlanner(parent) ||\n !route ||\n !config.allowed.has(routeKey(route)) ||\n node.admission.question\n )\n continue;\n const task = await options.stores.tasks.get(node.taskId);\n if (!task || task.state !== \"queued\") continue;\n const currentGraph = await options.stores.graphs.get(rootTaskId);\n const dependencies = currentGraph?.nodes.find(\n (entry) => entry.taskId === task.id,\n )?.dependencies;\n if (!dependencies) throw new Error(\"Planner dependency membership missing\");\n const failed = [];\n for (const id of dependencies) {\n const dependency = await options.stores.tasks.get(id);\n if (dependency?.state === \"failed\" || dependency?.state === \"cancelled\") failed.push(id);\n }\n if (!failed.length) continue;\n try {\n const stopped = await options.stores.tasks.transition(task.id, \"cancelled\", {\n expectFrom: \"queued\",\n expectAttempt: task.attempt,\n phase: \"workflow\",\n reason: `Planner dependency failed or cancelled: ${failed.join(\", \")}`.slice(0, 1000),\n });\n cancelled.push(stopped);\n changed = true;\n } catch (error) {\n if ((await options.stores.tasks.get(task.id))?.state === \"queued\") throw error;\n }\n }\n if (!changed) break;\n }\n return cancelled;\n}\n"],"mappings":";;;AAOA,eAAsB,6BACpB,SACA,QACA,YACiB;CACjB,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,IAAI,UAAU;CACxD,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,wDAAwD;CACpF,MAAM,YAAoB,CAAC;CAC3B,KAAK,IAAI,OAAO,GAAG,OAAO,MAAM,MAAM,QAAQ,QAAQ;EACpD,IAAI,UAAU;EACd,KAAK,MAAM,QAAQ,MAAM,OAAO;GAC9B,MAAM,SAAS,MAAM,MAAM,MAAM,UAAU,MAAM,WAAW,KAAK,YAAY,CAAC,EAAE;GAChF,MAAM,QAAQ,KAAK,UAAU,KAAK;GAClC,IACE,CAAC,UACD,CAAC,OAAO,UAAU,MAAM,KACxB,CAAC,SACD,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK,CAAC,KACnC,KAAK,UAAU,UAEf;GACF,MAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,IAAI,KAAK,MAAM;GACvD,IAAI,CAAC,QAAQ,KAAK,UAAU,UAAU;GAEtC,MAAM,gBAAe,MADM,QAAQ,OAAO,OAAO,IAAI,UAAU,EAAA,EAC5B,MAAM,MACtC,UAAU,MAAM,WAAW,KAAK,EACnC,CAAC,EAAE;GACH,IAAI,CAAC,cAAc,MAAM,IAAI,MAAM,uCAAuC;GAC1E,MAAM,SAAS,CAAC;GAChB,KAAK,MAAM,MAAM,cAAc;IAC7B,MAAM,aAAa,MAAM,QAAQ,OAAO,MAAM,IAAI,EAAE;IACpD,IAAI,YAAY,UAAU,YAAY,YAAY,UAAU,aAAa,OAAO,KAAK,EAAE;GACzF;GACA,IAAI,CAAC,OAAO,QAAQ;GACpB,IAAI;IACF,MAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,WAAW,KAAK,IAAI,aAAa;KAC1E,YAAY;KACZ,eAAe,KAAK;KACpB,OAAO;KACP,QAAQ,2CAA2C,OAAO,KAAK,IAAI,IAAI,MAAM,GAAG,GAAI;IACtF,CAAC;IACD,UAAU,KAAK,OAAO;IACtB,UAAU;GACZ,SAAS,OAAO;IACd,KAAK,MAAM,QAAQ,OAAO,MAAM,IAAI,KAAK,EAAE,EAAA,EAAI,UAAU,UAAU,MAAM;GAC3E;EACF;EACA,IAAI,CAAC,SAAS;CAChB;CACA,OAAO;AACT"}
@@ -0,0 +1,122 @@
1
+ import { repositoryIdsSchema, taskIdSchema } from "../schema/id.mjs";
2
+ import { routeKey, routeTaskWork } from "../agent-routes.mjs";
3
+ import { plannerCancellationBatch } from "./cancellation.mjs";
4
+ import { terminal } from "./state.mjs";
5
+ import { orderedChildren, validateChildScope, validatePlannerDecision } from "./validation.mjs";
6
+ //#region src/planning/effects.ts
7
+ /** Task/graph writes are not atomic; repeated reconciliation catches admission/cancellation races. */
8
+ async function cancelDescendants(options, parent, cancellations = plannerCancellationBatch(options)) {
9
+ const tasks = await options.stores.work.recover(parent.rootTaskId);
10
+ const owned = /* @__PURE__ */ new Set([parent.id]);
11
+ for (let pass = 0; pass < tasks.length; pass++) {
12
+ const previous = owned.size;
13
+ for (const task of tasks) if (task.parentTaskId && owned.has(task.parentTaskId)) owned.add(task.id);
14
+ if (previous === owned.size) break;
15
+ }
16
+ const cancelled = [];
17
+ const failures = [];
18
+ for (const candidate of tasks) {
19
+ if (candidate.id === parent.id || !owned.has(candidate.id)) continue;
20
+ const current = await options.stores.tasks.get(candidate.id);
21
+ if (!current) continue;
22
+ if (terminal(current)) {
23
+ try {
24
+ await cancellations.stop(current);
25
+ } catch (error) {
26
+ failures.push(error);
27
+ }
28
+ continue;
29
+ }
30
+ try {
31
+ const stopped = await options.stores.tasks.transition(current.id, "cancelled", {
32
+ expectFrom: current.state,
33
+ expectAttempt: current.attempt,
34
+ reason: `Planner ancestor ${parent.id} ${parent.state}`,
35
+ phase: "workflow"
36
+ });
37
+ cancelled.push(current.id);
38
+ try {
39
+ await cancellations.stop(stopped);
40
+ } catch (error) {
41
+ failures.push(error);
42
+ }
43
+ } catch (error) {
44
+ const latest = await options.stores.tasks.get(candidate.id);
45
+ if (!latest || !terminal(latest)) failures.push(error);
46
+ }
47
+ }
48
+ if (failures.length) throw new AggregateError(failures, `Planner ${parent.id} descendant cancellation needs reconciliation`);
49
+ return cancelled;
50
+ }
51
+ function plannerEffects(options, config, state) {
52
+ return async (task, decision, effectKey, cancellations) => {
53
+ const current = await state.authority(task, true);
54
+ if (decision.action === "fail") {
55
+ await cancelDescendants(options, current.state === "failed" ? current : await options.stores.tasks.transition(task.id, "failed", {
56
+ expectFrom: "running",
57
+ expectAttempt: task.attempt,
58
+ reason: decision.reason,
59
+ phase: "workflow"
60
+ }), cancellations);
61
+ return;
62
+ }
63
+ if (decision.action === "complete") {
64
+ if (current.state !== "succeeded") await validatePlannerDecision(options, config, current, decision);
65
+ if (current.state === "succeeded") await options.stores.work.complete({
66
+ task: {
67
+ taskId: task.id,
68
+ attempt: task.attempt
69
+ },
70
+ output: decision.output
71
+ });
72
+ else await options.stores.tasks.transition(task.id, "succeeded", {
73
+ expectFrom: "running",
74
+ expectAttempt: task.attempt,
75
+ output: decision.output,
76
+ reason: decision.summary,
77
+ phase: "workflow"
78
+ });
79
+ return;
80
+ }
81
+ if (current.state !== "running") throw new Error("Delegation and wait effects require a running planner");
82
+ if (decision.action === "delegate") {
83
+ validateChildScope(current, decision, config);
84
+ const ids = /* @__PURE__ */ new Map();
85
+ for (const child of orderedChildren(decision)) {
86
+ await state.authority(task);
87
+ const route = config.allowed.get(routeKey(child.route));
88
+ if (!route) throw new Error("Planner child route is no longer permitted");
89
+ const created = await options.stores.tasks.create({
90
+ parentTaskId: task.id,
91
+ origin: {},
92
+ repositoryIds: repositoryIdsSchema.parse(child.repositoryIds),
93
+ kind: route.taskKind,
94
+ replyTo: current.replyTo,
95
+ work: {
96
+ ...routeTaskWork({
97
+ route,
98
+ title: child.title,
99
+ input: { instructions: child.instructions }
100
+ }),
101
+ completionCriteria: child.completionCriteria
102
+ },
103
+ dependencies: child.dependsOn.map((key) => ids.get(key) ?? taskIdSchema.parse(key)),
104
+ dedupeKey: `${effectKey}:${child.key}`
105
+ });
106
+ ids.set(child.key, created.id);
107
+ }
108
+ }
109
+ await state.authority(task);
110
+ await options.stores.work.waitForMessages({
111
+ task: {
112
+ taskId: task.id,
113
+ attempt: task.attempt
114
+ },
115
+ phase: "planner-waiting"
116
+ });
117
+ };
118
+ }
119
+ //#endregion
120
+ export { cancelDescendants, plannerEffects };
121
+
122
+ //# sourceMappingURL=effects.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.mjs","names":[],"sources":["../../src/planning/effects.ts"],"sourcesContent":["import { routeKey, routeTaskWork } from \"../agent-routes\";\nimport { repositoryIdsSchema, taskIdSchema, type TaskId } from \"../schema/id\";\nimport type { Task } from \"../schema/task\";\nimport { plannerCancellationBatch, type PlannerCancellationBatch } from \"./cancellation\";\nimport type { PlannerConfiguration } from \"./configuration\";\nimport type { PlannerDecision, PlannerRuntimeOptions } from \"./contracts\";\nimport { terminal, type PlannerState } from \"./state\";\nimport { orderedChildren, validateChildScope, validatePlannerDecision } from \"./validation\";\n\n/** Task/graph writes are not atomic; repeated reconciliation catches admission/cancellation races. */\nexport async function cancelDescendants(\n options: PlannerRuntimeOptions,\n parent: Task,\n cancellations = plannerCancellationBatch(options),\n): Promise<TaskId[]> {\n const tasks = await options.stores.work.recover(parent.rootTaskId);\n const owned = new Set([parent.id]);\n for (let pass = 0; pass < tasks.length; pass++) {\n const previous = owned.size;\n for (const task of tasks)\n if (task.parentTaskId && owned.has(task.parentTaskId)) owned.add(task.id);\n if (previous === owned.size) break;\n }\n const cancelled: TaskId[] = [];\n const failures: unknown[] = [];\n for (const candidate of tasks) {\n if (candidate.id === parent.id || !owned.has(candidate.id)) continue;\n const current = await options.stores.tasks.get(candidate.id);\n if (!current) continue;\n if (terminal(current)) {\n try {\n await cancellations.stop(current);\n } catch (error) {\n failures.push(error);\n }\n continue;\n }\n try {\n const stopped = await options.stores.tasks.transition(current.id, \"cancelled\", {\n expectFrom: current.state,\n expectAttempt: current.attempt,\n reason: `Planner ancestor ${parent.id} ${parent.state}`,\n phase: \"workflow\",\n });\n cancelled.push(current.id);\n try {\n await cancellations.stop(stopped);\n } catch (error) {\n failures.push(error);\n }\n } catch (error) {\n const latest = await options.stores.tasks.get(candidate.id);\n if (!latest || !terminal(latest)) failures.push(error);\n }\n }\n if (failures.length)\n throw new AggregateError(\n failures,\n `Planner ${parent.id} descendant cancellation needs reconciliation`,\n );\n return cancelled;\n}\n\nexport function plannerEffects(\n options: PlannerRuntimeOptions,\n config: PlannerConfiguration,\n state: PlannerState,\n) {\n return async (\n task: Task,\n decision: PlannerDecision,\n effectKey: string,\n cancellations?: PlannerCancellationBatch,\n ): Promise<void> => {\n const current = await state.authority(task, true);\n if (decision.action === \"fail\") {\n const failed =\n current.state === \"failed\"\n ? current\n : await options.stores.tasks.transition(task.id, \"failed\", {\n expectFrom: \"running\",\n expectAttempt: task.attempt,\n reason: decision.reason,\n phase: \"workflow\",\n });\n await cancelDescendants(options, failed, cancellations);\n return;\n }\n if (decision.action === \"complete\") {\n if (current.state !== \"succeeded\")\n await validatePlannerDecision(options, config, current, decision);\n if (current.state === \"succeeded\")\n await options.stores.work.complete({\n task: { taskId: task.id, attempt: task.attempt },\n output: decision.output,\n });\n else\n await options.stores.tasks.transition(task.id, \"succeeded\", {\n expectFrom: \"running\",\n expectAttempt: task.attempt,\n output: decision.output,\n reason: decision.summary,\n phase: \"workflow\",\n });\n return;\n }\n if (current.state !== \"running\")\n throw new Error(\"Delegation and wait effects require a running planner\");\n if (decision.action === \"delegate\") {\n validateChildScope(current, decision, config);\n const ids = new Map<string, TaskId>();\n for (const child of orderedChildren(decision)) {\n await state.authority(task);\n const route = config.allowed.get(routeKey(child.route));\n if (!route) throw new Error(\"Planner child route is no longer permitted\");\n const created = await options.stores.tasks.create({\n parentTaskId: task.id,\n origin: {},\n repositoryIds: repositoryIdsSchema.parse(child.repositoryIds),\n kind: route.taskKind,\n replyTo: current.replyTo,\n work: {\n ...routeTaskWork({\n route: route,\n title: child.title,\n input: { instructions: child.instructions },\n }),\n completionCriteria: child.completionCriteria,\n },\n dependencies: child.dependsOn.map((key) => ids.get(key) ?? taskIdSchema.parse(key)),\n dedupeKey: `${effectKey}:${child.key}`,\n });\n ids.set(child.key, created.id);\n }\n }\n await state.authority(task);\n await options.stores.work.waitForMessages({\n task: { taskId: task.id, attempt: task.attempt },\n phase: \"planner-waiting\",\n });\n };\n}\n"],"mappings":";;;;;;;AAUA,eAAsB,kBACpB,SACA,QACA,gBAAgB,yBAAyB,OAAO,GAC7B;CACnB,MAAM,QAAQ,MAAM,QAAQ,OAAO,KAAK,QAAQ,OAAO,UAAU;CACjE,MAAM,wBAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;CACjC,KAAK,IAAI,OAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ;EAC9C,MAAM,WAAW,MAAM;EACvB,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,gBAAgB,MAAM,IAAI,KAAK,YAAY,GAAG,MAAM,IAAI,KAAK,EAAE;EAC1E,IAAI,aAAa,MAAM,MAAM;CAC/B;CACA,MAAM,YAAsB,CAAC;CAC7B,MAAM,WAAsB,CAAC;CAC7B,KAAK,MAAM,aAAa,OAAO;EAC7B,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,GAAG;EAC5D,MAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,IAAI,UAAU,EAAE;EAC3D,IAAI,CAAC,SAAS;EACd,IAAI,SAAS,OAAO,GAAG;GACrB,IAAI;IACF,MAAM,cAAc,KAAK,OAAO;GAClC,SAAS,OAAO;IACd,SAAS,KAAK,KAAK;GACrB;GACA;EACF;EACA,IAAI;GACF,MAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,WAAW,QAAQ,IAAI,aAAa;IAC7E,YAAY,QAAQ;IACpB,eAAe,QAAQ;IACvB,QAAQ,oBAAoB,OAAO,GAAG,GAAG,OAAO;IAChD,OAAO;GACT,CAAC;GACD,UAAU,KAAK,QAAQ,EAAE;GACzB,IAAI;IACF,MAAM,cAAc,KAAK,OAAO;GAClC,SAAS,OAAO;IACd,SAAS,KAAK,KAAK;GACrB;EACF,SAAS,OAAO;GACd,MAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,IAAI,UAAU,EAAE;GAC1D,IAAI,CAAC,UAAU,CAAC,SAAS,MAAM,GAAG,SAAS,KAAK,KAAK;EACvD;CACF;CACA,IAAI,SAAS,QACX,MAAM,IAAI,eACR,UACA,WAAW,OAAO,GAAG,8CACvB;CACF,OAAO;AACT;AAEA,SAAgB,eACd,SACA,QACA,OACA;CACA,OAAO,OACL,MACA,UACA,WACA,kBACkB;EAClB,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,IAAI;EAChD,IAAI,SAAS,WAAW,QAAQ;GAU9B,MAAM,kBAAkB,SARtB,QAAQ,UAAU,WACd,UACA,MAAM,QAAQ,OAAO,MAAM,WAAW,KAAK,IAAI,UAAU;IACvD,YAAY;IACZ,eAAe,KAAK;IACpB,QAAQ,SAAS;IACjB,OAAO;GACT,CAAC,GACkC,aAAa;GACtD;EACF;EACA,IAAI,SAAS,WAAW,YAAY;GAClC,IAAI,QAAQ,UAAU,aACpB,MAAM,wBAAwB,SAAS,QAAQ,SAAS,QAAQ;GAClE,IAAI,QAAQ,UAAU,aACpB,MAAM,QAAQ,OAAO,KAAK,SAAS;IACjC,MAAM;KAAE,QAAQ,KAAK;KAAI,SAAS,KAAK;IAAQ;IAC/C,QAAQ,SAAS;GACnB,CAAC;QAED,MAAM,QAAQ,OAAO,MAAM,WAAW,KAAK,IAAI,aAAa;IAC1D,YAAY;IACZ,eAAe,KAAK;IACpB,QAAQ,SAAS;IACjB,QAAQ,SAAS;IACjB,OAAO;GACT,CAAC;GACH;EACF;EACA,IAAI,QAAQ,UAAU,WACpB,MAAM,IAAI,MAAM,uDAAuD;EACzE,IAAI,SAAS,WAAW,YAAY;GAClC,mBAAmB,SAAS,UAAU,MAAM;GAC5C,MAAM,sBAAM,IAAI,IAAoB;GACpC,KAAK,MAAM,SAAS,gBAAgB,QAAQ,GAAG;IAC7C,MAAM,MAAM,UAAU,IAAI;IAC1B,MAAM,QAAQ,OAAO,QAAQ,IAAI,SAAS,MAAM,KAAK,CAAC;IACtD,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,4CAA4C;IACxE,MAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,OAAO;KAChD,cAAc,KAAK;KACnB,QAAQ,CAAC;KACT,eAAe,oBAAoB,MAAM,MAAM,aAAa;KAC5D,MAAM,MAAM;KACZ,SAAS,QAAQ;KACjB,MAAM;MACJ,GAAG,cAAc;OACR;OACP,OAAO,MAAM;OACb,OAAO,EAAE,cAAc,MAAM,aAAa;MAC5C,CAAC;MACD,oBAAoB,MAAM;KAC5B;KACA,cAAc,MAAM,UAAU,KAAK,QAAQ,IAAI,IAAI,GAAG,KAAK,aAAa,MAAM,GAAG,CAAC;KAClF,WAAW,GAAG,UAAU,GAAG,MAAM;IACnC,CAAC;IACD,IAAI,IAAI,MAAM,KAAK,QAAQ,EAAE;GAC/B;EACF;EACA,MAAM,MAAM,UAAU,IAAI;EAC1B,MAAM,QAAQ,OAAO,KAAK,gBAAgB;GACxC,MAAM;IAAE,QAAQ,KAAK;IAAI,SAAS,KAAK;GAAQ;GAC/C,OAAO;EACT,CAAC;CACH;AACF"}