reqon-dsl 0.2.0 → 0.3.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 (396) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +22 -0
  3. package/dist/ast/nodes.d.ts +83 -4
  4. package/dist/ast/nodes.js +14 -0
  5. package/dist/auth/circuit-breaker.js +7 -6
  6. package/dist/auth/rate-limiter.d.ts +4 -0
  7. package/dist/auth/rate-limiter.js +9 -16
  8. package/dist/cli.d.ts +13 -0
  9. package/dist/cli.js +84 -4
  10. package/dist/config/constants.d.ts +141 -0
  11. package/dist/config/constants.js +128 -0
  12. package/dist/config/index.d.ts +4 -0
  13. package/dist/config/index.js +4 -0
  14. package/dist/control/index.d.ts +2 -0
  15. package/dist/control/index.js +1 -0
  16. package/dist/control/server.d.ts +88 -0
  17. package/dist/control/server.js +238 -0
  18. package/dist/control/types.d.ts +55 -0
  19. package/dist/control/types.js +7 -0
  20. package/dist/debug/cli-debugger.d.ts +17 -0
  21. package/dist/debug/cli-debugger.js +180 -0
  22. package/dist/debug/controller.d.ts +94 -0
  23. package/dist/debug/controller.js +45 -0
  24. package/dist/debug/index.d.ts +6 -0
  25. package/dist/debug/index.js +5 -0
  26. package/dist/errors/index.d.ts +67 -0
  27. package/dist/errors/index.js +89 -1
  28. package/dist/execution/index.d.ts +1 -1
  29. package/dist/execution/state.d.ts +24 -0
  30. package/dist/index.d.ts +21 -1
  31. package/dist/index.js +33 -2
  32. package/dist/interpreter/context.d.ts +14 -0
  33. package/dist/interpreter/context.js +15 -0
  34. package/dist/interpreter/evaluator.d.ts +63 -1
  35. package/dist/interpreter/evaluator.js +186 -39
  36. package/dist/interpreter/executor.d.ts +70 -14
  37. package/dist/interpreter/executor.js +503 -174
  38. package/dist/interpreter/fetch-handler.d.ts +9 -0
  39. package/dist/interpreter/fetch-handler.js +133 -24
  40. package/dist/interpreter/http.d.ts +5 -0
  41. package/dist/interpreter/http.js +26 -12
  42. package/dist/interpreter/index.d.ts +3 -1
  43. package/dist/interpreter/index.js +2 -0
  44. package/dist/interpreter/pagination.d.ts +11 -2
  45. package/dist/interpreter/pagination.js +95 -31
  46. package/dist/interpreter/signals.d.ts +8 -0
  47. package/dist/interpreter/signals.js +12 -0
  48. package/dist/interpreter/source-manager.d.ts +75 -0
  49. package/dist/interpreter/source-manager.js +157 -0
  50. package/dist/interpreter/step-handlers/apply-handler.d.ts +29 -0
  51. package/dist/interpreter/step-handlers/apply-handler.js +79 -0
  52. package/dist/interpreter/step-handlers/for-handler.d.ts +13 -0
  53. package/dist/interpreter/step-handlers/for-handler.js +71 -4
  54. package/dist/interpreter/step-handlers/index.d.ts +4 -2
  55. package/dist/interpreter/step-handlers/index.js +4 -2
  56. package/dist/interpreter/step-handlers/match-handler.d.ts +9 -0
  57. package/dist/interpreter/step-handlers/match-handler.js +43 -16
  58. package/dist/interpreter/step-handlers/pause-handler.d.ts +52 -0
  59. package/dist/interpreter/step-handlers/pause-handler.js +87 -0
  60. package/dist/interpreter/step-handlers/store-handler.d.ts +11 -1
  61. package/dist/interpreter/step-handlers/store-handler.js +45 -13
  62. package/dist/interpreter/step-handlers/types.d.ts +3 -0
  63. package/dist/interpreter/step-handlers/validate-handler.d.ts +2 -1
  64. package/dist/interpreter/step-handlers/validate-handler.js +4 -2
  65. package/dist/interpreter/step-handlers/webhook-handler.d.ts +3 -0
  66. package/dist/interpreter/step-handlers/webhook-handler.js +18 -2
  67. package/dist/interpreter/store-manager.d.ts +46 -0
  68. package/dist/interpreter/store-manager.js +66 -0
  69. package/dist/lexer/index.d.ts +11 -4
  70. package/dist/lexer/index.js +11 -4
  71. package/dist/lexer/tokens.d.ts +17 -1
  72. package/dist/lexer/tokens.js +36 -0
  73. package/dist/mcp/index.d.ts +11 -0
  74. package/dist/mcp/index.js +11 -0
  75. package/dist/mcp/server.d.ts +17 -0
  76. package/dist/mcp/server.js +451 -0
  77. package/dist/oas/index.d.ts +2 -0
  78. package/dist/oas/index.js +1 -0
  79. package/dist/oas/mock-generator.d.ts +12 -0
  80. package/dist/oas/mock-generator.js +187 -0
  81. package/dist/observability/events.d.ts +244 -0
  82. package/dist/observability/events.js +90 -0
  83. package/dist/observability/index.d.ts +15 -0
  84. package/dist/observability/index.js +12 -0
  85. package/dist/observability/logger.d.ts +106 -0
  86. package/dist/observability/logger.js +259 -0
  87. package/dist/observability/otel.d.ts +135 -0
  88. package/dist/observability/otel.js +386 -0
  89. package/dist/parser/action-parser.d.ts +105 -0
  90. package/dist/parser/action-parser.js +645 -0
  91. package/dist/parser/expressions.d.ts +13 -0
  92. package/dist/parser/expressions.js +72 -2
  93. package/dist/parser/fetch-parser.d.ts +27 -0
  94. package/dist/parser/fetch-parser.js +269 -0
  95. package/dist/parser/index.d.ts +17 -0
  96. package/dist/parser/index.js +17 -0
  97. package/dist/parser/parser.d.ts +44 -46
  98. package/dist/parser/parser.js +122 -1070
  99. package/dist/parser/pipeline-parser.d.ts +12 -0
  100. package/dist/parser/pipeline-parser.js +52 -0
  101. package/dist/parser/schedule-parser.d.ts +7 -0
  102. package/dist/parser/schedule-parser.js +137 -0
  103. package/dist/parser/source-parser.d.ts +9 -0
  104. package/dist/parser/source-parser.js +151 -0
  105. package/dist/pause/index.d.ts +14 -0
  106. package/dist/pause/index.js +11 -0
  107. package/dist/pause/manager.d.ts +118 -0
  108. package/dist/pause/manager.js +245 -0
  109. package/dist/pause/state.d.ts +93 -0
  110. package/dist/pause/state.js +103 -0
  111. package/dist/pause/store.d.ts +61 -0
  112. package/dist/pause/store.js +156 -0
  113. package/dist/plugin.d.ts +9 -12
  114. package/dist/plugin.js +10 -13
  115. package/dist/stores/factory.d.ts +1 -1
  116. package/dist/stores/factory.js +3 -2
  117. package/dist/stores/file.d.ts +26 -0
  118. package/dist/stores/file.js +64 -10
  119. package/dist/stores/index.d.ts +16 -1
  120. package/dist/stores/index.js +16 -1
  121. package/dist/stores/memory.d.ts +4 -0
  122. package/dist/stores/memory.js +11 -0
  123. package/dist/stores/types.d.ts +17 -0
  124. package/dist/stores/types.js +12 -0
  125. package/dist/trace/index.d.ts +16 -0
  126. package/dist/trace/index.js +12 -0
  127. package/dist/trace/recorder.d.ts +71 -0
  128. package/dist/trace/recorder.js +144 -0
  129. package/dist/trace/replay.d.ts +132 -0
  130. package/dist/trace/replay.js +264 -0
  131. package/dist/trace/state.d.ts +102 -0
  132. package/dist/trace/state.js +86 -0
  133. package/dist/trace/store.d.ts +69 -0
  134. package/dist/trace/store.js +225 -0
  135. package/dist/utils/index.d.ts +1 -0
  136. package/dist/utils/index.js +1 -0
  137. package/dist/utils/type-guards.d.ts +58 -0
  138. package/dist/utils/type-guards.js +92 -0
  139. package/dist/webhook/server.js +7 -6
  140. package/package.json +55 -6
  141. package/.claude/settings.local.json +0 -31
  142. package/.claude/skills/api-integration.md +0 -125
  143. package/.claude/skills/database-schema.md +0 -51
  144. package/.claude/skills/dsl-design.md +0 -80
  145. package/.claude/skills/property-testing.md +0 -143
  146. package/.claude/skills/reqon/SKILL.md +0 -44
  147. package/.claude/skills/reqon/references/examples.md +0 -206
  148. package/.claude/skills/reqon/references/syntax.md +0 -263
  149. package/.claude/skills/vscode-extension.md +0 -113
  150. package/.github/dependabot.yml +0 -32
  151. package/.github/pull_request_template.md +0 -21
  152. package/.github/workflows/ci.yml +0 -174
  153. package/.github/workflows/release.yml +0 -73
  154. package/CLAUDE.md +0 -72
  155. package/CONTRIBUTING.md +0 -161
  156. package/TODO.md +0 -51
  157. package/dist/auth/auth.test.d.ts +0 -1
  158. package/dist/auth/auth.test.js +0 -255
  159. package/dist/errors/errors.test.d.ts +0 -1
  160. package/dist/errors/errors.test.js +0 -165
  161. package/dist/execution/execution.test.d.ts +0 -1
  162. package/dist/execution/execution.test.js +0 -246
  163. package/dist/integration.test.d.ts +0 -1
  164. package/dist/integration.test.js +0 -168
  165. package/dist/interpreter/evaluator.test.d.ts +0 -1
  166. package/dist/interpreter/evaluator.test.js +0 -512
  167. package/dist/interpreter/http.test.d.ts +0 -1
  168. package/dist/interpreter/http.test.js +0 -299
  169. package/dist/interpreter/progress.test.d.ts +0 -1
  170. package/dist/interpreter/progress.test.js +0 -216
  171. package/dist/interpreter/schema-matcher.test.d.ts +0 -1
  172. package/dist/interpreter/schema-matcher.test.js +0 -122
  173. package/dist/lexer/lexer.d.ts +0 -24
  174. package/dist/lexer/lexer.js +0 -264
  175. package/dist/lexer/lexer.test.d.ts +0 -1
  176. package/dist/lexer/lexer.test.js +0 -259
  177. package/dist/loader/loader.test.d.ts +0 -1
  178. package/dist/loader/loader.test.js +0 -287
  179. package/dist/oas/oas.test.d.ts +0 -1
  180. package/dist/oas/oas.test.js +0 -218
  181. package/dist/parser/expressions.test.d.ts +0 -1
  182. package/dist/parser/expressions.test.js +0 -378
  183. package/dist/parser/match.test.d.ts +0 -1
  184. package/dist/parser/match.test.js +0 -254
  185. package/dist/parser/parser.test.d.ts +0 -1
  186. package/dist/parser/parser.test.js +0 -333
  187. package/dist/parser/schedule.test.d.ts +0 -1
  188. package/dist/parser/schedule.test.js +0 -241
  189. package/dist/scheduler/cron-parser.test.d.ts +0 -1
  190. package/dist/scheduler/cron-parser.test.js +0 -188
  191. package/dist/stores/file.test.d.ts +0 -1
  192. package/dist/stores/file.test.js +0 -165
  193. package/dist/stores/memory.test.d.ts +0 -1
  194. package/dist/stores/memory.test.js +0 -157
  195. package/dist/stores/stores.test.d.ts +0 -1
  196. package/dist/stores/stores.test.js +0 -158
  197. package/dist/sync/sync.test.d.ts +0 -1
  198. package/dist/sync/sync.test.js +0 -221
  199. package/docusaurus/README.md +0 -41
  200. package/docusaurus/docs/advanced/execution-state.md +0 -283
  201. package/docusaurus/docs/advanced/extending-reqon.md +0 -388
  202. package/docusaurus/docs/advanced/multi-file-missions.md +0 -250
  203. package/docusaurus/docs/advanced/parallel-execution.md +0 -353
  204. package/docusaurus/docs/api-reference.md +0 -443
  205. package/docusaurus/docs/authentication/api-key.md +0 -339
  206. package/docusaurus/docs/authentication/basic.md +0 -276
  207. package/docusaurus/docs/authentication/bearer.md +0 -282
  208. package/docusaurus/docs/authentication/oauth2.md +0 -317
  209. package/docusaurus/docs/authentication/overview.md +0 -251
  210. package/docusaurus/docs/cli.md +0 -229
  211. package/docusaurus/docs/core-concepts/actions.md +0 -286
  212. package/docusaurus/docs/core-concepts/missions.md +0 -264
  213. package/docusaurus/docs/core-concepts/schemas.md +0 -353
  214. package/docusaurus/docs/core-concepts/sources.md +0 -339
  215. package/docusaurus/docs/core-concepts/stores.md +0 -332
  216. package/docusaurus/docs/dsl-syntax/expressions.md +0 -361
  217. package/docusaurus/docs/dsl-syntax/fetch.md +0 -293
  218. package/docusaurus/docs/dsl-syntax/for-loops.md +0 -324
  219. package/docusaurus/docs/dsl-syntax/map.md +0 -345
  220. package/docusaurus/docs/dsl-syntax/match.md +0 -387
  221. package/docusaurus/docs/dsl-syntax/pipelines.md +0 -397
  222. package/docusaurus/docs/dsl-syntax/validate.md +0 -401
  223. package/docusaurus/docs/error-handling/dead-letter-queues.md +0 -399
  224. package/docusaurus/docs/error-handling/flow-control.md +0 -337
  225. package/docusaurus/docs/error-handling/retry-strategies.md +0 -368
  226. package/docusaurus/docs/examples.md +0 -488
  227. package/docusaurus/docs/getting-started.md +0 -256
  228. package/docusaurus/docs/http/circuit-breaker.md +0 -401
  229. package/docusaurus/docs/http/incremental-sync.md +0 -394
  230. package/docusaurus/docs/http/pagination.md +0 -361
  231. package/docusaurus/docs/http/rate-limiting.md +0 -383
  232. package/docusaurus/docs/http/requests.md +0 -328
  233. package/docusaurus/docs/http/retry.md +0 -402
  234. package/docusaurus/docs/intro.md +0 -90
  235. package/docusaurus/docs/openapi/loading-specs.md +0 -305
  236. package/docusaurus/docs/openapi/operation-calls.md +0 -314
  237. package/docusaurus/docs/openapi/overview.md +0 -212
  238. package/docusaurus/docs/openapi/response-validation.md +0 -344
  239. package/docusaurus/docs/scheduling/cron.md +0 -305
  240. package/docusaurus/docs/scheduling/daemon-mode.md +0 -317
  241. package/docusaurus/docs/scheduling/intervals.md +0 -289
  242. package/docusaurus/docs/scheduling/overview.md +0 -231
  243. package/docusaurus/docs/stores/custom-adapters.md +0 -376
  244. package/docusaurus/docs/stores/file.md +0 -236
  245. package/docusaurus/docs/stores/memory.md +0 -193
  246. package/docusaurus/docs/stores/overview.md +0 -274
  247. package/docusaurus/docs/stores/postgrest.md +0 -316
  248. package/docusaurus/docusaurus.config.ts +0 -148
  249. package/docusaurus/package-lock.json +0 -18029
  250. package/docusaurus/package.json +0 -47
  251. package/docusaurus/sidebars.ts +0 -155
  252. package/docusaurus/src/components/HomepageFeatures/index.tsx +0 -105
  253. package/docusaurus/src/components/HomepageFeatures/styles.module.css +0 -12
  254. package/docusaurus/src/css/custom.css +0 -169
  255. package/docusaurus/src/pages/index.module.css +0 -48
  256. package/docusaurus/src/pages/index.tsx +0 -110
  257. package/docusaurus/src/pages/markdown-page.md +0 -7
  258. package/docusaurus/static/.nojekyll +0 -0
  259. package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
  260. package/docusaurus/static/img/docusaurus.png +0 -0
  261. package/docusaurus/static/img/favicon.ico +0 -0
  262. package/docusaurus/static/img/logo.svg +0 -10
  263. package/docusaurus/static/img/undraw_docusaurus_mountain.svg +0 -171
  264. package/docusaurus/static/img/undraw_docusaurus_react.svg +0 -170
  265. package/docusaurus/static/img/undraw_docusaurus_tree.svg +0 -40
  266. package/docusaurus/tsconfig.json +0 -8
  267. package/examples/README.md +0 -112
  268. package/examples/error-handling/README.md +0 -150
  269. package/examples/error-handling/payment-processor.vague +0 -287
  270. package/examples/github-sync/README.md +0 -74
  271. package/examples/github-sync/fetch-issues.vague +0 -47
  272. package/examples/github-sync/fetch-prs.vague +0 -40
  273. package/examples/github-sync/mission.vague +0 -101
  274. package/examples/github-sync/normalize.vague +0 -70
  275. package/examples/jsonplaceholder/README.md +0 -28
  276. package/examples/jsonplaceholder/posts.vague +0 -48
  277. package/examples/petstore/README.md +0 -35
  278. package/examples/petstore/openapi.yaml +0 -97
  279. package/examples/petstore/sync.vague +0 -52
  280. package/examples/temporal-comparison/README.md +0 -297
  281. package/examples/temporal-comparison/reconciliation.vague +0 -355
  282. package/examples/temporal-comparison/temporal/activities/index.ts +0 -8
  283. package/examples/temporal-comparison/temporal/activities/shipstation.ts +0 -225
  284. package/examples/temporal-comparison/temporal/activities/shopify.ts +0 -257
  285. package/examples/temporal-comparison/temporal/activities/storage.ts +0 -198
  286. package/examples/temporal-comparison/temporal/activities/stripe.ts +0 -169
  287. package/examples/temporal-comparison/temporal/activities/validation.ts +0 -205
  288. package/examples/temporal-comparison/temporal/client/schedule.ts +0 -218
  289. package/examples/temporal-comparison/temporal/config/retry.ts +0 -63
  290. package/examples/temporal-comparison/temporal/types/index.ts +0 -129
  291. package/examples/temporal-comparison/temporal/workers/main.ts +0 -130
  292. package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +0 -262
  293. package/examples/xero/README.md +0 -88
  294. package/examples/xero/invoices.vague +0 -189
  295. package/src/api-integration.test.ts +0 -954
  296. package/src/ast/index.ts +0 -1
  297. package/src/ast/nodes.ts +0 -310
  298. package/src/auth/auth.test.ts +0 -326
  299. package/src/auth/circuit-breaker.test.ts +0 -390
  300. package/src/auth/circuit-breaker.ts +0 -379
  301. package/src/auth/credentials.test.ts +0 -273
  302. package/src/auth/credentials.ts +0 -246
  303. package/src/auth/index.ts +0 -40
  304. package/src/auth/oauth2-provider.ts +0 -177
  305. package/src/auth/rate-limiter.ts +0 -459
  306. package/src/auth/token-store.ts +0 -177
  307. package/src/auth/types.ts +0 -159
  308. package/src/benchmark/e2e.bench.ts +0 -288
  309. package/src/benchmark/evaluator.bench.ts +0 -331
  310. package/src/benchmark/fixtures.ts +0 -295
  311. package/src/benchmark/index.ts +0 -108
  312. package/src/benchmark/lexer.bench.ts +0 -69
  313. package/src/benchmark/parser.bench.ts +0 -103
  314. package/src/benchmark/resilience.bench.ts +0 -193
  315. package/src/benchmark/store.bench.ts +0 -147
  316. package/src/benchmark/utils.ts +0 -230
  317. package/src/cli.ts +0 -313
  318. package/src/errors/errors.test.ts +0 -234
  319. package/src/errors/index.ts +0 -223
  320. package/src/execution/execution.test.ts +0 -307
  321. package/src/execution/index.ts +0 -21
  322. package/src/execution/state.ts +0 -207
  323. package/src/execution/store.ts +0 -188
  324. package/src/index.ts +0 -169
  325. package/src/integration.test.ts +0 -192
  326. package/src/interpreter/context.ts +0 -57
  327. package/src/interpreter/evaluator.test.ts +0 -796
  328. package/src/interpreter/evaluator.ts +0 -245
  329. package/src/interpreter/executor.ts +0 -946
  330. package/src/interpreter/fetch-handler.ts +0 -302
  331. package/src/interpreter/http.test.ts +0 -423
  332. package/src/interpreter/http.ts +0 -308
  333. package/src/interpreter/index.ts +0 -32
  334. package/src/interpreter/pagination.ts +0 -207
  335. package/src/interpreter/progress.test.ts +0 -276
  336. package/src/interpreter/schema-matcher.test.ts +0 -160
  337. package/src/interpreter/schema-matcher.ts +0 -168
  338. package/src/interpreter/signals.ts +0 -73
  339. package/src/interpreter/step-handlers/for-handler.ts +0 -65
  340. package/src/interpreter/step-handlers/index.ts +0 -17
  341. package/src/interpreter/step-handlers/map-handler.ts +0 -24
  342. package/src/interpreter/step-handlers/match-handler.ts +0 -101
  343. package/src/interpreter/step-handlers/store-handler.ts +0 -78
  344. package/src/interpreter/step-handlers/types.ts +0 -17
  345. package/src/interpreter/step-handlers/validate-handler.ts +0 -30
  346. package/src/interpreter/step-handlers/webhook-handler.ts +0 -142
  347. package/src/lexer/index.ts +0 -18
  348. package/src/lexer/lexer.test.ts +0 -316
  349. package/src/lexer/tokens.ts +0 -179
  350. package/src/loader/index.ts +0 -288
  351. package/src/loader/loader.test.ts +0 -360
  352. package/src/oas/index.ts +0 -4
  353. package/src/oas/loader.ts +0 -126
  354. package/src/oas/oas.test.ts +0 -254
  355. package/src/oas/validator.ts +0 -299
  356. package/src/parser/base.ts +0 -124
  357. package/src/parser/expressions.test.ts +0 -525
  358. package/src/parser/expressions.ts +0 -314
  359. package/src/parser/index.ts +0 -3
  360. package/src/parser/match.test.ts +0 -296
  361. package/src/parser/parser.test.ts +0 -739
  362. package/src/parser/parser.ts +0 -1469
  363. package/src/parser/schedule.test.ts +0 -287
  364. package/src/parser/webhook.test.ts +0 -248
  365. package/src/plugin.ts +0 -83
  366. package/src/scheduler/cron-parser.test.ts +0 -236
  367. package/src/scheduler/cron-parser.ts +0 -236
  368. package/src/scheduler/index.ts +0 -10
  369. package/src/scheduler/scheduler.ts +0 -443
  370. package/src/scheduler/types.ts +0 -71
  371. package/src/stores/factory.ts +0 -104
  372. package/src/stores/file.test.ts +0 -276
  373. package/src/stores/file.ts +0 -211
  374. package/src/stores/index.ts +0 -6
  375. package/src/stores/memory.test.ts +0 -238
  376. package/src/stores/memory.ts +0 -63
  377. package/src/stores/postgrest.test.ts +0 -488
  378. package/src/stores/postgrest.ts +0 -263
  379. package/src/stores/stores.test.ts +0 -197
  380. package/src/stores/types.ts +0 -58
  381. package/src/sync/index.ts +0 -16
  382. package/src/sync/state.ts +0 -126
  383. package/src/sync/store.ts +0 -139
  384. package/src/sync/sync.test.ts +0 -271
  385. package/src/utils/async.ts +0 -10
  386. package/src/utils/file.ts +0 -106
  387. package/src/utils/index.ts +0 -14
  388. package/src/utils/logger.ts +0 -53
  389. package/src/utils/path.ts +0 -47
  390. package/src/webhook/index.ts +0 -15
  391. package/src/webhook/server.test.ts +0 -253
  392. package/src/webhook/server.ts +0 -389
  393. package/src/webhook/store.ts +0 -239
  394. package/src/webhook/types.ts +0 -93
  395. package/tsconfig.json +0 -17
  396. package/vitest.config.ts +0 -39
package/dist/plugin.js CHANGED
@@ -1,18 +1,15 @@
1
1
  /**
2
- * Reqon plugin for Vague.
3
- *
4
- * This plugin registers Reqon's keywords and statement parsers with Vague,
5
- * allowing Vague to parse Reqon syntax when the plugin is registered.
6
- *
7
- * Usage:
8
- * import { registerPlugin } from 'vague-lang';
9
- * import { reqonPlugin } from 'reqon';
10
- * registerPlugin(reqonPlugin);
11
- *
12
- * Or simply import the plugin module to auto-register:
13
- * import 'reqon/plugin';
2
+ * ---
3
+ * purpose: Vague plugin - registers Reqon keywords with Vague's lexer
4
+ * exports:
5
+ * - reqonPlugin - plugin object for manual registration
6
+ * - registerReqonPlugin, unregisterReqonPlugin - registration helpers
7
+ * related:
8
+ * - ./lexer/tokens.ts - REQON_KEYWORDS map
9
+ * - vague-lang - parent DSL framework
10
+ * ---
14
11
  */
15
- import { registerPlugin, unregisterPlugin, } from 'vague-lang';
12
+ import { registerPlugin, unregisterPlugin } from 'vague-lang';
16
13
  import { REQON_KEYWORDS } from './lexer/tokens.js';
17
14
  /**
18
15
  * Convert REQON_KEYWORDS map to PluginKeyword array for Vague plugin system.
@@ -33,4 +33,4 @@ export declare function createStore(options: CreateStoreOptions): StoreAdapter;
33
33
  * Map DSL store type to adapter type
34
34
  * In development mode, sql/nosql fall back to file stores
35
35
  */
36
- export declare function resolveStoreType(dslType: 'sql' | 'nosql' | 'memory', developmentMode?: boolean): StoreType;
36
+ export declare function resolveStoreType(dslType: 'sql' | 'nosql' | 'memory' | 'file' | 'postgrest', developmentMode?: boolean): StoreType;
@@ -61,8 +61,9 @@ export function createStore(options) {
61
61
  * In development mode, sql/nosql fall back to file stores
62
62
  */
63
63
  export function resolveStoreType(dslType, developmentMode = true) {
64
- if (dslType === 'memory') {
65
- return 'memory';
64
+ // These types are used directly
65
+ if (dslType === 'memory' || dslType === 'file' || dslType === 'postgrest') {
66
+ return dslType;
66
67
  }
67
68
  if (developmentMode) {
68
69
  // Use file stores for local development
@@ -12,6 +12,9 @@ export interface FileStoreOptions {
12
12
  /**
13
13
  * File-based JSON store for local development
14
14
  * Persists data to .reqon-data/{name}.json
15
+ *
16
+ * Use FileStore.create() for async initialization (recommended),
17
+ * or new FileStore() for lazy initialization (backward compatible).
15
18
  */
16
19
  export declare class FileStore implements StoreAdapter {
17
20
  private data;
@@ -19,9 +22,28 @@ export declare class FileStore implements StoreAdapter {
19
22
  private options;
20
23
  private dirty;
21
24
  private initialized;
25
+ private initError;
22
26
  private debounceTimer;
23
27
  private pendingWrite;
28
+ /**
29
+ * Create a FileStore with async initialization (recommended).
30
+ * The store is fully initialized when the promise resolves.
31
+ *
32
+ * @example
33
+ * const store = await FileStore.create('my-store', { baseDir: '.data' });
34
+ */
35
+ static create(name: string, options?: FileStoreOptions): Promise<FileStore>;
36
+ /**
37
+ * Constructor for lazy initialization (backward compatible).
38
+ * Each operation will wait for initialization to complete.
39
+ * Prefer FileStore.create() for explicit async initialization.
40
+ */
24
41
  constructor(name: string, options?: FileStoreOptions);
42
+ /**
43
+ * Ensure the store is initialized. Safe to call multiple times.
44
+ * Throws if initialization previously failed.
45
+ */
46
+ private ensureInitialized;
25
47
  private init;
26
48
  private load;
27
49
  private persist;
@@ -35,6 +57,10 @@ export declare class FileStore implements StoreAdapter {
35
57
  key: string;
36
58
  value: Record<string, unknown>;
37
59
  }>): Promise<void>;
60
+ bulkUpsert(records: Array<{
61
+ key: string;
62
+ value: Record<string, unknown>;
63
+ }>): Promise<void>;
38
64
  update(key: string, value: Partial<Record<string, unknown>>): Promise<void>;
39
65
  delete(key: string): Promise<void>;
40
66
  list(filter?: StoreFilter): Promise<Record<string, unknown>[]>;
@@ -12,19 +12,58 @@ const DEFAULT_OPTIONS = {
12
12
  /**
13
13
  * File-based JSON store for local development
14
14
  * Persists data to .reqon-data/{name}.json
15
+ *
16
+ * Use FileStore.create() for async initialization (recommended),
17
+ * or new FileStore() for lazy initialization (backward compatible).
15
18
  */
16
19
  export class FileStore {
17
20
  data = new Map();
18
21
  filePath;
19
22
  options;
20
23
  dirty = false;
21
- initialized;
24
+ initialized = null;
25
+ initError = null;
22
26
  debounceTimer = null;
23
27
  pendingWrite = null;
28
+ /**
29
+ * Create a FileStore with async initialization (recommended).
30
+ * The store is fully initialized when the promise resolves.
31
+ *
32
+ * @example
33
+ * const store = await FileStore.create('my-store', { baseDir: '.data' });
34
+ */
35
+ static async create(name, options = {}) {
36
+ const store = new FileStore(name, options);
37
+ await store.ensureInitialized();
38
+ return store;
39
+ }
40
+ /**
41
+ * Constructor for lazy initialization (backward compatible).
42
+ * Each operation will wait for initialization to complete.
43
+ * Prefer FileStore.create() for explicit async initialization.
44
+ */
24
45
  constructor(name, options = {}) {
25
46
  this.options = { ...DEFAULT_OPTIONS, ...options };
26
47
  this.filePath = join(this.options.baseDir, `${name}.json`);
27
- this.initialized = this.init();
48
+ // Lazy initialization - init() is called on first operation
49
+ }
50
+ /**
51
+ * Ensure the store is initialized. Safe to call multiple times.
52
+ * Throws if initialization previously failed.
53
+ */
54
+ async ensureInitialized() {
55
+ // If init previously failed, throw the cached error
56
+ if (this.initError) {
57
+ throw this.initError;
58
+ }
59
+ // If not yet started, start initialization
60
+ if (this.initialized === null) {
61
+ this.initialized = this.init().catch((error) => {
62
+ this.initError = error instanceof Error ? error : new Error(String(error));
63
+ throw this.initError;
64
+ });
65
+ }
66
+ await this.initialized;
28
67
  }
29
68
  async init() {
30
69
  const dir = dirname(this.filePath);
@@ -83,16 +122,16 @@ export class FileStore {
83
122
  this.dirty = false;
84
123
  }
85
124
  async get(key) {
86
- await this.initialized;
125
+ await this.ensureInitialized();
87
126
  return this.data.get(key) ?? null;
88
127
  }
89
128
  async set(key, value) {
90
- await this.initialized;
129
+ await this.ensureInitialized();
91
130
  this.data.set(key, { ...value });
92
131
  await this.persist();
93
132
  }
94
133
  async bulkSet(records) {
95
- await this.initialized;
134
+ await this.ensureInitialized();
96
135
  // Set all records in memory first (no disk I/O per record)
97
136
  for (const { key, value } of records) {
98
137
  this.data.set(key, { ...value });
@@ -100,8 +139,23 @@ export class FileStore {
100
139
  // Single persist operation for all records
101
140
  await this.persist();
102
141
  }
142
+ async bulkUpsert(records) {
143
+ await this.ensureInitialized();
144
+ // Upsert all records in memory first (no disk I/O per record)
145
+ for (const { key, value } of records) {
146
+ const existing = this.data.get(key);
147
+ if (existing) {
148
+ this.data.set(key, { ...existing, ...value });
149
+ }
150
+ else {
151
+ this.data.set(key, { ...value });
152
+ }
153
+ }
154
+ // Single persist operation for all records
155
+ await this.persist();
156
+ }
103
157
  async update(key, value) {
104
- await this.initialized;
158
+ await this.ensureInitialized();
105
159
  const existing = this.data.get(key);
106
160
  if (existing) {
107
161
  this.data.set(key, { ...existing, ...value });
@@ -112,16 +166,16 @@ export class FileStore {
112
166
  await this.persist();
113
167
  }
114
168
  async delete(key) {
115
- await this.initialized;
169
+ await this.ensureInitialized();
116
170
  this.data.delete(key);
117
171
  await this.persist();
118
172
  }
119
173
  async list(filter) {
120
- await this.initialized;
174
+ await this.ensureInitialized();
121
175
  return applyStoreFilter(Array.from(this.data.values()), filter);
122
176
  }
123
177
  async count(filter) {
124
- await this.initialized;
178
+ await this.ensureInitialized();
125
179
  // Apply only the where clause for counting (ignore limit/offset)
126
180
  const filtered = applyStoreFilter(Array.from(this.data.values()), {
127
181
  where: filter?.where,
@@ -129,7 +183,7 @@ export class FileStore {
129
183
  return filtered.length;
130
184
  }
131
185
  async clear() {
132
- await this.initialized;
186
+ await this.ensureInitialized();
133
187
  this.data.clear();
134
188
  await this.persist();
135
189
  }
@@ -1,6 +1,21 @@
1
+ /**
2
+ * ---
3
+ * purpose: Store adapters - pluggable storage backends for pipeline data
4
+ * exports:
5
+ * - StoreAdapter - interface for all stores
6
+ * - MemoryStore, FileStore, PostgRESTStore - implementations
7
+ * - createStore - factory function
8
+ * related:
9
+ * - ./types.ts - StoreAdapter interface definition
10
+ * - ./memory.ts - in-memory store (default)
11
+ * - ./file.ts - JSON/CSV file store
12
+ * - ./postgrest.ts - PostgREST API store
13
+ * - ../interpreter/context.ts - stores registered in context
14
+ * ---
15
+ */
1
16
  export type { StoreAdapter, StoreFilter, StoreConfig } from './types.js';
2
17
  export { applyStoreFilter } from './types.js';
3
18
  export { MemoryStore } from './memory.js';
4
19
  export { FileStore, type FileStoreOptions } from './file.js';
5
20
  export { PostgRESTStore, PostgRESTError, type PostgRESTOptions } from './postgrest.js';
6
- export { createStore, resolveStoreType, type StoreType, type CreateStoreOptions } from './factory.js';
21
+ export { createStore, resolveStoreType, type StoreType, type CreateStoreOptions, } from './factory.js';
@@ -1,5 +1,20 @@
1
+ /**
2
+ * ---
3
+ * purpose: Store adapters - pluggable storage backends for pipeline data
4
+ * exports:
5
+ * - StoreAdapter - interface for all stores
6
+ * - MemoryStore, FileStore, PostgRESTStore - implementations
7
+ * - createStore - factory function
8
+ * related:
9
+ * - ./types.ts - StoreAdapter interface definition
10
+ * - ./memory.ts - in-memory store (default)
11
+ * - ./file.ts - JSON/CSV file store
12
+ * - ./postgrest.ts - PostgREST API store
13
+ * - ../interpreter/context.ts - stores registered in context
14
+ * ---
15
+ */
1
16
  export { applyStoreFilter } from './types.js';
2
17
  export { MemoryStore } from './memory.js';
3
18
  export { FileStore } from './file.js';
4
19
  export { PostgRESTStore, PostgRESTError } from './postgrest.js';
5
- export { createStore, resolveStoreType } from './factory.js';
20
+ export { createStore, resolveStoreType, } from './factory.js';
@@ -9,6 +9,10 @@ export declare class MemoryStore implements StoreAdapter {
9
9
  key: string;
10
10
  value: Record<string, unknown>;
11
11
  }>): Promise<void>;
12
+ bulkUpsert(records: Array<{
13
+ key: string;
14
+ value: Record<string, unknown>;
15
+ }>): Promise<void>;
12
16
  update(key: string, value: Partial<Record<string, unknown>>): Promise<void>;
13
17
  delete(key: string): Promise<void>;
14
18
  list(filter?: StoreFilter): Promise<Record<string, unknown>[]>;
@@ -16,6 +16,17 @@ export class MemoryStore {
16
16
  this.data.set(key, { ...value });
17
17
  }
18
18
  }
19
+ async bulkUpsert(records) {
20
+ for (const { key, value } of records) {
21
+ const existing = this.data.get(key);
22
+ if (existing) {
23
+ this.data.set(key, { ...existing, ...value });
24
+ }
25
+ else {
26
+ this.data.set(key, { ...value });
27
+ }
28
+ }
29
+ }
19
30
  async update(key, value) {
20
31
  const existing = this.data.get(key);
21
32
  if (existing) {
@@ -1,3 +1,15 @@
1
+ /**
2
+ * ---
3
+ * purpose: Store interface definitions - contract for all store adapters
4
+ * exports:
5
+ * - StoreAdapter - CRUD interface (get, set, update, delete, list, count)
6
+ * - StoreFilter - where/limit/offset for queries
7
+ * - StoreConfig - store type configuration
8
+ * related:
9
+ * - ./memory.ts, ./file.ts, ./postgrest.ts - implementations
10
+ * - ../interpreter/step-handlers/store-handler.ts - uses StoreAdapter
11
+ * ---
12
+ */
1
13
  export interface StoreAdapter {
2
14
  get(key: string): Promise<Record<string, unknown> | null>;
3
15
  set(key: string, value: Record<string, unknown>): Promise<void>;
@@ -6,6 +18,11 @@ export interface StoreAdapter {
6
18
  key: string;
7
19
  value: Record<string, unknown>;
8
20
  }>): Promise<void>;
21
+ /** Bulk upsert multiple records at once - more efficient than individual updates */
22
+ bulkUpsert?(records: Array<{
23
+ key: string;
24
+ value: Record<string, unknown>;
25
+ }>): Promise<void>;
9
26
  update(key: string, value: Partial<Record<string, unknown>>): Promise<void>;
10
27
  delete(key: string): Promise<void>;
11
28
  list(filter?: StoreFilter): Promise<Record<string, unknown>[]>;
@@ -1,3 +1,15 @@
1
+ /**
2
+ * ---
3
+ * purpose: Store interface definitions - contract for all store adapters
4
+ * exports:
5
+ * - StoreAdapter - CRUD interface (get, set, update, delete, list, count)
6
+ * - StoreFilter - where/limit/offset for queries
7
+ * - StoreConfig - store type configuration
8
+ * related:
9
+ * - ./memory.ts, ./file.ts, ./postgrest.ts - implementations
10
+ * - ../interpreter/step-handlers/store-handler.ts - uses StoreAdapter
11
+ * ---
12
+ */
1
13
  /**
2
14
  * Apply filter criteria to a list of records.
3
15
  * Handles where clause, offset, and limit.
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Trace Module - Time-travel debugging for Reqon
3
+ *
4
+ * Provides execution tracing, replay, and debugging capabilities:
5
+ * - TraceRecorder: Captures execution state at each step
6
+ * - TraceStore: Persists traces for later analysis
7
+ * - TraceReplayer: Navigates and inspects recorded traces
8
+ */
9
+ export type { TraceSnapshot, StoreSnapshot, LoopContext, ExecutionTrace } from './state.js';
10
+ export { generateSnapshotId, createExecutionTrace, safeClone, truncateForTrace } from './state.js';
11
+ export type { TraceStore } from './store.js';
12
+ export { FileTraceStore, MemoryTraceStore } from './store.js';
13
+ export type { TraceRecorderConfig } from './recorder.js';
14
+ export { TraceRecorder, createTraceRecorder } from './recorder.js';
15
+ export type { ReplaySession, ReplayStepResult, TimelineEvent, VariableChange, SnapshotDiff, } from './replay.js';
16
+ export { TraceReplayer, createTraceReplayer } from './replay.js';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Trace Module - Time-travel debugging for Reqon
3
+ *
4
+ * Provides execution tracing, replay, and debugging capabilities:
5
+ * - TraceRecorder: Captures execution state at each step
6
+ * - TraceStore: Persists traces for later analysis
7
+ * - TraceReplayer: Navigates and inspects recorded traces
8
+ */
9
+ export { generateSnapshotId, createExecutionTrace, safeClone, truncateForTrace } from './state.js';
10
+ export { FileTraceStore, MemoryTraceStore } from './store.js';
11
+ export { TraceRecorder, createTraceRecorder } from './recorder.js';
12
+ export { TraceReplayer, createTraceReplayer } from './replay.js';
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Trace Recorder - Captures execution state for time-travel debugging
3
+ *
4
+ * Used by the executor to record snapshots at each step,
5
+ * building a complete trace that can be replayed later.
6
+ */
7
+ import type { ExecutionContext } from '../interpreter/context.js';
8
+ import type { TraceStore } from './store.js';
9
+ import { type ExecutionTrace, type TraceSnapshot, type LoopContext } from './state.js';
10
+ export interface TraceRecorderConfig {
11
+ /** Execution ID (used as trace ID) */
12
+ executionId: string;
13
+ /** Mission name */
14
+ mission: string;
15
+ /** Trace mode */
16
+ mode: 'full' | 'minimal';
17
+ /** Store for persisting traces */
18
+ store: TraceStore;
19
+ /** Metadata to attach to trace */
20
+ metadata?: Record<string, unknown>;
21
+ /** Whether to stream snapshots (append as they happen) vs batch at end */
22
+ streaming?: boolean;
23
+ /** Max items to include in store samples */
24
+ maxStoreItems?: number;
25
+ }
26
+ /**
27
+ * Records execution state for time-travel debugging
28
+ */
29
+ export declare class TraceRecorder {
30
+ private config;
31
+ private trace;
32
+ private snapshotIndex;
33
+ private currentLoopContext?;
34
+ constructor(config: TraceRecorderConfig);
35
+ /**
36
+ * Record a snapshot before step execution
37
+ */
38
+ recordBeforeStep(action: string, stepIndex: number, stepType: string, ctx: ExecutionContext): Promise<void>;
39
+ /**
40
+ * Record a snapshot after step execution
41
+ */
42
+ recordAfterStep(action: string, stepIndex: number, stepType: string, ctx: ExecutionContext, stepDuration: number, error?: string): Promise<void>;
43
+ /**
44
+ * Set loop context for subsequent snapshots
45
+ */
46
+ setLoopContext(context: LoopContext | undefined): void;
47
+ /**
48
+ * Finalize the trace (called when execution completes)
49
+ */
50
+ finalize(success: boolean): Promise<ExecutionTrace>;
51
+ /**
52
+ * Get the current trace (without finalizing)
53
+ */
54
+ getTrace(): ExecutionTrace;
55
+ /**
56
+ * Get a specific snapshot by index
57
+ */
58
+ getSnapshot(index: number): TraceSnapshot | undefined;
59
+ /**
60
+ * Get the total number of snapshots recorded
61
+ */
62
+ getSnapshotCount(): number;
63
+ private createSnapshot;
64
+ private captureVariables;
65
+ private captureStores;
66
+ private addSnapshot;
67
+ }
68
+ /**
69
+ * Create a trace recorder for an execution
70
+ */
71
+ export declare function createTraceRecorder(config: TraceRecorderConfig): TraceRecorder;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Trace Recorder - Captures execution state for time-travel debugging
3
+ *
4
+ * Used by the executor to record snapshots at each step,
5
+ * building a complete trace that can be replayed later.
6
+ */
7
+ import { createExecutionTrace, generateSnapshotId, safeClone, truncateForTrace, } from './state.js';
8
+ /**
9
+ * Records execution state for time-travel debugging
10
+ */
11
+ export class TraceRecorder {
12
+ config;
13
+ trace;
14
+ snapshotIndex = 0;
15
+ currentLoopContext;
16
+ constructor(config) {
17
+ this.config = config;
18
+ this.trace = createExecutionTrace(config.executionId, config.mission, config.mode, config.metadata);
19
+ }
20
+ /**
21
+ * Record a snapshot before step execution
22
+ */
23
+ async recordBeforeStep(action, stepIndex, stepType, ctx) {
24
+ const snapshot = this.createSnapshot(action, stepIndex, stepType, 'before', ctx);
25
+ await this.addSnapshot(snapshot);
26
+ }
27
+ /**
28
+ * Record a snapshot after step execution
29
+ */
30
+ async recordAfterStep(action, stepIndex, stepType, ctx, stepDuration, error) {
31
+ const snapshot = this.createSnapshot(action, stepIndex, stepType, 'after', ctx);
32
+ snapshot.stepDuration = stepDuration;
33
+ snapshot.error = error;
34
+ await this.addSnapshot(snapshot);
35
+ }
36
+ /**
37
+ * Set loop context for subsequent snapshots
38
+ */
39
+ setLoopContext(context) {
40
+ this.currentLoopContext = context;
41
+ }
42
+ /**
43
+ * Finalize the trace (called when execution completes)
44
+ */
45
+ async finalize(success) {
46
+ this.trace.completedAt = new Date();
47
+ this.trace.duration = this.trace.completedAt.getTime() - this.trace.startedAt.getTime();
48
+ this.trace.success = success;
49
+ // If not streaming, save entire trace at end
50
+ if (!this.config.streaming) {
51
+ await this.config.store.save(this.trace);
52
+ }
53
+ return this.trace;
54
+ }
55
+ /**
56
+ * Get the current trace (without finalizing)
57
+ */
58
+ getTrace() {
59
+ return this.trace;
60
+ }
61
+ /**
62
+ * Get a specific snapshot by index
63
+ */
64
+ getSnapshot(index) {
65
+ return this.trace.snapshots[index];
66
+ }
67
+ /**
68
+ * Get the total number of snapshots recorded
69
+ */
70
+ getSnapshotCount() {
71
+ return this.trace.snapshots.length;
72
+ }
73
+ createSnapshot(action, stepIndex, stepType, phase, ctx) {
74
+ const index = this.snapshotIndex++;
75
+ // Capture variables from context chain
76
+ const variables = this.captureVariables(ctx);
77
+ // Capture store states
78
+ const stores = this.captureStores(ctx);
79
+ // Capture response (truncated for large responses)
80
+ const response = this.config.mode === 'full' ? truncateForTrace(safeClone(ctx.response)) : undefined;
81
+ return {
82
+ id: generateSnapshotId(this.trace.id, index),
83
+ index,
84
+ timestamp: new Date(),
85
+ mission: this.trace.mission,
86
+ action,
87
+ stepIndex,
88
+ stepType,
89
+ phase,
90
+ variables,
91
+ response,
92
+ stores,
93
+ loopContext: this.currentLoopContext ? { ...this.currentLoopContext } : undefined,
94
+ };
95
+ }
96
+ captureVariables(ctx) {
97
+ const variables = {};
98
+ let current = ctx;
99
+ while (current) {
100
+ for (const [key, value] of current.variables) {
101
+ if (!(key in variables)) {
102
+ // Clone and truncate for trace storage
103
+ variables[key] =
104
+ this.config.mode === 'full' ? truncateForTrace(safeClone(value)) : typeof value;
105
+ }
106
+ }
107
+ current = current.parent;
108
+ }
109
+ return variables;
110
+ }
111
+ captureStores(ctx) {
112
+ const stores = {};
113
+ const maxItems = this.config.maxStoreItems ?? 10;
114
+ for (const [name, _store] of ctx.stores) {
115
+ const storeType = ctx.storeTypes.get(name) ?? 'unknown';
116
+ // Note: Getting actual item count would require async call
117
+ // For now, we just record the type
118
+ stores[name] = {
119
+ type: storeType,
120
+ itemCount: -1, // Would need async to get actual count
121
+ sampleItems: this.config.mode === 'full' ? [] : undefined,
122
+ };
123
+ // In full mode, we could sample items if we had sync access
124
+ // For now, this is a placeholder for future enhancement
125
+ if (this.config.mode === 'full' && maxItems > 0) {
126
+ // TODO: Add async store sampling if needed
127
+ }
128
+ }
129
+ return stores;
130
+ }
131
+ async addSnapshot(snapshot) {
132
+ this.trace.snapshots.push(snapshot);
133
+ // If streaming mode, persist immediately
134
+ if (this.config.streaming) {
135
+ await this.config.store.appendSnapshot(this.trace.id, snapshot);
136
+ }
137
+ }
138
+ }
139
+ /**
140
+ * Create a trace recorder for an execution
141
+ */
142
+ export function createTraceRecorder(config) {
143
+ return new TraceRecorder(config);
144
+ }