reqon-dsl 0.2.0 → 0.4.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.
- package/CHANGELOG.md +7 -0
- package/README.md +45 -3
- package/dist/ast/nodes.d.ts +91 -4
- package/dist/ast/nodes.js +14 -0
- package/dist/auth/circuit-breaker.d.ts +11 -0
- package/dist/auth/circuit-breaker.js +90 -18
- package/dist/auth/credentials.d.ts +6 -1
- package/dist/auth/credentials.js +12 -4
- package/dist/auth/oauth2-provider.js +13 -3
- package/dist/auth/rate-limiter.d.ts +12 -1
- package/dist/auth/rate-limiter.js +39 -26
- package/dist/auth/token-store.js +8 -1
- package/dist/cli.d.ts +24 -1
- package/dist/cli.js +149 -10
- package/dist/config/constants.d.ts +152 -0
- package/dist/config/constants.js +139 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.js +4 -0
- package/dist/control/index.d.ts +2 -0
- package/dist/control/index.js +1 -0
- package/dist/control/server.d.ts +105 -0
- package/dist/control/server.js +315 -0
- package/dist/control/types.d.ts +61 -0
- package/dist/control/types.js +7 -0
- package/dist/debug/cli-debugger.d.ts +17 -0
- package/dist/debug/cli-debugger.js +185 -0
- package/dist/debug/controller.d.ts +94 -0
- package/dist/debug/controller.js +45 -0
- package/dist/debug/index.d.ts +6 -0
- package/dist/debug/index.js +5 -0
- package/dist/errors/index.d.ts +67 -0
- package/dist/errors/index.js +89 -1
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/state.d.ts +24 -0
- package/dist/execution/store.js +2 -2
- package/dist/execution-log/events.d.ts +125 -0
- package/dist/execution-log/events.js +17 -0
- package/dist/execution-log/fold.d.ts +38 -0
- package/dist/execution-log/fold.js +54 -0
- package/dist/execution-log/index.d.ts +18 -0
- package/dist/execution-log/index.js +6 -0
- package/dist/execution-log/postgres-store.d.ts +36 -0
- package/dist/execution-log/postgres-store.js +108 -0
- package/dist/execution-log/resume.d.ts +11 -0
- package/dist/execution-log/resume.js +5 -0
- package/dist/execution-log/sqlite-store.d.ts +16 -0
- package/dist/execution-log/sqlite-store.js +101 -0
- package/dist/execution-log/store.d.ts +72 -0
- package/dist/execution-log/store.js +182 -0
- package/dist/index.d.ts +23 -2
- package/dist/index.js +35 -3
- package/dist/interpreter/context.d.ts +29 -0
- package/dist/interpreter/context.js +18 -0
- package/dist/interpreter/evaluator.d.ts +63 -1
- package/dist/interpreter/evaluator.js +219 -42
- package/dist/interpreter/executor.d.ts +132 -14
- package/dist/interpreter/executor.js +883 -178
- package/dist/interpreter/fetch-handler.d.ts +48 -1
- package/dist/interpreter/fetch-handler.js +216 -38
- package/dist/interpreter/http.d.ts +34 -0
- package/dist/interpreter/http.js +203 -28
- package/dist/interpreter/index.d.ts +5 -3
- package/dist/interpreter/index.js +4 -2
- package/dist/interpreter/pagination.d.ts +12 -3
- package/dist/interpreter/pagination.js +102 -32
- package/dist/interpreter/signals.d.ts +8 -0
- package/dist/interpreter/signals.js +12 -0
- package/dist/interpreter/source-manager.d.ts +75 -0
- package/dist/interpreter/source-manager.js +157 -0
- package/dist/interpreter/step-handlers/apply-handler.d.ts +29 -0
- package/dist/interpreter/step-handlers/apply-handler.js +79 -0
- package/dist/interpreter/step-handlers/for-handler.d.ts +16 -0
- package/dist/interpreter/step-handlers/for-handler.js +89 -7
- package/dist/interpreter/step-handlers/index.d.ts +4 -2
- package/dist/interpreter/step-handlers/index.js +4 -2
- package/dist/interpreter/step-handlers/match-handler.d.ts +9 -0
- package/dist/interpreter/step-handlers/match-handler.js +47 -17
- package/dist/interpreter/step-handlers/pause-handler.d.ts +52 -0
- package/dist/interpreter/step-handlers/pause-handler.js +87 -0
- package/dist/interpreter/step-handlers/store-handler.d.ts +17 -1
- package/dist/interpreter/step-handlers/store-handler.js +61 -20
- package/dist/interpreter/step-handlers/types.d.ts +3 -0
- package/dist/interpreter/step-handlers/validate-handler.d.ts +2 -1
- package/dist/interpreter/step-handlers/validate-handler.js +7 -2
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +4 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +31 -5
- package/dist/interpreter/store-manager.d.ts +46 -0
- package/dist/interpreter/store-manager.js +70 -0
- package/dist/lexer/index.d.ts +11 -4
- package/dist/lexer/index.js +11 -4
- package/dist/lexer/tokens.d.ts +17 -1
- package/dist/lexer/tokens.js +36 -0
- package/dist/loader/index.js +5 -8
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/sandbox.d.ts +41 -0
- package/dist/mcp/sandbox.js +76 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.js +504 -0
- package/dist/oas/index.d.ts +2 -0
- package/dist/oas/index.js +1 -0
- package/dist/oas/loader.d.ts +13 -1
- package/dist/oas/loader.js +25 -3
- package/dist/oas/mock-generator.d.ts +12 -0
- package/dist/oas/mock-generator.js +196 -0
- package/dist/oas/validator.js +45 -5
- package/dist/observability/events.d.ts +248 -0
- package/dist/observability/events.js +85 -0
- package/dist/observability/index.d.ts +15 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/logger.d.ts +106 -0
- package/dist/observability/logger.js +266 -0
- package/dist/observability/otel.d.ts +143 -0
- package/dist/observability/otel.js +421 -0
- package/dist/parser/action-parser.d.ts +105 -0
- package/dist/parser/action-parser.js +645 -0
- package/dist/parser/base.d.ts +7 -0
- package/dist/parser/base.js +11 -0
- package/dist/parser/expressions.d.ts +14 -0
- package/dist/parser/expressions.js +89 -6
- package/dist/parser/fetch-parser.d.ts +27 -0
- package/dist/parser/fetch-parser.js +280 -0
- package/dist/parser/index.d.ts +17 -0
- package/dist/parser/index.js +17 -0
- package/dist/parser/parser.d.ts +44 -46
- package/dist/parser/parser.js +122 -1070
- package/dist/parser/pipeline-parser.d.ts +12 -0
- package/dist/parser/pipeline-parser.js +52 -0
- package/dist/parser/schedule-parser.d.ts +7 -0
- package/dist/parser/schedule-parser.js +137 -0
- package/dist/parser/source-parser.d.ts +9 -0
- package/dist/parser/source-parser.js +151 -0
- package/dist/pause/index.d.ts +15 -0
- package/dist/pause/index.js +12 -0
- package/dist/pause/log-store.d.ts +33 -0
- package/dist/pause/log-store.js +98 -0
- package/dist/pause/manager.d.ts +130 -0
- package/dist/pause/manager.js +294 -0
- package/dist/pause/state.d.ts +93 -0
- package/dist/pause/state.js +103 -0
- package/dist/pause/store.d.ts +61 -0
- package/dist/pause/store.js +158 -0
- package/dist/plugin.d.ts +9 -12
- package/dist/plugin.js +10 -13
- package/dist/scheduler/cron-parser.d.ts +10 -3
- package/dist/scheduler/cron-parser.js +227 -48
- package/dist/scheduler/scheduler.js +56 -22
- package/dist/stores/factory.d.ts +7 -1
- package/dist/stores/factory.js +14 -3
- package/dist/stores/file.d.ts +26 -0
- package/dist/stores/file.js +67 -21
- package/dist/stores/index.d.ts +16 -1
- package/dist/stores/index.js +16 -1
- package/dist/stores/memory.d.ts +4 -0
- package/dist/stores/memory.js +8 -6
- package/dist/stores/postgrest.d.ts +28 -0
- package/dist/stores/postgrest.js +84 -37
- package/dist/stores/types.d.ts +17 -0
- package/dist/stores/types.js +12 -0
- package/dist/sync/index.d.ts +3 -2
- package/dist/sync/index.js +2 -1
- package/dist/sync/log-store.d.ts +30 -0
- package/dist/sync/log-store.js +45 -0
- package/dist/sync/store.js +1 -1
- package/dist/trace/index.d.ts +18 -0
- package/dist/trace/index.js +13 -0
- package/dist/trace/log-view.d.ts +57 -0
- package/dist/trace/log-view.js +76 -0
- package/dist/trace/recorder.d.ts +75 -0
- package/dist/trace/recorder.js +157 -0
- package/dist/trace/replay.d.ts +132 -0
- package/dist/trace/replay.js +264 -0
- package/dist/trace/state.d.ts +102 -0
- package/dist/trace/state.js +86 -0
- package/dist/trace/store.d.ts +75 -0
- package/dist/trace/store.js +250 -0
- package/dist/utils/deep-merge.d.ts +10 -0
- package/dist/utils/deep-merge.js +23 -0
- package/dist/utils/file.d.ts +13 -4
- package/dist/utils/file.js +70 -12
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/long-timeout.d.ts +19 -0
- package/dist/utils/long-timeout.js +33 -0
- package/dist/utils/path.d.ts +22 -1
- package/dist/utils/path.js +46 -1
- package/dist/utils/redact.d.ts +22 -0
- package/dist/utils/redact.js +42 -0
- package/dist/utils/type-guards.d.ts +58 -0
- package/dist/utils/type-guards.js +92 -0
- package/dist/webhook/server.d.ts +9 -0
- package/dist/webhook/server.js +122 -36
- package/dist/webhook/types.d.ts +9 -1
- package/package.json +76 -9
- package/.claude/settings.local.json +0 -31
- package/.claude/skills/api-integration.md +0 -125
- package/.claude/skills/database-schema.md +0 -51
- package/.claude/skills/dsl-design.md +0 -80
- package/.claude/skills/property-testing.md +0 -143
- package/.claude/skills/reqon/SKILL.md +0 -44
- package/.claude/skills/reqon/references/examples.md +0 -206
- package/.claude/skills/reqon/references/syntax.md +0 -263
- package/.claude/skills/vscode-extension.md +0 -113
- package/.github/dependabot.yml +0 -32
- package/.github/pull_request_template.md +0 -21
- package/.github/workflows/ci.yml +0 -174
- package/.github/workflows/release.yml +0 -73
- package/CLAUDE.md +0 -72
- package/CONTRIBUTING.md +0 -161
- package/TODO.md +0 -51
- package/dist/auth/auth.test.d.ts +0 -1
- package/dist/auth/auth.test.js +0 -255
- package/dist/errors/errors.test.d.ts +0 -1
- package/dist/errors/errors.test.js +0 -165
- package/dist/execution/execution.test.d.ts +0 -1
- package/dist/execution/execution.test.js +0 -246
- package/dist/integration.test.d.ts +0 -1
- package/dist/integration.test.js +0 -168
- package/dist/interpreter/evaluator.test.d.ts +0 -1
- package/dist/interpreter/evaluator.test.js +0 -512
- package/dist/interpreter/http.test.d.ts +0 -1
- package/dist/interpreter/http.test.js +0 -299
- package/dist/interpreter/progress.test.d.ts +0 -1
- package/dist/interpreter/progress.test.js +0 -216
- package/dist/interpreter/schema-matcher.test.d.ts +0 -1
- package/dist/interpreter/schema-matcher.test.js +0 -122
- package/dist/lexer/lexer.d.ts +0 -24
- package/dist/lexer/lexer.js +0 -264
- package/dist/lexer/lexer.test.d.ts +0 -1
- package/dist/lexer/lexer.test.js +0 -259
- package/dist/loader/loader.test.d.ts +0 -1
- package/dist/loader/loader.test.js +0 -287
- package/dist/oas/oas.test.d.ts +0 -1
- package/dist/oas/oas.test.js +0 -218
- package/dist/parser/expressions.test.d.ts +0 -1
- package/dist/parser/expressions.test.js +0 -378
- package/dist/parser/match.test.d.ts +0 -1
- package/dist/parser/match.test.js +0 -254
- package/dist/parser/parser.test.d.ts +0 -1
- package/dist/parser/parser.test.js +0 -333
- package/dist/parser/schedule.test.d.ts +0 -1
- package/dist/parser/schedule.test.js +0 -241
- package/dist/scheduler/cron-parser.test.d.ts +0 -1
- package/dist/scheduler/cron-parser.test.js +0 -188
- package/dist/stores/file.test.d.ts +0 -1
- package/dist/stores/file.test.js +0 -165
- package/dist/stores/memory.test.d.ts +0 -1
- package/dist/stores/memory.test.js +0 -157
- package/dist/stores/stores.test.d.ts +0 -1
- package/dist/stores/stores.test.js +0 -158
- package/dist/sync/sync.test.d.ts +0 -1
- package/dist/sync/sync.test.js +0 -221
- package/docusaurus/README.md +0 -41
- package/docusaurus/docs/advanced/execution-state.md +0 -283
- package/docusaurus/docs/advanced/extending-reqon.md +0 -388
- package/docusaurus/docs/advanced/multi-file-missions.md +0 -250
- package/docusaurus/docs/advanced/parallel-execution.md +0 -353
- package/docusaurus/docs/api-reference.md +0 -443
- package/docusaurus/docs/authentication/api-key.md +0 -339
- package/docusaurus/docs/authentication/basic.md +0 -276
- package/docusaurus/docs/authentication/bearer.md +0 -282
- package/docusaurus/docs/authentication/oauth2.md +0 -317
- package/docusaurus/docs/authentication/overview.md +0 -251
- package/docusaurus/docs/cli.md +0 -229
- package/docusaurus/docs/core-concepts/actions.md +0 -286
- package/docusaurus/docs/core-concepts/missions.md +0 -264
- package/docusaurus/docs/core-concepts/schemas.md +0 -353
- package/docusaurus/docs/core-concepts/sources.md +0 -339
- package/docusaurus/docs/core-concepts/stores.md +0 -332
- package/docusaurus/docs/dsl-syntax/expressions.md +0 -361
- package/docusaurus/docs/dsl-syntax/fetch.md +0 -293
- package/docusaurus/docs/dsl-syntax/for-loops.md +0 -324
- package/docusaurus/docs/dsl-syntax/map.md +0 -345
- package/docusaurus/docs/dsl-syntax/match.md +0 -387
- package/docusaurus/docs/dsl-syntax/pipelines.md +0 -397
- package/docusaurus/docs/dsl-syntax/validate.md +0 -401
- package/docusaurus/docs/error-handling/dead-letter-queues.md +0 -399
- package/docusaurus/docs/error-handling/flow-control.md +0 -337
- package/docusaurus/docs/error-handling/retry-strategies.md +0 -368
- package/docusaurus/docs/examples.md +0 -488
- package/docusaurus/docs/getting-started.md +0 -256
- package/docusaurus/docs/http/circuit-breaker.md +0 -401
- package/docusaurus/docs/http/incremental-sync.md +0 -394
- package/docusaurus/docs/http/pagination.md +0 -361
- package/docusaurus/docs/http/rate-limiting.md +0 -383
- package/docusaurus/docs/http/requests.md +0 -328
- package/docusaurus/docs/http/retry.md +0 -402
- package/docusaurus/docs/intro.md +0 -90
- package/docusaurus/docs/openapi/loading-specs.md +0 -305
- package/docusaurus/docs/openapi/operation-calls.md +0 -314
- package/docusaurus/docs/openapi/overview.md +0 -212
- package/docusaurus/docs/openapi/response-validation.md +0 -344
- package/docusaurus/docs/scheduling/cron.md +0 -305
- package/docusaurus/docs/scheduling/daemon-mode.md +0 -317
- package/docusaurus/docs/scheduling/intervals.md +0 -289
- package/docusaurus/docs/scheduling/overview.md +0 -231
- package/docusaurus/docs/stores/custom-adapters.md +0 -376
- package/docusaurus/docs/stores/file.md +0 -236
- package/docusaurus/docs/stores/memory.md +0 -193
- package/docusaurus/docs/stores/overview.md +0 -274
- package/docusaurus/docs/stores/postgrest.md +0 -316
- package/docusaurus/docusaurus.config.ts +0 -148
- package/docusaurus/package-lock.json +0 -18029
- package/docusaurus/package.json +0 -47
- package/docusaurus/sidebars.ts +0 -155
- package/docusaurus/src/components/HomepageFeatures/index.tsx +0 -105
- package/docusaurus/src/components/HomepageFeatures/styles.module.css +0 -12
- package/docusaurus/src/css/custom.css +0 -169
- package/docusaurus/src/pages/index.module.css +0 -48
- package/docusaurus/src/pages/index.tsx +0 -110
- package/docusaurus/src/pages/markdown-page.md +0 -7
- package/docusaurus/static/.nojekyll +0 -0
- package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
- package/docusaurus/static/img/docusaurus.png +0 -0
- package/docusaurus/static/img/favicon.ico +0 -0
- package/docusaurus/static/img/logo.svg +0 -10
- package/docusaurus/static/img/undraw_docusaurus_mountain.svg +0 -171
- package/docusaurus/static/img/undraw_docusaurus_react.svg +0 -170
- package/docusaurus/static/img/undraw_docusaurus_tree.svg +0 -40
- package/docusaurus/tsconfig.json +0 -8
- package/examples/README.md +0 -112
- package/examples/error-handling/README.md +0 -150
- package/examples/error-handling/payment-processor.vague +0 -287
- package/examples/github-sync/README.md +0 -74
- package/examples/github-sync/fetch-issues.vague +0 -47
- package/examples/github-sync/fetch-prs.vague +0 -40
- package/examples/github-sync/mission.vague +0 -101
- package/examples/github-sync/normalize.vague +0 -70
- package/examples/jsonplaceholder/README.md +0 -28
- package/examples/jsonplaceholder/posts.vague +0 -48
- package/examples/petstore/README.md +0 -35
- package/examples/petstore/openapi.yaml +0 -97
- package/examples/petstore/sync.vague +0 -52
- package/examples/temporal-comparison/README.md +0 -297
- package/examples/temporal-comparison/reconciliation.vague +0 -355
- package/examples/temporal-comparison/temporal/activities/index.ts +0 -8
- package/examples/temporal-comparison/temporal/activities/shipstation.ts +0 -225
- package/examples/temporal-comparison/temporal/activities/shopify.ts +0 -257
- package/examples/temporal-comparison/temporal/activities/storage.ts +0 -198
- package/examples/temporal-comparison/temporal/activities/stripe.ts +0 -169
- package/examples/temporal-comparison/temporal/activities/validation.ts +0 -205
- package/examples/temporal-comparison/temporal/client/schedule.ts +0 -218
- package/examples/temporal-comparison/temporal/config/retry.ts +0 -63
- package/examples/temporal-comparison/temporal/types/index.ts +0 -129
- package/examples/temporal-comparison/temporal/workers/main.ts +0 -130
- package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +0 -262
- package/examples/xero/README.md +0 -88
- package/examples/xero/invoices.vague +0 -189
- package/src/api-integration.test.ts +0 -954
- package/src/ast/index.ts +0 -1
- package/src/ast/nodes.ts +0 -310
- package/src/auth/auth.test.ts +0 -326
- package/src/auth/circuit-breaker.test.ts +0 -390
- package/src/auth/circuit-breaker.ts +0 -379
- package/src/auth/credentials.test.ts +0 -273
- package/src/auth/credentials.ts +0 -246
- package/src/auth/index.ts +0 -40
- package/src/auth/oauth2-provider.ts +0 -177
- package/src/auth/rate-limiter.ts +0 -459
- package/src/auth/token-store.ts +0 -177
- package/src/auth/types.ts +0 -159
- package/src/benchmark/e2e.bench.ts +0 -288
- package/src/benchmark/evaluator.bench.ts +0 -331
- package/src/benchmark/fixtures.ts +0 -295
- package/src/benchmark/index.ts +0 -108
- package/src/benchmark/lexer.bench.ts +0 -69
- package/src/benchmark/parser.bench.ts +0 -103
- package/src/benchmark/resilience.bench.ts +0 -193
- package/src/benchmark/store.bench.ts +0 -147
- package/src/benchmark/utils.ts +0 -230
- package/src/cli.ts +0 -313
- package/src/errors/errors.test.ts +0 -234
- package/src/errors/index.ts +0 -223
- package/src/execution/execution.test.ts +0 -307
- package/src/execution/index.ts +0 -21
- package/src/execution/state.ts +0 -207
- package/src/execution/store.ts +0 -188
- package/src/index.ts +0 -169
- package/src/integration.test.ts +0 -192
- package/src/interpreter/context.ts +0 -57
- package/src/interpreter/evaluator.test.ts +0 -796
- package/src/interpreter/evaluator.ts +0 -245
- package/src/interpreter/executor.ts +0 -946
- package/src/interpreter/fetch-handler.ts +0 -302
- package/src/interpreter/http.test.ts +0 -423
- package/src/interpreter/http.ts +0 -308
- package/src/interpreter/index.ts +0 -32
- package/src/interpreter/pagination.ts +0 -207
- package/src/interpreter/progress.test.ts +0 -276
- package/src/interpreter/schema-matcher.test.ts +0 -160
- package/src/interpreter/schema-matcher.ts +0 -168
- package/src/interpreter/signals.ts +0 -73
- package/src/interpreter/step-handlers/for-handler.ts +0 -65
- package/src/interpreter/step-handlers/index.ts +0 -17
- package/src/interpreter/step-handlers/map-handler.ts +0 -24
- package/src/interpreter/step-handlers/match-handler.ts +0 -101
- package/src/interpreter/step-handlers/store-handler.ts +0 -78
- package/src/interpreter/step-handlers/types.ts +0 -17
- package/src/interpreter/step-handlers/validate-handler.ts +0 -30
- package/src/interpreter/step-handlers/webhook-handler.ts +0 -142
- package/src/lexer/index.ts +0 -18
- package/src/lexer/lexer.test.ts +0 -316
- package/src/lexer/tokens.ts +0 -179
- package/src/loader/index.ts +0 -288
- package/src/loader/loader.test.ts +0 -360
- package/src/oas/index.ts +0 -4
- package/src/oas/loader.ts +0 -126
- package/src/oas/oas.test.ts +0 -254
- package/src/oas/validator.ts +0 -299
- package/src/parser/base.ts +0 -124
- package/src/parser/expressions.test.ts +0 -525
- package/src/parser/expressions.ts +0 -314
- package/src/parser/index.ts +0 -3
- package/src/parser/match.test.ts +0 -296
- package/src/parser/parser.test.ts +0 -739
- package/src/parser/parser.ts +0 -1469
- package/src/parser/schedule.test.ts +0 -287
- package/src/parser/webhook.test.ts +0 -248
- package/src/plugin.ts +0 -83
- package/src/scheduler/cron-parser.test.ts +0 -236
- package/src/scheduler/cron-parser.ts +0 -236
- package/src/scheduler/index.ts +0 -10
- package/src/scheduler/scheduler.ts +0 -443
- package/src/scheduler/types.ts +0 -71
- package/src/stores/factory.ts +0 -104
- package/src/stores/file.test.ts +0 -276
- package/src/stores/file.ts +0 -211
- package/src/stores/index.ts +0 -6
- package/src/stores/memory.test.ts +0 -238
- package/src/stores/memory.ts +0 -63
- package/src/stores/postgrest.test.ts +0 -488
- package/src/stores/postgrest.ts +0 -263
- package/src/stores/stores.test.ts +0 -197
- package/src/stores/types.ts +0 -58
- package/src/sync/index.ts +0 -16
- package/src/sync/state.ts +0 -126
- package/src/sync/store.ts +0 -139
- package/src/sync/sync.test.ts +0 -271
- package/src/utils/async.ts +0 -10
- package/src/utils/file.ts +0 -106
- package/src/utils/index.ts +0 -14
- package/src/utils/logger.ts +0 -53
- package/src/utils/path.ts +0 -47
- package/src/webhook/index.ts +0 -15
- package/src/webhook/server.test.ts +0 -253
- package/src/webhook/server.ts +0 -389
- package/src/webhook/store.ts +0 -239
- package/src/webhook/types.ts +0 -93
- package/tsconfig.json +0 -17
- package/vitest.config.ts +0 -39
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pause Step Handler - Handles resource-free long pauses
|
|
3
|
+
*
|
|
4
|
+
* Creates a durable pause that persists state and releases resources,
|
|
5
|
+
* allowing execution to be resumed after extended periods.
|
|
6
|
+
*/
|
|
7
|
+
import type { PauseStep } from '../../ast/nodes.js';
|
|
8
|
+
import type { ExecutionContext } from '../context.js';
|
|
9
|
+
import type { EventType } from '../../observability/index.js';
|
|
10
|
+
import type { PauseManager } from '../../pause/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Dependencies for pause handler
|
|
13
|
+
*/
|
|
14
|
+
export interface PauseHandlerDeps {
|
|
15
|
+
ctx: ExecutionContext;
|
|
16
|
+
log: (message: string) => void;
|
|
17
|
+
emit?: <T>(type: EventType, payload: T) => void;
|
|
18
|
+
/** Pause manager for creating and persisting pauses */
|
|
19
|
+
pauseManager: PauseManager;
|
|
20
|
+
/** Execution ID */
|
|
21
|
+
executionId: string;
|
|
22
|
+
/** Mission name */
|
|
23
|
+
mission: string;
|
|
24
|
+
/** Current action name */
|
|
25
|
+
actionName: string;
|
|
26
|
+
/** Current stage index */
|
|
27
|
+
stageIndex: number;
|
|
28
|
+
/** Current step index */
|
|
29
|
+
stepIndex: number;
|
|
30
|
+
/** For loop context (if inside a loop) */
|
|
31
|
+
loopItemIndex?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Result of pause execution
|
|
35
|
+
*/
|
|
36
|
+
export interface PauseHandlerResult {
|
|
37
|
+
/** The pause ID */
|
|
38
|
+
pauseId: string;
|
|
39
|
+
/** Duration in milliseconds */
|
|
40
|
+
duration: number;
|
|
41
|
+
/** When the pause expires */
|
|
42
|
+
expiresAt: Date;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Handles pause step execution
|
|
46
|
+
*/
|
|
47
|
+
export declare class PauseHandler {
|
|
48
|
+
private deps;
|
|
49
|
+
constructor(deps: PauseHandlerDeps);
|
|
50
|
+
execute(step: PauseStep): Promise<PauseHandlerResult>;
|
|
51
|
+
private captureVariables;
|
|
52
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pause Step Handler - Handles resource-free long pauses
|
|
3
|
+
*
|
|
4
|
+
* Creates a durable pause that persists state and releases resources,
|
|
5
|
+
* allowing execution to be resumed after extended periods.
|
|
6
|
+
*/
|
|
7
|
+
import { parseDuration, formatDuration } from '../../pause/state.js';
|
|
8
|
+
import { PauseSignal } from '../signals.js';
|
|
9
|
+
/**
|
|
10
|
+
* Handles pause step execution
|
|
11
|
+
*/
|
|
12
|
+
export class PauseHandler {
|
|
13
|
+
deps;
|
|
14
|
+
constructor(deps) {
|
|
15
|
+
this.deps = deps;
|
|
16
|
+
}
|
|
17
|
+
async execute(step) {
|
|
18
|
+
const duration = parseDuration(step.duration);
|
|
19
|
+
this.deps.log(`Starting pause for ${formatDuration(duration)}`);
|
|
20
|
+
// Capture current context variables
|
|
21
|
+
const variables = this.captureVariables();
|
|
22
|
+
// Build checkpoint
|
|
23
|
+
const checkpoint = {
|
|
24
|
+
stageIndex: this.deps.stageIndex,
|
|
25
|
+
stepIndex: this.deps.stepIndex + 1, // Resume AFTER this pause step
|
|
26
|
+
action: this.deps.actionName,
|
|
27
|
+
itemIndex: this.deps.loopItemIndex,
|
|
28
|
+
variables,
|
|
29
|
+
response: this.deps.ctx.response,
|
|
30
|
+
};
|
|
31
|
+
// Build resume triggers
|
|
32
|
+
const resumeTriggers = [];
|
|
33
|
+
if (step.resumeOn && step.resumeOn.length > 0) {
|
|
34
|
+
for (const trigger of step.resumeOn) {
|
|
35
|
+
if (trigger.type === 'timeout') {
|
|
36
|
+
resumeTriggers.push({ type: 'timeout' });
|
|
37
|
+
}
|
|
38
|
+
else if (trigger.type === 'webhook') {
|
|
39
|
+
resumeTriggers.push({ type: 'webhook', path: trigger.path });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Default to timeout only
|
|
45
|
+
resumeTriggers.push({ type: 'timeout' });
|
|
46
|
+
}
|
|
47
|
+
// Create the pause via pause manager
|
|
48
|
+
const pause = await this.deps.pauseManager.createPause({
|
|
49
|
+
executionId: this.deps.executionId,
|
|
50
|
+
mission: this.deps.mission,
|
|
51
|
+
duration,
|
|
52
|
+
checkpoint,
|
|
53
|
+
resumeTriggers,
|
|
54
|
+
});
|
|
55
|
+
// Emit pause event
|
|
56
|
+
this.deps.emit?.('mission.paused', {
|
|
57
|
+
pauseId: pause.id,
|
|
58
|
+
duration,
|
|
59
|
+
expiresAt: pause.expiresAt,
|
|
60
|
+
resumeTriggers: resumeTriggers.map((t) => t.type),
|
|
61
|
+
});
|
|
62
|
+
this.deps.log(`Pause ${pause.id} created - will expire at ${pause.expiresAt.toISOString()}`);
|
|
63
|
+
// Throw PauseSignal to stop execution
|
|
64
|
+
// The executor will catch this and handle appropriately
|
|
65
|
+
throw new PauseSignal(pause.id);
|
|
66
|
+
}
|
|
67
|
+
captureVariables() {
|
|
68
|
+
const variables = {};
|
|
69
|
+
let current = this.deps.ctx;
|
|
70
|
+
while (current) {
|
|
71
|
+
for (const [key, value] of current.variables) {
|
|
72
|
+
if (!(key in variables)) {
|
|
73
|
+
// Deep clone to ensure we capture the current state
|
|
74
|
+
try {
|
|
75
|
+
variables[key] = JSON.parse(JSON.stringify(value));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// If value can't be serialized, skip it
|
|
79
|
+
variables[key] = '[non-serializable]';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
current = current.parent;
|
|
84
|
+
}
|
|
85
|
+
return variables;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
import type { StoreStep } from '../../ast/nodes.js';
|
|
2
2
|
import type { StepHandler, StepHandlerDeps } from './types.js';
|
|
3
3
|
/**
|
|
4
|
-
* Handles store steps for persisting data
|
|
4
|
+
* Handles store steps for persisting data to configured store adapters.
|
|
5
|
+
* Supports bulk operations, upserts, and partial record updates.
|
|
5
6
|
*/
|
|
6
7
|
export declare class StoreHandler implements StepHandler<StoreStep> {
|
|
7
8
|
private deps;
|
|
8
9
|
constructor(deps: StepHandlerDeps);
|
|
10
|
+
/**
|
|
11
|
+
* Compute the storage key for a record based on step options.
|
|
12
|
+
*
|
|
13
|
+
* Uses the key expression if provided, otherwise falls back to `record.id`.
|
|
14
|
+
* A missing or null/undefined key is an error: inventing a random key breaks
|
|
15
|
+
* dedup (re-runs duplicate everything), and stringifying undefined collapses
|
|
16
|
+
* every such record onto the literal key "undefined".
|
|
17
|
+
*/
|
|
18
|
+
private getRecordKey;
|
|
19
|
+
/**
|
|
20
|
+
* Emit a data.store event with operation metadata.
|
|
21
|
+
*/
|
|
22
|
+
private emitStoreEvent;
|
|
9
23
|
execute(step: StoreStep): Promise<void>;
|
|
10
24
|
private storeMany;
|
|
11
25
|
private storeOne;
|
|
26
|
+
/** True when the record should be merged into an existing one (deep upsert). */
|
|
27
|
+
private shouldMerge;
|
|
12
28
|
private storeRecord;
|
|
13
29
|
}
|
|
@@ -1,16 +1,49 @@
|
|
|
1
1
|
import { evaluate } from '../evaluator.js';
|
|
2
|
+
import { RuntimeError } from '../../errors/index.js';
|
|
2
3
|
/**
|
|
3
|
-
* Handles store steps for persisting data
|
|
4
|
+
* Handles store steps for persisting data to configured store adapters.
|
|
5
|
+
* Supports bulk operations, upserts, and partial record updates.
|
|
4
6
|
*/
|
|
5
7
|
export class StoreHandler {
|
|
6
8
|
deps;
|
|
7
9
|
constructor(deps) {
|
|
8
10
|
this.deps = deps;
|
|
9
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Compute the storage key for a record based on step options.
|
|
14
|
+
*
|
|
15
|
+
* Uses the key expression if provided, otherwise falls back to `record.id`.
|
|
16
|
+
* A missing or null/undefined key is an error: inventing a random key breaks
|
|
17
|
+
* dedup (re-runs duplicate everything), and stringifying undefined collapses
|
|
18
|
+
* every such record onto the literal key "undefined".
|
|
19
|
+
*/
|
|
20
|
+
getRecordKey(step, record) {
|
|
21
|
+
const raw = step.options.key ? evaluate(step.options.key, this.deps.ctx, record) : record.id;
|
|
22
|
+
if (raw === undefined || raw === null || raw === '') {
|
|
23
|
+
const which = step.options.key ? 'key expression' : "record 'id'";
|
|
24
|
+
throw new RuntimeError(`Cannot store to '${step.target}': ${which} is missing or empty. ` +
|
|
25
|
+
`Provide a 'key:' option that resolves to a stable, non-empty value.`, { line: 1, column: 1 }, undefined, { stepType: 'store' });
|
|
26
|
+
}
|
|
27
|
+
return String(raw);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Emit a data.store event with operation metadata.
|
|
31
|
+
*/
|
|
32
|
+
emitStoreEvent(step, operation, itemCount, key) {
|
|
33
|
+
this.deps.emit?.('data.store', {
|
|
34
|
+
storeName: step.target,
|
|
35
|
+
storeType: this.deps.ctx.storeTypes.get(step.target) ?? 'unknown',
|
|
36
|
+
operation,
|
|
37
|
+
itemCount,
|
|
38
|
+
...(key !== undefined && { key }),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
10
41
|
async execute(step) {
|
|
11
42
|
const store = this.deps.ctx.stores.get(step.target);
|
|
12
43
|
if (!store) {
|
|
13
|
-
throw new
|
|
44
|
+
throw new RuntimeError(`Store not found: ${step.target}`, { line: 1, column: 1 }, undefined, {
|
|
45
|
+
stepType: 'store',
|
|
46
|
+
});
|
|
14
47
|
}
|
|
15
48
|
const source = evaluate(step.source, this.deps.ctx);
|
|
16
49
|
if (Array.isArray(source)) {
|
|
@@ -21,42 +54,50 @@ export class StoreHandler {
|
|
|
21
54
|
}
|
|
22
55
|
}
|
|
23
56
|
async storeMany(step, store, items) {
|
|
24
|
-
|
|
25
|
-
|
|
57
|
+
const merge = this.shouldMerge(step);
|
|
58
|
+
const operation = merge ? 'upsert' : 'set';
|
|
59
|
+
// Check if we can use bulk operations
|
|
60
|
+
const canBulkSet = store.bulkSet && !merge;
|
|
61
|
+
const canBulkUpsert = store.bulkUpsert && merge;
|
|
62
|
+
if (canBulkSet || canBulkUpsert) {
|
|
26
63
|
const records = [];
|
|
27
64
|
for (const item of items) {
|
|
28
65
|
const record = item;
|
|
29
|
-
const key = step
|
|
30
|
-
? String(evaluate(step.options.key, this.deps.ctx, record))
|
|
31
|
-
: String(record.id ?? Math.random());
|
|
32
|
-
if (step.options.partial !== undefined) {
|
|
33
|
-
record._partial = step.options.partial;
|
|
34
|
-
}
|
|
66
|
+
const key = this.getRecordKey(step, record);
|
|
35
67
|
records.push({ key, value: record });
|
|
36
68
|
}
|
|
37
|
-
|
|
69
|
+
if (canBulkUpsert) {
|
|
70
|
+
await store.bulkUpsert(records);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
await store.bulkSet(records);
|
|
74
|
+
}
|
|
38
75
|
}
|
|
39
76
|
else {
|
|
40
|
-
// Fall back to individual operations for
|
|
77
|
+
// Fall back to individual operations for stores without bulk methods
|
|
41
78
|
for (const item of items) {
|
|
42
79
|
const record = item;
|
|
43
80
|
await this.storeRecord(step, store, record);
|
|
44
81
|
}
|
|
45
82
|
}
|
|
46
|
-
this.deps.log(`Stored ${items.length} items to ${step.target}`);
|
|
83
|
+
this.deps.log(`Stored ${items.length} ${items.length === 1 ? 'item' : 'items'} to ${step.target}`);
|
|
84
|
+
this.emitStoreEvent(step, operation, items.length);
|
|
47
85
|
}
|
|
48
86
|
async storeOne(step, store, record) {
|
|
87
|
+
const key = this.getRecordKey(step, record);
|
|
88
|
+
const operation = this.shouldMerge(step) ? 'upsert' : 'set';
|
|
49
89
|
await this.storeRecord(step, store, record);
|
|
50
90
|
this.deps.log(`Stored item to ${step.target}`);
|
|
91
|
+
this.emitStoreEvent(step, operation, 1, key);
|
|
92
|
+
}
|
|
93
|
+
/** True when the record should be merged into an existing one (deep upsert). */
|
|
94
|
+
shouldMerge(step) {
|
|
95
|
+
return step.options.upsert === true || step.options.partial === true;
|
|
51
96
|
}
|
|
52
97
|
async storeRecord(step, store, record) {
|
|
53
|
-
const key = step
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (step.options.partial !== undefined) {
|
|
57
|
-
record._partial = step.options.partial;
|
|
58
|
-
}
|
|
59
|
-
if (step.options.upsert) {
|
|
98
|
+
const key = this.getRecordKey(step, record);
|
|
99
|
+
// Never mutate the caller's record or persist a storage-internal flag.
|
|
100
|
+
if (this.shouldMerge(step)) {
|
|
60
101
|
await store.update(key, record);
|
|
61
102
|
}
|
|
62
103
|
else {
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { ActionStep } from '../../ast/nodes.js';
|
|
2
2
|
import type { ExecutionContext } from '../context.js';
|
|
3
|
+
import type { EventType } from '../../observability/index.js';
|
|
3
4
|
/**
|
|
4
5
|
* Dependencies injected into step handlers
|
|
5
6
|
*/
|
|
6
7
|
export interface StepHandlerDeps {
|
|
7
8
|
ctx: ExecutionContext;
|
|
8
9
|
log: (message: string) => void;
|
|
10
|
+
/** Optional event emitter for observability */
|
|
11
|
+
emit?: <T>(type: EventType, payload: T) => void;
|
|
9
12
|
}
|
|
10
13
|
/**
|
|
11
14
|
* Base interface for step handlers
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { ValidateStep } from '../../ast/nodes.js';
|
|
2
2
|
import type { StepHandler, StepHandlerDeps } from './types.js';
|
|
3
3
|
/**
|
|
4
|
-
* Handles validate steps with assume constraints
|
|
4
|
+
* Handles validate steps with assume constraints.
|
|
5
|
+
* Evaluates constraint conditions and throws ValidationError on failure.
|
|
5
6
|
*/
|
|
6
7
|
export declare class ValidateHandler implements StepHandler<ValidateStep> {
|
|
7
8
|
private deps;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { evaluate } from '../evaluator.js';
|
|
2
|
+
import { ValidationError } from '../../errors/index.js';
|
|
2
3
|
/**
|
|
3
|
-
* Handles validate steps with assume constraints
|
|
4
|
+
* Handles validate steps with assume constraints.
|
|
5
|
+
* Evaluates constraint conditions and throws ValidationError on failure.
|
|
4
6
|
*/
|
|
5
7
|
export class ValidateHandler {
|
|
6
8
|
deps;
|
|
@@ -14,7 +16,10 @@ export class ValidateHandler {
|
|
|
14
16
|
if (!result) {
|
|
15
17
|
const message = constraint.message ?? `Validation failed: ${JSON.stringify(constraint.condition)}`;
|
|
16
18
|
if (constraint.severity === 'error') {
|
|
17
|
-
throw new
|
|
19
|
+
throw new ValidationError(message, { line: 1, column: 1 }, undefined, {
|
|
20
|
+
constraint: JSON.stringify(constraint.condition),
|
|
21
|
+
severity: 'error',
|
|
22
|
+
});
|
|
18
23
|
}
|
|
19
24
|
else {
|
|
20
25
|
this.deps.log(`Warning: ${message}`);
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import type { WebhookStep } from '../../ast/nodes.js';
|
|
7
7
|
import type { ExecutionContext } from '../context.js';
|
|
8
8
|
import type { WebhookServer, WebhookRegistration, WebhookEvent } from '../../webhook/index.js';
|
|
9
|
+
import type { EventType } from '../../observability/index.js';
|
|
9
10
|
/**
|
|
10
11
|
* Dependencies for the webhook handler
|
|
11
12
|
*/
|
|
@@ -14,6 +15,8 @@ export interface WebhookHandlerDeps {
|
|
|
14
15
|
webhookServer: WebhookServer;
|
|
15
16
|
executionId: string;
|
|
16
17
|
log: (message: string) => void;
|
|
18
|
+
/** Optional event emitter for observability */
|
|
19
|
+
emit?: <T>(type: EventType, payload: T) => void;
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
22
|
* Result of webhook handler execution
|
|
@@ -33,4 +36,5 @@ export declare class WebhookHandler {
|
|
|
33
36
|
* Execute the wait step
|
|
34
37
|
*/
|
|
35
38
|
execute(step: WebhookStep): Promise<WebhookHandlerResult>;
|
|
39
|
+
private waitAndProcess;
|
|
36
40
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { evaluate } from '../evaluator.js';
|
|
7
7
|
import { RetrySignal } from '../signals.js';
|
|
8
|
+
import { RuntimeError } from '../../errors/index.js';
|
|
8
9
|
/**
|
|
9
10
|
* Handler for webhook (wait) steps
|
|
10
11
|
*/
|
|
@@ -17,7 +18,7 @@ export class WebhookHandler {
|
|
|
17
18
|
* Execute the wait step
|
|
18
19
|
*/
|
|
19
20
|
async execute(step) {
|
|
20
|
-
const { ctx, webhookServer, executionId, log } = this.deps;
|
|
21
|
+
const { ctx, webhookServer, executionId, log, emit } = this.deps;
|
|
21
22
|
// Register webhook endpoint
|
|
22
23
|
const timeout = step.timeout ?? 300000; // 5 minutes default
|
|
23
24
|
const expectedEvents = step.expectedEvents ?? 1;
|
|
@@ -29,13 +30,32 @@ export class WebhookHandler {
|
|
|
29
30
|
});
|
|
30
31
|
const webhookUrl = webhookServer.getWebhookUrl(registration);
|
|
31
32
|
log(`Waiting for webhook: ${webhookUrl} (timeout: ${timeout}ms, expected: ${expectedEvents})`);
|
|
33
|
+
// Emit webhook.register event
|
|
34
|
+
emit?.('webhook.register', {
|
|
35
|
+
registrationId: registration.id,
|
|
36
|
+
path: registration.path,
|
|
37
|
+
webhookUrl,
|
|
38
|
+
timeout,
|
|
39
|
+
expectedEvents,
|
|
40
|
+
});
|
|
32
41
|
// Set the webhook URL in context for use in subsequent steps
|
|
33
42
|
ctx.response = {
|
|
34
43
|
webhookId: registration.id,
|
|
35
44
|
webhookUrl,
|
|
36
45
|
webhookPath: registration.path,
|
|
37
46
|
};
|
|
38
|
-
// Wait for webhook events
|
|
47
|
+
// Wait for webhook events. The registration must be torn down on every
|
|
48
|
+
// exit path (timeout, filter throw, store failure, retry signal) or it
|
|
49
|
+
// leaks the server-side handle — hence the try/finally below.
|
|
50
|
+
try {
|
|
51
|
+
return await this.waitAndProcess(step, registration, webhookUrl, timeout, ctx, log, emit);
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
await webhookServer.unregister(registration.id);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async waitAndProcess(step, registration, webhookUrl, timeout, ctx, log, emit) {
|
|
58
|
+
const webhookServer = this.deps.webhookServer;
|
|
39
59
|
const result = await webhookServer.waitForEvents(registration.id, timeout);
|
|
40
60
|
if (result.timedOut) {
|
|
41
61
|
log(`Webhook timeout: ${webhookUrl}`);
|
|
@@ -45,7 +65,7 @@ export class WebhookHandler {
|
|
|
45
65
|
}
|
|
46
66
|
// If not retrying, still return partial results
|
|
47
67
|
if (result.events.length === 0) {
|
|
48
|
-
throw new
|
|
68
|
+
throw new RuntimeError(`Webhook timeout: no events received within ${timeout}ms`, { line: 1, column: 1 }, undefined, { stepType: 'wait' });
|
|
49
69
|
}
|
|
50
70
|
}
|
|
51
71
|
// Filter events if filter expression provided
|
|
@@ -93,8 +113,14 @@ export class WebhookHandler {
|
|
|
93
113
|
log(`Warning: Store '${step.storage.target}' not found for webhook storage`);
|
|
94
114
|
}
|
|
95
115
|
}
|
|
96
|
-
//
|
|
97
|
-
|
|
116
|
+
// Emit webhook.complete event
|
|
117
|
+
emit?.('webhook.complete', {
|
|
118
|
+
registrationId: registration.id,
|
|
119
|
+
eventsReceived: events.length,
|
|
120
|
+
timedOut: result.timedOut ?? false,
|
|
121
|
+
storedTo: step.storage?.target,
|
|
122
|
+
});
|
|
123
|
+
// Registration teardown happens in the caller's finally block.
|
|
98
124
|
return {
|
|
99
125
|
registration,
|
|
100
126
|
events,
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StoreManager handles store initialization and configuration.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from MissionExecutor to improve separation of concerns.
|
|
5
|
+
* Responsible for:
|
|
6
|
+
* - Creating store adapters based on store definitions
|
|
7
|
+
* - Managing custom store adapters
|
|
8
|
+
* - Resolving store types for development/production modes
|
|
9
|
+
*/
|
|
10
|
+
import type { StoreDefinition } from '../ast/nodes.js';
|
|
11
|
+
import type { ExecutionContext } from './context.js';
|
|
12
|
+
import type { StoreAdapter } from '../stores/types.js';
|
|
13
|
+
export interface StoreManagerConfig {
|
|
14
|
+
/** Custom store adapters by name */
|
|
15
|
+
customStores?: Record<string, StoreAdapter>;
|
|
16
|
+
/** Development mode - use file stores instead of sql/nosql (default: false) */
|
|
17
|
+
developmentMode?: boolean;
|
|
18
|
+
/** Base directory for file stores (default: '.reqon-data') */
|
|
19
|
+
dataDir?: string;
|
|
20
|
+
/** Logging function */
|
|
21
|
+
log?: (message: string) => void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Manages store initialization and provides access to store adapters.
|
|
25
|
+
*/
|
|
26
|
+
export declare class StoreManager {
|
|
27
|
+
private config;
|
|
28
|
+
constructor(config?: StoreManagerConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Initialize a store definition, creating the appropriate adapter.
|
|
31
|
+
*/
|
|
32
|
+
initializeStore(store: StoreDefinition, ctx: ExecutionContext): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Initialize multiple stores.
|
|
35
|
+
*/
|
|
36
|
+
initializeStores(stores: StoreDefinition[], ctx: ExecutionContext): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get a store adapter from the context.
|
|
39
|
+
*/
|
|
40
|
+
getStore(ctx: ExecutionContext, storeName: string): StoreAdapter | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Get the store type for a given store name.
|
|
43
|
+
*/
|
|
44
|
+
getStoreType(ctx: ExecutionContext, storeName: string): string | undefined;
|
|
45
|
+
private log;
|
|
46
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StoreManager handles store initialization and configuration.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from MissionExecutor to improve separation of concerns.
|
|
5
|
+
* Responsible for:
|
|
6
|
+
* - Creating store adapters based on store definitions
|
|
7
|
+
* - Managing custom store adapters
|
|
8
|
+
* - Resolving store types for development/production modes
|
|
9
|
+
*/
|
|
10
|
+
import { createStore, resolveStoreType } from '../stores/index.js';
|
|
11
|
+
import { EXECUTION_DEFAULTS } from '../config/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Manages store initialization and provides access to store adapters.
|
|
14
|
+
*/
|
|
15
|
+
export class StoreManager {
|
|
16
|
+
config;
|
|
17
|
+
constructor(config = {}) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Initialize a store definition, creating the appropriate adapter.
|
|
22
|
+
*/
|
|
23
|
+
async initializeStore(store, ctx) {
|
|
24
|
+
// Check for custom store adapter
|
|
25
|
+
if (this.config.customStores?.[store.name]) {
|
|
26
|
+
ctx.stores.set(store.name, this.config.customStores[store.name]);
|
|
27
|
+
ctx.storeTypes.set(store.name, 'custom');
|
|
28
|
+
this.log(`Initialized store: ${store.name} (custom adapter)`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Use store factory to create appropriate adapter
|
|
32
|
+
const developmentMode = this.config.developmentMode ?? EXECUTION_DEFAULTS.DEVELOPMENT_MODE;
|
|
33
|
+
const storeType = resolveStoreType(store.storeType, developmentMode);
|
|
34
|
+
const adapter = createStore({
|
|
35
|
+
type: storeType,
|
|
36
|
+
name: store.target,
|
|
37
|
+
baseDir: this.config.dataDir,
|
|
38
|
+
// In dev mode the type is already resolved to 'file'; this only matters
|
|
39
|
+
// if a raw sql/nosql type reaches the factory.
|
|
40
|
+
allowFileFallback: developmentMode,
|
|
41
|
+
});
|
|
42
|
+
ctx.stores.set(store.name, adapter);
|
|
43
|
+
ctx.storeTypes.set(store.name, storeType);
|
|
44
|
+
const typeInfo = storeType !== store.storeType ? ` <- ${store.storeType}` : '';
|
|
45
|
+
this.log(`Initialized store: ${store.name} (${storeType}${typeInfo})`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Initialize multiple stores.
|
|
49
|
+
*/
|
|
50
|
+
async initializeStores(stores, ctx) {
|
|
51
|
+
for (const store of stores) {
|
|
52
|
+
await this.initializeStore(store, ctx);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get a store adapter from the context.
|
|
57
|
+
*/
|
|
58
|
+
getStore(ctx, storeName) {
|
|
59
|
+
return ctx.stores.get(storeName);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the store type for a given store name.
|
|
63
|
+
*/
|
|
64
|
+
getStoreType(ctx, storeName) {
|
|
65
|
+
return ctx.storeTypes.get(storeName);
|
|
66
|
+
}
|
|
67
|
+
log(message) {
|
|
68
|
+
this.config.log?.(message);
|
|
69
|
+
}
|
|
70
|
+
}
|
package/dist/lexer/index.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Lexer module - wraps Vague lexer with Reqon keywords
|
|
4
|
+
* note: Importing this module auto-registers Reqon plugin with Vague
|
|
5
|
+
* exports:
|
|
6
|
+
* - ReqonLexer (alias for Vague Lexer)
|
|
7
|
+
* - ReqonTokenType, REQON_KEYWORDS
|
|
8
|
+
* related:
|
|
9
|
+
* - ./tokens.ts - Reqon-specific keywords (mission, action, fetch, etc.)
|
|
10
|
+
* - ../plugin.ts - registers keywords with Vague
|
|
11
|
+
* - ../parser/index.ts - consumes tokens
|
|
12
|
+
* ---
|
|
6
13
|
*/
|
|
7
14
|
import '../plugin.js';
|
|
8
15
|
export { Lexer, Lexer as ReqonLexer, TokenType, type Token } from 'vague-lang';
|
package/dist/lexer/index.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Lexer module - wraps Vague lexer with Reqon keywords
|
|
4
|
+
* note: Importing this module auto-registers Reqon plugin with Vague
|
|
5
|
+
* exports:
|
|
6
|
+
* - ReqonLexer (alias for Vague Lexer)
|
|
7
|
+
* - ReqonTokenType, REQON_KEYWORDS
|
|
8
|
+
* related:
|
|
9
|
+
* - ./tokens.ts - Reqon-specific keywords (mission, action, fetch, etc.)
|
|
10
|
+
* - ../plugin.ts - registers keywords with Vague
|
|
11
|
+
* - ../parser/index.ts - consumes tokens
|
|
12
|
+
* ---
|
|
6
13
|
*/
|
|
7
14
|
// Import plugin to auto-register Reqon keywords with Vague
|
|
8
15
|
import '../plugin.js';
|
package/dist/lexer/tokens.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ export declare enum ReqonTokenType {
|
|
|
25
25
|
NOSQL = "NOSQL",
|
|
26
26
|
SQL = "SQL",
|
|
27
27
|
MEMORY = "MEMORY",
|
|
28
|
+
FILE = "FILE",
|
|
29
|
+
POSTGREST = "POSTGREST",
|
|
28
30
|
OAUTH2 = "OAUTH2",
|
|
29
31
|
BEARER = "BEARER",
|
|
30
32
|
BASIC = "BASIC",
|
|
@@ -51,12 +53,26 @@ export declare enum ReqonTokenType {
|
|
|
51
53
|
QUEUE = "QUEUE",
|
|
52
54
|
JUMP = "JUMP",
|
|
53
55
|
IS = "IS",
|
|
56
|
+
TRANSFORM = "TRANSFORM",
|
|
57
|
+
APPLY = "APPLY",
|
|
58
|
+
TO = "TO",
|
|
59
|
+
AS = "AS",
|
|
60
|
+
TRY = "TRY",
|
|
54
61
|
WAIT = "WAIT",
|
|
55
62
|
TIMEOUT = "TIMEOUT",
|
|
56
63
|
PATH = "PATH",
|
|
57
64
|
EXPECTED_EVENTS = "EXPECTED_EVENTS",
|
|
58
65
|
EVENT_FILTER = "EVENT_FILTER",
|
|
59
|
-
STORAGE = "STORAGE"
|
|
66
|
+
STORAGE = "STORAGE",
|
|
67
|
+
CHECKPOINT = "CHECKPOINT",
|
|
68
|
+
TRACE = "TRACE",
|
|
69
|
+
PAUSE = "PAUSE",
|
|
70
|
+
PERSIST = "PERSIST",
|
|
71
|
+
DURATION = "DURATION",
|
|
72
|
+
RESUME_ON = "RESUME_ON",
|
|
73
|
+
AFTER_STEP = "AFTER_STEP",
|
|
74
|
+
ON_FAILURE = "ON_FAILURE",
|
|
75
|
+
FULL = "FULL"
|
|
60
76
|
}
|
|
61
77
|
export type TokenType = VagueTokenType | ReqonTokenType;
|
|
62
78
|
export { TokenType as VagueTokenType } from 'vague-lang';
|