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
|
@@ -1,15 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Expression evaluator - evaluates Vague/Reqon expressions at runtime
|
|
4
|
+
* inputs:
|
|
5
|
+
* - Expression AST node (literals, identifiers, binary ops, function calls)
|
|
6
|
+
* - ExecutionContext with variables, response, stores
|
|
7
|
+
* - Optional current record for iteration contexts
|
|
8
|
+
* outputs:
|
|
9
|
+
* - Evaluated value (any JSON-compatible type)
|
|
10
|
+
* related:
|
|
11
|
+
* - ./context.ts - provides variable bindings
|
|
12
|
+
* - ./executor.ts - calls evaluate() for step expressions
|
|
13
|
+
* - ../parser/expressions.ts - IsExpression, ObjectLiteralExpression types
|
|
14
|
+
* ---
|
|
15
|
+
*/
|
|
1
16
|
import { getVariable } from './context.js';
|
|
17
|
+
import { isRecord } from '../utils/type-guards.js';
|
|
18
|
+
import { EvaluatorError, UnsupportedOperationError } from '../errors/index.js';
|
|
19
|
+
/**
|
|
20
|
+
* Evaluate a Reqon/Vague expression within an execution context.
|
|
21
|
+
*
|
|
22
|
+
* Supports all expression types from the Vague DSL including literals, identifiers,
|
|
23
|
+
* binary/logical/ternary expressions, function calls, and pattern matching.
|
|
24
|
+
*
|
|
25
|
+
* @param expr - The expression AST node to evaluate
|
|
26
|
+
* @param ctx - The execution context containing variables, response data, and stores
|
|
27
|
+
* @param current - Optional current record for iteration contexts (e.g., inside for/map)
|
|
28
|
+
* @returns The evaluated result, which can be any JSON-compatible value
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* // Evaluate a simple identifier
|
|
32
|
+
* const result = evaluate({ type: 'Identifier', name: 'foo' }, ctx);
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Evaluate with current record context
|
|
36
|
+
* const result = evaluate(expr, ctx, { id: 1, name: 'test' });
|
|
37
|
+
*/
|
|
2
38
|
export function evaluate(expr, ctx, current) {
|
|
39
|
+
// Handle IsExpression before the switch (custom Reqon type, not in vague-lang Expression union)
|
|
40
|
+
if (expr.type === 'IsExpression') {
|
|
41
|
+
const isExpr = expr;
|
|
42
|
+
const value = evaluate(isExpr.operand, ctx, current);
|
|
43
|
+
return checkType(value, isExpr.typeCheck);
|
|
44
|
+
}
|
|
45
|
+
// Handle ObjectLiteral before the switch (custom Reqon type)
|
|
46
|
+
if (expr.type === 'ObjectLiteral') {
|
|
47
|
+
const objExpr = expr;
|
|
48
|
+
const result = {};
|
|
49
|
+
for (const prop of objExpr.properties) {
|
|
50
|
+
result[prop.key] = evaluate(prop.value, ctx, current);
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
3
54
|
switch (expr.type) {
|
|
4
55
|
case 'Literal':
|
|
5
56
|
return expr.value;
|
|
6
57
|
case 'Identifier': {
|
|
7
58
|
// Check if it's a field on current object
|
|
8
|
-
if (current &&
|
|
9
|
-
|
|
10
|
-
if (expr.name in obj) {
|
|
11
|
-
return obj[expr.name];
|
|
12
|
-
}
|
|
59
|
+
if (isRecord(current) && expr.name in current) {
|
|
60
|
+
return current[expr.name];
|
|
13
61
|
}
|
|
14
62
|
// Check variables
|
|
15
63
|
const value = getVariable(ctx, expr.name);
|
|
@@ -20,20 +68,31 @@ export function evaluate(expr, ctx, current) {
|
|
|
20
68
|
return ctx.response;
|
|
21
69
|
}
|
|
22
70
|
// Check if the identifier is a field on response
|
|
23
|
-
if (ctx.response &&
|
|
24
|
-
|
|
25
|
-
if (expr.name in resp)
|
|
26
|
-
return resp[expr.name];
|
|
71
|
+
if (isRecord(ctx.response) && expr.name in ctx.response) {
|
|
72
|
+
return ctx.response[expr.name];
|
|
27
73
|
}
|
|
28
74
|
return undefined;
|
|
29
75
|
}
|
|
30
76
|
case 'QualifiedName': {
|
|
31
|
-
//
|
|
77
|
+
// Handle 'response.x.y' specially - start from ctx.response
|
|
78
|
+
if (expr.parts.length > 0 && expr.parts[0] === 'response') {
|
|
79
|
+
let value = ctx.response;
|
|
80
|
+
for (let i = 1; i < expr.parts.length; i++) {
|
|
81
|
+
if (isRecord(value)) {
|
|
82
|
+
value = value[expr.parts[i]];
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
// Try from current/response first (common case for .field paths)
|
|
32
91
|
let value = current ?? ctx.response;
|
|
33
|
-
if (value
|
|
92
|
+
if (isRecord(value)) {
|
|
34
93
|
let found = true;
|
|
35
94
|
for (const part of expr.parts) {
|
|
36
|
-
if (value
|
|
95
|
+
if (isRecord(value)) {
|
|
37
96
|
value = value[part];
|
|
38
97
|
}
|
|
39
98
|
else {
|
|
@@ -50,7 +109,7 @@ export function evaluate(expr, ctx, current) {
|
|
|
50
109
|
value = getVariable(ctx, expr.parts[0]);
|
|
51
110
|
if (value !== undefined) {
|
|
52
111
|
for (let i = 1; i < expr.parts.length; i++) {
|
|
53
|
-
if (value
|
|
112
|
+
if (isRecord(value)) {
|
|
54
113
|
value = value[expr.parts[i]];
|
|
55
114
|
}
|
|
56
115
|
else {
|
|
@@ -67,36 +126,48 @@ export function evaluate(expr, ctx, current) {
|
|
|
67
126
|
const right = evaluate(expr.right, ctx, current);
|
|
68
127
|
switch (expr.operator) {
|
|
69
128
|
case '+':
|
|
70
|
-
|
|
129
|
+
// Allow string concatenation
|
|
130
|
+
if (typeof left === 'string' || typeof right === 'string') {
|
|
131
|
+
return String(left ?? '') + String(right ?? '');
|
|
132
|
+
}
|
|
133
|
+
return toNumber(left, '+') + toNumber(right, '+');
|
|
71
134
|
case '-':
|
|
72
|
-
return left - right;
|
|
135
|
+
return toNumber(left, '-') - toNumber(right, '-');
|
|
73
136
|
case '*':
|
|
74
|
-
return left * right;
|
|
75
|
-
case '/':
|
|
76
|
-
|
|
137
|
+
return toNumber(left, '*') * toNumber(right, '*');
|
|
138
|
+
case '/': {
|
|
139
|
+
const divisor = toNumber(right, '/');
|
|
140
|
+
if (divisor === 0) {
|
|
141
|
+
throw new EvaluatorError('Division by zero', { expression: '/' });
|
|
142
|
+
}
|
|
143
|
+
return toNumber(left, '/') / divisor;
|
|
144
|
+
}
|
|
77
145
|
case '==':
|
|
78
146
|
return left === right;
|
|
79
147
|
case '!=':
|
|
80
148
|
return left !== right;
|
|
81
149
|
case '<':
|
|
82
|
-
return left <
|
|
150
|
+
return compareNumbers(left, right, '<');
|
|
83
151
|
case '>':
|
|
84
|
-
return left >
|
|
152
|
+
return compareNumbers(left, right, '>');
|
|
85
153
|
case '<=':
|
|
86
|
-
return left <=
|
|
154
|
+
return compareNumbers(left, right, '<=');
|
|
87
155
|
case '>=':
|
|
88
|
-
return left >=
|
|
156
|
+
return compareNumbers(left, right, '>=');
|
|
89
157
|
default:
|
|
90
|
-
throw new
|
|
158
|
+
throw new UnsupportedOperationError(`operator: ${expr.operator}`, 'binary expression');
|
|
91
159
|
}
|
|
92
160
|
}
|
|
93
161
|
case 'LogicalExpression': {
|
|
94
162
|
const left = evaluate(expr.left, ctx, current);
|
|
163
|
+
// Return operand values (like JS &&/||), not coerced booleans, so
|
|
164
|
+
// idioms like `x or default` work. Short-circuit: only evaluate the
|
|
165
|
+
// right operand when the left doesn't already decide the result.
|
|
95
166
|
if (expr.operator === 'and') {
|
|
96
|
-
return left ? evaluate(expr.right, ctx, current) :
|
|
167
|
+
return left ? evaluate(expr.right, ctx, current) : left;
|
|
97
168
|
}
|
|
98
169
|
else {
|
|
99
|
-
return left ?
|
|
170
|
+
return left ? left : evaluate(expr.right, ctx, current);
|
|
100
171
|
}
|
|
101
172
|
}
|
|
102
173
|
case 'NotExpression':
|
|
@@ -104,9 +175,9 @@ export function evaluate(expr, ctx, current) {
|
|
|
104
175
|
case 'UnaryExpression': {
|
|
105
176
|
const operand = evaluate(expr.operand, ctx, current);
|
|
106
177
|
if (expr.operator === '-')
|
|
107
|
-
return -operand;
|
|
178
|
+
return -toNumber(operand, 'unary -');
|
|
108
179
|
if (expr.operator === '+')
|
|
109
|
-
return +
|
|
180
|
+
return toNumber(operand, 'unary +');
|
|
110
181
|
return operand;
|
|
111
182
|
}
|
|
112
183
|
case 'TernaryExpression': {
|
|
@@ -139,8 +210,12 @@ export function evaluate(expr, ctx, current) {
|
|
|
139
210
|
if (typeof args[0] === 'string')
|
|
140
211
|
return args[0].length;
|
|
141
212
|
return 0;
|
|
142
|
-
case 'sum':
|
|
143
|
-
|
|
213
|
+
case 'sum': {
|
|
214
|
+
if (!Array.isArray(args[0])) {
|
|
215
|
+
throw new EvaluatorError('sum() requires an array argument', { expression: 'sum' });
|
|
216
|
+
}
|
|
217
|
+
return args[0].reduce((acc, val) => acc + toNumber(val, 'sum'), 0);
|
|
218
|
+
}
|
|
144
219
|
case 'count':
|
|
145
220
|
return Array.isArray(args[0]) ? args[0].length : 0;
|
|
146
221
|
case 'first':
|
|
@@ -148,13 +223,25 @@ export function evaluate(expr, ctx, current) {
|
|
|
148
223
|
case 'last':
|
|
149
224
|
return Array.isArray(args[0]) ? args[0][args[0].length - 1] : undefined;
|
|
150
225
|
case 'round':
|
|
151
|
-
return Math.round(args[0]);
|
|
226
|
+
return Math.round(toNumber(args[0], 'round'));
|
|
152
227
|
case 'floor':
|
|
153
|
-
return Math.floor(args[0]);
|
|
228
|
+
return Math.floor(toNumber(args[0], 'floor'));
|
|
154
229
|
case 'ceil':
|
|
155
|
-
return Math.ceil(args[0]);
|
|
230
|
+
return Math.ceil(toNumber(args[0], 'ceil'));
|
|
231
|
+
case 'now':
|
|
232
|
+
return new Date().toISOString();
|
|
233
|
+
case 'env': {
|
|
234
|
+
// The variable name must be a static string literal. A dynamic argument
|
|
235
|
+
// (e.g. env(response.field)) would let fetched/untrusted data choose
|
|
236
|
+
// which environment variable is read, exfiltrating secrets.
|
|
237
|
+
const nameExpr = expr.arguments[0];
|
|
238
|
+
if (!nameExpr || nameExpr.type !== 'Literal') {
|
|
239
|
+
throw new EvaluatorError(`env() requires a string-literal variable name, not a dynamic expression`, { expression: 'env' });
|
|
240
|
+
}
|
|
241
|
+
return process.env[String(args[0])] ?? '';
|
|
242
|
+
}
|
|
156
243
|
default:
|
|
157
|
-
throw new
|
|
244
|
+
throw new UnsupportedOperationError(`function: ${expr.callee}`, 'call expression');
|
|
158
245
|
}
|
|
159
246
|
}
|
|
160
247
|
case 'AnyOfExpression': {
|
|
@@ -166,36 +253,126 @@ export function evaluate(expr, ctx, current) {
|
|
|
166
253
|
}
|
|
167
254
|
return collection[Math.floor(Math.random() * collection.length)];
|
|
168
255
|
}
|
|
169
|
-
case '
|
|
170
|
-
//
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
return checkType(value, isExpr.typeCheck);
|
|
256
|
+
case 'OrderedSequenceType': {
|
|
257
|
+
// Inline array literal: [1, 2, 3]
|
|
258
|
+
const seqExpr = expr;
|
|
259
|
+
return seqExpr.elements.map((el) => evaluate(el, ctx, current));
|
|
174
260
|
}
|
|
175
261
|
default:
|
|
176
|
-
throw new
|
|
262
|
+
throw new EvaluatorError(`Cannot evaluate expression type: ${expr.type}`, {
|
|
263
|
+
expression: expr.type,
|
|
264
|
+
});
|
|
177
265
|
}
|
|
178
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* Evaluate an expression and convert the result to a string.
|
|
269
|
+
*
|
|
270
|
+
* @param expr - The expression to evaluate
|
|
271
|
+
* @param ctx - The execution context
|
|
272
|
+
* @param current - Optional current record for iteration contexts
|
|
273
|
+
* @returns The string representation of the evaluated value
|
|
274
|
+
*/
|
|
179
275
|
export function evaluateToString(expr, ctx, current) {
|
|
180
276
|
const value = evaluate(expr, ctx, current);
|
|
181
277
|
return String(value ?? '');
|
|
182
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* Interpolate variables in a path string using {variable.path} syntax.
|
|
281
|
+
*
|
|
282
|
+
* Replaces placeholders like {id} or {user.name} with values from the
|
|
283
|
+
* current record or execution context variables.
|
|
284
|
+
*
|
|
285
|
+
* @param path - The path string with {placeholder} syntax
|
|
286
|
+
* @param ctx - The execution context
|
|
287
|
+
* @param current - Optional current record for iteration contexts
|
|
288
|
+
* @returns The interpolated path string
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* // Interpolate a simple variable
|
|
292
|
+
* interpolatePath('/users/{id}', ctx, { id: 123 }); // '/users/123'
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* // Interpolate a nested path
|
|
296
|
+
* interpolatePath('/orgs/{org.id}/users', ctx, { org: { id: 'acme' } }); // '/orgs/acme/users'
|
|
297
|
+
*/
|
|
183
298
|
export function interpolatePath(path, ctx, current) {
|
|
184
299
|
return path.replace(/\{([^}]+)\}/g, (_, expr) => {
|
|
185
300
|
// Simple variable interpolation
|
|
186
301
|
const parts = expr.split('.');
|
|
187
302
|
let value = current;
|
|
188
303
|
for (const part of parts) {
|
|
189
|
-
if (value
|
|
304
|
+
if (isRecord(value)) {
|
|
190
305
|
value = value[part];
|
|
191
306
|
}
|
|
192
307
|
else {
|
|
193
308
|
value = getVariable(ctx, part);
|
|
194
309
|
}
|
|
195
310
|
}
|
|
196
|
-
|
|
311
|
+
// URL-encode each interpolated value so a path param can't inject path
|
|
312
|
+
// segments, query strings, or fragments into the request target. Path params
|
|
313
|
+
// are single segments, so encoding (which escapes '/', '?', '#', etc.) is the
|
|
314
|
+
// correct treatment.
|
|
315
|
+
return encodeURIComponent(String(value ?? ''));
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Coerce a value to a number for arithmetic operations.
|
|
320
|
+
* Returns NaN for values that cannot be meaningfully converted.
|
|
321
|
+
*/
|
|
322
|
+
function toNumber(value, operator) {
|
|
323
|
+
if (typeof value === 'number') {
|
|
324
|
+
return value;
|
|
325
|
+
}
|
|
326
|
+
if (typeof value === 'string') {
|
|
327
|
+
const parsed = Number(value);
|
|
328
|
+
if (!isNaN(parsed)) {
|
|
329
|
+
return parsed;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (typeof value === 'boolean') {
|
|
333
|
+
return value ? 1 : 0;
|
|
334
|
+
}
|
|
335
|
+
if (value === null || value === undefined) {
|
|
336
|
+
throw new EvaluatorError(`Cannot perform '${operator}' on ${value === null ? 'null' : 'undefined'}`, { expression: operator });
|
|
337
|
+
}
|
|
338
|
+
throw new EvaluatorError(`Cannot perform '${operator}' on ${typeof value} (expected number)`, {
|
|
339
|
+
expression: operator,
|
|
197
340
|
});
|
|
198
341
|
}
|
|
342
|
+
/** Coerce for comparison, yielding NaN (not a throw) for nullish/non-numeric. */
|
|
343
|
+
function toComparable(value) {
|
|
344
|
+
if (typeof value === 'number')
|
|
345
|
+
return value;
|
|
346
|
+
if (typeof value === 'boolean')
|
|
347
|
+
return value ? 1 : 0;
|
|
348
|
+
if (typeof value === 'string')
|
|
349
|
+
return Number(value);
|
|
350
|
+
return NaN;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Arithmetic comparison for `where`/`match`/`validate` guards. A missing or
|
|
354
|
+
* non-numeric operand makes the comparison false (the record is excluded) rather
|
|
355
|
+
* than throwing — real API data routinely omits fields, and one missing field
|
|
356
|
+
* shouldn't abort the whole stage.
|
|
357
|
+
*/
|
|
358
|
+
function compareNumbers(left, right, operator) {
|
|
359
|
+
const leftNum = toComparable(left);
|
|
360
|
+
const rightNum = toComparable(right);
|
|
361
|
+
if (Number.isNaN(leftNum) || Number.isNaN(rightNum))
|
|
362
|
+
return false;
|
|
363
|
+
switch (operator) {
|
|
364
|
+
case '<':
|
|
365
|
+
return leftNum < rightNum;
|
|
366
|
+
case '>':
|
|
367
|
+
return leftNum > rightNum;
|
|
368
|
+
case '<=':
|
|
369
|
+
return leftNum <= rightNum;
|
|
370
|
+
case '>=':
|
|
371
|
+
return leftNum >= rightNum;
|
|
372
|
+
default:
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
199
376
|
/** Type check functions map - more efficient than switch statement */
|
|
200
377
|
const TYPE_CHECKERS = new Map([
|
|
201
378
|
['array', (v) => Array.isArray(v)],
|
|
@@ -217,7 +394,7 @@ const TYPE_CHECKERS = new Map([
|
|
|
217
394
|
function checkType(value, typeName) {
|
|
218
395
|
const checker = TYPE_CHECKERS.get(typeName.toLowerCase());
|
|
219
396
|
if (!checker) {
|
|
220
|
-
throw new
|
|
397
|
+
throw new UnsupportedOperationError(`type check: ${typeName}`, "'is' expression");
|
|
221
398
|
}
|
|
222
399
|
return checker(value);
|
|
223
400
|
}
|
|
@@ -1,10 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Mission executor - orchestrates pipeline execution
|
|
4
|
+
* inputs:
|
|
5
|
+
* - ReqonProgram - parsed AST
|
|
6
|
+
* - ExecutorConfig - auth, stores, callbacks, debug settings
|
|
7
|
+
* outputs:
|
|
8
|
+
* - ExecutionResult - success/errors, stores, duration
|
|
9
|
+
* related:
|
|
10
|
+
* - ./context.ts - execution state (variables, stores, sources)
|
|
11
|
+
* - ./evaluator.ts - expression evaluation
|
|
12
|
+
* - ./fetch-handler.ts - HTTP requests
|
|
13
|
+
* - ./step-handlers/ - individual step type handlers
|
|
14
|
+
* - ./source-manager.ts - auth provider management
|
|
15
|
+
* ---
|
|
16
|
+
*/
|
|
1
17
|
import type { ReqonProgram } from '../ast/nodes.js';
|
|
2
18
|
import type { StoreAdapter } from '../stores/types.js';
|
|
19
|
+
import { type AuthConfig } from './source-manager.js';
|
|
3
20
|
import { type CircuitBreakerCallbacks } from '../auth/circuit-breaker.js';
|
|
4
21
|
import type { RateLimitCallbacks } from '../auth/types.js';
|
|
5
22
|
import { type ExecutionState, type ExecutionStore } from '../execution/index.js';
|
|
6
23
|
import { type SyncStore } from '../sync/index.js';
|
|
7
24
|
import type { WebhookServer } from '../webhook/index.js';
|
|
25
|
+
import type { EventEmitter, StructuredLogger } from '../observability/index.js';
|
|
26
|
+
import type { DebugController } from '../debug/index.js';
|
|
27
|
+
import type { ControlServer } from '../control/index.js';
|
|
28
|
+
import { type TraceStore } from '../trace/index.js';
|
|
29
|
+
import { type PauseManager, type PauseStore } from '../pause/index.js';
|
|
30
|
+
import type { ExecutionLogStore } from '../execution-log/index.js';
|
|
8
31
|
export interface ExecutionResult {
|
|
9
32
|
success: boolean;
|
|
10
33
|
duration: number;
|
|
@@ -15,6 +38,10 @@ export interface ExecutionResult {
|
|
|
15
38
|
executionId?: string;
|
|
16
39
|
/** Execution state (if persistence enabled) */
|
|
17
40
|
state?: ExecutionState;
|
|
41
|
+
/** Trace ID if tracing was enabled */
|
|
42
|
+
traceId?: string;
|
|
43
|
+
/** Pause ID if execution was paused */
|
|
44
|
+
pauseId?: string;
|
|
18
45
|
}
|
|
19
46
|
export interface ExecutionError {
|
|
20
47
|
action: string;
|
|
@@ -71,6 +98,7 @@ export interface ExecutorConfig {
|
|
|
71
98
|
stores?: Record<string, StoreAdapter>;
|
|
72
99
|
dryRun?: boolean;
|
|
73
100
|
verbose?: boolean;
|
|
101
|
+
missionDir?: string;
|
|
74
102
|
rateLimitCallbacks?: RateLimitCallbacks;
|
|
75
103
|
circuitBreakerCallbacks?: CircuitBreakerCallbacks;
|
|
76
104
|
developmentMode?: boolean;
|
|
@@ -82,29 +110,56 @@ export interface ExecutorConfig {
|
|
|
82
110
|
syncStore?: SyncStore;
|
|
83
111
|
progress?: ProgressCallbacks;
|
|
84
112
|
webhookServer?: WebhookServer;
|
|
113
|
+
eventEmitter?: EventEmitter;
|
|
114
|
+
logger?: StructuredLogger;
|
|
115
|
+
debugController?: DebugController;
|
|
116
|
+
controlServer?: ControlServer;
|
|
117
|
+
traceStore?: TraceStore;
|
|
118
|
+
pauseStore?: PauseStore;
|
|
119
|
+
pauseManager?: PauseManager;
|
|
120
|
+
executionLog?: ExecutionLogStore;
|
|
121
|
+
/**
|
|
122
|
+
* Max items a single run of a `backfill` paginated fetch accumulates before
|
|
123
|
+
* stopping cleanly (a later resume continues). Bounds memory per run for large
|
|
124
|
+
* backfills. Defaults to the handler's built-in cap.
|
|
125
|
+
*/
|
|
126
|
+
backfillMaxItemsPerRun?: number;
|
|
85
127
|
}
|
|
86
|
-
|
|
87
|
-
type: 'bearer' | 'oauth2' | 'none';
|
|
88
|
-
token?: string;
|
|
89
|
-
accessToken?: string;
|
|
90
|
-
refreshToken?: string;
|
|
91
|
-
tokenEndpoint?: string;
|
|
92
|
-
clientId?: string;
|
|
93
|
-
clientSecret?: string;
|
|
94
|
-
}
|
|
128
|
+
export { type AuthConfig } from './source-manager.js';
|
|
95
129
|
export declare class MissionExecutor {
|
|
96
130
|
private config;
|
|
97
131
|
private ctx;
|
|
98
132
|
private errors;
|
|
99
133
|
private actionsRun;
|
|
100
|
-
|
|
101
|
-
private
|
|
134
|
+
/** Monotonic key generator for queued values lacking an id. */
|
|
135
|
+
private queueCounter;
|
|
136
|
+
private transforms;
|
|
102
137
|
private rateLimiter;
|
|
103
138
|
private circuitBreaker;
|
|
139
|
+
private sourceManager;
|
|
140
|
+
private storeManager;
|
|
104
141
|
private executionStore?;
|
|
105
142
|
private executionState?;
|
|
106
143
|
private syncStore?;
|
|
107
144
|
private missionName?;
|
|
145
|
+
private eventEmitter?;
|
|
146
|
+
private logger?;
|
|
147
|
+
private executionLog?;
|
|
148
|
+
/** Stable id used for the execution event log (independent of persistState). */
|
|
149
|
+
private logExecutionId?;
|
|
150
|
+
/** Effect ids already applied (from the log) — replay skips these. */
|
|
151
|
+
private appliedEffects;
|
|
152
|
+
/** Backfill page progress per step id (from the log) — resumes pagination. */
|
|
153
|
+
private pageProgress;
|
|
154
|
+
/** The pause being resumed on this run — its step replays past, not into, a pause. */
|
|
155
|
+
private resumingPause?;
|
|
156
|
+
private debugController?;
|
|
157
|
+
private traceRecorder?;
|
|
158
|
+
private traceStore?;
|
|
159
|
+
private pauseManager?;
|
|
160
|
+
private pauseStore?;
|
|
161
|
+
private currentStageIndex;
|
|
162
|
+
private currentPauseId?;
|
|
108
163
|
constructor(config?: ExecutorConfig);
|
|
109
164
|
execute(program: ReqonProgram): Promise<ExecutionResult>;
|
|
110
165
|
private initializeExecutionState;
|
|
@@ -113,19 +168,82 @@ export declare class MissionExecutor {
|
|
|
113
168
|
private executeMission;
|
|
114
169
|
private getStageName;
|
|
115
170
|
private executeSequentialStage;
|
|
171
|
+
/**
|
|
172
|
+
* Run all settled-style tasks with a bounded number in flight at once,
|
|
173
|
+
* preserving result order. Caps fan-out so a wide `run [...]` can't open an
|
|
174
|
+
* unbounded number of concurrent HTTP/store operations.
|
|
175
|
+
*/
|
|
176
|
+
private settleWithLimit;
|
|
177
|
+
/**
|
|
178
|
+
* Execute a `run [A, B, ...]` stage.
|
|
179
|
+
*
|
|
180
|
+
* Failure semantics are **complete-then-fail**: every branch runs to
|
|
181
|
+
* completion (bounded by MAX_PARALLEL_ACTIONS in flight), then the stage
|
|
182
|
+
* fails if any branch failed. There is no cancellation of siblings and no
|
|
183
|
+
* rollback — a branch that committed store writes keeps them even if another
|
|
184
|
+
* branch failed. Each branch gets its own action scope (step counter +
|
|
185
|
+
* checkpoints); stores/sources/schemas are shared, so parallel branches that
|
|
186
|
+
* write the same key get last-writer-wins and should target disjoint keys.
|
|
187
|
+
*/
|
|
116
188
|
private executeParallelStage;
|
|
117
|
-
private initializeSource;
|
|
118
|
-
private initializeStore;
|
|
119
189
|
private executeAction;
|
|
190
|
+
/** Compute a retry backoff delay from a RetrySignal's backoff config. */
|
|
191
|
+
private computeRetryDelay;
|
|
192
|
+
/** Push a queued value to its target store (queue directive). */
|
|
193
|
+
private handleQueue;
|
|
120
194
|
private executeStep;
|
|
121
195
|
private executeFetch;
|
|
196
|
+
/**
|
|
197
|
+
* Per-action mutable scope (step counter + deferred checkpoints). Lazily
|
|
198
|
+
* created so a step run with the bare mission context still works; normally
|
|
199
|
+
* executeAction installs a fresh scope that nested scopes inherit.
|
|
200
|
+
*/
|
|
201
|
+
private scopeFor;
|
|
202
|
+
/**
|
|
203
|
+
* Append an event to the execution log. No-op (zero cost) when no log is
|
|
204
|
+
* configured. The executionId is supplied from this run's stable log id.
|
|
205
|
+
*/
|
|
206
|
+
private logEvent;
|
|
207
|
+
/** Flush deferred sync checkpoints (called after a successful store / action). */
|
|
208
|
+
private flushPendingCheckpoints;
|
|
122
209
|
private executeFor;
|
|
123
210
|
private executeMap;
|
|
124
211
|
private executeValidate;
|
|
125
212
|
private executeStore;
|
|
213
|
+
/**
|
|
214
|
+
* A stable hash of the payload a store step will write, used to make the
|
|
215
|
+
* store-effect identity content-aware. Resolving the source is a pure read of
|
|
216
|
+
* the context (the same value the handler stores); on any evaluation failure we
|
|
217
|
+
* fall back to a constant so behaviour matches the old target-only identity
|
|
218
|
+
* rather than throwing inside the dedup path.
|
|
219
|
+
*/
|
|
220
|
+
/** Load a pause's checkpoint into the shape the pause step uses to resume. */
|
|
221
|
+
private loadResumingPause;
|
|
222
|
+
private storeContentHash;
|
|
126
223
|
private executeMatch;
|
|
127
224
|
private executeLet;
|
|
225
|
+
private executeApply;
|
|
128
226
|
private executeWebhook;
|
|
227
|
+
private executePause;
|
|
129
228
|
private log;
|
|
229
|
+
/**
|
|
230
|
+
* Check if pause has been requested and handle it
|
|
231
|
+
* Should be called at safe pause points (between stages, loop iterations)
|
|
232
|
+
*/
|
|
233
|
+
private checkPause;
|
|
234
|
+
/**
|
|
235
|
+
* Update control server with current state
|
|
236
|
+
*/
|
|
237
|
+
private updateControlServerState;
|
|
238
|
+
private getStepType;
|
|
239
|
+
/** Get the event emitter (for external access) */
|
|
240
|
+
getEventEmitter(): EventEmitter | undefined;
|
|
241
|
+
/** Get the structured logger (for external access) */
|
|
242
|
+
getLogger(): StructuredLogger | undefined;
|
|
243
|
+
/** Get the debug controller (for external access) */
|
|
244
|
+
getDebugController(): DebugController | undefined;
|
|
245
|
+
/** Capture current execution state for debugging */
|
|
246
|
+
private captureDebugSnapshot;
|
|
247
|
+
/** Handle debug command and update state */
|
|
248
|
+
private handleDebugCommand;
|
|
130
249
|
}
|
|
131
|
-
export {};
|