@probelabs/visor 0.1.106 → 0.1.111

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 (530) hide show
  1. package/README.md +71 -2
  2. package/action.yml +1 -1
  3. package/defaults/code-refiner.yaml +114 -0
  4. package/defaults/{.visor.yaml → code-review.yaml} +35 -226
  5. package/defaults/override.yaml +52 -0
  6. package/defaults/task-refinement.yaml +624 -0
  7. package/defaults/visor.tests.yaml +685 -0
  8. package/defaults/visor.yaml +483 -0
  9. package/dist/action-cli-bridge.d.ts +11 -82
  10. package/dist/action-cli-bridge.d.ts.map +1 -1
  11. package/dist/ai-review-service.d.ts +28 -9
  12. package/dist/ai-review-service.d.ts.map +1 -1
  13. package/dist/check-execution-engine.d.ts +19 -331
  14. package/dist/check-execution-engine.d.ts.map +1 -1
  15. package/dist/cli-main.d.ts.map +1 -1
  16. package/dist/cli.d.ts +0 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/config.d.ts +16 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/cron-scheduler.d.ts +3 -3
  21. package/dist/cron-scheduler.d.ts.map +1 -1
  22. package/dist/debug-visualizer/ws-server.d.ts +7 -1
  23. package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
  24. package/dist/defaults/code-refiner.yaml +114 -0
  25. package/dist/defaults/{.visor.yaml → code-review.yaml} +35 -226
  26. package/dist/defaults/override.yaml +52 -0
  27. package/dist/defaults/task-refinement.yaml +624 -0
  28. package/dist/defaults/visor.tests.yaml +685 -0
  29. package/dist/defaults/visor.yaml +483 -0
  30. package/dist/docs/DEPLOYMENT.md +118 -0
  31. package/dist/docs/GITHUB_CHECKS.md +280 -0
  32. package/dist/docs/NPM_USAGE.md +208 -0
  33. package/dist/docs/action-reference.md +19 -0
  34. package/dist/docs/advanced-ai.md +237 -0
  35. package/dist/docs/ai-configuration.md +535 -0
  36. package/dist/docs/ai-custom-tools-usage.md +261 -0
  37. package/dist/docs/ai-custom-tools.md +392 -0
  38. package/dist/docs/author-permissions.md +610 -0
  39. package/dist/docs/bot-transports-rfc.md +23 -0
  40. package/dist/docs/ci-cli-mode.md +34 -0
  41. package/dist/docs/claude-code.md +74 -0
  42. package/dist/docs/command-provider.md +559 -0
  43. package/dist/docs/commands.md +8 -0
  44. package/dist/docs/configuration.md +324 -0
  45. package/dist/docs/custom-tools.md +424 -0
  46. package/dist/docs/dashboards/README.md +23 -0
  47. package/dist/docs/dashboards/grafana-visor-diagrams.json +20 -0
  48. package/dist/docs/dashboards/grafana-visor-overview.json +33 -0
  49. package/dist/docs/debug-visualizer-progress.md +572 -0
  50. package/dist/docs/debug-visualizer-rfc.md +691 -0
  51. package/dist/docs/debug-visualizer.md +114 -0
  52. package/dist/docs/debugging.md +636 -0
  53. package/dist/docs/default-output-schema.md +28 -0
  54. package/dist/docs/dependencies.md +369 -0
  55. package/dist/docs/dev-playbook.md +9 -0
  56. package/dist/docs/engine-pause-resume-rfc.md +192 -0
  57. package/dist/docs/engine-state-machine-plan.md +333 -0
  58. package/dist/docs/event-driven-github-integration-rfc.md +743 -0
  59. package/dist/docs/event-triggers.md +292 -0
  60. package/dist/docs/execution-statistics-rfc.md +290 -0
  61. package/dist/docs/fact-validator-gap-analysis.md +178 -0
  62. package/dist/docs/fact-validator-implementation-plan.md +1235 -0
  63. package/dist/docs/fail-if.md +95 -0
  64. package/dist/docs/failure-conditions-implementation.md +271 -0
  65. package/dist/docs/failure-conditions-schema.md +173 -0
  66. package/dist/docs/failure-routing-rfc.md +193 -0
  67. package/dist/docs/failure-routing.md +507 -0
  68. package/dist/docs/foreach-dependency-propagation.md +473 -0
  69. package/dist/docs/github-ops.md +89 -0
  70. package/dist/docs/goto-forward-run-plan.md +113 -0
  71. package/dist/docs/guides/criticality-modes.md +332 -0
  72. package/dist/docs/guides/fault-management-and-contracts.md +738 -0
  73. package/dist/docs/guides/workflow-style-guide.md +224 -0
  74. package/dist/docs/http.md +299 -0
  75. package/dist/docs/human-input-provider.md +372 -0
  76. package/dist/docs/lifecycle-hooks.md +253 -0
  77. package/dist/docs/limits.md +64 -0
  78. package/dist/docs/liquid-templates.md +490 -0
  79. package/dist/docs/loop-routing-refactor.md +89 -0
  80. package/dist/docs/mcp-provider.md +557 -0
  81. package/dist/docs/mcp.md +124 -0
  82. package/dist/docs/memory.md +903 -0
  83. package/dist/docs/observability.md +12 -0
  84. package/dist/docs/output-formats.md +20 -0
  85. package/dist/docs/output-formatting.md +29 -0
  86. package/dist/docs/output-history.md +383 -0
  87. package/dist/docs/performance.md +6 -0
  88. package/dist/docs/pluggable.md +124 -0
  89. package/dist/docs/proposals/snapshot-scope-execution.md +236 -0
  90. package/dist/docs/providers/git-checkout.md +589 -0
  91. package/dist/docs/recipes.md +474 -0
  92. package/dist/docs/rfc/git-checkout-step.md +601 -0
  93. package/dist/docs/rfc/on_init-hook.md +1294 -0
  94. package/dist/docs/rfc/workspace-isolation.md +216 -0
  95. package/dist/docs/roadmap/criticality-implementation-tasks.md +92 -0
  96. package/dist/docs/router-patterns.md +339 -0
  97. package/dist/docs/schema-next-pr.md +10 -0
  98. package/dist/docs/schema-templates.md +68 -0
  99. package/dist/docs/script.md +34 -0
  100. package/dist/docs/sdk.md +222 -0
  101. package/dist/docs/security.md +7 -0
  102. package/dist/docs/suppressions.md +89 -0
  103. package/dist/docs/tag-filtering.md +258 -0
  104. package/dist/docs/telemetry-setup.md +119 -0
  105. package/dist/docs/telemetry-tracing-rfc.md +275 -0
  106. package/dist/docs/test-framework-rfc.md +680 -0
  107. package/dist/docs/testing/assertions.md +85 -0
  108. package/dist/docs/testing/ci.md +44 -0
  109. package/dist/docs/testing/cli.md +41 -0
  110. package/dist/docs/testing/cookbook.md +172 -0
  111. package/dist/docs/testing/dsl-reference.md +199 -0
  112. package/dist/docs/testing/fixtures-and-mocks.md +91 -0
  113. package/dist/docs/testing/flows.md +92 -0
  114. package/dist/docs/testing/getting-started.md +93 -0
  115. package/dist/docs/testing/troubleshooting.md +55 -0
  116. package/dist/docs/timeouts.md +50 -0
  117. package/dist/docs/troubleshooting.md +7 -0
  118. package/dist/docs/visor-sdk-rfc.md +186 -0
  119. package/dist/docs/workflows.md +569 -0
  120. package/dist/engine/on-finish/orchestrator.d.ts +19 -0
  121. package/dist/engine/on-finish/orchestrator.d.ts.map +1 -0
  122. package/dist/engine/on-finish/utils.d.ts +44 -0
  123. package/dist/engine/on-finish/utils.d.ts.map +1 -0
  124. package/dist/event-bus/event-bus.d.ts +13 -0
  125. package/dist/event-bus/event-bus.d.ts.map +1 -0
  126. package/dist/event-bus/types.d.ts +71 -0
  127. package/dist/event-bus/types.d.ts.map +1 -0
  128. package/dist/examples/.claude/agents/code-reviewer.md +69 -0
  129. package/dist/examples/.mcp.json +34 -0
  130. package/dist/examples/CALCULATOR-SDK.md +364 -0
  131. package/dist/examples/README.md +384 -0
  132. package/dist/examples/ai-custom-tools-example.yaml +206 -0
  133. package/dist/examples/ai-custom-tools-simple.yaml +76 -0
  134. package/dist/examples/ai-retry-fallback-config.yaml +180 -0
  135. package/dist/examples/ai-with-bash.yaml +126 -0
  136. package/dist/examples/ai-with-mcp.yaml +82 -0
  137. package/dist/examples/basic-human-input.yaml +15 -0
  138. package/dist/examples/bedrock-config.yaml +77 -0
  139. package/dist/examples/calculator-config.yaml +133 -0
  140. package/dist/examples/calculator-json-output-guide.md +311 -0
  141. package/dist/examples/calculator-sdk-automated.ts +340 -0
  142. package/dist/examples/calculator-sdk-example.ts +275 -0
  143. package/dist/examples/calculator-sdk-json.ts +331 -0
  144. package/dist/examples/calculator-sdk-real.ts +374 -0
  145. package/dist/examples/calculator-sdk-test.ts +148 -0
  146. package/dist/examples/claude-code-config.yaml +191 -0
  147. package/dist/examples/cron-webhook-config.yaml +215 -0
  148. package/dist/examples/custom-template.liquid +57 -0
  149. package/dist/examples/custom-tools-example.yaml +281 -0
  150. package/dist/examples/enhanced-config.yaml +165 -0
  151. package/dist/examples/environments/visor.base.yaml +92 -0
  152. package/dist/examples/environments/visor.dev.yaml +33 -0
  153. package/dist/examples/environments/visor.prod.yaml +95 -0
  154. package/dist/examples/environments/visor.staging.yaml +46 -0
  155. package/dist/examples/fact-validator.yaml +361 -0
  156. package/dist/examples/fail-if-simple.yaml +90 -0
  157. package/dist/examples/failure-conditions-advanced.yaml +136 -0
  158. package/dist/examples/failure-conditions-basic.yaml +48 -0
  159. package/dist/examples/failure-conditions-github-style.yaml +119 -0
  160. package/dist/examples/failure-conditions-migration.yaml +74 -0
  161. package/dist/examples/for-loop-example.yaml +176 -0
  162. package/dist/examples/forEach-example.yaml +120 -0
  163. package/dist/examples/git-checkout-basic.yaml +32 -0
  164. package/dist/examples/git-checkout-compare.yaml +59 -0
  165. package/dist/examples/git-checkout-cross-repo.yaml +76 -0
  166. package/dist/examples/github-workflow-with-tags.yml +163 -0
  167. package/dist/examples/http-integration-config.yaml +240 -0
  168. package/dist/examples/https-server-config.yaml +209 -0
  169. package/dist/examples/human-input-example.yaml +63 -0
  170. package/dist/examples/if-conditions.yaml +173 -0
  171. package/dist/examples/jira-simple-example.yaml +56 -0
  172. package/dist/examples/jira-single-issue-workflow.yaml +166 -0
  173. package/dist/examples/jira-workflow-mcp.yaml +182 -0
  174. package/dist/examples/mcp/analyzer.py +119 -0
  175. package/dist/examples/mcp-provider-example.yaml +301 -0
  176. package/dist/examples/memory-counter.yaml +99 -0
  177. package/dist/examples/memory-error-collection.yaml +104 -0
  178. package/dist/examples/memory-exec-js.yaml +247 -0
  179. package/dist/examples/memory-namespace-isolation.yaml +184 -0
  180. package/dist/examples/memory-retry-counter.yaml +65 -0
  181. package/dist/examples/memory-state-machine.yaml +170 -0
  182. package/dist/examples/on-init-import-demo.yaml +179 -0
  183. package/dist/examples/outputs-raw-basic.yaml +26 -0
  184. package/dist/examples/project-with-tools.yaml +174 -0
  185. package/dist/examples/prompts/architecture-analysis.liquid +116 -0
  186. package/dist/examples/prompts/security-comprehensive.liquid +107 -0
  187. package/dist/examples/quick-start-tags.yaml +53 -0
  188. package/dist/examples/reusable-tools.yaml +92 -0
  189. package/dist/examples/reusable-workflows.yaml +88 -0
  190. package/dist/examples/routing-basic.yaml +35 -0
  191. package/dist/examples/routing-dynamic-js.yaml +46 -0
  192. package/dist/examples/routing-foreach.yaml +34 -0
  193. package/dist/examples/routing-goto-event.yaml +34 -0
  194. package/dist/examples/routing-on-success.yaml +25 -0
  195. package/dist/examples/run-calculator-demo.sh +71 -0
  196. package/dist/examples/sdk-basic.mjs +10 -0
  197. package/dist/examples/sdk-cjs.cjs +10 -0
  198. package/dist/examples/sdk-comprehensive.mjs +175 -0
  199. package/dist/examples/sdk-manual-config.mjs +65 -0
  200. package/dist/examples/sdk-typescript.js +81 -0
  201. package/dist/examples/sdk-typescript.ts +92 -0
  202. package/dist/examples/session-reuse-config.yaml +151 -0
  203. package/dist/examples/session-reuse-self.yaml +81 -0
  204. package/dist/examples/slack-simple-chat.yaml +775 -0
  205. package/dist/examples/templates/security-report.liquid +137 -0
  206. package/dist/examples/tools-library.yaml +281 -0
  207. package/dist/examples/transform-example.yaml +199 -0
  208. package/dist/examples/visor-with-tags.yaml +198 -0
  209. package/dist/examples/webhook-pipeline-config.yaml +218 -0
  210. package/dist/examples/workflows/calculator-workflow.yaml +163 -0
  211. package/dist/examples/workflows/code-quality.yaml +222 -0
  212. package/dist/examples/workflows/quick-pr-check.yaml +90 -0
  213. package/dist/examples/workflows/workflow-composition-example.yaml +130 -0
  214. package/dist/failure-condition-evaluator.d.ts +3 -0
  215. package/dist/failure-condition-evaluator.d.ts.map +1 -1
  216. package/dist/frontends/github-frontend.d.ts +58 -0
  217. package/dist/frontends/github-frontend.d.ts.map +1 -0
  218. package/dist/frontends/host.d.ts +47 -0
  219. package/dist/frontends/host.d.ts.map +1 -0
  220. package/dist/frontends/ndjson-sink.d.ts +12 -0
  221. package/dist/frontends/ndjson-sink.d.ts.map +1 -0
  222. package/dist/frontends/slack-frontend.d.ts +58 -0
  223. package/dist/frontends/slack-frontend.d.ts.map +1 -0
  224. package/dist/generated/config-schema.d.ts +967 -57
  225. package/dist/generated/config-schema.d.ts.map +1 -1
  226. package/dist/generated/config-schema.json +1033 -56
  227. package/dist/github-check-service.d.ts +4 -6
  228. package/dist/github-check-service.d.ts.map +1 -1
  229. package/dist/github-comments.d.ts +2 -4
  230. package/dist/github-comments.d.ts.map +1 -1
  231. package/dist/index.d.ts.map +1 -1
  232. package/dist/index.js +134327 -99004
  233. package/dist/liquid-extensions.d.ts.map +1 -1
  234. package/dist/logger.d.ts +2 -0
  235. package/dist/logger.d.ts.map +1 -1
  236. package/dist/memory-store.d.ts +6 -0
  237. package/dist/memory-store.d.ts.map +1 -1
  238. package/dist/output/assistant-json/template.liquid +0 -0
  239. package/dist/output/traces/run-2026-01-20T19-22-58-043Z.ndjson +138 -0
  240. package/dist/output/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
  241. package/dist/output-formatters.d.ts +1 -1
  242. package/dist/output-formatters.d.ts.map +1 -1
  243. package/dist/providers/ai-check-provider.d.ts +12 -0
  244. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  245. package/dist/providers/check-provider-registry.d.ts +6 -0
  246. package/dist/providers/check-provider-registry.d.ts.map +1 -1
  247. package/dist/providers/check-provider.interface.d.ts +43 -1
  248. package/dist/providers/check-provider.interface.d.ts.map +1 -1
  249. package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
  250. package/dist/providers/command-check-provider.d.ts +1 -1
  251. package/dist/providers/command-check-provider.d.ts.map +1 -1
  252. package/dist/providers/custom-tool-executor.d.ts +61 -0
  253. package/dist/providers/custom-tool-executor.d.ts.map +1 -0
  254. package/dist/providers/git-checkout-provider.d.ts +25 -0
  255. package/dist/providers/git-checkout-provider.d.ts.map +1 -0
  256. package/dist/providers/github-ops-provider.d.ts.map +1 -1
  257. package/dist/providers/http-client-provider.d.ts +4 -4
  258. package/dist/providers/http-client-provider.d.ts.map +1 -1
  259. package/dist/providers/human-input-check-provider.d.ts +5 -0
  260. package/dist/providers/human-input-check-provider.d.ts.map +1 -1
  261. package/dist/providers/index.d.ts +1 -0
  262. package/dist/providers/index.d.ts.map +1 -1
  263. package/dist/providers/log-check-provider.d.ts +2 -5
  264. package/dist/providers/log-check-provider.d.ts.map +1 -1
  265. package/dist/providers/mcp-check-provider.d.ts +10 -4
  266. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  267. package/dist/providers/mcp-custom-sse-server.d.ts +66 -0
  268. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -0
  269. package/dist/providers/memory-check-provider.d.ts +2 -8
  270. package/dist/providers/memory-check-provider.d.ts.map +1 -1
  271. package/dist/providers/script-check-provider.d.ts +25 -0
  272. package/dist/providers/script-check-provider.d.ts.map +1 -0
  273. package/dist/providers/workflow-check-provider.d.ts +56 -0
  274. package/dist/providers/workflow-check-provider.d.ts.map +1 -0
  275. package/dist/reviewer.d.ts +2 -1
  276. package/dist/reviewer.d.ts.map +1 -1
  277. package/dist/sdk/check-provider-registry-534KL5HT.mjs +27 -0
  278. package/dist/sdk/chunk-23L3QRYX.mjs +16872 -0
  279. package/dist/sdk/chunk-23L3QRYX.mjs.map +1 -0
  280. package/dist/sdk/{chunk-TUTOLSFV.mjs → chunk-3OMWVM6J.mjs} +11 -1
  281. package/dist/sdk/chunk-3OMWVM6J.mjs.map +1 -0
  282. package/dist/sdk/chunk-7UK3NIIT.mjs +482 -0
  283. package/dist/sdk/chunk-7UK3NIIT.mjs.map +1 -0
  284. package/dist/sdk/chunk-AGIZJ4UZ.mjs +173 -0
  285. package/dist/sdk/chunk-AGIZJ4UZ.mjs.map +1 -0
  286. package/dist/sdk/chunk-AIVFBIS4.mjs +1371 -0
  287. package/dist/sdk/chunk-AIVFBIS4.mjs.map +1 -0
  288. package/dist/sdk/chunk-AK6BVWIT.mjs +426 -0
  289. package/dist/sdk/chunk-AK6BVWIT.mjs.map +1 -0
  290. package/dist/sdk/chunk-AUT26LHW.mjs +139 -0
  291. package/dist/sdk/chunk-AUT26LHW.mjs.map +1 -0
  292. package/dist/sdk/chunk-BOVFH3LI.mjs +232 -0
  293. package/dist/sdk/chunk-BOVFH3LI.mjs.map +1 -0
  294. package/dist/sdk/chunk-CNX7V5JK.mjs +89 -0
  295. package/dist/sdk/chunk-CNX7V5JK.mjs.map +1 -0
  296. package/dist/sdk/chunk-HTOKWMPO.mjs +157 -0
  297. package/dist/sdk/chunk-HTOKWMPO.mjs.map +1 -0
  298. package/dist/sdk/chunk-NAW3DB3I.mjs +197 -0
  299. package/dist/sdk/chunk-NAW3DB3I.mjs.map +1 -0
  300. package/dist/sdk/chunk-O5EZDNYL.mjs +274 -0
  301. package/dist/sdk/chunk-O5EZDNYL.mjs.map +1 -0
  302. package/dist/sdk/chunk-QR7MOMJH.mjs +558 -0
  303. package/dist/sdk/chunk-QR7MOMJH.mjs.map +1 -0
  304. package/dist/sdk/chunk-QY2XYPEV.mjs +3556 -0
  305. package/dist/sdk/chunk-QY2XYPEV.mjs.map +1 -0
  306. package/dist/sdk/chunk-S2RUE2RG.mjs +145 -0
  307. package/dist/sdk/chunk-S2RUE2RG.mjs.map +1 -0
  308. package/dist/sdk/chunk-SIWNBRTK.mjs +800 -0
  309. package/dist/sdk/chunk-SIWNBRTK.mjs.map +1 -0
  310. package/dist/sdk/chunk-YSN4G6CI.mjs +146 -0
  311. package/dist/sdk/chunk-YSN4G6CI.mjs.map +1 -0
  312. package/dist/sdk/chunk-ZYAUYXSW.mjs +206 -0
  313. package/dist/sdk/chunk-ZYAUYXSW.mjs.map +1 -0
  314. package/dist/sdk/command-executor-TYUV6HUS.mjs +14 -0
  315. package/dist/sdk/config-YNC2EOOT.mjs +16 -0
  316. package/dist/sdk/config-merger-PX3WIT57.mjs +10 -0
  317. package/dist/sdk/event-bus-5BEVPQ6T.mjs +35 -0
  318. package/dist/sdk/event-bus-5BEVPQ6T.mjs.map +1 -0
  319. package/dist/sdk/failure-condition-evaluator-YGTF2GHG.mjs +17 -0
  320. package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs +458 -0
  321. package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs.map +1 -0
  322. package/dist/sdk/github-frontend-SIAEOCON.mjs +1420 -0
  323. package/dist/sdk/github-frontend-SIAEOCON.mjs.map +1 -0
  324. package/dist/sdk/host-DXUYTNMU.mjs +52 -0
  325. package/dist/sdk/host-DXUYTNMU.mjs.map +1 -0
  326. package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs → liquid-extensions-PKWCKK7E.mjs} +8 -2
  327. package/dist/sdk/memory-store-XGBB7LX7.mjs +12 -0
  328. package/dist/sdk/memory-store-XGBB7LX7.mjs.map +1 -0
  329. package/dist/sdk/metrics-7PP3EJUH.mjs +29 -0
  330. package/dist/sdk/metrics-7PP3EJUH.mjs.map +1 -0
  331. package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs +44 -0
  332. package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs.map +1 -0
  333. package/dist/sdk/prompt-state-YRJY6QAL.mjs +16 -0
  334. package/dist/sdk/prompt-state-YRJY6QAL.mjs.map +1 -0
  335. package/dist/sdk/renderer-schema-LPKN5UJS.mjs +51 -0
  336. package/dist/sdk/renderer-schema-LPKN5UJS.mjs.map +1 -0
  337. package/dist/sdk/routing-6N45MJ4F.mjs +24 -0
  338. package/dist/sdk/routing-6N45MJ4F.mjs.map +1 -0
  339. package/dist/sdk/sdk.d.mts +541 -22
  340. package/dist/sdk/sdk.d.ts +541 -22
  341. package/dist/sdk/sdk.js +27963 -16505
  342. package/dist/sdk/sdk.js.map +1 -1
  343. package/dist/sdk/sdk.mjs +1116 -2169
  344. package/dist/sdk/sdk.mjs.map +1 -1
  345. package/dist/sdk/session-registry-4E6YRQ77.mjs +10 -0
  346. package/dist/sdk/session-registry-4E6YRQ77.mjs.map +1 -0
  347. package/dist/sdk/slack-frontend-BVKW3GD5.mjs +735 -0
  348. package/dist/sdk/slack-frontend-BVKW3GD5.mjs.map +1 -0
  349. package/dist/sdk/trace-helpers-VP6QYVBX.mjs +23 -0
  350. package/dist/sdk/trace-helpers-VP6QYVBX.mjs.map +1 -0
  351. package/dist/sdk/{tracer-init-WC75N5NW.mjs → tracer-init-GSLPPLCD.mjs} +2 -2
  352. package/dist/sdk/tracer-init-GSLPPLCD.mjs.map +1 -0
  353. package/dist/sdk/workflow-registry-R6KSACFR.mjs +12 -0
  354. package/dist/sdk/workflow-registry-R6KSACFR.mjs.map +1 -0
  355. package/dist/sdk.d.ts.map +1 -1
  356. package/dist/slack/adapter.d.ts +36 -0
  357. package/dist/slack/adapter.d.ts.map +1 -0
  358. package/dist/slack/cache-prewarmer.d.ts +31 -0
  359. package/dist/slack/cache-prewarmer.d.ts.map +1 -0
  360. package/dist/slack/client.d.ts +77 -0
  361. package/dist/slack/client.d.ts.map +1 -0
  362. package/dist/slack/markdown.d.ts +45 -0
  363. package/dist/slack/markdown.d.ts.map +1 -0
  364. package/dist/slack/prompt-state.d.ts +33 -0
  365. package/dist/slack/prompt-state.d.ts.map +1 -0
  366. package/dist/slack/rate-limiter.d.ts +56 -0
  367. package/dist/slack/rate-limiter.d.ts.map +1 -0
  368. package/dist/slack/signature.d.ts +2 -0
  369. package/dist/slack/signature.d.ts.map +1 -0
  370. package/dist/slack/socket-runner.d.ts +42 -0
  371. package/dist/slack/socket-runner.d.ts.map +1 -0
  372. package/dist/slack/thread-cache.d.ts +51 -0
  373. package/dist/slack/thread-cache.d.ts.map +1 -0
  374. package/dist/snapshot-store.d.ts +59 -0
  375. package/dist/snapshot-store.d.ts.map +1 -0
  376. package/dist/state-machine/context/build-engine-context.d.ts +17 -0
  377. package/dist/state-machine/context/build-engine-context.d.ts.map +1 -0
  378. package/dist/state-machine/dispatch/dependency-gating.d.ts +12 -0
  379. package/dist/state-machine/dispatch/dependency-gating.d.ts.map +1 -0
  380. package/dist/state-machine/dispatch/execution-invoker.d.ts +14 -0
  381. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -0
  382. package/dist/state-machine/dispatch/foreach-processor.d.ts +8 -0
  383. package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -0
  384. package/dist/state-machine/dispatch/history-snapshot.d.ts +8 -0
  385. package/dist/state-machine/dispatch/history-snapshot.d.ts.map +1 -0
  386. package/dist/state-machine/dispatch/on-init-handlers.d.ts +43 -0
  387. package/dist/state-machine/dispatch/on-init-handlers.d.ts.map +1 -0
  388. package/dist/state-machine/dispatch/renderer-schema.d.ts +8 -0
  389. package/dist/state-machine/dispatch/renderer-schema.d.ts.map +1 -0
  390. package/dist/state-machine/dispatch/stats-manager.d.ts +15 -0
  391. package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -0
  392. package/dist/state-machine/dispatch/template-renderer.d.ts +7 -0
  393. package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -0
  394. package/dist/state-machine/execution/summary.d.ts +8 -0
  395. package/dist/state-machine/execution/summary.d.ts.map +1 -0
  396. package/dist/state-machine/runner.d.ts +79 -0
  397. package/dist/state-machine/runner.d.ts.map +1 -0
  398. package/dist/state-machine/states/check-running.d.ts +14 -0
  399. package/dist/state-machine/states/check-running.d.ts.map +1 -0
  400. package/dist/state-machine/states/completed.d.ts +12 -0
  401. package/dist/state-machine/states/completed.d.ts.map +1 -0
  402. package/dist/state-machine/states/error.d.ts +11 -0
  403. package/dist/state-machine/states/error.d.ts.map +1 -0
  404. package/dist/state-machine/states/init.d.ts +11 -0
  405. package/dist/state-machine/states/init.d.ts.map +1 -0
  406. package/dist/state-machine/states/level-dispatch.d.ts +17 -0
  407. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -0
  408. package/dist/state-machine/states/plan-ready.d.ts +12 -0
  409. package/dist/state-machine/states/plan-ready.d.ts.map +1 -0
  410. package/dist/state-machine/states/routing.d.ts +52 -0
  411. package/dist/state-machine/states/routing.d.ts.map +1 -0
  412. package/dist/state-machine/states/wave-planning.d.ts +14 -0
  413. package/dist/state-machine/states/wave-planning.d.ts.map +1 -0
  414. package/dist/state-machine/workflow-projection.d.ts +47 -0
  415. package/dist/state-machine/workflow-projection.d.ts.map +1 -0
  416. package/dist/state-machine-execution-engine.d.ts +159 -0
  417. package/dist/state-machine-execution-engine.d.ts.map +1 -0
  418. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  419. package/dist/telemetry/state-capture.d.ts +5 -0
  420. package/dist/telemetry/state-capture.d.ts.map +1 -1
  421. package/dist/test-runner/assertions.d.ts +59 -0
  422. package/dist/test-runner/assertions.d.ts.map +1 -0
  423. package/dist/test-runner/core/environment.d.ts +8 -0
  424. package/dist/test-runner/core/environment.d.ts.map +1 -0
  425. package/dist/test-runner/core/fixture.d.ts +3 -0
  426. package/dist/test-runner/core/fixture.d.ts.map +1 -0
  427. package/dist/test-runner/core/flow-stage.d.ts +32 -0
  428. package/dist/test-runner/core/flow-stage.d.ts.map +1 -0
  429. package/dist/test-runner/core/mocks.d.ts +8 -0
  430. package/dist/test-runner/core/mocks.d.ts.map +1 -0
  431. package/dist/test-runner/core/test-execution-wrapper.d.ts +18 -0
  432. package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -0
  433. package/dist/test-runner/evaluators.d.ts +45 -0
  434. package/dist/test-runner/evaluators.d.ts.map +1 -0
  435. package/dist/test-runner/fixture-loader.d.ts +30 -0
  436. package/dist/test-runner/fixture-loader.d.ts.map +1 -0
  437. package/dist/test-runner/index.d.ts +127 -0
  438. package/dist/test-runner/index.d.ts.map +1 -0
  439. package/dist/test-runner/recorders/github-recorder.d.ts +23 -0
  440. package/dist/test-runner/recorders/github-recorder.d.ts.map +1 -0
  441. package/dist/test-runner/recorders/global-recorder.d.ts +4 -0
  442. package/dist/test-runner/recorders/global-recorder.d.ts.map +1 -0
  443. package/dist/test-runner/recorders/slack-recorder.d.ts +17 -0
  444. package/dist/test-runner/recorders/slack-recorder.d.ts.map +1 -0
  445. package/dist/test-runner/utils/selectors.d.ts +2 -0
  446. package/dist/test-runner/utils/selectors.d.ts.map +1 -0
  447. package/dist/test-runner/validator.d.ts +8 -0
  448. package/dist/test-runner/validator.d.ts.map +1 -0
  449. package/dist/traces/run-2026-01-20T19-22-58-043Z.ndjson +138 -0
  450. package/dist/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
  451. package/dist/types/bot.d.ts +109 -0
  452. package/dist/types/bot.d.ts.map +1 -0
  453. package/dist/types/cli.d.ts +8 -1
  454. package/dist/types/cli.d.ts.map +1 -1
  455. package/dist/types/config.d.ts +459 -9
  456. package/dist/types/config.d.ts.map +1 -1
  457. package/dist/types/engine.d.ts +177 -0
  458. package/dist/types/engine.d.ts.map +1 -0
  459. package/dist/types/execution.d.ts +73 -0
  460. package/dist/types/execution.d.ts.map +1 -0
  461. package/dist/types/git-checkout.d.ts +76 -0
  462. package/dist/types/git-checkout.d.ts.map +1 -0
  463. package/dist/types/github.d.ts +51 -0
  464. package/dist/types/github.d.ts.map +1 -0
  465. package/dist/types/workflow.d.ts +237 -0
  466. package/dist/types/workflow.d.ts.map +1 -0
  467. package/dist/utils/command-executor.d.ts +43 -0
  468. package/dist/utils/command-executor.d.ts.map +1 -0
  469. package/dist/utils/comment-metadata.d.ts +21 -0
  470. package/dist/utils/comment-metadata.d.ts.map +1 -0
  471. package/dist/utils/config-loader.d.ts.map +1 -1
  472. package/dist/utils/config-merger.d.ts.map +1 -1
  473. package/dist/utils/env-exposure.d.ts +3 -0
  474. package/dist/utils/env-exposure.d.ts.map +1 -0
  475. package/dist/utils/file-exclusion.d.ts.map +1 -1
  476. package/dist/utils/interactive-prompt.d.ts +1 -1
  477. package/dist/utils/interactive-prompt.d.ts.map +1 -1
  478. package/dist/utils/json-text-extractor.d.ts +17 -0
  479. package/dist/utils/json-text-extractor.d.ts.map +1 -0
  480. package/dist/utils/sandbox.d.ts +10 -0
  481. package/dist/utils/sandbox.d.ts.map +1 -1
  482. package/dist/utils/script-memory-ops.d.ts +21 -0
  483. package/dist/utils/script-memory-ops.d.ts.map +1 -0
  484. package/dist/utils/template-context.d.ts +8 -0
  485. package/dist/utils/template-context.d.ts.map +1 -0
  486. package/dist/utils/tracer-init.d.ts.map +1 -1
  487. package/dist/utils/workspace-manager.d.ts +118 -0
  488. package/dist/utils/workspace-manager.d.ts.map +1 -0
  489. package/dist/utils/worktree-cleanup.d.ts +33 -0
  490. package/dist/utils/worktree-cleanup.d.ts.map +1 -0
  491. package/dist/utils/worktree-manager.d.ts +153 -0
  492. package/dist/utils/worktree-manager.d.ts.map +1 -0
  493. package/dist/webhook-server.d.ts +3 -3
  494. package/dist/webhook-server.d.ts.map +1 -1
  495. package/dist/workflow-executor.d.ts +81 -0
  496. package/dist/workflow-executor.d.ts.map +1 -0
  497. package/dist/workflow-registry.d.ts +79 -0
  498. package/dist/workflow-registry.d.ts.map +1 -0
  499. package/package.json +12 -5
  500. package/dist/output/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
  501. package/dist/sdk/check-execution-engine-2YYKUUSH.mjs +0 -11
  502. package/dist/sdk/check-execution-engine-6QJXYYON.mjs +0 -11
  503. package/dist/sdk/check-execution-engine-PJZ4ZOKG.mjs +0 -11
  504. package/dist/sdk/chunk-33QVZ2D4.mjs +0 -316
  505. package/dist/sdk/chunk-33QVZ2D4.mjs.map +0 -1
  506. package/dist/sdk/chunk-B5QBV2QJ.mjs +0 -752
  507. package/dist/sdk/chunk-B5QBV2QJ.mjs.map +0 -1
  508. package/dist/sdk/chunk-BVFNRCHT.mjs +0 -14129
  509. package/dist/sdk/chunk-BVFNRCHT.mjs.map +0 -1
  510. package/dist/sdk/chunk-KWZW23FG.mjs +0 -14129
  511. package/dist/sdk/chunk-KWZW23FG.mjs.map +0 -1
  512. package/dist/sdk/chunk-O4RP4BRH.mjs +0 -14092
  513. package/dist/sdk/chunk-O4RP4BRH.mjs.map +0 -1
  514. package/dist/sdk/chunk-TUTOLSFV.mjs.map +0 -1
  515. package/dist/sdk/chunk-U5D2LY66.mjs +0 -245
  516. package/dist/sdk/chunk-U5D2LY66.mjs.map +0 -1
  517. package/dist/sdk/chunk-U7X54EMV.mjs +0 -331
  518. package/dist/sdk/chunk-U7X54EMV.mjs.map +0 -1
  519. package/dist/sdk/config-merger-TWUBWFC2.mjs +0 -8
  520. package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs +0 -61
  521. package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs.map +0 -1
  522. package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs +0 -61
  523. package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs.map +0 -1
  524. package/dist/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
  525. /package/dist/sdk/{check-execution-engine-2YYKUUSH.mjs.map → check-provider-registry-534KL5HT.mjs.map} +0 -0
  526. /package/dist/sdk/{check-execution-engine-6QJXYYON.mjs.map → command-executor-TYUV6HUS.mjs.map} +0 -0
  527. /package/dist/sdk/{check-execution-engine-PJZ4ZOKG.mjs.map → config-YNC2EOOT.mjs.map} +0 -0
  528. /package/dist/sdk/{config-merger-TWUBWFC2.mjs.map → config-merger-PX3WIT57.mjs.map} +0 -0
  529. /package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs.map → failure-condition-evaluator-YGTF2GHG.mjs.map} +0 -0
  530. /package/dist/sdk/{tracer-init-WC75N5NW.mjs.map → liquid-extensions-PKWCKK7E.mjs.map} +0 -0
@@ -42,6 +42,16 @@ async function initializeTracer(sessionId, checkName) {
42
42
  enableConsole: false
43
43
  });
44
44
  const tracer = new SimpleAppTracer(telemetry, sessionId);
45
+ if (typeof tracer.recordEvent !== "function") {
46
+ tracer.recordEvent = (name, attributes) => {
47
+ try {
48
+ if (telemetry.record) {
49
+ telemetry.record({ event: name, ...attributes });
50
+ }
51
+ } catch {
52
+ }
53
+ };
54
+ }
45
55
  console.error(`\u{1F4CA} Simple tracing enabled, will save to: ${traceFilePath}`);
46
56
  if (process.env.GITHUB_ACTIONS) {
47
57
  console.log(`::notice title=AI Trace::Trace will be saved to ${traceFilePath}`);
@@ -69,4 +79,4 @@ export {
69
79
  initializeTracer,
70
80
  init_tracer_init
71
81
  };
72
- //# sourceMappingURL=chunk-TUTOLSFV.mjs.map
82
+ //# sourceMappingURL=chunk-3OMWVM6J.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/tracer-init.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Safely initialize a tracer for ProbeAgent with proper path sanitization\n * Uses SimpleTelemetry for lightweight tracing\n * This prevents path traversal vulnerabilities by sanitizing the checkName\n */\ntype ProbeModule =\n | {\n SimpleTelemetry?: new (opts: {\n enableFile: boolean;\n filePath: string;\n enableConsole?: boolean;\n }) => unknown;\n SimpleAppTracer?: new (telemetry: unknown, sessionId: string) => unknown;\n }\n | undefined;\n\nexport async function initializeTracer(\n sessionId: string,\n checkName?: string\n): Promise<{ tracer: unknown; telemetryConfig: unknown; filePath: string } | null> {\n try {\n // Load Probe lib in a way that works in both ESM and CJS bundles\n let ProbeLib: ProbeModule;\n try {\n ProbeLib = (await import('@probelabs/probe')) as ProbeModule;\n } catch {\n try {\n // Fallback to CJS require if available\n\n ProbeLib = require('@probelabs/probe') as ProbeModule;\n } catch {\n ProbeLib = {} as unknown as ProbeModule;\n }\n }\n\n // Use SimpleTelemetry (probe no longer exports full OpenTelemetry classes)\n const SimpleTelemetry = ProbeLib?.SimpleTelemetry;\n const SimpleAppTracer = ProbeLib?.SimpleAppTracer;\n if (SimpleTelemetry && SimpleAppTracer) {\n // SECURITY: Sanitize checkName to prevent path traversal attacks\n const sanitizedCheckName = checkName ? path.basename(checkName) : 'check';\n\n // Create trace file path in debug-artifacts directory\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const traceDir = process.env.GITHUB_WORKSPACE\n ? path.join(process.env.GITHUB_WORKSPACE, 'debug-artifacts')\n : path.join(process.cwd(), 'debug-artifacts');\n\n // Create traces directory if it doesn't exist\n if (!fs.existsSync(traceDir)) {\n fs.mkdirSync(traceDir, { recursive: true });\n }\n\n // SECURITY: Use path.join to safely construct the path\n const traceFilePath = path.join(traceDir, `trace-${sanitizedCheckName}-${timestamp}.jsonl`);\n\n // SECURITY: Verify the resolved path is within the intended directory\n const resolvedTracePath = path.resolve(traceFilePath);\n const resolvedTraceDir = path.resolve(traceDir);\n if (!resolvedTracePath.startsWith(resolvedTraceDir)) {\n console.error(\n `⚠️ Security: Attempted path traversal detected. Check name: ${checkName}, resolved path: ${resolvedTracePath}`\n );\n return null;\n }\n\n // Initialize simple telemetry\n const telemetry = new SimpleTelemetry({\n enableFile: true,\n filePath: traceFilePath,\n enableConsole: false,\n });\n\n const tracer = new SimpleAppTracer(telemetry, sessionId);\n\n // WORKAROUND: Add missing recordEvent method for completionPrompt feature (probe #321)\n // SimpleAppTracer doesn't have recordEvent but completionPrompt requires it\n if (typeof (tracer as any).recordEvent !== 'function') {\n (tracer as any).recordEvent = (name: string, attributes?: Record<string, unknown>) => {\n // Log completion events to telemetry for debugging\n try {\n if ((telemetry as any).record) {\n (telemetry as any).record({ event: name, ...attributes });\n }\n } catch {\n // Best-effort only\n }\n };\n }\n\n console.error(`📊 Simple tracing enabled, will save to: ${traceFilePath}`);\n\n // If in GitHub Actions, log the path for artifact upload\n if (process.env.GITHUB_ACTIONS) {\n console.log(`::notice title=AI Trace::Trace will be saved to ${traceFilePath}`);\n console.log(`::set-output name=trace-path::${traceFilePath}`);\n }\n\n // Return with SimpleTelemetry\n return {\n tracer,\n telemetryConfig: telemetry,\n filePath: traceFilePath,\n };\n }\n\n console.error('⚠️ Telemetry classes not available in ProbeAgent, skipping tracing');\n return null;\n } catch (error) {\n console.error('⚠️ Warning: Failed to initialize tracing:', error);\n return null;\n }\n}\n"],"mappings":";;;;;;AAAA,YAAY,UAAU;AACtB,YAAY,QAAQ;AAkBpB,eAAsB,iBACpB,WACA,WACiF;AACjF,MAAI;AAEF,QAAI;AACJ,QAAI;AACF,iBAAY,MAAM,OAAO,kBAAkB;AAAA,IAC7C,QAAQ;AACN,UAAI;AAGF,mBAAW,UAAQ,kBAAkB;AAAA,MACvC,QAAQ;AACN,mBAAW,CAAC;AAAA,MACd;AAAA,IACF;AAGA,UAAM,kBAAkB,UAAU;AAClC,UAAM,kBAAkB,UAAU;AAClC,QAAI,mBAAmB,iBAAiB;AAEtC,YAAM,qBAAqB,YAAiB,cAAS,SAAS,IAAI;AAGlE,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,YAAM,WAAW,QAAQ,IAAI,mBACpB,UAAK,QAAQ,IAAI,kBAAkB,iBAAiB,IACpD,UAAK,QAAQ,IAAI,GAAG,iBAAiB;AAG9C,UAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,QAAG,aAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MAC5C;AAGA,YAAM,gBAAqB,UAAK,UAAU,SAAS,kBAAkB,IAAI,SAAS,QAAQ;AAG1F,YAAM,oBAAyB,aAAQ,aAAa;AACpD,YAAM,mBAAwB,aAAQ,QAAQ;AAC9C,UAAI,CAAC,kBAAkB,WAAW,gBAAgB,GAAG;AACnD,gBAAQ;AAAA,UACN,yEAA+D,SAAS,oBAAoB,iBAAiB;AAAA,QAC/G;AACA,eAAO;AAAA,MACT;AAGA,YAAM,YAAY,IAAI,gBAAgB;AAAA,QACpC,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,SAAS,IAAI,gBAAgB,WAAW,SAAS;AAIvD,UAAI,OAAQ,OAAe,gBAAgB,YAAY;AACrD,QAAC,OAAe,cAAc,CAAC,MAAc,eAAyC;AAEpF,cAAI;AACF,gBAAK,UAAkB,QAAQ;AAC7B,cAAC,UAAkB,OAAO,EAAE,OAAO,MAAM,GAAG,WAAW,CAAC;AAAA,YAC1D;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,MAAM,mDAA4C,aAAa,EAAE;AAGzE,UAAI,QAAQ,IAAI,gBAAgB;AAC9B,gBAAQ,IAAI,mDAAmD,aAAa,EAAE;AAC9E,gBAAQ,IAAI,iCAAiC,aAAa,EAAE;AAAA,MAC9D;AAGA,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,YAAQ,MAAM,8EAAoE;AAClF,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,uDAA6C,KAAK;AAChE,WAAO;AAAA,EACT;AACF;AAnHA;AAAA;AAAA;AAAA;","names":[]}
@@ -0,0 +1,482 @@
1
+ import {
2
+ init_logger,
3
+ logger
4
+ } from "./chunk-AGIZJ4UZ.mjs";
5
+ import {
6
+ __esm,
7
+ __export
8
+ } from "./chunk-WMJKH4XE.mjs";
9
+
10
+ // src/memory-store.ts
11
+ var memory_store_exports = {};
12
+ __export(memory_store_exports, {
13
+ MemoryStore: () => MemoryStore
14
+ });
15
+ import fs from "fs/promises";
16
+ import path from "path";
17
+ var MemoryStore;
18
+ var init_memory_store = __esm({
19
+ "src/memory-store.ts"() {
20
+ init_logger();
21
+ MemoryStore = class _MemoryStore {
22
+ static instance;
23
+ data;
24
+ // namespace -> key -> value
25
+ config;
26
+ initialized = false;
27
+ constructor(config) {
28
+ this.data = /* @__PURE__ */ new Map();
29
+ this.config = this.normalizeConfig(config);
30
+ }
31
+ /**
32
+ * Get singleton instance
33
+ */
34
+ static getInstance(config) {
35
+ if (!_MemoryStore.instance) {
36
+ _MemoryStore.instance = new _MemoryStore(config);
37
+ } else if (config && !_MemoryStore.instance.initialized) {
38
+ _MemoryStore.instance.config = _MemoryStore.instance.normalizeConfig(config);
39
+ }
40
+ return _MemoryStore.instance;
41
+ }
42
+ /**
43
+ * Create a new isolated MemoryStore instance that does not affect the
44
+ * process-wide singleton. Useful for nested workflows or tests where
45
+ * state must not leak between runs.
46
+ */
47
+ static createIsolated(config) {
48
+ return new _MemoryStore(config);
49
+ }
50
+ /**
51
+ * Reset singleton instance (for testing)
52
+ */
53
+ static resetInstance() {
54
+ _MemoryStore.instance = void 0;
55
+ }
56
+ /**
57
+ * Initialize memory store (load from file if configured)
58
+ */
59
+ async initialize() {
60
+ if (this.initialized) {
61
+ return;
62
+ }
63
+ if (this.config.storage === "file" && this.config.auto_load && this.config.file) {
64
+ try {
65
+ await this.load();
66
+ logger.debug(`Memory store loaded from ${this.config.file}`);
67
+ } catch (error) {
68
+ if (error.code !== "ENOENT") {
69
+ logger.warn(
70
+ `Failed to load memory store from ${this.config.file}: ${error instanceof Error ? error.message : "Unknown error"}`
71
+ );
72
+ }
73
+ }
74
+ }
75
+ this.initialized = true;
76
+ }
77
+ /**
78
+ * Normalize and apply defaults to config
79
+ */
80
+ normalizeConfig(config) {
81
+ const storage = config?.storage || "memory";
82
+ return {
83
+ storage,
84
+ format: config?.format || "json",
85
+ file: config?.file,
86
+ namespace: config?.namespace || "default",
87
+ auto_load: config?.auto_load !== false,
88
+ auto_save: config?.auto_save !== false
89
+ };
90
+ }
91
+ /**
92
+ * Get the default namespace
93
+ */
94
+ getDefaultNamespace() {
95
+ return this.config.namespace || "default";
96
+ }
97
+ /**
98
+ * Get a value from memory
99
+ */
100
+ get(key, namespace) {
101
+ const ns = namespace || this.getDefaultNamespace();
102
+ const nsData = this.data.get(ns);
103
+ return nsData?.get(key);
104
+ }
105
+ /**
106
+ * Check if a key exists in memory
107
+ */
108
+ has(key, namespace) {
109
+ const ns = namespace || this.getDefaultNamespace();
110
+ const nsData = this.data.get(ns);
111
+ return nsData?.has(key) || false;
112
+ }
113
+ /**
114
+ * Set a value in memory (override existing)
115
+ */
116
+ async set(key, value, namespace) {
117
+ const ns = namespace || this.getDefaultNamespace();
118
+ if (!this.data.has(ns)) {
119
+ this.data.set(ns, /* @__PURE__ */ new Map());
120
+ }
121
+ const nsData = this.data.get(ns);
122
+ nsData.set(key, value);
123
+ try {
124
+ if (process.env.VISOR_DEBUG === "true" || process.env.JEST_WORKER_ID !== void 0) {
125
+ if (ns === "fact-validation" && (key === "total_validations" || key === "all_valid")) {
126
+ console.log("[MemoryStore] SET " + ns + "." + key + " = " + JSON.stringify(value));
127
+ }
128
+ }
129
+ } catch {
130
+ }
131
+ try {
132
+ if (process.env.VISOR_DEBUG === "true" || process.env.JEST_WORKER_ID !== void 0) {
133
+ if (ns === "fact-validation" && (key === "total_validations" || key === "all_valid")) {
134
+ console.log();
135
+ }
136
+ }
137
+ } catch {
138
+ }
139
+ if (this.config.storage === "file" && this.config.auto_save) {
140
+ await this.save();
141
+ }
142
+ }
143
+ /**
144
+ * Append a value to an array in memory
145
+ * If key doesn't exist, creates a new array
146
+ * If key exists but is not an array, converts it to an array
147
+ */
148
+ async append(key, value, namespace) {
149
+ const ns = namespace || this.getDefaultNamespace();
150
+ const existing = this.get(key, ns);
151
+ let newValue;
152
+ if (existing === void 0) {
153
+ newValue = [value];
154
+ } else if (Array.isArray(existing)) {
155
+ newValue = [...existing, value];
156
+ } else {
157
+ newValue = [existing, value];
158
+ }
159
+ await this.set(key, newValue, ns);
160
+ }
161
+ /**
162
+ * Increment a numeric value in memory
163
+ * If key doesn't exist, initializes to 0 before incrementing
164
+ * If key exists but is not a number, throws an error
165
+ */
166
+ async increment(key, amount = 1, namespace) {
167
+ const ns = namespace || this.getDefaultNamespace();
168
+ const existing = this.get(key, ns);
169
+ let newValue;
170
+ if (existing === void 0 || existing === null) {
171
+ newValue = amount;
172
+ } else if (typeof existing === "number") {
173
+ newValue = existing + amount;
174
+ } else {
175
+ throw new Error(
176
+ `Cannot increment non-numeric value at key '${key}' (type: ${typeof existing})`
177
+ );
178
+ }
179
+ await this.set(key, newValue, ns);
180
+ return newValue;
181
+ }
182
+ /**
183
+ * Delete a key from memory
184
+ */
185
+ async delete(key, namespace) {
186
+ const ns = namespace || this.getDefaultNamespace();
187
+ const nsData = this.data.get(ns);
188
+ if (!nsData) {
189
+ return false;
190
+ }
191
+ const deleted = nsData.delete(key);
192
+ if (deleted && this.config.storage === "file" && this.config.auto_save) {
193
+ await this.save();
194
+ }
195
+ return deleted;
196
+ }
197
+ /**
198
+ * Clear all keys in a namespace (or all namespaces if none specified)
199
+ */
200
+ async clear(namespace) {
201
+ if (namespace) {
202
+ this.data.delete(namespace);
203
+ } else {
204
+ this.data.clear();
205
+ }
206
+ if (this.config.storage === "file" && this.config.auto_save) {
207
+ await this.save();
208
+ }
209
+ }
210
+ /**
211
+ * List all keys in a namespace
212
+ */
213
+ list(namespace) {
214
+ const ns = namespace || this.getDefaultNamespace();
215
+ const nsData = this.data.get(ns);
216
+ return nsData ? Array.from(nsData.keys()) : [];
217
+ }
218
+ /**
219
+ * List all namespaces
220
+ */
221
+ listNamespaces() {
222
+ return Array.from(this.data.keys());
223
+ }
224
+ /**
225
+ * Get all data in a namespace
226
+ */
227
+ getAll(namespace) {
228
+ const ns = namespace || this.getDefaultNamespace();
229
+ const nsData = this.data.get(ns);
230
+ if (!nsData) {
231
+ return {};
232
+ }
233
+ const result = {};
234
+ for (const [key, value] of nsData.entries()) {
235
+ result[key] = value;
236
+ }
237
+ return result;
238
+ }
239
+ /**
240
+ * Load data from file
241
+ */
242
+ async load() {
243
+ if (!this.config.file) {
244
+ throw new Error("No file path configured for memory store");
245
+ }
246
+ const filePath = path.resolve(process.cwd(), this.config.file);
247
+ const content = await fs.readFile(filePath, "utf-8");
248
+ if (this.config.format === "json") {
249
+ await this.loadFromJson(content);
250
+ } else if (this.config.format === "csv") {
251
+ await this.loadFromCsv(content);
252
+ } else {
253
+ throw new Error(`Unsupported format: ${this.config.format}`);
254
+ }
255
+ }
256
+ /**
257
+ * Save data to file
258
+ */
259
+ async save() {
260
+ if (!this.config.file) {
261
+ throw new Error("No file path configured for memory store");
262
+ }
263
+ const filePath = path.resolve(process.cwd(), this.config.file);
264
+ const dir = path.dirname(filePath);
265
+ await fs.mkdir(dir, { recursive: true });
266
+ let content;
267
+ if (this.config.format === "json") {
268
+ content = this.saveToJson();
269
+ } else if (this.config.format === "csv") {
270
+ content = this.saveToCsv();
271
+ } else {
272
+ throw new Error(`Unsupported format: ${this.config.format}`);
273
+ }
274
+ await fs.writeFile(filePath, content, "utf-8");
275
+ }
276
+ /**
277
+ * Load data from JSON format
278
+ */
279
+ async loadFromJson(content) {
280
+ const data = JSON.parse(content);
281
+ this.data.clear();
282
+ for (const [namespace, nsData] of Object.entries(data)) {
283
+ if (typeof nsData === "object" && nsData !== null && !Array.isArray(nsData)) {
284
+ const nsMap = /* @__PURE__ */ new Map();
285
+ for (const [key, value] of Object.entries(nsData)) {
286
+ nsMap.set(key, value);
287
+ }
288
+ this.data.set(namespace, nsMap);
289
+ }
290
+ }
291
+ }
292
+ /**
293
+ * Save data to JSON format
294
+ */
295
+ saveToJson() {
296
+ const result = {};
297
+ for (const [namespace, nsData] of this.data.entries()) {
298
+ const nsObj = {};
299
+ for (const [key, value] of nsData.entries()) {
300
+ nsObj[key] = value;
301
+ }
302
+ result[namespace] = nsObj;
303
+ }
304
+ return JSON.stringify(result, null, 2);
305
+ }
306
+ /**
307
+ * Load data from CSV format
308
+ * CSV format: namespace,key,value,type
309
+ */
310
+ async loadFromCsv(content) {
311
+ const lines = content.split("\n").filter((line) => line.trim());
312
+ let startIndex = 0;
313
+ if (lines[0]?.startsWith("namespace,")) {
314
+ startIndex = 1;
315
+ }
316
+ this.data.clear();
317
+ const arrays = /* @__PURE__ */ new Map();
318
+ for (let i = startIndex; i < lines.length; i++) {
319
+ const line = lines[i];
320
+ const parts = this.parseCsvLine(line);
321
+ if (parts.length < 3) {
322
+ logger.warn(`Invalid CSV line ${i + 1}: ${line}`);
323
+ continue;
324
+ }
325
+ const [namespace, key, valueStr, typeStr] = parts;
326
+ const value = this.parseCsvValue(valueStr, typeStr);
327
+ if (!this.data.has(namespace)) {
328
+ this.data.set(namespace, /* @__PURE__ */ new Map());
329
+ arrays.set(namespace, /* @__PURE__ */ new Map());
330
+ }
331
+ const nsData = this.data.get(namespace);
332
+ const nsArrays = arrays.get(namespace);
333
+ if (nsData.has(key)) {
334
+ if (!nsArrays.has(key)) {
335
+ const existingValue = nsData.get(key);
336
+ nsArrays.set(key, [existingValue]);
337
+ }
338
+ nsArrays.get(key).push(value);
339
+ nsData.set(key, nsArrays.get(key));
340
+ } else {
341
+ nsData.set(key, value);
342
+ }
343
+ }
344
+ }
345
+ /**
346
+ * Save data to CSV format
347
+ */
348
+ saveToCsv() {
349
+ const lines = ["namespace,key,value,type"];
350
+ for (const [namespace, nsData] of this.data.entries()) {
351
+ for (const [key, value] of nsData.entries()) {
352
+ if (Array.isArray(value)) {
353
+ for (const item of value) {
354
+ lines.push(this.formatCsvLine(namespace, key, item));
355
+ }
356
+ } else {
357
+ lines.push(this.formatCsvLine(namespace, key, value));
358
+ }
359
+ }
360
+ }
361
+ return lines.join("\n") + "\n";
362
+ }
363
+ /**
364
+ * Parse a CSV line, handling quoted values with commas
365
+ */
366
+ parseCsvLine(line) {
367
+ const parts = [];
368
+ let current = "";
369
+ let inQuotes = false;
370
+ for (let i = 0; i < line.length; i++) {
371
+ const char = line[i];
372
+ if (char === '"') {
373
+ if (inQuotes && line[i + 1] === '"') {
374
+ current += '"';
375
+ i++;
376
+ } else {
377
+ inQuotes = !inQuotes;
378
+ }
379
+ } else if (char === "," && !inQuotes) {
380
+ parts.push(current);
381
+ current = "";
382
+ } else {
383
+ current += char;
384
+ }
385
+ }
386
+ parts.push(current);
387
+ return parts;
388
+ }
389
+ /**
390
+ * Format a CSV line with proper escaping
391
+ */
392
+ formatCsvLine(namespace, key, value) {
393
+ const type = this.getValueType(value);
394
+ const valueStr = this.formatCsvValue(value);
395
+ return `${this.escapeCsv(namespace)},${this.escapeCsv(key)},${valueStr},${type}`;
396
+ }
397
+ /**
398
+ * Escape a CSV value
399
+ */
400
+ escapeCsv(value) {
401
+ if (value.includes(",") || value.includes('"') || value.includes("\n")) {
402
+ return `"${value.replace(/"/g, '""')}"`;
403
+ }
404
+ return value;
405
+ }
406
+ /**
407
+ * Format a value for CSV storage
408
+ */
409
+ formatCsvValue(value) {
410
+ if (value === null) {
411
+ return '""';
412
+ }
413
+ if (value === void 0) {
414
+ return '""';
415
+ }
416
+ if (typeof value === "string") {
417
+ return this.escapeCsv(value);
418
+ }
419
+ if (typeof value === "number" || typeof value === "boolean") {
420
+ return this.escapeCsv(String(value));
421
+ }
422
+ return this.escapeCsv(JSON.stringify(value));
423
+ }
424
+ /**
425
+ * Parse a CSV value based on its type
426
+ */
427
+ parseCsvValue(valueStr, typeStr) {
428
+ if (!typeStr || typeStr === "string") {
429
+ return valueStr;
430
+ }
431
+ if (typeStr === "number") {
432
+ return Number(valueStr);
433
+ }
434
+ if (typeStr === "boolean") {
435
+ return valueStr === "true";
436
+ }
437
+ if (typeStr === "object" || typeStr === "array") {
438
+ try {
439
+ return JSON.parse(valueStr);
440
+ } catch {
441
+ return valueStr;
442
+ }
443
+ }
444
+ return valueStr;
445
+ }
446
+ /**
447
+ * Get the type of a value for CSV storage
448
+ */
449
+ getValueType(value) {
450
+ if (value === null || value === void 0) {
451
+ return "string";
452
+ }
453
+ if (typeof value === "number") {
454
+ return "number";
455
+ }
456
+ if (typeof value === "boolean") {
457
+ return "boolean";
458
+ }
459
+ if (Array.isArray(value)) {
460
+ return "array";
461
+ }
462
+ if (typeof value === "object") {
463
+ return "object";
464
+ }
465
+ return "string";
466
+ }
467
+ /**
468
+ * Get the current configuration
469
+ */
470
+ getConfig() {
471
+ return { ...this.config };
472
+ }
473
+ };
474
+ }
475
+ });
476
+
477
+ export {
478
+ MemoryStore,
479
+ memory_store_exports,
480
+ init_memory_store
481
+ };
482
+ //# sourceMappingURL=chunk-7UK3NIIT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/memory-store.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport path from 'path';\nimport { MemoryConfig } from './types/config';\nimport { logger } from './logger';\n\n/**\n * Memory store for persistent key-value storage across checks\n * Supports namespaces for isolation and both in-memory and file-based persistence\n */\nexport class MemoryStore {\n private static instance: MemoryStore;\n private data: Map<string, Map<string, unknown>>; // namespace -> key -> value\n private config: MemoryConfig;\n private initialized = false;\n\n private constructor(config?: MemoryConfig) {\n this.data = new Map();\n this.config = this.normalizeConfig(config);\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(config?: MemoryConfig): MemoryStore {\n if (!MemoryStore.instance) {\n MemoryStore.instance = new MemoryStore(config);\n } else if (config && !MemoryStore.instance.initialized) {\n // Update config if not yet initialized\n MemoryStore.instance.config = MemoryStore.instance.normalizeConfig(config);\n }\n return MemoryStore.instance;\n }\n\n /**\n * Create a new isolated MemoryStore instance that does not affect the\n * process-wide singleton. Useful for nested workflows or tests where\n * state must not leak between runs.\n */\n static createIsolated(config?: MemoryConfig): MemoryStore {\n return new MemoryStore(config);\n }\n\n /**\n * Reset singleton instance (for testing)\n */\n static resetInstance(): void {\n MemoryStore.instance = undefined!;\n }\n\n /**\n * Initialize memory store (load from file if configured)\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Auto-load if file storage is configured\n if (this.config.storage === 'file' && this.config.auto_load && this.config.file) {\n try {\n await this.load();\n logger.debug(`Memory store loaded from ${this.config.file}`);\n } catch (error) {\n // If file doesn't exist, that's ok - we'll create it on first save\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(\n `Failed to load memory store from ${this.config.file}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Normalize and apply defaults to config\n */\n private normalizeConfig(config?: MemoryConfig): MemoryConfig {\n const storage = config?.storage || 'memory';\n return {\n storage,\n format: config?.format || 'json',\n file: config?.file,\n namespace: config?.namespace || 'default',\n auto_load: config?.auto_load !== false,\n auto_save: config?.auto_save !== false,\n };\n }\n\n /**\n * Get the default namespace\n */\n getDefaultNamespace(): string {\n return this.config.namespace || 'default';\n }\n\n /**\n * Get a value from memory\n */\n get(key: string, namespace?: string): unknown {\n const ns = namespace || this.getDefaultNamespace();\n const nsData = this.data.get(ns);\n return nsData?.get(key);\n }\n\n /**\n * Check if a key exists in memory\n */\n has(key: string, namespace?: string): boolean {\n const ns = namespace || this.getDefaultNamespace();\n const nsData = this.data.get(ns);\n return nsData?.has(key) || false;\n }\n\n /**\n * Set a value in memory (override existing)\n */\n async set(key: string, value: unknown, namespace?: string): Promise<void> {\n const ns = namespace || this.getDefaultNamespace();\n\n // Ensure namespace exists\n if (!this.data.has(ns)) {\n this.data.set(ns, new Map());\n }\n\n const nsData = this.data.get(ns)!;\n nsData.set(key, value);\n\n try {\n if (process.env.VISOR_DEBUG === 'true' || process.env.JEST_WORKER_ID !== undefined) {\n if (ns === 'fact-validation' && (key === 'total_validations' || key === 'all_valid')) {\n console.log('[MemoryStore] SET ' + ns + '.' + key + ' = ' + JSON.stringify(value));\n }\n }\n } catch {}\n\n try {\n if (process.env.VISOR_DEBUG === 'true' || process.env.JEST_WORKER_ID !== undefined) {\n if (ns === 'fact-validation' && (key === 'total_validations' || key === 'all_valid')) {\n console.log();\n }\n }\n } catch {}\n\n // Auto-save if configured\n if (this.config.storage === 'file' && this.config.auto_save) {\n await this.save();\n }\n }\n\n /**\n * Append a value to an array in memory\n * If key doesn't exist, creates a new array\n * If key exists but is not an array, converts it to an array\n */\n async append(key: string, value: unknown, namespace?: string): Promise<void> {\n const ns = namespace || this.getDefaultNamespace();\n const existing = this.get(key, ns);\n\n let newValue: unknown[];\n if (existing === undefined) {\n // Create new array\n newValue = [value];\n } else if (Array.isArray(existing)) {\n // Append to existing array\n newValue = [...existing, value];\n } else {\n // Convert single value to array with both values\n newValue = [existing, value];\n }\n\n await this.set(key, newValue, ns);\n }\n\n /**\n * Increment a numeric value in memory\n * If key doesn't exist, initializes to 0 before incrementing\n * If key exists but is not a number, throws an error\n */\n async increment(key: string, amount = 1, namespace?: string): Promise<number> {\n const ns = namespace || this.getDefaultNamespace();\n const existing = this.get(key, ns);\n\n let newValue: number;\n if (existing === undefined || existing === null) {\n // Initialize to 0 and then increment\n newValue = amount;\n } else if (typeof existing === 'number') {\n // Increment existing number\n newValue = existing + amount;\n } else {\n throw new Error(\n `Cannot increment non-numeric value at key '${key}' (type: ${typeof existing})`\n );\n }\n\n await this.set(key, newValue, ns);\n return newValue;\n }\n\n /**\n * Delete a key from memory\n */\n async delete(key: string, namespace?: string): Promise<boolean> {\n const ns = namespace || this.getDefaultNamespace();\n const nsData = this.data.get(ns);\n\n if (!nsData) {\n return false;\n }\n\n const deleted = nsData.delete(key);\n\n // Auto-save if configured\n if (deleted && this.config.storage === 'file' && this.config.auto_save) {\n await this.save();\n }\n\n return deleted;\n }\n\n /**\n * Clear all keys in a namespace (or all namespaces if none specified)\n */\n async clear(namespace?: string): Promise<void> {\n if (namespace) {\n // Clear specific namespace\n this.data.delete(namespace);\n } else {\n // Clear all namespaces\n this.data.clear();\n }\n\n // Auto-save if configured\n if (this.config.storage === 'file' && this.config.auto_save) {\n await this.save();\n }\n }\n\n /**\n * List all keys in a namespace\n */\n list(namespace?: string): string[] {\n const ns = namespace || this.getDefaultNamespace();\n const nsData = this.data.get(ns);\n return nsData ? Array.from(nsData.keys()) : [];\n }\n\n /**\n * List all namespaces\n */\n listNamespaces(): string[] {\n return Array.from(this.data.keys());\n }\n\n /**\n * Get all data in a namespace\n */\n getAll(namespace?: string): Record<string, unknown> {\n const ns = namespace || this.getDefaultNamespace();\n const nsData = this.data.get(ns);\n if (!nsData) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of nsData.entries()) {\n result[key] = value;\n }\n return result;\n }\n\n /**\n * Load data from file\n */\n async load(): Promise<void> {\n if (!this.config.file) {\n throw new Error('No file path configured for memory store');\n }\n\n const filePath = path.resolve(process.cwd(), this.config.file);\n const content = await fs.readFile(filePath, 'utf-8');\n\n if (this.config.format === 'json') {\n await this.loadFromJson(content);\n } else if (this.config.format === 'csv') {\n await this.loadFromCsv(content);\n } else {\n throw new Error(`Unsupported format: ${this.config.format}`);\n }\n }\n\n /**\n * Save data to file\n */\n async save(): Promise<void> {\n if (!this.config.file) {\n throw new Error('No file path configured for memory store');\n }\n\n const filePath = path.resolve(process.cwd(), this.config.file);\n\n // Ensure directory exists\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n\n let content: string;\n if (this.config.format === 'json') {\n content = this.saveToJson();\n } else if (this.config.format === 'csv') {\n content = this.saveToCsv();\n } else {\n throw new Error(`Unsupported format: ${this.config.format}`);\n }\n\n await fs.writeFile(filePath, content, 'utf-8');\n }\n\n /**\n * Load data from JSON format\n */\n private async loadFromJson(content: string): Promise<void> {\n const data = JSON.parse(content);\n\n // Clear existing data\n this.data.clear();\n\n // Load namespaces\n for (const [namespace, nsData] of Object.entries(data)) {\n if (typeof nsData === 'object' && nsData !== null && !Array.isArray(nsData)) {\n const nsMap = new Map<string, unknown>();\n for (const [key, value] of Object.entries(nsData)) {\n nsMap.set(key, value);\n }\n this.data.set(namespace, nsMap);\n }\n }\n }\n\n /**\n * Save data to JSON format\n */\n private saveToJson(): string {\n const result: Record<string, Record<string, unknown>> = {};\n\n for (const [namespace, nsData] of this.data.entries()) {\n const nsObj: Record<string, unknown> = {};\n for (const [key, value] of nsData.entries()) {\n nsObj[key] = value;\n }\n result[namespace] = nsObj;\n }\n\n return JSON.stringify(result, null, 2);\n }\n\n /**\n * Load data from CSV format\n * CSV format: namespace,key,value,type\n */\n private async loadFromCsv(content: string): Promise<void> {\n const lines = content.split('\\n').filter(line => line.trim());\n\n // Skip header if present\n let startIndex = 0;\n if (lines[0]?.startsWith('namespace,')) {\n startIndex = 1;\n }\n\n // Clear existing data\n this.data.clear();\n\n // Track arrays (keys that have multiple values)\n const arrays = new Map<string, Map<string, unknown[]>>(); // namespace -> key -> values[]\n\n for (let i = startIndex; i < lines.length; i++) {\n const line = lines[i];\n const parts = this.parseCsvLine(line);\n\n if (parts.length < 3) {\n logger.warn(`Invalid CSV line ${i + 1}: ${line}`);\n continue;\n }\n\n const [namespace, key, valueStr, typeStr] = parts;\n const value = this.parseCsvValue(valueStr, typeStr);\n\n // Ensure namespace exists in data\n if (!this.data.has(namespace)) {\n this.data.set(namespace, new Map());\n arrays.set(namespace, new Map());\n }\n\n const nsData = this.data.get(namespace)!;\n const nsArrays = arrays.get(namespace)!;\n\n // Check if this is a duplicate key (array)\n if (nsData.has(key)) {\n // Convert to array if not already\n if (!nsArrays.has(key)) {\n const existingValue = nsData.get(key);\n nsArrays.set(key, [existingValue]);\n }\n nsArrays.get(key)!.push(value);\n nsData.set(key, nsArrays.get(key)!);\n } else {\n // First occurrence\n nsData.set(key, value);\n }\n }\n }\n\n /**\n * Save data to CSV format\n */\n private saveToCsv(): string {\n const lines: string[] = ['namespace,key,value,type'];\n\n for (const [namespace, nsData] of this.data.entries()) {\n for (const [key, value] of nsData.entries()) {\n if (Array.isArray(value)) {\n // Multiple rows for arrays\n for (const item of value) {\n lines.push(this.formatCsvLine(namespace, key, item));\n }\n } else {\n // Single row\n lines.push(this.formatCsvLine(namespace, key, value));\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n }\n\n /**\n * Parse a CSV line, handling quoted values with commas\n */\n private parseCsvLine(line: string): string[] {\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n\n if (char === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n // Escaped quote\n current += '\"';\n i++;\n } else {\n // Toggle quotes\n inQuotes = !inQuotes;\n }\n } else if (char === ',' && !inQuotes) {\n // End of field\n parts.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n\n // Add last field\n parts.push(current);\n\n return parts;\n }\n\n /**\n * Format a CSV line with proper escaping\n */\n private formatCsvLine(namespace: string, key: string, value: unknown): string {\n const type = this.getValueType(value);\n const valueStr = this.formatCsvValue(value);\n\n return `${this.escapeCsv(namespace)},${this.escapeCsv(key)},${valueStr},${type}`;\n }\n\n /**\n * Escape a CSV value\n */\n private escapeCsv(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n\n /**\n * Format a value for CSV storage\n */\n private formatCsvValue(value: unknown): string {\n if (value === null) {\n return '\"\"';\n }\n if (value === undefined) {\n return '\"\"';\n }\n if (typeof value === 'string') {\n return this.escapeCsv(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return this.escapeCsv(String(value));\n }\n // Objects and arrays are serialized as JSON\n return this.escapeCsv(JSON.stringify(value));\n }\n\n /**\n * Parse a CSV value based on its type\n */\n private parseCsvValue(valueStr: string, typeStr?: string): unknown {\n if (!typeStr || typeStr === 'string') {\n return valueStr;\n }\n if (typeStr === 'number') {\n return Number(valueStr);\n }\n if (typeStr === 'boolean') {\n return valueStr === 'true';\n }\n if (typeStr === 'object' || typeStr === 'array') {\n try {\n return JSON.parse(valueStr);\n } catch {\n return valueStr;\n }\n }\n return valueStr;\n }\n\n /**\n * Get the type of a value for CSV storage\n */\n private getValueType(value: unknown): string {\n if (value === null || value === undefined) {\n return 'string';\n }\n if (typeof value === 'number') {\n return 'number';\n }\n if (typeof value === 'boolean') {\n return 'boolean';\n }\n if (Array.isArray(value)) {\n return 'array';\n }\n if (typeof value === 'object') {\n return 'object';\n }\n return 'string';\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): MemoryConfig {\n return { ...this.config };\n }\n}\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AADjB,IASa;AATb;AAAA;AAGA;AAMO,IAAM,cAAN,MAAM,aAAY;AAAA,MACvB,OAAe;AAAA,MACP;AAAA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MAEd,YAAY,QAAuB;AACzC,aAAK,OAAO,oBAAI,IAAI;AACpB,aAAK,SAAS,KAAK,gBAAgB,MAAM;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,YAAY,QAAoC;AACrD,YAAI,CAAC,aAAY,UAAU;AACzB,uBAAY,WAAW,IAAI,aAAY,MAAM;AAAA,QAC/C,WAAW,UAAU,CAAC,aAAY,SAAS,aAAa;AAEtD,uBAAY,SAAS,SAAS,aAAY,SAAS,gBAAgB,MAAM;AAAA,QAC3E;AACA,eAAO,aAAY;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,eAAe,QAAoC;AACxD,eAAO,IAAI,aAAY,MAAM;AAAA,MAC/B;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,gBAAsB;AAC3B,qBAAY,WAAW;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAA4B;AAChC,YAAI,KAAK,aAAa;AACpB;AAAA,QACF;AAGA,YAAI,KAAK,OAAO,YAAY,UAAU,KAAK,OAAO,aAAa,KAAK,OAAO,MAAM;AAC/E,cAAI;AACF,kBAAM,KAAK,KAAK;AAChB,mBAAO,MAAM,4BAA4B,KAAK,OAAO,IAAI,EAAE;AAAA,UAC7D,SAAS,OAAO;AAEd,gBAAK,MAAgC,SAAS,UAAU;AACtD,qBAAO;AAAA,gBACL,oCAAoC,KAAK,OAAO,IAAI,KAClD,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,aAAK,cAAc;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKQ,gBAAgB,QAAqC;AAC3D,cAAM,UAAU,QAAQ,WAAW;AACnC,eAAO;AAAA,UACL;AAAA,UACA,QAAQ,QAAQ,UAAU;AAAA,UAC1B,MAAM,QAAQ;AAAA,UACd,WAAW,QAAQ,aAAa;AAAA,UAChC,WAAW,QAAQ,cAAc;AAAA,UACjC,WAAW,QAAQ,cAAc;AAAA,QACnC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,sBAA8B;AAC5B,eAAO,KAAK,OAAO,aAAa;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,KAAa,WAA6B;AAC5C,cAAM,KAAK,aAAa,KAAK,oBAAoB;AACjD,cAAM,SAAS,KAAK,KAAK,IAAI,EAAE;AAC/B,eAAO,QAAQ,IAAI,GAAG;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,KAAa,WAA6B;AAC5C,cAAM,KAAK,aAAa,KAAK,oBAAoB;AACjD,cAAM,SAAS,KAAK,KAAK,IAAI,EAAE;AAC/B,eAAO,QAAQ,IAAI,GAAG,KAAK;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAI,KAAa,OAAgB,WAAmC;AACxE,cAAM,KAAK,aAAa,KAAK,oBAAoB;AAGjD,YAAI,CAAC,KAAK,KAAK,IAAI,EAAE,GAAG;AACtB,eAAK,KAAK,IAAI,IAAI,oBAAI,IAAI,CAAC;AAAA,QAC7B;AAEA,cAAM,SAAS,KAAK,KAAK,IAAI,EAAE;AAC/B,eAAO,IAAI,KAAK,KAAK;AAErB,YAAI;AACF,cAAI,QAAQ,IAAI,gBAAgB,UAAU,QAAQ,IAAI,mBAAmB,QAAW;AAClF,gBAAI,OAAO,sBAAsB,QAAQ,uBAAuB,QAAQ,cAAc;AACpF,sBAAQ,IAAI,uBAAuB,KAAK,MAAM,MAAM,QAAQ,KAAK,UAAU,KAAK,CAAC;AAAA,YACnF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAC;AAET,YAAI;AACF,cAAI,QAAQ,IAAI,gBAAgB,UAAU,QAAQ,IAAI,mBAAmB,QAAW;AAClF,gBAAI,OAAO,sBAAsB,QAAQ,uBAAuB,QAAQ,cAAc;AACpF,sBAAQ,IAAI;AAAA,YACd;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAC;AAGT,YAAI,KAAK,OAAO,YAAY,UAAU,KAAK,OAAO,WAAW;AAC3D,gBAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,OAAO,KAAa,OAAgB,WAAmC;AAC3E,cAAM,KAAK,aAAa,KAAK,oBAAoB;AACjD,cAAM,WAAW,KAAK,IAAI,KAAK,EAAE;AAEjC,YAAI;AACJ,YAAI,aAAa,QAAW;AAE1B,qBAAW,CAAC,KAAK;AAAA,QACnB,WAAW,MAAM,QAAQ,QAAQ,GAAG;AAElC,qBAAW,CAAC,GAAG,UAAU,KAAK;AAAA,QAChC,OAAO;AAEL,qBAAW,CAAC,UAAU,KAAK;AAAA,QAC7B;AAEA,cAAM,KAAK,IAAI,KAAK,UAAU,EAAE;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,UAAU,KAAa,SAAS,GAAG,WAAqC;AAC5E,cAAM,KAAK,aAAa,KAAK,oBAAoB;AACjD,cAAM,WAAW,KAAK,IAAI,KAAK,EAAE;AAEjC,YAAI;AACJ,YAAI,aAAa,UAAa,aAAa,MAAM;AAE/C,qBAAW;AAAA,QACb,WAAW,OAAO,aAAa,UAAU;AAEvC,qBAAW,WAAW;AAAA,QACxB,OAAO;AACL,gBAAM,IAAI;AAAA,YACR,8CAA8C,GAAG,YAAY,OAAO,QAAQ;AAAA,UAC9E;AAAA,QACF;AAEA,cAAM,KAAK,IAAI,KAAK,UAAU,EAAE;AAChC,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAO,KAAa,WAAsC;AAC9D,cAAM,KAAK,aAAa,KAAK,oBAAoB;AACjD,cAAM,SAAS,KAAK,KAAK,IAAI,EAAE;AAE/B,YAAI,CAAC,QAAQ;AACX,iBAAO;AAAA,QACT;AAEA,cAAM,UAAU,OAAO,OAAO,GAAG;AAGjC,YAAI,WAAW,KAAK,OAAO,YAAY,UAAU,KAAK,OAAO,WAAW;AACtE,gBAAM,KAAK,KAAK;AAAA,QAClB;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAM,WAAmC;AAC7C,YAAI,WAAW;AAEb,eAAK,KAAK,OAAO,SAAS;AAAA,QAC5B,OAAO;AAEL,eAAK,KAAK,MAAM;AAAA,QAClB;AAGA,YAAI,KAAK,OAAO,YAAY,UAAU,KAAK,OAAO,WAAW;AAC3D,gBAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,KAAK,WAA8B;AACjC,cAAM,KAAK,aAAa,KAAK,oBAAoB;AACjD,cAAM,SAAS,KAAK,KAAK,IAAI,EAAE;AAC/B,eAAO,SAAS,MAAM,KAAK,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKA,iBAA2B;AACzB,eAAO,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,WAA6C;AAClD,cAAM,KAAK,aAAa,KAAK,oBAAoB;AACjD,cAAM,SAAS,KAAK,KAAK,IAAI,EAAE;AAC/B,YAAI,CAAC,QAAQ;AACX,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,SAAkC,CAAC;AACzC,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3C,iBAAO,GAAG,IAAI;AAAA,QAChB;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAsB;AAC1B,YAAI,CAAC,KAAK,OAAO,MAAM;AACrB,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AAEA,cAAM,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,IAAI;AAC7D,cAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AAEnD,YAAI,KAAK,OAAO,WAAW,QAAQ;AACjC,gBAAM,KAAK,aAAa,OAAO;AAAA,QACjC,WAAW,KAAK,OAAO,WAAW,OAAO;AACvC,gBAAM,KAAK,YAAY,OAAO;AAAA,QAChC,OAAO;AACL,gBAAM,IAAI,MAAM,uBAAuB,KAAK,OAAO,MAAM,EAAE;AAAA,QAC7D;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAsB;AAC1B,YAAI,CAAC,KAAK,OAAO,MAAM;AACrB,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AAEA,cAAM,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,IAAI;AAG7D,cAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,cAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEvC,YAAI;AACJ,YAAI,KAAK,OAAO,WAAW,QAAQ;AACjC,oBAAU,KAAK,WAAW;AAAA,QAC5B,WAAW,KAAK,OAAO,WAAW,OAAO;AACvC,oBAAU,KAAK,UAAU;AAAA,QAC3B,OAAO;AACL,gBAAM,IAAI,MAAM,uBAAuB,KAAK,OAAO,MAAM,EAAE;AAAA,QAC7D;AAEA,cAAM,GAAG,UAAU,UAAU,SAAS,OAAO;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,aAAa,SAAgC;AACzD,cAAM,OAAO,KAAK,MAAM,OAAO;AAG/B,aAAK,KAAK,MAAM;AAGhB,mBAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG;AACtD,cAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,kBAAM,QAAQ,oBAAI,IAAqB;AACvC,uBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,oBAAM,IAAI,KAAK,KAAK;AAAA,YACtB;AACA,iBAAK,KAAK,IAAI,WAAW,KAAK;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAqB;AAC3B,cAAM,SAAkD,CAAC;AAEzD,mBAAW,CAAC,WAAW,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG;AACrD,gBAAM,QAAiC,CAAC;AACxC,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3C,kBAAM,GAAG,IAAI;AAAA,UACf;AACA,iBAAO,SAAS,IAAI;AAAA,QACtB;AAEA,eAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,YAAY,SAAgC;AACxD,cAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,UAAQ,KAAK,KAAK,CAAC;AAG5D,YAAI,aAAa;AACjB,YAAI,MAAM,CAAC,GAAG,WAAW,YAAY,GAAG;AACtC,uBAAa;AAAA,QACf;AAGA,aAAK,KAAK,MAAM;AAGhB,cAAM,SAAS,oBAAI,IAAoC;AAEvD,iBAAS,IAAI,YAAY,IAAI,MAAM,QAAQ,KAAK;AAC9C,gBAAM,OAAO,MAAM,CAAC;AACpB,gBAAM,QAAQ,KAAK,aAAa,IAAI;AAEpC,cAAI,MAAM,SAAS,GAAG;AACpB,mBAAO,KAAK,oBAAoB,IAAI,CAAC,KAAK,IAAI,EAAE;AAChD;AAAA,UACF;AAEA,gBAAM,CAAC,WAAW,KAAK,UAAU,OAAO,IAAI;AAC5C,gBAAM,QAAQ,KAAK,cAAc,UAAU,OAAO;AAGlD,cAAI,CAAC,KAAK,KAAK,IAAI,SAAS,GAAG;AAC7B,iBAAK,KAAK,IAAI,WAAW,oBAAI,IAAI,CAAC;AAClC,mBAAO,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,UACjC;AAEA,gBAAM,SAAS,KAAK,KAAK,IAAI,SAAS;AACtC,gBAAM,WAAW,OAAO,IAAI,SAAS;AAGrC,cAAI,OAAO,IAAI,GAAG,GAAG;AAEnB,gBAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACtB,oBAAM,gBAAgB,OAAO,IAAI,GAAG;AACpC,uBAAS,IAAI,KAAK,CAAC,aAAa,CAAC;AAAA,YACnC;AACA,qBAAS,IAAI,GAAG,EAAG,KAAK,KAAK;AAC7B,mBAAO,IAAI,KAAK,SAAS,IAAI,GAAG,CAAE;AAAA,UACpC,OAAO;AAEL,mBAAO,IAAI,KAAK,KAAK;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAoB;AAC1B,cAAM,QAAkB,CAAC,0BAA0B;AAEnD,mBAAW,CAAC,WAAW,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG;AACrD,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3C,gBAAI,MAAM,QAAQ,KAAK,GAAG;AAExB,yBAAW,QAAQ,OAAO;AACxB,sBAAM,KAAK,KAAK,cAAc,WAAW,KAAK,IAAI,CAAC;AAAA,cACrD;AAAA,YACF,OAAO;AAEL,oBAAM,KAAK,KAAK,cAAc,WAAW,KAAK,KAAK,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI,IAAI;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAa,MAAwB;AAC3C,cAAM,QAAkB,CAAC;AACzB,YAAI,UAAU;AACd,YAAI,WAAW;AAEf,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,gBAAM,OAAO,KAAK,CAAC;AAEnB,cAAI,SAAS,KAAK;AAChB,gBAAI,YAAY,KAAK,IAAI,CAAC,MAAM,KAAK;AAEnC,yBAAW;AACX;AAAA,YACF,OAAO;AAEL,yBAAW,CAAC;AAAA,YACd;AAAA,UACF,WAAW,SAAS,OAAO,CAAC,UAAU;AAEpC,kBAAM,KAAK,OAAO;AAClB,sBAAU;AAAA,UACZ,OAAO;AACL,uBAAW;AAAA,UACb;AAAA,QACF;AAGA,cAAM,KAAK,OAAO;AAElB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,cAAc,WAAmB,KAAa,OAAwB;AAC5E,cAAM,OAAO,KAAK,aAAa,KAAK;AACpC,cAAM,WAAW,KAAK,eAAe,KAAK;AAE1C,eAAO,GAAG,KAAK,UAAU,SAAS,CAAC,IAAI,KAAK,UAAU,GAAG,CAAC,IAAI,QAAQ,IAAI,IAAI;AAAA,MAChF;AAAA;AAAA;AAAA;AAAA,MAKQ,UAAU,OAAuB;AACvC,YAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,IAAI,GAAG;AACtE,iBAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,QACtC;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,OAAwB;AAC7C,YAAI,UAAU,MAAM;AAClB,iBAAO;AAAA,QACT;AACA,YAAI,UAAU,QAAW;AACvB,iBAAO;AAAA,QACT;AACA,YAAI,OAAO,UAAU,UAAU;AAC7B,iBAAO,KAAK,UAAU,KAAK;AAAA,QAC7B;AACA,YAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAC3D,iBAAO,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,QACrC;AAEA,eAAO,KAAK,UAAU,KAAK,UAAU,KAAK,CAAC;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKQ,cAAc,UAAkB,SAA2B;AACjE,YAAI,CAAC,WAAW,YAAY,UAAU;AACpC,iBAAO;AAAA,QACT;AACA,YAAI,YAAY,UAAU;AACxB,iBAAO,OAAO,QAAQ;AAAA,QACxB;AACA,YAAI,YAAY,WAAW;AACzB,iBAAO,aAAa;AAAA,QACtB;AACA,YAAI,YAAY,YAAY,YAAY,SAAS;AAC/C,cAAI;AACF,mBAAO,KAAK,MAAM,QAAQ;AAAA,UAC5B,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAa,OAAwB;AAC3C,YAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,iBAAO;AAAA,QACT;AACA,YAAI,OAAO,UAAU,UAAU;AAC7B,iBAAO;AAAA,QACT;AACA,YAAI,OAAO,UAAU,WAAW;AAC9B,iBAAO;AAAA,QACT;AACA,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAO;AAAA,QACT;AACA,YAAI,OAAO,UAAU,UAAU;AAC7B,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,YAA0B;AACxB,eAAO,EAAE,GAAG,KAAK,OAAO;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA;","names":[]}