@substrate-ai/factory 0.19.54 → 0.20.2

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 (491) hide show
  1. package/README.md +39 -0
  2. package/dist/config.d.ts +4 -4
  3. package/package.json +12 -3
  4. package/dist/__tests__/config.test.d.ts +0 -11
  5. package/dist/__tests__/config.test.d.ts.map +0 -1
  6. package/dist/__tests__/config.test.js +0 -215
  7. package/dist/__tests__/config.test.js.map +0 -1
  8. package/dist/__tests__/factory-run-command.test.d.ts +0 -12
  9. package/dist/__tests__/factory-run-command.test.d.ts.map +0 -1
  10. package/dist/__tests__/factory-run-command.test.js +0 -454
  11. package/dist/__tests__/factory-run-command.test.js.map +0 -1
  12. package/dist/__tests__/factory-validate-command.test.d.ts +0 -15
  13. package/dist/__tests__/factory-validate-command.test.d.ts.map +0 -1
  14. package/dist/__tests__/factory-validate-command.test.js +0 -339
  15. package/dist/__tests__/factory-validate-command.test.js.map +0 -1
  16. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.d.ts +0 -72
  17. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.d.ts.map +0 -1
  18. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.js +0 -121
  19. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.js.map +0 -1
  20. package/dist/__tests__/fixtures/llm-edge-routing.dot.d.ts +0 -28
  21. package/dist/__tests__/fixtures/llm-edge-routing.dot.d.ts.map +0 -1
  22. package/dist/__tests__/fixtures/llm-edge-routing.dot.js +0 -55
  23. package/dist/__tests__/fixtures/llm-edge-routing.dot.js.map +0 -1
  24. package/dist/__tests__/fixtures/manager-loop.dot.d.ts +0 -34
  25. package/dist/__tests__/fixtures/manager-loop.dot.d.ts.map +0 -1
  26. package/dist/__tests__/fixtures/manager-loop.dot.js +0 -61
  27. package/dist/__tests__/fixtures/manager-loop.dot.js.map +0 -1
  28. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.d.ts +0 -42
  29. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.d.ts.map +0 -1
  30. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.js +0 -118
  31. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.js.map +0 -1
  32. package/dist/__tests__/fixtures/subgraph-parent.dot.d.ts +0 -35
  33. package/dist/__tests__/fixtures/subgraph-parent.dot.d.ts.map +0 -1
  34. package/dist/__tests__/fixtures/subgraph-parent.dot.js +0 -69
  35. package/dist/__tests__/fixtures/subgraph-parent.dot.js.map +0 -1
  36. package/dist/__tests__/integration/advanced-graph-events.test.d.ts +0 -19
  37. package/dist/__tests__/integration/advanced-graph-events.test.d.ts.map +0 -1
  38. package/dist/__tests__/integration/advanced-graph-events.test.js +0 -288
  39. package/dist/__tests__/integration/advanced-graph-events.test.js.map +0 -1
  40. package/dist/__tests__/integration/checkpoint-resume.test.d.ts +0 -10
  41. package/dist/__tests__/integration/checkpoint-resume.test.d.ts.map +0 -1
  42. package/dist/__tests__/integration/checkpoint-resume.test.js +0 -125
  43. package/dist/__tests__/integration/checkpoint-resume.test.js.map +0 -1
  44. package/dist/__tests__/integration/conditional-pipeline.test.d.ts +0 -10
  45. package/dist/__tests__/integration/conditional-pipeline.test.d.ts.map +0 -1
  46. package/dist/__tests__/integration/conditional-pipeline.test.js +0 -106
  47. package/dist/__tests__/integration/conditional-pipeline.test.js.map +0 -1
  48. package/dist/__tests__/integration/convergence-validation.test.d.ts +0 -14
  49. package/dist/__tests__/integration/convergence-validation.test.d.ts.map +0 -1
  50. package/dist/__tests__/integration/convergence-validation.test.js +0 -449
  51. package/dist/__tests__/integration/convergence-validation.test.js.map +0 -1
  52. package/dist/__tests__/integration/epic44-coverage-gate.test.d.ts +0 -12
  53. package/dist/__tests__/integration/epic44-coverage-gate.test.d.ts.map +0 -1
  54. package/dist/__tests__/integration/epic44-coverage-gate.test.js +0 -58
  55. package/dist/__tests__/integration/epic44-coverage-gate.test.js.map +0 -1
  56. package/dist/__tests__/integration/epic45-coverage-gate.test.d.ts +0 -11
  57. package/dist/__tests__/integration/epic45-coverage-gate.test.d.ts.map +0 -1
  58. package/dist/__tests__/integration/epic45-coverage-gate.test.js +0 -64
  59. package/dist/__tests__/integration/epic45-coverage-gate.test.js.map +0 -1
  60. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.d.ts +0 -2
  61. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.d.ts.map +0 -1
  62. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.js +0 -285
  63. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.js.map +0 -1
  64. package/dist/__tests__/integration/events.test.d.ts +0 -8
  65. package/dist/__tests__/integration/events.test.d.ts.map +0 -1
  66. package/dist/__tests__/integration/events.test.js +0 -194
  67. package/dist/__tests__/integration/events.test.js.map +0 -1
  68. package/dist/__tests__/integration/graphs.d.ts +0 -59
  69. package/dist/__tests__/integration/graphs.d.ts.map +0 -1
  70. package/dist/__tests__/integration/graphs.js +0 -164
  71. package/dist/__tests__/integration/graphs.js.map +0 -1
  72. package/dist/__tests__/integration/helpers.d.ts +0 -127
  73. package/dist/__tests__/integration/helpers.d.ts.map +0 -1
  74. package/dist/__tests__/integration/helpers.js +0 -167
  75. package/dist/__tests__/integration/helpers.js.map +0 -1
  76. package/dist/__tests__/integration/integrity.test.d.ts +0 -8
  77. package/dist/__tests__/integration/integrity.test.d.ts.map +0 -1
  78. package/dist/__tests__/integration/integrity.test.js +0 -198
  79. package/dist/__tests__/integration/integrity.test.js.map +0 -1
  80. package/dist/__tests__/integration/llm-edge-routing.test.d.ts +0 -21
  81. package/dist/__tests__/integration/llm-edge-routing.test.d.ts.map +0 -1
  82. package/dist/__tests__/integration/llm-edge-routing.test.js +0 -341
  83. package/dist/__tests__/integration/llm-edge-routing.test.js.map +0 -1
  84. package/dist/__tests__/integration/manager-loop.test.d.ts +0 -24
  85. package/dist/__tests__/integration/manager-loop.test.d.ts.map +0 -1
  86. package/dist/__tests__/integration/manager-loop.test.js +0 -276
  87. package/dist/__tests__/integration/manager-loop.test.js.map +0 -1
  88. package/dist/__tests__/integration/multi-type-graph.test.d.ts +0 -10
  89. package/dist/__tests__/integration/multi-type-graph.test.d.ts.map +0 -1
  90. package/dist/__tests__/integration/multi-type-graph.test.js +0 -100
  91. package/dist/__tests__/integration/multi-type-graph.test.js.map +0 -1
  92. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.d.ts +0 -22
  93. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.d.ts.map +0 -1
  94. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.js +0 -515
  95. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.js.map +0 -1
  96. package/dist/__tests__/integration/persistence.test.d.ts +0 -8
  97. package/dist/__tests__/integration/persistence.test.d.ts.map +0 -1
  98. package/dist/__tests__/integration/persistence.test.js +0 -129
  99. package/dist/__tests__/integration/persistence.test.js.map +0 -1
  100. package/dist/__tests__/integration/pipeline-templates-integration.test.d.ts +0 -16
  101. package/dist/__tests__/integration/pipeline-templates-integration.test.d.ts.map +0 -1
  102. package/dist/__tests__/integration/pipeline-templates-integration.test.js +0 -171
  103. package/dist/__tests__/integration/pipeline-templates-integration.test.js.map +0 -1
  104. package/dist/__tests__/integration/scenario-pipeline.test.d.ts +0 -11
  105. package/dist/__tests__/integration/scenario-pipeline.test.d.ts.map +0 -1
  106. package/dist/__tests__/integration/scenario-pipeline.test.js +0 -243
  107. package/dist/__tests__/integration/scenario-pipeline.test.js.map +0 -1
  108. package/dist/__tests__/integration/stylesheet-application.test.d.ts +0 -12
  109. package/dist/__tests__/integration/stylesheet-application.test.d.ts.map +0 -1
  110. package/dist/__tests__/integration/stylesheet-application.test.js +0 -119
  111. package/dist/__tests__/integration/stylesheet-application.test.js.map +0 -1
  112. package/dist/__tests__/integration/subgraph-execution.test.d.ts +0 -24
  113. package/dist/__tests__/integration/subgraph-execution.test.d.ts.map +0 -1
  114. package/dist/__tests__/integration/subgraph-execution.test.js +0 -291
  115. package/dist/__tests__/integration/subgraph-execution.test.js.map +0 -1
  116. package/dist/__tests__/integration/validation-errors.test.d.ts +0 -8
  117. package/dist/__tests__/integration/validation-errors.test.d.ts.map +0 -1
  118. package/dist/__tests__/integration/validation-errors.test.js +0 -150
  119. package/dist/__tests__/integration/validation-errors.test.js.map +0 -1
  120. package/dist/agent/__tests__/loop-detection.test.d.ts +0 -2
  121. package/dist/agent/__tests__/loop-detection.test.d.ts.map +0 -1
  122. package/dist/agent/__tests__/loop-detection.test.js +0 -236
  123. package/dist/agent/__tests__/loop-detection.test.js.map +0 -1
  124. package/dist/agent/__tests__/loop.test.d.ts +0 -2
  125. package/dist/agent/__tests__/loop.test.d.ts.map +0 -1
  126. package/dist/agent/__tests__/loop.test.js +0 -868
  127. package/dist/agent/__tests__/loop.test.js.map +0 -1
  128. package/dist/agent/__tests__/truncation.test.d.ts +0 -2
  129. package/dist/agent/__tests__/truncation.test.d.ts.map +0 -1
  130. package/dist/agent/__tests__/truncation.test.js +0 -276
  131. package/dist/agent/__tests__/truncation.test.js.map +0 -1
  132. package/dist/agent/tools/__tests__/anthropic-tools.test.d.ts +0 -6
  133. package/dist/agent/tools/__tests__/anthropic-tools.test.d.ts.map +0 -1
  134. package/dist/agent/tools/__tests__/anthropic-tools.test.js +0 -49
  135. package/dist/agent/tools/__tests__/anthropic-tools.test.js.map +0 -1
  136. package/dist/agent/tools/__tests__/environment.test.d.ts +0 -6
  137. package/dist/agent/tools/__tests__/environment.test.d.ts.map +0 -1
  138. package/dist/agent/tools/__tests__/environment.test.js +0 -33
  139. package/dist/agent/tools/__tests__/environment.test.js.map +0 -1
  140. package/dist/agent/tools/__tests__/gemini-tools.test.d.ts +0 -6
  141. package/dist/agent/tools/__tests__/gemini-tools.test.d.ts.map +0 -1
  142. package/dist/agent/tools/__tests__/gemini-tools.test.js +0 -98
  143. package/dist/agent/tools/__tests__/gemini-tools.test.js.map +0 -1
  144. package/dist/agent/tools/__tests__/openai-tools.test.d.ts +0 -6
  145. package/dist/agent/tools/__tests__/openai-tools.test.d.ts.map +0 -1
  146. package/dist/agent/tools/__tests__/openai-tools.test.js +0 -53
  147. package/dist/agent/tools/__tests__/openai-tools.test.js.map +0 -1
  148. package/dist/agent/tools/__tests__/patch.test.d.ts +0 -6
  149. package/dist/agent/tools/__tests__/patch.test.d.ts.map +0 -1
  150. package/dist/agent/tools/__tests__/patch.test.js +0 -116
  151. package/dist/agent/tools/__tests__/patch.test.js.map +0 -1
  152. package/dist/agent/tools/__tests__/profiles.test.d.ts +0 -6
  153. package/dist/agent/tools/__tests__/profiles.test.d.ts.map +0 -1
  154. package/dist/agent/tools/__tests__/profiles.test.js +0 -125
  155. package/dist/agent/tools/__tests__/profiles.test.js.map +0 -1
  156. package/dist/agent/tools/__tests__/registry.test.d.ts +0 -6
  157. package/dist/agent/tools/__tests__/registry.test.d.ts.map +0 -1
  158. package/dist/agent/tools/__tests__/registry.test.js +0 -94
  159. package/dist/agent/tools/__tests__/registry.test.js.map +0 -1
  160. package/dist/agent/tools/__tests__/shared.test.d.ts +0 -6
  161. package/dist/agent/tools/__tests__/shared.test.d.ts.map +0 -1
  162. package/dist/agent/tools/__tests__/shared.test.js +0 -131
  163. package/dist/agent/tools/__tests__/shared.test.js.map +0 -1
  164. package/dist/backend/__tests__/direct-backend.test.d.ts +0 -14
  165. package/dist/backend/__tests__/direct-backend.test.d.ts.map +0 -1
  166. package/dist/backend/__tests__/direct-backend.test.js +0 -393
  167. package/dist/backend/__tests__/direct-backend.test.js.map +0 -1
  168. package/dist/backend/__tests__/direct-bootstrap.test.d.ts +0 -7
  169. package/dist/backend/__tests__/direct-bootstrap.test.d.ts.map +0 -1
  170. package/dist/backend/__tests__/direct-bootstrap.test.js +0 -177
  171. package/dist/backend/__tests__/direct-bootstrap.test.js.map +0 -1
  172. package/dist/backend/__tests__/mock-backend.test.d.ts +0 -7
  173. package/dist/backend/__tests__/mock-backend.test.d.ts.map +0 -1
  174. package/dist/backend/__tests__/mock-backend.test.js +0 -273
  175. package/dist/backend/__tests__/mock-backend.test.js.map +0 -1
  176. package/dist/backend/__tests__/parity.test.d.ts +0 -17
  177. package/dist/backend/__tests__/parity.test.d.ts.map +0 -1
  178. package/dist/backend/__tests__/parity.test.js +0 -411
  179. package/dist/backend/__tests__/parity.test.js.map +0 -1
  180. package/dist/context/__tests__/auto-summarizer.test.d.ts +0 -14
  181. package/dist/context/__tests__/auto-summarizer.test.d.ts.map +0 -1
  182. package/dist/context/__tests__/auto-summarizer.test.js +0 -189
  183. package/dist/context/__tests__/auto-summarizer.test.js.map +0 -1
  184. package/dist/context/__tests__/context-cli-command.test.d.ts +0 -7
  185. package/dist/context/__tests__/context-cli-command.test.d.ts.map +0 -1
  186. package/dist/context/__tests__/context-cli-command.test.js +0 -331
  187. package/dist/context/__tests__/context-cli-command.test.js.map +0 -1
  188. package/dist/context/__tests__/pyramid-summary-integration.test.d.ts +0 -2
  189. package/dist/context/__tests__/pyramid-summary-integration.test.d.ts.map +0 -1
  190. package/dist/context/__tests__/pyramid-summary-integration.test.js +0 -533
  191. package/dist/context/__tests__/pyramid-summary-integration.test.js.map +0 -1
  192. package/dist/context/__tests__/summarizer.test.d.ts +0 -2
  193. package/dist/context/__tests__/summarizer.test.d.ts.map +0 -1
  194. package/dist/context/__tests__/summarizer.test.js +0 -189
  195. package/dist/context/__tests__/summarizer.test.js.map +0 -1
  196. package/dist/context/__tests__/summary-cache.test.d.ts +0 -2
  197. package/dist/context/__tests__/summary-cache.test.d.ts.map +0 -1
  198. package/dist/context/__tests__/summary-cache.test.js +0 -214
  199. package/dist/context/__tests__/summary-cache.test.js.map +0 -1
  200. package/dist/context/__tests__/summary-metrics.test.d.ts +0 -2
  201. package/dist/context/__tests__/summary-metrics.test.d.ts.map +0 -1
  202. package/dist/context/__tests__/summary-metrics.test.js +0 -172
  203. package/dist/context/__tests__/summary-metrics.test.js.map +0 -1
  204. package/dist/context/__tests__/summary-types.test.d.ts +0 -2
  205. package/dist/context/__tests__/summary-types.test.d.ts.map +0 -1
  206. package/dist/context/__tests__/summary-types.test.js +0 -130
  207. package/dist/context/__tests__/summary-types.test.js.map +0 -1
  208. package/dist/convergence/__tests__/budget.test.d.ts +0 -6
  209. package/dist/convergence/__tests__/budget.test.d.ts.map +0 -1
  210. package/dist/convergence/__tests__/budget.test.js +0 -187
  211. package/dist/convergence/__tests__/budget.test.js.map +0 -1
  212. package/dist/convergence/__tests__/controller.test.d.ts +0 -9
  213. package/dist/convergence/__tests__/controller.test.d.ts.map +0 -1
  214. package/dist/convergence/__tests__/controller.test.js +0 -585
  215. package/dist/convergence/__tests__/controller.test.js.map +0 -1
  216. package/dist/convergence/__tests__/dual-signal.test.d.ts +0 -14
  217. package/dist/convergence/__tests__/dual-signal.test.d.ts.map +0 -1
  218. package/dist/convergence/__tests__/dual-signal.test.js +0 -123
  219. package/dist/convergence/__tests__/dual-signal.test.js.map +0 -1
  220. package/dist/convergence/__tests__/epic46-integration.test.d.ts +0 -15
  221. package/dist/convergence/__tests__/epic46-integration.test.d.ts.map +0 -1
  222. package/dist/convergence/__tests__/epic46-integration.test.js +0 -522
  223. package/dist/convergence/__tests__/epic46-integration.test.js.map +0 -1
  224. package/dist/convergence/__tests__/plateau.test.d.ts +0 -6
  225. package/dist/convergence/__tests__/plateau.test.d.ts.map +0 -1
  226. package/dist/convergence/__tests__/plateau.test.js +0 -163
  227. package/dist/convergence/__tests__/plateau.test.js.map +0 -1
  228. package/dist/convergence/__tests__/remediation.test.d.ts +0 -11
  229. package/dist/convergence/__tests__/remediation.test.d.ts.map +0 -1
  230. package/dist/convergence/__tests__/remediation.test.js +0 -209
  231. package/dist/convergence/__tests__/remediation.test.js.map +0 -1
  232. package/dist/convergence/__tests__/scenario-primary.test.d.ts +0 -13
  233. package/dist/convergence/__tests__/scenario-primary.test.d.ts.map +0 -1
  234. package/dist/convergence/__tests__/scenario-primary.test.js +0 -183
  235. package/dist/convergence/__tests__/scenario-primary.test.js.map +0 -1
  236. package/dist/factory-command.test.d.ts +0 -8
  237. package/dist/factory-command.test.d.ts.map +0 -1
  238. package/dist/factory-command.test.js +0 -304
  239. package/dist/factory-command.test.js.map +0 -1
  240. package/dist/graph/__tests__/attractor-compliance.test.d.ts +0 -10
  241. package/dist/graph/__tests__/attractor-compliance.test.d.ts.map +0 -1
  242. package/dist/graph/__tests__/attractor-compliance.test.js +0 -766
  243. package/dist/graph/__tests__/attractor-compliance.test.js.map +0 -1
  244. package/dist/graph/__tests__/checkpoint.test.d.ts +0 -8
  245. package/dist/graph/__tests__/checkpoint.test.d.ts.map +0 -1
  246. package/dist/graph/__tests__/checkpoint.test.js +0 -329
  247. package/dist/graph/__tests__/checkpoint.test.js.map +0 -1
  248. package/dist/graph/__tests__/condition-parser.test.d.ts +0 -14
  249. package/dist/graph/__tests__/condition-parser.test.d.ts.map +0 -1
  250. package/dist/graph/__tests__/condition-parser.test.js +0 -406
  251. package/dist/graph/__tests__/condition-parser.test.js.map +0 -1
  252. package/dist/graph/__tests__/context.test.d.ts +0 -14
  253. package/dist/graph/__tests__/context.test.d.ts.map +0 -1
  254. package/dist/graph/__tests__/context.test.js +0 -276
  255. package/dist/graph/__tests__/context.test.js.map +0 -1
  256. package/dist/graph/__tests__/edge-selector-events.test.d.ts +0 -11
  257. package/dist/graph/__tests__/edge-selector-events.test.d.ts.map +0 -1
  258. package/dist/graph/__tests__/edge-selector-events.test.js +0 -184
  259. package/dist/graph/__tests__/edge-selector-events.test.js.map +0 -1
  260. package/dist/graph/__tests__/edge-selector.test.d.ts +0 -6
  261. package/dist/graph/__tests__/edge-selector.test.d.ts.map +0 -1
  262. package/dist/graph/__tests__/edge-selector.test.js +0 -452
  263. package/dist/graph/__tests__/edge-selector.test.js.map +0 -1
  264. package/dist/graph/__tests__/executor-convergence.test.d.ts +0 -12
  265. package/dist/graph/__tests__/executor-convergence.test.d.ts.map +0 -1
  266. package/dist/graph/__tests__/executor-convergence.test.js +0 -432
  267. package/dist/graph/__tests__/executor-convergence.test.js.map +0 -1
  268. package/dist/graph/__tests__/executor-fidelity.test.d.ts +0 -13
  269. package/dist/graph/__tests__/executor-fidelity.test.d.ts.map +0 -1
  270. package/dist/graph/__tests__/executor-fidelity.test.js +0 -335
  271. package/dist/graph/__tests__/executor-fidelity.test.js.map +0 -1
  272. package/dist/graph/__tests__/executor.test.d.ts +0 -14
  273. package/dist/graph/__tests__/executor.test.d.ts.map +0 -1
  274. package/dist/graph/__tests__/executor.test.js +0 -901
  275. package/dist/graph/__tests__/executor.test.js.map +0 -1
  276. package/dist/graph/__tests__/fidelity.test.d.ts +0 -8
  277. package/dist/graph/__tests__/fidelity.test.d.ts.map +0 -1
  278. package/dist/graph/__tests__/fidelity.test.js +0 -135
  279. package/dist/graph/__tests__/fidelity.test.js.map +0 -1
  280. package/dist/graph/__tests__/llm-evaluator.test.d.ts +0 -7
  281. package/dist/graph/__tests__/llm-evaluator.test.d.ts.map +0 -1
  282. package/dist/graph/__tests__/llm-evaluator.test.js +0 -106
  283. package/dist/graph/__tests__/llm-evaluator.test.js.map +0 -1
  284. package/dist/graph/__tests__/parser-chaining.test.d.ts +0 -13
  285. package/dist/graph/__tests__/parser-chaining.test.d.ts.map +0 -1
  286. package/dist/graph/__tests__/parser-chaining.test.js +0 -215
  287. package/dist/graph/__tests__/parser-chaining.test.js.map +0 -1
  288. package/dist/graph/__tests__/parser.test.d.ts +0 -22
  289. package/dist/graph/__tests__/parser.test.d.ts.map +0 -1
  290. package/dist/graph/__tests__/parser.test.js +0 -452
  291. package/dist/graph/__tests__/parser.test.js.map +0 -1
  292. package/dist/graph/__tests__/run-state.test.d.ts +0 -13
  293. package/dist/graph/__tests__/run-state.test.d.ts.map +0 -1
  294. package/dist/graph/__tests__/run-state.test.js +0 -189
  295. package/dist/graph/__tests__/run-state.test.js.map +0 -1
  296. package/dist/graph/__tests__/transformer.test.d.ts +0 -16
  297. package/dist/graph/__tests__/transformer.test.d.ts.map +0 -1
  298. package/dist/graph/__tests__/transformer.test.js +0 -350
  299. package/dist/graph/__tests__/transformer.test.js.map +0 -1
  300. package/dist/graph/__tests__/validator-errors.test.d.ts +0 -15
  301. package/dist/graph/__tests__/validator-errors.test.d.ts.map +0 -1
  302. package/dist/graph/__tests__/validator-errors.test.js +0 -572
  303. package/dist/graph/__tests__/validator-errors.test.js.map +0 -1
  304. package/dist/graph/__tests__/validator-warnings.test.d.ts +0 -15
  305. package/dist/graph/__tests__/validator-warnings.test.d.ts.map +0 -1
  306. package/dist/graph/__tests__/validator-warnings.test.js +0 -363
  307. package/dist/graph/__tests__/validator-warnings.test.js.map +0 -1
  308. package/dist/handlers/__tests__/codergen-handler.test.d.ts +0 -14
  309. package/dist/handlers/__tests__/codergen-handler.test.d.ts.map +0 -1
  310. package/dist/handlers/__tests__/codergen-handler.test.js +0 -442
  311. package/dist/handlers/__tests__/codergen-handler.test.js.map +0 -1
  312. package/dist/handlers/__tests__/fan-in.test.d.ts +0 -14
  313. package/dist/handlers/__tests__/fan-in.test.d.ts.map +0 -1
  314. package/dist/handlers/__tests__/fan-in.test.js +0 -399
  315. package/dist/handlers/__tests__/fan-in.test.js.map +0 -1
  316. package/dist/handlers/__tests__/join-policy.test.d.ts +0 -9
  317. package/dist/handlers/__tests__/join-policy.test.d.ts.map +0 -1
  318. package/dist/handlers/__tests__/join-policy.test.js +0 -201
  319. package/dist/handlers/__tests__/join-policy.test.js.map +0 -1
  320. package/dist/handlers/__tests__/manager-loop.test.d.ts +0 -14
  321. package/dist/handlers/__tests__/manager-loop.test.d.ts.map +0 -1
  322. package/dist/handlers/__tests__/manager-loop.test.js +0 -322
  323. package/dist/handlers/__tests__/manager-loop.test.js.map +0 -1
  324. package/dist/handlers/__tests__/parallel-events.test.d.ts +0 -12
  325. package/dist/handlers/__tests__/parallel-events.test.d.ts.map +0 -1
  326. package/dist/handlers/__tests__/parallel-events.test.js +0 -252
  327. package/dist/handlers/__tests__/parallel-events.test.js.map +0 -1
  328. package/dist/handlers/__tests__/parallel-handler.test.d.ts +0 -14
  329. package/dist/handlers/__tests__/parallel-handler.test.d.ts.map +0 -1
  330. package/dist/handlers/__tests__/parallel-handler.test.js +0 -337
  331. package/dist/handlers/__tests__/parallel-handler.test.js.map +0 -1
  332. package/dist/handlers/__tests__/parallel-join.test.d.ts +0 -9
  333. package/dist/handlers/__tests__/parallel-join.test.d.ts.map +0 -1
  334. package/dist/handlers/__tests__/parallel-join.test.js +0 -267
  335. package/dist/handlers/__tests__/parallel-join.test.js.map +0 -1
  336. package/dist/handlers/__tests__/registry.test.d.ts +0 -14
  337. package/dist/handlers/__tests__/registry.test.d.ts.map +0 -1
  338. package/dist/handlers/__tests__/registry.test.js +0 -315
  339. package/dist/handlers/__tests__/registry.test.js.map +0 -1
  340. package/dist/handlers/__tests__/subgraph-events.test.d.ts +0 -10
  341. package/dist/handlers/__tests__/subgraph-events.test.d.ts.map +0 -1
  342. package/dist/handlers/__tests__/subgraph-events.test.js +0 -189
  343. package/dist/handlers/__tests__/subgraph-events.test.js.map +0 -1
  344. package/dist/handlers/__tests__/subgraph-inheritance.test.d.ts +0 -14
  345. package/dist/handlers/__tests__/subgraph-inheritance.test.d.ts.map +0 -1
  346. package/dist/handlers/__tests__/subgraph-inheritance.test.js +0 -267
  347. package/dist/handlers/__tests__/subgraph-inheritance.test.js.map +0 -1
  348. package/dist/handlers/__tests__/subgraph.test.d.ts +0 -14
  349. package/dist/handlers/__tests__/subgraph.test.d.ts.map +0 -1
  350. package/dist/handlers/__tests__/subgraph.test.js +0 -369
  351. package/dist/handlers/__tests__/subgraph.test.js.map +0 -1
  352. package/dist/handlers/__tests__/tool-handler.test.d.ts +0 -11
  353. package/dist/handlers/__tests__/tool-handler.test.d.ts.map +0 -1
  354. package/dist/handlers/__tests__/tool-handler.test.js +0 -184
  355. package/dist/handlers/__tests__/tool-handler.test.js.map +0 -1
  356. package/dist/handlers/__tests__/tool-scenario.test.d.ts +0 -12
  357. package/dist/handlers/__tests__/tool-scenario.test.d.ts.map +0 -1
  358. package/dist/handlers/__tests__/tool-scenario.test.js +0 -222
  359. package/dist/handlers/__tests__/tool-scenario.test.js.map +0 -1
  360. package/dist/handlers/__tests__/wait-human-handler.test.d.ts +0 -11
  361. package/dist/handlers/__tests__/wait-human-handler.test.d.ts.map +0 -1
  362. package/dist/handlers/__tests__/wait-human-handler.test.js +0 -251
  363. package/dist/handlers/__tests__/wait-human-handler.test.js.map +0 -1
  364. package/dist/llm/__tests__/client.test.d.ts +0 -2
  365. package/dist/llm/__tests__/client.test.d.ts.map +0 -1
  366. package/dist/llm/__tests__/client.test.js +0 -198
  367. package/dist/llm/__tests__/client.test.js.map +0 -1
  368. package/dist/llm/__tests__/types.test.d.ts +0 -2
  369. package/dist/llm/__tests__/types.test.d.ts.map +0 -1
  370. package/dist/llm/__tests__/types.test.js +0 -289
  371. package/dist/llm/__tests__/types.test.js.map +0 -1
  372. package/dist/llm/middleware/__tests__/cost-tracking.test.d.ts +0 -2
  373. package/dist/llm/middleware/__tests__/cost-tracking.test.d.ts.map +0 -1
  374. package/dist/llm/middleware/__tests__/cost-tracking.test.js +0 -73
  375. package/dist/llm/middleware/__tests__/cost-tracking.test.js.map +0 -1
  376. package/dist/llm/middleware/__tests__/logging.test.d.ts +0 -2
  377. package/dist/llm/middleware/__tests__/logging.test.d.ts.map +0 -1
  378. package/dist/llm/middleware/__tests__/logging.test.js +0 -127
  379. package/dist/llm/middleware/__tests__/logging.test.js.map +0 -1
  380. package/dist/llm/middleware/__tests__/retry.test.d.ts +0 -2
  381. package/dist/llm/middleware/__tests__/retry.test.d.ts.map +0 -1
  382. package/dist/llm/middleware/__tests__/retry.test.js +0 -126
  383. package/dist/llm/middleware/__tests__/retry.test.js.map +0 -1
  384. package/dist/llm/providers/__tests__/anthropic.test.d.ts +0 -2
  385. package/dist/llm/providers/__tests__/anthropic.test.d.ts.map +0 -1
  386. package/dist/llm/providers/__tests__/anthropic.test.js +0 -412
  387. package/dist/llm/providers/__tests__/anthropic.test.js.map +0 -1
  388. package/dist/llm/providers/__tests__/gemini.test.d.ts +0 -2
  389. package/dist/llm/providers/__tests__/gemini.test.d.ts.map +0 -1
  390. package/dist/llm/providers/__tests__/gemini.test.js +0 -591
  391. package/dist/llm/providers/__tests__/gemini.test.js.map +0 -1
  392. package/dist/llm/providers/__tests__/openai.test.d.ts +0 -2
  393. package/dist/llm/providers/__tests__/openai.test.d.ts.map +0 -1
  394. package/dist/llm/providers/__tests__/openai.test.js +0 -546
  395. package/dist/llm/providers/__tests__/openai.test.js.map +0 -1
  396. package/dist/persistence/__tests__/factory-queries.test.d.ts +0 -9
  397. package/dist/persistence/__tests__/factory-queries.test.d.ts.map +0 -1
  398. package/dist/persistence/__tests__/factory-queries.test.js +0 -372
  399. package/dist/persistence/__tests__/factory-queries.test.js.map +0 -1
  400. package/dist/persistence/__tests__/factory-schema.test.d.ts +0 -6
  401. package/dist/persistence/__tests__/factory-schema.test.d.ts.map +0 -1
  402. package/dist/persistence/__tests__/factory-schema.test.js +0 -105
  403. package/dist/persistence/__tests__/factory-schema.test.js.map +0 -1
  404. package/dist/scenarios/__tests__/cli-command-list.test.d.ts +0 -7
  405. package/dist/scenarios/__tests__/cli-command-list.test.d.ts.map +0 -1
  406. package/dist/scenarios/__tests__/cli-command-list.test.js +0 -237
  407. package/dist/scenarios/__tests__/cli-command-list.test.js.map +0 -1
  408. package/dist/scenarios/__tests__/cli-command.test.d.ts +0 -11
  409. package/dist/scenarios/__tests__/cli-command.test.d.ts.map +0 -1
  410. package/dist/scenarios/__tests__/cli-command.test.js +0 -275
  411. package/dist/scenarios/__tests__/cli-command.test.js.map +0 -1
  412. package/dist/scenarios/__tests__/integrity-pipeline.test.d.ts +0 -15
  413. package/dist/scenarios/__tests__/integrity-pipeline.test.d.ts.map +0 -1
  414. package/dist/scenarios/__tests__/integrity-pipeline.test.js +0 -318
  415. package/dist/scenarios/__tests__/integrity-pipeline.test.js.map +0 -1
  416. package/dist/scenarios/__tests__/runner-twins.test.d.ts +0 -13
  417. package/dist/scenarios/__tests__/runner-twins.test.d.ts.map +0 -1
  418. package/dist/scenarios/__tests__/runner-twins.test.js +0 -205
  419. package/dist/scenarios/__tests__/runner-twins.test.js.map +0 -1
  420. package/dist/scenarios/__tests__/scorer.test.d.ts +0 -11
  421. package/dist/scenarios/__tests__/scorer.test.d.ts.map +0 -1
  422. package/dist/scenarios/__tests__/scorer.test.js +0 -225
  423. package/dist/scenarios/__tests__/scorer.test.js.map +0 -1
  424. package/dist/scenarios/__tests__/scoring-integration.test.d.ts +0 -8
  425. package/dist/scenarios/__tests__/scoring-integration.test.d.ts.map +0 -1
  426. package/dist/scenarios/__tests__/scoring-integration.test.js +0 -178
  427. package/dist/scenarios/__tests__/scoring-integration.test.js.map +0 -1
  428. package/dist/scenarios/__tests__/store.test.d.ts +0 -5
  429. package/dist/scenarios/__tests__/store.test.d.ts.map +0 -1
  430. package/dist/scenarios/__tests__/store.test.js +0 -169
  431. package/dist/scenarios/__tests__/store.test.js.map +0 -1
  432. package/dist/stylesheet/__tests__/stylesheet.test.d.ts +0 -17
  433. package/dist/stylesheet/__tests__/stylesheet.test.d.ts.map +0 -1
  434. package/dist/stylesheet/__tests__/stylesheet.test.js +0 -368
  435. package/dist/stylesheet/__tests__/stylesheet.test.js.map +0 -1
  436. package/dist/templates/__tests__/templates.test.d.ts +0 -7
  437. package/dist/templates/__tests__/templates.test.d.ts.map +0 -1
  438. package/dist/templates/__tests__/templates.test.js +0 -92
  439. package/dist/templates/__tests__/templates.test.js.map +0 -1
  440. package/dist/twins/__tests__/docker-compose.test.d.ts +0 -13
  441. package/dist/twins/__tests__/docker-compose.test.d.ts.map +0 -1
  442. package/dist/twins/__tests__/docker-compose.test.js +0 -247
  443. package/dist/twins/__tests__/docker-compose.test.js.map +0 -1
  444. package/dist/twins/__tests__/health-monitor.test.d.ts +0 -19
  445. package/dist/twins/__tests__/health-monitor.test.d.ts.map +0 -1
  446. package/dist/twins/__tests__/health-monitor.test.js +0 -301
  447. package/dist/twins/__tests__/health-monitor.test.js.map +0 -1
  448. package/dist/twins/__tests__/integration/e2e.test.d.ts +0 -18
  449. package/dist/twins/__tests__/integration/e2e.test.d.ts.map +0 -1
  450. package/dist/twins/__tests__/integration/e2e.test.js +0 -146
  451. package/dist/twins/__tests__/integration/e2e.test.js.map +0 -1
  452. package/dist/twins/__tests__/integration/health-monitor-integration.test.d.ts +0 -16
  453. package/dist/twins/__tests__/integration/health-monitor-integration.test.d.ts.map +0 -1
  454. package/dist/twins/__tests__/integration/health-monitor-integration.test.js +0 -183
  455. package/dist/twins/__tests__/integration/health-monitor-integration.test.js.map +0 -1
  456. package/dist/twins/__tests__/integration/helpers.d.ts +0 -32
  457. package/dist/twins/__tests__/integration/helpers.d.ts.map +0 -1
  458. package/dist/twins/__tests__/integration/helpers.js +0 -67
  459. package/dist/twins/__tests__/integration/helpers.js.map +0 -1
  460. package/dist/twins/__tests__/integration/lifecycle.test.d.ts +0 -14
  461. package/dist/twins/__tests__/integration/lifecycle.test.d.ts.map +0 -1
  462. package/dist/twins/__tests__/integration/lifecycle.test.js +0 -127
  463. package/dist/twins/__tests__/integration/lifecycle.test.js.map +0 -1
  464. package/dist/twins/__tests__/integration/persistence-integration.test.d.ts +0 -14
  465. package/dist/twins/__tests__/integration/persistence-integration.test.d.ts.map +0 -1
  466. package/dist/twins/__tests__/integration/persistence-integration.test.js +0 -132
  467. package/dist/twins/__tests__/integration/persistence-integration.test.js.map +0 -1
  468. package/dist/twins/__tests__/persistence.test.d.ts +0 -10
  469. package/dist/twins/__tests__/persistence.test.d.ts.map +0 -1
  470. package/dist/twins/__tests__/persistence.test.js +0 -300
  471. package/dist/twins/__tests__/persistence.test.js.map +0 -1
  472. package/dist/twins/__tests__/registry.test.d.ts +0 -7
  473. package/dist/twins/__tests__/registry.test.d.ts.map +0 -1
  474. package/dist/twins/__tests__/registry.test.js +0 -282
  475. package/dist/twins/__tests__/registry.test.js.map +0 -1
  476. package/dist/twins/__tests__/run-state.test.d.ts +0 -9
  477. package/dist/twins/__tests__/run-state.test.d.ts.map +0 -1
  478. package/dist/twins/__tests__/run-state.test.js +0 -112
  479. package/dist/twins/__tests__/run-state.test.js.map +0 -1
  480. package/dist/twins/__tests__/templates-cli.test.d.ts +0 -10
  481. package/dist/twins/__tests__/templates-cli.test.d.ts.map +0 -1
  482. package/dist/twins/__tests__/templates-cli.test.js +0 -187
  483. package/dist/twins/__tests__/templates-cli.test.js.map +0 -1
  484. package/dist/twins/__tests__/templates.test.d.ts +0 -7
  485. package/dist/twins/__tests__/templates.test.d.ts.map +0 -1
  486. package/dist/twins/__tests__/templates.test.js +0 -87
  487. package/dist/twins/__tests__/templates.test.js.map +0 -1
  488. package/dist/twins/__tests__/twins-cli.test.d.ts +0 -11
  489. package/dist/twins/__tests__/twins-cli.test.d.ts.map +0 -1
  490. package/dist/twins/__tests__/twins-cli.test.js +0 -365
  491. package/dist/twins/__tests__/twins-cli.test.js.map +0 -1
@@ -1,399 +0,0 @@
1
- /**
2
- * Unit tests for fan-in handler (story 50-2).
3
- *
4
- * Covers AC1–AC7:
5
- * AC1 – Heuristic selection by outcome rank
6
- * AC2 – LLM-based selection
7
- * AC3 – Winner context updates applied
8
- * AC4 – All-failed scenario
9
- * AC5 – Partial-failure tolerance
10
- * AC6 – Empty or absent parallel.results
11
- * AC7 – Registry wiring (tripleoctagon + parallel.fan_in type)
12
- */
13
- import { describe, it, expect, vi } from 'vitest';
14
- import { createFanInHandler, rankBranches, buildSelectionPrompt, parseLlmWinnerResponse, } from '../fan-in.js';
15
- import { createDefaultRegistry } from '../registry.js';
16
- import { GraphContext } from '../../graph/context.js';
17
- // ---------------------------------------------------------------------------
18
- // Test helpers
19
- // ---------------------------------------------------------------------------
20
- function makeNode(overrides = {}) {
21
- return {
22
- id: 'fan-in-node',
23
- label: 'Fan-in',
24
- shape: 'tripleoctagon',
25
- type: 'parallel.fan_in',
26
- prompt: '',
27
- maxRetries: 0,
28
- goalGate: false,
29
- retryTarget: '',
30
- fallbackRetryTarget: '',
31
- fidelity: '',
32
- threadId: '',
33
- class: '',
34
- timeout: 0,
35
- llmModel: '',
36
- llmProvider: '',
37
- reasoningEffort: '',
38
- autoStatus: false,
39
- allowPartial: false,
40
- toolCommand: '',
41
- backend: '',
42
- ...overrides,
43
- };
44
- }
45
- const stubGraph = {};
46
- function makeContext(initial) {
47
- return new GraphContext(initial);
48
- }
49
- function makeBranch(overrides = {}) {
50
- return {
51
- branch_id: 1,
52
- status: 'SUCCESS',
53
- ...overrides,
54
- };
55
- }
56
- // ---------------------------------------------------------------------------
57
- // rankBranches unit tests (AC1, AC4, AC5)
58
- // ---------------------------------------------------------------------------
59
- describe('rankBranches', () => {
60
- it('selects SUCCESS over PARTIAL_SUCCESS (AC1)', () => {
61
- const results = [
62
- makeBranch({ branch_id: 1, status: 'PARTIAL_SUCCESS' }),
63
- makeBranch({ branch_id: 2, status: 'SUCCESS' }),
64
- ];
65
- const winner = rankBranches(results);
66
- expect(winner?.branch_id).toBe(2);
67
- expect(winner?.status).toBe('SUCCESS');
68
- });
69
- it('selects PARTIAL_SUCCESS over NEEDS_RETRY (AC1)', () => {
70
- const results = [
71
- makeBranch({ branch_id: 1, status: 'NEEDS_RETRY' }),
72
- makeBranch({ branch_id: 2, status: 'PARTIAL_SUCCESS' }),
73
- ];
74
- const winner = rankBranches(results);
75
- expect(winner?.branch_id).toBe(2);
76
- });
77
- it('selects NEEDS_RETRY over FAILURE (AC1, AC5)', () => {
78
- const results = [
79
- makeBranch({ branch_id: 1, status: 'FAILURE' }),
80
- makeBranch({ branch_id: 2, status: 'NEEDS_RETRY' }),
81
- ];
82
- const winner = rankBranches(results);
83
- expect(winner?.branch_id).toBe(2);
84
- });
85
- it('tiebreak: higher score wins when status is equal (AC1)', () => {
86
- const results = [
87
- makeBranch({ branch_id: 1, status: 'SUCCESS', score: 50 }),
88
- makeBranch({ branch_id: 2, status: 'SUCCESS', score: 90 }),
89
- makeBranch({ branch_id: 3, status: 'SUCCESS', score: 70 }),
90
- ];
91
- const winner = rankBranches(results);
92
- expect(winner?.branch_id).toBe(2);
93
- });
94
- it('tiebreak: lower branch_id wins when status and score are equal (AC1)', () => {
95
- const results = [
96
- makeBranch({ branch_id: 3, status: 'SUCCESS', score: 80 }),
97
- makeBranch({ branch_id: 1, status: 'SUCCESS', score: 80 }),
98
- makeBranch({ branch_id: 2, status: 'SUCCESS', score: 80 }),
99
- ];
100
- const winner = rankBranches(results);
101
- expect(winner?.branch_id).toBe(1);
102
- });
103
- it('treats absent score as 0 in tiebreak (AC1)', () => {
104
- const results = [
105
- makeBranch({ branch_id: 1, status: 'SUCCESS' }), // no score → treated as 0
106
- makeBranch({ branch_id: 2, status: 'SUCCESS', score: 5 }),
107
- ];
108
- const winner = rankBranches(results);
109
- expect(winner?.branch_id).toBe(2);
110
- });
111
- it('excludes FAILURE branches and picks best non-FAILURE (AC5)', () => {
112
- const results = [
113
- makeBranch({ branch_id: 1, status: 'FAILURE', failure_reason: 'error A' }),
114
- makeBranch({ branch_id: 2, status: 'PARTIAL_SUCCESS' }),
115
- makeBranch({ branch_id: 3, status: 'FAILURE', failure_reason: 'error B' }),
116
- ];
117
- const winner = rankBranches(results);
118
- expect(winner?.branch_id).toBe(2);
119
- expect(winner?.status).toBe('PARTIAL_SUCCESS');
120
- });
121
- it('returns null when all branches are FAILURE (AC4)', () => {
122
- const results = [
123
- makeBranch({ branch_id: 1, status: 'FAILURE' }),
124
- makeBranch({ branch_id: 2, status: 'FAILURE' }),
125
- ];
126
- const winner = rankBranches(results);
127
- expect(winner).toBeNull();
128
- });
129
- it('returns null for empty array', () => {
130
- expect(rankBranches([])).toBeNull();
131
- });
132
- });
133
- // ---------------------------------------------------------------------------
134
- // buildSelectionPrompt unit tests (AC2)
135
- // ---------------------------------------------------------------------------
136
- describe('buildSelectionPrompt', () => {
137
- it('prepends node prompt text', () => {
138
- const results = [makeBranch({ branch_id: 1, status: 'SUCCESS' })];
139
- const prompt = buildSelectionPrompt('Which branch is best?', results);
140
- expect(prompt).toContain('Which branch is best?');
141
- });
142
- it('lists each branch with branch_id, status, and score', () => {
143
- const results = [
144
- makeBranch({ branch_id: 1, status: 'SUCCESS', score: 85 }),
145
- makeBranch({ branch_id: 2, status: 'PARTIAL_SUCCESS', score: 60 }),
146
- ];
147
- const prompt = buildSelectionPrompt('Choose', results);
148
- expect(prompt).toContain('Branch 1');
149
- expect(prompt).toContain('status=SUCCESS');
150
- expect(prompt).toContain('score=85');
151
- expect(prompt).toContain('Branch 2');
152
- expect(prompt).toContain('status=PARTIAL_SUCCESS');
153
- expect(prompt).toContain('score=60');
154
- });
155
- it('includes context_update_keys (not values) for token efficiency', () => {
156
- const results = [
157
- makeBranch({
158
- branch_id: 1,
159
- status: 'SUCCESS',
160
- context_updates: { outputFile: '/tmp/file.ts', coverage: 95 },
161
- }),
162
- ];
163
- const prompt = buildSelectionPrompt('Choose', results);
164
- expect(prompt).toContain('outputFile');
165
- expect(prompt).toContain('coverage');
166
- // Values should NOT appear
167
- expect(prompt).not.toContain('/tmp/file.ts');
168
- expect(prompt).not.toContain('95');
169
- });
170
- it('shows (none) for branches with no context_updates', () => {
171
- const results = [makeBranch({ branch_id: 1, status: 'SUCCESS' })];
172
- const prompt = buildSelectionPrompt('Choose', results);
173
- expect(prompt).toContain('(none)');
174
- });
175
- it('instructs LLM to reply with integer branch_id', () => {
176
- const results = [makeBranch({ branch_id: 1, status: 'SUCCESS' })];
177
- const prompt = buildSelectionPrompt('Choose', results);
178
- expect(prompt.toLowerCase()).toContain('branch_id');
179
- });
180
- });
181
- // ---------------------------------------------------------------------------
182
- // parseLlmWinnerResponse unit tests (AC2)
183
- // ---------------------------------------------------------------------------
184
- describe('parseLlmWinnerResponse', () => {
185
- const results = [
186
- makeBranch({ branch_id: 1, status: 'SUCCESS' }),
187
- makeBranch({ branch_id: 2, status: 'PARTIAL_SUCCESS' }),
188
- makeBranch({ branch_id: 3, status: 'NEEDS_RETRY' }),
189
- ];
190
- it('parses a plain integer response', () => {
191
- const winner = parseLlmWinnerResponse('2', results);
192
- expect(winner?.branch_id).toBe(2);
193
- });
194
- it('parses an integer embedded in a sentence', () => {
195
- const winner = parseLlmWinnerResponse('The best candidate is branch 3.', results);
196
- expect(winner?.branch_id).toBe(3);
197
- });
198
- it('returns first valid branch_id found in response', () => {
199
- // "1" appears first and is valid
200
- const winner = parseLlmWinnerResponse('Branch 1 is better than branch 2.', results);
201
- expect(winner?.branch_id).toBe(1);
202
- });
203
- it('returns null and logs warning when no valid branch_id in response', () => {
204
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
205
- const winner = parseLlmWinnerResponse('I cannot decide.', results);
206
- expect(winner).toBeNull();
207
- expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('falling back to heuristic'));
208
- warnSpy.mockRestore();
209
- });
210
- it('returns null for response with only invalid branch ids', () => {
211
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
212
- const winner = parseLlmWinnerResponse('Branch 99 is the best.', results);
213
- expect(winner).toBeNull();
214
- warnSpy.mockRestore();
215
- });
216
- });
217
- // ---------------------------------------------------------------------------
218
- // createFanInHandler integration tests (AC1–AC6)
219
- // ---------------------------------------------------------------------------
220
- describe('createFanInHandler — heuristic mode (no prompt)', () => {
221
- it('selects winner and returns SUCCESS for multi-branch results (AC1)', async () => {
222
- const handler = createFanInHandler();
223
- const results = [
224
- makeBranch({ branch_id: 1, status: 'PARTIAL_SUCCESS' }),
225
- makeBranch({ branch_id: 2, status: 'SUCCESS' }),
226
- ];
227
- const ctx = makeContext({ 'parallel.results': results });
228
- const outcome = await handler(makeNode({ prompt: '' }), ctx, stubGraph);
229
- expect(outcome.status).toBe('SUCCESS');
230
- });
231
- it('merges winner context_updates into the main context (AC3)', async () => {
232
- const handler = createFanInHandler();
233
- const results = [
234
- makeBranch({
235
- branch_id: 1,
236
- status: 'SUCCESS',
237
- context_updates: { generatedFile: 'src/foo.ts', testsPassed: true },
238
- }),
239
- ];
240
- const ctx = makeContext({ 'parallel.results': results });
241
- await handler(makeNode({ prompt: '' }), ctx, stubGraph);
242
- expect(ctx.get('generatedFile')).toBe('src/foo.ts');
243
- expect(ctx.get('testsPassed')).toBe(true);
244
- });
245
- it('sets parallel.fan_in.best_id and best_outcome in context (AC3)', async () => {
246
- const handler = createFanInHandler();
247
- const results = [
248
- makeBranch({ branch_id: 2, status: 'SUCCESS' }),
249
- makeBranch({ branch_id: 1, status: 'PARTIAL_SUCCESS' }),
250
- ];
251
- const ctx = makeContext({ 'parallel.results': results });
252
- await handler(makeNode({ prompt: '' }), ctx, stubGraph);
253
- expect(ctx.get('parallel.fan_in.best_id')).toBe(2);
254
- expect(ctx.get('parallel.fan_in.best_outcome')).toBe('SUCCESS');
255
- });
256
- it('returns FAILURE when all branches failed, with aggregated reasons (AC4)', async () => {
257
- const handler = createFanInHandler();
258
- const results = [
259
- makeBranch({ branch_id: 1, status: 'FAILURE', failure_reason: 'compile error' }),
260
- makeBranch({ branch_id: 2, status: 'FAILURE', failure_reason: 'timeout' }),
261
- ];
262
- const ctx = makeContext({ 'parallel.results': results });
263
- const outcome = await handler(makeNode({ prompt: '' }), ctx, stubGraph);
264
- expect(outcome.status).toBe('FAILURE');
265
- expect(outcome.failureReason).toContain('compile error');
266
- expect(outcome.failureReason).toContain('timeout');
267
- });
268
- it('selects best non-FAILURE from mixed results (AC5)', async () => {
269
- const handler = createFanInHandler();
270
- const results = [
271
- makeBranch({ branch_id: 1, status: 'FAILURE', failure_reason: 'bad' }),
272
- makeBranch({ branch_id: 2, status: 'PARTIAL_SUCCESS', score: 70 }),
273
- ];
274
- const ctx = makeContext({ 'parallel.results': results });
275
- const outcome = await handler(makeNode({ prompt: '' }), ctx, stubGraph);
276
- expect(outcome.status).toBe('SUCCESS');
277
- expect(ctx.get('parallel.fan_in.best_id')).toBe(2);
278
- expect(ctx.get('parallel.fan_in.best_outcome')).toBe('PARTIAL_SUCCESS');
279
- });
280
- it('returns FAILURE when parallel.results is an empty array (AC6)', async () => {
281
- const handler = createFanInHandler();
282
- const ctx = makeContext({ 'parallel.results': [] });
283
- const outcome = await handler(makeNode({ prompt: '' }), ctx, stubGraph);
284
- expect(outcome.status).toBe('FAILURE');
285
- expect(outcome.failureReason).toContain('no parallel results');
286
- });
287
- it('returns FAILURE when parallel.results key is absent from context (AC6)', async () => {
288
- const handler = createFanInHandler();
289
- const ctx = makeContext();
290
- const outcome = await handler(makeNode({ prompt: '' }), ctx, stubGraph);
291
- expect(outcome.status).toBe('FAILURE');
292
- expect(outcome.failureReason).toContain('no parallel results');
293
- });
294
- });
295
- // ---------------------------------------------------------------------------
296
- // createFanInHandler — LLM mode (AC2)
297
- // ---------------------------------------------------------------------------
298
- describe('createFanInHandler — LLM mode (with prompt)', () => {
299
- it('calls llmCall with the selection prompt and uses returned branch_id (AC2)', async () => {
300
- const mockLlmCall = vi.fn().mockResolvedValue('2');
301
- const handler = createFanInHandler({ llmCall: mockLlmCall });
302
- const results = [
303
- makeBranch({ branch_id: 1, status: 'PARTIAL_SUCCESS' }),
304
- makeBranch({ branch_id: 2, status: 'SUCCESS' }),
305
- ];
306
- const ctx = makeContext({ 'parallel.results': results });
307
- const outcome = await handler(makeNode({ prompt: 'Pick the best implementation' }), ctx, stubGraph);
308
- expect(outcome.status).toBe('SUCCESS');
309
- expect(mockLlmCall).toHaveBeenCalledOnce();
310
- expect(mockLlmCall).toHaveBeenCalledWith(expect.stringContaining('Pick the best implementation'));
311
- expect(ctx.get('parallel.fan_in.best_id')).toBe(2);
312
- });
313
- it('passes branch summaries to the LLM call (AC2)', async () => {
314
- let capturedPrompt = '';
315
- const mockLlmCall = vi.fn().mockImplementation((p) => {
316
- capturedPrompt = p;
317
- return Promise.resolve('1');
318
- });
319
- const handler = createFanInHandler({ llmCall: mockLlmCall });
320
- const results = [
321
- makeBranch({ branch_id: 1, status: 'SUCCESS', score: 90 }),
322
- makeBranch({ branch_id: 2, status: 'PARTIAL_SUCCESS', score: 60 }),
323
- ];
324
- const ctx = makeContext({ 'parallel.results': results });
325
- await handler(makeNode({ prompt: 'Select best' }), ctx, stubGraph);
326
- expect(capturedPrompt).toContain('Branch 1');
327
- expect(capturedPrompt).toContain('Branch 2');
328
- expect(capturedPrompt).toContain('status=SUCCESS');
329
- expect(capturedPrompt).toContain('score=90');
330
- });
331
- it('falls back to heuristic when LLM response has no valid branch_id (AC2)', async () => {
332
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
333
- const mockLlmCall = vi.fn().mockResolvedValue('I cannot decide');
334
- const handler = createFanInHandler({ llmCall: mockLlmCall });
335
- const results = [
336
- makeBranch({ branch_id: 1, status: 'PARTIAL_SUCCESS' }),
337
- makeBranch({ branch_id: 2, status: 'SUCCESS' }),
338
- ];
339
- const ctx = makeContext({ 'parallel.results': results });
340
- const outcome = await handler(makeNode({ prompt: 'Choose' }), ctx, stubGraph);
341
- expect(outcome.status).toBe('SUCCESS');
342
- // Heuristic fallback selects SUCCESS branch (id=2)
343
- expect(ctx.get('parallel.fan_in.best_id')).toBe(2);
344
- expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('falling back to heuristic'));
345
- warnSpy.mockRestore();
346
- });
347
- it('falls back to heuristic when llmCall throws (AC2)', async () => {
348
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
349
- const mockLlmCall = vi.fn().mockRejectedValue(new Error('network failure'));
350
- const handler = createFanInHandler({ llmCall: mockLlmCall });
351
- const results = [
352
- makeBranch({ branch_id: 1, status: 'SUCCESS' }),
353
- makeBranch({ branch_id: 2, status: 'PARTIAL_SUCCESS' }),
354
- ];
355
- const ctx = makeContext({ 'parallel.results': results });
356
- const outcome = await handler(makeNode({ prompt: 'Choose' }), ctx, stubGraph);
357
- expect(outcome.status).toBe('SUCCESS');
358
- expect(ctx.get('parallel.fan_in.best_id')).toBe(1);
359
- expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('LLM call failed'));
360
- warnSpy.mockRestore();
361
- });
362
- });
363
- // ---------------------------------------------------------------------------
364
- // Registry wiring (AC7)
365
- // ---------------------------------------------------------------------------
366
- describe('Registry wiring (AC7)', () => {
367
- it('resolves parallel.fan_in type to a function', () => {
368
- const registry = createDefaultRegistry();
369
- const node = makeNode({ type: 'parallel.fan_in', shape: '' });
370
- const handler = registry.resolve(node);
371
- expect(typeof handler).toBe('function');
372
- });
373
- it('resolves tripleoctagon shape to a function (fan-in handler)', () => {
374
- const registry = createDefaultRegistry();
375
- const node = makeNode({ type: '', shape: 'tripleoctagon' });
376
- const handler = registry.resolve(node);
377
- expect(typeof handler).toBe('function');
378
- });
379
- it('tripleoctagon shape and parallel.fan_in type resolve to the same handler instance', () => {
380
- const registry = createDefaultRegistry();
381
- const byType = registry.resolve(makeNode({ type: 'parallel.fan_in', shape: '' }));
382
- const byShape = registry.resolve(makeNode({ type: '', shape: 'tripleoctagon' }));
383
- // Both should be functions (they will be separate instances from createFanInHandler,
384
- // but both should behave as fan-in handlers)
385
- expect(typeof byType).toBe('function');
386
- expect(typeof byShape).toBe('function');
387
- });
388
- it('fan-in handler works correctly when resolved from registry (AC7 + smoke)', async () => {
389
- const registry = createDefaultRegistry();
390
- const node = makeNode({ type: 'parallel.fan_in', shape: 'tripleoctagon', prompt: '' });
391
- const handler = registry.resolve(node);
392
- const results = [makeBranch({ branch_id: 1, status: 'SUCCESS' })];
393
- const ctx = makeContext({ 'parallel.results': results });
394
- const outcome = await handler(node, ctx, stubGraph);
395
- expect(outcome.status).toBe('SUCCESS');
396
- expect(ctx.get('parallel.fan_in.best_id')).toBe(1);
397
- });
398
- });
399
- //# sourceMappingURL=fan-in.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fan-in.test.js","sourceRoot":"","sources":["../../../src/handlers/__tests__/fan-in.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Unit tests for join-policy.ts (story 50-3, AC7).
3
- *
4
- * Tests the pure `evaluateJoinPolicy` function and `BranchCancellationManager`
5
- * class with at least 20 `it(...)` cases covering all join policy behaviors,
6
- * cancellation signal delivery, and edge cases.
7
- */
8
- export {};
9
- //# sourceMappingURL=join-policy.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"join-policy.test.d.ts","sourceRoot":"","sources":["../../../src/handlers/__tests__/join-policy.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1,201 +0,0 @@
1
- /**
2
- * Unit tests for join-policy.ts (story 50-3, AC7).
3
- *
4
- * Tests the pure `evaluateJoinPolicy` function and `BranchCancellationManager`
5
- * class with at least 20 `it(...)` cases covering all join policy behaviors,
6
- * cancellation signal delivery, and edge cases.
7
- */
8
- import { describe, it, expect } from 'vitest';
9
- import { evaluateJoinPolicy, BranchCancellationManager, } from '../join-policy.js';
10
- // ---------------------------------------------------------------------------
11
- // Test data helpers
12
- // ---------------------------------------------------------------------------
13
- const success = (index) => ({ index, outcome: 'SUCCESS' });
14
- const fail = (index) => ({ index, outcome: 'FAIL' });
15
- const cancelled = (index) => ({ index, outcome: 'CANCELLED' });
16
- // ---------------------------------------------------------------------------
17
- // wait_all tests (4 cases)
18
- // ---------------------------------------------------------------------------
19
- describe('evaluateJoinPolicy — wait_all', () => {
20
- it('returns wait when only 1 of 3 branches complete', () => {
21
- const cfg = { policy: 'wait_all' };
22
- expect(evaluateJoinPolicy(cfg, [success(0)], 3)).toEqual({ action: 'wait' });
23
- });
24
- it('returns wait when 2 of 3 branches complete', () => {
25
- const cfg = { policy: 'wait_all' };
26
- expect(evaluateJoinPolicy(cfg, [success(0), success(1)], 3)).toEqual({ action: 'wait' });
27
- });
28
- it('returns continue when all 3 branches complete (all success)', () => {
29
- const cfg = { policy: 'wait_all' };
30
- const result = evaluateJoinPolicy(cfg, [success(0), success(1), success(2)], 3);
31
- expect(result.action).toBe('continue');
32
- if (result.action === 'continue')
33
- expect(result.results).toHaveLength(3);
34
- });
35
- it('returns continue when all 3 branches complete (mixed success/fail)', () => {
36
- const cfg = { policy: 'wait_all' };
37
- const result = evaluateJoinPolicy(cfg, [success(0), fail(1), success(2)], 3);
38
- expect(result.action).toBe('continue');
39
- if (result.action === 'continue') {
40
- expect(result.results).toHaveLength(3);
41
- expect(result.results.find(r => r.outcome === 'FAIL')).toBeDefined();
42
- }
43
- });
44
- it('returns continue for single branch that completes', () => {
45
- const cfg = { policy: 'wait_all' };
46
- const result = evaluateJoinPolicy(cfg, [success(0)], 1);
47
- expect(result.action).toBe('continue');
48
- });
49
- it('returns continue vacuously when total=0', () => {
50
- const cfg = { policy: 'wait_all' };
51
- const result = evaluateJoinPolicy(cfg, [], 0);
52
- expect(result.action).toBe('continue');
53
- });
54
- });
55
- // ---------------------------------------------------------------------------
56
- // first_success tests (5 cases)
57
- // ---------------------------------------------------------------------------
58
- describe('evaluateJoinPolicy — first_success', () => {
59
- it('returns continue immediately when first branch succeeds', () => {
60
- const cfg = { policy: 'first_success' };
61
- const result = evaluateJoinPolicy(cfg, [success(0)], 3);
62
- expect(result.action).toBe('continue');
63
- });
64
- it('returns continue when second branch succeeds (first failed)', () => {
65
- const cfg = { policy: 'first_success' };
66
- const result = evaluateJoinPolicy(cfg, [fail(0), success(1)], 3);
67
- expect(result.action).toBe('continue');
68
- });
69
- it('returns wait when only failures so far (more branches remaining)', () => {
70
- const cfg = { policy: 'first_success' };
71
- const result = evaluateJoinPolicy(cfg, [fail(0)], 3);
72
- expect(result.action).toBe('wait');
73
- });
74
- it('returns fail when all branches have completed with FAIL', () => {
75
- const cfg = { policy: 'first_success' };
76
- const result = evaluateJoinPolicy(cfg, [fail(0), fail(1), fail(2)], 3);
77
- expect(result.action).toBe('fail');
78
- if (result.action === 'fail') {
79
- expect(result.reason).toMatch(/all 3 branches failed/);
80
- }
81
- });
82
- it('returns fail when all complete and none succeed (mix of FAIL+CANCELLED)', () => {
83
- const cfg = { policy: 'first_success' };
84
- // 3 completed, 3 total, no SUCCESS → all completed, all failed
85
- const result = evaluateJoinPolicy(cfg, [fail(0), cancelled(1), fail(2)], 3);
86
- expect(result.action).toBe('fail');
87
- });
88
- it('returns continue for single-branch first_success when it succeeds', () => {
89
- const cfg = { policy: 'first_success' };
90
- const result = evaluateJoinPolicy(cfg, [success(0)], 1);
91
- expect(result.action).toBe('continue');
92
- });
93
- });
94
- // ---------------------------------------------------------------------------
95
- // quorum tests (5 cases)
96
- // ---------------------------------------------------------------------------
97
- describe('evaluateJoinPolicy — quorum', () => {
98
- it('returns continue when exactly quorum_size branches succeed', () => {
99
- const cfg = { policy: 'quorum', quorum_size: 2 };
100
- const result = evaluateJoinPolicy(cfg, [success(0), fail(1), success(2)], 4);
101
- expect(result.action).toBe('continue');
102
- });
103
- it('returns continue when more than quorum_size branches succeed', () => {
104
- const cfg = { policy: 'quorum', quorum_size: 2 };
105
- const result = evaluateJoinPolicy(cfg, [success(0), success(1), success(2)], 4);
106
- expect(result.action).toBe('continue');
107
- });
108
- it('returns wait when quorum_size=2 but only 1 success with more branches remaining', () => {
109
- const cfg = { policy: 'quorum', quorum_size: 2 };
110
- const result = evaluateJoinPolicy(cfg, [success(0)], 4);
111
- expect(result.action).toBe('wait');
112
- });
113
- it('returns fail when quorum is unreachable (failed > total - quorum_size)', () => {
114
- const cfg = { policy: 'quorum', quorum_size: 3 };
115
- // 3 failed, needed 3 of 4 → 0 successes + 1 remaining < 3 needed → unreachable
116
- const result = evaluateJoinPolicy(cfg, [fail(0), fail(1), fail(2)], 4);
117
- expect(result.action).toBe('fail');
118
- if (result.action === 'fail') {
119
- expect(result.reason).toMatch(/quorum unreachable/);
120
- }
121
- });
122
- it('returns fail with descriptive reason for quorum unreachable', () => {
123
- const cfg = { policy: 'quorum', quorum_size: 3 };
124
- const result = evaluateJoinPolicy(cfg, [fail(0), fail(1), fail(2)], 4);
125
- expect(result.action).toBe('fail');
126
- if (result.action === 'fail') {
127
- // Reason should mention failure counts and what was needed
128
- expect(result.reason).toContain('3'); // failed count
129
- expect(result.reason).toContain('4'); // total
130
- }
131
- });
132
- it('returns fail when quorum_size=0 (guard)', () => {
133
- const cfg = { policy: 'quorum', quorum_size: 0 };
134
- const result = evaluateJoinPolicy(cfg, [], 3);
135
- expect(result.action).toBe('fail');
136
- if (result.action === 'fail') {
137
- expect(result.reason).toMatch(/quorum_size must be >= 1/);
138
- }
139
- });
140
- it('returns wait for quorum when no branches completed yet', () => {
141
- const cfg = { policy: 'quorum', quorum_size: 2 };
142
- const result = evaluateJoinPolicy(cfg, [], 4);
143
- expect(result.action).toBe('wait');
144
- });
145
- });
146
- // ---------------------------------------------------------------------------
147
- // BranchCancellationManager tests (4 cases)
148
- // ---------------------------------------------------------------------------
149
- describe('BranchCancellationManager', () => {
150
- it('getSignal returns an AbortSignal', () => {
151
- const mgr = new BranchCancellationManager(3);
152
- const signal = mgr.getSignal(0);
153
- expect(signal).toBeInstanceOf(AbortSignal);
154
- });
155
- it('signal is not aborted before cancelRemaining is called', () => {
156
- const mgr = new BranchCancellationManager(3);
157
- expect(mgr.getSignal(0).aborted).toBe(false);
158
- expect(mgr.getSignal(1).aborted).toBe(false);
159
- expect(mgr.getSignal(2).aborted).toBe(false);
160
- });
161
- it('cancelRemaining aborts signals for non-completed branches only', () => {
162
- const mgr = new BranchCancellationManager(3);
163
- // Branch 0 is "completed"; branches 1 and 2 should be cancelled
164
- mgr.cancelRemaining(new Set([0]));
165
- expect(mgr.getSignal(0).aborted).toBe(false); // completed — not cancelled
166
- expect(mgr.getSignal(1).aborted).toBe(true);
167
- expect(mgr.getSignal(2).aborted).toBe(true);
168
- });
169
- it('signal for a completed branch is NOT aborted after cancelRemaining', () => {
170
- const mgr = new BranchCancellationManager(4);
171
- mgr.cancelRemaining(new Set([1, 3])); // completedIndices: branches 1 and 3 finished
172
- // cancelRemaining cancels branches NOT in the set (0 and 2)
173
- expect(mgr.getSignal(0).aborted).toBe(true);
174
- expect(mgr.getSignal(1).aborted).toBe(false);
175
- expect(mgr.getSignal(2).aborted).toBe(true);
176
- expect(mgr.getSignal(3).aborted).toBe(false);
177
- });
178
- it('drainAsync resolves after the specified timeout', async () => {
179
- const mgr = new BranchCancellationManager(1);
180
- const start = Date.now();
181
- await mgr.drainAsync(20);
182
- const elapsed = Date.now() - start;
183
- expect(elapsed).toBeGreaterThanOrEqual(15); // allow minor timing variance
184
- });
185
- });
186
- // ---------------------------------------------------------------------------
187
- // Edge case tests (2 cases)
188
- // ---------------------------------------------------------------------------
189
- describe('evaluateJoinPolicy — edge cases', () => {
190
- it('first_success with total=1 and single success → continue', () => {
191
- const cfg = { policy: 'first_success' };
192
- const result = evaluateJoinPolicy(cfg, [success(0)], 1);
193
- expect(result.action).toBe('continue');
194
- });
195
- it('wait_all with 0 completed and total=0 → continue (vacuous)', () => {
196
- const cfg = { policy: 'wait_all' };
197
- const result = evaluateJoinPolicy(cfg, [], 0);
198
- expect(result.action).toBe('continue');
199
- });
200
- });
201
- //# sourceMappingURL=join-policy.test.js.map