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,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate mock data from an OpenAPI schema.
|
|
3
|
+
* Used for dry-run mode to produce realistic mock responses.
|
|
4
|
+
*/
|
|
5
|
+
export function generateMockData(schema, options = {}) {
|
|
6
|
+
const ctx = {
|
|
7
|
+
depth: 0,
|
|
8
|
+
maxDepth: options.maxDepth ?? 3,
|
|
9
|
+
arrayLength: options.arrayLength ?? 2,
|
|
10
|
+
seenRefs: new Set(),
|
|
11
|
+
counter: { value: 0 },
|
|
12
|
+
};
|
|
13
|
+
return generateValue(schema, ctx);
|
|
14
|
+
}
|
|
15
|
+
function generateValue(schema, ctx) {
|
|
16
|
+
// Depth guard: after dereferencing, a self-referential schema becomes a
|
|
17
|
+
// circular object reference (not a $ref), so the only thing that stops
|
|
18
|
+
// infinite recursion is the depth cap. Enforce it here for every path,
|
|
19
|
+
// including allOf/oneOf/anyOf below.
|
|
20
|
+
if (ctx.depth > ctx.maxDepth) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
// Handle nullable - only return null if explicitly marked nullable
|
|
24
|
+
// and we're past the top level (depth > 0). Use strict equality check
|
|
25
|
+
// to avoid false positives from undefined/truthy coercion.
|
|
26
|
+
if (schema.nullable === true && ctx.depth > 1) {
|
|
27
|
+
// Return null ~20% of the time for nullable fields deep in the tree
|
|
28
|
+
if (Math.random() < 0.2) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Handle enum - pick first value
|
|
33
|
+
if (schema.enum && schema.enum.length > 0) {
|
|
34
|
+
return schema.enum[0];
|
|
35
|
+
}
|
|
36
|
+
// Handle example if provided
|
|
37
|
+
if (schema.example !== undefined) {
|
|
38
|
+
return schema.example;
|
|
39
|
+
}
|
|
40
|
+
// Handle default if provided
|
|
41
|
+
if (schema.default !== undefined) {
|
|
42
|
+
return schema.default;
|
|
43
|
+
}
|
|
44
|
+
// Check for allOf/oneOf/anyOf. Each recursion must increment depth so the
|
|
45
|
+
// depth cap can terminate self-referential combinator schemas.
|
|
46
|
+
const deeper = { ...ctx, depth: ctx.depth + 1 };
|
|
47
|
+
if (schema.allOf && schema.allOf.length > 0) {
|
|
48
|
+
// Merge all schemas
|
|
49
|
+
const merged = {};
|
|
50
|
+
for (const subSchema of schema.allOf) {
|
|
51
|
+
const subValue = generateValue(subSchema, deeper);
|
|
52
|
+
if (typeof subValue === 'object' && subValue !== null) {
|
|
53
|
+
Object.assign(merged, subValue);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return merged;
|
|
57
|
+
}
|
|
58
|
+
if (schema.oneOf && schema.oneOf.length > 0) {
|
|
59
|
+
return generateValue(schema.oneOf[0], deeper);
|
|
60
|
+
}
|
|
61
|
+
if (schema.anyOf && schema.anyOf.length > 0) {
|
|
62
|
+
return generateValue(schema.anyOf[0], deeper);
|
|
63
|
+
}
|
|
64
|
+
// Generate based on type
|
|
65
|
+
switch (schema.type) {
|
|
66
|
+
case 'string':
|
|
67
|
+
return generateString(schema, ctx);
|
|
68
|
+
case 'number':
|
|
69
|
+
return generateNumber(schema);
|
|
70
|
+
case 'integer':
|
|
71
|
+
return generateInteger(schema);
|
|
72
|
+
case 'boolean':
|
|
73
|
+
return true;
|
|
74
|
+
case 'array':
|
|
75
|
+
return generateArray(schema, ctx);
|
|
76
|
+
case 'object':
|
|
77
|
+
return generateObject(schema, ctx);
|
|
78
|
+
default: {
|
|
79
|
+
// No type specified - try to infer from properties
|
|
80
|
+
// Cast to SchemaObject to access properties on untyped schemas
|
|
81
|
+
const untyped = schema;
|
|
82
|
+
if (untyped.properties) {
|
|
83
|
+
return generateObject(untyped, ctx);
|
|
84
|
+
}
|
|
85
|
+
// Return empty object as fallback
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function generateString(schema, ctx) {
|
|
91
|
+
// Handle format
|
|
92
|
+
switch (schema.format) {
|
|
93
|
+
case 'date':
|
|
94
|
+
return '2024-01-15';
|
|
95
|
+
case 'date-time':
|
|
96
|
+
return '2024-01-15T10:30:00Z';
|
|
97
|
+
case 'email':
|
|
98
|
+
return `user${ctx.counter.value++}@example.com`;
|
|
99
|
+
case 'uri':
|
|
100
|
+
case 'url':
|
|
101
|
+
return 'https://example.com';
|
|
102
|
+
case 'uuid': {
|
|
103
|
+
// Generate unique UUIDs using counter
|
|
104
|
+
const id = ctx.counter.value++;
|
|
105
|
+
const hex = id.toString(16).padStart(12, '0');
|
|
106
|
+
return `550e8400-e29b-41d4-a716-${hex}`;
|
|
107
|
+
}
|
|
108
|
+
case 'hostname':
|
|
109
|
+
return 'example.com';
|
|
110
|
+
case 'ipv4':
|
|
111
|
+
return '192.168.1.1';
|
|
112
|
+
case 'ipv6':
|
|
113
|
+
return '2001:0db8:85a3:0000:0000:8a2e:0370:7334';
|
|
114
|
+
case 'byte':
|
|
115
|
+
return 'SGVsbG8gV29ybGQ='; // Base64 encoded "Hello World"
|
|
116
|
+
case 'binary':
|
|
117
|
+
return '<binary>';
|
|
118
|
+
case 'password':
|
|
119
|
+
return '********';
|
|
120
|
+
case 'phone':
|
|
121
|
+
return '+1-555-555-5555';
|
|
122
|
+
}
|
|
123
|
+
// Respect minLength/maxLength
|
|
124
|
+
const minLen = schema.minLength ?? 0;
|
|
125
|
+
const maxLen = schema.maxLength ?? 50;
|
|
126
|
+
const targetLen = Math.max(minLen, Math.min(8, maxLen));
|
|
127
|
+
// Generate a simple mock string
|
|
128
|
+
const base = 'mock_value';
|
|
129
|
+
if (base.length >= targetLen) {
|
|
130
|
+
return base.substring(0, targetLen);
|
|
131
|
+
}
|
|
132
|
+
return base.padEnd(targetLen, '_');
|
|
133
|
+
}
|
|
134
|
+
function generateNumber(schema) {
|
|
135
|
+
const min = schema.minimum ?? 0;
|
|
136
|
+
const max = schema.maximum ?? 100;
|
|
137
|
+
// Generate a value in range
|
|
138
|
+
const value = min + (max - min) / 2;
|
|
139
|
+
// Handle multipleOf
|
|
140
|
+
if (schema.multipleOf) {
|
|
141
|
+
return Math.round(value / schema.multipleOf) * schema.multipleOf;
|
|
142
|
+
}
|
|
143
|
+
return Math.round(value * 100) / 100;
|
|
144
|
+
}
|
|
145
|
+
function generateInteger(schema) {
|
|
146
|
+
const min = schema.minimum ?? 0;
|
|
147
|
+
const max = schema.maximum ?? 100;
|
|
148
|
+
// Generate integer in range
|
|
149
|
+
const value = Math.floor(min + (max - min) / 2);
|
|
150
|
+
// Handle multipleOf
|
|
151
|
+
if (schema.multipleOf) {
|
|
152
|
+
return Math.round(value / schema.multipleOf) * schema.multipleOf;
|
|
153
|
+
}
|
|
154
|
+
return value;
|
|
155
|
+
}
|
|
156
|
+
function generateArray(schema, ctx) {
|
|
157
|
+
// Check depth limit
|
|
158
|
+
if (ctx.depth >= ctx.maxDepth) {
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
// Determine array length
|
|
162
|
+
const minItems = schema.minItems ?? 0;
|
|
163
|
+
const maxItems = schema.maxItems ?? ctx.arrayLength;
|
|
164
|
+
const length = Math.max(minItems, Math.min(ctx.arrayLength, maxItems));
|
|
165
|
+
if (!schema.items) {
|
|
166
|
+
return Array(length).fill({});
|
|
167
|
+
}
|
|
168
|
+
const itemSchema = schema.items;
|
|
169
|
+
const items = [];
|
|
170
|
+
for (let i = 0; i < length; i++) {
|
|
171
|
+
items.push(generateValue(itemSchema, {
|
|
172
|
+
...ctx,
|
|
173
|
+
depth: ctx.depth + 1,
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
return items;
|
|
177
|
+
}
|
|
178
|
+
function generateObject(schema, ctx) {
|
|
179
|
+
// Check depth limit
|
|
180
|
+
if (ctx.depth >= ctx.maxDepth) {
|
|
181
|
+
return {};
|
|
182
|
+
}
|
|
183
|
+
const result = {};
|
|
184
|
+
const properties = schema.properties;
|
|
185
|
+
if (!properties) {
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
// Include all properties at any depth to generate complete mock data
|
|
189
|
+
for (const [key, propSchema] of Object.entries(properties)) {
|
|
190
|
+
result[key] = generateValue(propSchema, {
|
|
191
|
+
...ctx,
|
|
192
|
+
depth: ctx.depth + 1,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
}
|
package/dist/oas/validator.js
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upper bound on the length of a string we will test against a `pattern`
|
|
3
|
+
* regex. Both the schema pattern and the response value are untrusted, so a
|
|
4
|
+
* pathological pattern (e.g. `(a+)+$`) over a long string can trigger
|
|
5
|
+
* catastrophic backtracking. Anything longer is rejected without running the
|
|
6
|
+
* regex, so validation always returns promptly.
|
|
7
|
+
*/
|
|
8
|
+
const MAX_PATTERN_INPUT_LENGTH = 10_000;
|
|
9
|
+
/**
|
|
10
|
+
* Cache of compiled pattern regexes. Avoids recompiling the same (untrusted)
|
|
11
|
+
* pattern per value, and stores `null` for patterns that fail to compile so we
|
|
12
|
+
* skip them consistently.
|
|
13
|
+
*/
|
|
14
|
+
const patternRegexCache = new Map();
|
|
15
|
+
function getPatternRegex(pattern) {
|
|
16
|
+
const cached = patternRegexCache.get(pattern);
|
|
17
|
+
if (cached !== undefined)
|
|
18
|
+
return cached;
|
|
19
|
+
let regex;
|
|
20
|
+
try {
|
|
21
|
+
regex = new RegExp(pattern);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Invalid regex: don't crash validation, just skip the pattern check.
|
|
25
|
+
regex = null;
|
|
26
|
+
}
|
|
27
|
+
patternRegexCache.set(pattern, regex);
|
|
28
|
+
return regex;
|
|
29
|
+
}
|
|
1
30
|
export function validateResponse(data, schema, path = '') {
|
|
2
31
|
const errors = [];
|
|
3
32
|
validateValue(data, schema, path, errors);
|
|
@@ -79,15 +108,26 @@ function validateString(value, schema, path, errors) {
|
|
|
79
108
|
});
|
|
80
109
|
}
|
|
81
110
|
if (schema.pattern) {
|
|
82
|
-
|
|
83
|
-
|
|
111
|
+
if (value.length > MAX_PATTERN_INPUT_LENGTH) {
|
|
112
|
+
// Refuse to run an untrusted regex over an oversized string (ReDoS guard).
|
|
84
113
|
errors.push({
|
|
85
114
|
path,
|
|
86
|
-
message: `String
|
|
87
|
-
expected:
|
|
88
|
-
actual: value
|
|
115
|
+
message: `String too long to validate against pattern`,
|
|
116
|
+
expected: `<= ${MAX_PATTERN_INPUT_LENGTH} chars`,
|
|
117
|
+
actual: `${value.length} chars`,
|
|
89
118
|
});
|
|
90
119
|
}
|
|
120
|
+
else {
|
|
121
|
+
const regex = getPatternRegex(schema.pattern);
|
|
122
|
+
if (regex && !regex.test(value)) {
|
|
123
|
+
errors.push({
|
|
124
|
+
path,
|
|
125
|
+
message: `String does not match pattern`,
|
|
126
|
+
expected: schema.pattern,
|
|
127
|
+
actual: value,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
91
131
|
}
|
|
92
132
|
}
|
|
93
133
|
function validateNumber(value, schema, path, errors) {
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability Events - Typed events for mission execution
|
|
3
|
+
*
|
|
4
|
+
* Provides a comprehensive event system for tracking execution progress,
|
|
5
|
+
* performance metrics, and debugging information.
|
|
6
|
+
*/
|
|
7
|
+
/** Log levels for structured logging */
|
|
8
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
9
|
+
/** Base event structure for all observability events */
|
|
10
|
+
export interface ObservabilityEvent<T = unknown> {
|
|
11
|
+
/** Event type identifier */
|
|
12
|
+
type: string;
|
|
13
|
+
/** Execution context ID */
|
|
14
|
+
executionId: string;
|
|
15
|
+
/** Mission name */
|
|
16
|
+
mission: string;
|
|
17
|
+
/** ISO timestamp */
|
|
18
|
+
timestamp: string;
|
|
19
|
+
/**
|
|
20
|
+
* Duration in milliseconds of the operation this event reports, when the
|
|
21
|
+
* payload carries one. Not set by the emitter itself: a generic "time since
|
|
22
|
+
* the previous event of any type" value was misleading, so operation timing
|
|
23
|
+
* now lives in the typed payloads instead.
|
|
24
|
+
*/
|
|
25
|
+
duration?: number;
|
|
26
|
+
/** Event-specific payload */
|
|
27
|
+
payload: T;
|
|
28
|
+
}
|
|
29
|
+
export interface MissionStartPayload {
|
|
30
|
+
stageCount: number;
|
|
31
|
+
isResume: boolean;
|
|
32
|
+
resumeFromStage?: number;
|
|
33
|
+
metadata?: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
export interface MissionCompletePayload {
|
|
36
|
+
success: boolean;
|
|
37
|
+
stagesCompleted: number;
|
|
38
|
+
stagesFailed: number;
|
|
39
|
+
stagesSkipped: number;
|
|
40
|
+
errorCount: number;
|
|
41
|
+
}
|
|
42
|
+
export interface MissionFailedPayload {
|
|
43
|
+
error: string;
|
|
44
|
+
failedStage?: string;
|
|
45
|
+
stagesCompleted: number;
|
|
46
|
+
}
|
|
47
|
+
export interface StageStartPayload {
|
|
48
|
+
stageIndex: number;
|
|
49
|
+
stageName: string;
|
|
50
|
+
totalStages: number;
|
|
51
|
+
isParallel: boolean;
|
|
52
|
+
parallelActions?: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface StageCompletePayload {
|
|
55
|
+
stageIndex: number;
|
|
56
|
+
stageName: string;
|
|
57
|
+
success: boolean;
|
|
58
|
+
error?: string;
|
|
59
|
+
itemsProcessed?: number;
|
|
60
|
+
}
|
|
61
|
+
export type StepType = 'fetch' | 'for' | 'map' | 'validate' | 'store' | 'match' | 'let' | 'webhook' | 'pause';
|
|
62
|
+
export interface StepStartPayload {
|
|
63
|
+
actionName: string;
|
|
64
|
+
stepIndex: number;
|
|
65
|
+
stepType: StepType;
|
|
66
|
+
}
|
|
67
|
+
export interface StepCompletePayload {
|
|
68
|
+
actionName: string;
|
|
69
|
+
stepIndex: number;
|
|
70
|
+
stepType: StepType;
|
|
71
|
+
success: boolean;
|
|
72
|
+
error?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface FetchStartPayload {
|
|
75
|
+
source: string;
|
|
76
|
+
method: string;
|
|
77
|
+
path: string;
|
|
78
|
+
isOAS: boolean;
|
|
79
|
+
operationId?: string;
|
|
80
|
+
hasPagination: boolean;
|
|
81
|
+
hasSince: boolean;
|
|
82
|
+
}
|
|
83
|
+
export interface FetchCompletePayload {
|
|
84
|
+
source: string;
|
|
85
|
+
method: string;
|
|
86
|
+
path: string;
|
|
87
|
+
statusCode: number;
|
|
88
|
+
recordCount: number;
|
|
89
|
+
pagesFetched?: number;
|
|
90
|
+
bytesReceived?: number;
|
|
91
|
+
fromCache?: boolean;
|
|
92
|
+
}
|
|
93
|
+
export interface FetchRetryPayload {
|
|
94
|
+
source: string;
|
|
95
|
+
path: string;
|
|
96
|
+
attempt: number;
|
|
97
|
+
maxAttempts: number;
|
|
98
|
+
reason: string;
|
|
99
|
+
waitMs: number;
|
|
100
|
+
}
|
|
101
|
+
export interface FetchErrorPayload {
|
|
102
|
+
source: string;
|
|
103
|
+
path: string;
|
|
104
|
+
statusCode?: number;
|
|
105
|
+
error: string;
|
|
106
|
+
retryable: boolean;
|
|
107
|
+
}
|
|
108
|
+
export interface FetchHeartbeatPayload {
|
|
109
|
+
source: string;
|
|
110
|
+
path: string;
|
|
111
|
+
pagesProcessed: number;
|
|
112
|
+
itemsFetched: number;
|
|
113
|
+
hasMore: boolean;
|
|
114
|
+
}
|
|
115
|
+
export interface DataTransformPayload {
|
|
116
|
+
targetSchema?: string;
|
|
117
|
+
inputCount: number;
|
|
118
|
+
outputCount: number;
|
|
119
|
+
fieldsMapping: number;
|
|
120
|
+
}
|
|
121
|
+
export interface DataValidatePayload {
|
|
122
|
+
target: string;
|
|
123
|
+
passed: boolean;
|
|
124
|
+
warningCount: number;
|
|
125
|
+
errorCount: number;
|
|
126
|
+
rules: string[];
|
|
127
|
+
}
|
|
128
|
+
export interface DataStorePayload {
|
|
129
|
+
storeName: string;
|
|
130
|
+
storeType: string;
|
|
131
|
+
operation: 'set' | 'update' | 'upsert' | 'append';
|
|
132
|
+
itemCount: number;
|
|
133
|
+
key?: string;
|
|
134
|
+
}
|
|
135
|
+
export interface LoopStartPayload {
|
|
136
|
+
variable: string;
|
|
137
|
+
collectionSize: number;
|
|
138
|
+
hasFilter: boolean;
|
|
139
|
+
}
|
|
140
|
+
export interface LoopIterationPayload {
|
|
141
|
+
variable: string;
|
|
142
|
+
itemIndex: number;
|
|
143
|
+
totalItems: number;
|
|
144
|
+
}
|
|
145
|
+
export interface LoopCompletePayload {
|
|
146
|
+
variable: string;
|
|
147
|
+
totalItems: number;
|
|
148
|
+
itemsProcessed: number;
|
|
149
|
+
itemsSkipped: number;
|
|
150
|
+
itemsFailed: number;
|
|
151
|
+
}
|
|
152
|
+
export interface LoopHeartbeatPayload {
|
|
153
|
+
variable: string;
|
|
154
|
+
current: number;
|
|
155
|
+
total: number;
|
|
156
|
+
processedCount: number;
|
|
157
|
+
}
|
|
158
|
+
export interface MatchAttemptPayload {
|
|
159
|
+
schemas: string[];
|
|
160
|
+
hasDefault: boolean;
|
|
161
|
+
}
|
|
162
|
+
export interface MatchResultPayload {
|
|
163
|
+
matchedSchema?: string;
|
|
164
|
+
isDefault: boolean;
|
|
165
|
+
flowDirective?: 'skip' | 'retry' | 'abort';
|
|
166
|
+
}
|
|
167
|
+
export interface WebhookRegisterPayload {
|
|
168
|
+
registrationId: string;
|
|
169
|
+
path: string;
|
|
170
|
+
webhookUrl: string;
|
|
171
|
+
timeout: number;
|
|
172
|
+
expectedEvents: number;
|
|
173
|
+
}
|
|
174
|
+
export interface WebhookEventPayload {
|
|
175
|
+
registrationId: string;
|
|
176
|
+
eventIndex: number;
|
|
177
|
+
totalExpected: number;
|
|
178
|
+
filtered: boolean;
|
|
179
|
+
}
|
|
180
|
+
export interface WebhookCompletePayload {
|
|
181
|
+
registrationId: string;
|
|
182
|
+
eventsReceived: number;
|
|
183
|
+
timedOut: boolean;
|
|
184
|
+
storedTo?: string;
|
|
185
|
+
}
|
|
186
|
+
export interface CheckpointSavePayload {
|
|
187
|
+
stageIndex: number;
|
|
188
|
+
stepIndex: number;
|
|
189
|
+
reason: 'manual' | 'webhook' | 'error' | 'pause';
|
|
190
|
+
variableCount: number;
|
|
191
|
+
}
|
|
192
|
+
export interface CheckpointResumePayload {
|
|
193
|
+
stageIndex: number;
|
|
194
|
+
stepIndex: number;
|
|
195
|
+
originalExecutionId: string;
|
|
196
|
+
stagesSkipped: number;
|
|
197
|
+
}
|
|
198
|
+
export interface SyncCheckpointPayload {
|
|
199
|
+
checkpointKey: string;
|
|
200
|
+
lastSyncTime: string;
|
|
201
|
+
recordsFetched: number;
|
|
202
|
+
isIncremental: boolean;
|
|
203
|
+
}
|
|
204
|
+
export interface RateLimitPayload {
|
|
205
|
+
source: string;
|
|
206
|
+
endpoint?: string;
|
|
207
|
+
waitSeconds: number;
|
|
208
|
+
strategy: string;
|
|
209
|
+
}
|
|
210
|
+
export interface CircuitBreakerPayload {
|
|
211
|
+
source: string;
|
|
212
|
+
endpoint?: string;
|
|
213
|
+
state: 'open' | 'half-open' | 'closed';
|
|
214
|
+
failures: number;
|
|
215
|
+
reason?: string;
|
|
216
|
+
}
|
|
217
|
+
export type EventType = 'mission.start' | 'mission.complete' | 'mission.failed' | 'mission.paused' | 'stage.start' | 'stage.complete' | 'step.start' | 'step.complete' | 'fetch.start' | 'fetch.complete' | 'fetch.retry' | 'fetch.error' | 'fetch.heartbeat' | 'data.transform' | 'data.validate' | 'data.store' | 'loop.start' | 'loop.iteration' | 'loop.complete' | 'loop.heartbeat' | 'match.attempt' | 'match.result' | 'webhook.register' | 'webhook.event' | 'webhook.complete' | 'checkpoint.save' | 'checkpoint.resume' | 'sync.checkpoint' | 'ratelimit.wait' | 'ratelimit.resume' | 'circuit.open' | 'circuit.halfopen' | 'circuit.close';
|
|
218
|
+
export type EventHandler<T = unknown> = (event: ObservabilityEvent<T>) => void;
|
|
219
|
+
export interface EventEmitter {
|
|
220
|
+
/** Emit an event */
|
|
221
|
+
emit<T>(type: EventType, payload: T): void;
|
|
222
|
+
/** Subscribe to a specific event type */
|
|
223
|
+
on<T>(type: EventType, handler: EventHandler<T>): () => void;
|
|
224
|
+
/** Subscribe to all events */
|
|
225
|
+
onAll(handler: EventHandler): () => void;
|
|
226
|
+
/** Remove all handlers */
|
|
227
|
+
clear(): void;
|
|
228
|
+
}
|
|
229
|
+
export declare class ObservabilityEmitter implements EventEmitter {
|
|
230
|
+
private executionId;
|
|
231
|
+
private mission;
|
|
232
|
+
private handlers;
|
|
233
|
+
private allHandlers;
|
|
234
|
+
private startTime;
|
|
235
|
+
constructor(executionId: string, mission: string);
|
|
236
|
+
emit<T>(type: EventType, payload: T): void;
|
|
237
|
+
on<T>(type: EventType, handler: EventHandler<T>): () => void;
|
|
238
|
+
onAll(handler: EventHandler): () => void;
|
|
239
|
+
clear(): void;
|
|
240
|
+
/** Get total elapsed time since emitter creation */
|
|
241
|
+
getElapsedTime(): number;
|
|
242
|
+
/** Update execution context (for resume scenarios) */
|
|
243
|
+
setContext(executionId: string, mission: string): void;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Create a new observability emitter
|
|
247
|
+
*/
|
|
248
|
+
export declare function createEmitter(executionId: string, mission: string): ObservabilityEmitter;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability Events - Typed events for mission execution
|
|
3
|
+
*
|
|
4
|
+
* Provides a comprehensive event system for tracking execution progress,
|
|
5
|
+
* performance metrics, and debugging information.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Event Emitter Implementation
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class ObservabilityEmitter {
|
|
11
|
+
executionId;
|
|
12
|
+
mission;
|
|
13
|
+
handlers = new Map();
|
|
14
|
+
allHandlers = new Set();
|
|
15
|
+
startTime;
|
|
16
|
+
constructor(executionId, mission) {
|
|
17
|
+
this.executionId = executionId;
|
|
18
|
+
this.mission = mission;
|
|
19
|
+
this.startTime = Date.now();
|
|
20
|
+
}
|
|
21
|
+
emit(type, payload) {
|
|
22
|
+
const event = {
|
|
23
|
+
type,
|
|
24
|
+
executionId: this.executionId,
|
|
25
|
+
mission: this.mission,
|
|
26
|
+
timestamp: new Date().toISOString(),
|
|
27
|
+
payload,
|
|
28
|
+
};
|
|
29
|
+
// Notify specific handlers
|
|
30
|
+
const typeHandlers = this.handlers.get(type);
|
|
31
|
+
if (typeHandlers) {
|
|
32
|
+
for (const handler of typeHandlers) {
|
|
33
|
+
try {
|
|
34
|
+
handler(event);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Swallow handler errors to prevent breaking execution
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Notify all-event handlers
|
|
42
|
+
for (const handler of this.allHandlers) {
|
|
43
|
+
try {
|
|
44
|
+
handler(event);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Swallow handler errors
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
on(type, handler) {
|
|
52
|
+
if (!this.handlers.has(type)) {
|
|
53
|
+
this.handlers.set(type, new Set());
|
|
54
|
+
}
|
|
55
|
+
this.handlers.get(type).add(handler);
|
|
56
|
+
return () => {
|
|
57
|
+
this.handlers.get(type)?.delete(handler);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
onAll(handler) {
|
|
61
|
+
this.allHandlers.add(handler);
|
|
62
|
+
return () => {
|
|
63
|
+
this.allHandlers.delete(handler);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
clear() {
|
|
67
|
+
this.handlers.clear();
|
|
68
|
+
this.allHandlers.clear();
|
|
69
|
+
}
|
|
70
|
+
/** Get total elapsed time since emitter creation */
|
|
71
|
+
getElapsedTime() {
|
|
72
|
+
return Date.now() - this.startTime;
|
|
73
|
+
}
|
|
74
|
+
/** Update execution context (for resume scenarios) */
|
|
75
|
+
setContext(executionId, mission) {
|
|
76
|
+
this.executionId = executionId;
|
|
77
|
+
this.mission = mission;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Create a new observability emitter
|
|
82
|
+
*/
|
|
83
|
+
export function createEmitter(executionId, mission) {
|
|
84
|
+
return new ObservabilityEmitter(executionId, mission);
|
|
85
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability Module - Mission execution monitoring
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive observability for Reqon missions:
|
|
5
|
+
* - Structured event system
|
|
6
|
+
* - Enhanced logging with context
|
|
7
|
+
* - OpenTelemetry integration
|
|
8
|
+
* - Multiple output adapters
|
|
9
|
+
*/
|
|
10
|
+
export type { LogLevel, ObservabilityEvent, EventType, EventHandler, EventEmitter, MissionStartPayload, MissionCompletePayload, MissionFailedPayload, StageStartPayload, StageCompletePayload, StepType, StepStartPayload, StepCompletePayload, FetchStartPayload, FetchCompletePayload, FetchRetryPayload, FetchErrorPayload, FetchHeartbeatPayload, DataTransformPayload, DataValidatePayload, DataStorePayload, LoopStartPayload, LoopIterationPayload, LoopCompletePayload, LoopHeartbeatPayload, MatchAttemptPayload, MatchResultPayload, WebhookRegisterPayload, WebhookEventPayload, WebhookCompletePayload, CheckpointSavePayload, CheckpointResumePayload, SyncCheckpointPayload, RateLimitPayload, CircuitBreakerPayload, } from './events.js';
|
|
11
|
+
export { ObservabilityEmitter, createEmitter } from './events.js';
|
|
12
|
+
export type { LogEntry, Span, LogOutput, StructuredLogger, CreateLoggerOptions } from './logger.js';
|
|
13
|
+
export { ConsoleOutput, JsonLinesOutput, BufferOutput, EventOutput, createStructuredLogger, } from './logger.js';
|
|
14
|
+
export type { OTelSpan, OTelAttribute, OTelSpanEvent, TraceContext, OTLPExporterConfig, } from './otel.js';
|
|
15
|
+
export { generateTraceId, generateSpanId, SpanBuilder, OTelEventAdapter, OTLPExporter, OTelLogOutput, createOTelListener, } from './otel.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability Module - Mission execution monitoring
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive observability for Reqon missions:
|
|
5
|
+
* - Structured event system
|
|
6
|
+
* - Enhanced logging with context
|
|
7
|
+
* - OpenTelemetry integration
|
|
8
|
+
* - Multiple output adapters
|
|
9
|
+
*/
|
|
10
|
+
export { ObservabilityEmitter, createEmitter } from './events.js';
|
|
11
|
+
export { ConsoleOutput, JsonLinesOutput, BufferOutput, EventOutput, createStructuredLogger, } from './logger.js';
|
|
12
|
+
export { generateTraceId, generateSpanId, SpanBuilder, OTelEventAdapter, OTLPExporter, OTelLogOutput, createOTelListener, } from './otel.js';
|