@substrate-ai/factory 0.20.1 → 0.20.3

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