@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,318 +0,0 @@
1
- /**
2
- * Integration and unit tests for scenario integrity verification during pipeline runs.
3
- * Story 44-4: Scenario Integrity Verification During Pipeline Runs.
4
- *
5
- * Tests:
6
- * - AC1: Manifest captured once at run start when scenarioStore configured
7
- * - AC2: verifyIntegrity() called before each tool node
8
- * - AC3: Tampered (modified or deleted) file halts pipeline with scenario:integrity-failed
9
- * - AC4: Unmodified scenarios emit scenario:integrity-passed and executor returns SUCCESS
10
- * - AC5: Integrity check skipped for non-tool nodes
11
- * - AC6: No scenarioStore → no discover(), no integrity events, backward-compatible
12
- * - Unit: verifyIntegrity() delegates to verify()
13
- */
14
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
15
- import { mkdtempSync, rmSync, mkdirSync, writeFileSync, unlinkSync } from 'fs';
16
- import { tmpdir } from 'os';
17
- import { join } from 'path';
18
- import { parseGraph } from '../../graph/parser.js';
19
- import { createGraphExecutor } from '../../graph/executor.js';
20
- import { ScenarioStore } from '../store.js';
21
- import { makeEventSpy, makeMockRegistry, makeTmpDir, cleanDir, } from '../../__tests__/integration/helpers.js';
22
- // ---------------------------------------------------------------------------
23
- // Temp dir helpers
24
- // ---------------------------------------------------------------------------
25
- function createTmpDir() {
26
- return mkdtempSync(join(tmpdir(), 'substrate-integrity-test-'));
27
- }
28
- function setupScenariosDir(projectRoot) {
29
- const scenariosDir = join(projectRoot, '.substrate', 'scenarios');
30
- mkdirSync(scenariosDir, { recursive: true });
31
- return scenariosDir;
32
- }
33
- // ---------------------------------------------------------------------------
34
- // DOT graph fixtures
35
- // ---------------------------------------------------------------------------
36
- /** Minimal graph: start → tool node → exit */
37
- const TOOL_NODE_DOT = `
38
- digraph test_tool_integrity {
39
- graph [goal="Integrity test"]
40
- start [shape=Mdiamond]
41
- tool1 [type=tool, label="Run scenario"]
42
- exit [shape=Msquare]
43
- start -> tool1
44
- tool1 -> exit
45
- }
46
- `;
47
- /** Graph with two sequential tool nodes */
48
- const TWO_TOOL_NODES_DOT = `
49
- digraph test_two_tools {
50
- graph [goal="Two tool nodes"]
51
- start [shape=Mdiamond]
52
- tool1 [type=tool, label="First scenario"]
53
- tool2 [type=tool, label="Second scenario"]
54
- exit [shape=Msquare]
55
- start -> tool1
56
- tool1 -> tool2
57
- tool2 -> exit
58
- }
59
- `;
60
- /** Graph with no tool nodes: start → codergen → exit */
61
- const NO_TOOL_NODE_DOT = `
62
- digraph test_no_tool {
63
- graph [goal="No tool node"]
64
- start [shape=Mdiamond]
65
- check [type=codergen, label="Check"]
66
- exit [shape=Msquare]
67
- start -> check
68
- check -> exit
69
- }
70
- `;
71
- // ---------------------------------------------------------------------------
72
- // Tests
73
- // ---------------------------------------------------------------------------
74
- describe('Scenario Integrity Verification (Story 44-4)', () => {
75
- let tmpDir;
76
- let logsRoot;
77
- beforeEach(async () => {
78
- tmpDir = createTmpDir();
79
- logsRoot = await makeTmpDir();
80
- });
81
- afterEach(async () => {
82
- rmSync(tmpDir, { recursive: true, force: true });
83
- await cleanDir(logsRoot);
84
- vi.restoreAllMocks();
85
- });
86
- // --------------------------------------------------------------------------
87
- // Unit test: verifyIntegrity() delegates to verify()
88
- // --------------------------------------------------------------------------
89
- it('verifyIntegrity() delegates to verify() and returns same result', async () => {
90
- const store = new ScenarioStore();
91
- const scenariosDir = setupScenariosDir(tmpDir);
92
- writeFileSync(join(scenariosDir, 'scenario-login.sh'), 'echo login');
93
- const manifest = await store.discover(tmpDir);
94
- const verifyResult = await store.verify(manifest);
95
- const integrityResult = await store.verifyIntegrity(manifest);
96
- expect(integrityResult).toEqual(verifyResult);
97
- expect(integrityResult.valid).toBe(true);
98
- expect(integrityResult.tampered).toEqual([]);
99
- });
100
- // --------------------------------------------------------------------------
101
- // AC1: Manifest captured at pipeline start
102
- // --------------------------------------------------------------------------
103
- it('AC1: discover() called exactly once at run start when scenarioStore is configured', async () => {
104
- const store = new ScenarioStore();
105
- const discoverSpy = vi.spyOn(store, 'discover');
106
- discoverSpy.mockResolvedValue({ scenarios: [], capturedAt: Date.now() });
107
- const graph = parseGraph(TOOL_NODE_DOT);
108
- const { registry } = makeMockRegistry();
109
- const { bus } = makeEventSpy();
110
- await createGraphExecutor().run(graph, {
111
- runId: 'test-ac1',
112
- logsRoot,
113
- handlerRegistry: registry,
114
- eventBus: bus,
115
- scenarioStore: store,
116
- });
117
- expect(discoverSpy).toHaveBeenCalledTimes(1);
118
- });
119
- // --------------------------------------------------------------------------
120
- // AC6: Backward-compatible — no scenarioStore means no integrity checks
121
- // --------------------------------------------------------------------------
122
- it('AC6: discover() NOT called when no scenarioStore configured', async () => {
123
- const store = new ScenarioStore();
124
- const discoverSpy = vi.spyOn(store, 'discover');
125
- const graph = parseGraph(TOOL_NODE_DOT);
126
- const { registry } = makeMockRegistry();
127
- const { bus, events } = makeEventSpy();
128
- const outcome = await createGraphExecutor().run(graph, {
129
- runId: 'test-ac6',
130
- logsRoot,
131
- handlerRegistry: registry,
132
- eventBus: bus,
133
- // No scenarioStore — backward-compatible
134
- });
135
- expect(discoverSpy).not.toHaveBeenCalled();
136
- expect(outcome.status).toBe('SUCCESS');
137
- const integrityEvents = events.filter((e) => e.event === 'scenario:integrity-passed' || e.event === 'scenario:integrity-failed');
138
- expect(integrityEvents).toHaveLength(0);
139
- });
140
- // --------------------------------------------------------------------------
141
- // AC2: verifyIntegrity() called before each tool node
142
- // --------------------------------------------------------------------------
143
- it('AC2: verifyIntegrity() called once per tool node visit', async () => {
144
- const store = new ScenarioStore();
145
- vi.spyOn(store, 'discover').mockResolvedValue({ scenarios: [], capturedAt: Date.now() });
146
- const verifySpy = vi.spyOn(store, 'verifyIntegrity');
147
- verifySpy.mockResolvedValue({ valid: true, tampered: [] });
148
- const graph = parseGraph(TWO_TOOL_NODES_DOT);
149
- const { registry } = makeMockRegistry();
150
- const { bus } = makeEventSpy();
151
- await createGraphExecutor().run(graph, {
152
- runId: 'test-ac2',
153
- logsRoot,
154
- handlerRegistry: registry,
155
- eventBus: bus,
156
- scenarioStore: store,
157
- });
158
- // Two tool nodes → verifyIntegrity called twice
159
- expect(verifySpy).toHaveBeenCalledTimes(2);
160
- });
161
- // --------------------------------------------------------------------------
162
- // AC3: Tampered scenario file halts pipeline with event
163
- // --------------------------------------------------------------------------
164
- it('AC3: modified scenario file → status FAIL + scenario:integrity-failed event', async () => {
165
- const store = new ScenarioStore();
166
- const scenariosDir = setupScenariosDir(tmpDir);
167
- const scenarioFile = join(scenariosDir, 'scenario-login.sh');
168
- writeFileSync(scenarioFile, 'echo login');
169
- // Capture manifest before modification
170
- const manifest = await store.discover(tmpDir);
171
- // Modify the file to simulate tampering between iterations
172
- writeFileSync(scenarioFile, 'echo TAMPERED');
173
- // Mock discover() to return the original (pre-tamper) manifest
174
- vi.spyOn(store, 'discover').mockResolvedValue(manifest);
175
- const graph = parseGraph(TOOL_NODE_DOT);
176
- const { registry } = makeMockRegistry();
177
- const { bus, events } = makeEventSpy();
178
- const outcome = await createGraphExecutor().run(graph, {
179
- runId: 'test-ac3-modify',
180
- logsRoot,
181
- handlerRegistry: registry,
182
- eventBus: bus,
183
- scenarioStore: store,
184
- });
185
- expect(outcome.status).toBe('FAIL');
186
- expect(outcome.failureReason).toContain('Scenario integrity violation');
187
- expect(outcome.failureReason).toContain('scenario-login.sh');
188
- const failedEvents = events.filter((e) => e.event === 'scenario:integrity-failed');
189
- expect(failedEvents).toHaveLength(1);
190
- const payload = failedEvents[0].payload;
191
- expect(payload.runId).toBe('test-ac3-modify');
192
- expect(payload.nodeId).toBe('tool1');
193
- expect(payload.tampered).toContain('scenario-login.sh');
194
- });
195
- it('AC3: deleted scenario file → status FAIL + scenario:integrity-failed event', async () => {
196
- const store = new ScenarioStore();
197
- const scenariosDir = setupScenariosDir(tmpDir);
198
- const scenarioFile = join(scenariosDir, 'scenario-deploy.sh');
199
- writeFileSync(scenarioFile, 'echo deploy');
200
- // Capture manifest before deletion
201
- const manifest = await store.discover(tmpDir);
202
- // Delete the file to simulate tampering
203
- unlinkSync(scenarioFile);
204
- // Mock discover() to return the original (pre-delete) manifest
205
- vi.spyOn(store, 'discover').mockResolvedValue(manifest);
206
- const graph = parseGraph(TOOL_NODE_DOT);
207
- const { registry } = makeMockRegistry();
208
- const { bus, events } = makeEventSpy();
209
- const outcome = await createGraphExecutor().run(graph, {
210
- runId: 'test-ac3-delete',
211
- logsRoot,
212
- handlerRegistry: registry,
213
- eventBus: bus,
214
- scenarioStore: store,
215
- });
216
- expect(outcome.status).toBe('FAIL');
217
- expect(outcome.failureReason).toContain('scenario-deploy.sh');
218
- const failedEvents = events.filter((e) => e.event === 'scenario:integrity-failed');
219
- expect(failedEvents).toHaveLength(1);
220
- const payload = failedEvents[0].payload;
221
- expect(payload.tampered).toContain('scenario-deploy.sh');
222
- });
223
- // --------------------------------------------------------------------------
224
- // AC4: Unmodified scenarios emit pass event and proceed
225
- // --------------------------------------------------------------------------
226
- it('AC4: unmodified scenarios → scenario:integrity-passed event + SUCCESS outcome', async () => {
227
- const store = new ScenarioStore();
228
- const scenariosDir = setupScenariosDir(tmpDir);
229
- writeFileSync(join(scenariosDir, 'scenario-login.sh'), 'echo login');
230
- // Capture the real manifest (files unmodified)
231
- const realManifest = await store.discover(tmpDir);
232
- vi.spyOn(store, 'discover').mockResolvedValue(realManifest);
233
- const graph = parseGraph(TOOL_NODE_DOT);
234
- const { registry } = makeMockRegistry();
235
- const { bus, events } = makeEventSpy();
236
- const outcome = await createGraphExecutor().run(graph, {
237
- runId: 'test-ac4',
238
- logsRoot,
239
- handlerRegistry: registry,
240
- eventBus: bus,
241
- scenarioStore: store,
242
- });
243
- expect(outcome.status).toBe('SUCCESS');
244
- const passedEvents = events.filter((e) => e.event === 'scenario:integrity-passed');
245
- expect(passedEvents).toHaveLength(1);
246
- const payload = passedEvents[0].payload;
247
- expect(payload.runId).toBe('test-ac4');
248
- expect(payload.nodeId).toBe('tool1');
249
- expect(payload.scenarioCount).toBe(1);
250
- });
251
- // --------------------------------------------------------------------------
252
- // AC5: Integrity check skipped for non-tool nodes
253
- // --------------------------------------------------------------------------
254
- it('AC5: verifyIntegrity() NOT called when graph has no tool nodes', async () => {
255
- const store = new ScenarioStore();
256
- vi.spyOn(store, 'discover').mockResolvedValue({ scenarios: [], capturedAt: Date.now() });
257
- const verifySpy = vi.spyOn(store, 'verifyIntegrity');
258
- const graph = parseGraph(NO_TOOL_NODE_DOT);
259
- const { registry } = makeMockRegistry();
260
- const { bus } = makeEventSpy();
261
- const outcome = await createGraphExecutor().run(graph, {
262
- runId: 'test-ac5',
263
- logsRoot,
264
- handlerRegistry: registry,
265
- eventBus: bus,
266
- scenarioStore: store,
267
- });
268
- expect(outcome.status).toBe('SUCCESS');
269
- expect(verifySpy).not.toHaveBeenCalled();
270
- });
271
- // --------------------------------------------------------------------------
272
- // Additional: graph:node-started not emitted when integrity check fails
273
- // --------------------------------------------------------------------------
274
- it('graph:node-started is NOT emitted for tool node when integrity check fails', async () => {
275
- const store = new ScenarioStore();
276
- const scenariosDir = setupScenariosDir(tmpDir);
277
- const scenarioFile = join(scenariosDir, 'scenario-login.sh');
278
- writeFileSync(scenarioFile, 'original content');
279
- const manifest = await store.discover(tmpDir);
280
- writeFileSync(scenarioFile, 'tampered content');
281
- vi.spyOn(store, 'discover').mockResolvedValue(manifest);
282
- const graph = parseGraph(TOOL_NODE_DOT);
283
- const { registry } = makeMockRegistry();
284
- const { bus, events } = makeEventSpy();
285
- const outcome = await createGraphExecutor().run(graph, {
286
- runId: 'test-no-node-started',
287
- logsRoot,
288
- handlerRegistry: registry,
289
- eventBus: bus,
290
- scenarioStore: store,
291
- });
292
- expect(outcome.status).toBe('FAIL');
293
- // graph:node-started must NOT be emitted for the tool node
294
- const nodeStartedForTool = events.filter((e) => e.event === 'graph:node-started' &&
295
- e.payload.nodeId === 'tool1');
296
- expect(nodeStartedForTool).toHaveLength(0);
297
- });
298
- // --------------------------------------------------------------------------
299
- // Additional: scenario:integrity-failed not emitted when files unmodified
300
- // --------------------------------------------------------------------------
301
- it('scenario:integrity-failed is NOT emitted when files are unmodified', async () => {
302
- const store = new ScenarioStore();
303
- vi.spyOn(store, 'discover').mockResolvedValue({ scenarios: [], capturedAt: Date.now() });
304
- const graph = parseGraph(TOOL_NODE_DOT);
305
- const { registry } = makeMockRegistry();
306
- const { bus, events } = makeEventSpy();
307
- await createGraphExecutor().run(graph, {
308
- runId: 'test-no-fail-event',
309
- logsRoot,
310
- handlerRegistry: registry,
311
- eventBus: bus,
312
- scenarioStore: store,
313
- });
314
- const failedEvents = events.filter((e) => e.event === 'scenario:integrity-failed');
315
- expect(failedEvents).toHaveLength(0);
316
- });
317
- });
318
- //# sourceMappingURL=integrity-pipeline.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integrity-pipeline.test.js","sourceRoot":"","sources":["../../../src/scenarios/__tests__/integrity-pipeline.test.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Unit tests for ScenarioRunner twin integration (story 47-3).
3
- *
4
- * Tests cover:
5
- * (a) startTwins called with correct names before scenario execution
6
- * (b) env vars from startTwins are injected into subprocess environment
7
- * (c) stopTwins called after all scenarios pass
8
- * (d) stopTwins called even when a scenario exits with non-zero code
9
- * (e) twin startup failure returns error ScenarioRunResult without executing any scenarios and without calling stopTwins
10
- * (f) manifest with no twins field triggers no coordinator calls
11
- */
12
- export {};
13
- //# sourceMappingURL=runner-twins.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner-twins.test.d.ts","sourceRoot":"","sources":["../../../src/scenarios/__tests__/runner-twins.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -1,205 +0,0 @@
1
- /**
2
- * Unit tests for ScenarioRunner twin integration (story 47-3).
3
- *
4
- * Tests cover:
5
- * (a) startTwins called with correct names before scenario execution
6
- * (b) env vars from startTwins are injected into subprocess environment
7
- * (c) stopTwins called after all scenarios pass
8
- * (d) stopTwins called even when a scenario exits with non-zero code
9
- * (e) twin startup failure returns error ScenarioRunResult without executing any scenarios and without calling stopTwins
10
- * (f) manifest with no twins field triggers no coordinator calls
11
- */
12
- import crypto from 'crypto';
13
- import fs from 'fs';
14
- import os from 'os';
15
- import path from 'path';
16
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
17
- import { createScenarioRunner } from '../runner.js';
18
- // ---------------------------------------------------------------------------
19
- // Helpers
20
- // ---------------------------------------------------------------------------
21
- let tmpDir;
22
- function createTmpScript(content) {
23
- const scriptPath = path.join(tmpDir, `scenario-${crypto.randomUUID()}.sh`);
24
- fs.writeFileSync(scriptPath, content);
25
- fs.chmodSync(scriptPath, 0o755);
26
- const checksum = crypto.createHash('sha256').update(fs.readFileSync(scriptPath)).digest('hex');
27
- return { scriptPath, checksum };
28
- }
29
- function makeMockCoordinator(overrides) {
30
- return {
31
- startTwins: vi.fn().mockResolvedValue({}),
32
- stopTwins: vi.fn().mockResolvedValue(undefined),
33
- ...overrides,
34
- };
35
- }
36
- // ---------------------------------------------------------------------------
37
- // Setup / Teardown
38
- // ---------------------------------------------------------------------------
39
- beforeEach(() => {
40
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'runner-twins-'));
41
- });
42
- afterEach(() => {
43
- fs.rmSync(tmpDir, { recursive: true, force: true });
44
- });
45
- // ---------------------------------------------------------------------------
46
- // Tests
47
- // ---------------------------------------------------------------------------
48
- describe('ScenarioRunner — twin integration', () => {
49
- // (a) startTwins is called with correct twin names before scenario execution
50
- it('(a) calls startTwins with the correct twin names before any scenario runs', async () => {
51
- const callOrder = [];
52
- const { scriptPath, checksum } = createTmpScript('#!/bin/sh\necho "{}"\nexit 0\n');
53
- const scenarioName = path.basename(scriptPath);
54
- const coordinator = {
55
- startTwins: vi.fn().mockImplementation(async (names) => {
56
- callOrder.push('startTwins:' + names.join(','));
57
- return {};
58
- }),
59
- stopTwins: vi.fn().mockImplementation(async () => {
60
- callOrder.push('stopTwins');
61
- }),
62
- };
63
- const manifest = {
64
- scenarios: [{ name: scenarioName, path: scriptPath, checksum }],
65
- capturedAt: Date.now(),
66
- twins: ['stripe', 'sendgrid'],
67
- };
68
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
69
- const result = await runner.run(manifest, tmpDir);
70
- expect(coordinator.startTwins).toHaveBeenCalledWith(['stripe', 'sendgrid']);
71
- expect(callOrder[0]).toBe('startTwins:stripe,sendgrid');
72
- // startTwins must appear before stopTwins
73
- expect(callOrder.indexOf('startTwins:stripe,sendgrid')).toBeLessThan(callOrder.indexOf('stopTwins'));
74
- expect(result.summary.total).toBe(1);
75
- });
76
- // (b) env vars from startTwins are present in subprocess environment
77
- it('(b) injects env vars from startTwins into scenario subprocess environment', async () => {
78
- // Script prints an env var as JSON
79
- const { scriptPath, checksum } = createTmpScript('#!/bin/sh\nprintf \'{"TWIN_INJECTED":"%s"}\' "$TWIN_URL"\n');
80
- const scenarioName = path.basename(scriptPath);
81
- const coordinator = makeMockCoordinator({
82
- startTwins: vi.fn().mockResolvedValue({ TWIN_URL: 'http://localhost:9999' }),
83
- });
84
- const manifest = {
85
- scenarios: [{ name: scenarioName, path: scriptPath, checksum }],
86
- capturedAt: Date.now(),
87
- twins: ['twin-service'],
88
- };
89
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
90
- const result = await runner.run(manifest, tmpDir);
91
- expect(result.scenarios).toHaveLength(1);
92
- const scenarioResult = result.scenarios[0];
93
- expect(scenarioResult.status).toBe('pass');
94
- expect(scenarioResult.parsedOutput).toEqual({ TWIN_INJECTED: 'http://localhost:9999' });
95
- });
96
- // (c) stopTwins is called after all scenarios pass
97
- it('(c) calls stopTwins exactly once after all scenarios pass', async () => {
98
- const { scriptPath, checksum } = createTmpScript('#!/bin/sh\necho "{}"\nexit 0\n');
99
- const scenarioName = path.basename(scriptPath);
100
- const coordinator = makeMockCoordinator();
101
- const manifest = {
102
- scenarios: [{ name: scenarioName, path: scriptPath, checksum }],
103
- capturedAt: Date.now(),
104
- twins: ['my-twin'],
105
- };
106
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
107
- const result = await runner.run(manifest, tmpDir);
108
- expect(result.scenarios[0].status).toBe('pass');
109
- expect(coordinator.stopTwins).toHaveBeenCalledTimes(1);
110
- });
111
- // (d) stopTwins is called even when a scenario exits with non-zero code
112
- it('(d) calls stopTwins exactly once even when a scenario fails', async () => {
113
- const { scriptPath, checksum } = createTmpScript('#!/bin/sh\nexit 1\n');
114
- const scenarioName = path.basename(scriptPath);
115
- const coordinator = makeMockCoordinator();
116
- const manifest = {
117
- scenarios: [{ name: scenarioName, path: scriptPath, checksum }],
118
- capturedAt: Date.now(),
119
- twins: ['my-twin'],
120
- };
121
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
122
- const result = await runner.run(manifest, tmpDir);
123
- expect(result.scenarios[0].status).toBe('fail');
124
- // stopTwins must be called regardless of scenario outcome
125
- expect(coordinator.stopTwins).toHaveBeenCalledTimes(1);
126
- });
127
- // (e) startup failure: no scripts run, all results are fail, stopTwins not called
128
- it('(e) returns error ScenarioRunResult on startup failure without running scenarios or calling stopTwins', async () => {
129
- const { scriptPath, checksum } = createTmpScript('#!/bin/sh\necho "{}"\nexit 0\n');
130
- const scenarioName = path.basename(scriptPath);
131
- const coordinator = {
132
- startTwins: vi.fn().mockRejectedValue(new Error('Docker not found — twins require Docker')),
133
- stopTwins: vi.fn(),
134
- };
135
- const manifest = {
136
- scenarios: [
137
- { name: scenarioName, path: scriptPath, checksum },
138
- { name: 'another.sh', path: scriptPath, checksum },
139
- ],
140
- capturedAt: Date.now(),
141
- twins: ['stripe'],
142
- };
143
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
144
- const result = await runner.run(manifest, tmpDir);
145
- // All scenarios should be failed
146
- expect(result.summary.failed).toBe(2);
147
- expect(result.summary.passed).toBe(0);
148
- expect(result.scenarios).toHaveLength(2);
149
- for (const s of result.scenarios) {
150
- expect(s.status).toBe('fail');
151
- expect(s.exitCode).toBe(-1);
152
- expect(s.stderr).toContain('Docker not found');
153
- }
154
- // stopTwins must NOT be called (nothing was started)
155
- expect(coordinator.stopTwins).not.toHaveBeenCalled();
156
- });
157
- // (f) no twins field — no coordinator calls, run completes normally
158
- it('(f) does not call coordinator methods when manifest has no twins field', async () => {
159
- const { scriptPath, checksum } = createTmpScript('#!/bin/sh\necho "{}"\nexit 0\n');
160
- const scenarioName = path.basename(scriptPath);
161
- const coordinator = makeMockCoordinator();
162
- // No twins field at all
163
- const manifest = {
164
- scenarios: [{ name: scenarioName, path: scriptPath, checksum }],
165
- capturedAt: Date.now(),
166
- };
167
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
168
- const result = await runner.run(manifest, tmpDir);
169
- expect(coordinator.startTwins).not.toHaveBeenCalled();
170
- expect(coordinator.stopTwins).not.toHaveBeenCalled();
171
- expect(result.summary.total).toBe(1);
172
- expect(result.scenarios[0].status).toBe('pass');
173
- });
174
- it('(f) does not call coordinator methods when manifest has twins: []', async () => {
175
- const { scriptPath, checksum } = createTmpScript('#!/bin/sh\necho "{}"\nexit 0\n');
176
- const scenarioName = path.basename(scriptPath);
177
- const coordinator = makeMockCoordinator();
178
- const manifest = {
179
- scenarios: [{ name: scenarioName, path: scriptPath, checksum }],
180
- capturedAt: Date.now(),
181
- twins: [],
182
- };
183
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
184
- const result = await runner.run(manifest, tmpDir);
185
- expect(coordinator.startTwins).not.toHaveBeenCalled();
186
- expect(coordinator.stopTwins).not.toHaveBeenCalled();
187
- expect(result.summary.total).toBe(1);
188
- });
189
- it('(f) does not call coordinator methods when no twinCoordinator is provided', async () => {
190
- const { scriptPath, checksum } = createTmpScript('#!/bin/sh\necho "{}"\nexit 0\n');
191
- const scenarioName = path.basename(scriptPath);
192
- const manifest = {
193
- scenarios: [{ name: scenarioName, path: scriptPath, checksum }],
194
- capturedAt: Date.now(),
195
- twins: ['stripe'],
196
- };
197
- // No twinCoordinator in options
198
- const runner = createScenarioRunner();
199
- const result = await runner.run(manifest, tmpDir);
200
- // Should complete normally using existing code path
201
- expect(result.summary.total).toBe(1);
202
- expect(result.scenarios[0].status).toBe('pass');
203
- });
204
- });
205
- //# sourceMappingURL=runner-twins.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner-twins.test.js","sourceRoot":"","sources":["../../../src/scenarios/__tests__/runner-twins.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Unit tests for the satisfaction scorer (story 44-5, 46-1).
3
- *
4
- * Covers:
5
- * AC3 — 3/4 pass → score 0.75, passes false (below 0.8 default threshold)
6
- * AC4 — 0/2 pass → score 0.0, passes false, status SUCCESS
7
- * AC7 — computeSatisfactionScore exported and accepts optional threshold
8
- * AC1–AC7 (story 46-1) — createSatisfactionScorer with weighted scoring + breakdown
9
- */
10
- export {};
11
- //# sourceMappingURL=scorer.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scorer.test.d.ts","sourceRoot":"","sources":["../../../src/scenarios/__tests__/scorer.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}