@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,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"}