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/dist/plugin.js
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* Or simply import the plugin module to auto-register:
|
|
13
|
-
* import 'reqon/plugin';
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Vague plugin - registers Reqon keywords with Vague's lexer
|
|
4
|
+
* exports:
|
|
5
|
+
* - reqonPlugin - plugin object for manual registration
|
|
6
|
+
* - registerReqonPlugin, unregisterReqonPlugin - registration helpers
|
|
7
|
+
* related:
|
|
8
|
+
* - ./lexer/tokens.ts - REQON_KEYWORDS map
|
|
9
|
+
* - vague-lang - parent DSL framework
|
|
10
|
+
* ---
|
|
14
11
|
*/
|
|
15
|
-
import { registerPlugin, unregisterPlugin
|
|
12
|
+
import { registerPlugin, unregisterPlugin } from 'vague-lang';
|
|
16
13
|
import { REQON_KEYWORDS } from './lexer/tokens.js';
|
|
17
14
|
/**
|
|
18
15
|
* Convert REQON_KEYWORDS map to PluginKeyword array for Vague plugin system.
|
package/dist/stores/factory.d.ts
CHANGED
|
@@ -33,4 +33,4 @@ export declare function createStore(options: CreateStoreOptions): StoreAdapter;
|
|
|
33
33
|
* Map DSL store type to adapter type
|
|
34
34
|
* In development mode, sql/nosql fall back to file stores
|
|
35
35
|
*/
|
|
36
|
-
export declare function resolveStoreType(dslType: 'sql' | 'nosql' | 'memory', developmentMode?: boolean): StoreType;
|
|
36
|
+
export declare function resolveStoreType(dslType: 'sql' | 'nosql' | 'memory' | 'file' | 'postgrest', developmentMode?: boolean): StoreType;
|
package/dist/stores/factory.js
CHANGED
|
@@ -61,8 +61,9 @@ export function createStore(options) {
|
|
|
61
61
|
* In development mode, sql/nosql fall back to file stores
|
|
62
62
|
*/
|
|
63
63
|
export function resolveStoreType(dslType, developmentMode = true) {
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
// These types are used directly
|
|
65
|
+
if (dslType === 'memory' || dslType === 'file' || dslType === 'postgrest') {
|
|
66
|
+
return dslType;
|
|
66
67
|
}
|
|
67
68
|
if (developmentMode) {
|
|
68
69
|
// Use file stores for local development
|
package/dist/stores/file.d.ts
CHANGED
|
@@ -12,6 +12,9 @@ export interface FileStoreOptions {
|
|
|
12
12
|
/**
|
|
13
13
|
* File-based JSON store for local development
|
|
14
14
|
* Persists data to .reqon-data/{name}.json
|
|
15
|
+
*
|
|
16
|
+
* Use FileStore.create() for async initialization (recommended),
|
|
17
|
+
* or new FileStore() for lazy initialization (backward compatible).
|
|
15
18
|
*/
|
|
16
19
|
export declare class FileStore implements StoreAdapter {
|
|
17
20
|
private data;
|
|
@@ -19,9 +22,28 @@ export declare class FileStore implements StoreAdapter {
|
|
|
19
22
|
private options;
|
|
20
23
|
private dirty;
|
|
21
24
|
private initialized;
|
|
25
|
+
private initError;
|
|
22
26
|
private debounceTimer;
|
|
23
27
|
private pendingWrite;
|
|
28
|
+
/**
|
|
29
|
+
* Create a FileStore with async initialization (recommended).
|
|
30
|
+
* The store is fully initialized when the promise resolves.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* const store = await FileStore.create('my-store', { baseDir: '.data' });
|
|
34
|
+
*/
|
|
35
|
+
static create(name: string, options?: FileStoreOptions): Promise<FileStore>;
|
|
36
|
+
/**
|
|
37
|
+
* Constructor for lazy initialization (backward compatible).
|
|
38
|
+
* Each operation will wait for initialization to complete.
|
|
39
|
+
* Prefer FileStore.create() for explicit async initialization.
|
|
40
|
+
*/
|
|
24
41
|
constructor(name: string, options?: FileStoreOptions);
|
|
42
|
+
/**
|
|
43
|
+
* Ensure the store is initialized. Safe to call multiple times.
|
|
44
|
+
* Throws if initialization previously failed.
|
|
45
|
+
*/
|
|
46
|
+
private ensureInitialized;
|
|
25
47
|
private init;
|
|
26
48
|
private load;
|
|
27
49
|
private persist;
|
|
@@ -35,6 +57,10 @@ export declare class FileStore implements StoreAdapter {
|
|
|
35
57
|
key: string;
|
|
36
58
|
value: Record<string, unknown>;
|
|
37
59
|
}>): Promise<void>;
|
|
60
|
+
bulkUpsert(records: Array<{
|
|
61
|
+
key: string;
|
|
62
|
+
value: Record<string, unknown>;
|
|
63
|
+
}>): Promise<void>;
|
|
38
64
|
update(key: string, value: Partial<Record<string, unknown>>): Promise<void>;
|
|
39
65
|
delete(key: string): Promise<void>;
|
|
40
66
|
list(filter?: StoreFilter): Promise<Record<string, unknown>[]>;
|
package/dist/stores/file.js
CHANGED
|
@@ -12,19 +12,58 @@ const DEFAULT_OPTIONS = {
|
|
|
12
12
|
/**
|
|
13
13
|
* File-based JSON store for local development
|
|
14
14
|
* Persists data to .reqon-data/{name}.json
|
|
15
|
+
*
|
|
16
|
+
* Use FileStore.create() for async initialization (recommended),
|
|
17
|
+
* or new FileStore() for lazy initialization (backward compatible).
|
|
15
18
|
*/
|
|
16
19
|
export class FileStore {
|
|
17
20
|
data = new Map();
|
|
18
21
|
filePath;
|
|
19
22
|
options;
|
|
20
23
|
dirty = false;
|
|
21
|
-
initialized;
|
|
24
|
+
initialized = null;
|
|
25
|
+
initError = null;
|
|
22
26
|
debounceTimer = null;
|
|
23
27
|
pendingWrite = null;
|
|
28
|
+
/**
|
|
29
|
+
* Create a FileStore with async initialization (recommended).
|
|
30
|
+
* The store is fully initialized when the promise resolves.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* const store = await FileStore.create('my-store', { baseDir: '.data' });
|
|
34
|
+
*/
|
|
35
|
+
static async create(name, options = {}) {
|
|
36
|
+
const store = new FileStore(name, options);
|
|
37
|
+
await store.ensureInitialized();
|
|
38
|
+
return store;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Constructor for lazy initialization (backward compatible).
|
|
42
|
+
* Each operation will wait for initialization to complete.
|
|
43
|
+
* Prefer FileStore.create() for explicit async initialization.
|
|
44
|
+
*/
|
|
24
45
|
constructor(name, options = {}) {
|
|
25
46
|
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
26
47
|
this.filePath = join(this.options.baseDir, `${name}.json`);
|
|
27
|
-
|
|
48
|
+
// Lazy initialization - init() is called on first operation
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Ensure the store is initialized. Safe to call multiple times.
|
|
52
|
+
* Throws if initialization previously failed.
|
|
53
|
+
*/
|
|
54
|
+
async ensureInitialized() {
|
|
55
|
+
// If init previously failed, throw the cached error
|
|
56
|
+
if (this.initError) {
|
|
57
|
+
throw this.initError;
|
|
58
|
+
}
|
|
59
|
+
// If not yet started, start initialization
|
|
60
|
+
if (this.initialized === null) {
|
|
61
|
+
this.initialized = this.init().catch((error) => {
|
|
62
|
+
this.initError = error instanceof Error ? error : new Error(String(error));
|
|
63
|
+
throw this.initError;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
await this.initialized;
|
|
28
67
|
}
|
|
29
68
|
async init() {
|
|
30
69
|
const dir = dirname(this.filePath);
|
|
@@ -83,16 +122,16 @@ export class FileStore {
|
|
|
83
122
|
this.dirty = false;
|
|
84
123
|
}
|
|
85
124
|
async get(key) {
|
|
86
|
-
await this.
|
|
125
|
+
await this.ensureInitialized();
|
|
87
126
|
return this.data.get(key) ?? null;
|
|
88
127
|
}
|
|
89
128
|
async set(key, value) {
|
|
90
|
-
await this.
|
|
129
|
+
await this.ensureInitialized();
|
|
91
130
|
this.data.set(key, { ...value });
|
|
92
131
|
await this.persist();
|
|
93
132
|
}
|
|
94
133
|
async bulkSet(records) {
|
|
95
|
-
await this.
|
|
134
|
+
await this.ensureInitialized();
|
|
96
135
|
// Set all records in memory first (no disk I/O per record)
|
|
97
136
|
for (const { key, value } of records) {
|
|
98
137
|
this.data.set(key, { ...value });
|
|
@@ -100,8 +139,23 @@ export class FileStore {
|
|
|
100
139
|
// Single persist operation for all records
|
|
101
140
|
await this.persist();
|
|
102
141
|
}
|
|
142
|
+
async bulkUpsert(records) {
|
|
143
|
+
await this.ensureInitialized();
|
|
144
|
+
// Upsert all records in memory first (no disk I/O per record)
|
|
145
|
+
for (const { key, value } of records) {
|
|
146
|
+
const existing = this.data.get(key);
|
|
147
|
+
if (existing) {
|
|
148
|
+
this.data.set(key, { ...existing, ...value });
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
this.data.set(key, { ...value });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Single persist operation for all records
|
|
155
|
+
await this.persist();
|
|
156
|
+
}
|
|
103
157
|
async update(key, value) {
|
|
104
|
-
await this.
|
|
158
|
+
await this.ensureInitialized();
|
|
105
159
|
const existing = this.data.get(key);
|
|
106
160
|
if (existing) {
|
|
107
161
|
this.data.set(key, { ...existing, ...value });
|
|
@@ -112,16 +166,16 @@ export class FileStore {
|
|
|
112
166
|
await this.persist();
|
|
113
167
|
}
|
|
114
168
|
async delete(key) {
|
|
115
|
-
await this.
|
|
169
|
+
await this.ensureInitialized();
|
|
116
170
|
this.data.delete(key);
|
|
117
171
|
await this.persist();
|
|
118
172
|
}
|
|
119
173
|
async list(filter) {
|
|
120
|
-
await this.
|
|
174
|
+
await this.ensureInitialized();
|
|
121
175
|
return applyStoreFilter(Array.from(this.data.values()), filter);
|
|
122
176
|
}
|
|
123
177
|
async count(filter) {
|
|
124
|
-
await this.
|
|
178
|
+
await this.ensureInitialized();
|
|
125
179
|
// Apply only the where clause for counting (ignore limit/offset)
|
|
126
180
|
const filtered = applyStoreFilter(Array.from(this.data.values()), {
|
|
127
181
|
where: filter?.where,
|
|
@@ -129,7 +183,7 @@ export class FileStore {
|
|
|
129
183
|
return filtered.length;
|
|
130
184
|
}
|
|
131
185
|
async clear() {
|
|
132
|
-
await this.
|
|
186
|
+
await this.ensureInitialized();
|
|
133
187
|
this.data.clear();
|
|
134
188
|
await this.persist();
|
|
135
189
|
}
|
package/dist/stores/index.d.ts
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Store adapters - pluggable storage backends for pipeline data
|
|
4
|
+
* exports:
|
|
5
|
+
* - StoreAdapter - interface for all stores
|
|
6
|
+
* - MemoryStore, FileStore, PostgRESTStore - implementations
|
|
7
|
+
* - createStore - factory function
|
|
8
|
+
* related:
|
|
9
|
+
* - ./types.ts - StoreAdapter interface definition
|
|
10
|
+
* - ./memory.ts - in-memory store (default)
|
|
11
|
+
* - ./file.ts - JSON/CSV file store
|
|
12
|
+
* - ./postgrest.ts - PostgREST API store
|
|
13
|
+
* - ../interpreter/context.ts - stores registered in context
|
|
14
|
+
* ---
|
|
15
|
+
*/
|
|
1
16
|
export type { StoreAdapter, StoreFilter, StoreConfig } from './types.js';
|
|
2
17
|
export { applyStoreFilter } from './types.js';
|
|
3
18
|
export { MemoryStore } from './memory.js';
|
|
4
19
|
export { FileStore, type FileStoreOptions } from './file.js';
|
|
5
20
|
export { PostgRESTStore, PostgRESTError, type PostgRESTOptions } from './postgrest.js';
|
|
6
|
-
export { createStore, resolveStoreType, type StoreType, type CreateStoreOptions } from './factory.js';
|
|
21
|
+
export { createStore, resolveStoreType, type StoreType, type CreateStoreOptions, } from './factory.js';
|
package/dist/stores/index.js
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Store adapters - pluggable storage backends for pipeline data
|
|
4
|
+
* exports:
|
|
5
|
+
* - StoreAdapter - interface for all stores
|
|
6
|
+
* - MemoryStore, FileStore, PostgRESTStore - implementations
|
|
7
|
+
* - createStore - factory function
|
|
8
|
+
* related:
|
|
9
|
+
* - ./types.ts - StoreAdapter interface definition
|
|
10
|
+
* - ./memory.ts - in-memory store (default)
|
|
11
|
+
* - ./file.ts - JSON/CSV file store
|
|
12
|
+
* - ./postgrest.ts - PostgREST API store
|
|
13
|
+
* - ../interpreter/context.ts - stores registered in context
|
|
14
|
+
* ---
|
|
15
|
+
*/
|
|
1
16
|
export { applyStoreFilter } from './types.js';
|
|
2
17
|
export { MemoryStore } from './memory.js';
|
|
3
18
|
export { FileStore } from './file.js';
|
|
4
19
|
export { PostgRESTStore, PostgRESTError } from './postgrest.js';
|
|
5
|
-
export { createStore, resolveStoreType } from './factory.js';
|
|
20
|
+
export { createStore, resolveStoreType, } from './factory.js';
|
package/dist/stores/memory.d.ts
CHANGED
|
@@ -9,6 +9,10 @@ export declare class MemoryStore implements StoreAdapter {
|
|
|
9
9
|
key: string;
|
|
10
10
|
value: Record<string, unknown>;
|
|
11
11
|
}>): Promise<void>;
|
|
12
|
+
bulkUpsert(records: Array<{
|
|
13
|
+
key: string;
|
|
14
|
+
value: Record<string, unknown>;
|
|
15
|
+
}>): Promise<void>;
|
|
12
16
|
update(key: string, value: Partial<Record<string, unknown>>): Promise<void>;
|
|
13
17
|
delete(key: string): Promise<void>;
|
|
14
18
|
list(filter?: StoreFilter): Promise<Record<string, unknown>[]>;
|
package/dist/stores/memory.js
CHANGED
|
@@ -16,6 +16,17 @@ export class MemoryStore {
|
|
|
16
16
|
this.data.set(key, { ...value });
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
+
async bulkUpsert(records) {
|
|
20
|
+
for (const { key, value } of records) {
|
|
21
|
+
const existing = this.data.get(key);
|
|
22
|
+
if (existing) {
|
|
23
|
+
this.data.set(key, { ...existing, ...value });
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this.data.set(key, { ...value });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
19
30
|
async update(key, value) {
|
|
20
31
|
const existing = this.data.get(key);
|
|
21
32
|
if (existing) {
|
package/dist/stores/types.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Store interface definitions - contract for all store adapters
|
|
4
|
+
* exports:
|
|
5
|
+
* - StoreAdapter - CRUD interface (get, set, update, delete, list, count)
|
|
6
|
+
* - StoreFilter - where/limit/offset for queries
|
|
7
|
+
* - StoreConfig - store type configuration
|
|
8
|
+
* related:
|
|
9
|
+
* - ./memory.ts, ./file.ts, ./postgrest.ts - implementations
|
|
10
|
+
* - ../interpreter/step-handlers/store-handler.ts - uses StoreAdapter
|
|
11
|
+
* ---
|
|
12
|
+
*/
|
|
1
13
|
export interface StoreAdapter {
|
|
2
14
|
get(key: string): Promise<Record<string, unknown> | null>;
|
|
3
15
|
set(key: string, value: Record<string, unknown>): Promise<void>;
|
|
@@ -6,6 +18,11 @@ export interface StoreAdapter {
|
|
|
6
18
|
key: string;
|
|
7
19
|
value: Record<string, unknown>;
|
|
8
20
|
}>): Promise<void>;
|
|
21
|
+
/** Bulk upsert multiple records at once - more efficient than individual updates */
|
|
22
|
+
bulkUpsert?(records: Array<{
|
|
23
|
+
key: string;
|
|
24
|
+
value: Record<string, unknown>;
|
|
25
|
+
}>): Promise<void>;
|
|
9
26
|
update(key: string, value: Partial<Record<string, unknown>>): Promise<void>;
|
|
10
27
|
delete(key: string): Promise<void>;
|
|
11
28
|
list(filter?: StoreFilter): Promise<Record<string, unknown>[]>;
|
package/dist/stores/types.js
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Store interface definitions - contract for all store adapters
|
|
4
|
+
* exports:
|
|
5
|
+
* - StoreAdapter - CRUD interface (get, set, update, delete, list, count)
|
|
6
|
+
* - StoreFilter - where/limit/offset for queries
|
|
7
|
+
* - StoreConfig - store type configuration
|
|
8
|
+
* related:
|
|
9
|
+
* - ./memory.ts, ./file.ts, ./postgrest.ts - implementations
|
|
10
|
+
* - ../interpreter/step-handlers/store-handler.ts - uses StoreAdapter
|
|
11
|
+
* ---
|
|
12
|
+
*/
|
|
1
13
|
/**
|
|
2
14
|
* Apply filter criteria to a list of records.
|
|
3
15
|
* Handles where clause, offset, and limit.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Module - Time-travel debugging for Reqon
|
|
3
|
+
*
|
|
4
|
+
* Provides execution tracing, replay, and debugging capabilities:
|
|
5
|
+
* - TraceRecorder: Captures execution state at each step
|
|
6
|
+
* - TraceStore: Persists traces for later analysis
|
|
7
|
+
* - TraceReplayer: Navigates and inspects recorded traces
|
|
8
|
+
*/
|
|
9
|
+
export type { TraceSnapshot, StoreSnapshot, LoopContext, ExecutionTrace } from './state.js';
|
|
10
|
+
export { generateSnapshotId, createExecutionTrace, safeClone, truncateForTrace } from './state.js';
|
|
11
|
+
export type { TraceStore } from './store.js';
|
|
12
|
+
export { FileTraceStore, MemoryTraceStore } from './store.js';
|
|
13
|
+
export type { TraceRecorderConfig } from './recorder.js';
|
|
14
|
+
export { TraceRecorder, createTraceRecorder } from './recorder.js';
|
|
15
|
+
export type { ReplaySession, ReplayStepResult, TimelineEvent, VariableChange, SnapshotDiff, } from './replay.js';
|
|
16
|
+
export { TraceReplayer, createTraceReplayer } from './replay.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Module - Time-travel debugging for Reqon
|
|
3
|
+
*
|
|
4
|
+
* Provides execution tracing, replay, and debugging capabilities:
|
|
5
|
+
* - TraceRecorder: Captures execution state at each step
|
|
6
|
+
* - TraceStore: Persists traces for later analysis
|
|
7
|
+
* - TraceReplayer: Navigates and inspects recorded traces
|
|
8
|
+
*/
|
|
9
|
+
export { generateSnapshotId, createExecutionTrace, safeClone, truncateForTrace } from './state.js';
|
|
10
|
+
export { FileTraceStore, MemoryTraceStore } from './store.js';
|
|
11
|
+
export { TraceRecorder, createTraceRecorder } from './recorder.js';
|
|
12
|
+
export { TraceReplayer, createTraceReplayer } from './replay.js';
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Recorder - Captures execution state for time-travel debugging
|
|
3
|
+
*
|
|
4
|
+
* Used by the executor to record snapshots at each step,
|
|
5
|
+
* building a complete trace that can be replayed later.
|
|
6
|
+
*/
|
|
7
|
+
import type { ExecutionContext } from '../interpreter/context.js';
|
|
8
|
+
import type { TraceStore } from './store.js';
|
|
9
|
+
import { type ExecutionTrace, type TraceSnapshot, type LoopContext } from './state.js';
|
|
10
|
+
export interface TraceRecorderConfig {
|
|
11
|
+
/** Execution ID (used as trace ID) */
|
|
12
|
+
executionId: string;
|
|
13
|
+
/** Mission name */
|
|
14
|
+
mission: string;
|
|
15
|
+
/** Trace mode */
|
|
16
|
+
mode: 'full' | 'minimal';
|
|
17
|
+
/** Store for persisting traces */
|
|
18
|
+
store: TraceStore;
|
|
19
|
+
/** Metadata to attach to trace */
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
/** Whether to stream snapshots (append as they happen) vs batch at end */
|
|
22
|
+
streaming?: boolean;
|
|
23
|
+
/** Max items to include in store samples */
|
|
24
|
+
maxStoreItems?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Records execution state for time-travel debugging
|
|
28
|
+
*/
|
|
29
|
+
export declare class TraceRecorder {
|
|
30
|
+
private config;
|
|
31
|
+
private trace;
|
|
32
|
+
private snapshotIndex;
|
|
33
|
+
private currentLoopContext?;
|
|
34
|
+
constructor(config: TraceRecorderConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Record a snapshot before step execution
|
|
37
|
+
*/
|
|
38
|
+
recordBeforeStep(action: string, stepIndex: number, stepType: string, ctx: ExecutionContext): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Record a snapshot after step execution
|
|
41
|
+
*/
|
|
42
|
+
recordAfterStep(action: string, stepIndex: number, stepType: string, ctx: ExecutionContext, stepDuration: number, error?: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Set loop context for subsequent snapshots
|
|
45
|
+
*/
|
|
46
|
+
setLoopContext(context: LoopContext | undefined): void;
|
|
47
|
+
/**
|
|
48
|
+
* Finalize the trace (called when execution completes)
|
|
49
|
+
*/
|
|
50
|
+
finalize(success: boolean): Promise<ExecutionTrace>;
|
|
51
|
+
/**
|
|
52
|
+
* Get the current trace (without finalizing)
|
|
53
|
+
*/
|
|
54
|
+
getTrace(): ExecutionTrace;
|
|
55
|
+
/**
|
|
56
|
+
* Get a specific snapshot by index
|
|
57
|
+
*/
|
|
58
|
+
getSnapshot(index: number): TraceSnapshot | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Get the total number of snapshots recorded
|
|
61
|
+
*/
|
|
62
|
+
getSnapshotCount(): number;
|
|
63
|
+
private createSnapshot;
|
|
64
|
+
private captureVariables;
|
|
65
|
+
private captureStores;
|
|
66
|
+
private addSnapshot;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a trace recorder for an execution
|
|
70
|
+
*/
|
|
71
|
+
export declare function createTraceRecorder(config: TraceRecorderConfig): TraceRecorder;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Recorder - Captures execution state for time-travel debugging
|
|
3
|
+
*
|
|
4
|
+
* Used by the executor to record snapshots at each step,
|
|
5
|
+
* building a complete trace that can be replayed later.
|
|
6
|
+
*/
|
|
7
|
+
import { createExecutionTrace, generateSnapshotId, safeClone, truncateForTrace, } from './state.js';
|
|
8
|
+
/**
|
|
9
|
+
* Records execution state for time-travel debugging
|
|
10
|
+
*/
|
|
11
|
+
export class TraceRecorder {
|
|
12
|
+
config;
|
|
13
|
+
trace;
|
|
14
|
+
snapshotIndex = 0;
|
|
15
|
+
currentLoopContext;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.trace = createExecutionTrace(config.executionId, config.mission, config.mode, config.metadata);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Record a snapshot before step execution
|
|
22
|
+
*/
|
|
23
|
+
async recordBeforeStep(action, stepIndex, stepType, ctx) {
|
|
24
|
+
const snapshot = this.createSnapshot(action, stepIndex, stepType, 'before', ctx);
|
|
25
|
+
await this.addSnapshot(snapshot);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Record a snapshot after step execution
|
|
29
|
+
*/
|
|
30
|
+
async recordAfterStep(action, stepIndex, stepType, ctx, stepDuration, error) {
|
|
31
|
+
const snapshot = this.createSnapshot(action, stepIndex, stepType, 'after', ctx);
|
|
32
|
+
snapshot.stepDuration = stepDuration;
|
|
33
|
+
snapshot.error = error;
|
|
34
|
+
await this.addSnapshot(snapshot);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Set loop context for subsequent snapshots
|
|
38
|
+
*/
|
|
39
|
+
setLoopContext(context) {
|
|
40
|
+
this.currentLoopContext = context;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Finalize the trace (called when execution completes)
|
|
44
|
+
*/
|
|
45
|
+
async finalize(success) {
|
|
46
|
+
this.trace.completedAt = new Date();
|
|
47
|
+
this.trace.duration = this.trace.completedAt.getTime() - this.trace.startedAt.getTime();
|
|
48
|
+
this.trace.success = success;
|
|
49
|
+
// If not streaming, save entire trace at end
|
|
50
|
+
if (!this.config.streaming) {
|
|
51
|
+
await this.config.store.save(this.trace);
|
|
52
|
+
}
|
|
53
|
+
return this.trace;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the current trace (without finalizing)
|
|
57
|
+
*/
|
|
58
|
+
getTrace() {
|
|
59
|
+
return this.trace;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get a specific snapshot by index
|
|
63
|
+
*/
|
|
64
|
+
getSnapshot(index) {
|
|
65
|
+
return this.trace.snapshots[index];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the total number of snapshots recorded
|
|
69
|
+
*/
|
|
70
|
+
getSnapshotCount() {
|
|
71
|
+
return this.trace.snapshots.length;
|
|
72
|
+
}
|
|
73
|
+
createSnapshot(action, stepIndex, stepType, phase, ctx) {
|
|
74
|
+
const index = this.snapshotIndex++;
|
|
75
|
+
// Capture variables from context chain
|
|
76
|
+
const variables = this.captureVariables(ctx);
|
|
77
|
+
// Capture store states
|
|
78
|
+
const stores = this.captureStores(ctx);
|
|
79
|
+
// Capture response (truncated for large responses)
|
|
80
|
+
const response = this.config.mode === 'full' ? truncateForTrace(safeClone(ctx.response)) : undefined;
|
|
81
|
+
return {
|
|
82
|
+
id: generateSnapshotId(this.trace.id, index),
|
|
83
|
+
index,
|
|
84
|
+
timestamp: new Date(),
|
|
85
|
+
mission: this.trace.mission,
|
|
86
|
+
action,
|
|
87
|
+
stepIndex,
|
|
88
|
+
stepType,
|
|
89
|
+
phase,
|
|
90
|
+
variables,
|
|
91
|
+
response,
|
|
92
|
+
stores,
|
|
93
|
+
loopContext: this.currentLoopContext ? { ...this.currentLoopContext } : undefined,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
captureVariables(ctx) {
|
|
97
|
+
const variables = {};
|
|
98
|
+
let current = ctx;
|
|
99
|
+
while (current) {
|
|
100
|
+
for (const [key, value] of current.variables) {
|
|
101
|
+
if (!(key in variables)) {
|
|
102
|
+
// Clone and truncate for trace storage
|
|
103
|
+
variables[key] =
|
|
104
|
+
this.config.mode === 'full' ? truncateForTrace(safeClone(value)) : typeof value;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
current = current.parent;
|
|
108
|
+
}
|
|
109
|
+
return variables;
|
|
110
|
+
}
|
|
111
|
+
captureStores(ctx) {
|
|
112
|
+
const stores = {};
|
|
113
|
+
const maxItems = this.config.maxStoreItems ?? 10;
|
|
114
|
+
for (const [name, _store] of ctx.stores) {
|
|
115
|
+
const storeType = ctx.storeTypes.get(name) ?? 'unknown';
|
|
116
|
+
// Note: Getting actual item count would require async call
|
|
117
|
+
// For now, we just record the type
|
|
118
|
+
stores[name] = {
|
|
119
|
+
type: storeType,
|
|
120
|
+
itemCount: -1, // Would need async to get actual count
|
|
121
|
+
sampleItems: this.config.mode === 'full' ? [] : undefined,
|
|
122
|
+
};
|
|
123
|
+
// In full mode, we could sample items if we had sync access
|
|
124
|
+
// For now, this is a placeholder for future enhancement
|
|
125
|
+
if (this.config.mode === 'full' && maxItems > 0) {
|
|
126
|
+
// TODO: Add async store sampling if needed
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return stores;
|
|
130
|
+
}
|
|
131
|
+
async addSnapshot(snapshot) {
|
|
132
|
+
this.trace.snapshots.push(snapshot);
|
|
133
|
+
// If streaming mode, persist immediately
|
|
134
|
+
if (this.config.streaming) {
|
|
135
|
+
await this.config.store.appendSnapshot(this.trace.id, snapshot);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a trace recorder for an execution
|
|
141
|
+
*/
|
|
142
|
+
export function createTraceRecorder(config) {
|
|
143
|
+
return new TraceRecorder(config);
|
|
144
|
+
}
|