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
package/CHANGELOG.md
ADDED
package/README.md
CHANGED
|
@@ -191,6 +191,28 @@ run Step1 then Step2 then Step3
|
|
|
191
191
|
run [Step1, Step2] then Step3 // Step1 and Step2 run in parallel, then Step3
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
+
### Durability Features
|
|
195
|
+
|
|
196
|
+
```vague
|
|
197
|
+
mission DurablePipeline {
|
|
198
|
+
// Checkpoint after each step for resume-on-failure
|
|
199
|
+
checkpoint: afterStep // or onFailure
|
|
200
|
+
|
|
201
|
+
// Enable time-travel debugging
|
|
202
|
+
trace: full // or minimal
|
|
203
|
+
|
|
204
|
+
action WaitForApproval {
|
|
205
|
+
// Resource-free pause (days/weeks without holding resources)
|
|
206
|
+
pause {
|
|
207
|
+
duration: "7d",
|
|
208
|
+
resumeOn: timeout | webhook "/approved"
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
run WaitForApproval
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
194
216
|
## OpenAPI Integration
|
|
195
217
|
|
|
196
218
|
Reqon can consume OpenAPI specs directly, eliminating the need for handwritten SDK code:
|
package/dist/ast/nodes.d.ts
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: AST node type definitions for Reqon programs
|
|
4
|
+
* exports:
|
|
5
|
+
* - ReqonProgram, Statement - top-level types
|
|
6
|
+
* - MissionDefinition, ActionDefinition - pipeline structure
|
|
7
|
+
* - SourceDefinition, StoreDefinition - resource declarations
|
|
8
|
+
* - FetchStep, ForStep, MapStep, ValidateStep, etc. - action steps
|
|
9
|
+
* related:
|
|
10
|
+
* - ../parser/parser.ts - produces these AST nodes
|
|
11
|
+
* - ../interpreter/executor.ts - executes AST
|
|
12
|
+
* - vague-lang - Expression, SchemaDefinition from parent DSL
|
|
13
|
+
* ---
|
|
14
|
+
*/
|
|
1
15
|
import type { Expression, SchemaDefinition, Statement as VagueStatement } from 'vague-lang';
|
|
2
|
-
export type Statement = VagueStatement | MissionDefinition | SourceDefinition | StoreDefinition | ActionDefinition;
|
|
16
|
+
export type Statement = VagueStatement | MissionDefinition | SourceDefinition | StoreDefinition | ActionDefinition | TransformDefinition;
|
|
3
17
|
export interface ReqonProgram {
|
|
4
18
|
type: 'ReqonProgram';
|
|
5
19
|
statements: Statement[];
|
|
@@ -39,7 +53,7 @@ export interface AuthConfig {
|
|
|
39
53
|
export interface StoreDefinition {
|
|
40
54
|
type: 'StoreDefinition';
|
|
41
55
|
name: string;
|
|
42
|
-
storeType: 'nosql' | 'sql' | 'memory';
|
|
56
|
+
storeType: 'nosql' | 'sql' | 'memory' | 'file' | 'postgrest';
|
|
43
57
|
target: string;
|
|
44
58
|
}
|
|
45
59
|
export interface ScheduleDefinition {
|
|
@@ -61,13 +75,32 @@ export interface ScheduleRetryConfig {
|
|
|
61
75
|
maxRetries: number;
|
|
62
76
|
delaySeconds: number;
|
|
63
77
|
}
|
|
78
|
+
export interface CheckpointConfig {
|
|
79
|
+
type: 'CheckpointConfig';
|
|
80
|
+
/** When to create checkpoints */
|
|
81
|
+
mode: 'after-step' | 'on-failure';
|
|
82
|
+
/** Optional: custom store for checkpoint data (defaults to FileStore) */
|
|
83
|
+
store?: string;
|
|
84
|
+
}
|
|
85
|
+
export interface TraceConfig {
|
|
86
|
+
type: 'TraceConfig';
|
|
87
|
+
/** Trace mode - 'full' captures state at each step */
|
|
88
|
+
mode: 'full' | 'minimal';
|
|
89
|
+
/** Optional: custom store for trace data */
|
|
90
|
+
store?: string;
|
|
91
|
+
}
|
|
64
92
|
export interface MissionDefinition {
|
|
65
93
|
type: 'MissionDefinition';
|
|
66
94
|
name: string;
|
|
67
95
|
schedule?: ScheduleDefinition;
|
|
96
|
+
/** Checkpoint configuration for durable execution */
|
|
97
|
+
checkpoint?: CheckpointConfig;
|
|
98
|
+
/** Trace configuration for time-travel debugging */
|
|
99
|
+
trace?: TraceConfig;
|
|
68
100
|
sources: SourceDefinition[];
|
|
69
101
|
stores: StoreDefinition[];
|
|
70
102
|
schemas: SchemaDefinition[];
|
|
103
|
+
transforms: TransformDefinition[];
|
|
71
104
|
actions: ActionDefinition[];
|
|
72
105
|
pipeline: PipelineDefinition;
|
|
73
106
|
}
|
|
@@ -76,7 +109,7 @@ export interface ActionDefinition {
|
|
|
76
109
|
name: string;
|
|
77
110
|
steps: ActionStep[];
|
|
78
111
|
}
|
|
79
|
-
export type ActionStep = FetchStep | ForStep | MapStep | ValidateStep | StoreStep | MatchStep | LetStep | WebhookStep;
|
|
112
|
+
export type ActionStep = FetchStep | ForStep | MapStep | ValidateStep | StoreStep | MatchStep | LetStep | ApplyStep | WebhookStep | PauseStep;
|
|
80
113
|
export interface LetStep {
|
|
81
114
|
type: 'LetStep';
|
|
82
115
|
name: string;
|
|
@@ -103,6 +136,22 @@ export interface WebhookStorageConfig {
|
|
|
103
136
|
/** Expression for extracting key from webhook payload */
|
|
104
137
|
key?: Expression;
|
|
105
138
|
}
|
|
139
|
+
export interface PauseStep {
|
|
140
|
+
type: 'PauseStep';
|
|
141
|
+
/** Duration to pause (e.g., "7d", "1h", "30m", 86400000) */
|
|
142
|
+
duration: string | number;
|
|
143
|
+
/** Store to persist pause state (defaults to FileStore) */
|
|
144
|
+
persist?: string;
|
|
145
|
+
/** Resume triggers - timeout (default) and/or webhook */
|
|
146
|
+
resumeOn?: PauseResumeTrigger[];
|
|
147
|
+
}
|
|
148
|
+
export type PauseResumeTrigger = {
|
|
149
|
+
type: 'timeout';
|
|
150
|
+
} | {
|
|
151
|
+
type: 'webhook';
|
|
152
|
+
path: string;
|
|
153
|
+
eventFilter?: Expression;
|
|
154
|
+
};
|
|
106
155
|
export type FlowDirective = {
|
|
107
156
|
type: 'continue';
|
|
108
157
|
} | {
|
|
@@ -129,6 +178,8 @@ export interface MatchStep {
|
|
|
129
178
|
export interface MatchArm {
|
|
130
179
|
/** Schema name to match against, or '_' for wildcard */
|
|
131
180
|
schema: string;
|
|
181
|
+
/** Optional guard condition (when using 'where' clause) */
|
|
182
|
+
guard?: Expression;
|
|
132
183
|
/** Steps to execute if matched */
|
|
133
184
|
steps?: ActionStep[];
|
|
134
185
|
/** Flow control directive (if no steps) */
|
|
@@ -152,8 +203,10 @@ export interface SinceConfig {
|
|
|
152
203
|
type: 'lastSync' | 'expression';
|
|
153
204
|
/** Custom checkpoint key (defaults to source:endpoint) */
|
|
154
205
|
key?: string;
|
|
155
|
-
/** Query parameter name for the since value (default:
|
|
206
|
+
/** Query parameter name for the since value (default: 'since') */
|
|
156
207
|
param?: string;
|
|
208
|
+
/** Header name for the since value (e.g., 'If-Modified-Since'). Mutually exclusive with param. */
|
|
209
|
+
header?: string;
|
|
157
210
|
/** Date format for the since value */
|
|
158
211
|
format?: 'iso' | 'unix' | 'unix-ms' | 'date-only';
|
|
159
212
|
/** Expression to evaluate for 'expression' type */
|
|
@@ -194,6 +247,32 @@ export interface FieldMapping {
|
|
|
194
247
|
field: string;
|
|
195
248
|
expression: Expression;
|
|
196
249
|
}
|
|
250
|
+
export interface TransformDefinition {
|
|
251
|
+
type: 'TransformDefinition';
|
|
252
|
+
name: string;
|
|
253
|
+
variants: TransformVariant[];
|
|
254
|
+
}
|
|
255
|
+
export interface TransformVariant {
|
|
256
|
+
/** Source schema name, or '_' for wildcard/default */
|
|
257
|
+
sourceSchema: string | '_';
|
|
258
|
+
/** Target schema name */
|
|
259
|
+
targetSchema: string;
|
|
260
|
+
/** Optional guard condition for additional matching */
|
|
261
|
+
guard?: Expression;
|
|
262
|
+
/** Field mappings for this variant */
|
|
263
|
+
mappings: FieldMapping[];
|
|
264
|
+
}
|
|
265
|
+
export interface ApplyStep {
|
|
266
|
+
type: 'ApplyStep';
|
|
267
|
+
transform: string;
|
|
268
|
+
source: Expression;
|
|
269
|
+
/** Optional: bind result to a variable instead of response */
|
|
270
|
+
as?: string;
|
|
271
|
+
}
|
|
272
|
+
export interface TryExpression {
|
|
273
|
+
type: 'TryExpression';
|
|
274
|
+
expressions: Expression[];
|
|
275
|
+
}
|
|
197
276
|
export interface ValidateStep {
|
|
198
277
|
type: 'ValidateStep';
|
|
199
278
|
target: Expression;
|
package/dist/ast/nodes.js
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: AST node type definitions for Reqon programs
|
|
4
|
+
* exports:
|
|
5
|
+
* - ReqonProgram, Statement - top-level types
|
|
6
|
+
* - MissionDefinition, ActionDefinition - pipeline structure
|
|
7
|
+
* - SourceDefinition, StoreDefinition - resource declarations
|
|
8
|
+
* - FetchStep, ForStep, MapStep, ValidateStep, etc. - action steps
|
|
9
|
+
* related:
|
|
10
|
+
* - ../parser/parser.ts - produces these AST nodes
|
|
11
|
+
* - ../interpreter/executor.ts - executes AST
|
|
12
|
+
* - vague-lang - Expression, SchemaDefinition from parent DSL
|
|
13
|
+
* ---
|
|
14
|
+
*/
|
|
1
15
|
/** Helper to check if a stage is parallel */
|
|
2
16
|
export function isParallelStage(stage) {
|
|
3
17
|
return Array.isArray(stage.actions) && stage.actions.length > 0;
|
|
@@ -9,13 +9,14 @@
|
|
|
9
9
|
* - OPEN: Circuit tripped, requests fail immediately
|
|
10
10
|
* - HALF_OPEN: Testing if service recovered, limited requests allowed
|
|
11
11
|
*/
|
|
12
|
+
import { CIRCUIT_BREAKER_DEFAULTS } from '../config/index.js';
|
|
12
13
|
const DEFAULT_CONFIG = {
|
|
13
|
-
failureThreshold:
|
|
14
|
-
resetTimeout:
|
|
15
|
-
successThreshold:
|
|
16
|
-
failureWindow:
|
|
17
|
-
failureStatusCodes: [
|
|
18
|
-
countNetworkErrors:
|
|
14
|
+
failureThreshold: CIRCUIT_BREAKER_DEFAULTS.FAILURE_THRESHOLD,
|
|
15
|
+
resetTimeout: CIRCUIT_BREAKER_DEFAULTS.RESET_TIMEOUT_MS,
|
|
16
|
+
successThreshold: CIRCUIT_BREAKER_DEFAULTS.SUCCESS_THRESHOLD,
|
|
17
|
+
failureWindow: CIRCUIT_BREAKER_DEFAULTS.FAILURE_WINDOW_MS,
|
|
18
|
+
failureStatusCodes: [...CIRCUIT_BREAKER_DEFAULTS.FAILURE_STATUS_CODES],
|
|
19
|
+
countNetworkErrors: CIRCUIT_BREAKER_DEFAULTS.COUNT_NETWORK_ERRORS,
|
|
19
20
|
};
|
|
20
21
|
/**
|
|
21
22
|
* Error thrown when circuit breaker is open
|
|
@@ -16,6 +16,10 @@ export declare class RateLimitError extends Error {
|
|
|
16
16
|
resetAt?: Date | undefined;
|
|
17
17
|
constructor(source: string, resetAt?: Date | undefined);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Adaptive rate limiter that learns from response headers
|
|
21
|
+
* Supports pause, throttle, and fail strategies
|
|
22
|
+
*/
|
|
19
23
|
export declare class AdaptiveRateLimiter implements RateLimiter {
|
|
20
24
|
private defaultConfig;
|
|
21
25
|
private state;
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import { sleep } from '../utils/async.js';
|
|
2
|
-
|
|
3
|
-
const DEFAULT_MAX_STALE_AGE_MS = 60 * 60 * 1000;
|
|
4
|
-
/** Cleanup interval (default: 5 minutes) */
|
|
5
|
-
const CLEANUP_INTERVAL_MS = 5 * 60 * 1000;
|
|
6
|
-
/** Max number of entries before forced cleanup */
|
|
7
|
-
const MAX_ENTRIES_BEFORE_CLEANUP = 1000;
|
|
2
|
+
import { RATE_LIMIT_DEFAULTS } from '../config/index.js';
|
|
8
3
|
const DEFAULT_CONFIG = {
|
|
9
|
-
strategy:
|
|
10
|
-
maxWait:
|
|
11
|
-
notifyAt:
|
|
12
|
-
fallbackRpm:
|
|
4
|
+
strategy: RATE_LIMIT_DEFAULTS.STRATEGY,
|
|
5
|
+
maxWait: RATE_LIMIT_DEFAULTS.MAX_WAIT_SECONDS,
|
|
6
|
+
notifyAt: RATE_LIMIT_DEFAULTS.NOTIFY_AT_SECONDS,
|
|
7
|
+
fallbackRpm: RATE_LIMIT_DEFAULTS.FALLBACK_RPM,
|
|
13
8
|
};
|
|
14
9
|
/**
|
|
15
10
|
* Rate limit timeout error - thrown when maxWait is exceeded
|
|
@@ -44,8 +39,6 @@ export class RateLimitError extends Error {
|
|
|
44
39
|
* Adaptive rate limiter that learns from response headers
|
|
45
40
|
* Supports pause, throttle, and fail strategies
|
|
46
41
|
*/
|
|
47
|
-
/** Number of responses between cleanup checks */
|
|
48
|
-
const CLEANUP_CHECK_INTERVAL = 100;
|
|
49
42
|
export class AdaptiveRateLimiter {
|
|
50
43
|
defaultConfig;
|
|
51
44
|
state = new Map();
|
|
@@ -56,7 +49,7 @@ export class AdaptiveRateLimiter {
|
|
|
56
49
|
responsesSinceCleanup = 0;
|
|
57
50
|
constructor(defaultConfig = {}, options = {}) {
|
|
58
51
|
this.defaultConfig = defaultConfig;
|
|
59
|
-
this.maxStaleAgeMs = options.maxStaleAgeMs ??
|
|
52
|
+
this.maxStaleAgeMs = options.maxStaleAgeMs ?? RATE_LIMIT_DEFAULTS.MAX_STALE_AGE_MS;
|
|
60
53
|
}
|
|
61
54
|
/**
|
|
62
55
|
* Clean up stale entries from the state map to prevent memory leaks
|
|
@@ -64,8 +57,8 @@ export class AdaptiveRateLimiter {
|
|
|
64
57
|
cleanup() {
|
|
65
58
|
const now = Date.now();
|
|
66
59
|
// Skip if cleanup was done recently and we're under the entry limit
|
|
67
|
-
if (now - this.lastCleanup < CLEANUP_INTERVAL_MS &&
|
|
68
|
-
this.state.size < MAX_ENTRIES_BEFORE_CLEANUP) {
|
|
60
|
+
if (now - this.lastCleanup < RATE_LIMIT_DEFAULTS.CLEANUP_INTERVAL_MS &&
|
|
61
|
+
this.state.size < RATE_LIMIT_DEFAULTS.MAX_ENTRIES_BEFORE_CLEANUP) {
|
|
69
62
|
return;
|
|
70
63
|
}
|
|
71
64
|
this.lastCleanup = now;
|
|
@@ -260,7 +253,7 @@ export class AdaptiveRateLimiter {
|
|
|
260
253
|
this.state.set(key, state);
|
|
261
254
|
// Periodically clean up stale entries (every N responses)
|
|
262
255
|
this.responsesSinceCleanup++;
|
|
263
|
-
if (this.responsesSinceCleanup >= CLEANUP_CHECK_INTERVAL) {
|
|
256
|
+
if (this.responsesSinceCleanup >= RATE_LIMIT_DEFAULTS.CLEANUP_CHECK_INTERVAL) {
|
|
264
257
|
this.responsesSinceCleanup = 0;
|
|
265
258
|
this.cleanup();
|
|
266
259
|
}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ---
|
|
4
|
+
* purpose: CLI entry point - parses args and runs missions
|
|
5
|
+
* inputs:
|
|
6
|
+
* - file.reqon or folder path
|
|
7
|
+
* - --dry-run, --verbose, --auth, --env, --output, --daemon, --webhook, --debug
|
|
8
|
+
* related:
|
|
9
|
+
* - ./index.ts - library APIs used by CLI
|
|
10
|
+
* - ./scheduler/index.ts - daemon mode scheduling
|
|
11
|
+
* - ./webhook/index.ts - webhook server for wait steps
|
|
12
|
+
* - ./debug/cli-debugger.ts - interactive debugging
|
|
13
|
+
* ---
|
|
14
|
+
*/
|
|
2
15
|
export {};
|
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ---
|
|
4
|
+
* purpose: CLI entry point - parses args and runs missions
|
|
5
|
+
* inputs:
|
|
6
|
+
* - file.reqon or folder path
|
|
7
|
+
* - --dry-run, --verbose, --auth, --env, --output, --daemon, --webhook, --debug
|
|
8
|
+
* related:
|
|
9
|
+
* - ./index.ts - library APIs used by CLI
|
|
10
|
+
* - ./scheduler/index.ts - daemon mode scheduling
|
|
11
|
+
* - ./webhook/index.ts - webhook server for wait steps
|
|
12
|
+
* - ./debug/cli-debugger.ts - interactive debugging
|
|
13
|
+
* ---
|
|
14
|
+
*/
|
|
2
15
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
16
|
import { resolve, dirname } from 'node:path';
|
|
4
17
|
import { fromPath, Scheduler, loadMission } from './index.js';
|
|
5
18
|
import { ReqonError } from './errors/index.js';
|
|
6
19
|
import { loadEnv, loadCredentials } from './auth/credentials.js';
|
|
7
20
|
import { WebhookServer } from './webhook/index.js';
|
|
21
|
+
import { ControlServer } from './control/index.js';
|
|
8
22
|
async function main() {
|
|
9
23
|
const args = process.argv.slice(2);
|
|
10
24
|
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
@@ -25,6 +39,10 @@ Options:
|
|
|
25
39
|
--webhook Enable webhook server for 'wait' steps
|
|
26
40
|
--webhook-port <n> Port for webhook server (default: 3000)
|
|
27
41
|
--webhook-url <url> Base URL for webhook endpoints (default: http://localhost:3000)
|
|
42
|
+
--control Enable control server for pause/resume and status queries
|
|
43
|
+
--control-port <n> Port for control server (default: 3001)
|
|
44
|
+
--debug Enable step-through debugging
|
|
45
|
+
--resume <id> Resume a paused or failed execution by ID
|
|
28
46
|
--help, -h Show this help message
|
|
29
47
|
|
|
30
48
|
Environment Variables:
|
|
@@ -44,6 +62,15 @@ Examples:
|
|
|
44
62
|
reqon sync-invoices.reqon --output ./output.json
|
|
45
63
|
reqon sync-invoices.reqon --daemon --verbose
|
|
46
64
|
reqon sync-invoices.reqon --webhook --webhook-port 8080 --verbose
|
|
65
|
+
reqon sync-invoices.reqon --control --verbose # enable control server
|
|
66
|
+
reqon sync-invoices.reqon --resume exec_abc123 # resume paused execution
|
|
67
|
+
|
|
68
|
+
Control Server:
|
|
69
|
+
When --control is enabled, the server exposes these endpoints:
|
|
70
|
+
POST /pause Request graceful pause at next safe point
|
|
71
|
+
POST /resume Clear pause request
|
|
72
|
+
GET /status Get current execution state and progress
|
|
73
|
+
GET /health Health check
|
|
47
74
|
`);
|
|
48
75
|
process.exit(0);
|
|
49
76
|
}
|
|
@@ -53,6 +80,8 @@ Examples:
|
|
|
53
80
|
const daemon = args.includes('--daemon');
|
|
54
81
|
const once = args.includes('--once');
|
|
55
82
|
const webhookEnabled = args.includes('--webhook');
|
|
83
|
+
const debugEnabled = args.includes('--debug');
|
|
84
|
+
const controlEnabled = args.includes('--control');
|
|
56
85
|
// Parse webhook options
|
|
57
86
|
let webhookPort = 3000;
|
|
58
87
|
const webhookPortIndex = args.indexOf('--webhook-port');
|
|
@@ -64,6 +93,18 @@ Examples:
|
|
|
64
93
|
if (webhookUrlIndex !== -1 && args[webhookUrlIndex + 1]) {
|
|
65
94
|
webhookUrl = args[webhookUrlIndex + 1];
|
|
66
95
|
}
|
|
96
|
+
// Parse control server options
|
|
97
|
+
let controlPort = 3001;
|
|
98
|
+
const controlPortIndex = args.indexOf('--control-port');
|
|
99
|
+
if (controlPortIndex !== -1 && args[controlPortIndex + 1]) {
|
|
100
|
+
controlPort = parseInt(args[controlPortIndex + 1], 10);
|
|
101
|
+
}
|
|
102
|
+
// Parse resume option
|
|
103
|
+
let resumeFrom;
|
|
104
|
+
const resumeIndex = args.indexOf('--resume');
|
|
105
|
+
if (resumeIndex !== -1 && args[resumeIndex + 1]) {
|
|
106
|
+
resumeFrom = args[resumeIndex + 1];
|
|
107
|
+
}
|
|
67
108
|
// Load .env file(s)
|
|
68
109
|
let envFile;
|
|
69
110
|
const envIndex = args.indexOf('--env');
|
|
@@ -112,14 +153,43 @@ Examples:
|
|
|
112
153
|
await webhookServer.start();
|
|
113
154
|
console.log(`Webhook server started on port ${webhookPort}`);
|
|
114
155
|
}
|
|
156
|
+
// Start control server if enabled
|
|
157
|
+
let controlServer;
|
|
158
|
+
if (controlEnabled) {
|
|
159
|
+
controlServer = new ControlServer({ port: controlPort, verbose });
|
|
160
|
+
await controlServer.start();
|
|
161
|
+
console.log(`Control server started on port ${controlPort}`);
|
|
162
|
+
console.log(` POST http://localhost:${controlPort}/pause - request pause`);
|
|
163
|
+
console.log(` GET http://localhost:${controlPort}/status - check status`);
|
|
164
|
+
}
|
|
165
|
+
// Initialize debug controller if enabled
|
|
166
|
+
let debugController;
|
|
167
|
+
if (debugEnabled) {
|
|
168
|
+
const { CLIDebugger } = await import('./debug/cli-debugger.js');
|
|
169
|
+
debugController = new CLIDebugger();
|
|
170
|
+
console.log('Debug mode enabled. Commands: c(ontinue), s(tep), si(step-into), so(step-over), q(uit)');
|
|
171
|
+
console.log('Type "help" at the debug prompt for more commands.\n');
|
|
172
|
+
}
|
|
115
173
|
try {
|
|
116
174
|
const result = await fromPath(filePath, {
|
|
117
175
|
dryRun,
|
|
118
176
|
verbose,
|
|
119
177
|
auth: auth,
|
|
120
178
|
webhookServer,
|
|
179
|
+
debugController,
|
|
180
|
+
controlServer,
|
|
181
|
+
resumeFrom,
|
|
121
182
|
});
|
|
122
|
-
if
|
|
183
|
+
// Check if execution was paused
|
|
184
|
+
const isPaused = result.state?.status === 'paused';
|
|
185
|
+
if (isPaused) {
|
|
186
|
+
console.log(`\n⏸ Mission paused`);
|
|
187
|
+
console.log(` Duration: ${result.duration}ms`);
|
|
188
|
+
console.log(` Actions run: ${result.actionsRun.join(' → ')}`);
|
|
189
|
+
console.log(` Execution ID: ${result.executionId}`);
|
|
190
|
+
console.log(`\n To resume: reqon ${filePath} --resume ${result.executionId}`);
|
|
191
|
+
}
|
|
192
|
+
else if (result.success) {
|
|
123
193
|
console.log(`\n✓ Mission completed successfully`);
|
|
124
194
|
console.log(` Duration: ${result.duration}ms`);
|
|
125
195
|
console.log(` Actions run: ${result.actionsRun.join(' → ')}`);
|
|
@@ -127,7 +197,7 @@ Examples:
|
|
|
127
197
|
const storeData = {};
|
|
128
198
|
for (const [name, store] of result.stores) {
|
|
129
199
|
const items = await store.list();
|
|
130
|
-
console.log(` Store "${name}": ${items.length} items`);
|
|
200
|
+
console.log(` Store "${name}": ${items.length} ${items.length === 1 ? 'item' : 'items'}`);
|
|
131
201
|
storeData[name] = items;
|
|
132
202
|
}
|
|
133
203
|
// Export to JSON if requested
|
|
@@ -142,6 +212,10 @@ Examples:
|
|
|
142
212
|
for (const error of result.errors) {
|
|
143
213
|
console.error(` [${error.action}/${error.step}] ${error.message}`);
|
|
144
214
|
}
|
|
215
|
+
if (result.executionId) {
|
|
216
|
+
console.log(`\n Execution ID: ${result.executionId}`);
|
|
217
|
+
console.log(` To resume: reqon ${filePath} --resume ${result.executionId}`);
|
|
218
|
+
}
|
|
145
219
|
process.exit(1);
|
|
146
220
|
}
|
|
147
221
|
}
|
|
@@ -159,16 +233,22 @@ Examples:
|
|
|
159
233
|
if (webhookServer) {
|
|
160
234
|
await webhookServer.stop();
|
|
161
235
|
}
|
|
236
|
+
// Stop control server if it was started
|
|
237
|
+
if (controlServer) {
|
|
238
|
+
await controlServer.stop();
|
|
239
|
+
}
|
|
240
|
+
// Close debug controller if it was started
|
|
241
|
+
if (debugController?.close) {
|
|
242
|
+
debugController.close();
|
|
243
|
+
}
|
|
162
244
|
}
|
|
163
245
|
}
|
|
164
246
|
async function runDaemon(filePath, options) {
|
|
165
247
|
const absolutePath = resolve(filePath);
|
|
166
248
|
let program;
|
|
167
|
-
let baseDir;
|
|
168
249
|
try {
|
|
169
250
|
const result = await loadMission(absolutePath);
|
|
170
251
|
program = result.program;
|
|
171
|
-
baseDir = result.baseDir;
|
|
172
252
|
}
|
|
173
253
|
catch (error) {
|
|
174
254
|
if (error instanceof ReqonError) {
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Configuration Constants
|
|
3
|
+
*
|
|
4
|
+
* This module contains all default values and configuration constants used
|
|
5
|
+
* throughout the Reqon framework. Centralizing these values makes it easier
|
|
6
|
+
* to understand, tune, and override defaults.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Default retry configuration for HTTP requests
|
|
10
|
+
*/
|
|
11
|
+
export declare const HTTP_RETRY_DEFAULTS: {
|
|
12
|
+
/** Maximum number of retry attempts */
|
|
13
|
+
readonly MAX_ATTEMPTS: 3;
|
|
14
|
+
/** Initial delay between retries in milliseconds */
|
|
15
|
+
readonly INITIAL_DELAY_MS: 1000;
|
|
16
|
+
/** Maximum delay between retries in milliseconds */
|
|
17
|
+
readonly MAX_DELAY_MS: 30000;
|
|
18
|
+
/** Backoff strategy: 'exponential', 'linear', or 'constant' */
|
|
19
|
+
readonly BACKOFF: "exponential";
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Default HTTP headers
|
|
23
|
+
*/
|
|
24
|
+
export declare const HTTP_DEFAULT_HEADERS: {
|
|
25
|
+
readonly CONTENT_TYPE: "application/json";
|
|
26
|
+
readonly ACCEPT: "application/json";
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Default rate limiter configuration
|
|
30
|
+
*/
|
|
31
|
+
export declare const RATE_LIMIT_DEFAULTS: {
|
|
32
|
+
/** Default strategy when rate limited: 'pause', 'throttle', or 'fail' */
|
|
33
|
+
readonly STRATEGY: "pause";
|
|
34
|
+
/** Maximum wait time in seconds before timing out */
|
|
35
|
+
readonly MAX_WAIT_SECONDS: 300;
|
|
36
|
+
/** Seconds before starting to notify about ongoing waits */
|
|
37
|
+
readonly NOTIFY_AT_SECONDS: 10;
|
|
38
|
+
/** Fallback requests per minute when no rate limit info available */
|
|
39
|
+
readonly FALLBACK_RPM: 60;
|
|
40
|
+
/** Maximum age for stale rate limit entries (1 hour in ms) */
|
|
41
|
+
readonly MAX_STALE_AGE_MS: number;
|
|
42
|
+
/** Cleanup interval for stale entries (5 minutes in ms) */
|
|
43
|
+
readonly CLEANUP_INTERVAL_MS: number;
|
|
44
|
+
/** Number of responses between cleanup checks */
|
|
45
|
+
readonly CLEANUP_CHECK_INTERVAL: 100;
|
|
46
|
+
/** Maximum entries before forced cleanup */
|
|
47
|
+
readonly MAX_ENTRIES_BEFORE_CLEANUP: 1000;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Default circuit breaker configuration
|
|
51
|
+
*/
|
|
52
|
+
export declare const CIRCUIT_BREAKER_DEFAULTS: {
|
|
53
|
+
/** Number of failures before opening circuit */
|
|
54
|
+
readonly FAILURE_THRESHOLD: 5;
|
|
55
|
+
/** Time in milliseconds before attempting recovery */
|
|
56
|
+
readonly RESET_TIMEOUT_MS: 30000;
|
|
57
|
+
/** Number of successful requests in half-open to close circuit */
|
|
58
|
+
readonly SUCCESS_THRESHOLD: 2;
|
|
59
|
+
/** Time window in milliseconds for counting failures */
|
|
60
|
+
readonly FAILURE_WINDOW_MS: 60000;
|
|
61
|
+
/** HTTP status codes to count as failures */
|
|
62
|
+
readonly FAILURE_STATUS_CODES: readonly number[];
|
|
63
|
+
/** Whether to count network errors as failures */
|
|
64
|
+
readonly COUNT_NETWORK_ERRORS: true;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Default webhook server configuration
|
|
68
|
+
*/
|
|
69
|
+
export declare const WEBHOOK_DEFAULTS: {
|
|
70
|
+
/** Default port for webhook server */
|
|
71
|
+
readonly PORT: 3000;
|
|
72
|
+
/** Default host binding */
|
|
73
|
+
readonly HOST: "0.0.0.0";
|
|
74
|
+
/** Default timeout for wait steps (5 minutes in ms) */
|
|
75
|
+
readonly DEFAULT_TIMEOUT_MS: 300000;
|
|
76
|
+
/** Cleanup interval for expired registrations (1 minute in ms) */
|
|
77
|
+
readonly CLEANUP_INTERVAL_MS: 60000;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Default store configuration
|
|
81
|
+
*/
|
|
82
|
+
export declare const STORE_DEFAULTS: {
|
|
83
|
+
/** Default base directory for file stores */
|
|
84
|
+
readonly DATA_DIR: ".reqon-data";
|
|
85
|
+
/** Default subdirectory for executions */
|
|
86
|
+
readonly EXECUTIONS_DIR: "executions";
|
|
87
|
+
/** Default subdirectory for sync state */
|
|
88
|
+
readonly SYNC_DIR: "sync";
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Default scheduler configuration
|
|
92
|
+
*/
|
|
93
|
+
export declare const SCHEDULER_DEFAULTS: {
|
|
94
|
+
/** Default retry configuration for failed scheduled missions */
|
|
95
|
+
readonly MAX_RETRIES: 3;
|
|
96
|
+
/** Default delay between retries in seconds */
|
|
97
|
+
readonly RETRY_DELAY_SECONDS: 60;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Default execution configuration
|
|
101
|
+
*/
|
|
102
|
+
export declare const EXECUTION_DEFAULTS: {
|
|
103
|
+
/** Whether development mode is enabled by default (uses file stores) */
|
|
104
|
+
readonly DEVELOPMENT_MODE: true;
|
|
105
|
+
/** Whether to persist execution state by default */
|
|
106
|
+
readonly PERSIST_STATE: false;
|
|
107
|
+
};
|
|
108
|
+
/** Type for rate limit strategy */
|
|
109
|
+
export type RateLimitStrategy = 'pause' | 'throttle' | 'fail';
|
|
110
|
+
/** Type for retry backoff strategy */
|
|
111
|
+
export type BackoffStrategy = 'exponential' | 'linear' | 'constant';
|
|
112
|
+
/**
|
|
113
|
+
* Merged configuration type utilities
|
|
114
|
+
*/
|
|
115
|
+
export type HttpRetryConfig = {
|
|
116
|
+
maxAttempts?: number;
|
|
117
|
+
initialDelay?: number;
|
|
118
|
+
maxDelay?: number;
|
|
119
|
+
backoff?: BackoffStrategy;
|
|
120
|
+
};
|
|
121
|
+
export type RateLimitConfig = {
|
|
122
|
+
strategy?: RateLimitStrategy;
|
|
123
|
+
maxWait?: number;
|
|
124
|
+
notifyAt?: number;
|
|
125
|
+
fallbackRpm?: number;
|
|
126
|
+
};
|
|
127
|
+
export type CircuitBreakerConfig = {
|
|
128
|
+
failureThreshold?: number;
|
|
129
|
+
resetTimeout?: number;
|
|
130
|
+
successThreshold?: number;
|
|
131
|
+
failureWindow?: number;
|
|
132
|
+
failureStatusCodes?: number[];
|
|
133
|
+
countNetworkErrors?: boolean;
|
|
134
|
+
};
|
|
135
|
+
export type WebhookConfig = {
|
|
136
|
+
port?: number;
|
|
137
|
+
host?: string;
|
|
138
|
+
baseUrl?: string;
|
|
139
|
+
defaultTimeout?: number;
|
|
140
|
+
verbose?: boolean;
|
|
141
|
+
};
|