@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,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":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,gCAAgC,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAGnE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEnE,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,yEAAyE;AACzE,MAAM,QAAQ,GAAG,GAAkB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;AAEtF,kGAAkG;AAClG,SAAS,2BAA2B;IAClC,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;KAChC,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,IAAI,OAAwB,CAAA;AAC5B,IAAI,QAAsC,CAAA;AAC1C,IAAI,SAAS,GAAwB,IAAI,CAAA;AACzC,MAAM,WAAW,GAAG,aAAa,CAAA;AAEjC,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,OAAO,GAAG,qBAAqB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;IACtD,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IAC5B,QAAQ,GAAG,IAAI,iBAAiB,EAAiB,CAAA;IACjD,gCAAgC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACnD,SAAS,GAAG,IAAI,CAAA;AAClB,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,SAAS,EAAE,EAAE,CAAA;IACb,SAAS,GAAG,IAAI,CAAA;AAClB,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAA;QAEzC,MAAM,WAAW,GAAoB;YACnC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBAChD,MAAO,WAAW,CAAC,KAAkC,CAAC,EAAE,CAAC,CAAA;gBACzD,4EAA4E;gBAC5E,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE;oBAC5B,QAAQ,EAAE,YAAY;oBACtB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;oBACxC,YAAY,EAAE,SAAS;oBACvB,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAA;gBACF,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAA;YACpD,CAAC,CAAC;YACF,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBAC/C,MAAO,WAAW,CAAC,IAAiC,EAAE,CAAA;YACxD,CAAC,CAAC;SACH,CAAA;QAED,kEAAkE;QAClE,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAA;QACrF,aAAa,CAAC,KAAK,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAA;QAEpD,MAAM,MAAM,GAAG,oBAAoB,CAAC;YAClC,eAAe,EAAE,WAAW;YAC5B,iBAAiB,EAAE,aAAa;SACjC,CAAC,CAAA;QAEF,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAA;QAChE,SAAS,GAAG,OAAO,CAAA;QAEnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACxD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAErC,+EAA+E;QAC/E,MAAM,QAAQ,EAAE,CAAA;QAEhB,oFAAoF;QACpF,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAA;QACzD,MAAM,QAAQ,EAAE,CAAA;QAEhB,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QAC/D,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE5C,aAAa,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAA;QAEzC,MAAM,WAAW,GAAoB;YACnC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBAChD,MAAO,WAAW,CAAC,KAAkC,CAAC,EAAE,CAAC,CAAA;gBACzD,OAAO,EAAE,CAAA;YACX,CAAC,CAAC;YACF,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBAC/C,MAAO,WAAW,CAAC,IAAiC,EAAE,CAAA;YACxD,CAAC,CAAC;SACH,CAAA;QAED,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAA;QACrF,aAAa,CAAC,KAAK,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAA;QAEpD,MAAM,MAAM,GAAG,oBAAoB,CAAC;YAClC,eAAe,EAAE,WAAW;YAC5B,iBAAiB,EAAE,aAAa;SACjC,CAAC,CAAA;QAEF,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAA;QAChE,SAAS,GAAG,OAAO,CAAA;QAEnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAExD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAEjD,aAAa,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAA;QAEzC,MAAM,WAAW,GAAoB;YACnC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACzC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;SAChD,CAAA;QAED,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAA;QAErF,MAAM,MAAM,GAAG,oBAAoB,CAAC;YAClC,eAAe,EAAE,WAAW;YAC5B,iBAAiB,EAAE,aAAa;SACjC,CAAC,CAAA;QAEF,+BAA+B;QAC/B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;QAC3D,SAAS,GAAG,OAAO,CAAA;QAEnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAExD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAChD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAC/C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACrD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAEpD,aAAa,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -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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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Integration tests for TwinPersistenceCoordinator with real event bus and MemoryDatabaseAdapter.
3
- *
4
- * Verifies:
5
- * 1. twin:started event causes insertTwinRun row with status 'running'
6
- * 2. twin:stopped event updates row to status 'stopped' with non-null stopped_at
7
- * 3. ports are serialized and deserialized correctly
8
- * 4. health failures accumulate via recordTwinHealthFailure
9
- * 5. multiple twins in one run are each tracked separately
10
- *
11
- * Story 47-8, Task 4 (AC4, AC5).
12
- */
13
- export {};
14
- //# sourceMappingURL=persistence-integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persistence-integration.test.d.ts","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/persistence-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -1,132 +0,0 @@
1
- /**
2
- * Integration tests for TwinPersistenceCoordinator with real event bus and MemoryDatabaseAdapter.
3
- *
4
- * Verifies:
5
- * 1. twin:started event causes insertTwinRun row with status 'running'
6
- * 2. twin:stopped event updates row to status 'stopped' with non-null stopped_at
7
- * 3. ports are serialized and deserialized correctly
8
- * 4. health failures accumulate via recordTwinHealthFailure
9
- * 5. multiple twins in one run are each tracked separately
10
- *
11
- * Story 47-8, Task 4 (AC4, AC5).
12
- */
13
- import { describe, it, expect, beforeEach } from 'vitest';
14
- import { createDatabaseAdapter, TypedEventBusImpl } from '@substrate-ai/core';
15
- import { factorySchema } from '../../../persistence/factory-schema.js';
16
- import { createTwinPersistenceCoordinator, insertTwinRun, recordTwinHealthFailure, getTwinRunsForRun, } from '../../persistence.js';
17
- // ---------------------------------------------------------------------------
18
- // Helpers
19
- // ---------------------------------------------------------------------------
20
- /** Flush async event-bus handlers by yielding to the macrotask queue. */
21
- const nextTick = () => new Promise((resolve) => setTimeout(resolve, 0));
22
- // ---------------------------------------------------------------------------
23
- // Setup
24
- // ---------------------------------------------------------------------------
25
- let adapter;
26
- let eventBus;
27
- beforeEach(async () => {
28
- adapter = createDatabaseAdapter({ backend: 'memory' });
29
- await factorySchema(adapter);
30
- eventBus = new TypedEventBusImpl();
31
- createTwinPersistenceCoordinator(adapter, eventBus);
32
- });
33
- // ---------------------------------------------------------------------------
34
- // Tests
35
- // ---------------------------------------------------------------------------
36
- describe('TwinPersistenceCoordinator — event-driven persistence', () => {
37
- it('Test 1 — twin:started emits insertTwinRun row with status running', async () => {
38
- eventBus.emit('twin:started', {
39
- twinName: 'localstack',
40
- ports: [{ host: 4566, container: 4566 }],
41
- healthStatus: 'healthy',
42
- runId: 'run-001',
43
- });
44
- await nextTick();
45
- const summaries = await getTwinRunsForRun(adapter, 'run-001');
46
- expect(summaries).toHaveLength(1);
47
- expect(summaries[0].twin_name).toBe('localstack');
48
- expect(summaries[0].status).toBe('running');
49
- });
50
- it('Test 2 — twin:stopped updates row to stopped with non-null stopped_at', async () => {
51
- eventBus.emit('twin:started', {
52
- twinName: 'localstack',
53
- ports: [{ host: 4566, container: 4566 }],
54
- healthStatus: 'healthy',
55
- runId: 'run-002',
56
- });
57
- await nextTick();
58
- eventBus.emit('twin:stopped', { twinName: 'localstack' });
59
- await nextTick();
60
- const summaries = await getTwinRunsForRun(adapter, 'run-002');
61
- expect(summaries).toHaveLength(1);
62
- expect(summaries[0].status).toBe('stopped');
63
- expect(summaries[0].stopped_at).not.toBeNull();
64
- });
65
- it('Test 3 — ports are serialized and parsed correctly on read', async () => {
66
- eventBus.emit('twin:started', {
67
- twinName: 'localstack',
68
- ports: [{ host: 4566, container: 4566 }],
69
- healthStatus: 'healthy',
70
- runId: 'run-003',
71
- });
72
- await nextTick();
73
- const summaries = await getTwinRunsForRun(adapter, 'run-003');
74
- expect(summaries).toHaveLength(1);
75
- expect(summaries[0].ports).toHaveLength(1);
76
- expect(summaries[0].ports[0].host).toBe(4566);
77
- expect(summaries[0].ports[0].container).toBe(4566);
78
- });
79
- it('Test 4 — health failures accumulate via recordTwinHealthFailure', async () => {
80
- const runId = 'run-004';
81
- await insertTwinRun(adapter, {
82
- twin_name: 'localstack',
83
- ports: [{ host: 4566, container: 4566 }],
84
- run_id: runId,
85
- });
86
- await recordTwinHealthFailure(adapter, {
87
- twin_name: 'localstack',
88
- run_id: runId,
89
- error_message: 'failure 1',
90
- });
91
- await recordTwinHealthFailure(adapter, {
92
- twin_name: 'localstack',
93
- run_id: runId,
94
- error_message: 'failure 2',
95
- });
96
- await recordTwinHealthFailure(adapter, {
97
- twin_name: 'localstack',
98
- run_id: runId,
99
- error_message: 'failure 3',
100
- });
101
- const summaries = await getTwinRunsForRun(adapter, runId);
102
- expect(summaries).toHaveLength(1);
103
- expect(summaries[0].health_failure_count).toBe(3);
104
- });
105
- it('Test 5 — multiple twins in one run are each tracked separately', async () => {
106
- const runId = 'run-005';
107
- eventBus.emit('twin:started', {
108
- twinName: 'localstack',
109
- ports: [{ host: 4566, container: 4566 }],
110
- healthStatus: 'healthy',
111
- runId,
112
- });
113
- eventBus.emit('twin:started', {
114
- twinName: 'wiremock',
115
- ports: [{ host: 8080, container: 8080 }],
116
- healthStatus: 'healthy',
117
- runId,
118
- });
119
- await nextTick();
120
- eventBus.emit('twin:stopped', { twinName: 'localstack' });
121
- eventBus.emit('twin:stopped', { twinName: 'wiremock' });
122
- await nextTick();
123
- const summaries = await getTwinRunsForRun(adapter, runId);
124
- expect(summaries).toHaveLength(2);
125
- const names = summaries.map((s) => s.twin_name).sort();
126
- expect(names).toEqual(['localstack', 'wiremock']);
127
- for (const summary of summaries) {
128
- expect(summary.status).toBe('stopped');
129
- }
130
- });
131
- });
132
- //# sourceMappingURL=persistence-integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persistence-integration.test.js","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/persistence-integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Unit tests for twin persistence — twin_runs, twin_health_failures tables and
3
- * the TwinPersistenceCoordinator.
4
- *
5
- * Story 47-7, Tasks 1–7.
6
- *
7
- * All tests use createDatabaseAdapter({ backend: 'memory' }) — no Dolt, no Docker, no network.
8
- */
9
- export {};
10
- //# sourceMappingURL=persistence.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persistence.test.d.ts","sourceRoot":"","sources":["../../../src/twins/__tests__/persistence.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}