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/examples/README.md
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
# Reqon Examples
|
|
2
|
-
|
|
3
|
-
This directory contains examples demonstrating Reqon's features for declarative data pipelines.
|
|
4
|
-
|
|
5
|
-
## Examples Overview
|
|
6
|
-
|
|
7
|
-
| Example | Description | Key Features |
|
|
8
|
-
|---------|-------------|--------------|
|
|
9
|
-
| [jsonplaceholder](./jsonplaceholder/) | Basic public API sync | `auth: none`, fetch, map, for loops |
|
|
10
|
-
| [petstore](./petstore/) | OpenAPI spec integration | OAS operationId, cursor pagination |
|
|
11
|
-
| [xero](./xero/) | OAuth2 invoice sync | OAuth2, hydration, **match steps**, **flow control** |
|
|
12
|
-
| [github-sync](./github-sync/) | Multi-file mission | **Folder structure**, **parallel execution**, schema matching |
|
|
13
|
-
| [error-handling](./error-handling/) | Comprehensive error handling | **All flow control directives**, dead letter queues |
|
|
14
|
-
| [temporal-comparison](./temporal-comparison/) | E-commerce reconciliation | Multi-source, **parallel execution**, rate limiting |
|
|
15
|
-
|
|
16
|
-
## Feature Index
|
|
17
|
-
|
|
18
|
-
### Multi-File Missions
|
|
19
|
-
Organize large missions into folders with separate action files:
|
|
20
|
-
```
|
|
21
|
-
github-sync/
|
|
22
|
-
├── mission.vague # Sources, stores, schemas, pipeline
|
|
23
|
-
├── fetch-issues.vague # Action file
|
|
24
|
-
├── fetch-prs.vague # Action file
|
|
25
|
-
└── normalize.vague # Action file
|
|
26
|
-
```
|
|
27
|
-
See: [github-sync](./github-sync/)
|
|
28
|
-
|
|
29
|
-
### Parallel Execution
|
|
30
|
-
Run multiple actions concurrently:
|
|
31
|
-
```vague
|
|
32
|
-
run [FetchOrders, FetchPayments, FetchShipments] then Reconcile
|
|
33
|
-
```
|
|
34
|
-
See: [github-sync](./github-sync/), [temporal-comparison](./temporal-comparison/)
|
|
35
|
-
|
|
36
|
-
### Schema Overloading with Match Steps
|
|
37
|
-
Handle different API response types declaratively:
|
|
38
|
-
```vague
|
|
39
|
-
match response {
|
|
40
|
-
SuccessSchema -> { store response -> cache },
|
|
41
|
-
RateLimitError -> retry { maxAttempts: 5 },
|
|
42
|
-
AuthError -> jump RefreshToken then retry,
|
|
43
|
-
_ -> abort "Unexpected response"
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
See: [xero](./xero/), [error-handling](./error-handling/)
|
|
47
|
-
|
|
48
|
-
### Flow Control Directives
|
|
49
|
-
Six directives for controlling execution flow:
|
|
50
|
-
|
|
51
|
-
| Directive | Description | Example |
|
|
52
|
-
|-----------|-------------|---------|
|
|
53
|
-
| `continue` | Proceed to next step | `Schema -> continue` |
|
|
54
|
-
| `skip` | Skip remaining steps | `Schema -> skip` |
|
|
55
|
-
| `abort` | Halt mission | `Schema -> abort "Error"` |
|
|
56
|
-
| `retry` | Retry with backoff | `Schema -> retry { maxAttempts: 5 }` |
|
|
57
|
-
| `queue` | Send to dead letter queue | `Schema -> queue dlq` |
|
|
58
|
-
| `jump` | Execute action, then continue | `Schema -> jump Refresh then retry` |
|
|
59
|
-
|
|
60
|
-
See: [error-handling](./error-handling/)
|
|
61
|
-
|
|
62
|
-
### Authentication Types
|
|
63
|
-
```vague
|
|
64
|
-
source API { auth: none } # Public API
|
|
65
|
-
source API { auth: bearer } # Bearer token
|
|
66
|
-
source API { auth: oauth2 } # OAuth2
|
|
67
|
-
source API { auth: basic } # Basic auth
|
|
68
|
-
source API { auth: api_key } # API key
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Pagination Strategies
|
|
72
|
-
```vague
|
|
73
|
-
paginate: offset(page, 100) # Offset pagination
|
|
74
|
-
paginate: page(page, 100) # Page number pagination
|
|
75
|
-
paginate: cursor(cursor, 100, "nextCursor") # Cursor pagination
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## Running Examples
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
# Build first
|
|
82
|
-
npm run build
|
|
83
|
-
|
|
84
|
-
# Run any example
|
|
85
|
-
node dist/cli.js examples/<example>/<file>.vague --verbose
|
|
86
|
-
|
|
87
|
-
# Run multi-file mission (folder)
|
|
88
|
-
node dist/cli.js examples/github-sync --verbose
|
|
89
|
-
|
|
90
|
-
# Dry run (no actual API calls)
|
|
91
|
-
node dist/cli.js examples/xero/invoices.vague --dry-run
|
|
92
|
-
|
|
93
|
-
# With credentials
|
|
94
|
-
node dist/cli.js examples/xero/invoices.vague --auth credentials.json
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## Credentials Format
|
|
98
|
-
|
|
99
|
-
Create a `credentials.json` file:
|
|
100
|
-
```json
|
|
101
|
-
{
|
|
102
|
-
"SourceName": {
|
|
103
|
-
"type": "bearer",
|
|
104
|
-
"token": "your-token"
|
|
105
|
-
},
|
|
106
|
-
"OAuthSource": {
|
|
107
|
-
"type": "oauth2",
|
|
108
|
-
"accessToken": "your-access-token",
|
|
109
|
-
"refreshToken": "your-refresh-token"
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
```
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
# Error Handling Example
|
|
2
|
-
|
|
3
|
-
Demonstrates comprehensive error handling with schema matching and all flow control directives.
|
|
4
|
-
|
|
5
|
-
## What it does
|
|
6
|
-
|
|
7
|
-
1. **FetchPendingPayments**: Fetches payments with retry and auth refresh
|
|
8
|
-
2. **CheckFraudRisk**: Checks each payment for fraud, routing high-risk to review queue
|
|
9
|
-
3. **ProcessPayments**: Captures approved payments with full error handling
|
|
10
|
-
4. **GenerateReport**: Creates a summary of processing results
|
|
11
|
-
|
|
12
|
-
## Run
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
node dist/cli.js examples/error-handling/payment-processor.vague --auth credentials.json --verbose
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Flow Control Directives
|
|
19
|
-
|
|
20
|
-
This example demonstrates all six flow control directives:
|
|
21
|
-
|
|
22
|
-
### 1. `continue` - Proceed to next step
|
|
23
|
-
```vague
|
|
24
|
-
match response {
|
|
25
|
-
FraudWarning where .risk_level == "low" -> continue
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
When the condition matches, continue with the next steps in the action.
|
|
29
|
-
|
|
30
|
-
### 2. `skip` - Skip remaining steps in current iteration
|
|
31
|
-
```vague
|
|
32
|
-
match response {
|
|
33
|
-
_ -> skip // Unknown response - skip this payment, move to next
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
Skips remaining steps for the current item in a `for` loop but continues with the next item.
|
|
37
|
-
|
|
38
|
-
### 3. `abort "message"` - Halt mission with error
|
|
39
|
-
```vague
|
|
40
|
-
match response {
|
|
41
|
-
ServerError -> abort "Payment gateway unavailable"
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
Immediately stops the entire mission and reports the error.
|
|
45
|
-
|
|
46
|
-
### 4. `retry { config }` - Retry with backoff
|
|
47
|
-
```vague
|
|
48
|
-
match response {
|
|
49
|
-
RateLimitError -> retry {
|
|
50
|
-
maxAttempts: 5,
|
|
51
|
-
backoff: exponential, // or: linear, constant
|
|
52
|
-
initialDelay: 5000,
|
|
53
|
-
maxDelay: 120000
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
Retries the current fetch with configurable backoff strategy.
|
|
58
|
-
|
|
59
|
-
### 5. `queue target` - Send to dead-letter queue
|
|
60
|
-
```vague
|
|
61
|
-
match response {
|
|
62
|
-
ServerError -> queue dead_letter_queue
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
Parks the current item for later processing or manual review.
|
|
66
|
-
|
|
67
|
-
### 6. `jump Action then retry` - Execute action, then continue
|
|
68
|
-
```vague
|
|
69
|
-
match response {
|
|
70
|
-
AuthenticationError -> jump RefreshAuth then retry
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
Jumps to another action (e.g., to refresh auth), then retries the original request.
|
|
74
|
-
|
|
75
|
-
## Schema Matching Patterns
|
|
76
|
-
|
|
77
|
-
### Simple Schema Match
|
|
78
|
-
```vague
|
|
79
|
-
match response {
|
|
80
|
-
PaymentSuccess -> { store response -> payments }
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### Schema with Guard Clause
|
|
85
|
-
```vague
|
|
86
|
-
match response {
|
|
87
|
-
FraudWarning where .risk_level == "high" -> queue fraud_review
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### Array Schema Match
|
|
92
|
-
```vague
|
|
93
|
-
match response {
|
|
94
|
-
[PaymentSuccess] -> { store response -> payments { key: .id } }
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Wildcard (Catch-All)
|
|
99
|
-
```vague
|
|
100
|
-
match response {
|
|
101
|
-
SuccessSchema -> continue,
|
|
102
|
-
ErrorSchema -> abort "Error occurred",
|
|
103
|
-
_ -> skip // Handle any other response
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Error Handling Patterns
|
|
108
|
-
|
|
109
|
-
### 1. Retry with Auth Refresh
|
|
110
|
-
```vague
|
|
111
|
-
AuthenticationError -> jump RefreshAuth then retry
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### 2. Progressive Backoff
|
|
115
|
-
```vague
|
|
116
|
-
RateLimitError -> retry {
|
|
117
|
-
maxAttempts: 5,
|
|
118
|
-
backoff: exponential,
|
|
119
|
-
initialDelay: 1000,
|
|
120
|
-
maxDelay: 60000
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### 3. Dead Letter Queue for Failures
|
|
125
|
-
```vague
|
|
126
|
-
ServerError -> queue dead_letter_queue
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### 4. Conditional Processing
|
|
130
|
-
```vague
|
|
131
|
-
match response {
|
|
132
|
-
FraudWarning where .risk_level == "low" -> continue,
|
|
133
|
-
FraudWarning where .risk_level == "medium" -> {
|
|
134
|
-
store { ... } -> review_queue
|
|
135
|
-
},
|
|
136
|
-
FraudWarning where .risk_level == "high" -> {
|
|
137
|
-
store { ... } -> fraud_queue
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## Features demonstrated
|
|
143
|
-
|
|
144
|
-
- All 6 flow control directives
|
|
145
|
-
- Schema matching with guard clauses
|
|
146
|
-
- Retry with exponential/linear/constant backoff
|
|
147
|
-
- Token refresh via `jump...then retry`
|
|
148
|
-
- Dead letter queue pattern
|
|
149
|
-
- Conditional routing based on response content
|
|
150
|
-
- Error logging and audit trails
|
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
// Payment Processing Pipeline with Comprehensive Error Handling
|
|
2
|
-
// Demonstrates all flow control directives: continue, skip, abort, retry, queue, jump
|
|
3
|
-
|
|
4
|
-
mission ProcessPayments {
|
|
5
|
-
|
|
6
|
-
// ============================================================
|
|
7
|
-
// SOURCES
|
|
8
|
-
// ============================================================
|
|
9
|
-
|
|
10
|
-
source PaymentGateway {
|
|
11
|
-
auth: bearer,
|
|
12
|
-
base: "https://api.paymentgateway.com/v1",
|
|
13
|
-
rateLimit: {
|
|
14
|
-
strategy: "pause",
|
|
15
|
-
maxWait: 60,
|
|
16
|
-
fallbackRpm: 100
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
source FraudDetection {
|
|
21
|
-
auth: api_key,
|
|
22
|
-
base: "https://fraud.example.com/api"
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// ============================================================
|
|
26
|
-
// STORES
|
|
27
|
-
// ============================================================
|
|
28
|
-
|
|
29
|
-
store pending_payments: memory("pending")
|
|
30
|
-
store processed_payments: sql("payments")
|
|
31
|
-
store failed_payments: memory("failed")
|
|
32
|
-
store fraud_review_queue: memory("fraud_review")
|
|
33
|
-
store dead_letter_queue: memory("dlq")
|
|
34
|
-
|
|
35
|
-
// ============================================================
|
|
36
|
-
// SCHEMAS - Response Types
|
|
37
|
-
// ============================================================
|
|
38
|
-
|
|
39
|
-
schema PaymentSuccess {
|
|
40
|
-
id: string,
|
|
41
|
-
status: string,
|
|
42
|
-
amount: decimal,
|
|
43
|
-
currency: string,
|
|
44
|
-
captured_at: date
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
schema PaymentPending {
|
|
48
|
-
id: string,
|
|
49
|
-
status: string,
|
|
50
|
-
requires_action: boolean
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
schema RateLimitError {
|
|
54
|
-
error: string,
|
|
55
|
-
retry_after: int
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
schema AuthenticationError {
|
|
59
|
-
error: string,
|
|
60
|
-
code: string
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
schema ValidationError {
|
|
64
|
-
error: string,
|
|
65
|
-
field: string,
|
|
66
|
-
message: string
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
schema FraudWarning {
|
|
70
|
-
risk_score: decimal,
|
|
71
|
-
risk_level: string,
|
|
72
|
-
recommendation: string
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
schema ServerError {
|
|
76
|
-
error: string,
|
|
77
|
-
request_id: string
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// ============================================================
|
|
81
|
-
// ACTION: Fetch Pending Payments
|
|
82
|
-
// ============================================================
|
|
83
|
-
|
|
84
|
-
action FetchPendingPayments {
|
|
85
|
-
get "/payments" {
|
|
86
|
-
body: { "status": "pending" },
|
|
87
|
-
retry: {
|
|
88
|
-
maxAttempts: 3,
|
|
89
|
-
backoff: "exponential",
|
|
90
|
-
initialDelay: 1000
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
match response {
|
|
95
|
-
// Success - store and continue
|
|
96
|
-
[PaymentSuccess] -> {
|
|
97
|
-
store response -> pending_payments { key: .id }
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
// Rate limited - retry with backoff
|
|
101
|
-
RateLimitError -> retry {
|
|
102
|
-
maxAttempts: 5,
|
|
103
|
-
backoff: exponential,
|
|
104
|
-
initialDelay: 5000,
|
|
105
|
-
maxDelay: 120000
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
// Auth error - refresh token and retry
|
|
109
|
-
AuthenticationError -> jump RefreshAuth then retry,
|
|
110
|
-
|
|
111
|
-
// Server error - abort the mission
|
|
112
|
-
ServerError -> abort "Payment gateway unavailable",
|
|
113
|
-
|
|
114
|
-
// Unexpected response - log and continue with empty
|
|
115
|
-
_ -> {
|
|
116
|
-
store {
|
|
117
|
-
error: "Unexpected response fetching payments",
|
|
118
|
-
response: response,
|
|
119
|
-
timestamp: now()
|
|
120
|
-
} -> failed_payments { key: now() }
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// ============================================================
|
|
126
|
-
// ACTION: Refresh Authentication (called via jump)
|
|
127
|
-
// ============================================================
|
|
128
|
-
|
|
129
|
-
action RefreshAuth {
|
|
130
|
-
post "/auth/refresh" {
|
|
131
|
-
source: PaymentGateway,
|
|
132
|
-
body: {
|
|
133
|
-
"refresh_token": env("PAYMENT_REFRESH_TOKEN")
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
match response {
|
|
138
|
-
_ where .access_token != null -> continue,
|
|
139
|
-
_ -> abort "Failed to refresh authentication"
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// ============================================================
|
|
144
|
-
// ACTION: Check Fraud Risk
|
|
145
|
-
// ============================================================
|
|
146
|
-
|
|
147
|
-
action CheckFraudRisk {
|
|
148
|
-
for payment in pending_payments {
|
|
149
|
-
post "/check" {
|
|
150
|
-
source: FraudDetection,
|
|
151
|
-
body: {
|
|
152
|
-
"payment_id": payment.id,
|
|
153
|
-
"amount": payment.amount,
|
|
154
|
-
"currency": payment.currency
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
match response {
|
|
159
|
-
// Low risk - continue processing
|
|
160
|
-
FraudWarning where .risk_level == "low" -> continue,
|
|
161
|
-
|
|
162
|
-
// Medium risk - queue for human review, skip this payment
|
|
163
|
-
FraudWarning where .risk_level == "medium" -> {
|
|
164
|
-
store {
|
|
165
|
-
payment_id: payment.id,
|
|
166
|
-
risk_score: response.risk_score,
|
|
167
|
-
reason: "Medium risk - requires review"
|
|
168
|
-
} -> fraud_review_queue { key: payment.id }
|
|
169
|
-
},
|
|
170
|
-
|
|
171
|
-
// High risk - queue and skip
|
|
172
|
-
FraudWarning where .risk_level == "high" -> {
|
|
173
|
-
store {
|
|
174
|
-
payment_id: payment.id,
|
|
175
|
-
risk_score: response.risk_score,
|
|
176
|
-
reason: "High fraud risk detected"
|
|
177
|
-
} -> fraud_review_queue { key: payment.id }
|
|
178
|
-
},
|
|
179
|
-
|
|
180
|
-
// Fraud service error - queue to DLQ for later processing
|
|
181
|
-
ServerError -> queue dead_letter_queue,
|
|
182
|
-
|
|
183
|
-
// Rate limited - retry
|
|
184
|
-
RateLimitError -> retry {
|
|
185
|
-
maxAttempts: 3,
|
|
186
|
-
backoff: constant,
|
|
187
|
-
initialDelay: 10000
|
|
188
|
-
},
|
|
189
|
-
|
|
190
|
-
// Unknown - skip but log
|
|
191
|
-
_ -> skip
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// ============================================================
|
|
197
|
-
// ACTION: Process Approved Payments
|
|
198
|
-
// ============================================================
|
|
199
|
-
|
|
200
|
-
action ProcessPayments {
|
|
201
|
-
// Only process payments not in fraud review
|
|
202
|
-
for payment in pending_payments where not exists(fraud_review_queue[payment.id]) {
|
|
203
|
-
post "/payments/{payment.id}/capture" {
|
|
204
|
-
source: PaymentGateway,
|
|
205
|
-
body: {
|
|
206
|
-
"idempotency_key": payment.id + "_capture"
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
match response {
|
|
211
|
-
// Successfully captured
|
|
212
|
-
PaymentSuccess -> {
|
|
213
|
-
store response -> processed_payments {
|
|
214
|
-
key: .id,
|
|
215
|
-
upsert: true
|
|
216
|
-
}
|
|
217
|
-
},
|
|
218
|
-
|
|
219
|
-
// Payment requires additional action (3DS, etc)
|
|
220
|
-
PaymentPending where .requires_action == true -> {
|
|
221
|
-
store {
|
|
222
|
-
payment_id: payment.id,
|
|
223
|
-
reason: "Requires customer action",
|
|
224
|
-
status: "pending_action"
|
|
225
|
-
} -> failed_payments { key: payment.id }
|
|
226
|
-
},
|
|
227
|
-
|
|
228
|
-
// Validation error - payment data issue
|
|
229
|
-
ValidationError -> {
|
|
230
|
-
store {
|
|
231
|
-
payment_id: payment.id,
|
|
232
|
-
error: response.message,
|
|
233
|
-
field: response.field,
|
|
234
|
-
status: "invalid"
|
|
235
|
-
} -> failed_payments { key: payment.id }
|
|
236
|
-
},
|
|
237
|
-
|
|
238
|
-
// Rate limited
|
|
239
|
-
RateLimitError -> retry {
|
|
240
|
-
maxAttempts: 3,
|
|
241
|
-
backoff: exponential,
|
|
242
|
-
initialDelay: 2000
|
|
243
|
-
},
|
|
244
|
-
|
|
245
|
-
// Auth expired during processing
|
|
246
|
-
AuthenticationError -> jump RefreshAuth then retry,
|
|
247
|
-
|
|
248
|
-
// Server error - queue for retry later
|
|
249
|
-
ServerError -> queue dead_letter_queue,
|
|
250
|
-
|
|
251
|
-
// Catch-all - queue to DLQ
|
|
252
|
-
_ -> queue dead_letter_queue
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// ============================================================
|
|
258
|
-
// ACTION: Generate Report
|
|
259
|
-
// ============================================================
|
|
260
|
-
|
|
261
|
-
action GenerateReport {
|
|
262
|
-
map {
|
|
263
|
-
processed: length(processed_payments),
|
|
264
|
-
failed: length(failed_payments),
|
|
265
|
-
fraud_flagged: length(fraud_review_queue),
|
|
266
|
-
queued_for_retry: length(dead_letter_queue),
|
|
267
|
-
completed_at: now()
|
|
268
|
-
} -> report
|
|
269
|
-
|
|
270
|
-
validate report {
|
|
271
|
-
assume .processed >= 0
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
store response -> processed_payments {
|
|
275
|
-
key: "report_" + now()
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// ============================================================
|
|
280
|
-
// PIPELINE
|
|
281
|
-
// ============================================================
|
|
282
|
-
|
|
283
|
-
run FetchPendingPayments
|
|
284
|
-
then CheckFraudRisk
|
|
285
|
-
then ProcessPayments
|
|
286
|
-
then GenerateReport
|
|
287
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# GitHub Sync Example
|
|
2
|
-
|
|
3
|
-
Demonstrates multi-file missions, parallel execution, and error handling with flow control.
|
|
4
|
-
|
|
5
|
-
## Folder Structure
|
|
6
|
-
|
|
7
|
-
This mission is organized as a folder with separate action files:
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
github-sync/
|
|
11
|
-
├── mission.vague # Main file: sources, stores, schemas, pipeline
|
|
12
|
-
├── fetch-issues.vague # Fetches issues with pagination and error handling
|
|
13
|
-
├── fetch-prs.vague # Fetches pull requests with error handling
|
|
14
|
-
├── normalize.vague # Normalizes to unified schema
|
|
15
|
-
└── README.md
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## What it does
|
|
19
|
-
|
|
20
|
-
1. **FetchIssues** and **FetchPRs** run in **parallel** to fetch data concurrently
|
|
21
|
-
2. **Normalize** runs after both complete, unifying issues and PRs into `work_items`
|
|
22
|
-
|
|
23
|
-
## Run
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# Run from folder path
|
|
27
|
-
node dist/cli.js examples/github-sync --auth credentials.json --verbose
|
|
28
|
-
|
|
29
|
-
# Environment variables needed
|
|
30
|
-
export GITHUB_OWNER=your-org
|
|
31
|
-
export GITHUB_REPO=your-repo
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Requires a `credentials.json`:
|
|
35
|
-
```json
|
|
36
|
-
{
|
|
37
|
-
"GitHub": {
|
|
38
|
-
"type": "bearer",
|
|
39
|
-
"token": "ghp_your_github_token"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Features demonstrated
|
|
45
|
-
|
|
46
|
-
### Multi-file Missions
|
|
47
|
-
- `mission.vague` contains sources, stores, schemas, and pipeline
|
|
48
|
-
- Action files (`fetch-issues.vague`, etc.) are automatically discovered and merged
|
|
49
|
-
- Actions can reference stores and schemas defined in the root file
|
|
50
|
-
|
|
51
|
-
### Parallel Execution
|
|
52
|
-
```vague
|
|
53
|
-
run [FetchIssues, FetchPRs] then Normalize
|
|
54
|
-
```
|
|
55
|
-
- `[FetchIssues, FetchPRs]` runs both actions concurrently
|
|
56
|
-
- `then Normalize` waits for both to complete before running
|
|
57
|
-
|
|
58
|
-
### Schema Overloading with Match Steps
|
|
59
|
-
```vague
|
|
60
|
-
match response {
|
|
61
|
-
[GitHubIssue] -> { store response -> issues_raw },
|
|
62
|
-
RateLimitError -> retry { maxAttempts: 5 },
|
|
63
|
-
NotFoundError -> abort "Repository not found",
|
|
64
|
-
_ -> skip
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Flow Control Directives
|
|
69
|
-
- `continue` - Proceed to next step
|
|
70
|
-
- `skip` - Skip remaining steps in current action
|
|
71
|
-
- `abort "message"` - Halt mission with error
|
|
72
|
-
- `retry { ... }` - Retry with backoff configuration
|
|
73
|
-
- `queue target` - Send to dead-letter queue
|
|
74
|
-
- `jump ActionName then retry` - Execute another action, then retry
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
// Fetch GitHub Issues with error handling
|
|
2
|
-
// External action file - automatically merged into mission
|
|
3
|
-
|
|
4
|
-
action FetchIssues {
|
|
5
|
-
get "/repos/{GITHUB_OWNER}/{GITHUB_REPO}/issues" {
|
|
6
|
-
source: GitHub,
|
|
7
|
-
body: {
|
|
8
|
-
"state": "all",
|
|
9
|
-
"per_page": 100
|
|
10
|
-
},
|
|
11
|
-
paginate: page(page, 100),
|
|
12
|
-
until: length(response) == 0,
|
|
13
|
-
retry: {
|
|
14
|
-
maxAttempts: 3,
|
|
15
|
-
backoff: "exponential",
|
|
16
|
-
initialDelay: 1000
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Handle different response types with schema matching
|
|
21
|
-
match response {
|
|
22
|
-
// Success - continue processing
|
|
23
|
-
[GitHubIssue] -> {
|
|
24
|
-
store response -> issues_raw { key: .id }
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
// Rate limited - retry with backoff
|
|
28
|
-
RateLimitError -> retry {
|
|
29
|
-
maxAttempts: 5,
|
|
30
|
-
backoff: exponential,
|
|
31
|
-
initialDelay: 60000,
|
|
32
|
-
maxDelay: 300000
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
// Repo not found - abort mission
|
|
36
|
-
NotFoundError -> abort "Repository not found - check GITHUB_OWNER and GITHUB_REPO",
|
|
37
|
-
|
|
38
|
-
// Unexpected response - log and skip
|
|
39
|
-
_ -> {
|
|
40
|
-
store {
|
|
41
|
-
error: "Unexpected response in FetchIssues",
|
|
42
|
-
response: response,
|
|
43
|
-
timestamp: now()
|
|
44
|
-
} -> errors { key: now() }
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// Fetch GitHub Pull Requests with error handling
|
|
2
|
-
// External action file - automatically merged into mission
|
|
3
|
-
|
|
4
|
-
action FetchPRs {
|
|
5
|
-
get "/repos/{GITHUB_OWNER}/{GITHUB_REPO}/pulls" {
|
|
6
|
-
source: GitHub,
|
|
7
|
-
body: {
|
|
8
|
-
"state": "all",
|
|
9
|
-
"per_page": 100
|
|
10
|
-
},
|
|
11
|
-
paginate: page(page, 100),
|
|
12
|
-
until: length(response) == 0,
|
|
13
|
-
retry: {
|
|
14
|
-
maxAttempts: 3,
|
|
15
|
-
backoff: "exponential",
|
|
16
|
-
initialDelay: 1000
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Handle different response types
|
|
21
|
-
match response {
|
|
22
|
-
// Success - store PRs
|
|
23
|
-
[GitHubPR] -> {
|
|
24
|
-
store response -> prs_raw { key: .id }
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
// Rate limited - retry
|
|
28
|
-
RateLimitError -> retry {
|
|
29
|
-
maxAttempts: 5,
|
|
30
|
-
backoff: exponential,
|
|
31
|
-
initialDelay: 60000
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
// Not found - abort
|
|
35
|
-
NotFoundError -> abort "Repository not found",
|
|
36
|
-
|
|
37
|
-
// Fallback - log error and skip
|
|
38
|
-
_ -> skip
|
|
39
|
-
}
|
|
40
|
-
}
|