@substrate-ai/factory 0.19.54 → 0.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/README.md +39 -0
  2. package/dist/config.d.ts +4 -4
  3. package/package.json +12 -3
  4. package/dist/__tests__/config.test.d.ts +0 -11
  5. package/dist/__tests__/config.test.d.ts.map +0 -1
  6. package/dist/__tests__/config.test.js +0 -215
  7. package/dist/__tests__/config.test.js.map +0 -1
  8. package/dist/__tests__/factory-run-command.test.d.ts +0 -12
  9. package/dist/__tests__/factory-run-command.test.d.ts.map +0 -1
  10. package/dist/__tests__/factory-run-command.test.js +0 -454
  11. package/dist/__tests__/factory-run-command.test.js.map +0 -1
  12. package/dist/__tests__/factory-validate-command.test.d.ts +0 -15
  13. package/dist/__tests__/factory-validate-command.test.d.ts.map +0 -1
  14. package/dist/__tests__/factory-validate-command.test.js +0 -339
  15. package/dist/__tests__/factory-validate-command.test.js.map +0 -1
  16. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.d.ts +0 -72
  17. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.d.ts.map +0 -1
  18. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.js +0 -121
  19. package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.js.map +0 -1
  20. package/dist/__tests__/fixtures/llm-edge-routing.dot.d.ts +0 -28
  21. package/dist/__tests__/fixtures/llm-edge-routing.dot.d.ts.map +0 -1
  22. package/dist/__tests__/fixtures/llm-edge-routing.dot.js +0 -55
  23. package/dist/__tests__/fixtures/llm-edge-routing.dot.js.map +0 -1
  24. package/dist/__tests__/fixtures/manager-loop.dot.d.ts +0 -34
  25. package/dist/__tests__/fixtures/manager-loop.dot.d.ts.map +0 -1
  26. package/dist/__tests__/fixtures/manager-loop.dot.js +0 -61
  27. package/dist/__tests__/fixtures/manager-loop.dot.js.map +0 -1
  28. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.d.ts +0 -42
  29. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.d.ts.map +0 -1
  30. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.js +0 -118
  31. package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.js.map +0 -1
  32. package/dist/__tests__/fixtures/subgraph-parent.dot.d.ts +0 -35
  33. package/dist/__tests__/fixtures/subgraph-parent.dot.d.ts.map +0 -1
  34. package/dist/__tests__/fixtures/subgraph-parent.dot.js +0 -69
  35. package/dist/__tests__/fixtures/subgraph-parent.dot.js.map +0 -1
  36. package/dist/__tests__/integration/advanced-graph-events.test.d.ts +0 -19
  37. package/dist/__tests__/integration/advanced-graph-events.test.d.ts.map +0 -1
  38. package/dist/__tests__/integration/advanced-graph-events.test.js +0 -288
  39. package/dist/__tests__/integration/advanced-graph-events.test.js.map +0 -1
  40. package/dist/__tests__/integration/checkpoint-resume.test.d.ts +0 -10
  41. package/dist/__tests__/integration/checkpoint-resume.test.d.ts.map +0 -1
  42. package/dist/__tests__/integration/checkpoint-resume.test.js +0 -125
  43. package/dist/__tests__/integration/checkpoint-resume.test.js.map +0 -1
  44. package/dist/__tests__/integration/conditional-pipeline.test.d.ts +0 -10
  45. package/dist/__tests__/integration/conditional-pipeline.test.d.ts.map +0 -1
  46. package/dist/__tests__/integration/conditional-pipeline.test.js +0 -106
  47. package/dist/__tests__/integration/conditional-pipeline.test.js.map +0 -1
  48. package/dist/__tests__/integration/convergence-validation.test.d.ts +0 -14
  49. package/dist/__tests__/integration/convergence-validation.test.d.ts.map +0 -1
  50. package/dist/__tests__/integration/convergence-validation.test.js +0 -449
  51. package/dist/__tests__/integration/convergence-validation.test.js.map +0 -1
  52. package/dist/__tests__/integration/epic44-coverage-gate.test.d.ts +0 -12
  53. package/dist/__tests__/integration/epic44-coverage-gate.test.d.ts.map +0 -1
  54. package/dist/__tests__/integration/epic44-coverage-gate.test.js +0 -58
  55. package/dist/__tests__/integration/epic44-coverage-gate.test.js.map +0 -1
  56. package/dist/__tests__/integration/epic45-coverage-gate.test.d.ts +0 -11
  57. package/dist/__tests__/integration/epic45-coverage-gate.test.d.ts.map +0 -1
  58. package/dist/__tests__/integration/epic45-coverage-gate.test.js +0 -64
  59. package/dist/__tests__/integration/epic45-coverage-gate.test.js.map +0 -1
  60. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.d.ts +0 -2
  61. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.d.ts.map +0 -1
  62. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.js +0 -285
  63. package/dist/__tests__/integration/epic46-scenario-primary-executor.test.js.map +0 -1
  64. package/dist/__tests__/integration/events.test.d.ts +0 -8
  65. package/dist/__tests__/integration/events.test.d.ts.map +0 -1
  66. package/dist/__tests__/integration/events.test.js +0 -194
  67. package/dist/__tests__/integration/events.test.js.map +0 -1
  68. package/dist/__tests__/integration/graphs.d.ts +0 -59
  69. package/dist/__tests__/integration/graphs.d.ts.map +0 -1
  70. package/dist/__tests__/integration/graphs.js +0 -164
  71. package/dist/__tests__/integration/graphs.js.map +0 -1
  72. package/dist/__tests__/integration/helpers.d.ts +0 -127
  73. package/dist/__tests__/integration/helpers.d.ts.map +0 -1
  74. package/dist/__tests__/integration/helpers.js +0 -167
  75. package/dist/__tests__/integration/helpers.js.map +0 -1
  76. package/dist/__tests__/integration/integrity.test.d.ts +0 -8
  77. package/dist/__tests__/integration/integrity.test.d.ts.map +0 -1
  78. package/dist/__tests__/integration/integrity.test.js +0 -198
  79. package/dist/__tests__/integration/integrity.test.js.map +0 -1
  80. package/dist/__tests__/integration/llm-edge-routing.test.d.ts +0 -21
  81. package/dist/__tests__/integration/llm-edge-routing.test.d.ts.map +0 -1
  82. package/dist/__tests__/integration/llm-edge-routing.test.js +0 -341
  83. package/dist/__tests__/integration/llm-edge-routing.test.js.map +0 -1
  84. package/dist/__tests__/integration/manager-loop.test.d.ts +0 -24
  85. package/dist/__tests__/integration/manager-loop.test.d.ts.map +0 -1
  86. package/dist/__tests__/integration/manager-loop.test.js +0 -276
  87. package/dist/__tests__/integration/manager-loop.test.js.map +0 -1
  88. package/dist/__tests__/integration/multi-type-graph.test.d.ts +0 -10
  89. package/dist/__tests__/integration/multi-type-graph.test.d.ts.map +0 -1
  90. package/dist/__tests__/integration/multi-type-graph.test.js +0 -100
  91. package/dist/__tests__/integration/multi-type-graph.test.js.map +0 -1
  92. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.d.ts +0 -22
  93. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.d.ts.map +0 -1
  94. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.js +0 -515
  95. package/dist/__tests__/integration/parallel-fan-out-fan-in.test.js.map +0 -1
  96. package/dist/__tests__/integration/persistence.test.d.ts +0 -8
  97. package/dist/__tests__/integration/persistence.test.d.ts.map +0 -1
  98. package/dist/__tests__/integration/persistence.test.js +0 -129
  99. package/dist/__tests__/integration/persistence.test.js.map +0 -1
  100. package/dist/__tests__/integration/pipeline-templates-integration.test.d.ts +0 -16
  101. package/dist/__tests__/integration/pipeline-templates-integration.test.d.ts.map +0 -1
  102. package/dist/__tests__/integration/pipeline-templates-integration.test.js +0 -171
  103. package/dist/__tests__/integration/pipeline-templates-integration.test.js.map +0 -1
  104. package/dist/__tests__/integration/scenario-pipeline.test.d.ts +0 -11
  105. package/dist/__tests__/integration/scenario-pipeline.test.d.ts.map +0 -1
  106. package/dist/__tests__/integration/scenario-pipeline.test.js +0 -243
  107. package/dist/__tests__/integration/scenario-pipeline.test.js.map +0 -1
  108. package/dist/__tests__/integration/stylesheet-application.test.d.ts +0 -12
  109. package/dist/__tests__/integration/stylesheet-application.test.d.ts.map +0 -1
  110. package/dist/__tests__/integration/stylesheet-application.test.js +0 -119
  111. package/dist/__tests__/integration/stylesheet-application.test.js.map +0 -1
  112. package/dist/__tests__/integration/subgraph-execution.test.d.ts +0 -24
  113. package/dist/__tests__/integration/subgraph-execution.test.d.ts.map +0 -1
  114. package/dist/__tests__/integration/subgraph-execution.test.js +0 -291
  115. package/dist/__tests__/integration/subgraph-execution.test.js.map +0 -1
  116. package/dist/__tests__/integration/validation-errors.test.d.ts +0 -8
  117. package/dist/__tests__/integration/validation-errors.test.d.ts.map +0 -1
  118. package/dist/__tests__/integration/validation-errors.test.js +0 -150
  119. package/dist/__tests__/integration/validation-errors.test.js.map +0 -1
  120. package/dist/agent/__tests__/loop-detection.test.d.ts +0 -2
  121. package/dist/agent/__tests__/loop-detection.test.d.ts.map +0 -1
  122. package/dist/agent/__tests__/loop-detection.test.js +0 -236
  123. package/dist/agent/__tests__/loop-detection.test.js.map +0 -1
  124. package/dist/agent/__tests__/loop.test.d.ts +0 -2
  125. package/dist/agent/__tests__/loop.test.d.ts.map +0 -1
  126. package/dist/agent/__tests__/loop.test.js +0 -868
  127. package/dist/agent/__tests__/loop.test.js.map +0 -1
  128. package/dist/agent/__tests__/truncation.test.d.ts +0 -2
  129. package/dist/agent/__tests__/truncation.test.d.ts.map +0 -1
  130. package/dist/agent/__tests__/truncation.test.js +0 -276
  131. package/dist/agent/__tests__/truncation.test.js.map +0 -1
  132. package/dist/agent/tools/__tests__/anthropic-tools.test.d.ts +0 -6
  133. package/dist/agent/tools/__tests__/anthropic-tools.test.d.ts.map +0 -1
  134. package/dist/agent/tools/__tests__/anthropic-tools.test.js +0 -49
  135. package/dist/agent/tools/__tests__/anthropic-tools.test.js.map +0 -1
  136. package/dist/agent/tools/__tests__/environment.test.d.ts +0 -6
  137. package/dist/agent/tools/__tests__/environment.test.d.ts.map +0 -1
  138. package/dist/agent/tools/__tests__/environment.test.js +0 -33
  139. package/dist/agent/tools/__tests__/environment.test.js.map +0 -1
  140. package/dist/agent/tools/__tests__/gemini-tools.test.d.ts +0 -6
  141. package/dist/agent/tools/__tests__/gemini-tools.test.d.ts.map +0 -1
  142. package/dist/agent/tools/__tests__/gemini-tools.test.js +0 -98
  143. package/dist/agent/tools/__tests__/gemini-tools.test.js.map +0 -1
  144. package/dist/agent/tools/__tests__/openai-tools.test.d.ts +0 -6
  145. package/dist/agent/tools/__tests__/openai-tools.test.d.ts.map +0 -1
  146. package/dist/agent/tools/__tests__/openai-tools.test.js +0 -53
  147. package/dist/agent/tools/__tests__/openai-tools.test.js.map +0 -1
  148. package/dist/agent/tools/__tests__/patch.test.d.ts +0 -6
  149. package/dist/agent/tools/__tests__/patch.test.d.ts.map +0 -1
  150. package/dist/agent/tools/__tests__/patch.test.js +0 -116
  151. package/dist/agent/tools/__tests__/patch.test.js.map +0 -1
  152. package/dist/agent/tools/__tests__/profiles.test.d.ts +0 -6
  153. package/dist/agent/tools/__tests__/profiles.test.d.ts.map +0 -1
  154. package/dist/agent/tools/__tests__/profiles.test.js +0 -125
  155. package/dist/agent/tools/__tests__/profiles.test.js.map +0 -1
  156. package/dist/agent/tools/__tests__/registry.test.d.ts +0 -6
  157. package/dist/agent/tools/__tests__/registry.test.d.ts.map +0 -1
  158. package/dist/agent/tools/__tests__/registry.test.js +0 -94
  159. package/dist/agent/tools/__tests__/registry.test.js.map +0 -1
  160. package/dist/agent/tools/__tests__/shared.test.d.ts +0 -6
  161. package/dist/agent/tools/__tests__/shared.test.d.ts.map +0 -1
  162. package/dist/agent/tools/__tests__/shared.test.js +0 -131
  163. package/dist/agent/tools/__tests__/shared.test.js.map +0 -1
  164. package/dist/backend/__tests__/direct-backend.test.d.ts +0 -14
  165. package/dist/backend/__tests__/direct-backend.test.d.ts.map +0 -1
  166. package/dist/backend/__tests__/direct-backend.test.js +0 -393
  167. package/dist/backend/__tests__/direct-backend.test.js.map +0 -1
  168. package/dist/backend/__tests__/direct-bootstrap.test.d.ts +0 -7
  169. package/dist/backend/__tests__/direct-bootstrap.test.d.ts.map +0 -1
  170. package/dist/backend/__tests__/direct-bootstrap.test.js +0 -177
  171. package/dist/backend/__tests__/direct-bootstrap.test.js.map +0 -1
  172. package/dist/backend/__tests__/mock-backend.test.d.ts +0 -7
  173. package/dist/backend/__tests__/mock-backend.test.d.ts.map +0 -1
  174. package/dist/backend/__tests__/mock-backend.test.js +0 -273
  175. package/dist/backend/__tests__/mock-backend.test.js.map +0 -1
  176. package/dist/backend/__tests__/parity.test.d.ts +0 -17
  177. package/dist/backend/__tests__/parity.test.d.ts.map +0 -1
  178. package/dist/backend/__tests__/parity.test.js +0 -411
  179. package/dist/backend/__tests__/parity.test.js.map +0 -1
  180. package/dist/context/__tests__/auto-summarizer.test.d.ts +0 -14
  181. package/dist/context/__tests__/auto-summarizer.test.d.ts.map +0 -1
  182. package/dist/context/__tests__/auto-summarizer.test.js +0 -189
  183. package/dist/context/__tests__/auto-summarizer.test.js.map +0 -1
  184. package/dist/context/__tests__/context-cli-command.test.d.ts +0 -7
  185. package/dist/context/__tests__/context-cli-command.test.d.ts.map +0 -1
  186. package/dist/context/__tests__/context-cli-command.test.js +0 -331
  187. package/dist/context/__tests__/context-cli-command.test.js.map +0 -1
  188. package/dist/context/__tests__/pyramid-summary-integration.test.d.ts +0 -2
  189. package/dist/context/__tests__/pyramid-summary-integration.test.d.ts.map +0 -1
  190. package/dist/context/__tests__/pyramid-summary-integration.test.js +0 -533
  191. package/dist/context/__tests__/pyramid-summary-integration.test.js.map +0 -1
  192. package/dist/context/__tests__/summarizer.test.d.ts +0 -2
  193. package/dist/context/__tests__/summarizer.test.d.ts.map +0 -1
  194. package/dist/context/__tests__/summarizer.test.js +0 -189
  195. package/dist/context/__tests__/summarizer.test.js.map +0 -1
  196. package/dist/context/__tests__/summary-cache.test.d.ts +0 -2
  197. package/dist/context/__tests__/summary-cache.test.d.ts.map +0 -1
  198. package/dist/context/__tests__/summary-cache.test.js +0 -214
  199. package/dist/context/__tests__/summary-cache.test.js.map +0 -1
  200. package/dist/context/__tests__/summary-metrics.test.d.ts +0 -2
  201. package/dist/context/__tests__/summary-metrics.test.d.ts.map +0 -1
  202. package/dist/context/__tests__/summary-metrics.test.js +0 -172
  203. package/dist/context/__tests__/summary-metrics.test.js.map +0 -1
  204. package/dist/context/__tests__/summary-types.test.d.ts +0 -2
  205. package/dist/context/__tests__/summary-types.test.d.ts.map +0 -1
  206. package/dist/context/__tests__/summary-types.test.js +0 -130
  207. package/dist/context/__tests__/summary-types.test.js.map +0 -1
  208. package/dist/convergence/__tests__/budget.test.d.ts +0 -6
  209. package/dist/convergence/__tests__/budget.test.d.ts.map +0 -1
  210. package/dist/convergence/__tests__/budget.test.js +0 -187
  211. package/dist/convergence/__tests__/budget.test.js.map +0 -1
  212. package/dist/convergence/__tests__/controller.test.d.ts +0 -9
  213. package/dist/convergence/__tests__/controller.test.d.ts.map +0 -1
  214. package/dist/convergence/__tests__/controller.test.js +0 -585
  215. package/dist/convergence/__tests__/controller.test.js.map +0 -1
  216. package/dist/convergence/__tests__/dual-signal.test.d.ts +0 -14
  217. package/dist/convergence/__tests__/dual-signal.test.d.ts.map +0 -1
  218. package/dist/convergence/__tests__/dual-signal.test.js +0 -123
  219. package/dist/convergence/__tests__/dual-signal.test.js.map +0 -1
  220. package/dist/convergence/__tests__/epic46-integration.test.d.ts +0 -15
  221. package/dist/convergence/__tests__/epic46-integration.test.d.ts.map +0 -1
  222. package/dist/convergence/__tests__/epic46-integration.test.js +0 -522
  223. package/dist/convergence/__tests__/epic46-integration.test.js.map +0 -1
  224. package/dist/convergence/__tests__/plateau.test.d.ts +0 -6
  225. package/dist/convergence/__tests__/plateau.test.d.ts.map +0 -1
  226. package/dist/convergence/__tests__/plateau.test.js +0 -163
  227. package/dist/convergence/__tests__/plateau.test.js.map +0 -1
  228. package/dist/convergence/__tests__/remediation.test.d.ts +0 -11
  229. package/dist/convergence/__tests__/remediation.test.d.ts.map +0 -1
  230. package/dist/convergence/__tests__/remediation.test.js +0 -209
  231. package/dist/convergence/__tests__/remediation.test.js.map +0 -1
  232. package/dist/convergence/__tests__/scenario-primary.test.d.ts +0 -13
  233. package/dist/convergence/__tests__/scenario-primary.test.d.ts.map +0 -1
  234. package/dist/convergence/__tests__/scenario-primary.test.js +0 -183
  235. package/dist/convergence/__tests__/scenario-primary.test.js.map +0 -1
  236. package/dist/factory-command.test.d.ts +0 -8
  237. package/dist/factory-command.test.d.ts.map +0 -1
  238. package/dist/factory-command.test.js +0 -304
  239. package/dist/factory-command.test.js.map +0 -1
  240. package/dist/graph/__tests__/attractor-compliance.test.d.ts +0 -10
  241. package/dist/graph/__tests__/attractor-compliance.test.d.ts.map +0 -1
  242. package/dist/graph/__tests__/attractor-compliance.test.js +0 -766
  243. package/dist/graph/__tests__/attractor-compliance.test.js.map +0 -1
  244. package/dist/graph/__tests__/checkpoint.test.d.ts +0 -8
  245. package/dist/graph/__tests__/checkpoint.test.d.ts.map +0 -1
  246. package/dist/graph/__tests__/checkpoint.test.js +0 -329
  247. package/dist/graph/__tests__/checkpoint.test.js.map +0 -1
  248. package/dist/graph/__tests__/condition-parser.test.d.ts +0 -14
  249. package/dist/graph/__tests__/condition-parser.test.d.ts.map +0 -1
  250. package/dist/graph/__tests__/condition-parser.test.js +0 -406
  251. package/dist/graph/__tests__/condition-parser.test.js.map +0 -1
  252. package/dist/graph/__tests__/context.test.d.ts +0 -14
  253. package/dist/graph/__tests__/context.test.d.ts.map +0 -1
  254. package/dist/graph/__tests__/context.test.js +0 -276
  255. package/dist/graph/__tests__/context.test.js.map +0 -1
  256. package/dist/graph/__tests__/edge-selector-events.test.d.ts +0 -11
  257. package/dist/graph/__tests__/edge-selector-events.test.d.ts.map +0 -1
  258. package/dist/graph/__tests__/edge-selector-events.test.js +0 -184
  259. package/dist/graph/__tests__/edge-selector-events.test.js.map +0 -1
  260. package/dist/graph/__tests__/edge-selector.test.d.ts +0 -6
  261. package/dist/graph/__tests__/edge-selector.test.d.ts.map +0 -1
  262. package/dist/graph/__tests__/edge-selector.test.js +0 -452
  263. package/dist/graph/__tests__/edge-selector.test.js.map +0 -1
  264. package/dist/graph/__tests__/executor-convergence.test.d.ts +0 -12
  265. package/dist/graph/__tests__/executor-convergence.test.d.ts.map +0 -1
  266. package/dist/graph/__tests__/executor-convergence.test.js +0 -432
  267. package/dist/graph/__tests__/executor-convergence.test.js.map +0 -1
  268. package/dist/graph/__tests__/executor-fidelity.test.d.ts +0 -13
  269. package/dist/graph/__tests__/executor-fidelity.test.d.ts.map +0 -1
  270. package/dist/graph/__tests__/executor-fidelity.test.js +0 -335
  271. package/dist/graph/__tests__/executor-fidelity.test.js.map +0 -1
  272. package/dist/graph/__tests__/executor.test.d.ts +0 -14
  273. package/dist/graph/__tests__/executor.test.d.ts.map +0 -1
  274. package/dist/graph/__tests__/executor.test.js +0 -901
  275. package/dist/graph/__tests__/executor.test.js.map +0 -1
  276. package/dist/graph/__tests__/fidelity.test.d.ts +0 -8
  277. package/dist/graph/__tests__/fidelity.test.d.ts.map +0 -1
  278. package/dist/graph/__tests__/fidelity.test.js +0 -135
  279. package/dist/graph/__tests__/fidelity.test.js.map +0 -1
  280. package/dist/graph/__tests__/llm-evaluator.test.d.ts +0 -7
  281. package/dist/graph/__tests__/llm-evaluator.test.d.ts.map +0 -1
  282. package/dist/graph/__tests__/llm-evaluator.test.js +0 -106
  283. package/dist/graph/__tests__/llm-evaluator.test.js.map +0 -1
  284. package/dist/graph/__tests__/parser-chaining.test.d.ts +0 -13
  285. package/dist/graph/__tests__/parser-chaining.test.d.ts.map +0 -1
  286. package/dist/graph/__tests__/parser-chaining.test.js +0 -215
  287. package/dist/graph/__tests__/parser-chaining.test.js.map +0 -1
  288. package/dist/graph/__tests__/parser.test.d.ts +0 -22
  289. package/dist/graph/__tests__/parser.test.d.ts.map +0 -1
  290. package/dist/graph/__tests__/parser.test.js +0 -452
  291. package/dist/graph/__tests__/parser.test.js.map +0 -1
  292. package/dist/graph/__tests__/run-state.test.d.ts +0 -13
  293. package/dist/graph/__tests__/run-state.test.d.ts.map +0 -1
  294. package/dist/graph/__tests__/run-state.test.js +0 -189
  295. package/dist/graph/__tests__/run-state.test.js.map +0 -1
  296. package/dist/graph/__tests__/transformer.test.d.ts +0 -16
  297. package/dist/graph/__tests__/transformer.test.d.ts.map +0 -1
  298. package/dist/graph/__tests__/transformer.test.js +0 -350
  299. package/dist/graph/__tests__/transformer.test.js.map +0 -1
  300. package/dist/graph/__tests__/validator-errors.test.d.ts +0 -15
  301. package/dist/graph/__tests__/validator-errors.test.d.ts.map +0 -1
  302. package/dist/graph/__tests__/validator-errors.test.js +0 -572
  303. package/dist/graph/__tests__/validator-errors.test.js.map +0 -1
  304. package/dist/graph/__tests__/validator-warnings.test.d.ts +0 -15
  305. package/dist/graph/__tests__/validator-warnings.test.d.ts.map +0 -1
  306. package/dist/graph/__tests__/validator-warnings.test.js +0 -363
  307. package/dist/graph/__tests__/validator-warnings.test.js.map +0 -1
  308. package/dist/handlers/__tests__/codergen-handler.test.d.ts +0 -14
  309. package/dist/handlers/__tests__/codergen-handler.test.d.ts.map +0 -1
  310. package/dist/handlers/__tests__/codergen-handler.test.js +0 -442
  311. package/dist/handlers/__tests__/codergen-handler.test.js.map +0 -1
  312. package/dist/handlers/__tests__/fan-in.test.d.ts +0 -14
  313. package/dist/handlers/__tests__/fan-in.test.d.ts.map +0 -1
  314. package/dist/handlers/__tests__/fan-in.test.js +0 -399
  315. package/dist/handlers/__tests__/fan-in.test.js.map +0 -1
  316. package/dist/handlers/__tests__/join-policy.test.d.ts +0 -9
  317. package/dist/handlers/__tests__/join-policy.test.d.ts.map +0 -1
  318. package/dist/handlers/__tests__/join-policy.test.js +0 -201
  319. package/dist/handlers/__tests__/join-policy.test.js.map +0 -1
  320. package/dist/handlers/__tests__/manager-loop.test.d.ts +0 -14
  321. package/dist/handlers/__tests__/manager-loop.test.d.ts.map +0 -1
  322. package/dist/handlers/__tests__/manager-loop.test.js +0 -322
  323. package/dist/handlers/__tests__/manager-loop.test.js.map +0 -1
  324. package/dist/handlers/__tests__/parallel-events.test.d.ts +0 -12
  325. package/dist/handlers/__tests__/parallel-events.test.d.ts.map +0 -1
  326. package/dist/handlers/__tests__/parallel-events.test.js +0 -252
  327. package/dist/handlers/__tests__/parallel-events.test.js.map +0 -1
  328. package/dist/handlers/__tests__/parallel-handler.test.d.ts +0 -14
  329. package/dist/handlers/__tests__/parallel-handler.test.d.ts.map +0 -1
  330. package/dist/handlers/__tests__/parallel-handler.test.js +0 -337
  331. package/dist/handlers/__tests__/parallel-handler.test.js.map +0 -1
  332. package/dist/handlers/__tests__/parallel-join.test.d.ts +0 -9
  333. package/dist/handlers/__tests__/parallel-join.test.d.ts.map +0 -1
  334. package/dist/handlers/__tests__/parallel-join.test.js +0 -267
  335. package/dist/handlers/__tests__/parallel-join.test.js.map +0 -1
  336. package/dist/handlers/__tests__/registry.test.d.ts +0 -14
  337. package/dist/handlers/__tests__/registry.test.d.ts.map +0 -1
  338. package/dist/handlers/__tests__/registry.test.js +0 -315
  339. package/dist/handlers/__tests__/registry.test.js.map +0 -1
  340. package/dist/handlers/__tests__/subgraph-events.test.d.ts +0 -10
  341. package/dist/handlers/__tests__/subgraph-events.test.d.ts.map +0 -1
  342. package/dist/handlers/__tests__/subgraph-events.test.js +0 -189
  343. package/dist/handlers/__tests__/subgraph-events.test.js.map +0 -1
  344. package/dist/handlers/__tests__/subgraph-inheritance.test.d.ts +0 -14
  345. package/dist/handlers/__tests__/subgraph-inheritance.test.d.ts.map +0 -1
  346. package/dist/handlers/__tests__/subgraph-inheritance.test.js +0 -267
  347. package/dist/handlers/__tests__/subgraph-inheritance.test.js.map +0 -1
  348. package/dist/handlers/__tests__/subgraph.test.d.ts +0 -14
  349. package/dist/handlers/__tests__/subgraph.test.d.ts.map +0 -1
  350. package/dist/handlers/__tests__/subgraph.test.js +0 -369
  351. package/dist/handlers/__tests__/subgraph.test.js.map +0 -1
  352. package/dist/handlers/__tests__/tool-handler.test.d.ts +0 -11
  353. package/dist/handlers/__tests__/tool-handler.test.d.ts.map +0 -1
  354. package/dist/handlers/__tests__/tool-handler.test.js +0 -184
  355. package/dist/handlers/__tests__/tool-handler.test.js.map +0 -1
  356. package/dist/handlers/__tests__/tool-scenario.test.d.ts +0 -12
  357. package/dist/handlers/__tests__/tool-scenario.test.d.ts.map +0 -1
  358. package/dist/handlers/__tests__/tool-scenario.test.js +0 -222
  359. package/dist/handlers/__tests__/tool-scenario.test.js.map +0 -1
  360. package/dist/handlers/__tests__/wait-human-handler.test.d.ts +0 -11
  361. package/dist/handlers/__tests__/wait-human-handler.test.d.ts.map +0 -1
  362. package/dist/handlers/__tests__/wait-human-handler.test.js +0 -251
  363. package/dist/handlers/__tests__/wait-human-handler.test.js.map +0 -1
  364. package/dist/llm/__tests__/client.test.d.ts +0 -2
  365. package/dist/llm/__tests__/client.test.d.ts.map +0 -1
  366. package/dist/llm/__tests__/client.test.js +0 -198
  367. package/dist/llm/__tests__/client.test.js.map +0 -1
  368. package/dist/llm/__tests__/types.test.d.ts +0 -2
  369. package/dist/llm/__tests__/types.test.d.ts.map +0 -1
  370. package/dist/llm/__tests__/types.test.js +0 -289
  371. package/dist/llm/__tests__/types.test.js.map +0 -1
  372. package/dist/llm/middleware/__tests__/cost-tracking.test.d.ts +0 -2
  373. package/dist/llm/middleware/__tests__/cost-tracking.test.d.ts.map +0 -1
  374. package/dist/llm/middleware/__tests__/cost-tracking.test.js +0 -73
  375. package/dist/llm/middleware/__tests__/cost-tracking.test.js.map +0 -1
  376. package/dist/llm/middleware/__tests__/logging.test.d.ts +0 -2
  377. package/dist/llm/middleware/__tests__/logging.test.d.ts.map +0 -1
  378. package/dist/llm/middleware/__tests__/logging.test.js +0 -127
  379. package/dist/llm/middleware/__tests__/logging.test.js.map +0 -1
  380. package/dist/llm/middleware/__tests__/retry.test.d.ts +0 -2
  381. package/dist/llm/middleware/__tests__/retry.test.d.ts.map +0 -1
  382. package/dist/llm/middleware/__tests__/retry.test.js +0 -126
  383. package/dist/llm/middleware/__tests__/retry.test.js.map +0 -1
  384. package/dist/llm/providers/__tests__/anthropic.test.d.ts +0 -2
  385. package/dist/llm/providers/__tests__/anthropic.test.d.ts.map +0 -1
  386. package/dist/llm/providers/__tests__/anthropic.test.js +0 -412
  387. package/dist/llm/providers/__tests__/anthropic.test.js.map +0 -1
  388. package/dist/llm/providers/__tests__/gemini.test.d.ts +0 -2
  389. package/dist/llm/providers/__tests__/gemini.test.d.ts.map +0 -1
  390. package/dist/llm/providers/__tests__/gemini.test.js +0 -591
  391. package/dist/llm/providers/__tests__/gemini.test.js.map +0 -1
  392. package/dist/llm/providers/__tests__/openai.test.d.ts +0 -2
  393. package/dist/llm/providers/__tests__/openai.test.d.ts.map +0 -1
  394. package/dist/llm/providers/__tests__/openai.test.js +0 -546
  395. package/dist/llm/providers/__tests__/openai.test.js.map +0 -1
  396. package/dist/persistence/__tests__/factory-queries.test.d.ts +0 -9
  397. package/dist/persistence/__tests__/factory-queries.test.d.ts.map +0 -1
  398. package/dist/persistence/__tests__/factory-queries.test.js +0 -372
  399. package/dist/persistence/__tests__/factory-queries.test.js.map +0 -1
  400. package/dist/persistence/__tests__/factory-schema.test.d.ts +0 -6
  401. package/dist/persistence/__tests__/factory-schema.test.d.ts.map +0 -1
  402. package/dist/persistence/__tests__/factory-schema.test.js +0 -105
  403. package/dist/persistence/__tests__/factory-schema.test.js.map +0 -1
  404. package/dist/scenarios/__tests__/cli-command-list.test.d.ts +0 -7
  405. package/dist/scenarios/__tests__/cli-command-list.test.d.ts.map +0 -1
  406. package/dist/scenarios/__tests__/cli-command-list.test.js +0 -237
  407. package/dist/scenarios/__tests__/cli-command-list.test.js.map +0 -1
  408. package/dist/scenarios/__tests__/cli-command.test.d.ts +0 -11
  409. package/dist/scenarios/__tests__/cli-command.test.d.ts.map +0 -1
  410. package/dist/scenarios/__tests__/cli-command.test.js +0 -275
  411. package/dist/scenarios/__tests__/cli-command.test.js.map +0 -1
  412. package/dist/scenarios/__tests__/integrity-pipeline.test.d.ts +0 -15
  413. package/dist/scenarios/__tests__/integrity-pipeline.test.d.ts.map +0 -1
  414. package/dist/scenarios/__tests__/integrity-pipeline.test.js +0 -318
  415. package/dist/scenarios/__tests__/integrity-pipeline.test.js.map +0 -1
  416. package/dist/scenarios/__tests__/runner-twins.test.d.ts +0 -13
  417. package/dist/scenarios/__tests__/runner-twins.test.d.ts.map +0 -1
  418. package/dist/scenarios/__tests__/runner-twins.test.js +0 -205
  419. package/dist/scenarios/__tests__/runner-twins.test.js.map +0 -1
  420. package/dist/scenarios/__tests__/scorer.test.d.ts +0 -11
  421. package/dist/scenarios/__tests__/scorer.test.d.ts.map +0 -1
  422. package/dist/scenarios/__tests__/scorer.test.js +0 -225
  423. package/dist/scenarios/__tests__/scorer.test.js.map +0 -1
  424. package/dist/scenarios/__tests__/scoring-integration.test.d.ts +0 -8
  425. package/dist/scenarios/__tests__/scoring-integration.test.d.ts.map +0 -1
  426. package/dist/scenarios/__tests__/scoring-integration.test.js +0 -178
  427. package/dist/scenarios/__tests__/scoring-integration.test.js.map +0 -1
  428. package/dist/scenarios/__tests__/store.test.d.ts +0 -5
  429. package/dist/scenarios/__tests__/store.test.d.ts.map +0 -1
  430. package/dist/scenarios/__tests__/store.test.js +0 -169
  431. package/dist/scenarios/__tests__/store.test.js.map +0 -1
  432. package/dist/stylesheet/__tests__/stylesheet.test.d.ts +0 -17
  433. package/dist/stylesheet/__tests__/stylesheet.test.d.ts.map +0 -1
  434. package/dist/stylesheet/__tests__/stylesheet.test.js +0 -368
  435. package/dist/stylesheet/__tests__/stylesheet.test.js.map +0 -1
  436. package/dist/templates/__tests__/templates.test.d.ts +0 -7
  437. package/dist/templates/__tests__/templates.test.d.ts.map +0 -1
  438. package/dist/templates/__tests__/templates.test.js +0 -92
  439. package/dist/templates/__tests__/templates.test.js.map +0 -1
  440. package/dist/twins/__tests__/docker-compose.test.d.ts +0 -13
  441. package/dist/twins/__tests__/docker-compose.test.d.ts.map +0 -1
  442. package/dist/twins/__tests__/docker-compose.test.js +0 -247
  443. package/dist/twins/__tests__/docker-compose.test.js.map +0 -1
  444. package/dist/twins/__tests__/health-monitor.test.d.ts +0 -19
  445. package/dist/twins/__tests__/health-monitor.test.d.ts.map +0 -1
  446. package/dist/twins/__tests__/health-monitor.test.js +0 -301
  447. package/dist/twins/__tests__/health-monitor.test.js.map +0 -1
  448. package/dist/twins/__tests__/integration/e2e.test.d.ts +0 -18
  449. package/dist/twins/__tests__/integration/e2e.test.d.ts.map +0 -1
  450. package/dist/twins/__tests__/integration/e2e.test.js +0 -146
  451. package/dist/twins/__tests__/integration/e2e.test.js.map +0 -1
  452. package/dist/twins/__tests__/integration/health-monitor-integration.test.d.ts +0 -16
  453. package/dist/twins/__tests__/integration/health-monitor-integration.test.d.ts.map +0 -1
  454. package/dist/twins/__tests__/integration/health-monitor-integration.test.js +0 -183
  455. package/dist/twins/__tests__/integration/health-monitor-integration.test.js.map +0 -1
  456. package/dist/twins/__tests__/integration/helpers.d.ts +0 -32
  457. package/dist/twins/__tests__/integration/helpers.d.ts.map +0 -1
  458. package/dist/twins/__tests__/integration/helpers.js +0 -67
  459. package/dist/twins/__tests__/integration/helpers.js.map +0 -1
  460. package/dist/twins/__tests__/integration/lifecycle.test.d.ts +0 -14
  461. package/dist/twins/__tests__/integration/lifecycle.test.d.ts.map +0 -1
  462. package/dist/twins/__tests__/integration/lifecycle.test.js +0 -127
  463. package/dist/twins/__tests__/integration/lifecycle.test.js.map +0 -1
  464. package/dist/twins/__tests__/integration/persistence-integration.test.d.ts +0 -14
  465. package/dist/twins/__tests__/integration/persistence-integration.test.d.ts.map +0 -1
  466. package/dist/twins/__tests__/integration/persistence-integration.test.js +0 -132
  467. package/dist/twins/__tests__/integration/persistence-integration.test.js.map +0 -1
  468. package/dist/twins/__tests__/persistence.test.d.ts +0 -10
  469. package/dist/twins/__tests__/persistence.test.d.ts.map +0 -1
  470. package/dist/twins/__tests__/persistence.test.js +0 -300
  471. package/dist/twins/__tests__/persistence.test.js.map +0 -1
  472. package/dist/twins/__tests__/registry.test.d.ts +0 -7
  473. package/dist/twins/__tests__/registry.test.d.ts.map +0 -1
  474. package/dist/twins/__tests__/registry.test.js +0 -282
  475. package/dist/twins/__tests__/registry.test.js.map +0 -1
  476. package/dist/twins/__tests__/run-state.test.d.ts +0 -9
  477. package/dist/twins/__tests__/run-state.test.d.ts.map +0 -1
  478. package/dist/twins/__tests__/run-state.test.js +0 -112
  479. package/dist/twins/__tests__/run-state.test.js.map +0 -1
  480. package/dist/twins/__tests__/templates-cli.test.d.ts +0 -10
  481. package/dist/twins/__tests__/templates-cli.test.d.ts.map +0 -1
  482. package/dist/twins/__tests__/templates-cli.test.js +0 -187
  483. package/dist/twins/__tests__/templates-cli.test.js.map +0 -1
  484. package/dist/twins/__tests__/templates.test.d.ts +0 -7
  485. package/dist/twins/__tests__/templates.test.d.ts.map +0 -1
  486. package/dist/twins/__tests__/templates.test.js +0 -87
  487. package/dist/twins/__tests__/templates.test.js.map +0 -1
  488. package/dist/twins/__tests__/twins-cli.test.d.ts +0 -11
  489. package/dist/twins/__tests__/twins-cli.test.d.ts.map +0 -1
  490. package/dist/twins/__tests__/twins-cli.test.js +0 -365
  491. package/dist/twins/__tests__/twins-cli.test.js.map +0 -1
@@ -1,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":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAE7D,8EAA8E;AAC9E,8EAA8E;AAC9E,6DAA6D;AAC7D,8EAA8E;AAE9E,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;CACjB,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC;CACxC,CAAC,CAAC,CAAA;AAEH,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAoD,MAAM,sBAAsB,CAAA;AAElG,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAKrD,8EAA8E;AAC9E,8DAA8D;AAC9D,wEAAwE;AACxE,2CAA2C;AAC3C,8EAA8E;AAE9E,IAAI,YAA+D,CAAA;AACnE,IAAI,WAAmB,CAAA;AACvB,IAAI,gBAA0C,CAAA;AAC9C,IAAI,SAAmC,CAAA;AACvC,IAAI,WAKH,CAAA;AAED,8EAA8E;AAC9E,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAEtC,8EAA8E;AAC9E,gEAAgE;AAChE,8EAA8E;AAE9E,UAAU,CAAC,GAAG,EAAE;IACd,YAAY,GAAG,IAAI,GAAG,EAAE,CAAA;IACxB,WAAW,GAAG,EAAE,CAAA;IAChB,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;IACnB,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IAEvD,WAAW,GAAG;QACZ,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAe,EAAE,OAAsC,EAAE,EAAE;YACzF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YACvD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvC,CAAC,CAAC;QACF,YAAY,EAAE,gBAAgB;QAC9B,KAAK,EAAE,SAAS;QAChB,IAAI,OAAO,KAAK,OAAO,WAAW,CAAA,CAAC,CAAC;KACrC,CAAA;IAED,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,WAAoB,CAAC,CAAA;IAC9D,EAAE,CAAC,aAAa,EAAE,CAAA;IAElB,oEAAoE;IACpE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,WAAoB,CAAC,CAAA;IAC9D,WAAW,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAe,EAAE,OAAsC,EAAE,EAAE;QAC5F,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACvD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IACF,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,6DAA6D;AAC7D,8EAA8E;AAE9E,SAAS,SAAS,CAAC,IAAe,EAAE,OAAgC,EAAE;IACpE,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IAC7C,MAAM,KAAK,GAAiB;QAC1B,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,UAAU,EAAE,cAAc;QAC1B,IAAI;KACL,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,CAAC,CAAC,KAAK,CAAC,CAAA;AACpC,CAAC;AAED,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,YAAgC,EAAE;IAClD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,EAAE;QACf,mBAAmB,EAAE,EAAE;QACvB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,EAAE;QACnB,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,EAAE;QACX,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E,SAAS,WAAW;IAClB,OAAO,IAAI,YAAY,CAAC,EAAE,CAAC,CAAA;AAC7B,CAAC;AAED,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E,SAAS,SAAS;IAChB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAsB,CAAA;AACtE,CAAC;AAED,8EAA8E;AAC9E,+DAA+D;AAC/D,8EAA8E;AAE9E,SAAS,iBAAiB,CAAC,OAAe,EAAE,KAAyB;IACnE,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE;QACpE,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAE9E,SAAS,kBAAkB,CAAC,OAAmC;IAC7D,OAAO,2BAA2B,CAAC;QACjC,SAAS,EAAE,EAAe;QAC1B,eAAe,EAAE,EAAqB;QACtC,YAAY,EAAE,EAA0B;QACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,8EAA8E;AAC9E,oEAAoE;AACpE,8EAA8E;AAE9E,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAA;QAChE,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAA;QACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEpF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAC5D,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAA;QAChE,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAA;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAE1F,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAC5D,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QAC9D,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEnH,qEAAqE;QACrE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QACpD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAA;QAC7G,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IAC1G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAA;QAChE,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAA;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAE1F,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAC5D,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QAC9D,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEnH,yDAAyD;QACzD,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QACtD,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,WAAW,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAA;QACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEpF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YAC7C,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QACF,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,WAAW;QACX,WAAW,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC3D,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAA;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAE1F,6BAA6B;QAC7B,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YAC7C,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QACF,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QAC9D,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEnH,4BAA4B;QAC5B,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE5C,yEAAyE;QACzE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAE9E,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YAC7C,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;YACnF,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACnG,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,MAAM,eAAe,GAAmB,EAAE,CAAA;QAC1C,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACtE,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QAClD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YAC7C,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;YACrF,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,MAAM,eAAe,GAAmB,EAAE,CAAA;QAC1C,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACtE,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,eAAe,CAAC,CAAA;QAClF,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC1D,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAA;QACvC,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEpE,gFAAgF;QAChF,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAC1C,yCAAyC;QACzC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAE9E,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YAC7C,SAAS,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,kDAAkD,EAAE,CAAC,CAAA;YACpG,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,MAAM,eAAe,GAAmB,EAAE,CAAA;QAC1C,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACtE,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,cAAc,CAAC,CAAA;QAChF,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;QAC/B,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IAC/F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAA;QACvC,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEpE,oFAAoF;QACpF,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAC5C,sEAAsE;QACtE,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,EAAE,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,uEAAuE;AACvE,8EAA8E;AAE9E,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAEvG,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,mDAAmD;QACnD,MAAM,iBAAiB,GAAG,CAAC,GAAG,WAAW,CAAC;aACvC,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;QAE1D,MAAM,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,CAAC,iBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtD,MAAM,CAAC,iBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtD,MAAM,CAAC,iBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAA;QACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAEpF,8CAA8C;QAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtC,+CAA+C;QAC/C,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAA0C,CAAA;QAC3F,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,+EAA+E;QAC/E,8EAA8E;QAC9E,6CAA6C;QAC7C,wEAAwE;QACxE,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEjD,2EAA2E;QAC3E,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,qEAAqE;AACrE,8EAA8E;AAE9E,QAAQ,CAAC,8DAA8D,EAAE,GAAG,EAAE;IAC5E,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,WAAW;aACR,qBAAqB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;aAC3C,qBAAqB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;aAC3C,qBAAqB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;QAE9C,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAA;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAEtC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAE1D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAEjC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC5D,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC5D,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEzD,eAAe;QACf,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;QACtB,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAA;QAC/C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAE1D,eAAe;QACf,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;QACtB,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAA;QAC/C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAE1D,eAAe;QACf,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;QACtB,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAA;QAC/C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAE1D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;YACtB,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YACtD,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QACjD,CAAC;QAED,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;QAC1C,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;YACtB,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YACtD,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QACjD,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -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