@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,53 @@
1
+ import { RepositoryId } from "../../schema/id.mjs";
2
+ import { AgentRouteBinding } from "../../schema/agent-route.mjs";
3
+ import { Task } from "../../schema/task.mjs";
4
+ import "../../agent-routes.mjs";
5
+ import { WorkNotification } from "../../store/work-notifications.mjs";
6
+ import { MillisecondClock } from "../../schema/common.mjs";
7
+ import { FactoryStores } from "../../store/engine.mjs";
8
+ import { DispatchBudget } from "../../dispatch.mjs";
9
+ import { TaskCommunicationReconciler } from "../../task-communication.mjs";
10
+ import { SweepQueuedOptions, SweepQueuedResult } from "../../sweep.mjs";
11
+ import { PlannerReconcileResult } from "../../planning/contracts.mjs";
12
+ import "../../planning/runtime.mjs";
13
+ import { SoftwareDevelopmentTaskCommunicationStores } from "./task-communication.mjs";
14
+ //#region src/presets/software-development/dispatch.d.ts
15
+ /** Factory capabilities composed by the supplied software-development dispatcher. */
16
+ type SoftwareDevelopmentDispatchStores = Pick<FactoryStores, "changes" | "graphs" | "outbox" | "receipts" | "repositories" | "sessions" | "tasks" | "work">;
17
+ /** Application policies and adapters for reconciling one reference-work root graph. */
18
+ interface DispatchSoftwareDevelopmentWorkOptions {
19
+ /** Durable wakeup identifying the canonical Task graph to reconcile. */
20
+ readonly event: WorkNotification;
21
+ /** Provider delivery identity used to deduplicate continuation wakeups. */
22
+ readonly deliveryId: string;
23
+ stores: SoftwareDevelopmentDispatchStores;
24
+ planning: {
25
+ isPlanner(task: Task): boolean;
26
+ reconcile(tasks: readonly Task[]): Promise<PlannerReconcileResult>;
27
+ };
28
+ launchers: SweepQueuedOptions["launchers"];
29
+ budget: DispatchBudget;
30
+ verificationRoute?: AgentRouteBinding;
31
+ canUseRepository(id: RepositoryId): Promise<boolean>;
32
+ publish(event: WorkNotification, delaySeconds?: number): Promise<void>;
33
+ /**
34
+ * Tasks a workflow owns and reconciles itself. The reference dispatcher skips
35
+ * them so the two never drive the same execution.
36
+ */
37
+ ownedByWorkflow?(tasks: readonly Task[]): readonly Task[];
38
+ now?: MillisecondClock;
39
+ retryDelayMs?: number;
40
+ maxDispatches?: number;
41
+ plannerBatchSize?: number;
42
+ /** Application-selected projection from task state to outbound communication. */
43
+ reconcileCommunications?: TaskCommunicationReconciler<SoftwareDevelopmentTaskCommunicationStores>;
44
+ }
45
+ /** Queued-dispatch and planner reconciliation results for one notified root graph. */
46
+ interface DispatchSoftwareDevelopmentWorkResult extends SweepQueuedResult {
47
+ readonly planner: PlannerReconcileResult;
48
+ }
49
+ /** Reconcile one notified root graph without scanning or scheduling unrelated work. */
50
+ declare function dispatchSoftwareDevelopmentWork(options: DispatchSoftwareDevelopmentWorkOptions): Promise<DispatchSoftwareDevelopmentWorkResult>;
51
+ //#endregion
52
+ export { DispatchSoftwareDevelopmentWorkOptions, DispatchSoftwareDevelopmentWorkResult, SoftwareDevelopmentDispatchStores, dispatchSoftwareDevelopmentWork };
53
+ //# sourceMappingURL=dispatch.d.mts.map
@@ -0,0 +1,66 @@
1
+ import { sweepSettlements } from "../../budget.mjs";
2
+ import { agentSessionIdSchema } from "../../schema/session.mjs";
3
+ import { sweepQueued } from "../../sweep.mjs";
4
+ import { ensureChangeVerificationTasks } from "../../change-verification/dispatch.mjs";
5
+ import { reconcileMultiRepositoryChangeTasks } from "../../multi-repository-changes/coordination.mjs";
6
+ import { createSoftwareDevelopmentTaskCommunication } from "./task-communication.mjs";
7
+ //#region src/presets/software-development/dispatch.ts
8
+ const defaultReconcileTaskCommunications = createSoftwareDevelopmentTaskCommunication().reconcile;
9
+ /** Reconcile one notified root graph without scanning or scheduling unrelated work. */
10
+ async function dispatchSoftwareDevelopmentWork(options) {
11
+ const { deliveryId, event, stores, planning } = options;
12
+ const recover = async () => {
13
+ const graph = await stores.work.recover(event.rootTaskId);
14
+ const owned = new Set((options.ownedByWorkflow?.(graph) ?? []).map((task) => task.id));
15
+ return graph.filter((task) => !owned.has(task.id));
16
+ };
17
+ let tasks = await recover();
18
+ for (const id of new Set(tasks.flatMap((task) => task.repositoryIds))) if (!await options.canUseRepository(id)) throw new Error(`Work repository ${id} is no longer enabled and configured`);
19
+ for (const task of tasks.filter((task) => task.state === "queued" && task.replyTo.channel === "api")) {
20
+ const session = await stores.sessions.get(agentSessionIdSchema.parse(task.replyTo.address));
21
+ if (!session || session.route !== void 0 && session.taskId === void 0 || task.work.route?.id === "conversation" && !session.continuations?.some((entry) => entry.taskId === task.id)) throw new Error(`Task ${task.id} is waiting for its durable API session binding`);
22
+ }
23
+ for (const task of tasks) if (task.kind === "coordination" && task.state === "running") await reconcileMultiRepositoryChangeTasks(stores, task.id);
24
+ if (options.verificationRoute) await ensureChangeVerificationTasks({
25
+ stores,
26
+ tasks: await recover(),
27
+ route: options.verificationRoute
28
+ });
29
+ await sweepSettlements(stores, { tasks: await recover() });
30
+ const planner = await planning.reconcile(await recover());
31
+ tasks = await recover();
32
+ const ready = [];
33
+ const now = (options.now ?? Date.now)();
34
+ for (const task of tasks.filter((task) => !planning.isPlanner(task))) {
35
+ const retryAt = Date.parse(task.updatedAt) + (options.retryDelayMs ?? 6e4);
36
+ if (task.state === "queued" && task.attempt > 1 && retryAt > now) await options.publish({
37
+ rootTaskId: event.rootTaskId,
38
+ key: `retry:${task.id}:${task.attempt}`
39
+ }, Math.ceil((retryAt - now) / 1e3));
40
+ else ready.push(task);
41
+ }
42
+ const result = await sweepQueued(stores, {
43
+ tasks: ready,
44
+ launchers: options.launchers,
45
+ budget: options.budget,
46
+ maxDispatches: options.maxDispatches ?? 1
47
+ });
48
+ await (options.reconcileCommunications ?? defaultReconcileTaskCommunications)(stores, await recover());
49
+ if (result.skipped.some((entry) => entry.reason === "per-sweep dispatch limit reached") || planner.dispatched.length || planner.delivered >= (options.plannerBatchSize ?? 32) || planner.recovered + planner.discarded >= (options.plannerBatchSize ?? 32)) await options.publish({
50
+ rootTaskId: event.rootTaskId,
51
+ key: `continue:${deliveryId}`
52
+ });
53
+ if (planner.errors.length || planner.cancellationPending?.length || result.failed.length) throw new Error(`Work reconciliation needs retry: ${JSON.stringify({
54
+ planner: planner.errors,
55
+ cancellationPending: planner.cancellationPending,
56
+ failed: result.failed
57
+ })}`);
58
+ return {
59
+ ...result,
60
+ planner
61
+ };
62
+ }
63
+ //#endregion
64
+ export { dispatchSoftwareDevelopmentWork };
65
+
66
+ //# sourceMappingURL=dispatch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.mjs","names":[],"sources":["../../../src/presets/software-development/dispatch.ts"],"sourcesContent":["import { sweepSettlements } from \"../../budget\";\nimport type { AgentRouteBinding } from \"../../agent-routes\";\nimport { ensureChangeVerificationTasks } from \"../../change-verification/dispatch\";\nimport type { DispatchBudget } from \"../../dispatch\";\nimport { reconcileMultiRepositoryChangeTasks } from \"../../multi-repository-changes/coordination\";\nimport type { PlannerReconcileResult } from \"../../planning/runtime\";\nimport type { MillisecondClock } from \"../../schema/common\";\nimport type { RepositoryId } from \"../../schema/id\";\nimport { agentSessionIdSchema } from \"../../schema/session\";\nimport type { Task } from \"../../schema/task\";\nimport type { FactoryStores } from \"../../store/engine\";\nimport type { WorkNotification } from \"../../store/work-notifications\";\nimport { sweepQueued, type SweepQueuedOptions, type SweepQueuedResult } from \"../../sweep\";\nimport type { TaskCommunicationReconciler } from \"../../task-communication\";\nimport {\n createSoftwareDevelopmentTaskCommunication,\n type SoftwareDevelopmentTaskCommunicationStores,\n} from \"./task-communication\";\n\nconst defaultReconcileTaskCommunications = createSoftwareDevelopmentTaskCommunication().reconcile;\n\n/** Factory capabilities composed by the supplied software-development dispatcher. */\nexport type SoftwareDevelopmentDispatchStores = Pick<\n FactoryStores,\n \"changes\" | \"graphs\" | \"outbox\" | \"receipts\" | \"repositories\" | \"sessions\" | \"tasks\" | \"work\"\n>;\n\n/** Application policies and adapters for reconciling one reference-work root graph. */\nexport interface DispatchSoftwareDevelopmentWorkOptions {\n /** Durable wakeup identifying the canonical Task graph to reconcile. */\n readonly event: WorkNotification;\n /** Provider delivery identity used to deduplicate continuation wakeups. */\n readonly deliveryId: string;\n stores: SoftwareDevelopmentDispatchStores;\n planning: {\n isPlanner(task: Task): boolean;\n reconcile(tasks: readonly Task[]): Promise<PlannerReconcileResult>;\n };\n launchers: SweepQueuedOptions[\"launchers\"];\n budget: DispatchBudget;\n verificationRoute?: AgentRouteBinding;\n canUseRepository(id: RepositoryId): Promise<boolean>;\n publish(event: WorkNotification, delaySeconds?: number): Promise<void>;\n /**\n * Tasks a workflow owns and reconciles itself. The reference dispatcher skips\n * them so the two never drive the same execution.\n */\n ownedByWorkflow?(tasks: readonly Task[]): readonly Task[];\n now?: MillisecondClock;\n retryDelayMs?: number;\n maxDispatches?: number;\n plannerBatchSize?: number;\n /** Application-selected projection from task state to outbound communication. */\n reconcileCommunications?: TaskCommunicationReconciler<SoftwareDevelopmentTaskCommunicationStores>;\n}\n\n/** Queued-dispatch and planner reconciliation results for one notified root graph. */\nexport interface DispatchSoftwareDevelopmentWorkResult extends SweepQueuedResult {\n readonly planner: PlannerReconcileResult;\n}\n\n/** Reconcile one notified root graph without scanning or scheduling unrelated work. */\nexport async function dispatchSoftwareDevelopmentWork(\n options: DispatchSoftwareDevelopmentWorkOptions,\n): Promise<DispatchSoftwareDevelopmentWorkResult> {\n const { deliveryId, event, stores, planning } = options;\n const recover = async () => {\n const graph = await stores.work.recover(event.rootTaskId);\n const owned = new Set((options.ownedByWorkflow?.(graph) ?? []).map((task) => task.id));\n return graph.filter((task) => !owned.has(task.id));\n };\n let tasks = await recover();\n for (const id of new Set(tasks.flatMap((task) => task.repositoryIds))) {\n if (!(await options.canUseRepository(id)))\n throw new Error(`Work repository ${id} is no longer enabled and configured`);\n }\n // Admission may publish before the API finishes binding its session or continuation.\n for (const task of tasks.filter(\n (task) => task.state === \"queued\" && task.replyTo.channel === \"api\",\n )) {\n const session = await stores.sessions.get(agentSessionIdSchema.parse(task.replyTo.address));\n if (\n !session ||\n (session.route !== undefined && session.taskId === undefined) ||\n (task.work.route?.id === \"conversation\" &&\n !session.continuations?.some((entry) => entry.taskId === task.id))\n ) {\n throw new Error(`Task ${task.id} is waiting for its durable API session binding`);\n }\n }\n for (const task of tasks) {\n if (task.kind === \"coordination\" && task.state === \"running\")\n await reconcileMultiRepositoryChangeTasks(stores, task.id);\n }\n if (options.verificationRoute)\n await ensureChangeVerificationTasks({\n stores,\n tasks: await recover(),\n route: options.verificationRoute,\n });\n await sweepSettlements(stores, { tasks: await recover() });\n const planner = await planning.reconcile(await recover());\n tasks = await recover();\n const ready: Task[] = [];\n const now = (options.now ?? Date.now)();\n for (const task of tasks.filter((task) => !planning.isPlanner(task))) {\n const retryAt = Date.parse(task.updatedAt) + (options.retryDelayMs ?? 60_000);\n if (task.state === \"queued\" && task.attempt > 1 && retryAt > now) {\n await options.publish(\n { rootTaskId: event.rootTaskId, key: `retry:${task.id}:${task.attempt}` },\n Math.ceil((retryAt - now) / 1000),\n );\n } else ready.push(task);\n }\n const result = await sweepQueued(stores, {\n tasks: ready,\n launchers: options.launchers,\n budget: options.budget,\n maxDispatches: options.maxDispatches ?? 1,\n });\n await (options.reconcileCommunications ?? defaultReconcileTaskCommunications)(\n stores,\n await recover(),\n );\n // Continue bounded batches through the queue, never through the next recovery interval.\n if (\n result.skipped.some((entry) => entry.reason === \"per-sweep dispatch limit reached\") ||\n planner.dispatched.length ||\n planner.delivered >= (options.plannerBatchSize ?? 32) ||\n planner.recovered + planner.discarded >= (options.plannerBatchSize ?? 32)\n ) {\n await options.publish({ rootTaskId: event.rootTaskId, key: `continue:${deliveryId}` });\n }\n if (planner.errors.length || planner.cancellationPending?.length || result.failed.length) {\n throw new Error(\n `Work reconciliation needs retry: ${JSON.stringify({ planner: planner.errors, cancellationPending: planner.cancellationPending, failed: result.failed })}`,\n );\n }\n return { ...result, planner };\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { DelegateWorkflowPolicy } from "../../eve/invoke.mjs";
2
+ //#region src/presets/software-development/eve-delegation-policy.d.ts
3
+ /** Multi-repository code changes are supplied as one coordination tree. */
4
+ declare const softwareDevelopmentDelegationPolicy: DelegateWorkflowPolicy;
5
+ //#endregion
6
+ export { softwareDevelopmentDelegationPolicy };
7
+ //# sourceMappingURL=eve-delegation-policy.d.mts.map
@@ -0,0 +1,34 @@
1
+ import { parseAgentRouteBinding } from "../../schema/agent-route.mjs";
2
+ import { createMultiRepositoryChangeTasks } from "../../multi-repository-changes/coordination.mjs";
3
+ //#region src/presets/software-development/eve-delegation-policy.ts
4
+ /** Multi-repository code changes are supplied as one coordination tree. */
5
+ const softwareDevelopmentDelegationPolicy = async ({ stores, route, repositoryIds, signalId, replyTo, operator, dispatch }) => {
6
+ if (route.taskKind !== "code_change" || repositoryIds.length < 2) return null;
7
+ const [first, second, ...rest] = repositoryIds;
8
+ const coordination = await createMultiRepositoryChangeTasks(stores, {
9
+ repositoryIds: [
10
+ first,
11
+ second,
12
+ ...rest
13
+ ],
14
+ replyTo,
15
+ childRoute: route,
16
+ ...signalId === void 0 ? {} : { dedupeKey: `route:${signalId}:${route.id}:${route.version}` },
17
+ ...signalId === void 0 ? { operator } : { signalId }
18
+ });
19
+ await Promise.all(coordination.children.filter((child) => child.state === "queued").map(dispatch));
20
+ return {
21
+ taskId: coordination.parent.id,
22
+ childTaskIds: coordination.children.map(({ id }) => id),
23
+ route: parseAgentRouteBinding({
24
+ id: route.id,
25
+ version: route.version
26
+ }),
27
+ agent: route.agent,
28
+ state: coordination.parent.state
29
+ };
30
+ };
31
+ //#endregion
32
+ export { softwareDevelopmentDelegationPolicy };
33
+
34
+ //# sourceMappingURL=eve-delegation-policy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eve-delegation-policy.mjs","names":[],"sources":["../../../src/presets/software-development/eve-delegation-policy.ts"],"sourcesContent":["import type { DelegateWorkflowPolicy } from \"../../eve/invoke\";\nimport { parseAgentRouteBinding } from \"../../agent-routes\";\nimport { createMultiRepositoryChangeTasks } from \"../../multi-repository-changes/coordination\";\n\n/** Multi-repository code changes are supplied as one coordination tree. */\nexport const softwareDevelopmentDelegationPolicy: DelegateWorkflowPolicy = async ({\n stores,\n route,\n repositoryIds,\n signalId,\n replyTo,\n operator,\n dispatch,\n}) => {\n if (route.taskKind !== \"code_change\" || repositoryIds.length < 2) return null;\n const [first, second, ...rest] = repositoryIds;\n const coordination = await createMultiRepositoryChangeTasks(stores, {\n repositoryIds: [first, second, ...rest],\n replyTo,\n childRoute: route,\n ...(signalId === undefined\n ? {}\n : { dedupeKey: `route:${signalId}:${route.id}:${route.version}` }),\n ...(signalId === undefined ? { operator } : { signalId }),\n });\n await Promise.all(\n coordination.children.filter((child) => child.state === \"queued\").map(dispatch),\n );\n return {\n taskId: coordination.parent.id,\n childTaskIds: coordination.children.map(({ id }) => id),\n route: parseAgentRouteBinding({ id: route.id, version: route.version }),\n agent: route.agent,\n state: coordination.parent.state,\n };\n};\n"],"mappings":";;;;AAKA,MAAa,sCAA8D,OAAO,EAChF,QACA,OACA,eACA,UACA,SACA,UACA,eACI;CACJ,IAAI,MAAM,aAAa,iBAAiB,cAAc,SAAS,GAAG,OAAO;CACzE,MAAM,CAAC,OAAO,QAAQ,GAAG,QAAQ;CACjC,MAAM,eAAe,MAAM,iCAAiC,QAAQ;EAClE,eAAe;GAAC;GAAO;GAAQ,GAAG;EAAI;EACtC;EACA,YAAY;EACZ,GAAI,aAAa,KAAA,IACb,CAAC,IACD,EAAE,WAAW,SAAS,SAAS,GAAG,MAAM,GAAG,GAAG,MAAM,UAAU;EAClE,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,EAAE,SAAS;CACzD,CAAC;CACD,MAAM,QAAQ,IACZ,aAAa,SAAS,QAAQ,UAAU,MAAM,UAAU,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAChF;CACA,OAAO;EACL,QAAQ,aAAa,OAAO;EAC5B,cAAc,aAAa,SAAS,KAAK,EAAE,SAAS,EAAE;EACtD,OAAO,uBAAuB;GAAE,IAAI,MAAM;GAAI,SAAS,MAAM;EAAQ,CAAC;EACtE,OAAO,MAAM;EACb,OAAO,aAAa,OAAO;CAC7B;AACF"}
@@ -0,0 +1,18 @@
1
+ import { FactoryStores } from "../../store/engine.mjs";
2
+ import { RecordChangeTool, RecordChangeToolOptions } from "../../changes/eve-record-change.mjs";
3
+ import { TaskTools, TaskToolsOptions } from "../../eve/index.mjs";
4
+ import { softwareDevelopmentDelegationPolicy } from "./eve-delegation-policy.mjs";
5
+ //#region src/presets/software-development/eve.d.ts
6
+ /** Change, receipt, Signal, and Task capabilities used by the supplied software tool bundle. */
7
+ type SoftwareDevelopmentToolsStores = Pick<FactoryStores, "changes" | "receipts" | "signals" | "tasks">;
8
+ /** Configuration for the generic and software-development tools exposed to an Eve agent. */
9
+ interface SoftwareDevelopmentToolsOptions extends TaskToolsOptions, RecordChangeToolOptions {}
10
+ /** Generic Task tools plus the software workflow's pull-request outcome tool. */
11
+ interface SoftwareDevelopmentTools extends TaskTools {
12
+ readonly record_change: RecordChangeTool;
13
+ }
14
+ /** Build Eve tools with the software-development completion policy. */
15
+ declare function createSoftwareDevelopmentTools(stores: SoftwareDevelopmentToolsStores, options?: SoftwareDevelopmentToolsOptions): SoftwareDevelopmentTools;
16
+ //#endregion
17
+ export { SoftwareDevelopmentTools, SoftwareDevelopmentToolsOptions, SoftwareDevelopmentToolsStores, createSoftwareDevelopmentTools, softwareDevelopmentDelegationPolicy };
18
+ //# sourceMappingURL=eve.d.mts.map
@@ -0,0 +1,19 @@
1
+ import { createTaskTools } from "../../eve/index.mjs";
2
+ import { createRecordChangeTool } from "../../changes/eve-record-change.mjs";
3
+ import { softwareDevelopmentFinishTaskPolicy } from "./finish-task-policy.mjs";
4
+ import { softwareDevelopmentDelegationPolicy } from "./eve-delegation-policy.mjs";
5
+ //#region src/presets/software-development/eve.ts
6
+ /** Build Eve tools with the software-development completion policy. */
7
+ function createSoftwareDevelopmentTools(stores, options = {}) {
8
+ return {
9
+ ...createTaskTools(stores, {
10
+ ...options,
11
+ finishTaskPolicy: options.finishTaskPolicy ?? softwareDevelopmentFinishTaskPolicy
12
+ }),
13
+ record_change: createRecordChangeTool(stores, options)
14
+ };
15
+ }
16
+ //#endregion
17
+ export { createSoftwareDevelopmentTools, softwareDevelopmentDelegationPolicy };
18
+
19
+ //# sourceMappingURL=eve.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eve.mjs","names":[],"sources":["../../../src/presets/software-development/eve.ts"],"sourcesContent":["import { createTaskTools, type TaskTools, type TaskToolsOptions } from \"../../eve\";\nimport { softwareDevelopmentFinishTaskPolicy } from \"./finish-task-policy\";\nexport { softwareDevelopmentDelegationPolicy } from \"./eve-delegation-policy\";\nimport type { FactoryStores } from \"../../store/engine\";\nimport {\n createRecordChangeTool,\n type RecordChangeTool,\n type RecordChangeToolOptions,\n} from \"../../changes/eve-record-change\";\n\n/** Change, receipt, Signal, and Task capabilities used by the supplied software tool bundle. */\nexport type SoftwareDevelopmentToolsStores = Pick<\n FactoryStores,\n \"changes\" | \"receipts\" | \"signals\" | \"tasks\"\n>;\n\n/** Configuration for the generic and software-development tools exposed to an Eve agent. */\nexport interface SoftwareDevelopmentToolsOptions\n extends TaskToolsOptions, RecordChangeToolOptions {}\n\n/** Generic Task tools plus the software workflow's pull-request outcome tool. */\nexport interface SoftwareDevelopmentTools extends TaskTools {\n readonly record_change: RecordChangeTool;\n}\n\n/** Build Eve tools with the software-development completion policy. */\nexport function createSoftwareDevelopmentTools(\n stores: SoftwareDevelopmentToolsStores,\n options: SoftwareDevelopmentToolsOptions = {},\n): SoftwareDevelopmentTools {\n return {\n ...createTaskTools(stores, {\n ...options,\n finishTaskPolicy: options.finishTaskPolicy ?? softwareDevelopmentFinishTaskPolicy,\n }),\n record_change: createRecordChangeTool(stores, options),\n };\n}\n"],"mappings":";;;;;;AA0BA,SAAgB,+BACd,QACA,UAA2C,CAAC,GAClB;CAC1B,OAAO;EACL,GAAG,gBAAgB,QAAQ;GACzB,GAAG;GACH,kBAAkB,QAAQ,oBAAoB;EAChD,CAAC;EACD,eAAe,uBAAuB,QAAQ,OAAO;CACvD;AACF"}
@@ -0,0 +1,7 @@
1
+ import { Task } from "../../schema/task.mjs";
2
+ //#region src/presets/software-development/finish-task-policy.d.ts
3
+ /** Require the supplied code-change and verification outcome tools. */
4
+ declare function softwareDevelopmentFinishTaskPolicy(task: Task): string | null;
5
+ //#endregion
6
+ export { softwareDevelopmentFinishTaskPolicy };
7
+ //# sourceMappingURL=finish-task-policy.d.mts.map
@@ -0,0 +1,9 @@
1
+ //#region src/presets/software-development/finish-task-policy.ts
2
+ /** Require the supplied code-change and verification outcome tools. */
3
+ function softwareDevelopmentFinishTaskPolicy(task) {
4
+ return task.kind === "code_change" || task.kind === "verification" ? `${task.kind} tasks end with their own outcome tool` : null;
5
+ }
6
+ //#endregion
7
+ export { softwareDevelopmentFinishTaskPolicy };
8
+
9
+ //# sourceMappingURL=finish-task-policy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finish-task-policy.mjs","names":[],"sources":["../../../src/presets/software-development/finish-task-policy.ts"],"sourcesContent":["import type { Task } from \"../../schema/task\";\n\n/** Require the supplied code-change and verification outcome tools. */\nexport function softwareDevelopmentFinishTaskPolicy(task: Task): string | null {\n return task.kind === \"code_change\" || task.kind === \"verification\"\n ? `${task.kind} tasks end with their own outcome tool`\n : null;\n}\n"],"mappings":";;AAGA,SAAgB,oCAAoC,MAA2B;CAC7E,OAAO,KAAK,SAAS,iBAAiB,KAAK,SAAS,iBAChD,GAAG,KAAK,KAAK,0CACb;AACN"}
@@ -0,0 +1,32 @@
1
+ import { ExecutionReference, Task } from "../../schema/task.mjs";
2
+ import { AgentRoute, AgentRouteRegistry } from "../../agent-routes.mjs";
3
+ import { ImageAttachment } from "../../image-input.mjs";
4
+ import { FactoryStores } from "../../store/engine.mjs";
5
+ import { SweepQueuedOptions } from "../../sweep.mjs";
6
+ //#region src/presets/software-development/recovery.d.ts
7
+ /** Answer, Change, session, and Signal capabilities used to assemble recovery launchers. */
8
+ type SoftwareDevelopmentRecoveryStores = Pick<FactoryStores, "answers" | "changes" | "sessions" | "signals">;
9
+ /** Identifies one replacement attempt on its exact registered software agent route. */
10
+ interface StartSoftwareDevelopmentRecoveryInput {
11
+ readonly route: AgentRoute;
12
+ readonly task: Task;
13
+ readonly message: string;
14
+ readonly images?: {
15
+ readonly owner: string;
16
+ readonly attachments: readonly ImageAttachment[];
17
+ };
18
+ }
19
+ /** Starts a replacement attempt using its exact registered software agent route. */
20
+ type StartSoftwareDevelopmentRecovery = (input: StartSoftwareDevelopmentRecoveryInput) => Promise<ExecutionReference>;
21
+ /** Stores, route registry, and execution boundaries used to assemble recovery launchers. */
22
+ interface SoftwareDevelopmentRecoveryOptions {
23
+ stores: SoftwareDevelopmentRecoveryStores;
24
+ routes: AgentRouteRegistry;
25
+ start: StartSoftwareDevelopmentRecovery;
26
+ continueConversation: (task: Task) => Promise<ExecutionReference>;
27
+ }
28
+ /** Assemble replacement-attempt launchers for the supplied software-factory routes. */
29
+ declare function createSoftwareDevelopmentRecoveryLaunchers(options: SoftwareDevelopmentRecoveryOptions): SweepQueuedOptions["launchers"];
30
+ //#endregion
31
+ export { SoftwareDevelopmentRecoveryOptions, SoftwareDevelopmentRecoveryStores, StartSoftwareDevelopmentRecovery, StartSoftwareDevelopmentRecoveryInput, createSoftwareDevelopmentRecoveryLaunchers };
32
+ //# sourceMappingURL=recovery.d.mts.map
@@ -0,0 +1,120 @@
1
+ import { routeKey } from "../../agent-routes.mjs";
2
+ import { findFindingForTask, formatFindingRemediationBrief } from "../../finding-remediation/brief.mjs";
3
+ import { agentSessionIdSchema } from "../../schema/session.mjs";
4
+ import { normalizeFactoryReviewComment, normalizeGitHubPullRequest } from "../../github.mjs";
5
+ import { formatChangeVerificationBrief } from "../../change-verification/brief.mjs";
6
+ import { mergeConflictPayloadSchema } from "../../merge-resolution/contracts.mjs";
7
+ import { formatDeepsecScanBrief } from "./deepsec-brief.mjs";
8
+ //#region src/presets/software-development/recovery.ts
9
+ /** Assemble replacement-attempt launchers for the supplied software-factory routes. */
10
+ function createSoftwareDevelopmentRecoveryLaunchers(options) {
11
+ const { stores, routes, start, continueConversation } = options;
12
+ const briefs = {
13
+ "code-change@1": async (task, repository) => withAnsweredQuestions(stores, task, formatFindingRemediationBrief(task, repository, await findFindingForTask(stores, task))),
14
+ "code-review@1": (task, repository) => codeReviewBrief(stores, task, repository),
15
+ "review-follow-up@1": (task, repository) => reviewFollowUpBrief(stores, task, repository),
16
+ "merge-conflict@1": (task, repository) => mergeConflictBrief(stores, task, repository),
17
+ "security-scan@1": async (task, repository) => formatDeepsecScanBrief(task, repository),
18
+ "verification@1": (task, repository) => verificationTaskBrief(stores, task, repository)
19
+ };
20
+ const launchers = {};
21
+ for (const route of routes.routes) {
22
+ const key = routeKey(route);
23
+ const brief = briefs[key] ?? ((task) => withAnsweredQuestions(stores, task, `You are assigned replacement attempt ${task.attempt} for task ${task.id}. Read the task before starting.\n\n${task.work.title}\n\nWork input:\n${JSON.stringify(task.work.input)}`));
24
+ launchers[key] = async (task, repository) => {
25
+ if (!task.work.route || routeKey(task.work.route) !== key) throw new Error(`Task ${task.id} is not bound to agent route ${key}`);
26
+ if (task.replyTo.channel === "api") {
27
+ const session = await stores.sessions.get(agentSessionIdSchema.parse(task.replyTo.address));
28
+ if (session === null) throw new Error(`API session binding is missing for task ${task.id}`);
29
+ if (session.taskId === task.id) {
30
+ if (session.agent !== route.agent) throw new Error(`API session agent differs from route ${route.id}`);
31
+ const message = await withAnsweredQuestions(stores, task, `You are assigned Factory task ${task.id}. Read it before starting.\n\n${session.changeId === void 0 ? "" : `Existing change: ${session.changeId}.\n\n`}${session.message}`);
32
+ return start({
33
+ route,
34
+ task,
35
+ message,
36
+ ...session.attachments?.length ? { images: {
37
+ owner: session.owner,
38
+ attachments: session.attachments
39
+ } } : {}
40
+ });
41
+ }
42
+ }
43
+ const input = task.work.input;
44
+ const instructions = isJsonObject(input) && typeof input.instructions === "string" ? input.instructions : void 0;
45
+ const message = instructions === void 0 ? await brief(task, repository) : await withAnsweredQuestions(stores, task, `You are assigned Factory task ${task.id}. Read it before starting.\n\n${task.work.title}\n\n${instructions}\n\nCompletion criteria:\n${task.work.completionCriteria.join("\n")}`);
46
+ return start({
47
+ route,
48
+ task,
49
+ message
50
+ });
51
+ };
52
+ }
53
+ launchers["conversation@1"] = async (task) => {
54
+ if (task.work.route?.id !== "conversation" || task.work.route.version !== 1 || task.replyTo.channel !== "api") throw new Error(`Task ${task.id} is not bound to conversation@1`);
55
+ if (!(await stores.sessions.get(agentSessionIdSchema.parse(task.replyTo.address)))?.continuations?.some((item) => item.taskId === task.id)) throw new Error(`Conversation binding is missing for task ${task.id}`);
56
+ return continueConversation(task);
57
+ };
58
+ return launchers;
59
+ }
60
+ function isJsonObject(value) {
61
+ return value !== null && typeof value === "object" && !Array.isArray(value);
62
+ }
63
+ async function codeReviewBrief(stores, task, repository) {
64
+ const signal = task.origin.signalId === void 0 ? null : await stores.signals.get(task.origin.signalId);
65
+ const normalized = signal?.source === "github_pr" ? normalizeGitHubPullRequest({
66
+ deliveryId: signal.deliveryId,
67
+ event: "pull_request",
68
+ payload: signal.payload
69
+ }) : null;
70
+ const changeId = task.changeId ?? await changeIdForPullRequest(stores, repository, normalized?.pullRequest.pullRequestUrl);
71
+ return withAnsweredQuestions(stores, task, [
72
+ `You are assigned replacement attempt ${task.attempt} for code review task ${task.id}.`,
73
+ changeId === void 0 ? null : `Change under review: ${changeId}.`,
74
+ normalized === null ? null : `Pull request: ${normalized.pullRequest.pullRequestUrl}.`,
75
+ normalized === null ? null : `Expected head commit: ${normalized.pullRequest.headSha}.`,
76
+ "Read the task, fetch and review the pull request, then record exactly one review result with record_post_review."
77
+ ].filter((line) => line !== null).join("\n\n"));
78
+ }
79
+ async function reviewFollowUpBrief(stores, task, repository) {
80
+ const signal = task.origin.signalId === void 0 ? null : await stores.signals.get(task.origin.signalId);
81
+ const review = signal?.source === "github_pr_comment" ? normalizeFactoryReviewComment({
82
+ event: "pull_request_review_comment",
83
+ payload: signal.payload
84
+ }) : null;
85
+ const changeId = task.changeId ?? await changeIdForPullRequest(stores, repository, review?.pullRequestUrl);
86
+ return withAnsweredQuestions(stores, task, [
87
+ `You are assigned replacement attempt ${task.attempt} for factory task ${task.id}.`,
88
+ changeId === void 0 ? null : `Change under review: ${changeId}.`,
89
+ review === null ? null : `Inline review comment: ${review.commentId}.`,
90
+ review === null ? null : `Pull request: ${review.pullRequestUrl}.`,
91
+ "Read the task and originating review comment. Apply a concrete high-confidence fix, post a medium-confidence suggestion, or answer with findings, then finish the task."
92
+ ].filter((line) => line !== null).join("\n\n"));
93
+ }
94
+ async function mergeConflictBrief(stores, task, repository) {
95
+ const signal = task.origin.signalId === void 0 ? null : await stores.signals.get(task.origin.signalId);
96
+ const parsed = mergeConflictPayloadSchema.safeParse(signal?.payload);
97
+ return withAnsweredQuestions(stores, task, parsed.success ? [
98
+ `You are assigned replacement attempt ${task.attempt} for merge conflict task ${task.id} in ${repository.slug}.`,
99
+ `Pull request: ${parsed.data.prUrl}.`,
100
+ "Read the task, fetch the conflict with fetch_merge_conflict, resolve and test it, then publish_merge_resolution."
101
+ ].join("\n\n") : [`You are assigned replacement attempt ${task.attempt} for merge conflict task ${task.id} in ${repository.slug}.`, "Read the task and recover its merge-conflict context with the dedicated tools. Do not guess a pull request identifier."].join("\n\n"));
102
+ }
103
+ async function verificationTaskBrief(stores, task, repository) {
104
+ if (task.changeId === void 0) throw new Error(`verification task ${task.id} has no change`);
105
+ const change = await stores.changes.get(task.changeId);
106
+ if (change === null) throw new Error(`change ${task.changeId} does not exist`);
107
+ return withAnsweredQuestions(stores, task, formatChangeVerificationBrief(task, repository, change));
108
+ }
109
+ async function changeIdForPullRequest(stores, repository, prUrl) {
110
+ if (prUrl === void 0) return void 0;
111
+ return (await stores.changes.list()).find((change) => change.repositoryId === repository.id && change.prUrl === prUrl)?.id;
112
+ }
113
+ async function withAnsweredQuestions(stores, task, brief) {
114
+ const answers = (await Promise.all((task.answerEventIds ?? []).map((id) => stores.answers.get(id)))).flatMap((event) => event === null ? [] : [`${event.question}\nAnswer: ${event.answer}`]);
115
+ return answers.length === 0 ? brief : `${brief}\n\nHuman answers:\n${answers.join("\n\n")}`;
116
+ }
117
+ //#endregion
118
+ export { createSoftwareDevelopmentRecoveryLaunchers };
119
+
120
+ //# sourceMappingURL=recovery.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.mjs","names":[],"sources":["../../../src/presets/software-development/recovery.ts"],"sourcesContent":["import {\n routeKey,\n type AgentRoute,\n type AgentRouteKey,\n type AgentRouteRegistry,\n} from \"../../agent-routes\";\nimport { formatChangeVerificationBrief } from \"../../change-verification/brief\";\nimport { findFindingForTask, formatFindingRemediationBrief } from \"../../finding-remediation/brief\";\nimport { normalizeFactoryReviewComment, normalizeGitHubPullRequest } from \"../../github\";\nimport type { ImageAttachment } from \"../../image-input\";\nimport { mergeConflictPayloadSchema } from \"../../merge-resolution/contracts\";\nimport type { Repository } from \"../../schema/repository\";\nimport { agentSessionIdSchema } from \"../../schema/session\";\nimport type { ExecutionReference, Task } from \"../../schema/task\";\nimport type { JsonValue } from \"../../schema/work\";\nimport type { FactoryStores } from \"../../store/engine\";\nimport type { SweepQueuedOptions, TaskLauncher } from \"../../sweep\";\nimport { formatDeepsecScanBrief } from \"./deepsec-brief\";\n\n/** Answer, Change, session, and Signal capabilities used to assemble recovery launchers. */\nexport type SoftwareDevelopmentRecoveryStores = Pick<\n FactoryStores,\n \"answers\" | \"changes\" | \"sessions\" | \"signals\"\n>;\n\n/** Identifies one replacement attempt on its exact registered software agent route. */\nexport interface StartSoftwareDevelopmentRecoveryInput {\n readonly route: AgentRoute;\n readonly task: Task;\n readonly message: string;\n readonly images?: {\n readonly owner: string;\n readonly attachments: readonly ImageAttachment[];\n };\n}\n\n/** Starts a replacement attempt using its exact registered software agent route. */\nexport type StartSoftwareDevelopmentRecovery = (\n input: StartSoftwareDevelopmentRecoveryInput,\n) => Promise<ExecutionReference>;\n\ntype RecoveryBrief = (task: Task, repository: Repository) => Promise<string>;\n\n/** Stores, route registry, and execution boundaries used to assemble recovery launchers. */\nexport interface SoftwareDevelopmentRecoveryOptions {\n stores: SoftwareDevelopmentRecoveryStores;\n routes: AgentRouteRegistry;\n start: StartSoftwareDevelopmentRecovery;\n continueConversation: (task: Task) => Promise<ExecutionReference>;\n}\n\n/** Assemble replacement-attempt launchers for the supplied software-factory routes. */\nexport function createSoftwareDevelopmentRecoveryLaunchers(\n options: SoftwareDevelopmentRecoveryOptions,\n): SweepQueuedOptions[\"launchers\"] {\n const { stores, routes, start, continueConversation } = options;\n const briefs: Readonly<Partial<Record<AgentRouteKey, RecoveryBrief>>> = {\n \"code-change@1\": async (task, repository) =>\n withAnsweredQuestions(\n stores,\n task,\n formatFindingRemediationBrief(task, repository, await findFindingForTask(stores, task)),\n ),\n \"code-review@1\": (task, repository) => codeReviewBrief(stores, task, repository),\n \"review-follow-up@1\": (task, repository) => reviewFollowUpBrief(stores, task, repository),\n \"merge-conflict@1\": (task, repository) => mergeConflictBrief(stores, task, repository),\n \"security-scan@1\": async (task, repository) => formatDeepsecScanBrief(task, repository),\n \"verification@1\": (task, repository) => verificationTaskBrief(stores, task, repository),\n };\n const launchers: Partial<Record<AgentRouteKey, TaskLauncher>> = {};\n for (const route of routes.routes) {\n const key = routeKey(route);\n const brief =\n briefs[key] ??\n ((task: Task) =>\n withAnsweredQuestions(\n stores,\n task,\n `You are assigned replacement attempt ${task.attempt} for task ${task.id}. Read the task before starting.\\n\\n${task.work.title}\\n\\nWork input:\\n${JSON.stringify(task.work.input)}`,\n ));\n launchers[key] = async (task, repository) => {\n if (!task.work.route || routeKey(task.work.route) !== key) {\n throw new Error(`Task ${task.id} is not bound to agent route ${key}`);\n }\n if (task.replyTo.channel === \"api\") {\n const session = await stores.sessions.get(agentSessionIdSchema.parse(task.replyTo.address));\n if (session === null) {\n throw new Error(`API session binding is missing for task ${task.id}`);\n }\n if (session.taskId === task.id) {\n if (session.agent !== route.agent) {\n throw new Error(`API session agent differs from route ${route.id}`);\n }\n const message = await withAnsweredQuestions(\n stores,\n task,\n `You are assigned Factory task ${task.id}. Read it before starting.\\n\\n${session.changeId === undefined ? \"\" : `Existing change: ${session.changeId}.\\n\\n`}${session.message}`,\n );\n return start({\n route,\n task,\n message,\n ...(session.attachments?.length\n ? {\n images: {\n owner: session.owner,\n attachments: session.attachments,\n },\n }\n : {}),\n });\n }\n }\n const input = task.work.input;\n const instructions =\n isJsonObject(input) && typeof input.instructions === \"string\"\n ? input.instructions\n : undefined;\n const message =\n instructions === undefined\n ? await brief(task, repository)\n : await withAnsweredQuestions(\n stores,\n task,\n `You are assigned Factory task ${task.id}. Read it before starting.\\n\\n${task.work.title}\\n\\n${instructions}\\n\\nCompletion criteria:\\n${task.work.completionCriteria.join(\"\\n\")}`,\n );\n return start({ route, task, message });\n };\n }\n launchers[\"conversation@1\"] = async (task) => {\n if (\n task.work.route?.id !== \"conversation\" ||\n task.work.route.version !== 1 ||\n task.replyTo.channel !== \"api\"\n ) {\n throw new Error(`Task ${task.id} is not bound to conversation@1`);\n }\n const session = await stores.sessions.get(agentSessionIdSchema.parse(task.replyTo.address));\n if (!session?.continuations?.some((item) => item.taskId === task.id)) {\n throw new Error(`Conversation binding is missing for task ${task.id}`);\n }\n return continueConversation(task);\n };\n return launchers;\n}\n\nfunction isJsonObject(value: JsonValue): value is { readonly [key: string]: JsonValue } {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function codeReviewBrief(\n stores: SoftwareDevelopmentRecoveryStores,\n task: Task,\n repository: Repository,\n): Promise<string> {\n const signal =\n task.origin.signalId === undefined ? null : await stores.signals.get(task.origin.signalId);\n const normalized =\n signal?.source === \"github_pr\"\n ? normalizeGitHubPullRequest({\n deliveryId: signal.deliveryId,\n event: \"pull_request\",\n payload: signal.payload,\n })\n : null;\n const changeId =\n task.changeId ??\n (await changeIdForPullRequest(stores, repository, normalized?.pullRequest.pullRequestUrl));\n const facts = [\n `You are assigned replacement attempt ${task.attempt} for code review task ${task.id}.`,\n changeId === undefined ? null : `Change under review: ${changeId}.`,\n normalized === null ? null : `Pull request: ${normalized.pullRequest.pullRequestUrl}.`,\n normalized === null ? null : `Expected head commit: ${normalized.pullRequest.headSha}.`,\n \"Read the task, fetch and review the pull request, then record exactly one review result with record_post_review.\",\n ]\n .filter((line) => line !== null)\n .join(\"\\n\\n\");\n return withAnsweredQuestions(stores, task, facts);\n}\n\nasync function reviewFollowUpBrief(\n stores: SoftwareDevelopmentRecoveryStores,\n task: Task,\n repository: Repository,\n): Promise<string> {\n const signal =\n task.origin.signalId === undefined ? null : await stores.signals.get(task.origin.signalId);\n const review =\n signal?.source === \"github_pr_comment\"\n ? normalizeFactoryReviewComment({\n event: \"pull_request_review_comment\",\n payload: signal.payload,\n })\n : null;\n const changeId =\n task.changeId ?? (await changeIdForPullRequest(stores, repository, review?.pullRequestUrl));\n const facts = [\n `You are assigned replacement attempt ${task.attempt} for factory task ${task.id}.`,\n changeId === undefined ? null : `Change under review: ${changeId}.`,\n review === null ? null : `Inline review comment: ${review.commentId}.`,\n review === null ? null : `Pull request: ${review.pullRequestUrl}.`,\n \"Read the task and originating review comment. Apply a concrete high-confidence fix, post a medium-confidence suggestion, or answer with findings, then finish the task.\",\n ]\n .filter((line) => line !== null)\n .join(\"\\n\\n\");\n return withAnsweredQuestions(stores, task, facts);\n}\n\nasync function mergeConflictBrief(\n stores: SoftwareDevelopmentRecoveryStores,\n task: Task,\n repository: Repository,\n): Promise<string> {\n const signal =\n task.origin.signalId === undefined ? null : await stores.signals.get(task.origin.signalId);\n const parsed = mergeConflictPayloadSchema.safeParse(signal?.payload);\n const facts = parsed.success\n ? [\n `You are assigned replacement attempt ${task.attempt} for merge conflict task ${task.id} in ${repository.slug}.`,\n `Pull request: ${parsed.data.prUrl}.`,\n \"Read the task, fetch the conflict with fetch_merge_conflict, resolve and test it, then publish_merge_resolution.\",\n ].join(\"\\n\\n\")\n : [\n `You are assigned replacement attempt ${task.attempt} for merge conflict task ${task.id} in ${repository.slug}.`,\n \"Read the task and recover its merge-conflict context with the dedicated tools. Do not guess a pull request identifier.\",\n ].join(\"\\n\\n\");\n return withAnsweredQuestions(stores, task, facts);\n}\n\nasync function verificationTaskBrief(\n stores: SoftwareDevelopmentRecoveryStores,\n task: Task,\n repository: Repository,\n): Promise<string> {\n if (task.changeId === undefined) throw new Error(`verification task ${task.id} has no change`);\n const change = await stores.changes.get(task.changeId);\n if (change === null) throw new Error(`change ${task.changeId} does not exist`);\n return withAnsweredQuestions(\n stores,\n task,\n formatChangeVerificationBrief(task, repository, change),\n );\n}\n\nasync function changeIdForPullRequest(\n stores: SoftwareDevelopmentRecoveryStores,\n repository: Repository,\n prUrl: string | undefined,\n): Promise<string | undefined> {\n if (prUrl === undefined) return undefined;\n return (await stores.changes.list()).find(\n (change) => change.repositoryId === repository.id && change.prUrl === prUrl,\n )?.id;\n}\n\nasync function withAnsweredQuestions(\n stores: SoftwareDevelopmentRecoveryStores,\n task: Task,\n brief: string,\n): Promise<string> {\n const answers = (\n await Promise.all((task.answerEventIds ?? []).map((id) => stores.answers.get(id)))\n ).flatMap((event) => (event === null ? [] : [`${event.question}\\nAnswer: ${event.answer}`]));\n return answers.length === 0 ? brief : `${brief}\\n\\nHuman answers:\\n${answers.join(\"\\n\\n\")}`;\n}\n"],"mappings":";;;;;;;;;AAoDA,SAAgB,2CACd,SACiC;CACjC,MAAM,EAAE,QAAQ,QAAQ,OAAO,yBAAyB;CACxD,MAAM,SAAkE;EACtE,iBAAiB,OAAO,MAAM,eAC5B,sBACE,QACA,MACA,8BAA8B,MAAM,YAAY,MAAM,mBAAmB,QAAQ,IAAI,CAAC,CACxF;EACF,kBAAkB,MAAM,eAAe,gBAAgB,QAAQ,MAAM,UAAU;EAC/E,uBAAuB,MAAM,eAAe,oBAAoB,QAAQ,MAAM,UAAU;EACxF,qBAAqB,MAAM,eAAe,mBAAmB,QAAQ,MAAM,UAAU;EACrF,mBAAmB,OAAO,MAAM,eAAe,uBAAuB,MAAM,UAAU;EACtF,mBAAmB,MAAM,eAAe,sBAAsB,QAAQ,MAAM,UAAU;CACxF;CACA,MAAM,YAA0D,CAAC;CACjE,KAAK,MAAM,SAAS,OAAO,QAAQ;EACjC,MAAM,MAAM,SAAS,KAAK;EAC1B,MAAM,QACJ,OAAO,UACL,SACA,sBACE,QACA,MACA,wCAAwC,KAAK,QAAQ,YAAY,KAAK,GAAG,sCAAsC,KAAK,KAAK,MAAM,mBAAmB,KAAK,UAAU,KAAK,KAAK,KAAK,GAClL;EACJ,UAAU,OAAO,OAAO,MAAM,eAAe;GAC3C,IAAI,CAAC,KAAK,KAAK,SAAS,SAAS,KAAK,KAAK,KAAK,MAAM,KACpD,MAAM,IAAI,MAAM,QAAQ,KAAK,GAAG,+BAA+B,KAAK;GAEtE,IAAI,KAAK,QAAQ,YAAY,OAAO;IAClC,MAAM,UAAU,MAAM,OAAO,SAAS,IAAI,qBAAqB,MAAM,KAAK,QAAQ,OAAO,CAAC;IAC1F,IAAI,YAAY,MACd,MAAM,IAAI,MAAM,2CAA2C,KAAK,IAAI;IAEtE,IAAI,QAAQ,WAAW,KAAK,IAAI;KAC9B,IAAI,QAAQ,UAAU,MAAM,OAC1B,MAAM,IAAI,MAAM,wCAAwC,MAAM,IAAI;KAEpE,MAAM,UAAU,MAAM,sBACpB,QACA,MACA,iCAAiC,KAAK,GAAG,gCAAgC,QAAQ,aAAa,KAAA,IAAY,KAAK,oBAAoB,QAAQ,SAAS,SAAS,QAAQ,SACvK;KACA,OAAO,MAAM;MACX;MACA;MACA;MACA,GAAI,QAAQ,aAAa,SACrB,EACE,QAAQ;OACN,OAAO,QAAQ;OACf,aAAa,QAAQ;MACvB,EACF,IACA,CAAC;KACP,CAAC;IACH;GACF;GACA,MAAM,QAAQ,KAAK,KAAK;GACxB,MAAM,eACJ,aAAa,KAAK,KAAK,OAAO,MAAM,iBAAiB,WACjD,MAAM,eACN,KAAA;GACN,MAAM,UACJ,iBAAiB,KAAA,IACb,MAAM,MAAM,MAAM,UAAU,IAC5B,MAAM,sBACJ,QACA,MACA,iCAAiC,KAAK,GAAG,gCAAgC,KAAK,KAAK,MAAM,MAAM,aAAa,4BAA4B,KAAK,KAAK,mBAAmB,KAAK,IAAI,GAChL;GACN,OAAO,MAAM;IAAE;IAAO;IAAM;GAAQ,CAAC;EACvC;CACF;CACA,UAAU,oBAAoB,OAAO,SAAS;EAC5C,IACE,KAAK,KAAK,OAAO,OAAO,kBACxB,KAAK,KAAK,MAAM,YAAY,KAC5B,KAAK,QAAQ,YAAY,OAEzB,MAAM,IAAI,MAAM,QAAQ,KAAK,GAAG,gCAAgC;EAGlE,IAAI,EAAC,MADiB,OAAO,SAAS,IAAI,qBAAqB,MAAM,KAAK,QAAQ,OAAO,CAAC,EAAA,EAC5E,eAAe,MAAM,SAAS,KAAK,WAAW,KAAK,EAAE,GACjE,MAAM,IAAI,MAAM,4CAA4C,KAAK,IAAI;EAEvE,OAAO,qBAAqB,IAAI;CAClC;CACA,OAAO;AACT;AAEA,SAAS,aAAa,OAAkE;CACtF,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,eAAe,gBACb,QACA,MACA,YACiB;CACjB,MAAM,SACJ,KAAK,OAAO,aAAa,KAAA,IAAY,OAAO,MAAM,OAAO,QAAQ,IAAI,KAAK,OAAO,QAAQ;CAC3F,MAAM,aACJ,QAAQ,WAAW,cACf,2BAA2B;EACzB,YAAY,OAAO;EACnB,OAAO;EACP,SAAS,OAAO;CAClB,CAAC,IACD;CACN,MAAM,WACJ,KAAK,YACJ,MAAM,uBAAuB,QAAQ,YAAY,YAAY,YAAY,cAAc;CAU1F,OAAO,sBAAsB,QAAQ,MATvB;EACZ,wCAAwC,KAAK,QAAQ,wBAAwB,KAAK,GAAG;EACrF,aAAa,KAAA,IAAY,OAAO,wBAAwB,SAAS;EACjE,eAAe,OAAO,OAAO,iBAAiB,WAAW,YAAY,eAAe;EACpF,eAAe,OAAO,OAAO,yBAAyB,WAAW,YAAY,QAAQ;EACrF;CACF,CAAC,CACE,QAAQ,SAAS,SAAS,IAAI,CAAC,CAC/B,KAAK,MACuC,CAAC;AAClD;AAEA,eAAe,oBACb,QACA,MACA,YACiB;CACjB,MAAM,SACJ,KAAK,OAAO,aAAa,KAAA,IAAY,OAAO,MAAM,OAAO,QAAQ,IAAI,KAAK,OAAO,QAAQ;CAC3F,MAAM,SACJ,QAAQ,WAAW,sBACf,8BAA8B;EAC5B,OAAO;EACP,SAAS,OAAO;CAClB,CAAC,IACD;CACN,MAAM,WACJ,KAAK,YAAa,MAAM,uBAAuB,QAAQ,YAAY,QAAQ,cAAc;CAU3F,OAAO,sBAAsB,QAAQ,MATvB;EACZ,wCAAwC,KAAK,QAAQ,oBAAoB,KAAK,GAAG;EACjF,aAAa,KAAA,IAAY,OAAO,wBAAwB,SAAS;EACjE,WAAW,OAAO,OAAO,0BAA0B,OAAO,UAAU;EACpE,WAAW,OAAO,OAAO,iBAAiB,OAAO,eAAe;EAChE;CACF,CAAC,CACE,QAAQ,SAAS,SAAS,IAAI,CAAC,CAC/B,KAAK,MACuC,CAAC;AAClD;AAEA,eAAe,mBACb,QACA,MACA,YACiB;CACjB,MAAM,SACJ,KAAK,OAAO,aAAa,KAAA,IAAY,OAAO,MAAM,OAAO,QAAQ,IAAI,KAAK,OAAO,QAAQ;CAC3F,MAAM,SAAS,2BAA2B,UAAU,QAAQ,OAAO;CAWnE,OAAO,sBAAsB,QAAQ,MAVvB,OAAO,UACjB;EACE,wCAAwC,KAAK,QAAQ,2BAA2B,KAAK,GAAG,MAAM,WAAW,KAAK;EAC9G,iBAAiB,OAAO,KAAK,MAAM;EACnC;CACF,CAAC,CAAC,KAAK,MAAM,IACb,CACE,wCAAwC,KAAK,QAAQ,2BAA2B,KAAK,GAAG,MAAM,WAAW,KAAK,IAC9G,wHACF,CAAC,CAAC,KAAK,MAAM,CAC+B;AAClD;AAEA,eAAe,sBACb,QACA,MACA,YACiB;CACjB,IAAI,KAAK,aAAa,KAAA,GAAW,MAAM,IAAI,MAAM,qBAAqB,KAAK,GAAG,eAAe;CAC7F,MAAM,SAAS,MAAM,OAAO,QAAQ,IAAI,KAAK,QAAQ;CACrD,IAAI,WAAW,MAAM,MAAM,IAAI,MAAM,UAAU,KAAK,SAAS,gBAAgB;CAC7E,OAAO,sBACL,QACA,MACA,8BAA8B,MAAM,YAAY,MAAM,CACxD;AACF;AAEA,eAAe,uBACb,QACA,YACA,OAC6B;CAC7B,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,QAAQ,MAAM,OAAO,QAAQ,KAAK,EAAA,CAAG,MAClC,WAAW,OAAO,iBAAiB,WAAW,MAAM,OAAO,UAAU,KACxE,CAAC,EAAE;AACL;AAEA,eAAe,sBACb,QACA,MACA,OACiB;CACjB,MAAM,WACJ,MAAM,QAAQ,KAAK,KAAK,kBAAkB,CAAC,EAAA,CAAG,KAAK,OAAO,OAAO,QAAQ,IAAI,EAAE,CAAC,CAAC,EAAA,CACjF,SAAS,UAAW,UAAU,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,YAAY,MAAM,QAAQ,CAAE;CAC3F,OAAO,QAAQ,WAAW,IAAI,QAAQ,GAAG,MAAM,sBAAsB,QAAQ,KAAK,MAAM;AAC1F"}
@@ -0,0 +1,23 @@
1
+ import { Task } from "../../schema/task.mjs";
2
+ import { ReplyTo } from "../../schema/common.mjs";
3
+ import { CommunicationEvent } from "../../schema/communication.mjs";
4
+ import { FactoryStores } from "../../store/engine.mjs";
5
+ import { TaskCommunicationReconciler } from "../../task-communication.mjs";
6
+ //#region src/presets/software-development/task-communication.d.ts
7
+ /** Store capabilities required by supplied software-development communication projections. */
8
+ type SoftwareDevelopmentTaskCommunicationStores = Pick<FactoryStores, "changes" | "outbox" | "receipts" | "repositories" | "tasks">;
9
+ /** Connector presentation settings for supplied software Task communications. */
10
+ interface SoftwareDevelopmentTaskCommunicationOptions {
11
+ githubMention?: string;
12
+ needsHumanReplyTo?: ReplyTo;
13
+ }
14
+ /** Supplied question projection and durable lifecycle communication reconciler. */
15
+ interface SoftwareDevelopmentTaskCommunication {
16
+ questionEvents(task: Task): readonly CommunicationEvent[];
17
+ reconcile: TaskCommunicationReconciler<SoftwareDevelopmentTaskCommunicationStores>;
18
+ }
19
+ /** Supplied Slack, GitHub, and API presentation for a task question. */
20
+ declare function createSoftwareDevelopmentTaskCommunication(options?: SoftwareDevelopmentTaskCommunicationOptions): SoftwareDevelopmentTaskCommunication;
21
+ //#endregion
22
+ export { SoftwareDevelopmentTaskCommunication, SoftwareDevelopmentTaskCommunicationOptions, SoftwareDevelopmentTaskCommunicationStores, createSoftwareDevelopmentTaskCommunication };
23
+ //# sourceMappingURL=task-communication.d.mts.map
@@ -0,0 +1,120 @@
1
+ import { createTaskCommunicationReconciler } from "../../task-communication.mjs";
2
+ //#region src/presets/software-development/task-communication.ts
3
+ /** Supplied Slack, GitHub, and API presentation for a task question. */
4
+ function createSoftwareDevelopmentTaskCommunication(options = {}) {
5
+ const githubMention = options.githubMention ?? "@agent-factory";
6
+ if (githubMention.trim().length === 0) throw new Error("githubMention must not be empty");
7
+ const needsHumanReplyTo = options.needsHumanReplyTo ?? {
8
+ channel: "slack",
9
+ address: "owner"
10
+ };
11
+ function questionEvents(task) {
12
+ if (task.kind !== "question" || task.question === void 0) throw new Error(`Task ${task.id} has no question.`);
13
+ const reference = `Reference: ${task.id}`;
14
+ const instructions = task.replyTo.channel === "slack" ? "To answer, reply in this thread and mention the Factory app." : task.replyTo.channel === "github" && task.replyTo.address.includes("#") ? `To answer, comment on this issue starting with \`${githubMention}\`.` : "Answer in the original conversation.";
15
+ const common = {
16
+ repositoryIds: task.repositoryIds,
17
+ taskId: task.id
18
+ };
19
+ const action = task.needsHumanAction ?? task.question.text;
20
+ const apiInstructions = task.replyTo.channel === "api" ? `\nOpen session ${task.replyTo.address} in your Factory client to answer.${/^ses_[a-z0-9]{6,64}$/u.test(task.replyTo.address) ? ` In Factory TUI: factory-tui --session ${task.replyTo.address}` : ""}` : "";
21
+ return [{
22
+ ...common,
23
+ eventId: `question:${task.id}:${task.attempt}`,
24
+ replyTo: task.replyTo,
25
+ outcome: "question",
26
+ data: {
27
+ question: `${reference}\n\n${instructions}\n\n${task.question.text}`,
28
+ options: task.question.options
29
+ }
30
+ }, {
31
+ ...common,
32
+ eventId: `needs-human:${task.id}:${task.attempt}`,
33
+ replyTo: needsHumanReplyTo,
34
+ outcome: "needs_human",
35
+ data: {
36
+ requestedAction: action.length > 2e3 ? `${action.slice(0, 2e3)}…` : action,
37
+ message: `${reference}\nOpen the original conversation to answer.${apiInstructions}\nReplies in this notification DM do not answer the question.`,
38
+ options: task.question.options,
39
+ questionAttempt: task.attempt,
40
+ ...task.parentTaskId === void 0 ? {} : { parentTaskId: task.parentTaskId },
41
+ replyChannel: task.replyTo.channel,
42
+ replyAddress: task.replyTo.address
43
+ }
44
+ }];
45
+ }
46
+ return {
47
+ questionEvents,
48
+ reconcile: createTaskCommunicationReconciler({
49
+ question: questionEvents,
50
+ async lifecycle({ stores, tasks, task, receipt }) {
51
+ return [task.kind === "coordination" && (receipt.state === "succeeded" || receipt.state === "failed") ? await coordinationEvent(stores, tasks, task, receipt) : eventFor(task, receipt)];
52
+ }
53
+ })
54
+ };
55
+ }
56
+ function eventFor(task, receipt) {
57
+ const common = {
58
+ eventId: `task-lifecycle:${receipt.receiptId}`,
59
+ repositoryIds: task.repositoryIds,
60
+ taskId: task.id,
61
+ ...task.changeId === void 0 ? {} : { changeId: task.changeId },
62
+ replyTo: task.replyTo
63
+ };
64
+ if (receipt.state === "dispatched" && receipt.phase === "retry") return {
65
+ ...common,
66
+ outcome: "started",
67
+ data: { message: `Retry attempt ${receipt.attempt} started.${receipt.reason === void 0 ? "" : ` ${receipt.reason}`}` }
68
+ };
69
+ if (receipt.state === "failed") {
70
+ let prefix = "Work failed.";
71
+ if (receipt.reason?.startsWith("launch failed")) prefix = "Work failed to start.";
72
+ else if (receipt.phase === "retry") prefix = "Retries exhausted.";
73
+ return {
74
+ ...common,
75
+ outcome: "failed",
76
+ data: { reason: `${prefix}${receipt.reason === void 0 ? "" : ` ${receipt.reason}`}` }
77
+ };
78
+ }
79
+ if (receipt.state === "cancelled") {
80
+ const prefix = receipt.phase === "approval" ? "Request rejected." : "Work cancelled.";
81
+ return {
82
+ ...common,
83
+ outcome: "cancelled",
84
+ data: {
85
+ message: `${prefix}${receipt.reason === void 0 ? "" : ` ${receipt.reason}`}`,
86
+ ...receipt.phase === "approval" ? { approvalDecision: true } : {}
87
+ }
88
+ };
89
+ }
90
+ if (receipt.state === "succeeded") return {
91
+ ...common,
92
+ outcome: "succeeded",
93
+ data: {
94
+ summary: receipt.reason ?? "The task completed successfully.",
95
+ output: task.workResult?.output
96
+ }
97
+ };
98
+ throw new Error(`Receipt ${receipt.receiptId} is not a communicable task lifecycle event.`);
99
+ }
100
+ async function coordinationEvent(stores, tasks, parent, receipt) {
101
+ const children = tasks.filter((task) => task.parentTaskId === parent.id);
102
+ const items = await Promise.all(children.map(async (child) => {
103
+ const repository = await stores.repositories.get(child.repositoryIds[0]);
104
+ const change = child.changeId === void 0 ? null : await stores.changes.get(child.changeId);
105
+ return `${repository?.slug ?? child.repositoryIds[0]}: ${change?.prUrl ?? child.state}`;
106
+ }));
107
+ const event = eventFor(parent, receipt);
108
+ return {
109
+ ...event,
110
+ data: {
111
+ ...event.data,
112
+ summary: receipt.state === "succeeded" ? "Coordinated work completed." : "Coordinated work failed in one or more repositories.",
113
+ items
114
+ }
115
+ };
116
+ }
117
+ //#endregion
118
+ export { createSoftwareDevelopmentTaskCommunication };
119
+
120
+ //# sourceMappingURL=task-communication.mjs.map