reqon-dsl 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +22 -0
- package/dist/ast/nodes.d.ts +83 -4
- package/dist/ast/nodes.js +14 -0
- package/dist/auth/circuit-breaker.js +7 -6
- package/dist/auth/rate-limiter.d.ts +4 -0
- package/dist/auth/rate-limiter.js +9 -16
- package/dist/cli.d.ts +13 -0
- package/dist/cli.js +84 -4
- package/dist/config/constants.d.ts +141 -0
- package/dist/config/constants.js +128 -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 +88 -0
- package/dist/control/server.js +238 -0
- package/dist/control/types.d.ts +55 -0
- package/dist/control/types.js +7 -0
- package/dist/debug/cli-debugger.d.ts +17 -0
- package/dist/debug/cli-debugger.js +180 -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/index.d.ts +21 -1
- package/dist/index.js +33 -2
- package/dist/interpreter/context.d.ts +14 -0
- package/dist/interpreter/context.js +15 -0
- package/dist/interpreter/evaluator.d.ts +63 -1
- package/dist/interpreter/evaluator.js +186 -39
- package/dist/interpreter/executor.d.ts +70 -14
- package/dist/interpreter/executor.js +503 -174
- package/dist/interpreter/fetch-handler.d.ts +9 -0
- package/dist/interpreter/fetch-handler.js +133 -24
- package/dist/interpreter/http.d.ts +5 -0
- package/dist/interpreter/http.js +26 -12
- package/dist/interpreter/index.d.ts +3 -1
- package/dist/interpreter/index.js +2 -0
- package/dist/interpreter/pagination.d.ts +11 -2
- package/dist/interpreter/pagination.js +95 -31
- 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 +13 -0
- package/dist/interpreter/step-handlers/for-handler.js +71 -4
- 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 +43 -16
- 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 +11 -1
- package/dist/interpreter/step-handlers/store-handler.js +45 -13
- 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 +4 -2
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +3 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +18 -2
- package/dist/interpreter/store-manager.d.ts +46 -0
- package/dist/interpreter/store-manager.js +66 -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/mcp/index.d.ts +11 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.js +451 -0
- package/dist/oas/index.d.ts +2 -0
- package/dist/oas/index.js +1 -0
- package/dist/oas/mock-generator.d.ts +12 -0
- package/dist/oas/mock-generator.js +187 -0
- package/dist/observability/events.d.ts +244 -0
- package/dist/observability/events.js +90 -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 +259 -0
- package/dist/observability/otel.d.ts +135 -0
- package/dist/observability/otel.js +386 -0
- package/dist/parser/action-parser.d.ts +105 -0
- package/dist/parser/action-parser.js +645 -0
- package/dist/parser/expressions.d.ts +13 -0
- package/dist/parser/expressions.js +72 -2
- package/dist/parser/fetch-parser.d.ts +27 -0
- package/dist/parser/fetch-parser.js +269 -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 +14 -0
- package/dist/pause/index.js +11 -0
- package/dist/pause/manager.d.ts +118 -0
- package/dist/pause/manager.js +245 -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 +156 -0
- package/dist/plugin.d.ts +9 -12
- package/dist/plugin.js +10 -13
- package/dist/stores/factory.d.ts +1 -1
- package/dist/stores/factory.js +3 -2
- package/dist/stores/file.d.ts +26 -0
- package/dist/stores/file.js +64 -10
- 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 +11 -0
- package/dist/stores/types.d.ts +17 -0
- package/dist/stores/types.js +12 -0
- package/dist/trace/index.d.ts +16 -0
- package/dist/trace/index.js +12 -0
- package/dist/trace/recorder.d.ts +71 -0
- package/dist/trace/recorder.js +144 -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 +69 -0
- package/dist/trace/store.js +225 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/type-guards.d.ts +58 -0
- package/dist/utils/type-guards.js +92 -0
- package/dist/webhook/server.js +7 -6
- package/package.json +55 -6
- 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,244 @@
|
|
|
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
|
+
/** Duration in milliseconds (for completed events) */
|
|
20
|
+
duration?: number;
|
|
21
|
+
/** Event-specific payload */
|
|
22
|
+
payload: T;
|
|
23
|
+
}
|
|
24
|
+
export interface MissionStartPayload {
|
|
25
|
+
stageCount: number;
|
|
26
|
+
isResume: boolean;
|
|
27
|
+
resumeFromStage?: number;
|
|
28
|
+
metadata?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
export interface MissionCompletePayload {
|
|
31
|
+
success: boolean;
|
|
32
|
+
stagesCompleted: number;
|
|
33
|
+
stagesFailed: number;
|
|
34
|
+
stagesSkipped: number;
|
|
35
|
+
errorCount: number;
|
|
36
|
+
}
|
|
37
|
+
export interface MissionFailedPayload {
|
|
38
|
+
error: string;
|
|
39
|
+
failedStage?: string;
|
|
40
|
+
stagesCompleted: number;
|
|
41
|
+
}
|
|
42
|
+
export interface StageStartPayload {
|
|
43
|
+
stageIndex: number;
|
|
44
|
+
stageName: string;
|
|
45
|
+
totalStages: number;
|
|
46
|
+
isParallel: boolean;
|
|
47
|
+
parallelActions?: string[];
|
|
48
|
+
}
|
|
49
|
+
export interface StageCompletePayload {
|
|
50
|
+
stageIndex: number;
|
|
51
|
+
stageName: string;
|
|
52
|
+
success: boolean;
|
|
53
|
+
error?: string;
|
|
54
|
+
itemsProcessed?: number;
|
|
55
|
+
}
|
|
56
|
+
export type StepType = 'fetch' | 'for' | 'map' | 'validate' | 'store' | 'match' | 'let' | 'webhook' | 'pause';
|
|
57
|
+
export interface StepStartPayload {
|
|
58
|
+
actionName: string;
|
|
59
|
+
stepIndex: number;
|
|
60
|
+
stepType: StepType;
|
|
61
|
+
}
|
|
62
|
+
export interface StepCompletePayload {
|
|
63
|
+
actionName: string;
|
|
64
|
+
stepIndex: number;
|
|
65
|
+
stepType: StepType;
|
|
66
|
+
success: boolean;
|
|
67
|
+
error?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface FetchStartPayload {
|
|
70
|
+
source: string;
|
|
71
|
+
method: string;
|
|
72
|
+
path: string;
|
|
73
|
+
isOAS: boolean;
|
|
74
|
+
operationId?: string;
|
|
75
|
+
hasPagination: boolean;
|
|
76
|
+
hasSince: boolean;
|
|
77
|
+
}
|
|
78
|
+
export interface FetchCompletePayload {
|
|
79
|
+
source: string;
|
|
80
|
+
method: string;
|
|
81
|
+
path: string;
|
|
82
|
+
statusCode: number;
|
|
83
|
+
recordCount: number;
|
|
84
|
+
pagesFetched?: number;
|
|
85
|
+
bytesReceived?: number;
|
|
86
|
+
fromCache?: boolean;
|
|
87
|
+
}
|
|
88
|
+
export interface FetchRetryPayload {
|
|
89
|
+
source: string;
|
|
90
|
+
path: string;
|
|
91
|
+
attempt: number;
|
|
92
|
+
maxAttempts: number;
|
|
93
|
+
reason: string;
|
|
94
|
+
waitMs: number;
|
|
95
|
+
}
|
|
96
|
+
export interface FetchErrorPayload {
|
|
97
|
+
source: string;
|
|
98
|
+
path: string;
|
|
99
|
+
statusCode?: number;
|
|
100
|
+
error: string;
|
|
101
|
+
retryable: boolean;
|
|
102
|
+
}
|
|
103
|
+
export interface FetchHeartbeatPayload {
|
|
104
|
+
source: string;
|
|
105
|
+
path: string;
|
|
106
|
+
pagesProcessed: number;
|
|
107
|
+
itemsFetched: number;
|
|
108
|
+
hasMore: boolean;
|
|
109
|
+
}
|
|
110
|
+
export interface DataTransformPayload {
|
|
111
|
+
targetSchema?: string;
|
|
112
|
+
inputCount: number;
|
|
113
|
+
outputCount: number;
|
|
114
|
+
fieldsMapping: number;
|
|
115
|
+
}
|
|
116
|
+
export interface DataValidatePayload {
|
|
117
|
+
target: string;
|
|
118
|
+
passed: boolean;
|
|
119
|
+
warningCount: number;
|
|
120
|
+
errorCount: number;
|
|
121
|
+
rules: string[];
|
|
122
|
+
}
|
|
123
|
+
export interface DataStorePayload {
|
|
124
|
+
storeName: string;
|
|
125
|
+
storeType: string;
|
|
126
|
+
operation: 'set' | 'update' | 'upsert' | 'append';
|
|
127
|
+
itemCount: number;
|
|
128
|
+
key?: string;
|
|
129
|
+
}
|
|
130
|
+
export interface LoopStartPayload {
|
|
131
|
+
variable: string;
|
|
132
|
+
collectionSize: number;
|
|
133
|
+
hasFilter: boolean;
|
|
134
|
+
}
|
|
135
|
+
export interface LoopIterationPayload {
|
|
136
|
+
variable: string;
|
|
137
|
+
itemIndex: number;
|
|
138
|
+
totalItems: number;
|
|
139
|
+
}
|
|
140
|
+
export interface LoopCompletePayload {
|
|
141
|
+
variable: string;
|
|
142
|
+
totalItems: number;
|
|
143
|
+
itemsProcessed: number;
|
|
144
|
+
itemsSkipped: number;
|
|
145
|
+
itemsFailed: number;
|
|
146
|
+
}
|
|
147
|
+
export interface LoopHeartbeatPayload {
|
|
148
|
+
variable: string;
|
|
149
|
+
current: number;
|
|
150
|
+
total: number;
|
|
151
|
+
processedCount: number;
|
|
152
|
+
}
|
|
153
|
+
export interface MatchAttemptPayload {
|
|
154
|
+
schemas: string[];
|
|
155
|
+
hasDefault: boolean;
|
|
156
|
+
}
|
|
157
|
+
export interface MatchResultPayload {
|
|
158
|
+
matchedSchema?: string;
|
|
159
|
+
isDefault: boolean;
|
|
160
|
+
flowDirective?: 'skip' | 'retry' | 'abort';
|
|
161
|
+
}
|
|
162
|
+
export interface WebhookRegisterPayload {
|
|
163
|
+
registrationId: string;
|
|
164
|
+
path: string;
|
|
165
|
+
webhookUrl: string;
|
|
166
|
+
timeout: number;
|
|
167
|
+
expectedEvents: number;
|
|
168
|
+
}
|
|
169
|
+
export interface WebhookEventPayload {
|
|
170
|
+
registrationId: string;
|
|
171
|
+
eventIndex: number;
|
|
172
|
+
totalExpected: number;
|
|
173
|
+
filtered: boolean;
|
|
174
|
+
}
|
|
175
|
+
export interface WebhookCompletePayload {
|
|
176
|
+
registrationId: string;
|
|
177
|
+
eventsReceived: number;
|
|
178
|
+
timedOut: boolean;
|
|
179
|
+
storedTo?: string;
|
|
180
|
+
}
|
|
181
|
+
export interface CheckpointSavePayload {
|
|
182
|
+
stageIndex: number;
|
|
183
|
+
stepIndex: number;
|
|
184
|
+
reason: 'manual' | 'webhook' | 'error' | 'pause';
|
|
185
|
+
variableCount: number;
|
|
186
|
+
}
|
|
187
|
+
export interface CheckpointResumePayload {
|
|
188
|
+
stageIndex: number;
|
|
189
|
+
stepIndex: number;
|
|
190
|
+
originalExecutionId: string;
|
|
191
|
+
stagesSkipped: number;
|
|
192
|
+
}
|
|
193
|
+
export interface SyncCheckpointPayload {
|
|
194
|
+
checkpointKey: string;
|
|
195
|
+
lastSyncTime: string;
|
|
196
|
+
recordsFetched: number;
|
|
197
|
+
isIncremental: boolean;
|
|
198
|
+
}
|
|
199
|
+
export interface RateLimitPayload {
|
|
200
|
+
source: string;
|
|
201
|
+
endpoint?: string;
|
|
202
|
+
waitSeconds: number;
|
|
203
|
+
strategy: string;
|
|
204
|
+
}
|
|
205
|
+
export interface CircuitBreakerPayload {
|
|
206
|
+
source: string;
|
|
207
|
+
endpoint?: string;
|
|
208
|
+
state: 'open' | 'half-open' | 'closed';
|
|
209
|
+
failures: number;
|
|
210
|
+
reason?: string;
|
|
211
|
+
}
|
|
212
|
+
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';
|
|
213
|
+
export type EventHandler<T = unknown> = (event: ObservabilityEvent<T>) => void;
|
|
214
|
+
export interface EventEmitter {
|
|
215
|
+
/** Emit an event */
|
|
216
|
+
emit<T>(type: EventType, payload: T): void;
|
|
217
|
+
/** Subscribe to a specific event type */
|
|
218
|
+
on<T>(type: EventType, handler: EventHandler<T>): () => void;
|
|
219
|
+
/** Subscribe to all events */
|
|
220
|
+
onAll(handler: EventHandler): () => void;
|
|
221
|
+
/** Remove all handlers */
|
|
222
|
+
clear(): void;
|
|
223
|
+
}
|
|
224
|
+
export declare class ObservabilityEmitter implements EventEmitter {
|
|
225
|
+
private executionId;
|
|
226
|
+
private mission;
|
|
227
|
+
private handlers;
|
|
228
|
+
private allHandlers;
|
|
229
|
+
private startTime;
|
|
230
|
+
private lastEventTime;
|
|
231
|
+
constructor(executionId: string, mission: string);
|
|
232
|
+
emit<T>(type: EventType, payload: T): void;
|
|
233
|
+
on<T>(type: EventType, handler: EventHandler<T>): () => void;
|
|
234
|
+
onAll(handler: EventHandler): () => void;
|
|
235
|
+
clear(): void;
|
|
236
|
+
/** Get total elapsed time since emitter creation */
|
|
237
|
+
getElapsedTime(): number;
|
|
238
|
+
/** Update execution context (for resume scenarios) */
|
|
239
|
+
setContext(executionId: string, mission: string): void;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Create a new observability emitter
|
|
243
|
+
*/
|
|
244
|
+
export declare function createEmitter(executionId: string, mission: string): ObservabilityEmitter;
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
lastEventTime;
|
|
17
|
+
constructor(executionId, mission) {
|
|
18
|
+
this.executionId = executionId;
|
|
19
|
+
this.mission = mission;
|
|
20
|
+
this.startTime = Date.now();
|
|
21
|
+
this.lastEventTime = this.startTime;
|
|
22
|
+
}
|
|
23
|
+
emit(type, payload) {
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
const event = {
|
|
26
|
+
type,
|
|
27
|
+
executionId: this.executionId,
|
|
28
|
+
mission: this.mission,
|
|
29
|
+
timestamp: new Date().toISOString(),
|
|
30
|
+
duration: now - this.lastEventTime,
|
|
31
|
+
payload,
|
|
32
|
+
};
|
|
33
|
+
this.lastEventTime = now;
|
|
34
|
+
// Notify specific handlers
|
|
35
|
+
const typeHandlers = this.handlers.get(type);
|
|
36
|
+
if (typeHandlers) {
|
|
37
|
+
for (const handler of typeHandlers) {
|
|
38
|
+
try {
|
|
39
|
+
handler(event);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Swallow handler errors to prevent breaking execution
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Notify all-event handlers
|
|
47
|
+
for (const handler of this.allHandlers) {
|
|
48
|
+
try {
|
|
49
|
+
handler(event);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Swallow handler errors
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
on(type, handler) {
|
|
57
|
+
if (!this.handlers.has(type)) {
|
|
58
|
+
this.handlers.set(type, new Set());
|
|
59
|
+
}
|
|
60
|
+
this.handlers.get(type).add(handler);
|
|
61
|
+
return () => {
|
|
62
|
+
this.handlers.get(type)?.delete(handler);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
onAll(handler) {
|
|
66
|
+
this.allHandlers.add(handler);
|
|
67
|
+
return () => {
|
|
68
|
+
this.allHandlers.delete(handler);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
clear() {
|
|
72
|
+
this.handlers.clear();
|
|
73
|
+
this.allHandlers.clear();
|
|
74
|
+
}
|
|
75
|
+
/** Get total elapsed time since emitter creation */
|
|
76
|
+
getElapsedTime() {
|
|
77
|
+
return Date.now() - this.startTime;
|
|
78
|
+
}
|
|
79
|
+
/** Update execution context (for resume scenarios) */
|
|
80
|
+
setContext(executionId, mission) {
|
|
81
|
+
this.executionId = executionId;
|
|
82
|
+
this.mission = mission;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a new observability emitter
|
|
87
|
+
*/
|
|
88
|
+
export function createEmitter(executionId, mission) {
|
|
89
|
+
return new ObservabilityEmitter(executionId, mission);
|
|
90
|
+
}
|
|
@@ -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';
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Logger - Enhanced logging with context and spans
|
|
3
|
+
*
|
|
4
|
+
* Provides structured logging capabilities with:
|
|
5
|
+
* - Hierarchical context (child loggers)
|
|
6
|
+
* - Timing spans for operations
|
|
7
|
+
* - Multiple output formats
|
|
8
|
+
* - Integration with event emitter
|
|
9
|
+
*/
|
|
10
|
+
import type { LogLevel, EventEmitter } from './events.js';
|
|
11
|
+
/** Log entry structure */
|
|
12
|
+
export interface LogEntry {
|
|
13
|
+
level: LogLevel;
|
|
14
|
+
message: string;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
context: Record<string, unknown>;
|
|
17
|
+
spanId?: string;
|
|
18
|
+
parentSpanId?: string;
|
|
19
|
+
duration?: number;
|
|
20
|
+
}
|
|
21
|
+
/** Span for timing operations */
|
|
22
|
+
export interface Span {
|
|
23
|
+
/** End the span and return duration in ms */
|
|
24
|
+
end(): number;
|
|
25
|
+
/** Add context to the span */
|
|
26
|
+
addContext(context: Record<string, unknown>): void;
|
|
27
|
+
/** Create a child span */
|
|
28
|
+
child(name: string): Span;
|
|
29
|
+
/** Get span ID */
|
|
30
|
+
readonly id: string;
|
|
31
|
+
}
|
|
32
|
+
/** Output handler interface */
|
|
33
|
+
export interface LogOutput {
|
|
34
|
+
write(entry: LogEntry): void;
|
|
35
|
+
}
|
|
36
|
+
/** Structured logger interface */
|
|
37
|
+
export interface StructuredLogger {
|
|
38
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
39
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
40
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
41
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
42
|
+
/** Create a child logger with additional context */
|
|
43
|
+
child(context: Record<string, unknown>): StructuredLogger;
|
|
44
|
+
/** Create a timing span */
|
|
45
|
+
span(name: string): Span;
|
|
46
|
+
/** Set minimum log level */
|
|
47
|
+
setLevel(level: LogLevel): void;
|
|
48
|
+
/** Add an output handler */
|
|
49
|
+
addOutput(output: LogOutput): void;
|
|
50
|
+
}
|
|
51
|
+
/** Console output with human-readable formatting */
|
|
52
|
+
export declare class ConsoleOutput implements LogOutput {
|
|
53
|
+
private prefix;
|
|
54
|
+
private colors;
|
|
55
|
+
constructor(options?: {
|
|
56
|
+
prefix?: string;
|
|
57
|
+
colors?: boolean;
|
|
58
|
+
});
|
|
59
|
+
write(entry: LogEntry): void;
|
|
60
|
+
}
|
|
61
|
+
/** JSON Lines output for log aggregation */
|
|
62
|
+
export declare class JsonLinesOutput implements LogOutput {
|
|
63
|
+
private stream;
|
|
64
|
+
constructor(stream?: {
|
|
65
|
+
write: (line: string) => void;
|
|
66
|
+
});
|
|
67
|
+
write(entry: LogEntry): void;
|
|
68
|
+
}
|
|
69
|
+
/** Buffer output for testing */
|
|
70
|
+
export declare class BufferOutput implements LogOutput {
|
|
71
|
+
readonly entries: LogEntry[];
|
|
72
|
+
write(entry: LogEntry): void;
|
|
73
|
+
clear(): void;
|
|
74
|
+
find(predicate: (entry: LogEntry) => boolean): LogEntry | undefined;
|
|
75
|
+
filter(predicate: (entry: LogEntry) => boolean): LogEntry[];
|
|
76
|
+
}
|
|
77
|
+
/** Event emitter output - bridges logs to events */
|
|
78
|
+
export declare class EventOutput implements LogOutput {
|
|
79
|
+
private emitter;
|
|
80
|
+
constructor(emitter: EventEmitter);
|
|
81
|
+
write(entry: LogEntry): void;
|
|
82
|
+
}
|
|
83
|
+
export interface CreateLoggerOptions {
|
|
84
|
+
/** Logger prefix for console output */
|
|
85
|
+
prefix?: string;
|
|
86
|
+
/** Minimum log level */
|
|
87
|
+
level?: LogLevel;
|
|
88
|
+
/** Include console output */
|
|
89
|
+
console?: boolean;
|
|
90
|
+
/** Include JSON lines output */
|
|
91
|
+
jsonLines?: boolean;
|
|
92
|
+
/** Custom JSON lines stream */
|
|
93
|
+
jsonStream?: {
|
|
94
|
+
write: (line: string) => void;
|
|
95
|
+
};
|
|
96
|
+
/** Event emitter for bridging */
|
|
97
|
+
eventEmitter?: EventEmitter;
|
|
98
|
+
/** Initial context */
|
|
99
|
+
context?: Record<string, unknown>;
|
|
100
|
+
/** Silent mode (no outputs) */
|
|
101
|
+
silent?: boolean;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create a structured logger with configured outputs
|
|
105
|
+
*/
|
|
106
|
+
export declare function createStructuredLogger(options?: CreateLoggerOptions): StructuredLogger;
|