@substrate-ai/factory 0.20.1 → 0.20.3

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 (486) hide show
  1. package/README.md +39 -0
  2. package/package.json +6 -3
  3. package/dist/__tests__/config.test.d.ts +0 -11
  4. package/dist/__tests__/config.test.d.ts.map +0 -1
  5. package/dist/__tests__/config.test.js +0 -215
  6. package/dist/__tests__/config.test.js.map +0 -1
  7. package/dist/__tests__/factory-run-command.test.d.ts +0 -12
  8. package/dist/__tests__/factory-run-command.test.d.ts.map +0 -1
  9. package/dist/__tests__/factory-run-command.test.js +0 -454
  10. package/dist/__tests__/factory-run-command.test.js.map +0 -1
  11. package/dist/__tests__/factory-validate-command.test.d.ts +0 -15
  12. package/dist/__tests__/factory-validate-command.test.d.ts.map +0 -1
  13. package/dist/__tests__/factory-validate-command.test.js +0 -339
  14. package/dist/__tests__/factory-validate-command.test.js.map +0 -1
  15. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.d.ts +0 -72
  16. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.d.ts.map +0 -1
  17. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.js +0 -121
  18. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.js.map +0 -1
  19. package/dist/__tests__/fixtures/llm-edge-routing.dot.d.ts +0 -28
  20. package/dist/__tests__/fixtures/llm-edge-routing.dot.d.ts.map +0 -1
  21. package/dist/__tests__/fixtures/llm-edge-routing.dot.js +0 -55
  22. package/dist/__tests__/fixtures/llm-edge-routing.dot.js.map +0 -1
  23. package/dist/__tests__/fixtures/manager-loop.dot.d.ts +0 -34
  24. package/dist/__tests__/fixtures/manager-loop.dot.d.ts.map +0 -1
  25. package/dist/__tests__/fixtures/manager-loop.dot.js +0 -61
  26. package/dist/__tests__/fixtures/manager-loop.dot.js.map +0 -1
  27. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.d.ts +0 -42
  28. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.d.ts.map +0 -1
  29. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.js +0 -118
  30. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.js.map +0 -1
  31. package/dist/__tests__/fixtures/subgraph-parent.dot.d.ts +0 -35
  32. package/dist/__tests__/fixtures/subgraph-parent.dot.d.ts.map +0 -1
  33. package/dist/__tests__/fixtures/subgraph-parent.dot.js +0 -69
  34. package/dist/__tests__/fixtures/subgraph-parent.dot.js.map +0 -1
  35. package/dist/__tests__/integration/advanced-graph-events.test.d.ts +0 -19
  36. package/dist/__tests__/integration/advanced-graph-events.test.d.ts.map +0 -1
  37. package/dist/__tests__/integration/advanced-graph-events.test.js +0 -288
  38. package/dist/__tests__/integration/advanced-graph-events.test.js.map +0 -1
  39. package/dist/__tests__/integration/checkpoint-resume.test.d.ts +0 -10
  40. package/dist/__tests__/integration/checkpoint-resume.test.d.ts.map +0 -1
  41. package/dist/__tests__/integration/checkpoint-resume.test.js +0 -125
  42. package/dist/__tests__/integration/checkpoint-resume.test.js.map +0 -1
  43. package/dist/__tests__/integration/conditional-pipeline.test.d.ts +0 -10
  44. package/dist/__tests__/integration/conditional-pipeline.test.d.ts.map +0 -1
  45. package/dist/__tests__/integration/conditional-pipeline.test.js +0 -106
  46. package/dist/__tests__/integration/conditional-pipeline.test.js.map +0 -1
  47. package/dist/__tests__/integration/convergence-validation.test.d.ts +0 -14
  48. package/dist/__tests__/integration/convergence-validation.test.d.ts.map +0 -1
  49. package/dist/__tests__/integration/convergence-validation.test.js +0 -449
  50. package/dist/__tests__/integration/convergence-validation.test.js.map +0 -1
  51. package/dist/__tests__/integration/epic44-coverage-gate.test.d.ts +0 -12
  52. package/dist/__tests__/integration/epic44-coverage-gate.test.d.ts.map +0 -1
  53. package/dist/__tests__/integration/epic44-coverage-gate.test.js +0 -58
  54. package/dist/__tests__/integration/epic44-coverage-gate.test.js.map +0 -1
  55. package/dist/__tests__/integration/epic45-coverage-gate.test.d.ts +0 -11
  56. package/dist/__tests__/integration/epic45-coverage-gate.test.d.ts.map +0 -1
  57. package/dist/__tests__/integration/epic45-coverage-gate.test.js +0 -64
  58. package/dist/__tests__/integration/epic45-coverage-gate.test.js.map +0 -1
  59. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.d.ts +0 -2
  60. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.d.ts.map +0 -1
  61. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.js +0 -285
  62. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.js.map +0 -1
  63. package/dist/__tests__/integration/events.test.d.ts +0 -8
  64. package/dist/__tests__/integration/events.test.d.ts.map +0 -1
  65. package/dist/__tests__/integration/events.test.js +0 -194
  66. package/dist/__tests__/integration/events.test.js.map +0 -1
  67. package/dist/__tests__/integration/graphs.d.ts +0 -59
  68. package/dist/__tests__/integration/graphs.d.ts.map +0 -1
  69. package/dist/__tests__/integration/graphs.js +0 -164
  70. package/dist/__tests__/integration/graphs.js.map +0 -1
  71. package/dist/__tests__/integration/helpers.d.ts +0 -127
  72. package/dist/__tests__/integration/helpers.d.ts.map +0 -1
  73. package/dist/__tests__/integration/helpers.js +0 -167
  74. package/dist/__tests__/integration/helpers.js.map +0 -1
  75. package/dist/__tests__/integration/integrity.test.d.ts +0 -8
  76. package/dist/__tests__/integration/integrity.test.d.ts.map +0 -1
  77. package/dist/__tests__/integration/integrity.test.js +0 -198
  78. package/dist/__tests__/integration/integrity.test.js.map +0 -1
  79. package/dist/__tests__/integration/llm-edge-routing.test.d.ts +0 -21
  80. package/dist/__tests__/integration/llm-edge-routing.test.d.ts.map +0 -1
  81. package/dist/__tests__/integration/llm-edge-routing.test.js +0 -341
  82. package/dist/__tests__/integration/llm-edge-routing.test.js.map +0 -1
  83. package/dist/__tests__/integration/manager-loop.test.d.ts +0 -24
  84. package/dist/__tests__/integration/manager-loop.test.d.ts.map +0 -1
  85. package/dist/__tests__/integration/manager-loop.test.js +0 -276
  86. package/dist/__tests__/integration/manager-loop.test.js.map +0 -1
  87. package/dist/__tests__/integration/multi-type-graph.test.d.ts +0 -10
  88. package/dist/__tests__/integration/multi-type-graph.test.d.ts.map +0 -1
  89. package/dist/__tests__/integration/multi-type-graph.test.js +0 -100
  90. package/dist/__tests__/integration/multi-type-graph.test.js.map +0 -1
  91. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.d.ts +0 -22
  92. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.d.ts.map +0 -1
  93. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.js +0 -515
  94. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.js.map +0 -1
  95. package/dist/__tests__/integration/persistence.test.d.ts +0 -8
  96. package/dist/__tests__/integration/persistence.test.d.ts.map +0 -1
  97. package/dist/__tests__/integration/persistence.test.js +0 -129
  98. package/dist/__tests__/integration/persistence.test.js.map +0 -1
  99. package/dist/__tests__/integration/pipeline-templates-integration.test.d.ts +0 -16
  100. package/dist/__tests__/integration/pipeline-templates-integration.test.d.ts.map +0 -1
  101. package/dist/__tests__/integration/pipeline-templates-integration.test.js +0 -171
  102. package/dist/__tests__/integration/pipeline-templates-integration.test.js.map +0 -1
  103. package/dist/__tests__/integration/scenario-pipeline.test.d.ts +0 -11
  104. package/dist/__tests__/integration/scenario-pipeline.test.d.ts.map +0 -1
  105. package/dist/__tests__/integration/scenario-pipeline.test.js +0 -243
  106. package/dist/__tests__/integration/scenario-pipeline.test.js.map +0 -1
  107. package/dist/__tests__/integration/stylesheet-application.test.d.ts +0 -12
  108. package/dist/__tests__/integration/stylesheet-application.test.d.ts.map +0 -1
  109. package/dist/__tests__/integration/stylesheet-application.test.js +0 -119
  110. package/dist/__tests__/integration/stylesheet-application.test.js.map +0 -1
  111. package/dist/__tests__/integration/subgraph-execution.test.d.ts +0 -24
  112. package/dist/__tests__/integration/subgraph-execution.test.d.ts.map +0 -1
  113. package/dist/__tests__/integration/subgraph-execution.test.js +0 -291
  114. package/dist/__tests__/integration/subgraph-execution.test.js.map +0 -1
  115. package/dist/__tests__/integration/validation-errors.test.d.ts +0 -8
  116. package/dist/__tests__/integration/validation-errors.test.d.ts.map +0 -1
  117. package/dist/__tests__/integration/validation-errors.test.js +0 -150
  118. package/dist/__tests__/integration/validation-errors.test.js.map +0 -1
  119. package/dist/agent/__tests__/loop-detection.test.d.ts +0 -2
  120. package/dist/agent/__tests__/loop-detection.test.d.ts.map +0 -1
  121. package/dist/agent/__tests__/loop-detection.test.js +0 -236
  122. package/dist/agent/__tests__/loop-detection.test.js.map +0 -1
  123. package/dist/agent/__tests__/loop.test.d.ts +0 -2
  124. package/dist/agent/__tests__/loop.test.d.ts.map +0 -1
  125. package/dist/agent/__tests__/loop.test.js +0 -868
  126. package/dist/agent/__tests__/loop.test.js.map +0 -1
  127. package/dist/agent/__tests__/truncation.test.d.ts +0 -2
  128. package/dist/agent/__tests__/truncation.test.d.ts.map +0 -1
  129. package/dist/agent/__tests__/truncation.test.js +0 -276
  130. package/dist/agent/__tests__/truncation.test.js.map +0 -1
  131. package/dist/agent/tools/__tests__/anthropic-tools.test.d.ts +0 -6
  132. package/dist/agent/tools/__tests__/anthropic-tools.test.d.ts.map +0 -1
  133. package/dist/agent/tools/__tests__/anthropic-tools.test.js +0 -49
  134. package/dist/agent/tools/__tests__/anthropic-tools.test.js.map +0 -1
  135. package/dist/agent/tools/__tests__/environment.test.d.ts +0 -6
  136. package/dist/agent/tools/__tests__/environment.test.d.ts.map +0 -1
  137. package/dist/agent/tools/__tests__/environment.test.js +0 -33
  138. package/dist/agent/tools/__tests__/environment.test.js.map +0 -1
  139. package/dist/agent/tools/__tests__/gemini-tools.test.d.ts +0 -6
  140. package/dist/agent/tools/__tests__/gemini-tools.test.d.ts.map +0 -1
  141. package/dist/agent/tools/__tests__/gemini-tools.test.js +0 -98
  142. package/dist/agent/tools/__tests__/gemini-tools.test.js.map +0 -1
  143. package/dist/agent/tools/__tests__/openai-tools.test.d.ts +0 -6
  144. package/dist/agent/tools/__tests__/openai-tools.test.d.ts.map +0 -1
  145. package/dist/agent/tools/__tests__/openai-tools.test.js +0 -53
  146. package/dist/agent/tools/__tests__/openai-tools.test.js.map +0 -1
  147. package/dist/agent/tools/__tests__/patch.test.d.ts +0 -6
  148. package/dist/agent/tools/__tests__/patch.test.d.ts.map +0 -1
  149. package/dist/agent/tools/__tests__/patch.test.js +0 -116
  150. package/dist/agent/tools/__tests__/patch.test.js.map +0 -1
  151. package/dist/agent/tools/__tests__/profiles.test.d.ts +0 -6
  152. package/dist/agent/tools/__tests__/profiles.test.d.ts.map +0 -1
  153. package/dist/agent/tools/__tests__/profiles.test.js +0 -125
  154. package/dist/agent/tools/__tests__/profiles.test.js.map +0 -1
  155. package/dist/agent/tools/__tests__/registry.test.d.ts +0 -6
  156. package/dist/agent/tools/__tests__/registry.test.d.ts.map +0 -1
  157. package/dist/agent/tools/__tests__/registry.test.js +0 -94
  158. package/dist/agent/tools/__tests__/registry.test.js.map +0 -1
  159. package/dist/agent/tools/__tests__/shared.test.d.ts +0 -6
  160. package/dist/agent/tools/__tests__/shared.test.d.ts.map +0 -1
  161. package/dist/agent/tools/__tests__/shared.test.js +0 -131
  162. package/dist/agent/tools/__tests__/shared.test.js.map +0 -1
  163. package/dist/backend/__tests__/direct-backend.test.d.ts +0 -14
  164. package/dist/backend/__tests__/direct-backend.test.d.ts.map +0 -1
  165. package/dist/backend/__tests__/direct-backend.test.js +0 -393
  166. package/dist/backend/__tests__/direct-backend.test.js.map +0 -1
  167. package/dist/backend/__tests__/direct-bootstrap.test.d.ts +0 -7
  168. package/dist/backend/__tests__/direct-bootstrap.test.d.ts.map +0 -1
  169. package/dist/backend/__tests__/direct-bootstrap.test.js +0 -177
  170. package/dist/backend/__tests__/direct-bootstrap.test.js.map +0 -1
  171. package/dist/backend/__tests__/mock-backend.test.d.ts +0 -7
  172. package/dist/backend/__tests__/mock-backend.test.d.ts.map +0 -1
  173. package/dist/backend/__tests__/mock-backend.test.js +0 -273
  174. package/dist/backend/__tests__/mock-backend.test.js.map +0 -1
  175. package/dist/backend/__tests__/parity.test.d.ts +0 -17
  176. package/dist/backend/__tests__/parity.test.d.ts.map +0 -1
  177. package/dist/backend/__tests__/parity.test.js +0 -411
  178. package/dist/backend/__tests__/parity.test.js.map +0 -1
  179. package/dist/context/__tests__/auto-summarizer.test.d.ts +0 -14
  180. package/dist/context/__tests__/auto-summarizer.test.d.ts.map +0 -1
  181. package/dist/context/__tests__/auto-summarizer.test.js +0 -189
  182. package/dist/context/__tests__/auto-summarizer.test.js.map +0 -1
  183. package/dist/context/__tests__/context-cli-command.test.d.ts +0 -7
  184. package/dist/context/__tests__/context-cli-command.test.d.ts.map +0 -1
  185. package/dist/context/__tests__/context-cli-command.test.js +0 -331
  186. package/dist/context/__tests__/context-cli-command.test.js.map +0 -1
  187. package/dist/context/__tests__/pyramid-summary-integration.test.d.ts +0 -2
  188. package/dist/context/__tests__/pyramid-summary-integration.test.d.ts.map +0 -1
  189. package/dist/context/__tests__/pyramid-summary-integration.test.js +0 -533
  190. package/dist/context/__tests__/pyramid-summary-integration.test.js.map +0 -1
  191. package/dist/context/__tests__/summarizer.test.d.ts +0 -2
  192. package/dist/context/__tests__/summarizer.test.d.ts.map +0 -1
  193. package/dist/context/__tests__/summarizer.test.js +0 -189
  194. package/dist/context/__tests__/summarizer.test.js.map +0 -1
  195. package/dist/context/__tests__/summary-cache.test.d.ts +0 -2
  196. package/dist/context/__tests__/summary-cache.test.d.ts.map +0 -1
  197. package/dist/context/__tests__/summary-cache.test.js +0 -214
  198. package/dist/context/__tests__/summary-cache.test.js.map +0 -1
  199. package/dist/context/__tests__/summary-metrics.test.d.ts +0 -2
  200. package/dist/context/__tests__/summary-metrics.test.d.ts.map +0 -1
  201. package/dist/context/__tests__/summary-metrics.test.js +0 -172
  202. package/dist/context/__tests__/summary-metrics.test.js.map +0 -1
  203. package/dist/context/__tests__/summary-types.test.d.ts +0 -2
  204. package/dist/context/__tests__/summary-types.test.d.ts.map +0 -1
  205. package/dist/context/__tests__/summary-types.test.js +0 -130
  206. package/dist/context/__tests__/summary-types.test.js.map +0 -1
  207. package/dist/convergence/__tests__/budget.test.d.ts +0 -6
  208. package/dist/convergence/__tests__/budget.test.d.ts.map +0 -1
  209. package/dist/convergence/__tests__/budget.test.js +0 -187
  210. package/dist/convergence/__tests__/budget.test.js.map +0 -1
  211. package/dist/convergence/__tests__/controller.test.d.ts +0 -9
  212. package/dist/convergence/__tests__/controller.test.d.ts.map +0 -1
  213. package/dist/convergence/__tests__/controller.test.js +0 -585
  214. package/dist/convergence/__tests__/controller.test.js.map +0 -1
  215. package/dist/convergence/__tests__/dual-signal.test.d.ts +0 -14
  216. package/dist/convergence/__tests__/dual-signal.test.d.ts.map +0 -1
  217. package/dist/convergence/__tests__/dual-signal.test.js +0 -123
  218. package/dist/convergence/__tests__/dual-signal.test.js.map +0 -1
  219. package/dist/convergence/__tests__/epic46-integration.test.d.ts +0 -15
  220. package/dist/convergence/__tests__/epic46-integration.test.d.ts.map +0 -1
  221. package/dist/convergence/__tests__/epic46-integration.test.js +0 -522
  222. package/dist/convergence/__tests__/epic46-integration.test.js.map +0 -1
  223. package/dist/convergence/__tests__/plateau.test.d.ts +0 -6
  224. package/dist/convergence/__tests__/plateau.test.d.ts.map +0 -1
  225. package/dist/convergence/__tests__/plateau.test.js +0 -163
  226. package/dist/convergence/__tests__/plateau.test.js.map +0 -1
  227. package/dist/convergence/__tests__/remediation.test.d.ts +0 -11
  228. package/dist/convergence/__tests__/remediation.test.d.ts.map +0 -1
  229. package/dist/convergence/__tests__/remediation.test.js +0 -209
  230. package/dist/convergence/__tests__/remediation.test.js.map +0 -1
  231. package/dist/convergence/__tests__/scenario-primary.test.d.ts +0 -13
  232. package/dist/convergence/__tests__/scenario-primary.test.d.ts.map +0 -1
  233. package/dist/convergence/__tests__/scenario-primary.test.js +0 -183
  234. package/dist/convergence/__tests__/scenario-primary.test.js.map +0 -1
  235. package/dist/factory-command.test.d.ts +0 -8
  236. package/dist/factory-command.test.d.ts.map +0 -1
  237. package/dist/factory-command.test.js +0 -304
  238. package/dist/factory-command.test.js.map +0 -1
  239. package/dist/graph/__tests__/attractor-compliance.test.d.ts +0 -10
  240. package/dist/graph/__tests__/attractor-compliance.test.d.ts.map +0 -1
  241. package/dist/graph/__tests__/attractor-compliance.test.js +0 -766
  242. package/dist/graph/__tests__/attractor-compliance.test.js.map +0 -1
  243. package/dist/graph/__tests__/checkpoint.test.d.ts +0 -8
  244. package/dist/graph/__tests__/checkpoint.test.d.ts.map +0 -1
  245. package/dist/graph/__tests__/checkpoint.test.js +0 -329
  246. package/dist/graph/__tests__/checkpoint.test.js.map +0 -1
  247. package/dist/graph/__tests__/condition-parser.test.d.ts +0 -14
  248. package/dist/graph/__tests__/condition-parser.test.d.ts.map +0 -1
  249. package/dist/graph/__tests__/condition-parser.test.js +0 -406
  250. package/dist/graph/__tests__/condition-parser.test.js.map +0 -1
  251. package/dist/graph/__tests__/context.test.d.ts +0 -14
  252. package/dist/graph/__tests__/context.test.d.ts.map +0 -1
  253. package/dist/graph/__tests__/context.test.js +0 -276
  254. package/dist/graph/__tests__/context.test.js.map +0 -1
  255. package/dist/graph/__tests__/edge-selector-events.test.d.ts +0 -11
  256. package/dist/graph/__tests__/edge-selector-events.test.d.ts.map +0 -1
  257. package/dist/graph/__tests__/edge-selector-events.test.js +0 -184
  258. package/dist/graph/__tests__/edge-selector-events.test.js.map +0 -1
  259. package/dist/graph/__tests__/edge-selector.test.d.ts +0 -6
  260. package/dist/graph/__tests__/edge-selector.test.d.ts.map +0 -1
  261. package/dist/graph/__tests__/edge-selector.test.js +0 -452
  262. package/dist/graph/__tests__/edge-selector.test.js.map +0 -1
  263. package/dist/graph/__tests__/executor-convergence.test.d.ts +0 -12
  264. package/dist/graph/__tests__/executor-convergence.test.d.ts.map +0 -1
  265. package/dist/graph/__tests__/executor-convergence.test.js +0 -432
  266. package/dist/graph/__tests__/executor-convergence.test.js.map +0 -1
  267. package/dist/graph/__tests__/executor-fidelity.test.d.ts +0 -13
  268. package/dist/graph/__tests__/executor-fidelity.test.d.ts.map +0 -1
  269. package/dist/graph/__tests__/executor-fidelity.test.js +0 -335
  270. package/dist/graph/__tests__/executor-fidelity.test.js.map +0 -1
  271. package/dist/graph/__tests__/executor.test.d.ts +0 -14
  272. package/dist/graph/__tests__/executor.test.d.ts.map +0 -1
  273. package/dist/graph/__tests__/executor.test.js +0 -901
  274. package/dist/graph/__tests__/executor.test.js.map +0 -1
  275. package/dist/graph/__tests__/fidelity.test.d.ts +0 -8
  276. package/dist/graph/__tests__/fidelity.test.d.ts.map +0 -1
  277. package/dist/graph/__tests__/fidelity.test.js +0 -135
  278. package/dist/graph/__tests__/fidelity.test.js.map +0 -1
  279. package/dist/graph/__tests__/llm-evaluator.test.d.ts +0 -7
  280. package/dist/graph/__tests__/llm-evaluator.test.d.ts.map +0 -1
  281. package/dist/graph/__tests__/llm-evaluator.test.js +0 -106
  282. package/dist/graph/__tests__/llm-evaluator.test.js.map +0 -1
  283. package/dist/graph/__tests__/parser-chaining.test.d.ts +0 -13
  284. package/dist/graph/__tests__/parser-chaining.test.d.ts.map +0 -1
  285. package/dist/graph/__tests__/parser-chaining.test.js +0 -215
  286. package/dist/graph/__tests__/parser-chaining.test.js.map +0 -1
  287. package/dist/graph/__tests__/parser.test.d.ts +0 -22
  288. package/dist/graph/__tests__/parser.test.d.ts.map +0 -1
  289. package/dist/graph/__tests__/parser.test.js +0 -452
  290. package/dist/graph/__tests__/parser.test.js.map +0 -1
  291. package/dist/graph/__tests__/run-state.test.d.ts +0 -13
  292. package/dist/graph/__tests__/run-state.test.d.ts.map +0 -1
  293. package/dist/graph/__tests__/run-state.test.js +0 -189
  294. package/dist/graph/__tests__/run-state.test.js.map +0 -1
  295. package/dist/graph/__tests__/transformer.test.d.ts +0 -16
  296. package/dist/graph/__tests__/transformer.test.d.ts.map +0 -1
  297. package/dist/graph/__tests__/transformer.test.js +0 -350
  298. package/dist/graph/__tests__/transformer.test.js.map +0 -1
  299. package/dist/graph/__tests__/validator-errors.test.d.ts +0 -15
  300. package/dist/graph/__tests__/validator-errors.test.d.ts.map +0 -1
  301. package/dist/graph/__tests__/validator-errors.test.js +0 -572
  302. package/dist/graph/__tests__/validator-errors.test.js.map +0 -1
  303. package/dist/graph/__tests__/validator-warnings.test.d.ts +0 -15
  304. package/dist/graph/__tests__/validator-warnings.test.d.ts.map +0 -1
  305. package/dist/graph/__tests__/validator-warnings.test.js +0 -363
  306. package/dist/graph/__tests__/validator-warnings.test.js.map +0 -1
  307. package/dist/handlers/__tests__/codergen-handler.test.d.ts +0 -14
  308. package/dist/handlers/__tests__/codergen-handler.test.d.ts.map +0 -1
  309. package/dist/handlers/__tests__/codergen-handler.test.js +0 -442
  310. package/dist/handlers/__tests__/codergen-handler.test.js.map +0 -1
  311. package/dist/handlers/__tests__/fan-in.test.d.ts +0 -14
  312. package/dist/handlers/__tests__/fan-in.test.d.ts.map +0 -1
  313. package/dist/handlers/__tests__/fan-in.test.js +0 -399
  314. package/dist/handlers/__tests__/fan-in.test.js.map +0 -1
  315. package/dist/handlers/__tests__/join-policy.test.d.ts +0 -9
  316. package/dist/handlers/__tests__/join-policy.test.d.ts.map +0 -1
  317. package/dist/handlers/__tests__/join-policy.test.js +0 -201
  318. package/dist/handlers/__tests__/join-policy.test.js.map +0 -1
  319. package/dist/handlers/__tests__/manager-loop.test.d.ts +0 -14
  320. package/dist/handlers/__tests__/manager-loop.test.d.ts.map +0 -1
  321. package/dist/handlers/__tests__/manager-loop.test.js +0 -322
  322. package/dist/handlers/__tests__/manager-loop.test.js.map +0 -1
  323. package/dist/handlers/__tests__/parallel-events.test.d.ts +0 -12
  324. package/dist/handlers/__tests__/parallel-events.test.d.ts.map +0 -1
  325. package/dist/handlers/__tests__/parallel-events.test.js +0 -252
  326. package/dist/handlers/__tests__/parallel-events.test.js.map +0 -1
  327. package/dist/handlers/__tests__/parallel-handler.test.d.ts +0 -14
  328. package/dist/handlers/__tests__/parallel-handler.test.d.ts.map +0 -1
  329. package/dist/handlers/__tests__/parallel-handler.test.js +0 -337
  330. package/dist/handlers/__tests__/parallel-handler.test.js.map +0 -1
  331. package/dist/handlers/__tests__/parallel-join.test.d.ts +0 -9
  332. package/dist/handlers/__tests__/parallel-join.test.d.ts.map +0 -1
  333. package/dist/handlers/__tests__/parallel-join.test.js +0 -267
  334. package/dist/handlers/__tests__/parallel-join.test.js.map +0 -1
  335. package/dist/handlers/__tests__/registry.test.d.ts +0 -14
  336. package/dist/handlers/__tests__/registry.test.d.ts.map +0 -1
  337. package/dist/handlers/__tests__/registry.test.js +0 -315
  338. package/dist/handlers/__tests__/registry.test.js.map +0 -1
  339. package/dist/handlers/__tests__/subgraph-events.test.d.ts +0 -10
  340. package/dist/handlers/__tests__/subgraph-events.test.d.ts.map +0 -1
  341. package/dist/handlers/__tests__/subgraph-events.test.js +0 -189
  342. package/dist/handlers/__tests__/subgraph-events.test.js.map +0 -1
  343. package/dist/handlers/__tests__/subgraph-inheritance.test.d.ts +0 -14
  344. package/dist/handlers/__tests__/subgraph-inheritance.test.d.ts.map +0 -1
  345. package/dist/handlers/__tests__/subgraph-inheritance.test.js +0 -267
  346. package/dist/handlers/__tests__/subgraph-inheritance.test.js.map +0 -1
  347. package/dist/handlers/__tests__/subgraph.test.d.ts +0 -14
  348. package/dist/handlers/__tests__/subgraph.test.d.ts.map +0 -1
  349. package/dist/handlers/__tests__/subgraph.test.js +0 -369
  350. package/dist/handlers/__tests__/subgraph.test.js.map +0 -1
  351. package/dist/handlers/__tests__/tool-handler.test.d.ts +0 -11
  352. package/dist/handlers/__tests__/tool-handler.test.d.ts.map +0 -1
  353. package/dist/handlers/__tests__/tool-handler.test.js +0 -184
  354. package/dist/handlers/__tests__/tool-handler.test.js.map +0 -1
  355. package/dist/handlers/__tests__/tool-scenario.test.d.ts +0 -12
  356. package/dist/handlers/__tests__/tool-scenario.test.d.ts.map +0 -1
  357. package/dist/handlers/__tests__/tool-scenario.test.js +0 -222
  358. package/dist/handlers/__tests__/tool-scenario.test.js.map +0 -1
  359. package/dist/handlers/__tests__/wait-human-handler.test.d.ts +0 -11
  360. package/dist/handlers/__tests__/wait-human-handler.test.d.ts.map +0 -1
  361. package/dist/handlers/__tests__/wait-human-handler.test.js +0 -251
  362. package/dist/handlers/__tests__/wait-human-handler.test.js.map +0 -1
  363. package/dist/llm/__tests__/client.test.d.ts +0 -2
  364. package/dist/llm/__tests__/client.test.d.ts.map +0 -1
  365. package/dist/llm/__tests__/client.test.js +0 -198
  366. package/dist/llm/__tests__/client.test.js.map +0 -1
  367. package/dist/llm/__tests__/types.test.d.ts +0 -2
  368. package/dist/llm/__tests__/types.test.d.ts.map +0 -1
  369. package/dist/llm/__tests__/types.test.js +0 -289
  370. package/dist/llm/__tests__/types.test.js.map +0 -1
  371. package/dist/llm/middleware/__tests__/cost-tracking.test.d.ts +0 -2
  372. package/dist/llm/middleware/__tests__/cost-tracking.test.d.ts.map +0 -1
  373. package/dist/llm/middleware/__tests__/cost-tracking.test.js +0 -73
  374. package/dist/llm/middleware/__tests__/cost-tracking.test.js.map +0 -1
  375. package/dist/llm/middleware/__tests__/logging.test.d.ts +0 -2
  376. package/dist/llm/middleware/__tests__/logging.test.d.ts.map +0 -1
  377. package/dist/llm/middleware/__tests__/logging.test.js +0 -127
  378. package/dist/llm/middleware/__tests__/logging.test.js.map +0 -1
  379. package/dist/llm/middleware/__tests__/retry.test.d.ts +0 -2
  380. package/dist/llm/middleware/__tests__/retry.test.d.ts.map +0 -1
  381. package/dist/llm/middleware/__tests__/retry.test.js +0 -126
  382. package/dist/llm/middleware/__tests__/retry.test.js.map +0 -1
  383. package/dist/llm/providers/__tests__/anthropic.test.d.ts +0 -2
  384. package/dist/llm/providers/__tests__/anthropic.test.d.ts.map +0 -1
  385. package/dist/llm/providers/__tests__/anthropic.test.js +0 -412
  386. package/dist/llm/providers/__tests__/anthropic.test.js.map +0 -1
  387. package/dist/llm/providers/__tests__/gemini.test.d.ts +0 -2
  388. package/dist/llm/providers/__tests__/gemini.test.d.ts.map +0 -1
  389. package/dist/llm/providers/__tests__/gemini.test.js +0 -591
  390. package/dist/llm/providers/__tests__/gemini.test.js.map +0 -1
  391. package/dist/llm/providers/__tests__/openai.test.d.ts +0 -2
  392. package/dist/llm/providers/__tests__/openai.test.d.ts.map +0 -1
  393. package/dist/llm/providers/__tests__/openai.test.js +0 -546
  394. package/dist/llm/providers/__tests__/openai.test.js.map +0 -1
  395. package/dist/persistence/__tests__/factory-queries.test.d.ts +0 -9
  396. package/dist/persistence/__tests__/factory-queries.test.d.ts.map +0 -1
  397. package/dist/persistence/__tests__/factory-queries.test.js +0 -372
  398. package/dist/persistence/__tests__/factory-queries.test.js.map +0 -1
  399. package/dist/persistence/__tests__/factory-schema.test.d.ts +0 -6
  400. package/dist/persistence/__tests__/factory-schema.test.d.ts.map +0 -1
  401. package/dist/persistence/__tests__/factory-schema.test.js +0 -105
  402. package/dist/persistence/__tests__/factory-schema.test.js.map +0 -1
  403. package/dist/scenarios/__tests__/cli-command-list.test.d.ts +0 -7
  404. package/dist/scenarios/__tests__/cli-command-list.test.d.ts.map +0 -1
  405. package/dist/scenarios/__tests__/cli-command-list.test.js +0 -237
  406. package/dist/scenarios/__tests__/cli-command-list.test.js.map +0 -1
  407. package/dist/scenarios/__tests__/cli-command.test.d.ts +0 -11
  408. package/dist/scenarios/__tests__/cli-command.test.d.ts.map +0 -1
  409. package/dist/scenarios/__tests__/cli-command.test.js +0 -275
  410. package/dist/scenarios/__tests__/cli-command.test.js.map +0 -1
  411. package/dist/scenarios/__tests__/integrity-pipeline.test.d.ts +0 -15
  412. package/dist/scenarios/__tests__/integrity-pipeline.test.d.ts.map +0 -1
  413. package/dist/scenarios/__tests__/integrity-pipeline.test.js +0 -318
  414. package/dist/scenarios/__tests__/integrity-pipeline.test.js.map +0 -1
  415. package/dist/scenarios/__tests__/runner-twins.test.d.ts +0 -13
  416. package/dist/scenarios/__tests__/runner-twins.test.d.ts.map +0 -1
  417. package/dist/scenarios/__tests__/runner-twins.test.js +0 -205
  418. package/dist/scenarios/__tests__/runner-twins.test.js.map +0 -1
  419. package/dist/scenarios/__tests__/scorer.test.d.ts +0 -11
  420. package/dist/scenarios/__tests__/scorer.test.d.ts.map +0 -1
  421. package/dist/scenarios/__tests__/scorer.test.js +0 -225
  422. package/dist/scenarios/__tests__/scorer.test.js.map +0 -1
  423. package/dist/scenarios/__tests__/scoring-integration.test.d.ts +0 -8
  424. package/dist/scenarios/__tests__/scoring-integration.test.d.ts.map +0 -1
  425. package/dist/scenarios/__tests__/scoring-integration.test.js +0 -178
  426. package/dist/scenarios/__tests__/scoring-integration.test.js.map +0 -1
  427. package/dist/scenarios/__tests__/store.test.d.ts +0 -5
  428. package/dist/scenarios/__tests__/store.test.d.ts.map +0 -1
  429. package/dist/scenarios/__tests__/store.test.js +0 -169
  430. package/dist/scenarios/__tests__/store.test.js.map +0 -1
  431. package/dist/stylesheet/__tests__/stylesheet.test.d.ts +0 -17
  432. package/dist/stylesheet/__tests__/stylesheet.test.d.ts.map +0 -1
  433. package/dist/stylesheet/__tests__/stylesheet.test.js +0 -368
  434. package/dist/stylesheet/__tests__/stylesheet.test.js.map +0 -1
  435. package/dist/templates/__tests__/templates.test.d.ts +0 -7
  436. package/dist/templates/__tests__/templates.test.d.ts.map +0 -1
  437. package/dist/templates/__tests__/templates.test.js +0 -92
  438. package/dist/templates/__tests__/templates.test.js.map +0 -1
  439. package/dist/twins/__tests__/docker-compose.test.d.ts +0 -13
  440. package/dist/twins/__tests__/docker-compose.test.d.ts.map +0 -1
  441. package/dist/twins/__tests__/docker-compose.test.js +0 -247
  442. package/dist/twins/__tests__/docker-compose.test.js.map +0 -1
  443. package/dist/twins/__tests__/health-monitor.test.d.ts +0 -19
  444. package/dist/twins/__tests__/health-monitor.test.d.ts.map +0 -1
  445. package/dist/twins/__tests__/health-monitor.test.js +0 -301
  446. package/dist/twins/__tests__/health-monitor.test.js.map +0 -1
  447. package/dist/twins/__tests__/integration/e2e.test.d.ts +0 -18
  448. package/dist/twins/__tests__/integration/e2e.test.d.ts.map +0 -1
  449. package/dist/twins/__tests__/integration/e2e.test.js +0 -146
  450. package/dist/twins/__tests__/integration/e2e.test.js.map +0 -1
  451. package/dist/twins/__tests__/integration/helpers.d.ts +0 -32
  452. package/dist/twins/__tests__/integration/helpers.d.ts.map +0 -1
  453. package/dist/twins/__tests__/integration/helpers.js +0 -67
  454. package/dist/twins/__tests__/integration/helpers.js.map +0 -1
  455. package/dist/twins/__tests__/integration/lifecycle.test.d.ts +0 -14
  456. package/dist/twins/__tests__/integration/lifecycle.test.d.ts.map +0 -1
  457. package/dist/twins/__tests__/integration/lifecycle.test.js +0 -127
  458. package/dist/twins/__tests__/integration/lifecycle.test.js.map +0 -1
  459. package/dist/twins/__tests__/integration/persistence-integration.test.d.ts +0 -14
  460. package/dist/twins/__tests__/integration/persistence-integration.test.d.ts.map +0 -1
  461. package/dist/twins/__tests__/integration/persistence-integration.test.js +0 -132
  462. package/dist/twins/__tests__/integration/persistence-integration.test.js.map +0 -1
  463. package/dist/twins/__tests__/persistence.test.d.ts +0 -10
  464. package/dist/twins/__tests__/persistence.test.d.ts.map +0 -1
  465. package/dist/twins/__tests__/persistence.test.js +0 -300
  466. package/dist/twins/__tests__/persistence.test.js.map +0 -1
  467. package/dist/twins/__tests__/registry.test.d.ts +0 -7
  468. package/dist/twins/__tests__/registry.test.d.ts.map +0 -1
  469. package/dist/twins/__tests__/registry.test.js +0 -282
  470. package/dist/twins/__tests__/registry.test.js.map +0 -1
  471. package/dist/twins/__tests__/run-state.test.d.ts +0 -9
  472. package/dist/twins/__tests__/run-state.test.d.ts.map +0 -1
  473. package/dist/twins/__tests__/run-state.test.js +0 -112
  474. package/dist/twins/__tests__/run-state.test.js.map +0 -1
  475. package/dist/twins/__tests__/templates-cli.test.d.ts +0 -10
  476. package/dist/twins/__tests__/templates-cli.test.d.ts.map +0 -1
  477. package/dist/twins/__tests__/templates-cli.test.js +0 -187
  478. package/dist/twins/__tests__/templates-cli.test.js.map +0 -1
  479. package/dist/twins/__tests__/templates.test.d.ts +0 -7
  480. package/dist/twins/__tests__/templates.test.d.ts.map +0 -1
  481. package/dist/twins/__tests__/templates.test.js +0 -87
  482. package/dist/twins/__tests__/templates.test.js.map +0 -1
  483. package/dist/twins/__tests__/twins-cli.test.d.ts +0 -11
  484. package/dist/twins/__tests__/twins-cli.test.d.ts.map +0 -1
  485. package/dist/twins/__tests__/twins-cli.test.js +0 -365
  486. 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