@opensip-cli/simulation 0.1.0

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 (348) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/internal-surface.test.d.ts +9 -0
  5. package/dist/__tests__/internal-surface.test.d.ts.map +1 -0
  6. package/dist/__tests__/internal-surface.test.js +38 -0
  7. package/dist/__tests__/internal-surface.test.js.map +1 -0
  8. package/dist/__tests__/plugin-loader.test.d.ts +2 -0
  9. package/dist/__tests__/plugin-loader.test.d.ts.map +1 -0
  10. package/dist/__tests__/plugin-loader.test.js +64 -0
  11. package/dist/__tests__/plugin-loader.test.js.map +1 -0
  12. package/dist/__tests__/public-api.test.d.ts +15 -0
  13. package/dist/__tests__/public-api.test.d.ts.map +1 -0
  14. package/dist/__tests__/public-api.test.js +73 -0
  15. package/dist/__tests__/public-api.test.js.map +1 -0
  16. package/dist/__tests__/registry-cross-kind.test.d.ts +6 -0
  17. package/dist/__tests__/registry-cross-kind.test.d.ts.map +1 -0
  18. package/dist/__tests__/registry-cross-kind.test.js +86 -0
  19. package/dist/__tests__/registry-cross-kind.test.js.map +1 -0
  20. package/dist/__tests__/scenario-execution.test.d.ts +10 -0
  21. package/dist/__tests__/scenario-execution.test.d.ts.map +1 -0
  22. package/dist/__tests__/scenario-execution.test.js +92 -0
  23. package/dist/__tests__/scenario-execution.test.js.map +1 -0
  24. package/dist/__tests__/sim-capability-contract.test.d.ts +10 -0
  25. package/dist/__tests__/sim-capability-contract.test.d.ts.map +1 -0
  26. package/dist/__tests__/sim-capability-contract.test.js +131 -0
  27. package/dist/__tests__/sim-capability-contract.test.js.map +1 -0
  28. package/dist/__tests__/sim-config-schema.test.d.ts +5 -0
  29. package/dist/__tests__/sim-config-schema.test.d.ts.map +1 -0
  30. package/dist/__tests__/sim-config-schema.test.js +23 -0
  31. package/dist/__tests__/sim-config-schema.test.js.map +1 -0
  32. package/dist/__tests__/sim-failure-signal.test.d.ts +10 -0
  33. package/dist/__tests__/sim-failure-signal.test.d.ts.map +1 -0
  34. package/dist/__tests__/sim-failure-signal.test.js +86 -0
  35. package/dist/__tests__/sim-failure-signal.test.js.map +1 -0
  36. package/dist/__tests__/surviving-surface-edges.test.d.ts +10 -0
  37. package/dist/__tests__/surviving-surface-edges.test.d.ts.map +1 -0
  38. package/dist/__tests__/surviving-surface-edges.test.js +122 -0
  39. package/dist/__tests__/surviving-surface-edges.test.js.map +1 -0
  40. package/dist/__tests__/test-utils/targets.d.ts +26 -0
  41. package/dist/__tests__/test-utils/targets.d.ts.map +1 -0
  42. package/dist/__tests__/test-utils/targets.js +38 -0
  43. package/dist/__tests__/test-utils/targets.js.map +1 -0
  44. package/dist/__tests__/test-utils/with-sim-scope.d.ts +12 -0
  45. package/dist/__tests__/test-utils/with-sim-scope.d.ts.map +1 -0
  46. package/dist/__tests__/test-utils/with-sim-scope.js +22 -0
  47. package/dist/__tests__/test-utils/with-sim-scope.js.map +1 -0
  48. package/dist/__tests__/tool-live-view.test.d.ts +20 -0
  49. package/dist/__tests__/tool-live-view.test.d.ts.map +1 -0
  50. package/dist/__tests__/tool-live-view.test.js +146 -0
  51. package/dist/__tests__/tool-live-view.test.js.map +1 -0
  52. package/dist/__tests__/tool-show-mode.test.d.ts +10 -0
  53. package/dist/__tests__/tool-show-mode.test.d.ts.map +1 -0
  54. package/dist/__tests__/tool-show-mode.test.js +156 -0
  55. package/dist/__tests__/tool-show-mode.test.js.map +1 -0
  56. package/dist/__tests__/tool.test.d.ts +15 -0
  57. package/dist/__tests__/tool.test.d.ts.map +1 -0
  58. package/dist/__tests__/tool.test.js +250 -0
  59. package/dist/__tests__/tool.test.js.map +1 -0
  60. package/dist/cli/__tests__/sim-config.test.d.ts +2 -0
  61. package/dist/cli/__tests__/sim-config.test.d.ts.map +1 -0
  62. package/dist/cli/__tests__/sim-config.test.js +94 -0
  63. package/dist/cli/__tests__/sim-config.test.js.map +1 -0
  64. package/dist/cli/__tests__/sim-runner.test.d.ts +23 -0
  65. package/dist/cli/__tests__/sim-runner.test.d.ts.map +1 -0
  66. package/dist/cli/__tests__/sim-runner.test.js +188 -0
  67. package/dist/cli/__tests__/sim-runner.test.js.map +1 -0
  68. package/dist/cli/__tests__/sim-worker.test.d.ts +12 -0
  69. package/dist/cli/__tests__/sim-worker.test.d.ts.map +1 -0
  70. package/dist/cli/__tests__/sim-worker.test.js +69 -0
  71. package/dist/cli/__tests__/sim-worker.test.js.map +1 -0
  72. package/dist/cli/__tests__/sim.test.d.ts +2 -0
  73. package/dist/cli/__tests__/sim.test.d.ts.map +1 -0
  74. package/dist/cli/__tests__/sim.test.js +232 -0
  75. package/dist/cli/__tests__/sim.test.js.map +1 -0
  76. package/dist/cli/sim-config-schema.d.ts +30 -0
  77. package/dist/cli/sim-config-schema.d.ts.map +1 -0
  78. package/dist/cli/sim-config-schema.js +33 -0
  79. package/dist/cli/sim-config-schema.js.map +1 -0
  80. package/dist/cli/sim-config.d.ts +22 -0
  81. package/dist/cli/sim-config.d.ts.map +1 -0
  82. package/dist/cli/sim-config.js +73 -0
  83. package/dist/cli/sim-config.js.map +1 -0
  84. package/dist/cli/sim-runner.d.ts +60 -0
  85. package/dist/cli/sim-runner.d.ts.map +1 -0
  86. package/dist/cli/sim-runner.js +175 -0
  87. package/dist/cli/sim-runner.js.map +1 -0
  88. package/dist/cli/sim-worker.d.ts +24 -0
  89. package/dist/cli/sim-worker.d.ts.map +1 -0
  90. package/dist/cli/sim-worker.js +65 -0
  91. package/dist/cli/sim-worker.js.map +1 -0
  92. package/dist/cli/sim.d.ts +56 -0
  93. package/dist/cli/sim.d.ts.map +1 -0
  94. package/dist/cli/sim.js +265 -0
  95. package/dist/cli/sim.js.map +1 -0
  96. package/dist/framework/__tests__/assertions.test.d.ts +2 -0
  97. package/dist/framework/__tests__/assertions.test.d.ts.map +1 -0
  98. package/dist/framework/__tests__/assertions.test.js +122 -0
  99. package/dist/framework/__tests__/assertions.test.js.map +1 -0
  100. package/dist/framework/__tests__/misc-coverage.test.d.ts +18 -0
  101. package/dist/framework/__tests__/misc-coverage.test.d.ts.map +1 -0
  102. package/dist/framework/__tests__/misc-coverage.test.js +142 -0
  103. package/dist/framework/__tests__/misc-coverage.test.js.map +1 -0
  104. package/dist/framework/__tests__/resolve-metric.test.d.ts +12 -0
  105. package/dist/framework/__tests__/resolve-metric.test.d.ts.map +1 -0
  106. package/dist/framework/__tests__/resolve-metric.test.js +124 -0
  107. package/dist/framework/__tests__/resolve-metric.test.js.map +1 -0
  108. package/dist/framework/__tests__/result-builder.test.d.ts +2 -0
  109. package/dist/framework/__tests__/result-builder.test.d.ts.map +1 -0
  110. package/dist/framework/__tests__/result-builder.test.js +180 -0
  111. package/dist/framework/__tests__/result-builder.test.js.map +1 -0
  112. package/dist/framework/__tests__/scenario-logger.test.d.ts +9 -0
  113. package/dist/framework/__tests__/scenario-logger.test.d.ts.map +1 -0
  114. package/dist/framework/__tests__/scenario-logger.test.js +110 -0
  115. package/dist/framework/__tests__/scenario-logger.test.js.map +1 -0
  116. package/dist/framework/__tests__/validation.test.d.ts +9 -0
  117. package/dist/framework/__tests__/validation.test.d.ts.map +1 -0
  118. package/dist/framework/__tests__/validation.test.js +126 -0
  119. package/dist/framework/__tests__/validation.test.js.map +1 -0
  120. package/dist/framework/assertions.d.ts +106 -0
  121. package/dist/framework/assertions.d.ts.map +1 -0
  122. package/dist/framework/assertions.js +256 -0
  123. package/dist/framework/assertions.js.map +1 -0
  124. package/dist/framework/execution/__tests__/execution-engine.test.d.ts +9 -0
  125. package/dist/framework/execution/__tests__/execution-engine.test.d.ts.map +1 -0
  126. package/dist/framework/execution/__tests__/execution-engine.test.js +138 -0
  127. package/dist/framework/execution/__tests__/execution-engine.test.js.map +1 -0
  128. package/dist/framework/execution/__tests__/fault-builders.test.d.ts +5 -0
  129. package/dist/framework/execution/__tests__/fault-builders.test.d.ts.map +1 -0
  130. package/dist/framework/execution/__tests__/fault-builders.test.js +23 -0
  131. package/dist/framework/execution/__tests__/fault-builders.test.js.map +1 -0
  132. package/dist/framework/execution/__tests__/fault-model.test.d.ts +6 -0
  133. package/dist/framework/execution/__tests__/fault-model.test.d.ts.map +1 -0
  134. package/dist/framework/execution/__tests__/fault-model.test.js +64 -0
  135. package/dist/framework/execution/__tests__/fault-model.test.js.map +1 -0
  136. package/dist/framework/execution/__tests__/http-target.test.d.ts +5 -0
  137. package/dist/framework/execution/__tests__/http-target.test.d.ts.map +1 -0
  138. package/dist/framework/execution/__tests__/http-target.test.js +36 -0
  139. package/dist/framework/execution/__tests__/http-target.test.js.map +1 -0
  140. package/dist/framework/execution/__tests__/run-load-window.test.d.ts +7 -0
  141. package/dist/framework/execution/__tests__/run-load-window.test.d.ts.map +1 -0
  142. package/dist/framework/execution/__tests__/run-load-window.test.js +89 -0
  143. package/dist/framework/execution/__tests__/run-load-window.test.js.map +1 -0
  144. package/dist/framework/execution/execution-engine.d.ts +55 -0
  145. package/dist/framework/execution/execution-engine.d.ts.map +1 -0
  146. package/dist/framework/execution/execution-engine.js +111 -0
  147. package/dist/framework/execution/execution-engine.js.map +1 -0
  148. package/dist/framework/execution/fault-builders.d.ts +26 -0
  149. package/dist/framework/execution/fault-builders.d.ts.map +1 -0
  150. package/dist/framework/execution/fault-builders.js +24 -0
  151. package/dist/framework/execution/fault-builders.js.map +1 -0
  152. package/dist/framework/execution/fault-model.d.ts +49 -0
  153. package/dist/framework/execution/fault-model.d.ts.map +1 -0
  154. package/dist/framework/execution/fault-model.js +108 -0
  155. package/dist/framework/execution/fault-model.js.map +1 -0
  156. package/dist/framework/execution/fault-spec.d.ts +40 -0
  157. package/dist/framework/execution/fault-spec.d.ts.map +1 -0
  158. package/dist/framework/execution/fault-spec.js +23 -0
  159. package/dist/framework/execution/fault-spec.js.map +1 -0
  160. package/dist/framework/execution/http-target.d.ts +34 -0
  161. package/dist/framework/execution/http-target.d.ts.map +1 -0
  162. package/dist/framework/execution/http-target.js +41 -0
  163. package/dist/framework/execution/http-target.js.map +1 -0
  164. package/dist/framework/execution/latency-tracker.d.ts +44 -0
  165. package/dist/framework/execution/latency-tracker.d.ts.map +1 -0
  166. package/dist/framework/execution/latency-tracker.js +76 -0
  167. package/dist/framework/execution/latency-tracker.js.map +1 -0
  168. package/dist/framework/execution/run-load-window.d.ts +45 -0
  169. package/dist/framework/execution/run-load-window.d.ts.map +1 -0
  170. package/dist/framework/execution/run-load-window.js +136 -0
  171. package/dist/framework/execution/run-load-window.js.map +1 -0
  172. package/dist/framework/execution/scenario-aborted-error.d.ts +14 -0
  173. package/dist/framework/execution/scenario-aborted-error.d.ts.map +1 -0
  174. package/dist/framework/execution/scenario-aborted-error.js +24 -0
  175. package/dist/framework/execution/scenario-aborted-error.js.map +1 -0
  176. package/dist/framework/execution/target.d.ts +35 -0
  177. package/dist/framework/execution/target.d.ts.map +1 -0
  178. package/dist/framework/execution/target.js +21 -0
  179. package/dist/framework/execution/target.js.map +1 -0
  180. package/dist/framework/registry.d.ts +67 -0
  181. package/dist/framework/registry.d.ts.map +1 -0
  182. package/dist/framework/registry.js +113 -0
  183. package/dist/framework/registry.js.map +1 -0
  184. package/dist/framework/resolve-metric.d.ts +79 -0
  185. package/dist/framework/resolve-metric.d.ts.map +1 -0
  186. package/dist/framework/resolve-metric.js +135 -0
  187. package/dist/framework/resolve-metric.js.map +1 -0
  188. package/dist/framework/result-builder.d.ts +72 -0
  189. package/dist/framework/result-builder.d.ts.map +1 -0
  190. package/dist/framework/result-builder.js +214 -0
  191. package/dist/framework/result-builder.js.map +1 -0
  192. package/dist/framework/result-renderers.d.ts +37 -0
  193. package/dist/framework/result-renderers.d.ts.map +1 -0
  194. package/dist/framework/result-renderers.js +62 -0
  195. package/dist/framework/result-renderers.js.map +1 -0
  196. package/dist/framework/runnable-scenario.d.ts +37 -0
  197. package/dist/framework/runnable-scenario.d.ts.map +1 -0
  198. package/dist/framework/runnable-scenario.js +9 -0
  199. package/dist/framework/runnable-scenario.js.map +1 -0
  200. package/dist/framework/scenario-executor-result.d.ts +44 -0
  201. package/dist/framework/scenario-executor-result.d.ts.map +1 -0
  202. package/dist/framework/scenario-executor-result.js +13 -0
  203. package/dist/framework/scenario-executor-result.js.map +1 -0
  204. package/dist/framework/scenario-logger.d.ts +18 -0
  205. package/dist/framework/scenario-logger.d.ts.map +1 -0
  206. package/dist/framework/scenario-logger.js +39 -0
  207. package/dist/framework/scenario-logger.js.map +1 -0
  208. package/dist/framework/scenario-metric-key.d.ts +24 -0
  209. package/dist/framework/scenario-metric-key.d.ts.map +1 -0
  210. package/dist/framework/scenario-metric-key.js +17 -0
  211. package/dist/framework/scenario-metric-key.js.map +1 -0
  212. package/dist/framework/validation.d.ts +83 -0
  213. package/dist/framework/validation.d.ts.map +1 -0
  214. package/dist/framework/validation.js +93 -0
  215. package/dist/framework/validation.js.map +1 -0
  216. package/dist/index.d.ts +35 -0
  217. package/dist/index.d.ts.map +1 -0
  218. package/dist/index.js +53 -0
  219. package/dist/index.js.map +1 -0
  220. package/dist/internal.d.ts +19 -0
  221. package/dist/internal.d.ts.map +1 -0
  222. package/dist/internal.js +16 -0
  223. package/dist/internal.js.map +1 -0
  224. package/dist/kinds/chaos/__tests__/executor.test.d.ts +6 -0
  225. package/dist/kinds/chaos/__tests__/executor.test.d.ts.map +1 -0
  226. package/dist/kinds/chaos/__tests__/executor.test.js +117 -0
  227. package/dist/kinds/chaos/__tests__/executor.test.js.map +1 -0
  228. package/dist/kinds/chaos/config.d.ts +48 -0
  229. package/dist/kinds/chaos/config.d.ts.map +1 -0
  230. package/dist/kinds/chaos/config.js +15 -0
  231. package/dist/kinds/chaos/config.js.map +1 -0
  232. package/dist/kinds/chaos/define.d.ts +32 -0
  233. package/dist/kinds/chaos/define.d.ts.map +1 -0
  234. package/dist/kinds/chaos/define.js +111 -0
  235. package/dist/kinds/chaos/define.js.map +1 -0
  236. package/dist/kinds/chaos/executor.d.ts +21 -0
  237. package/dist/kinds/chaos/executor.d.ts.map +1 -0
  238. package/dist/kinds/chaos/executor.js +107 -0
  239. package/dist/kinds/chaos/executor.js.map +1 -0
  240. package/dist/kinds/chaos/result.d.ts +43 -0
  241. package/dist/kinds/chaos/result.d.ts.map +1 -0
  242. package/dist/kinds/chaos/result.js +12 -0
  243. package/dist/kinds/chaos/result.js.map +1 -0
  244. package/dist/kinds/load/__tests__/executor.test.d.ts +6 -0
  245. package/dist/kinds/load/__tests__/executor.test.d.ts.map +1 -0
  246. package/dist/kinds/load/__tests__/executor.test.js +75 -0
  247. package/dist/kinds/load/__tests__/executor.test.js.map +1 -0
  248. package/dist/kinds/load/config.d.ts +30 -0
  249. package/dist/kinds/load/config.d.ts.map +1 -0
  250. package/dist/kinds/load/config.js +9 -0
  251. package/dist/kinds/load/config.js.map +1 -0
  252. package/dist/kinds/load/define.d.ts +47 -0
  253. package/dist/kinds/load/define.d.ts.map +1 -0
  254. package/dist/kinds/load/define.js +76 -0
  255. package/dist/kinds/load/define.js.map +1 -0
  256. package/dist/kinds/load/executor.d.ts +16 -0
  257. package/dist/kinds/load/executor.d.ts.map +1 -0
  258. package/dist/kinds/load/executor.js +90 -0
  259. package/dist/kinds/load/executor.js.map +1 -0
  260. package/dist/kinds/load/result.d.ts +21 -0
  261. package/dist/kinds/load/result.d.ts.map +1 -0
  262. package/dist/kinds/load/result.js +10 -0
  263. package/dist/kinds/load/result.js.map +1 -0
  264. package/dist/persistence/session-payload.d.ts +32 -0
  265. package/dist/persistence/session-payload.d.ts.map +1 -0
  266. package/dist/persistence/session-payload.js +46 -0
  267. package/dist/persistence/session-payload.js.map +1 -0
  268. package/dist/persistence/session-replay.d.ts +13 -0
  269. package/dist/persistence/session-replay.d.ts.map +1 -0
  270. package/dist/persistence/session-replay.js +76 -0
  271. package/dist/persistence/session-replay.js.map +1 -0
  272. package/dist/persistence/session-replay.test.d.ts +10 -0
  273. package/dist/persistence/session-replay.test.d.ts.map +1 -0
  274. package/dist/persistence/session-replay.test.js +169 -0
  275. package/dist/persistence/session-replay.test.js.map +1 -0
  276. package/dist/plugins/__tests__/loader-scenarios.test.d.ts +12 -0
  277. package/dist/plugins/__tests__/loader-scenarios.test.d.ts.map +1 -0
  278. package/dist/plugins/__tests__/loader-scenarios.test.js +61 -0
  279. package/dist/plugins/__tests__/loader-scenarios.test.js.map +1 -0
  280. package/dist/plugins/__tests__/scenario-package-discovery.test.d.ts +2 -0
  281. package/dist/plugins/__tests__/scenario-package-discovery.test.d.ts.map +1 -0
  282. package/dist/plugins/__tests__/scenario-package-discovery.test.js +43 -0
  283. package/dist/plugins/__tests__/scenario-package-discovery.test.js.map +1 -0
  284. package/dist/plugins/loader.d.ts +32 -0
  285. package/dist/plugins/loader.d.ts.map +1 -0
  286. package/dist/plugins/loader.js +119 -0
  287. package/dist/plugins/loader.js.map +1 -0
  288. package/dist/plugins/scenario-package-discovery.d.ts +23 -0
  289. package/dist/plugins/scenario-package-discovery.d.ts.map +1 -0
  290. package/dist/plugins/scenario-package-discovery.js +42 -0
  291. package/dist/plugins/scenario-package-discovery.js.map +1 -0
  292. package/dist/plugins/types.d.ts +24 -0
  293. package/dist/plugins/types.d.ts.map +1 -0
  294. package/dist/plugins/types.js +18 -0
  295. package/dist/plugins/types.js.map +1 -0
  296. package/dist/recipes/__tests__/recipes.test.d.ts +2 -0
  297. package/dist/recipes/__tests__/recipes.test.d.ts.map +1 -0
  298. package/dist/recipes/__tests__/recipes.test.js +515 -0
  299. package/dist/recipes/__tests__/recipes.test.js.map +1 -0
  300. package/dist/recipes/built-in-recipes.d.ts +16 -0
  301. package/dist/recipes/built-in-recipes.d.ts.map +1 -0
  302. package/dist/recipes/built-in-recipes.js +37 -0
  303. package/dist/recipes/built-in-recipes.js.map +1 -0
  304. package/dist/recipes/define-recipe.d.ts +29 -0
  305. package/dist/recipes/define-recipe.d.ts.map +1 -0
  306. package/dist/recipes/define-recipe.js +68 -0
  307. package/dist/recipes/define-recipe.js.map +1 -0
  308. package/dist/recipes/registry.d.ts +54 -0
  309. package/dist/recipes/registry.d.ts.map +1 -0
  310. package/dist/recipes/registry.js +89 -0
  311. package/dist/recipes/registry.js.map +1 -0
  312. package/dist/recipes/service.d.ts +61 -0
  313. package/dist/recipes/service.d.ts.map +1 -0
  314. package/dist/recipes/service.js +205 -0
  315. package/dist/recipes/service.js.map +1 -0
  316. package/dist/recipes/types.d.ts +62 -0
  317. package/dist/recipes/types.d.ts.map +1 -0
  318. package/dist/recipes/types.js +10 -0
  319. package/dist/recipes/types.js.map +1 -0
  320. package/dist/scaffold/examples.d.ts +22 -0
  321. package/dist/scaffold/examples.d.ts.map +1 -0
  322. package/dist/scaffold/examples.js +91 -0
  323. package/dist/scaffold/examples.js.map +1 -0
  324. package/dist/scope-augmentation.d.ts +70 -0
  325. package/dist/scope-augmentation.d.ts.map +1 -0
  326. package/dist/scope-augmentation.js +28 -0
  327. package/dist/scope-augmentation.js.map +1 -0
  328. package/dist/tool.d.ts +21 -0
  329. package/dist/tool.d.ts.map +1 -0
  330. package/dist/tool.js +347 -0
  331. package/dist/tool.js.map +1 -0
  332. package/dist/types/base-types.d.ts +35 -0
  333. package/dist/types/base-types.d.ts.map +1 -0
  334. package/dist/types/base-types.js +8 -0
  335. package/dist/types/base-types.js.map +1 -0
  336. package/dist/types/framework-types.d.ts +62 -0
  337. package/dist/types/framework-types.d.ts.map +1 -0
  338. package/dist/types/framework-types.js +15 -0
  339. package/dist/types/framework-types.js.map +1 -0
  340. package/dist/types/kind-types.d.ts +24 -0
  341. package/dist/types/kind-types.d.ts.map +1 -0
  342. package/dist/types/kind-types.js +22 -0
  343. package/dist/types/kind-types.js.map +1 -0
  344. package/dist/types/workload.d.ts +30 -0
  345. package/dist/types/workload.d.ts.map +1 -0
  346. package/dist/types/workload.js +20 -0
  347. package/dist/types/workload.js.map +1 -0
  348. package/package.json +120 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @fileoverview `httpTarget` — an HTTP `Target` factory.
3
+ *
4
+ * The smallest BYO seam is a function, but most users point at an HTTP
5
+ * endpoint. `httpTarget` wraps the built-in `fetch` (Node 24+) into a `Target`:
6
+ * it forwards `ctx.signal` (so scenario abort + `abort` faults cancel the
7
+ * request) and **throws on a non-OK status** so the driver classifies it as a
8
+ * failure.
9
+ *
10
+ * Point this only at a target you own. For server-side fault injection (kill a
11
+ * dependency, force 500s), put a fault-injectable proxy (e.g. Toxiproxy) in
12
+ * front and aim `httpTarget` at the proxy — the harness drives and measures
13
+ * around it.
14
+ */
15
+ const defaultOk = (status) => status >= 200 && status < 300;
16
+ /** Build an HTTP {@link Target} from a URL + method/headers/body. */
17
+ export function httpTarget(opts) {
18
+ const isOk = opts.okStatus ?? defaultOk;
19
+ /** @throws {Error} When the response status is not OK (per `isOk`). */
20
+ async function request(ctx) {
21
+ // @fitness-ignore-next-line no-raw-fetch -- BYO HTTP target for the chaos/load harness; raw fetch is the measured surface, abort handled via ctx.signal
22
+ const res = await fetch(opts.url, {
23
+ method: opts.method ?? 'GET',
24
+ headers: opts.headers,
25
+ body: opts.body,
26
+ signal: ctx.signal,
27
+ });
28
+ // Drain the body so the socket is freed even though we ignore the payload.
29
+ try {
30
+ await res.arrayBuffer();
31
+ }
32
+ catch {
33
+ // @swallow-ok best-effort body drain; already-consumed or aborted bodies are fine to ignore.
34
+ }
35
+ if (!isOk(res.status)) {
36
+ throw new Error(`httpTarget: ${opts.url} returned ${res.status}`);
37
+ }
38
+ }
39
+ return request;
40
+ }
41
+ //# sourceMappingURL=http-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-target.js","sourceRoot":"","sources":["../../../src/framework/execution/http-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqBH,MAAM,SAAS,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;AAE7E,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,IAAuB;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC;IACxC,uEAAuE;IACvE,KAAK,UAAU,OAAO,CAAC,GAAkB;QACvC,wJAAwJ;QACxJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC;QACH,2EAA2E;QAC3E,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,6FAA6F;QAC/F,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,GAAG,aAAa,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @fileoverview Latency tracker for real percentile computation
3
+ *
4
+ * All samples are stored for accurate percentile computation.
5
+ * Sorted cache is invalidated when new samples are added.
6
+ * Percentiles use linear interpolation between nearest values.
7
+ *
8
+ * Suitable for simulation-scale workloads (hundreds to low thousands of samples).
9
+ * For workloads exceeding ~100k samples, consider a streaming percentile
10
+ * algorithm (e.g., t-digest or HDR histogram).
11
+ */
12
+ export declare class LatencyTracker {
13
+ private samples;
14
+ private sorted;
15
+ private sum;
16
+ /**
17
+ * Record a latency sample.
18
+ * @param latencyMs - Latency value in milliseconds
19
+ */
20
+ record(latencyMs: number): void;
21
+ /** Get the number of recorded samples. */
22
+ get count(): number;
23
+ /** Get the average latency. */
24
+ get average(): number;
25
+ /**
26
+ * Compute a percentile value using linear interpolation.
27
+ * @param p - Percentile (0-100), e.g., 50, 95, 99
28
+ * @returns The latency value at the given percentile, or 0 if no samples
29
+ */
30
+ getPercentile(p: number): number;
31
+ /**
32
+ * Get a latency snapshot compatible with SimulationMetrics fields.
33
+ */
34
+ getLatencySnapshot(): {
35
+ avgLatencyMs: number;
36
+ p50LatencyMs: number;
37
+ p95LatencyMs: number;
38
+ p99LatencyMs: number;
39
+ };
40
+ /** Reset all tracked samples. */
41
+ reset(): void;
42
+ private getSorted;
43
+ }
44
+ //# sourceMappingURL=latency-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-tracker.d.ts","sourceRoot":"","sources":["../../../src/framework/execution/latency-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,GAAG,CAAK;IAEhB;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM/B,0CAA0C;IAC1C,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,+BAA+B;IAC/B,IAAI,OAAO,IAAI,MAAM,CAGpB;IAED;;;;OAIG;IACH,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAehC;;OAEG;IACH,kBAAkB,IAAI;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB;IASD,iCAAiC;IACjC,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,SAAS;CAIlB"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @fileoverview Latency tracker for real percentile computation
3
+ *
4
+ * All samples are stored for accurate percentile computation.
5
+ * Sorted cache is invalidated when new samples are added.
6
+ * Percentiles use linear interpolation between nearest values.
7
+ *
8
+ * Suitable for simulation-scale workloads (hundreds to low thousands of samples).
9
+ * For workloads exceeding ~100k samples, consider a streaming percentile
10
+ * algorithm (e.g., t-digest or HDR histogram).
11
+ */
12
+ export class LatencyTracker {
13
+ samples = [];
14
+ sorted = null;
15
+ sum = 0;
16
+ /**
17
+ * Record a latency sample.
18
+ * @param latencyMs - Latency value in milliseconds
19
+ */
20
+ record(latencyMs) {
21
+ this.samples.push(latencyMs);
22
+ this.sum += latencyMs;
23
+ this.sorted = null;
24
+ }
25
+ /** Get the number of recorded samples. */
26
+ get count() {
27
+ return this.samples.length;
28
+ }
29
+ /** Get the average latency. */
30
+ get average() {
31
+ if (this.samples.length === 0)
32
+ return 0;
33
+ return this.sum / this.samples.length;
34
+ }
35
+ /**
36
+ * Compute a percentile value using linear interpolation.
37
+ * @param p - Percentile (0-100), e.g., 50, 95, 99
38
+ * @returns The latency value at the given percentile, or 0 if no samples
39
+ */
40
+ getPercentile(p) {
41
+ if (this.samples.length === 0)
42
+ return 0;
43
+ if (this.samples.length === 1)
44
+ return this.samples[0] ?? 0;
45
+ const sorted = this.getSorted();
46
+ const index = (p / 100) * (sorted.length - 1);
47
+ const lower = Math.floor(index);
48
+ const upper = Math.ceil(index);
49
+ if (lower === upper)
50
+ return sorted[lower] ?? 0;
51
+ const fraction = index - lower;
52
+ return (sorted[lower] ?? 0) * (1 - fraction) + (sorted[upper] ?? 0) * fraction;
53
+ }
54
+ /**
55
+ * Get a latency snapshot compatible with SimulationMetrics fields.
56
+ */
57
+ getLatencySnapshot() {
58
+ return {
59
+ avgLatencyMs: this.average,
60
+ p50LatencyMs: this.getPercentile(50),
61
+ p95LatencyMs: this.getPercentile(95),
62
+ p99LatencyMs: this.getPercentile(99),
63
+ };
64
+ }
65
+ /** Reset all tracked samples. */
66
+ reset() {
67
+ this.samples.length = 0;
68
+ this.sorted = null;
69
+ this.sum = 0;
70
+ }
71
+ getSorted() {
72
+ this.sorted ??= [...this.samples].sort((a, b) => a - b);
73
+ return this.sorted;
74
+ }
75
+ }
76
+ //# sourceMappingURL=latency-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-tracker.js","sourceRoot":"","sources":["../../../src/framework/execution/latency-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAa,EAAE,CAAC;IACvB,MAAM,GAAoB,IAAI,CAAC;IAC/B,GAAG,GAAG,CAAC,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,SAAiB;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,IAAI,SAAS,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,0CAA0C;IAC1C,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,+BAA+B;IAC/B,IAAI,OAAO;QACT,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,CAAS;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE3D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,kBAAkB;QAMhB,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;SACrC,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACf,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @fileoverview Shared load-window driver used by the load and chaos kinds.
3
+ *
4
+ * Both kinds run a tick-driven RPS loop with ramp-up and latency tracking that
5
+ * issues **real requests** against a user-supplied {@link Target}: each request
6
+ * is awaited, timed, and classified from resolve (success) / throw (failure).
7
+ * Requests are dispatched concurrently up to the workload's in-flight cap so
8
+ * real latency overlaps instead of serializing.
9
+ *
10
+ * The driver is fault-agnostic. The chaos kind injects faults by wrapping its
11
+ * `Target` with the fault model (`fault-model.ts`) before handing it here — the
12
+ * driver just drives whatever `Target` it is given. Centralising the loop here
13
+ * keeps both kinds on one real driver (the Template Method shape: kinds supply
14
+ * the `Target`, the framework owns the loop lifecycle).
15
+ */
16
+ import type { Target } from './target.js';
17
+ import type { SimulationMetrics } from '../../types/base-types.js';
18
+ import type { ScenarioExecutionContext } from '../../types/framework-types.js';
19
+ import type { Workload } from '../../types/workload.js';
20
+ /** Subset of a kind config the load-window driver actually consumes. */
21
+ export interface LoadWindowConfig {
22
+ readonly workload: Workload;
23
+ }
24
+ /** Options passed to `runLoadWindow`. */
25
+ export interface RunLoadWindowOptions {
26
+ /** Duration the window runs for, in milliseconds. */
27
+ readonly windowMs: number;
28
+ /** The (possibly fault-decorated) target driven once per request. */
29
+ readonly target: Target;
30
+ }
31
+ /** Aggregated outcome of a single load window. */
32
+ export interface LoadWindowResult {
33
+ readonly metrics: SimulationMetrics;
34
+ }
35
+ /**
36
+ * Run a single load-style window against a real `Target`.
37
+ *
38
+ * Per request: time the awaited `target` call, count success on resolve and
39
+ * failure on throw (including aborts), and record the measured latency. The
40
+ * driver paces toward `workload.rps` with optional ramp-up and never exceeds
41
+ * `resolveConcurrency(workload)` in-flight requests. In-flight requests are
42
+ * drained before the latency snapshot is taken so it reflects the full window.
43
+ */
44
+ export declare function runLoadWindow(config: LoadWindowConfig, context: ScenarioExecutionContext, options: RunLoadWindowOptions): Promise<LoadWindowResult>;
45
+ //# sourceMappingURL=run-load-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-load-window.d.ts","sourceRoot":"","sources":["../../../src/framework/execution/run-load-window.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAMxD,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAgFD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAmD3B"}
@@ -0,0 +1,136 @@
1
+ // @fitness-ignore-file detached-promises -- the driver intentionally dispatches in-flight requests and tracks them in a Set, draining via Promise.allSettled
2
+ /**
3
+ * @fileoverview Shared load-window driver used by the load and chaos kinds.
4
+ *
5
+ * Both kinds run a tick-driven RPS loop with ramp-up and latency tracking that
6
+ * issues **real requests** against a user-supplied {@link Target}: each request
7
+ * is awaited, timed, and classified from resolve (success) / throw (failure).
8
+ * Requests are dispatched concurrently up to the workload's in-flight cap so
9
+ * real latency overlaps instead of serializing.
10
+ *
11
+ * The driver is fault-agnostic. The chaos kind injects faults by wrapping its
12
+ * `Target` with the fault model (`fault-model.ts`) before handing it here — the
13
+ * driver just drives whatever `Target` it is given. Centralising the loop here
14
+ * keeps both kinds on one real driver (the Template Method shape: kinds supply
15
+ * the `Target`, the framework owns the loop lifecycle).
16
+ */
17
+ import { resolveConcurrency } from '../../types/workload.js';
18
+ import { LatencyTracker } from './latency-tracker.js';
19
+ // =============================================================================
20
+ // IMPLEMENTATION
21
+ // =============================================================================
22
+ const TICK_INTERVAL_MS = 100;
23
+ function createMetrics() {
24
+ return {
25
+ totalRequests: 0,
26
+ successfulRequests: 0,
27
+ failedRequests: 0,
28
+ avgLatencyMs: 0,
29
+ p50LatencyMs: 0,
30
+ p95LatencyMs: 0,
31
+ p99LatencyMs: 0,
32
+ errorsGenerated: 0,
33
+ };
34
+ }
35
+ function sleepTick(intervalMs, signal) {
36
+ return new Promise((resolve) => {
37
+ if (signal.aborted) {
38
+ resolve();
39
+ return;
40
+ }
41
+ const timeout = setTimeout(() => {
42
+ signal.removeEventListener('abort', onAbort);
43
+ resolve();
44
+ }, intervalMs);
45
+ const onAbort = () => {
46
+ clearTimeout(timeout);
47
+ resolve();
48
+ };
49
+ signal.addEventListener('abort', onAbort, { once: true });
50
+ });
51
+ }
52
+ /** Issue one request: time it, classify resolve/throw, track it in-flight. */
53
+ function dispatchRequest(state) {
54
+ const { target, context, metrics, latencyTracker, inFlight } = state;
55
+ const t0 = Date.now();
56
+ metrics.totalRequests++;
57
+ const run = (async () => {
58
+ try {
59
+ await target({ signal: context.abortSignal, correlationId: context.correlationId });
60
+ metrics.successfulRequests++;
61
+ }
62
+ catch {
63
+ metrics.failedRequests++;
64
+ metrics.errorsGenerated++;
65
+ }
66
+ finally {
67
+ latencyTracker.record(Date.now() - t0);
68
+ }
69
+ })();
70
+ inFlight.add(run);
71
+ void run.finally(() => inFlight.delete(run));
72
+ }
73
+ /** Block until fewer than `cap` requests are in flight (or the run aborts). */
74
+ async function awaitBelowCap(inFlight, cap, signal) {
75
+ while (inFlight.size >= cap && !signal.aborted) {
76
+ // @fitness-ignore-next-line performance-anti-patterns -- back-pressure gate: blocks until the fastest in-flight request settles to free a concurrency slot; parallelizing defeats the cap
77
+ await Promise.race(inFlight);
78
+ }
79
+ }
80
+ /**
81
+ * Run a single load-style window against a real `Target`.
82
+ *
83
+ * Per request: time the awaited `target` call, count success on resolve and
84
+ * failure on throw (including aborts), and record the measured latency. The
85
+ * driver paces toward `workload.rps` with optional ramp-up and never exceeds
86
+ * `resolveConcurrency(workload)` in-flight requests. In-flight requests are
87
+ * drained before the latency snapshot is taken so it reflects the full window.
88
+ */
89
+ export async function runLoadWindow(config, context, options) {
90
+ const { workload } = config;
91
+ const targetRps = workload.rps;
92
+ const maxInFlight = resolveConcurrency(workload);
93
+ const metrics = createMetrics();
94
+ const latencyTracker = new LatencyTracker();
95
+ const inFlight = new Set();
96
+ const state = {
97
+ target: options.target,
98
+ context,
99
+ metrics,
100
+ latencyTracker,
101
+ inFlight,
102
+ };
103
+ const start = Date.now();
104
+ const rampUpMs = (workload.rampUp ?? 0) * 1000;
105
+ let fractionalRequests = 0; // carry for low/non-integer rps across ticks
106
+ while (Date.now() - start < options.windowMs && !context.abortSignal.aborted) {
107
+ const elapsed = Date.now() - start;
108
+ const rampUpProgress = rampUpMs > 0 ? Math.min(1, elapsed / rampUpMs) : 1;
109
+ // Use fractional accumulator so low rps (e.g. 5) or non-integer rates don't floor to 0 requests
110
+ // every tick. Each tick we add the due fraction; floor gives whole requests this tick,
111
+ // remainder carries forward. This fixes under-delivery / zero-work for rps < 10 (100ms tick).
112
+ // (See AUDIT-FINDINGS and original correctness audit.)
113
+ const dueThisTick = (targetRps * rampUpProgress) / (1000 / TICK_INTERVAL_MS);
114
+ fractionalRequests += dueThisTick;
115
+ const requestsThisTick = Math.floor(fractionalRequests);
116
+ fractionalRequests -= requestsThisTick;
117
+ for (let i = 0; i < requestsThisTick; i++) {
118
+ // Backpressure: block until below the in-flight cap, which paces RPS
119
+ // toward what latency + concurrency actually allow.
120
+ await awaitBelowCap(inFlight, maxInFlight, context.abortSignal);
121
+ if (context.abortSignal.aborted)
122
+ break;
123
+ dispatchRequest(state);
124
+ }
125
+ await sleepTick(TICK_INTERVAL_MS, context.abortSignal);
126
+ }
127
+ // Drain any still-in-flight requests so the latency snapshot covers them.
128
+ await Promise.allSettled(inFlight);
129
+ const snapshot = latencyTracker.getLatencySnapshot();
130
+ metrics.avgLatencyMs = snapshot.avgLatencyMs;
131
+ metrics.p50LatencyMs = snapshot.p50LatencyMs;
132
+ metrics.p95LatencyMs = snapshot.p95LatencyMs;
133
+ metrics.p99LatencyMs = snapshot.p99LatencyMs;
134
+ return { metrics };
135
+ }
136
+ //# sourceMappingURL=run-load-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-load-window.js","sourceRoot":"","sources":["../../../src/framework/execution/run-load-window.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview ScenarioAbortedError - extracted to break circular dependency
3
+ * between action-handlers.ts and execution-engine.ts.
4
+ */
5
+ import { SystemError } from '@opensip-cli/core';
6
+ /**
7
+ * Error thrown when a scenario is aborted via AbortSignal.
8
+ * This error must ALWAYS be re-thrown, never swallowed.
9
+ */
10
+ export declare class ScenarioAbortedError extends SystemError {
11
+ readonly scenarioId: string | undefined;
12
+ constructor(scenarioId?: string);
13
+ }
14
+ //# sourceMappingURL=scenario-aborted-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-aborted-error.d.ts","sourceRoot":"","sources":["../../../src/framework/execution/scenario-aborted-error.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE5B,UAAU,CAAC,EAAE,MAAM;CAUhC"}
@@ -0,0 +1,24 @@
1
+ // @fitness-ignore-file project-readme-existence -- internal module, not a package root
2
+ /**
3
+ * @fileoverview ScenarioAbortedError - extracted to break circular dependency
4
+ * between action-handlers.ts and execution-engine.ts.
5
+ */
6
+ import { SystemError } from '@opensip-cli/core';
7
+ /**
8
+ * Error thrown when a scenario is aborted via AbortSignal.
9
+ * This error must ALWAYS be re-thrown, never swallowed.
10
+ */
11
+ export class ScenarioAbortedError extends SystemError {
12
+ scenarioId;
13
+ constructor(scenarioId) {
14
+ super(scenarioId ? `Scenario ${scenarioId} was aborted` : 'Scenario was aborted', {
15
+ code: 'SIMULATION.SCENARIO.ABORTED',
16
+ severity: 'medium',
17
+ metadata: scenarioId ? { scenarioId } : {},
18
+ });
19
+ this.name = 'ScenarioAbortedError';
20
+ this.scenarioId = scenarioId;
21
+ Object.setPrototypeOf(this, ScenarioAbortedError.prototype);
22
+ }
23
+ }
24
+ //# sourceMappingURL=scenario-aborted-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-aborted-error.js","sourceRoot":"","sources":["../../../src/framework/execution/scenario-aborted-error.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IAC1C,UAAU,CAAqB;IAExC,YAAY,UAAmB;QAC7B,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,UAAU,cAAc,CAAC,CAAC,CAAC,sBAAsB,EAAE;YAChF,IAAI,EAAE,6BAA6B;YACnC,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;SAC3C,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @fileoverview `Target` — the BYO (bring-your-own) seam for the simulation
3
+ * harness.
4
+ *
5
+ * A `Target` is the single outside-world contract: the load-window driver calls
6
+ * it once per request. It is intentionally protocol-agnostic — an `async`
7
+ * function that **resolves on success and throws on failure**. The harness
8
+ * measures wall-clock latency around the call and classifies the outcome from
9
+ * resolve/throw. HTTP users reach for the `httpTarget()` helper, but any async
10
+ * function (gRPC, in-process, a shell-out) is a valid target.
11
+ *
12
+ * A well-behaved target passes `ctx.signal` to its I/O and rejects when the
13
+ * signal aborts (scenario abort + `abort` faults rely on this). The fault model
14
+ * additionally guarantees an `abort` fault counts as a failure even for a
15
+ * target that ignores the signal (see `fault-model.ts`).
16
+ *
17
+ * This is a leaf module: it imports nothing from the type or runtime layers so
18
+ * the driver, fault model, and helpers can depend on it without cycles.
19
+ */
20
+ /** Context handed to a `Target` for each request. */
21
+ export interface TargetContext {
22
+ /** Abort signal for the request; aborts on scenario abort or an `abort` fault. */
23
+ readonly signal: AbortSignal;
24
+ /** Correlation id for the enclosing scenario run. */
25
+ readonly correlationId: string;
26
+ }
27
+ /**
28
+ * A user-supplied target the driver invokes once per request.
29
+ *
30
+ * Resolve = the request succeeded. Throw (or reject on `ctx.signal` abort) =
31
+ * the request failed. The harness times the call and never inspects a return
32
+ * value, so `Promise<void>` is the whole contract.
33
+ */
34
+ export type Target = (ctx: TargetContext) => Promise<void>;
35
+ //# sourceMappingURL=target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../../src/framework/execution/target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @fileoverview `Target` — the BYO (bring-your-own) seam for the simulation
3
+ * harness.
4
+ *
5
+ * A `Target` is the single outside-world contract: the load-window driver calls
6
+ * it once per request. It is intentionally protocol-agnostic — an `async`
7
+ * function that **resolves on success and throws on failure**. The harness
8
+ * measures wall-clock latency around the call and classifies the outcome from
9
+ * resolve/throw. HTTP users reach for the `httpTarget()` helper, but any async
10
+ * function (gRPC, in-process, a shell-out) is a valid target.
11
+ *
12
+ * A well-behaved target passes `ctx.signal` to its I/O and rejects when the
13
+ * signal aborts (scenario abort + `abort` faults rely on this). The fault model
14
+ * additionally guarantees an `abort` fault counts as a failure even for a
15
+ * target that ignores the signal (see `fault-model.ts`).
16
+ *
17
+ * This is a leaf module: it imports nothing from the type or runtime layers so
18
+ * the driver, fault model, and helpers can depend on it without cycles.
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../../../src/framework/execution/target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview Cross-kind scenario registry — per-RunScope.
3
+ *
4
+ * Each `RunScope` owns its own `Registry<RunnableScenario>` (Item 1 /
5
+ * D7 — tool subscopes via module augmentation).
6
+ * The simulation tool's `contributeScope` hook constructs a fresh registry
7
+ * per CLI invocation and attaches it to `scope.simulation.scenarios`.
8
+ *
9
+ * Built on the kernel's unified `Registry<T>` with
10
+ * `duplicatePolicy: 'silent-skip'` (re-importing the same scenario is a
11
+ * no-op) + `nameCollisionMode: 'throw'` (two different scenario ids
12
+ * sharing a name would corrupt the dual-key state). This is the same
13
+ * shape the legacy `IdNameTagRegistry` provided (which has been deleted).
14
+ *
15
+ * Public API:
16
+ * - `createScenarioRegistry()` — factory used by `contributeScope`.
17
+ * - `currentScenarioRegistry()` — reads the scope-bound registry;
18
+ * throws when called outside a scope
19
+ * or when `simulation` subscope is
20
+ * absent.
21
+ * - `getRegisteredScenarios()` / `getScenario` / `getScenariosByTag` /
22
+ * `getScenariosByKind` / `clearScenarioRegistry` — thin helpers that
23
+ * route through the scope-bound registry.
24
+ */
25
+ import { Registry } from '@opensip-cli/core';
26
+ import type { RunnableScenario } from './runnable-scenario.js';
27
+ import type { SimulationLoadState } from '../scope-augmentation.js';
28
+ import type { ScenarioKind } from '../types/kind-types.js';
29
+ /** Construct a fresh `ensureScenariosLoaded` lifecycle slot for a single `RunScope` (audit F1). */
30
+ export declare function createSimulationLoadState(): SimulationLoadState;
31
+ /**
32
+ * Read the current scope's simulation load state (`scope.simulation.load`).
33
+ * Throws when no scope/subscope is active — same contract as
34
+ * {@link currentScenarioRegistry}.
35
+ *
36
+ * @throws {Error} When called outside `runWithScope(...)`, or when the active
37
+ * scope has no simulation subscope.
38
+ */
39
+ export declare function currentSimulationLoadState(): SimulationLoadState;
40
+ /** Construct a fresh scenario registry for a single `RunScope`. */
41
+ export declare function createScenarioRegistry(): Registry<RunnableScenario>;
42
+ /**
43
+ * Read the current scope's scenario registry. Throws when no scope is
44
+ * active or when the simulation subscope is missing — both indicate the
45
+ * caller is running outside the CLI's pre-action-hook (or the test
46
+ * fixture forgot to construct + enter a scope).
47
+ *
48
+ * @throws {Error} When called outside `runWithScope(...)`, or when the
49
+ * active scope has no simulation subscope.
50
+ */
51
+ export declare function currentScenarioRegistry(): Registry<RunnableScenario>;
52
+ /** Get all registered scenarios from the current scope's registry. */
53
+ export declare function getRegisteredScenarios(): Map<string, RunnableScenario>;
54
+ /** Get a scenario by id or name from the current scope's registry. */
55
+ export declare function getScenario(idOrName: string): RunnableScenario | undefined;
56
+ /** Get scenarios filtered by tag (any kind). */
57
+ export declare function getScenariosByTag(tag: string): readonly RunnableScenario[];
58
+ /** Get scenarios filtered by kind. */
59
+ export declare function getScenariosByKind(kind: ScenarioKind): RunnableScenario[];
60
+ /**
61
+ * Clear the current scope's scenario registry. Used by tests, by host
62
+ * applications that need to swap the scenario set at runtime, and by
63
+ * recipe-reset code paths. The simulation engine's plugin loader
64
+ * re-populates it on the next load cycle.
65
+ */
66
+ export declare function clearScenarioRegistry(): void;
67
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/framework/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,QAAQ,EAAgB,MAAM,mBAAmB,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,mGAAmG;AACnG,wBAAgB,yBAAyB,IAAI,mBAAmB,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,IAAI,mBAAmB,CAUhE;AAED,mEAAmE;AACnE,wBAAgB,sBAAsB,IAAI,QAAQ,CAAC,gBAAgB,CAAC,CAQnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,IAAI,QAAQ,CAAC,gBAAgB,CAAC,CAmBpE;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAMtE;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE1E;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,gBAAgB,EAAE,CAE1E;AAED,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,gBAAgB,EAAE,CAIzE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}