@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,247 +0,0 @@
1
- /**
2
- * Unit tests for TwinManager Docker Compose orchestration.
3
- *
4
- * Story 47-2.
5
- *
6
- * Mock strategy:
7
- * - node:child_process → vi.mock to avoid real Docker
8
- * - node:fs → vi.mock to avoid real filesystem writes
9
- * - node:os + node:path → real (tmpdir returns a real path; path.join is pure logic)
10
- * - fetch → vi.stubGlobal to mock health check polling
11
- */
12
- import { describe, it, expect, vi, beforeEach } from 'vitest';
13
- import { createTwinManager, TwinError } from '../docker-compose.js';
14
- // ---------------------------------------------------------------------------
15
- // Module-level mocks
16
- // ---------------------------------------------------------------------------
17
- vi.mock('node:child_process', () => ({
18
- execSync: vi.fn(),
19
- }));
20
- vi.mock('node:fs', () => ({
21
- mkdirSync: vi.fn(),
22
- writeFileSync: vi.fn(),
23
- rmSync: vi.fn(),
24
- }));
25
- // ---------------------------------------------------------------------------
26
- // Import mocked functions after vi.mock declarations
27
- // ---------------------------------------------------------------------------
28
- // Using dynamic imports after mocking to get the mocked versions
29
- import { execSync } from 'node:child_process';
30
- import { mkdirSync, writeFileSync, rmSync } from 'node:fs';
31
- // ---------------------------------------------------------------------------
32
- // Test helpers
33
- // ---------------------------------------------------------------------------
34
- function makeEventBus() {
35
- return {
36
- emit: vi.fn(),
37
- on: vi.fn(),
38
- off: vi.fn(),
39
- };
40
- }
41
- function makeTwin(overrides) {
42
- return {
43
- name: 'localstack',
44
- image: 'localstack/localstack',
45
- ports: [{ host: 4566, container: 4566 }],
46
- environment: { SERVICES: 's3' },
47
- ...overrides,
48
- };
49
- }
50
- function makeHealthyTwin() {
51
- return makeTwin({
52
- healthcheck: { url: 'http://localhost:4566/_localstack/health' },
53
- });
54
- }
55
- // ---------------------------------------------------------------------------
56
- // beforeEach: reset all mocks
57
- // ---------------------------------------------------------------------------
58
- beforeEach(() => {
59
- vi.resetAllMocks();
60
- // Default: execSync succeeds (no-op)
61
- vi.mocked(execSync).mockReturnValue(Buffer.from(''));
62
- // Default: fs functions are no-ops
63
- vi.mocked(mkdirSync).mockReturnValue(undefined);
64
- vi.mocked(writeFileSync).mockReturnValue(undefined);
65
- vi.mocked(rmSync).mockReturnValue(undefined);
66
- // Default: fetch returns 200
67
- vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true, status: 200 }));
68
- });
69
- // ---------------------------------------------------------------------------
70
- // Tests
71
- // ---------------------------------------------------------------------------
72
- describe('TwinManager — Docker Compose orchestration', () => {
73
- // AC1: verify execSync is called with 'docker compose up -d' and compose file is written
74
- it('AC1: calls docker compose up -d and writes compose file', async () => {
75
- const eventBus = makeEventBus();
76
- const manager = createTwinManager(eventBus);
77
- const twin = makeTwin();
78
- await manager.start([twin]);
79
- // docker info check
80
- expect(execSync).toHaveBeenCalledWith('docker info', { stdio: 'ignore' });
81
- // compose file written
82
- expect(writeFileSync).toHaveBeenCalledWith(expect.stringContaining('docker-compose.yml'), expect.stringContaining('localstack'), 'utf-8');
83
- // docker compose up -d
84
- expect(execSync).toHaveBeenCalledWith('docker compose up -d', expect.objectContaining({ stdio: 'pipe' }));
85
- });
86
- // AC2: generated YAML contains correct service mapping
87
- it('AC2: generated YAML has correct image, port mapping, and environment', async () => {
88
- const eventBus = makeEventBus();
89
- const manager = createTwinManager(eventBus);
90
- const twin = makeTwin();
91
- await manager.start([twin]);
92
- const writeCall = vi.mocked(writeFileSync).mock.calls[0];
93
- expect(writeCall).toBeDefined();
94
- const yamlContent = writeCall[1];
95
- expect(yamlContent).toContain('localstack/localstack');
96
- expect(yamlContent).toContain('"4566:4566"');
97
- expect(yamlContent).toContain('SERVICES: s3');
98
- });
99
- // AC3: health check polling retries until success
100
- it('AC3: polls health endpoint and resolves after 2nd successful attempt', async () => {
101
- const fetchMock = vi
102
- .fn()
103
- .mockResolvedValueOnce({ ok: false, status: 503 })
104
- .mockResolvedValueOnce({ ok: true, status: 200 });
105
- vi.stubGlobal('fetch', fetchMock);
106
- const eventBus = makeEventBus();
107
- const manager = createTwinManager(eventBus, { healthIntervalMs: 0 });
108
- const twin = makeHealthyTwin();
109
- await expect(manager.start([twin])).resolves.toBeUndefined();
110
- expect(fetchMock).toHaveBeenCalledTimes(2);
111
- });
112
- // AC3 timeout: all health check attempts fail → throws TwinError
113
- it('AC3 timeout: throws TwinError when health check exhausts all attempts', async () => {
114
- const fetchMock = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));
115
- vi.stubGlobal('fetch', fetchMock);
116
- const eventBus = makeEventBus();
117
- const manager = createTwinManager(eventBus, {
118
- maxHealthAttempts: 3,
119
- healthIntervalMs: 0,
120
- });
121
- const twin = makeHealthyTwin();
122
- // Single call — capture error and assert type + message in one block
123
- const error = await manager.start([twin]).catch((e) => e);
124
- expect(error).toBeInstanceOf(TwinError);
125
- expect(error.message).toBe("Twin 'localstack' failed health check after 3 attempts");
126
- });
127
- // AC4: Docker not installed → throws descriptive TwinError
128
- it('AC4: throws TwinError("Docker not found") when docker info fails', async () => {
129
- vi.mocked(execSync).mockImplementation((cmd) => {
130
- if (cmd === 'docker info')
131
- throw new Error('docker: command not found');
132
- return Buffer.from('');
133
- });
134
- const eventBus = makeEventBus();
135
- const manager = createTwinManager(eventBus);
136
- // Single call — capture error and assert type + message in one block
137
- const error = await manager.start([makeTwin()]).catch((e) => e);
138
- expect(error).toBeInstanceOf(TwinError);
139
- expect(error.message).toBe('Docker not found — twins require Docker');
140
- });
141
- // AC5: twin:started event emitted per twin with correct payload
142
- it('AC5: emits twin:started with correct twinName, ports, and healthStatus', async () => {
143
- const eventBus = makeEventBus();
144
- const manager = createTwinManager(eventBus);
145
- const twin = makeTwin();
146
- await manager.start([twin]);
147
- expect(eventBus.emit).toHaveBeenCalledWith('twin:started', {
148
- twinName: 'localstack',
149
- ports: [{ host: 4566, container: 4566 }],
150
- healthStatus: 'healthy',
151
- });
152
- });
153
- // AC5: twin:started emitted for each twin when multiple twins started
154
- it('AC5: emits twin:started for each twin in the array', async () => {
155
- const eventBus = makeEventBus();
156
- const manager = createTwinManager(eventBus);
157
- const twin1 = makeTwin({ name: 'localstack', image: 'localstack/localstack' });
158
- const twin2 = makeTwin({ name: 'redis', image: 'redis:7', ports: [{ host: 6379, container: 6379 }] });
159
- await manager.start([twin1, twin2]);
160
- expect(eventBus.emit).toHaveBeenCalledTimes(2);
161
- expect(eventBus.emit).toHaveBeenCalledWith('twin:started', expect.objectContaining({ twinName: 'localstack' }));
162
- expect(eventBus.emit).toHaveBeenCalledWith('twin:started', expect.objectContaining({ twinName: 'redis' }));
163
- });
164
- // AC6: stop() executes docker compose down --remove-orphans
165
- it('AC6: stop() calls docker compose down --remove-orphans', async () => {
166
- const eventBus = makeEventBus();
167
- const manager = createTwinManager(eventBus);
168
- const twin = makeTwin();
169
- await manager.start([twin]);
170
- vi.mocked(execSync).mockClear();
171
- await manager.stop();
172
- expect(execSync).toHaveBeenCalledWith('docker compose down --remove-orphans', expect.objectContaining({ stdio: 'pipe' }));
173
- });
174
- // AC6 cleanup: stop() deletes the temp compose directory
175
- it('AC6 cleanup: stop() calls fs.rmSync on the compose temp dir', async () => {
176
- const eventBus = makeEventBus();
177
- const manager = createTwinManager(eventBus);
178
- const twin = makeTwin();
179
- // Capture the temp dir from mkdirSync
180
- let capturedDir;
181
- vi.mocked(mkdirSync).mockImplementation((dir) => {
182
- capturedDir = dir;
183
- return undefined;
184
- });
185
- await manager.start([twin]);
186
- await manager.stop();
187
- expect(capturedDir).toBeDefined();
188
- expect(rmSync).toHaveBeenCalledWith(capturedDir, { recursive: true, force: true });
189
- });
190
- // AC6: stop() emits twin:stopped for each started twin
191
- it('AC6: stop() emits twin:stopped for each started twin', async () => {
192
- const eventBus = makeEventBus();
193
- const manager = createTwinManager(eventBus);
194
- const twin = makeTwin();
195
- await manager.start([twin]);
196
- eventBus.emit.mockClear();
197
- await manager.stop();
198
- expect(eventBus.emit).toHaveBeenCalledWith('twin:stopped', { twinName: 'localstack' });
199
- });
200
- // AC7: createTwinManager is a function and TwinError is a class
201
- it('AC7: createTwinManager is a function and TwinError is a constructor', () => {
202
- expect(typeof createTwinManager).toBe('function');
203
- expect(typeof TwinError).toBe('function');
204
- });
205
- // AC7: createTwinManager returns an object with start() and stop() methods
206
- it('AC7: createTwinManager returns TwinManager with start() and stop()', () => {
207
- const eventBus = makeEventBus();
208
- const manager = createTwinManager(eventBus);
209
- expect(typeof manager.start).toBe('function');
210
- expect(typeof manager.stop).toBe('function');
211
- });
212
- // No-op stop: stop() before start() does not throw and does not call execSync
213
- it('no-op stop: stop() before start() is a no-op', async () => {
214
- const eventBus = makeEventBus();
215
- const manager = createTwinManager(eventBus);
216
- await expect(manager.stop()).resolves.toBeUndefined();
217
- expect(execSync).not.toHaveBeenCalled();
218
- expect(rmSync).not.toHaveBeenCalled();
219
- });
220
- // TwinError: has correct name and message
221
- it('TwinError: name is "TwinError" and message is preserved', () => {
222
- const error = new TwinError('test error message');
223
- expect(error.name).toBe('TwinError');
224
- expect(error.message).toBe('test error message');
225
- expect(error).toBeInstanceOf(Error);
226
- expect(error).toBeInstanceOf(TwinError);
227
- });
228
- // AC3: no health check defined → start() resolves immediately without polling
229
- it('AC3: twin without healthcheck resolves without polling fetch', async () => {
230
- const fetchMock = vi.fn();
231
- vi.stubGlobal('fetch', fetchMock);
232
- const eventBus = makeEventBus();
233
- const manager = createTwinManager(eventBus);
234
- const twin = makeTwin(); // no healthcheck property
235
- await expect(manager.start([twin])).resolves.toBeUndefined();
236
- expect(fetchMock).not.toHaveBeenCalled();
237
- });
238
- // AC2: compose file uses version 3.8
239
- it('AC2: generated YAML has version 3.8', async () => {
240
- const eventBus = makeEventBus();
241
- const manager = createTwinManager(eventBus);
242
- await manager.start([makeTwin()]);
243
- const yamlContent = vi.mocked(writeFileSync).mock.calls[0][1];
244
- expect(yamlContent).toContain("version: '3.8'");
245
- });
246
- });
247
- //# sourceMappingURL=docker-compose.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docker-compose.test.js","sourceRoot":"","sources":["../../../src/twins/__tests__/docker-compose.test.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Unit tests for TwinHealthMonitor (story 47-6).
3
- *
4
- * Tests cover:
5
- * 1. start/stop lifecycle — after stop, fetch is NOT called on subsequent intervals
6
- * 2. no healthcheck URL — fetch never called, getStatus() returns {}
7
- * 3. healthy poll — no events emitted, getStatus() shows 'healthy'
8
- * 4. failing poll emits warning — warning event with consecutiveFailures: 1, status 'degraded'
9
- * 5. warning increments counter — 2 polls → consecutiveFailures: 2
10
- * 6. hard failure after 3 consecutive fails — health-failed event, status 'unhealthy'
11
- * 7. polling stops after hard failure — fetch called exactly 3 times (not 4)
12
- * 8. recovery resets counter — fail then succeed → healthy, no health-failed emitted
13
- * 9. stop is idempotent — no errors thrown
14
- * 10. getStatus before start — returns {}
15
- * 11. ScenarioRunner health gate (unhealthy) — aborts run before scenario execution
16
- * 12. ScenarioRunner health gate (healthy) — scenarios proceed normally
17
- */
18
- export {};
19
- //# sourceMappingURL=health-monitor.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health-monitor.test.d.ts","sourceRoot":"","sources":["../../../src/twins/__tests__/health-monitor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -1,301 +0,0 @@
1
- /**
2
- * Unit tests for TwinHealthMonitor (story 47-6).
3
- *
4
- * Tests cover:
5
- * 1. start/stop lifecycle — after stop, fetch is NOT called on subsequent intervals
6
- * 2. no healthcheck URL — fetch never called, getStatus() returns {}
7
- * 3. healthy poll — no events emitted, getStatus() shows 'healthy'
8
- * 4. failing poll emits warning — warning event with consecutiveFailures: 1, status 'degraded'
9
- * 5. warning increments counter — 2 polls → consecutiveFailures: 2
10
- * 6. hard failure after 3 consecutive fails — health-failed event, status 'unhealthy'
11
- * 7. polling stops after hard failure — fetch called exactly 3 times (not 4)
12
- * 8. recovery resets counter — fail then succeed → healthy, no health-failed emitted
13
- * 9. stop is idempotent — no errors thrown
14
- * 10. getStatus before start — returns {}
15
- * 11. ScenarioRunner health gate (unhealthy) — aborts run before scenario execution
16
- * 12. ScenarioRunner health gate (healthy) — scenarios proceed normally
17
- */
18
- import fs from 'fs';
19
- import os from 'os';
20
- import path from 'path';
21
- import crypto from 'crypto';
22
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
23
- import { createTwinHealthMonitor } from '../health-monitor.js';
24
- import { createScenarioRunner } from '../../scenarios/runner.js';
25
- // ---------------------------------------------------------------------------
26
- // Helpers
27
- // ---------------------------------------------------------------------------
28
- function makeTwin(name, healthUrl) {
29
- return {
30
- name,
31
- image: 'test-image:latest',
32
- ports: [],
33
- environment: {},
34
- ...(healthUrl ? { healthcheck: { url: healthUrl, timeout_ms: 100 } } : {}),
35
- };
36
- }
37
- function makeEventBus() {
38
- return { emit: vi.fn() };
39
- }
40
- // ---------------------------------------------------------------------------
41
- // Setup / Teardown
42
- // ---------------------------------------------------------------------------
43
- beforeEach(() => {
44
- vi.useFakeTimers();
45
- });
46
- afterEach(() => {
47
- vi.useRealTimers();
48
- vi.unstubAllGlobals();
49
- });
50
- // ---------------------------------------------------------------------------
51
- // Test 1 — start/stop lifecycle
52
- // ---------------------------------------------------------------------------
53
- describe('TwinHealthMonitor — lifecycle', () => {
54
- it('Test 1: does NOT call fetch after stop()', async () => {
55
- const mockFetch = vi.fn().mockResolvedValue({ ok: true });
56
- vi.stubGlobal('fetch', mockFetch);
57
- const eventBus = makeEventBus();
58
- const monitor = createTwinHealthMonitor(eventBus, { monitorIntervalMs: 1000 });
59
- const twin = makeTwin('my-twin', 'http://localhost:8080/health');
60
- monitor.start([twin]);
61
- monitor.stop();
62
- // Advance past one interval — should NOT trigger a poll since we stopped
63
- await vi.advanceTimersByTimeAsync(1100);
64
- expect(mockFetch).not.toHaveBeenCalled();
65
- });
66
- // ---------------------------------------------------------------------------
67
- // Test 2 — no healthcheck URL
68
- // ---------------------------------------------------------------------------
69
- it('Test 2: skips twins without healthcheck URL', async () => {
70
- const mockFetch = vi.fn();
71
- vi.stubGlobal('fetch', mockFetch);
72
- const eventBus = makeEventBus();
73
- const monitor = createTwinHealthMonitor(eventBus, { monitorIntervalMs: 1000 });
74
- const twin = makeTwin('no-healthcheck-twin'); // no healthcheck
75
- monitor.start([twin]);
76
- await vi.advanceTimersByTimeAsync(1100);
77
- expect(mockFetch).not.toHaveBeenCalled();
78
- expect(monitor.getStatus()).toEqual({});
79
- });
80
- // ---------------------------------------------------------------------------
81
- // Test 5 — stop is idempotent
82
- // ---------------------------------------------------------------------------
83
- it('Test 9: stop() is idempotent — no errors thrown when called multiple times', () => {
84
- const eventBus = makeEventBus();
85
- const monitor = createTwinHealthMonitor(eventBus, { monitorIntervalMs: 1000 });
86
- const twin = makeTwin('my-twin', 'http://localhost:8080/health');
87
- // Stop before start — should not throw
88
- expect(() => monitor.stop()).not.toThrow();
89
- expect(() => monitor.stop()).not.toThrow();
90
- monitor.start([twin]);
91
- // Stop multiple times after start — should not throw
92
- expect(() => monitor.stop()).not.toThrow();
93
- expect(() => monitor.stop()).not.toThrow();
94
- });
95
- // ---------------------------------------------------------------------------
96
- // Test 10 — getStatus before start
97
- // ---------------------------------------------------------------------------
98
- it('Test 10: getStatus() returns {} before start()', () => {
99
- const eventBus = makeEventBus();
100
- const monitor = createTwinHealthMonitor(eventBus);
101
- expect(monitor.getStatus()).toEqual({});
102
- });
103
- });
104
- // ---------------------------------------------------------------------------
105
- // Test 3 — healthy poll
106
- // ---------------------------------------------------------------------------
107
- describe('TwinHealthMonitor — healthy poll', () => {
108
- it('Test 3: does NOT emit events on successful poll, getStatus() shows healthy', async () => {
109
- const mockFetch = vi.fn().mockResolvedValue({ ok: true });
110
- vi.stubGlobal('fetch', mockFetch);
111
- const eventBus = makeEventBus();
112
- const monitor = createTwinHealthMonitor(eventBus, { monitorIntervalMs: 1000 });
113
- const twin = makeTwin('healthy-twin', 'http://localhost:8080/health');
114
- monitor.start([twin]);
115
- await vi.advanceTimersByTimeAsync(1100);
116
- expect(mockFetch).toHaveBeenCalledOnce();
117
- expect(eventBus.emit).not.toHaveBeenCalled();
118
- expect(monitor.getStatus()).toEqual({ 'healthy-twin': 'healthy' });
119
- monitor.stop();
120
- });
121
- });
122
- // ---------------------------------------------------------------------------
123
- // Test 4 — failing poll emits warning
124
- // ---------------------------------------------------------------------------
125
- describe('TwinHealthMonitor — failing polls', () => {
126
- it('Test 4: emits twin:health-warning on first failure, getStatus() shows degraded', async () => {
127
- const mockFetch = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));
128
- vi.stubGlobal('fetch', mockFetch);
129
- const eventBus = makeEventBus();
130
- const monitor = createTwinHealthMonitor(eventBus, {
131
- monitorIntervalMs: 1000,
132
- maxConsecutiveFailures: 3,
133
- });
134
- const twin = makeTwin('my-twin', 'http://localhost:4566/health');
135
- monitor.start([twin]);
136
- await vi.advanceTimersByTimeAsync(1100);
137
- expect(eventBus.emit).toHaveBeenCalledWith('twin:health-warning', expect.objectContaining({
138
- twinName: 'my-twin',
139
- consecutiveFailures: 1,
140
- }));
141
- expect(monitor.getStatus()).toEqual({ 'my-twin': 'degraded' });
142
- monitor.stop();
143
- });
144
- // ---------------------------------------------------------------------------
145
- // Test 5 — warning increments counter
146
- // ---------------------------------------------------------------------------
147
- it('Test 5: increments consecutiveFailures on each warning', async () => {
148
- const mockFetch = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));
149
- vi.stubGlobal('fetch', mockFetch);
150
- const eventBus = makeEventBus();
151
- const monitor = createTwinHealthMonitor(eventBus, {
152
- monitorIntervalMs: 1000,
153
- maxConsecutiveFailures: 5, // high threshold so we don't hit hard failure
154
- });
155
- const twin = makeTwin('my-twin', 'http://localhost:4566/health');
156
- monitor.start([twin]);
157
- // Advance 2 full intervals
158
- await vi.advanceTimersByTimeAsync(2200);
159
- const calls = eventBus.emit.mock.calls;
160
- const warningCalls = calls.filter(([event]) => event === 'twin:health-warning');
161
- expect(warningCalls).toHaveLength(2);
162
- expect(warningCalls[1][1]).toMatchObject({ twinName: 'my-twin', consecutiveFailures: 2 });
163
- monitor.stop();
164
- });
165
- // ---------------------------------------------------------------------------
166
- // Test 6 — hard failure after 3 consecutive fails
167
- // ---------------------------------------------------------------------------
168
- it('Test 6: emits twin:health-failed after maxConsecutiveFailures (default 3), status becomes unhealthy', async () => {
169
- const mockFetch = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));
170
- vi.stubGlobal('fetch', mockFetch);
171
- const eventBus = makeEventBus();
172
- const monitor = createTwinHealthMonitor(eventBus, {
173
- monitorIntervalMs: 1000,
174
- maxConsecutiveFailures: 3,
175
- });
176
- const twin = makeTwin('my-twin', 'http://localhost:4566/health');
177
- monitor.start([twin]);
178
- // Advance 3 full intervals
179
- await vi.advanceTimersByTimeAsync(3200);
180
- expect(eventBus.emit).toHaveBeenCalledWith('twin:health-failed', expect.objectContaining({
181
- twinName: 'my-twin',
182
- }));
183
- expect(monitor.getStatus()).toEqual({ 'my-twin': 'unhealthy' });
184
- monitor.stop();
185
- });
186
- // ---------------------------------------------------------------------------
187
- // Test 7 — polling stops after hard failure
188
- // ---------------------------------------------------------------------------
189
- it('Test 7: stops polling after hard failure — fetch called exactly 3 times not 4', async () => {
190
- const mockFetch = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));
191
- vi.stubGlobal('fetch', mockFetch);
192
- const eventBus = makeEventBus();
193
- const monitor = createTwinHealthMonitor(eventBus, {
194
- monitorIntervalMs: 1000,
195
- maxConsecutiveFailures: 3,
196
- });
197
- const twin = makeTwin('my-twin', 'http://localhost:4566/health');
198
- monitor.start([twin]);
199
- // Advance 4 full intervals — but polling should stop after 3 failures
200
- await vi.advanceTimersByTimeAsync(4200);
201
- // fetch should have been called exactly 3 times (3 failures = unhealthy, then polling stops)
202
- expect(mockFetch).toHaveBeenCalledTimes(3);
203
- monitor.stop();
204
- });
205
- // ---------------------------------------------------------------------------
206
- // Test 8 — recovery resets counter
207
- // ---------------------------------------------------------------------------
208
- it('Test 8: recovery after failure resets counter and status to healthy, no health-failed emitted', async () => {
209
- let callCount = 0;
210
- const mockFetch = vi.fn().mockImplementation(() => {
211
- callCount++;
212
- if (callCount === 1) {
213
- // First call fails
214
- return Promise.reject(new Error('ECONNREFUSED'));
215
- }
216
- // Subsequent calls succeed
217
- return Promise.resolve({ ok: true });
218
- });
219
- vi.stubGlobal('fetch', mockFetch);
220
- const eventBus = makeEventBus();
221
- const monitor = createTwinHealthMonitor(eventBus, {
222
- monitorIntervalMs: 1000,
223
- maxConsecutiveFailures: 3,
224
- });
225
- const twin = makeTwin('my-twin', 'http://localhost:4566/health');
226
- monitor.start([twin]);
227
- // Advance 2 intervals: first fails, second succeeds
228
- await vi.advanceTimersByTimeAsync(2200);
229
- // Should NOT have emitted health-failed
230
- const calls = eventBus.emit.mock.calls;
231
- const failedCalls = calls.filter(([event]) => event === 'twin:health-failed');
232
- expect(failedCalls).toHaveLength(0);
233
- // Status should be healthy after recovery
234
- expect(monitor.getStatus()).toEqual({ 'my-twin': 'healthy' });
235
- monitor.stop();
236
- });
237
- });
238
- // ---------------------------------------------------------------------------
239
- // Test 11 & 12 — ScenarioRunner health gate
240
- // ---------------------------------------------------------------------------
241
- describe('ScenarioRunner — twinHealthMonitor health gate', () => {
242
- let tmpDir;
243
- beforeEach(() => {
244
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'health-gate-'));
245
- });
246
- afterEach(() => {
247
- fs.rmSync(tmpDir, { recursive: true, force: true });
248
- });
249
- function makePassingScript() {
250
- const scriptPath = path.join(tmpDir, `scenario-${crypto.randomUUID()}.sh`);
251
- fs.writeFileSync(scriptPath, '#!/bin/sh\nexit 0\n');
252
- fs.chmodSync(scriptPath, 0o755);
253
- const checksum = crypto.createHash('sha256').update(fs.readFileSync(scriptPath)).digest('hex');
254
- return { name: path.basename(scriptPath), path: scriptPath, checksum };
255
- }
256
- function makeManifestWithTwins(twinNames) {
257
- const scenario = makePassingScript();
258
- return {
259
- scenarios: [scenario],
260
- capturedAt: Date.now(),
261
- twins: twinNames,
262
- };
263
- }
264
- function makeManifestNoTwins() {
265
- const scenario = makePassingScript();
266
- return {
267
- scenarios: [scenario],
268
- capturedAt: Date.now(),
269
- };
270
- }
271
- it('Test 11: aborts run when a twin is unhealthy — all scenarios fail, no scripts executed', async () => {
272
- // Create a monitor spy that always reports 'unhealthy'
273
- const mockMonitor = {
274
- start: vi.fn(),
275
- stop: vi.fn(),
276
- getStatus: vi.fn().mockReturnValue({ 'my-twin': 'unhealthy' }),
277
- };
278
- const manifest = makeManifestWithTwins(['my-twin']);
279
- const runner = createScenarioRunner({ twinHealthMonitor: mockMonitor });
280
- // The scenarios are real scripts but we expect them NOT to be executed
281
- const result = await runner.run(manifest, tmpDir);
282
- expect(result.summary.failed).toBeGreaterThan(0);
283
- expect(result.summary.passed).toBe(0);
284
- expect(result.scenarios[0].stderr).toContain("Twin 'my-twin' is unhealthy");
285
- });
286
- it('Test 12: proceeds normally when all twins are healthy', async () => {
287
- // Create a monitor spy that reports 'healthy'
288
- const mockMonitor = {
289
- start: vi.fn(),
290
- stop: vi.fn(),
291
- getStatus: vi.fn().mockReturnValue({ 'my-twin': 'healthy' }),
292
- };
293
- const manifest = makeManifestNoTwins();
294
- const runner = createScenarioRunner({ twinHealthMonitor: mockMonitor });
295
- const result = await runner.run(manifest, tmpDir);
296
- // Script exits 0 so scenarios should pass
297
- expect(result.summary.passed).toBeGreaterThan(0);
298
- expect(result.summary.failed).toBe(0);
299
- });
300
- });
301
- //# sourceMappingURL=health-monitor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health-monitor.test.js","sourceRoot":"","sources":["../../../src/twins/__tests__/health-monitor.test.ts"],"names":[],"mappings":"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"}
@@ -1,18 +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
- export {};
18
- //# sourceMappingURL=e2e.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"e2e.test.d.ts","sourceRoot":"","sources":["../../../../src/twins/__tests__/integration/e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}