@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,146 +0,0 @@
1
- /**
2
- * End-to-end assembly tests for Epic 47 — Digital Twin Foundation.
3
- *
4
- * Assembles all Epic 47 components in a single test environment:
5
- * - TwinRegistry (in-memory, mock coordinator)
6
- * - TwinPersistenceCoordinator → MemoryDatabaseAdapter
7
- * - TwinHealthMonitor (no real health URL — no timers fired)
8
- * - ScenarioRunner with injected twinCoordinator and twinHealthMonitor
9
- *
10
- * Verifies:
11
- * 1. Full pipeline — scenario passes, twin:stopped persisted to DB
12
- * 2. Full pipeline — scenario fails, stop still called
13
- * 3. No twins in manifest — no coordinator methods called
14
- *
15
- * Story 47-8, Task 5 (AC6).
16
- */
17
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
18
- import { createDatabaseAdapter, TypedEventBusImpl } from '@substrate-ai/core';
19
- import { factorySchema } from '../../../persistence/factory-schema.js';
20
- import { createTwinPersistenceCoordinator, getTwinRunsForRun } from '../../persistence.js';
21
- import { createTwinHealthMonitor } from '../../health-monitor.js';
22
- import { createScenarioRunner } from '../../../scenarios/runner.js';
23
- import { makeMockTwinManager, makeTmpScenario } from './helpers.js';
24
- // ---------------------------------------------------------------------------
25
- // Helpers
26
- // ---------------------------------------------------------------------------
27
- /** Flush async event-bus handlers by yielding to the macrotask queue. */
28
- const nextTick = () => new Promise((resolve) => setTimeout(resolve, 0));
29
- /** A TwinDefinition without a healthcheck URL — prevents health monitor from scheduling polls. */
30
- function makeLocalstackNoHealthcheck() {
31
- return {
32
- name: 'localstack',
33
- image: 'localstack/localstack:latest',
34
- ports: [{ host: 4566, container: 4566 }],
35
- environment: { SERVICES: 's3' },
36
- };
37
- }
38
- // ---------------------------------------------------------------------------
39
- // Setup / Teardown
40
- // ---------------------------------------------------------------------------
41
- let adapter;
42
- let eventBus;
43
- let cleanupFn = null;
44
- const TEST_RUN_ID = 'e2e-run-001';
45
- beforeEach(async () => {
46
- adapter = createDatabaseAdapter({ backend: 'memory' });
47
- await factorySchema(adapter);
48
- eventBus = new TypedEventBusImpl();
49
- createTwinPersistenceCoordinator(adapter, eventBus);
50
- cleanupFn = null;
51
- });
52
- afterEach(() => {
53
- cleanupFn?.();
54
- cleanupFn = null;
55
- });
56
- // ---------------------------------------------------------------------------
57
- // Tests
58
- // ---------------------------------------------------------------------------
59
- describe('e2e assembly — all Epic 47 components', () => {
60
- it('Test 1 — full pipeline, scenario passes, twin:stopped persisted to DB', async () => {
61
- const mockManager = makeMockTwinManager();
62
- const coordinator = {
63
- startTwins: vi.fn().mockImplementation(async () => {
64
- await mockManager.start([]);
65
- // Emit twin:started so TwinPersistenceCoordinator can insert the run record
66
- eventBus.emit('twin:started', {
67
- twinName: 'localstack',
68
- ports: [{ host: 4566, container: 4566 }],
69
- healthStatus: 'healthy',
70
- runId: TEST_RUN_ID,
71
- });
72
- return { LOCALSTACK_URL: 'http://localhost:4566' };
73
- }),
74
- stopTwins: vi.fn().mockImplementation(async () => {
75
- await mockManager.stop();
76
- }),
77
- };
78
- // Real health monitor with no health URL — no intervals scheduled
79
- const healthMonitor = createTwinHealthMonitor(eventBus, { monitorIntervalMs: 60000 });
80
- healthMonitor.start([makeLocalstackNoHealthcheck()]);
81
- const runner = createScenarioRunner({
82
- twinCoordinator: coordinator,
83
- twinHealthMonitor: healthMonitor,
84
- });
85
- const { manifest, cleanup } = makeTmpScenario(['localstack'], 0);
86
- cleanupFn = cleanup;
87
- const result = await runner.run(manifest, process.cwd());
88
- expect(result.summary.passed).toBe(1);
89
- // Wait for insertTwinRun to complete (fired by twin:started during startTwins)
90
- await nextTick();
91
- // Manually emit twin:stopped (simulating what a real TwinManager.stop() would emit)
92
- eventBus.emit('twin:stopped', { twinName: 'localstack' });
93
- await nextTick();
94
- const summaries = await getTwinRunsForRun(adapter, TEST_RUN_ID);
95
- expect(summaries).toHaveLength(1);
96
- expect(summaries[0].status).toBe('stopped');
97
- healthMonitor.stop();
98
- });
99
- it('Test 2 — full pipeline, scenario fails, stopTwins still called once', async () => {
100
- const mockManager = makeMockTwinManager();
101
- const coordinator = {
102
- startTwins: vi.fn().mockImplementation(async () => {
103
- await mockManager.start([]);
104
- return {};
105
- }),
106
- stopTwins: vi.fn().mockImplementation(async () => {
107
- await mockManager.stop();
108
- }),
109
- };
110
- const healthMonitor = createTwinHealthMonitor(eventBus, { monitorIntervalMs: 60000 });
111
- healthMonitor.start([makeLocalstackNoHealthcheck()]);
112
- const runner = createScenarioRunner({
113
- twinCoordinator: coordinator,
114
- twinHealthMonitor: healthMonitor,
115
- });
116
- const { manifest, cleanup } = makeTmpScenario(['localstack'], 1);
117
- cleanupFn = cleanup;
118
- const result = await runner.run(manifest, process.cwd());
119
- expect(result.summary.failed).toBe(1);
120
- expect(mockManager.stop).toHaveBeenCalledTimes(1);
121
- healthMonitor.stop();
122
- });
123
- it('Test 3 — no twins in manifest, no coordinator methods called', async () => {
124
- const mockManager = makeMockTwinManager();
125
- const coordinator = {
126
- startTwins: vi.fn().mockResolvedValue({}),
127
- stopTwins: vi.fn().mockResolvedValue(undefined),
128
- };
129
- const healthMonitor = createTwinHealthMonitor(eventBus, { monitorIntervalMs: 60000 });
130
- const runner = createScenarioRunner({
131
- twinCoordinator: coordinator,
132
- twinHealthMonitor: healthMonitor,
133
- });
134
- // Manifest with no twins field
135
- const { manifest, cleanup } = makeTmpScenario(undefined, 0);
136
- cleanupFn = cleanup;
137
- const result = await runner.run(manifest, process.cwd());
138
- expect(result.summary.total).toBe(1);
139
- expect(mockManager.start).not.toHaveBeenCalled();
140
- expect(mockManager.stop).not.toHaveBeenCalled();
141
- expect(coordinator.startTwins).not.toHaveBeenCalled();
142
- expect(coordinator.stopTwins).not.toHaveBeenCalled();
143
- healthMonitor.stop();
144
- });
145
- });
146
- //# sourceMappingURL=e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"e2e.test.js","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Integration tests for TwinHealthMonitor with ScenarioRunner health gate.
3
- *
4
- * Verifies:
5
- * 1. Unhealthy twin aborts ScenarioRunner before execution
6
- * 2. Healthy twin allows runner to proceed
7
- * 3. 3 consecutive failures yield twin:health-failed, polling stops
8
- * 4. Success-then-fail-then-recover: status returns to healthy, no health-failed emitted
9
- * 5. Polling stops after hard failure (fetch called exactly 3 times, not 4)
10
- *
11
- * Uses vi.useFakeTimers() for all tests to control health check polling intervals.
12
- *
13
- * Story 47-8, Task 3 (AC2, AC3).
14
- */
15
- export {};
16
- //# sourceMappingURL=health-monitor-integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health-monitor-integration.test.d.ts","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/health-monitor-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -1,183 +0,0 @@
1
- /**
2
- * Integration tests for TwinHealthMonitor with ScenarioRunner health gate.
3
- *
4
- * Verifies:
5
- * 1. Unhealthy twin aborts ScenarioRunner before execution
6
- * 2. Healthy twin allows runner to proceed
7
- * 3. 3 consecutive failures yield twin:health-failed, polling stops
8
- * 4. Success-then-fail-then-recover: status returns to healthy, no health-failed emitted
9
- * 5. Polling stops after hard failure (fetch called exactly 3 times, not 4)
10
- *
11
- * Uses vi.useFakeTimers() for all tests to control health check polling intervals.
12
- *
13
- * Story 47-8, Task 3 (AC2, AC3).
14
- */
15
- import fs from 'node:fs';
16
- import os from 'node:os';
17
- import path from 'node:path';
18
- import crypto from 'node:crypto';
19
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
20
- import { createTwinHealthMonitor } from '../../health-monitor.js';
21
- import { createScenarioRunner } from '../../../scenarios/runner.js';
22
- import { makeLocalstackTwinDef, makeTmpScenario } from './helpers.js';
23
- // ---------------------------------------------------------------------------
24
- // Setup / Teardown
25
- // ---------------------------------------------------------------------------
26
- let cleanupFn = null;
27
- beforeEach(() => {
28
- vi.useFakeTimers();
29
- cleanupFn = null;
30
- });
31
- afterEach(() => {
32
- vi.useRealTimers();
33
- vi.unstubAllGlobals();
34
- cleanupFn?.();
35
- cleanupFn = null;
36
- });
37
- // ---------------------------------------------------------------------------
38
- // Helpers
39
- // ---------------------------------------------------------------------------
40
- function makeSpyEventBus() {
41
- return { emit: vi.fn(), on: vi.fn(), off: vi.fn() };
42
- }
43
- function makePassingScript(tmpDir) {
44
- const scriptPath = path.join(tmpDir, `scenario-${crypto.randomUUID()}.sh`);
45
- fs.writeFileSync(scriptPath, '#!/bin/sh\nexit 0\n');
46
- fs.chmodSync(scriptPath, 0o755);
47
- const checksum = crypto.createHash('sha256').update(fs.readFileSync(scriptPath)).digest('hex');
48
- return { name: path.basename(scriptPath), path: scriptPath, checksum };
49
- }
50
- // ---------------------------------------------------------------------------
51
- // Tests
52
- // ---------------------------------------------------------------------------
53
- describe('health monitor integration — ScenarioRunner health gate', () => {
54
- it('Test 1 — unhealthy twin aborts ScenarioRunner before any scenario executes', async () => {
55
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tw-integ-hm-'));
56
- cleanupFn = () => fs.rmSync(tmpDir, { recursive: true, force: true });
57
- const mockMonitor = {
58
- start: vi.fn(),
59
- stop: vi.fn(),
60
- getStatus: vi.fn().mockReturnValue({ localstack: 'unhealthy' }),
61
- };
62
- const scenario = makePassingScript(tmpDir);
63
- const manifest = {
64
- scenarios: [scenario],
65
- capturedAt: Date.now(),
66
- twins: ['localstack'],
67
- };
68
- const runner = createScenarioRunner({ twinHealthMonitor: mockMonitor });
69
- const result = await runner.run(manifest, tmpDir);
70
- expect(result.summary.failed).toBeGreaterThan(0);
71
- expect(result.summary.passed).toBe(0);
72
- expect(result.scenarios[0].stderr).toContain("Twin 'localstack' is unhealthy");
73
- });
74
- it('Test 2 — healthy twin allows runner to proceed normally', async () => {
75
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tw-integ-hm-'));
76
- cleanupFn = () => fs.rmSync(tmpDir, { recursive: true, force: true });
77
- const mockMonitor = {
78
- start: vi.fn(),
79
- stop: vi.fn(),
80
- getStatus: vi.fn().mockReturnValue({ localstack: 'healthy' }),
81
- };
82
- const scenario = makePassingScript(tmpDir);
83
- const manifest = {
84
- scenarios: [scenario],
85
- capturedAt: Date.now(),
86
- twins: ['localstack'],
87
- };
88
- const runner = createScenarioRunner({ twinHealthMonitor: mockMonitor });
89
- const result = await runner.run(manifest, tmpDir);
90
- expect(result.summary.passed).toBeGreaterThan(0);
91
- expect(result.summary.failed).toBe(0);
92
- });
93
- });
94
- describe('health monitor integration — polling and failure detection', () => {
95
- it('Test 3 — 3 consecutive failures emit twin:health-failed and mark twin unhealthy', async () => {
96
- const mockFetch = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));
97
- vi.stubGlobal('fetch', mockFetch);
98
- const eventBus = makeSpyEventBus();
99
- const monitor = createTwinHealthMonitor(eventBus, {
100
- monitorIntervalMs: 1000,
101
- maxConsecutiveFailures: 3,
102
- });
103
- monitor.start([makeLocalstackTwinDef()]);
104
- await vi.advanceTimersByTimeAsync(3100);
105
- expect(eventBus.emit).toHaveBeenCalledWith('twin:health-failed', expect.objectContaining({ twinName: 'localstack' }));
106
- expect(monitor.getStatus()['localstack']).toBe('unhealthy');
107
- monitor.stop();
108
- });
109
- it('Test 4 — success-then-fail-then-recover: status returns healthy, no health-failed emitted', async () => {
110
- let callCount = 0;
111
- const mockFetch = vi.fn().mockImplementation(() => {
112
- callCount++;
113
- if (callCount === 1) {
114
- return Promise.reject(new Error('ECONNREFUSED'));
115
- }
116
- return Promise.resolve({ ok: true });
117
- });
118
- vi.stubGlobal('fetch', mockFetch);
119
- const eventBus = makeSpyEventBus();
120
- const monitor = createTwinHealthMonitor(eventBus, {
121
- monitorIntervalMs: 1000,
122
- maxConsecutiveFailures: 3,
123
- });
124
- monitor.start([makeLocalstackTwinDef()]);
125
- // First poll (t=1000): fail → warning. Second poll (t=2000): success → healthy
126
- await vi.advanceTimersByTimeAsync(2100);
127
- const emitCalls = eventBus.emit.mock.calls;
128
- const failedCalls = emitCalls.filter((args) => args[0] === 'twin:health-failed');
129
- expect(failedCalls).toHaveLength(0);
130
- expect(monitor.getStatus()['localstack']).toBe('healthy');
131
- monitor.stop();
132
- });
133
- it('Test 5 — polling stops after hard failure — fetch called exactly 3 times, not 4', async () => {
134
- const mockFetch = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));
135
- vi.stubGlobal('fetch', mockFetch);
136
- const eventBus = makeSpyEventBus();
137
- const monitor = createTwinHealthMonitor(eventBus, {
138
- monitorIntervalMs: 1000,
139
- maxConsecutiveFailures: 3,
140
- });
141
- monitor.start([makeLocalstackTwinDef()]);
142
- // Advance 4 intervals — polling stops after 3rd failure
143
- await vi.advanceTimersByTimeAsync(4000);
144
- expect(mockFetch).toHaveBeenCalledTimes(3);
145
- monitor.stop();
146
- });
147
- });
148
- describe('health monitor integration — mid-run crash detection (AC3)', () => {
149
- it('AC3 — 1 success + 3 failures: 2 warnings, 1 health-failed, status unhealthy, no further polls', async () => {
150
- let callCount = 0;
151
- const mockFetch = vi.fn().mockImplementation(() => {
152
- callCount++;
153
- if (callCount === 1) {
154
- return Promise.resolve({ ok: true });
155
- }
156
- return Promise.reject(new Error('ECONNREFUSED'));
157
- });
158
- vi.stubGlobal('fetch', mockFetch);
159
- const eventBus = makeSpyEventBus();
160
- const monitor = createTwinHealthMonitor(eventBus, {
161
- monitorIntervalMs: 1000,
162
- maxConsecutiveFailures: 3,
163
- });
164
- const { manifest, cleanup } = makeTmpScenario(['localstack']);
165
- cleanupFn = cleanup;
166
- monitor.start([makeLocalstackTwinDef()]);
167
- // 4 polls: t=1000 success, t=2000 fail(1), t=3000 fail(2), t=4000 fail(3)=health-failed
168
- await vi.advanceTimersByTimeAsync(4100);
169
- const emitCalls = eventBus.emit.mock.calls;
170
- const warningCalls = emitCalls.filter((args) => args[0] === 'twin:health-warning');
171
- const failedCalls = emitCalls.filter((args) => args[0] === 'twin:health-failed');
172
- expect(warningCalls).toHaveLength(2);
173
- expect(failedCalls).toHaveLength(1);
174
- expect(monitor.getStatus()['localstack']).toBe('unhealthy');
175
- // Advance more — no further polls should fire
176
- await vi.advanceTimersByTimeAsync(2000);
177
- // Still 3 failures + 1 success = 4 calls total
178
- expect(mockFetch).toHaveBeenCalledTimes(4);
179
- monitor.stop();
180
- void manifest; // suppress unused variable warning
181
- });
182
- });
183
- //# sourceMappingURL=health-monitor-integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health-monitor-integration.test.js","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/health-monitor-integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Shared test helpers for Epic 47 integration tests.
3
- *
4
- * All factory functions create fresh instances so each test gets independent mocks.
5
- * No vi.fn() calls at module level — all stubs are created inside factory functions.
6
- *
7
- * Story 47-8, Task 1.
8
- */
9
- import type { TwinDefinition, TwinManager } from '../../index.js';
10
- import type { ScenarioManifest } from '../../../scenarios/types.js';
11
- /**
12
- * Creates a mock TwinManager with vi.fn() stubs for start, stop, and getComposeDir.
13
- * Both start and stop resolve to undefined — no Docker, no network.
14
- */
15
- export declare function makeMockTwinManager(): TwinManager;
16
- /**
17
- * Returns a standard LocalStack TwinDefinition with healthcheck configured.
18
- */
19
- export declare function makeLocalstackTwinDef(): TwinDefinition;
20
- /**
21
- * Creates a temporary shell script that echoes '{}' and exits with the given exit code.
22
- * The script is placed in a fresh mkdtempSync directory prefixed with 'tw-integ-'.
23
- *
24
- * @param twins - Optional twin names to include in the manifest.
25
- * @param exitCode - Exit code for the script (default 0).
26
- * @returns manifest and a cleanup function that removes the temp directory.
27
- */
28
- export declare function makeTmpScenario(twins?: string[], exitCode?: number): {
29
- manifest: ScenarioManifest;
30
- cleanup: () => void;
31
- };
32
- //# sourceMappingURL=helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAEnE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAMjD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAQtD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,EAChB,QAAQ,GAAE,MAAU,GACnB;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAuBrD"}
@@ -1,67 +0,0 @@
1
- /**
2
- * Shared test helpers for Epic 47 integration tests.
3
- *
4
- * All factory functions create fresh instances so each test gets independent mocks.
5
- * No vi.fn() calls at module level — all stubs are created inside factory functions.
6
- *
7
- * Story 47-8, Task 1.
8
- */
9
- import crypto from 'node:crypto';
10
- import fs from 'node:fs';
11
- import os from 'node:os';
12
- import path from 'node:path';
13
- import { vi } from 'vitest';
14
- /**
15
- * Creates a mock TwinManager with vi.fn() stubs for start, stop, and getComposeDir.
16
- * Both start and stop resolve to undefined — no Docker, no network.
17
- */
18
- export function makeMockTwinManager() {
19
- return {
20
- start: vi.fn().mockResolvedValue(undefined),
21
- stop: vi.fn().mockResolvedValue(undefined),
22
- getComposeDir: vi.fn().mockReturnValue(null),
23
- };
24
- }
25
- /**
26
- * Returns a standard LocalStack TwinDefinition with healthcheck configured.
27
- */
28
- export function makeLocalstackTwinDef() {
29
- return {
30
- name: 'localstack',
31
- image: 'localstack/localstack:latest',
32
- ports: [{ host: 4566, container: 4566 }],
33
- environment: { SERVICES: 's3' },
34
- healthcheck: { url: 'http://localhost:4566/health', timeout_ms: 5000 },
35
- };
36
- }
37
- /**
38
- * Creates a temporary shell script that echoes '{}' and exits with the given exit code.
39
- * The script is placed in a fresh mkdtempSync directory prefixed with 'tw-integ-'.
40
- *
41
- * @param twins - Optional twin names to include in the manifest.
42
- * @param exitCode - Exit code for the script (default 0).
43
- * @returns manifest and a cleanup function that removes the temp directory.
44
- */
45
- export function makeTmpScenario(twins, exitCode = 0) {
46
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tw-integ-'));
47
- const scriptPath = path.join(tmpDir, 'scenario-test.sh');
48
- const scriptContent = `#!/bin/sh\necho "{}"\nexit ${exitCode}\n`;
49
- fs.writeFileSync(scriptPath, scriptContent);
50
- fs.chmodSync(scriptPath, 0o755);
51
- const checksum = crypto
52
- .createHash('sha256')
53
- .update(fs.readFileSync(scriptPath))
54
- .digest('hex');
55
- const manifest = {
56
- scenarios: [{ name: 'scenario-test.sh', path: scriptPath, checksum }],
57
- capturedAt: Date.now(),
58
- ...(twins !== undefined ? { twins } : {}),
59
- };
60
- return {
61
- manifest,
62
- cleanup: () => {
63
- fs.rmSync(tmpDir, { recursive: true, force: true });
64
- },
65
- };
66
- }
67
- //# sourceMappingURL=helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAI3B;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC3C,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC1C,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;KACnB,CAAA;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,8BAA8B;QACrC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACxC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC/B,WAAW,EAAE,EAAE,GAAG,EAAE,8BAA8B,EAAE,UAAU,EAAE,IAAI,EAAE;KACvE,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAgB,EAChB,WAAmB,CAAC;IAEpB,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAA;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IACxD,MAAM,aAAa,GAAG,8BAA8B,QAAQ,IAAI,CAAA;IAChE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAC3C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,MAAM;SACpB,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;SACnC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEhB,MAAM,QAAQ,GAAqB;QACjC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QACrE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAA;IAED,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,GAAS,EAAE;YAClB,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACrD,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Integration tests for twin lifecycle with ScenarioRunner.
3
- *
4
- * Verifies:
5
- * 1. startTwins is called before scenario subprocess executes
6
- * 2. stopTwins is called exactly once when scenario passes
7
- * 3. stopTwins is called exactly once even when scenario fails
8
- * 4. startup failure returns all-failed result, stopTwins NOT called
9
- * 5. env vars from startTwins are injected into scenario subprocess
10
- *
11
- * Story 47-8, Task 2 (AC1).
12
- */
13
- export {};
14
- //# sourceMappingURL=lifecycle.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.test.d.ts","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/lifecycle.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -1,127 +0,0 @@
1
- /**
2
- * Integration tests for twin lifecycle with ScenarioRunner.
3
- *
4
- * Verifies:
5
- * 1. startTwins is called before scenario subprocess executes
6
- * 2. stopTwins is called exactly once when scenario passes
7
- * 3. stopTwins is called exactly once even when scenario fails
8
- * 4. startup failure returns all-failed result, stopTwins NOT called
9
- * 5. env vars from startTwins are injected into scenario subprocess
10
- *
11
- * Story 47-8, Task 2 (AC1).
12
- */
13
- import crypto from 'node:crypto';
14
- import fs from 'node:fs';
15
- import os from 'node:os';
16
- import path from 'node:path';
17
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
18
- import { createScenarioRunner } from '../../../scenarios/runner.js';
19
- import { makeTmpScenario } from './helpers.js';
20
- // ---------------------------------------------------------------------------
21
- // Setup / Teardown
22
- // ---------------------------------------------------------------------------
23
- let cleanupFn = null;
24
- let extraTmpDir = null;
25
- beforeEach(() => {
26
- cleanupFn = null;
27
- extraTmpDir = null;
28
- });
29
- afterEach(() => {
30
- cleanupFn?.();
31
- cleanupFn = null;
32
- if (extraTmpDir !== null) {
33
- fs.rmSync(extraTmpDir, { recursive: true, force: true });
34
- extraTmpDir = null;
35
- }
36
- });
37
- // ---------------------------------------------------------------------------
38
- // Tests
39
- // ---------------------------------------------------------------------------
40
- describe('twin lifecycle integration', () => {
41
- it('Test 1 — startTwins is called before scenario script executes', async () => {
42
- let startWasCalled = false;
43
- const callOrder = [];
44
- const coordinator = {
45
- startTwins: vi.fn().mockImplementation(async (names) => {
46
- startWasCalled = true;
47
- callOrder.push('startTwins:' + names.join(','));
48
- return {};
49
- }),
50
- stopTwins: vi.fn().mockImplementation(async () => {
51
- callOrder.push('stopTwins');
52
- }),
53
- };
54
- const { manifest, cleanup } = makeTmpScenario(['localstack']);
55
- cleanupFn = cleanup;
56
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
57
- await runner.run(manifest, os.tmpdir());
58
- expect(startWasCalled).toBe(true);
59
- expect(coordinator.startTwins).toHaveBeenCalledWith(['localstack']);
60
- expect(callOrder.indexOf('startTwins:localstack')).toBeLessThan(callOrder.indexOf('stopTwins'));
61
- });
62
- it('Test 2 — stopTwins called exactly once when scenario passes', async () => {
63
- const coordinator = {
64
- startTwins: vi.fn().mockResolvedValue({}),
65
- stopTwins: vi.fn().mockResolvedValue(undefined),
66
- };
67
- const { manifest, cleanup } = makeTmpScenario(['localstack'], 0);
68
- cleanupFn = cleanup;
69
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
70
- const result = await runner.run(manifest, os.tmpdir());
71
- expect(result.scenarios[0].status).toBe('pass');
72
- expect(coordinator.stopTwins).toHaveBeenCalledTimes(1);
73
- });
74
- it('Test 3 — stopTwins called exactly once even when scenario fails', async () => {
75
- const coordinator = {
76
- startTwins: vi.fn().mockResolvedValue({}),
77
- stopTwins: vi.fn().mockResolvedValue(undefined),
78
- };
79
- const { manifest, cleanup } = makeTmpScenario(['localstack'], 1);
80
- cleanupFn = cleanup;
81
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
82
- const result = await runner.run(manifest, os.tmpdir());
83
- expect(result.scenarios[0].status).toBe('fail');
84
- expect(coordinator.stopTwins).toHaveBeenCalledTimes(1);
85
- });
86
- it('Test 4 — startup failure returns all-failed result without calling stopTwins', async () => {
87
- const coordinator = {
88
- startTwins: vi.fn().mockRejectedValue(new Error('Docker not found')),
89
- stopTwins: vi.fn().mockResolvedValue(undefined),
90
- };
91
- const { manifest, cleanup } = makeTmpScenario(['localstack']);
92
- cleanupFn = cleanup;
93
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
94
- const result = await runner.run(manifest, os.tmpdir());
95
- expect(result.summary.failed).toBe(manifest.scenarios.length);
96
- expect(result.summary.passed).toBe(0);
97
- for (const scenario of result.scenarios) {
98
- expect(scenario.status).toBe('fail');
99
- expect(scenario.stderr).toContain('Docker not found');
100
- }
101
- expect(coordinator.stopTwins).not.toHaveBeenCalled();
102
- });
103
- it('Test 5 — env vars from startTwins are injected into scenario subprocess', async () => {
104
- const coordinator = {
105
- startTwins: vi.fn().mockResolvedValue({ TWIN_TEST_PORT: '19999' }),
106
- stopTwins: vi.fn().mockResolvedValue(undefined),
107
- };
108
- // Create a script that prints the env var as JSON
109
- extraTmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tw-integ-env-'));
110
- const scriptPath = path.join(extraTmpDir, 'scenario-env.sh');
111
- fs.writeFileSync(scriptPath, '#!/bin/sh\nprintf \'{"v":"%s"}\' "$TWIN_TEST_PORT"\n');
112
- fs.chmodSync(scriptPath, 0o755);
113
- const checksum = crypto
114
- .createHash('sha256')
115
- .update(fs.readFileSync(scriptPath))
116
- .digest('hex');
117
- const manifest = {
118
- scenarios: [{ name: 'scenario-env.sh', path: scriptPath, checksum }],
119
- capturedAt: Date.now(),
120
- twins: ['localstack'],
121
- };
122
- const runner = createScenarioRunner({ twinCoordinator: coordinator });
123
- const result = await runner.run(manifest, extraTmpDir);
124
- expect(result.scenarios[0].stdout).toContain('19999');
125
- });
126
- });
127
- //# sourceMappingURL=lifecycle.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/lifecycle.test.ts"],"names":[],"mappings":"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"}