@substrate-ai/factory 0.20.1 → 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 (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,411 +0,0 @@
1
- /**
2
- * Parity test suite that verifies `DirectCodergenBackend` and the CLI `callLLM`
3
- * path produce structurally equivalent outcomes for the same codergen tasks.
4
- * Observable differences between the two backends are intentional and documented.
5
- *
6
- * Story 48-11.
7
- *
8
- * Covers:
9
- * AC1 – SUCCESS outcome structure is identical across both backends
10
- * AC2 – FAILURE outcome is structurally comparable
11
- * AC3 – Direct backend exposes TOOL_CALL_START/END events absent from CLI path
12
- * AC4 – Direct backend exposes LOOP_DETECTION signal absent from CLI path
13
- * AC5 – Direct backend exposes per-turn token usage; CLI path does not
14
- * AC6 – Multiple sequential invocations produce independent outcomes
15
- */
16
- import { describe, it, expect, vi, beforeEach } from 'vitest';
17
- // ---------------------------------------------------------------------------
18
- // Mock declarations — must be hoisted before any imports that load the mocked
19
- // modules. Vitest hoists vi.mock() calls at transpile time.
20
- // ---------------------------------------------------------------------------
21
- vi.mock('@substrate-ai/core', () => ({
22
- callLLM: vi.fn(),
23
- }));
24
- vi.mock('../../agent/loop.js', () => ({
25
- createSession: vi.fn(() => mockSession),
26
- }));
27
- // ---------------------------------------------------------------------------
28
- // Imports — after mock declarations
29
- // ---------------------------------------------------------------------------
30
- import { callLLM } from '@substrate-ai/core';
31
- import { createSession } from '../../agent/loop.js';
32
- import { EventKind } from '../../agent/types.js';
33
- import { createCodergenHandler } from '../../handlers/codergen-handler.js';
34
- import { createDirectCodergenBackend } from '../direct-backend.js';
35
- import { GraphContext } from '../../graph/context.js';
36
- // ---------------------------------------------------------------------------
37
- // Module-level mutable state — populated/reset in beforeEach.
38
- // The vi.mock factory closes over these variables so the mock is always
39
- // up-to-date when referenced inside tests.
40
- // ---------------------------------------------------------------------------
41
- let mockHandlers;
42
- let mockHistory;
43
- let mockProcessInput;
44
- let mockClose;
45
- let mockSession;
46
- /** Cast the callLLM mock so we get .mockResolvedValue / .mockRejectedValue */
47
- const mockCallLLM = vi.mocked(callLLM);
48
- // ---------------------------------------------------------------------------
49
- // beforeEach: reset all mock state and reconstitute mockSession
50
- // ---------------------------------------------------------------------------
51
- beforeEach(() => {
52
- mockHandlers = new Map();
53
- mockHistory = [];
54
- mockClose = vi.fn();
55
- mockProcessInput = vi.fn().mockResolvedValue(undefined);
56
- mockSession = {
57
- on: vi.fn().mockImplementation((kind, handler) => {
58
- if (!mockHandlers.has(kind))
59
- mockHandlers.set(kind, []);
60
- mockHandlers.get(kind).push(handler);
61
- }),
62
- processInput: mockProcessInput,
63
- close: mockClose,
64
- get history() { return mockHistory; },
65
- };
66
- vi.mocked(createSession).mockReturnValue(mockSession);
67
- vi.clearAllMocks();
68
- // Re-set the session mock after clearAllMocks resets the call count
69
- vi.mocked(createSession).mockReturnValue(mockSession);
70
- mockSession.on.mockImplementation((kind, handler) => {
71
- if (!mockHandlers.has(kind))
72
- mockHandlers.set(kind, []);
73
- mockHandlers.get(kind).push(handler);
74
- });
75
- mockProcessInput.mockResolvedValue(undefined);
76
- });
77
- // ---------------------------------------------------------------------------
78
- // Helper: emit a synthetic event through registered handlers
79
- // ---------------------------------------------------------------------------
80
- function emitEvent(kind, data = {}) {
81
- const handlers = mockHandlers.get(kind) ?? [];
82
- const event = {
83
- kind,
84
- timestamp: new Date(),
85
- session_id: 'test-session',
86
- data,
87
- };
88
- for (const h of handlers)
89
- h(event);
90
- }
91
- // ---------------------------------------------------------------------------
92
- // Helper: make a minimal GraphNode
93
- // ---------------------------------------------------------------------------
94
- function makeNode(overrides = {}) {
95
- return {
96
- id: 'node1',
97
- label: '',
98
- shape: 'box',
99
- type: 'codergen',
100
- prompt: '',
101
- maxRetries: 0,
102
- goalGate: false,
103
- retryTarget: '',
104
- fallbackRetryTarget: '',
105
- fidelity: '',
106
- threadId: '',
107
- class: '',
108
- timeout: 0,
109
- llmModel: '',
110
- llmProvider: '',
111
- reasoningEffort: '',
112
- autoStatus: false,
113
- allowPartial: false,
114
- toolCommand: '',
115
- backend: '',
116
- ...overrides,
117
- };
118
- }
119
- // ---------------------------------------------------------------------------
120
- // Helper: make a minimal IGraphContext
121
- // ---------------------------------------------------------------------------
122
- function makeContext() {
123
- return new GraphContext({});
124
- }
125
- // ---------------------------------------------------------------------------
126
- // Helper: make a minimal Graph stub
127
- // ---------------------------------------------------------------------------
128
- function makeGraph() {
129
- return { nodes: [], edges: [], stylesheets: [] };
130
- }
131
- // ---------------------------------------------------------------------------
132
- // Helper: make an AssistantTurn (with optional usage override)
133
- // ---------------------------------------------------------------------------
134
- function makeAssistantTurn(content, usage) {
135
- return {
136
- type: 'assistant',
137
- content,
138
- tool_calls: [],
139
- reasoning: null,
140
- usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, ...usage },
141
- response_id: null,
142
- timestamp: new Date(),
143
- };
144
- }
145
- // ---------------------------------------------------------------------------
146
- // Helper: build a DirectCodergenBackend with optional onEvent collector
147
- // ---------------------------------------------------------------------------
148
- function buildDirectBackend(onEvent) {
149
- return createDirectCodergenBackend({
150
- llmClient: {},
151
- providerProfile: {},
152
- executionEnv: {},
153
- ...(onEvent ? { onEvent } : {}),
154
- });
155
- }
156
- // ---------------------------------------------------------------------------
157
- // AC1 – SUCCESS outcome structure is identical across both backends
158
- // ---------------------------------------------------------------------------
159
- describe('AC1 – SUCCESS outcome structure parity', () => {
160
- it('CLI path returns SUCCESS with correct status and contextUpdates', async () => {
161
- mockCallLLM.mockResolvedValue({ text: 'implementation output' });
162
- const handler = createCodergenHandler();
163
- const outcome = await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
164
- expect(outcome.status).toBe('SUCCESS');
165
- expect(outcome.contextUpdates?.['node1_output']).toBe('implementation output');
166
- });
167
- it('direct backend returns SUCCESS with correct status and contextUpdates', async () => {
168
- mockHistory.push(makeAssistantTurn('implementation output'));
169
- const directBackend = buildDirectBackend();
170
- const handler = createCodergenHandler({ directBackend });
171
- const outcome = await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
172
- expect(outcome.status).toBe('SUCCESS');
173
- expect(outcome.contextUpdates?.['node1_output']).toBe('implementation output');
174
- });
175
- it('contextUpdates key names and values are identical between both backends', async () => {
176
- mockCallLLM.mockResolvedValue({ text: 'implementation output' });
177
- const cliHandler = createCodergenHandler();
178
- const cliOutcome = await cliHandler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
179
- mockHistory.push(makeAssistantTurn('implementation output'));
180
- const directBackend = buildDirectBackend();
181
- const directHandler = createCodergenHandler({ directBackend });
182
- const directOutcome = await directHandler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
183
- // Core parity: status and contextUpdates structure must be identical
184
- expect(cliOutcome.status).toBe(directOutcome.status);
185
- expect(Object.keys(cliOutcome.contextUpdates ?? {})).toEqual(Object.keys(directOutcome.contextUpdates ?? {}));
186
- expect(cliOutcome.contextUpdates?.['node1_output']).toBe(directOutcome.contextUpdates?.['node1_output']);
187
- });
188
- it('documented difference: CLI path sets notes; direct path does not', async () => {
189
- mockCallLLM.mockResolvedValue({ text: 'implementation output' });
190
- const cliHandler = createCodergenHandler();
191
- const cliOutcome = await cliHandler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
192
- mockHistory.push(makeAssistantTurn('implementation output'));
193
- const directBackend = buildDirectBackend();
194
- const directHandler = createCodergenHandler({ directBackend });
195
- const directOutcome = await directHandler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
196
- // Documented difference: CLI sets notes, direct does not
197
- expect(cliOutcome.notes).toBe('implementation output');
198
- expect(directOutcome.notes).toBeUndefined();
199
- });
200
- });
201
- // ---------------------------------------------------------------------------
202
- // AC2 – FAILURE outcome is structurally comparable
203
- // ---------------------------------------------------------------------------
204
- describe('AC2 – FAILURE outcome structural parity', () => {
205
- it('CLI path returns FAILURE when callLLM throws a non-transient error', async () => {
206
- mockCallLLM.mockRejectedValue(new Error('unknown failure'));
207
- const handler = createCodergenHandler();
208
- const outcome = await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
209
- expect(outcome.status).toBe('FAILURE');
210
- });
211
- it('direct path returns FAILURE when session emits TURN_LIMIT', async () => {
212
- mockProcessInput.mockImplementation(async () => {
213
- emitEvent(EventKind.TURN_LIMIT, { reason: 'max_turns' });
214
- });
215
- const directBackend = buildDirectBackend();
216
- const handler = createCodergenHandler({ directBackend });
217
- const outcome = await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
218
- expect(outcome.status).toBe('FAILURE');
219
- });
220
- it('both paths carry status FAILURE — documented shape difference: error vs failureReason', async () => {
221
- // CLI path
222
- mockCallLLM.mockRejectedValue(new Error('unknown failure'));
223
- const cliHandler = createCodergenHandler();
224
- const cliOutcome = await cliHandler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
225
- // Direct path via TURN_LIMIT
226
- mockProcessInput.mockImplementation(async () => {
227
- emitEvent(EventKind.TURN_LIMIT, { reason: 'max_turns' });
228
- });
229
- const directBackend = buildDirectBackend();
230
- const directHandler = createCodergenHandler({ directBackend });
231
- const directOutcome = await directHandler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
232
- // Both carry FAILURE status
233
- expect(cliOutcome.status).toBe('FAILURE');
234
- expect(directOutcome.status).toBe('FAILURE');
235
- // Documented shape difference: CLI uses error, direct uses failureReason
236
- expect(cliOutcome.error).toBeDefined();
237
- expect(directOutcome.failureReason).toBe('turn limit exceeded');
238
- });
239
- });
240
- // ---------------------------------------------------------------------------
241
- // AC3 – Direct backend exposes TOOL_CALL_START/END events absent from CLI path
242
- // ---------------------------------------------------------------------------
243
- describe('AC3 – TOOL_CALL events visible on direct path only', () => {
244
- it('direct backend onEvent collector receives TOOL_CALL_START and TOOL_CALL_END', async () => {
245
- mockProcessInput.mockImplementation(async () => {
246
- emitEvent(EventKind.TOOL_CALL_START, { tool_name: 'read_file', call_id: 'call-1' });
247
- emitEvent(EventKind.TOOL_CALL_END, { call_id: 'call-1', output: 'file contents', is_error: false });
248
- mockHistory.push(makeAssistantTurn('done'));
249
- });
250
- const collectedEvents = [];
251
- const directBackend = buildDirectBackend(e => collectedEvents.push(e));
252
- const handler = createCodergenHandler({ directBackend });
253
- await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
254
- const kinds = collectedEvents.map(e => e.kind);
255
- expect(kinds).toContain(EventKind.TOOL_CALL_START);
256
- expect(kinds).toContain(EventKind.TOOL_CALL_END);
257
- });
258
- it('TOOL_CALL_START event carries tool_name and call_id metadata', async () => {
259
- mockProcessInput.mockImplementation(async () => {
260
- emitEvent(EventKind.TOOL_CALL_START, { tool_name: 'write_file', call_id: 'call-42' });
261
- mockHistory.push(makeAssistantTurn('done'));
262
- });
263
- const collectedEvents = [];
264
- const directBackend = buildDirectBackend(e => collectedEvents.push(e));
265
- const handler = createCodergenHandler({ directBackend });
266
- await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
267
- const startEvent = collectedEvents.find(e => e.kind === EventKind.TOOL_CALL_START);
268
- expect(startEvent?.data?.['tool_name']).toBe('write_file');
269
- expect(startEvent?.data?.['call_id']).toBe('call-42');
270
- });
271
- it('CLI path produces zero session events — callLLM has no event bus integration', async () => {
272
- mockCallLLM.mockResolvedValue({ text: 'result' });
273
- const handler = createCodergenHandler();
274
- await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
275
- // callLLM was invoked — but no session events exist (CLI path has no event bus)
276
- expect(mockCallLLM).toHaveBeenCalledOnce();
277
- // No session was created on the CLI path
278
- expect(createSession).not.toHaveBeenCalled();
279
- });
280
- });
281
- // ---------------------------------------------------------------------------
282
- // AC4 – Direct backend exposes LOOP_DETECTION signal absent from CLI path
283
- // ---------------------------------------------------------------------------
284
- describe('AC4 – LOOP_DETECTION signal visible on direct path only', () => {
285
- it('LOOP_DETECTION event is captured by the onEvent collector', async () => {
286
- mockProcessInput.mockImplementation(async () => {
287
- emitEvent(EventKind.LOOP_DETECTION, { message: 'loop detected: pattern length 2 repeated 5 times' });
288
- mockHistory.push(makeAssistantTurn('done'));
289
- });
290
- const collectedEvents = [];
291
- const directBackend = buildDirectBackend(e => collectedEvents.push(e));
292
- const handler = createCodergenHandler({ directBackend });
293
- await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
294
- const loopEvent = collectedEvents.find(e => e.kind === EventKind.LOOP_DETECTION);
295
- expect(loopEvent).toBeDefined();
296
- expect(loopEvent?.data?.['message']).toBe('loop detected: pattern length 2 repeated 5 times');
297
- });
298
- it('CLI path has no equivalent loop detection — callLLM is a simple function call', async () => {
299
- mockCallLLM.mockResolvedValue({ text: 'result' });
300
- const handler = createCodergenHandler();
301
- await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
302
- // No session was created — the CLI path calls callLLM directly with no event system
303
- expect(createSession).not.toHaveBeenCalled();
304
- // callLLM returns a simple text result with no loop detection signals
305
- expect(mockCallLLM).toHaveBeenCalledOnce();
306
- });
307
- });
308
- // ---------------------------------------------------------------------------
309
- // AC5 – Direct backend exposes per-turn token usage; CLI path does not
310
- // ---------------------------------------------------------------------------
311
- describe('AC5 – token usage observability', () => {
312
- it('direct backend: AssistantTurn.usage fields are readable from session.history', async () => {
313
- mockHistory.push(makeAssistantTurn('result', { inputTokens: 100, outputTokens: 50, totalTokens: 150 }));
314
- const directBackend = buildDirectBackend();
315
- const handler = createCodergenHandler({ directBackend });
316
- await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
317
- // Read the last AssistantTurn from session history
318
- const lastAssistantTurn = [...mockHistory]
319
- .reverse()
320
- .find((t) => t.type === 'assistant');
321
- expect(lastAssistantTurn).toBeDefined();
322
- expect(lastAssistantTurn.usage.inputTokens).toBe(100);
323
- expect(lastAssistantTurn.usage.outputTokens).toBe(50);
324
- expect(lastAssistantTurn.usage.totalTokens).toBe(150);
325
- });
326
- it('CLI path: callLLM return value contains only text — no usage field', async () => {
327
- mockCallLLM.mockResolvedValue({ text: 'result' });
328
- const handler = createCodergenHandler();
329
- const outcome = await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
330
- // The CLI outcome does not expose token usage
331
- expect(outcome.status).toBe('SUCCESS');
332
- // LLMCallResult only contains { text: string }
333
- const returnValue = mockCallLLM.mock.results[0]?.value;
334
- expect(returnValue?.['usage']).toBeUndefined();
335
- });
336
- it('documented constraint: token observability requires direct backend on CLI path', () => {
337
- // The CLI callLLM interface returns LLMCallResult { text: string } — no usage.
338
- // Token observability on the CLI path requires out-of-band instrumentation at
339
- // a higher level (e.g., the dispatch layer).
340
- // This test documents the constraint by checking the mock return shape.
341
- mockCallLLM.mockResolvedValue({ text: 'result' });
342
- // Direct inspection of the mock return value confirms the absence of usage
343
- const mockReturnValue = { text: 'result' };
344
- expect(Object.prototype.hasOwnProperty.call(mockReturnValue, 'usage')).toBe(false);
345
- });
346
- });
347
- // ---------------------------------------------------------------------------
348
- // AC6 – Multiple sequential invocations produce independent outcomes
349
- // ---------------------------------------------------------------------------
350
- describe('AC6 – sequential invocations are independent; no state leaks', () => {
351
- it('CLI: three sequential invocations each return SUCCESS with correct contextUpdates', async () => {
352
- mockCallLLM
353
- .mockResolvedValueOnce({ text: 'output-1' })
354
- .mockResolvedValueOnce({ text: 'output-2' })
355
- .mockResolvedValueOnce({ text: 'output-3' });
356
- const handler = createCodergenHandler();
357
- const node = makeNode({ id: 'node1' });
358
- const o1 = await handler(node, makeContext(), makeGraph());
359
- const o2 = await handler(node, makeContext(), makeGraph());
360
- const o3 = await handler(node, makeContext(), makeGraph());
361
- expect(o1.status).toBe('SUCCESS');
362
- expect(o2.status).toBe('SUCCESS');
363
- expect(o3.status).toBe('SUCCESS');
364
- expect(o1.contextUpdates?.['node1_output']).toBe('output-1');
365
- expect(o2.contextUpdates?.['node1_output']).toBe('output-2');
366
- expect(o3.contextUpdates?.['node1_output']).toBe('output-3');
367
- });
368
- it('direct: three sequential invocations each return SUCCESS', async () => {
369
- const directBackend = buildDirectBackend();
370
- const handler = createCodergenHandler({ directBackend });
371
- const node = makeNode({ id: 'node1', backend: 'direct' });
372
- // Invocation 1
373
- mockHistory.length = 0;
374
- mockHistory.push(makeAssistantTurn('output-1'));
375
- const o1 = await handler(node, makeContext(), makeGraph());
376
- // Invocation 2
377
- mockHistory.length = 0;
378
- mockHistory.push(makeAssistantTurn('output-2'));
379
- const o2 = await handler(node, makeContext(), makeGraph());
380
- // Invocation 3
381
- mockHistory.length = 0;
382
- mockHistory.push(makeAssistantTurn('output-3'));
383
- const o3 = await handler(node, makeContext(), makeGraph());
384
- expect(o1.status).toBe('SUCCESS');
385
- expect(o2.status).toBe('SUCCESS');
386
- expect(o3.status).toBe('SUCCESS');
387
- });
388
- it('direct: createSession called exactly 3 times across 3 invocations', async () => {
389
- const directBackend = buildDirectBackend();
390
- const handler = createCodergenHandler({ directBackend });
391
- const node = makeNode({ id: 'node1', backend: 'direct' });
392
- for (let i = 0; i < 3; i++) {
393
- mockHistory.length = 0;
394
- mockHistory.push(makeAssistantTurn(`output-${i + 1}`));
395
- await handler(node, makeContext(), makeGraph());
396
- }
397
- expect(vi.mocked(createSession).mock.calls.length).toBe(3);
398
- });
399
- it('direct: session.close() called once per invocation — 3 times total', async () => {
400
- const directBackend = buildDirectBackend();
401
- const handler = createCodergenHandler({ directBackend });
402
- const node = makeNode({ id: 'node1', backend: 'direct' });
403
- for (let i = 0; i < 3; i++) {
404
- mockHistory.length = 0;
405
- mockHistory.push(makeAssistantTurn(`output-${i + 1}`));
406
- await handler(node, makeContext(), makeGraph());
407
- }
408
- expect(mockClose).toHaveBeenCalledTimes(3);
409
- });
410
- });
411
- //# sourceMappingURL=parity.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parity.test.js","sourceRoot":"","sources":["../../../src/backend/__tests__/parity.test.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Unit tests for AutoSummarizer (story 49-3).
3
- *
4
- * Covers:
5
- * - estimateTokens: empty, short, long strings
6
- * - shouldTrigger: below threshold, exactly at threshold, one above threshold
7
- * - compress: current-index preservation, previous-iteration compression,
8
- * compressedIndices population, CompressionResult shape
9
- * - Constructor validation: threshold out of range throws RangeError; boundaries accepted
10
- *
11
- * ≥ 14 it() cases required.
12
- */
13
- export {};
14
- //# sourceMappingURL=auto-summarizer.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-summarizer.test.d.ts","sourceRoot":"","sources":["../../../src/context/__tests__/auto-summarizer.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -1,189 +0,0 @@
1
- /**
2
- * Unit tests for AutoSummarizer (story 49-3).
3
- *
4
- * Covers:
5
- * - estimateTokens: empty, short, long strings
6
- * - shouldTrigger: below threshold, exactly at threshold, one above threshold
7
- * - compress: current-index preservation, previous-iteration compression,
8
- * compressedIndices population, CompressionResult shape
9
- * - Constructor validation: threshold out of range throws RangeError; boundaries accepted
10
- *
11
- * ≥ 14 it() cases required.
12
- */
13
- import { describe, it, expect } from 'vitest';
14
- import { AutoSummarizer, estimateTokens, } from '../auto-summarizer.js';
15
- // ---------------------------------------------------------------------------
16
- // MockSummaryEngine — local implementation, no vi.mock() needed
17
- // ---------------------------------------------------------------------------
18
- class MockSummaryEngine {
19
- name = 'mock-summary-engine';
20
- async summarize(content, targetLevel, _opts) {
21
- return {
22
- level: targetLevel,
23
- content: content.slice(0, 10),
24
- originalHash: 'mock-hash',
25
- createdAt: new Date().toISOString(),
26
- };
27
- }
28
- async expand(summary, _targetLevel, opts) {
29
- return opts?.originalContent ?? summary.content;
30
- }
31
- }
32
- const mockEngine = new MockSummaryEngine();
33
- // ---------------------------------------------------------------------------
34
- // estimateTokens — 3 cases
35
- // ---------------------------------------------------------------------------
36
- describe('estimateTokens', () => {
37
- it('returns 0 for an empty string', () => {
38
- expect(estimateTokens('')).toBe(0);
39
- });
40
- it("returns 1 for 'abcd' (4 chars → Math.ceil(4/4) = 1)", () => {
41
- expect(estimateTokens('abcd')).toBe(1);
42
- });
43
- it('returns 100 for a 400-char string (Math.ceil(400/4) = 100)', () => {
44
- const text = 'a'.repeat(400);
45
- expect(estimateTokens(text)).toBe(100);
46
- });
47
- });
48
- // ---------------------------------------------------------------------------
49
- // shouldTrigger — 3 cases
50
- // ---------------------------------------------------------------------------
51
- describe('shouldTrigger', () => {
52
- // Model limit = 1000 tokens, threshold = 0.8 → trigger point = 800 tokens
53
- const MODEL_LIMIT = 1000;
54
- const THRESHOLD = 0.8;
55
- function makeAutoSummarizer(threshold = THRESHOLD) {
56
- return new AutoSummarizer(mockEngine, MODEL_LIMIT, { threshold });
57
- }
58
- it('returns false when total token estimate is below the threshold', () => {
59
- const summarizer = makeAutoSummarizer();
60
- // 790 tokens total — below 800
61
- const iterations = [
62
- { index: 0, content: '', tokenEstimate: 400 },
63
- { index: 1, content: '', tokenEstimate: 390 },
64
- ];
65
- expect(summarizer.shouldTrigger(iterations)).toBe(false);
66
- });
67
- it('returns false when total token estimate is exactly at the threshold (strict >)', () => {
68
- const summarizer = makeAutoSummarizer();
69
- // exactly 800 tokens — NOT strictly greater than 800, so false
70
- const iterations = [
71
- { index: 0, content: '', tokenEstimate: 400 },
72
- { index: 1, content: '', tokenEstimate: 400 },
73
- ];
74
- expect(summarizer.shouldTrigger(iterations)).toBe(false);
75
- });
76
- it('returns true when total token estimate is one above the threshold', () => {
77
- const summarizer = makeAutoSummarizer();
78
- // 801 tokens — strictly greater than 800
79
- const iterations = [
80
- { index: 0, content: '', tokenEstimate: 400 },
81
- { index: 1, content: '', tokenEstimate: 401 },
82
- ];
83
- expect(summarizer.shouldTrigger(iterations)).toBe(true);
84
- });
85
- });
86
- // ---------------------------------------------------------------------------
87
- // compress — 4 cases
88
- // ---------------------------------------------------------------------------
89
- describe('compress', () => {
90
- const MODEL_LIMIT = 10000;
91
- let summarizer;
92
- // Set up summarizer before each test
93
- function getSummarizer() {
94
- return new AutoSummarizer(mockEngine, MODEL_LIMIT, { threshold: 0.8, targetLevel: 'medium' });
95
- }
96
- it('preserves the current-index iteration with original content (no compressed field)', async () => {
97
- summarizer = getSummarizer();
98
- const iterations = [
99
- { index: 0, content: 'earlier output' },
100
- { index: 1, content: 'current output' },
101
- ];
102
- const result = await summarizer.compress(iterations, /* currentIndex */ 1);
103
- const currentIter = result.iterations.find((c) => c.index === 1);
104
- expect(currentIter).toBeDefined();
105
- // Should NOT be compressed
106
- expect('compressed' in currentIter).toBe(false);
107
- // Should have original content
108
- expect(currentIter.content).toBe('current output');
109
- });
110
- it('compresses previous iterations with compressed: true and a Summary', async () => {
111
- summarizer = getSummarizer();
112
- const iterations = [
113
- { index: 0, content: 'output zero' },
114
- { index: 1, content: 'output one' },
115
- { index: 2, content: 'output two — current' },
116
- ];
117
- const result = await summarizer.compress(iterations, /* currentIndex */ 2);
118
- const compressed0 = result.iterations.find((c) => c.index === 0);
119
- const compressed1 = result.iterations.find((c) => c.index === 1);
120
- expect(compressed0.compressed).toBe(true);
121
- expect(compressed0.summary).toBeDefined();
122
- expect(compressed0.summary.level).toBe('medium');
123
- expect(compressed1.compressed).toBe(true);
124
- expect(compressed1.summary).toBeDefined();
125
- });
126
- it('populates compressedIndices with all indices that were compressed', async () => {
127
- summarizer = getSummarizer();
128
- const iterations = [
129
- { index: 0, content: 'output zero' },
130
- { index: 1, content: 'output one' },
131
- { index: 2, content: 'current' },
132
- ];
133
- const result = await summarizer.compress(iterations, /* currentIndex */ 2);
134
- expect(result.compressedIndices).toContain(0);
135
- expect(result.compressedIndices).toContain(1);
136
- expect(result.compressedIndices).not.toContain(2);
137
- expect(result.compressedIndices).toHaveLength(2);
138
- });
139
- it('CompressionResult has iterations array with expected length (all iterations preserved)', async () => {
140
- summarizer = getSummarizer();
141
- const iterations = [
142
- { index: 0, content: 'a' },
143
- { index: 1, content: 'b' },
144
- { index: 2, content: 'c' },
145
- ];
146
- const result = await summarizer.compress(iterations, /* currentIndex */ 2);
147
- // All 3 iterations are present (0 and 1 compressed, 2 unchanged)
148
- expect(result.iterations).toHaveLength(3);
149
- });
150
- });
151
- // ---------------------------------------------------------------------------
152
- // Constructor validation — 4 cases
153
- // ---------------------------------------------------------------------------
154
- describe('AutoSummarizer constructor — threshold validation', () => {
155
- it('throws RangeError when threshold is 0.4 (below 0.5)', () => {
156
- expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.4 })).toThrowError(RangeError);
157
- expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.4 })).toThrowError('context_summarize_threshold must be between 0.5 and 0.95');
158
- });
159
- it('throws RangeError when threshold is 0.96 (above 0.95)', () => {
160
- expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.96 })).toThrowError(RangeError);
161
- expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.96 })).toThrowError('context_summarize_threshold must be between 0.5 and 0.95');
162
- });
163
- it('constructs without error when threshold is exactly 0.5 (lower boundary)', () => {
164
- expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.5 })).not.toThrow();
165
- });
166
- it('constructs without error when threshold is exactly 0.95 (upper boundary)', () => {
167
- expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.95 })).not.toThrow();
168
- });
169
- });
170
- // ---------------------------------------------------------------------------
171
- // Additional coverage — estimateTokens used when tokenEstimate absent + default threshold
172
- // ---------------------------------------------------------------------------
173
- describe('shouldTrigger — uses estimateTokens when tokenEstimate absent', () => {
174
- it('computes token estimate from content.length/4 when tokenEstimate is not set', () => {
175
- // model limit 100, threshold 0.8 → trigger at > 80 tokens
176
- // content = 400 chars → estimateTokens = 100 tokens → should trigger
177
- const summarizer = new AutoSummarizer(mockEngine, 100, { threshold: 0.8 });
178
- const iterations = [
179
- { index: 0, content: 'x'.repeat(400) }, // no tokenEstimate — computed as 100
180
- ];
181
- expect(summarizer.shouldTrigger(iterations)).toBe(true);
182
- });
183
- });
184
- describe('AutoSummarizer — default threshold accepted (undefined config)', () => {
185
- it('constructs without error when no config is passed (default threshold 0.8)', () => {
186
- expect(() => new AutoSummarizer(mockEngine, 1000)).not.toThrow();
187
- });
188
- });
189
- //# sourceMappingURL=auto-summarizer.test.js.map