@ontrails/core 1.0.0-beta.13 → 1.0.0-beta.15
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/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +17 -0
- package/README.md +19 -14
- package/dist/branded.d.ts +1 -1
- package/dist/branded.d.ts.map +1 -1
- package/dist/branded.js +1 -1
- package/dist/branded.js.map +1 -1
- package/dist/context.d.ts +13 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +19 -3
- package/dist/context.js.map +1 -1
- package/dist/contour.d.ts +81 -0
- package/dist/contour.d.ts.map +1 -0
- package/dist/contour.js +176 -0
- package/dist/contour.js.map +1 -0
- package/dist/cross-schema.d.ts +18 -0
- package/dist/cross-schema.d.ts.map +1 -0
- package/dist/cross-schema.js +29 -0
- package/dist/cross-schema.js.map +1 -0
- package/dist/derive.d.ts +6 -0
- package/dist/derive.d.ts.map +1 -1
- package/dist/derive.js +29 -5
- package/dist/derive.js.map +1 -1
- package/dist/draft.d.ts +28 -0
- package/dist/draft.d.ts.map +1 -0
- package/dist/draft.js +157 -0
- package/dist/draft.js.map +1 -0
- package/dist/errors.d.ts +62 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +44 -1
- package/dist/errors.js.map +1 -1
- package/dist/execute.d.ts +26 -9
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +441 -20
- package/dist/execute.js.map +1 -1
- package/dist/fire.d.ts +43 -0
- package/dist/fire.d.ts.map +1 -0
- package/dist/fire.js +185 -0
- package/dist/fire.js.map +1 -0
- package/dist/index.d.ts +33 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -12
- package/dist/index.js.map +1 -1
- package/dist/internal/cross-batch.d.ts +44 -0
- package/dist/internal/cross-batch.d.ts.map +1 -0
- package/dist/internal/cross-batch.js +58 -0
- package/dist/internal/cross-batch.js.map +1 -0
- package/dist/internal/fork-ctx.d.ts +41 -0
- package/dist/internal/fork-ctx.d.ts.map +1 -0
- package/dist/internal/fork-ctx.js +47 -0
- package/dist/internal/fork-ctx.js.map +1 -0
- package/dist/internal/signal-ref.d.ts +15 -0
- package/dist/internal/signal-ref.d.ts.map +1 -0
- package/dist/internal/signal-ref.js +41 -0
- package/dist/internal/signal-ref.js.map +1 -0
- package/dist/internal/topo-saves.d.ts +53 -0
- package/dist/internal/topo-saves.d.ts.map +1 -0
- package/dist/internal/topo-saves.js +449 -0
- package/dist/internal/topo-saves.js.map +1 -0
- package/dist/internal/topo-snapshots.d.ts +57 -0
- package/dist/internal/topo-snapshots.d.ts.map +1 -0
- package/dist/internal/topo-snapshots.js +372 -0
- package/dist/internal/topo-snapshots.js.map +1 -0
- package/dist/internal/topo-store-read.d.ts +70 -0
- package/dist/internal/topo-store-read.d.ts.map +1 -0
- package/dist/internal/topo-store-read.js +221 -0
- package/dist/internal/topo-store-read.js.map +1 -0
- package/dist/internal/topo-store.d.ts +26 -0
- package/dist/internal/topo-store.d.ts.map +1 -0
- package/dist/internal/topo-store.js +621 -0
- package/dist/internal/topo-store.js.map +1 -0
- package/dist/internal/tracing.d.ts +98 -0
- package/dist/internal/tracing.d.ts.map +1 -0
- package/dist/internal/tracing.js +102 -0
- package/dist/internal/tracing.js.map +1 -0
- package/dist/internal/trails-db.d.ts +16 -0
- package/dist/internal/trails-db.d.ts.map +1 -0
- package/dist/internal/trails-db.js +118 -0
- package/dist/internal/trails-db.js.map +1 -0
- package/dist/internal/zod-wrappers.d.ts +40 -0
- package/dist/internal/zod-wrappers.d.ts.map +1 -0
- package/dist/internal/zod-wrappers.js +59 -0
- package/dist/internal/zod-wrappers.js.map +1 -0
- package/dist/layer.d.ts +22 -5
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +20 -3
- package/dist/layer.js.map +1 -1
- package/dist/path-security.d.ts +1 -1
- package/dist/path-security.d.ts.map +1 -1
- package/dist/path-security.js +1 -1
- package/dist/path-security.js.map +1 -1
- package/dist/resilience.d.ts +1 -1
- package/dist/resilience.d.ts.map +1 -1
- package/dist/resilience.js +3 -3
- package/dist/resilience.js.map +1 -1
- package/dist/resource-config.d.ts +22 -0
- package/dist/resource-config.d.ts.map +1 -0
- package/dist/resource-config.js +210 -0
- package/dist/resource-config.js.map +1 -0
- package/dist/resource.d.ts +74 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +61 -0
- package/dist/resource.js.map +1 -0
- package/dist/run.d.ts +4 -3
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +5 -4
- package/dist/run.js.map +1 -1
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2 -1
- package/dist/serialization.js.map +1 -1
- package/dist/store/accessor-protocol.d.ts +51 -0
- package/dist/store/accessor-protocol.d.ts.map +1 -0
- package/dist/store/accessor-protocol.js +2 -0
- package/dist/store/accessor-protocol.js.map +1 -0
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +2 -0
- package/dist/store/index.js.map +1 -0
- package/dist/surface-filter.d.ts +13 -0
- package/dist/surface-filter.d.ts.map +1 -0
- package/dist/surface-filter.js +76 -0
- package/dist/surface-filter.js.map +1 -0
- package/dist/topo-store.d.ts +62 -0
- package/dist/topo-store.d.ts.map +1 -0
- package/dist/topo-store.js +319 -0
- package/dist/topo-store.js.map +1 -0
- package/dist/topo.d.ts +23 -9
- package/dist/topo.d.ts.map +1 -1
- package/dist/topo.js +175 -46
- package/dist/topo.js.map +1 -1
- package/dist/trail.d.ts +86 -19
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +59 -4
- package/dist/trail.js.map +1 -1
- package/dist/trails/derive-trail.d.ts +66 -0
- package/dist/trails/derive-trail.d.ts.map +1 -0
- package/dist/trails/derive-trail.js +378 -0
- package/dist/trails/derive-trail.js.map +1 -0
- package/dist/trails/index.d.ts +5 -0
- package/dist/trails/index.d.ts.map +1 -0
- package/dist/trails/index.js +3 -0
- package/dist/trails/index.js.map +1 -0
- package/dist/trails/ingest.d.ts +24 -0
- package/dist/trails/ingest.d.ts.map +1 -0
- package/dist/trails/ingest.js +63 -0
- package/dist/trails/ingest.js.map +1 -0
- package/dist/transport-error-map.d.ts +106 -0
- package/dist/transport-error-map.d.ts.map +1 -0
- package/dist/transport-error-map.js +24 -0
- package/dist/transport-error-map.js.map +1 -0
- package/dist/type-checks.test-d.d.ts +71 -0
- package/dist/type-checks.test-d.d.ts.map +1 -0
- package/dist/type-checks.test-d.js +12 -0
- package/dist/type-checks.test-d.js.map +1 -0
- package/dist/type-utils.d.ts +11 -2
- package/dist/type-utils.d.ts.map +1 -1
- package/dist/type-utils.js.map +1 -1
- package/dist/types.d.ts +113 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validate-established-topo.d.ts +76 -0
- package/dist/validate-established-topo.d.ts.map +1 -0
- package/dist/validate-established-topo.js +43 -0
- package/dist/validate-established-topo.js.map +1 -0
- package/dist/validate-topo.d.ts.map +1 -1
- package/dist/validate-topo.js +27 -8
- package/dist/validate-topo.js.map +1 -1
- package/dist/workspace.d.ts +1 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +1 -1
- package/dist/workspace.js.map +1 -1
- package/package.json +10 -1
- package/src/__tests__/branded.test.ts +5 -5
- package/src/__tests__/context.test.ts +3 -3
- package/src/__tests__/contour.test.ts +263 -0
- package/src/__tests__/derive-trail.test.ts +668 -0
- package/src/__tests__/derive.test.ts +58 -1
- package/src/__tests__/errors.test.ts +118 -0
- package/src/__tests__/execute.test.ts +1179 -141
- package/src/__tests__/fire.test.ts +1056 -0
- package/src/__tests__/fork-ctx.test.ts +83 -0
- package/src/__tests__/ingest.test.ts +191 -0
- package/src/__tests__/{gate.test.ts → layer.test.ts} +21 -21
- package/src/__tests__/path-security.test.ts +7 -7
- package/src/__tests__/resilience.test.ts +8 -8
- package/src/__tests__/resource.test.ts +204 -0
- package/src/__tests__/run.test.ts +13 -13
- package/src/__tests__/service-config.test.ts +28 -32
- package/src/__tests__/surface-filter.test.ts +196 -0
- package/src/__tests__/topo-store-read.test.ts +256 -0
- package/src/__tests__/topo-store.test.ts +869 -0
- package/src/__tests__/topo.test.ts +350 -54
- package/src/__tests__/trail.test.ts +189 -24
- package/src/__tests__/trails-db.test.ts +198 -0
- package/src/__tests__/transport-error-map.test.ts +82 -0
- package/src/__tests__/type-utils.test.ts +29 -1
- package/src/__tests__/validate-topo.test.ts +305 -16
- package/src/__tests__/workspace.test.ts +6 -6
- package/src/__tests__/zod-wrappers.test.ts +62 -0
- package/src/branded.ts +1 -1
- package/src/context.ts +24 -4
- package/src/contour.ts +344 -0
- package/src/cross-schema.ts +36 -0
- package/src/derive.ts +39 -8
- package/src/draft.ts +338 -0
- package/src/errors.ts +62 -18
- package/src/execute.ts +840 -29
- package/src/fire.ts +295 -0
- package/src/index.ts +142 -26
- package/src/internal/cross-batch.ts +77 -0
- package/src/internal/fork-ctx.ts +69 -0
- package/src/internal/signal-ref.ts +87 -0
- package/src/internal/topo-snapshots.ts +517 -0
- package/src/internal/topo-store-read.ts +481 -0
- package/src/internal/topo-store.ts +1192 -0
- package/src/internal/tracing.ts +187 -0
- package/src/internal/trails-db.ts +187 -0
- package/src/internal/zod-wrappers.ts +78 -0
- package/src/layer.ts +50 -0
- package/src/path-security.ts +1 -1
- package/src/resilience.ts +3 -3
- package/src/{provision-config.ts → resource-config.ts} +109 -123
- package/src/resource.ts +155 -0
- package/src/run.ts +5 -4
- package/src/serialization.ts +2 -0
- package/src/store/accessor-protocol.ts +56 -0
- package/src/store/index.ts +4 -0
- package/src/surface-filter.ts +182 -0
- package/src/topo-store.ts +510 -0
- package/src/topo.ts +328 -57
- package/src/trail.ts +199 -31
- package/src/trails/derive-trail.ts +842 -0
- package/src/trails/index.ts +9 -0
- package/src/trails/ingest.ts +146 -0
- package/src/transport-error-map.ts +56 -0
- package/src/type-checks.test-d.ts +106 -0
- package/src/type-utils.ts +17 -2
- package/src/types.ts +148 -11
- package/src/validate-established-topo.ts +63 -0
- package/src/validate-topo.ts +37 -9
- package/src/workspace.ts +1 -1
- package/tsconfig.tests.json +10 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/adapters.d.ts +0 -39
- package/dist/adapters.d.ts.map +0 -1
- package/dist/adapters.js +0 -2
- package/dist/adapters.js.map +0 -1
- package/dist/dispatch.d.ts +0 -27
- package/dist/dispatch.d.ts.map +0 -1
- package/dist/dispatch.js +0 -34
- package/dist/dispatch.js.map +0 -1
- package/dist/event.d.ts +0 -8
- package/dist/event.d.ts.map +0 -1
- package/dist/event.js +0 -7
- package/dist/event.js.map +0 -1
- package/dist/gate.d.ts +0 -17
- package/dist/gate.d.ts.map +0 -1
- package/dist/gate.js +0 -21
- package/dist/gate.js.map +0 -1
- package/dist/health.d.ts +0 -18
- package/dist/health.d.ts.map +0 -1
- package/dist/health.js +0 -5
- package/dist/health.js.map +0 -1
- package/dist/job.d.ts +0 -24
- package/dist/job.d.ts.map +0 -1
- package/dist/job.js +0 -17
- package/dist/job.js.map +0 -1
- package/dist/provision-config.d.ts +0 -22
- package/dist/provision-config.d.ts.map +0 -1
- package/dist/provision-config.js +0 -210
- package/dist/provision-config.js.map +0 -1
- package/dist/provision.d.ts +0 -71
- package/dist/provision.d.ts.map +0 -1
- package/dist/provision.js +0 -56
- package/dist/provision.js.map +0 -1
- package/dist/service-config.d.ts +0 -22
- package/dist/service-config.d.ts.map +0 -1
- package/dist/service-config.js +0 -210
- package/dist/service-config.js.map +0 -1
- package/dist/service.d.ts +0 -71
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -56
- package/dist/service.js.map +0 -1
- package/src/__tests__/service.test.ts +0 -197
- package/src/event.ts +0 -15
- package/src/gate.ts +0 -44
- package/src/provision.ts +0 -148
package/dist/derive.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Introspects Zod v4 schemas to produce a runtime-agnostic Field[] descriptor
|
|
5
5
|
* that UI consumers (CLI prompts, web forms, etc.) can consume.
|
|
6
6
|
*/
|
|
7
|
+
import { ValidationError } from './errors.js';
|
|
7
8
|
// ---------------------------------------------------------------------------
|
|
8
9
|
// Helpers
|
|
9
10
|
// ---------------------------------------------------------------------------
|
|
@@ -55,11 +56,15 @@ const unwrap = (s) => {
|
|
|
55
56
|
const fieldTypeByDef = {
|
|
56
57
|
array: (s) => {
|
|
57
58
|
const element = s._zod.def['element'];
|
|
58
|
-
const
|
|
59
|
+
const { inner } = unwrap(element);
|
|
60
|
+
const elementType = inner._zod.def['type'];
|
|
59
61
|
if (elementType === 'enum') {
|
|
60
|
-
const entries =
|
|
62
|
+
const entries = inner._zod.def['entries'];
|
|
61
63
|
return { options: Object.values(entries), type: 'multiselect' };
|
|
62
64
|
}
|
|
65
|
+
if (elementType !== 'number' && elementType !== 'string') {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
63
68
|
return {
|
|
64
69
|
options: undefined,
|
|
65
70
|
type: elementType === 'number' ? 'number[]' : 'string[]',
|
|
@@ -77,7 +82,7 @@ const fieldTypeByDef = {
|
|
|
77
82
|
const deriveFieldType = (s) => {
|
|
78
83
|
const defType = s._zod.def['type'];
|
|
79
84
|
const derive = fieldTypeByDef[defType];
|
|
80
|
-
return derive ? derive(s) :
|
|
85
|
+
return derive ? derive(s) : null;
|
|
81
86
|
};
|
|
82
87
|
/** Build options array, merging with overrides when present. */
|
|
83
88
|
const buildOptions = (rawOptions, overrideOptions) => {
|
|
@@ -93,13 +98,30 @@ const buildOptions = (rawOptions, overrideOptions) => {
|
|
|
93
98
|
return ov ? { hint: ov.hint, label: ov.label, value: v } : { value: v };
|
|
94
99
|
});
|
|
95
100
|
};
|
|
101
|
+
/**
|
|
102
|
+
* Derive the canonical ordered CLI path from a trail ID.
|
|
103
|
+
*
|
|
104
|
+
* @throws {ValidationError} if the trail ID contains empty segments (e.g. consecutive dots).
|
|
105
|
+
*/
|
|
106
|
+
export const deriveCliPath = (trailId) => {
|
|
107
|
+
const segments = trailId.split('.');
|
|
108
|
+
const emptyIndex = segments.findIndex((s) => s.length === 0);
|
|
109
|
+
if (emptyIndex !== -1) {
|
|
110
|
+
throw new ValidationError(`Trail ID "${trailId}" contains an empty segment at position ${emptyIndex}`);
|
|
111
|
+
}
|
|
112
|
+
return segments;
|
|
113
|
+
};
|
|
96
114
|
// ---------------------------------------------------------------------------
|
|
97
115
|
// Public API
|
|
98
116
|
// ---------------------------------------------------------------------------
|
|
99
117
|
/** Derive a single field from a shape entry. */
|
|
100
118
|
const deriveField = (key, value, overrides) => {
|
|
101
119
|
const { inner, required, defaultValue, description } = unwrap(value);
|
|
102
|
-
const
|
|
120
|
+
const derived = deriveFieldType(inner);
|
|
121
|
+
if (!derived) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const { type, options: rawOptions } = derived;
|
|
103
125
|
const override = overrides?.[key];
|
|
104
126
|
const label = override?.label ?? description ?? humanize(key);
|
|
105
127
|
const options = buildOptions(rawOptions, override?.options);
|
|
@@ -120,6 +142,8 @@ export const deriveFields = (schema, overrides) => {
|
|
|
120
142
|
return [];
|
|
121
143
|
}
|
|
122
144
|
const fields = Object.entries(shape).map(([key, value]) => deriveField(key, value, overrides));
|
|
123
|
-
return fields
|
|
145
|
+
return fields
|
|
146
|
+
.filter((field) => field !== null)
|
|
147
|
+
.toSorted((a, b) => a.name.localeCompare(b.name));
|
|
124
148
|
};
|
|
125
149
|
//# sourceMappingURL=derive.js.map
|
package/dist/derive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":"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"}
|
package/dist/draft.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ValidationError } from './errors.js';
|
|
2
|
+
import { Result } from './result.js';
|
|
3
|
+
import type { Topo } from './topo.js';
|
|
4
|
+
export declare const DRAFT_ID_PREFIX = "_draft.";
|
|
5
|
+
export type DraftDependencyKind = 'cross' | 'contour' | 'resource' | 'replaced-by' | 'schema-reference' | 'signal-from';
|
|
6
|
+
export interface DraftDependency {
|
|
7
|
+
readonly fromId: string;
|
|
8
|
+
readonly kind: DraftDependencyKind;
|
|
9
|
+
readonly toId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DraftFinding {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly kind: 'contour' | 'resource' | 'signal' | 'trail' | 'unknown';
|
|
14
|
+
readonly message: string;
|
|
15
|
+
readonly rule: 'draft-contamination' | 'draft-id';
|
|
16
|
+
readonly via?: DraftDependencyKind | undefined;
|
|
17
|
+
readonly dependsOn?: string | undefined;
|
|
18
|
+
}
|
|
19
|
+
export interface DraftReport {
|
|
20
|
+
readonly contaminatedIds: ReadonlySet<string>;
|
|
21
|
+
readonly declaredDraftIds: ReadonlySet<string>;
|
|
22
|
+
readonly dependencies: readonly DraftDependency[];
|
|
23
|
+
readonly findings: readonly DraftFinding[];
|
|
24
|
+
}
|
|
25
|
+
export declare const isDraftId: (id: string) => boolean;
|
|
26
|
+
export declare const deriveDraftReport: (topo: Topo) => DraftReport;
|
|
27
|
+
export declare const validateDraftFreeTopo: (topo: Topo) => Result<void, ValidationError>;
|
|
28
|
+
//# sourceMappingURL=draft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../src/draft.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,SAAS,GACT,UAAU,GACV,aAAa,GACb,kBAAkB,GAClB,aAAa,CAAC;AAElB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,UAAU,CAAC;IAClD,QAAQ,CAAC,GAAG,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,YAAY,EAAE,SAAS,eAAe,EAAE,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;CAC5C;AAcD,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,KAAG,OACP,CAAC;AAiPjC,eAAO,MAAM,iBAAiB,GAAI,MAAM,IAAI,KAAG,WAuB9C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,MAAM,IAAI,KACT,MAAM,CAAC,IAAI,EAAE,eAAe,CAe9B,CAAC"}
|
package/dist/draft.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { getContourReferences } from './contour.js';
|
|
2
|
+
import { ValidationError } from './errors.js';
|
|
3
|
+
import { Result } from './result.js';
|
|
4
|
+
export const DRAFT_ID_PREFIX = '_draft.';
|
|
5
|
+
const replacedByTarget = (value) => {
|
|
6
|
+
const raw = value;
|
|
7
|
+
return typeof raw.replacedBy === 'string' ? raw.replacedBy : undefined;
|
|
8
|
+
};
|
|
9
|
+
export const isDraftId = (id) => id.startsWith(DRAFT_ID_PREFIX);
|
|
10
|
+
const dependenciesFromIds = (fromId, toIds, kind) => toIds.map((toId) => ({
|
|
11
|
+
fromId,
|
|
12
|
+
kind,
|
|
13
|
+
toId,
|
|
14
|
+
}));
|
|
15
|
+
const dependencyFromTarget = (fromId, toId, kind) => toId === undefined
|
|
16
|
+
? []
|
|
17
|
+
: [
|
|
18
|
+
{
|
|
19
|
+
fromId,
|
|
20
|
+
kind,
|
|
21
|
+
toId,
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
const trailDependencies = (trail) => [
|
|
25
|
+
...dependenciesFromIds(trail.id, (trail.contours ?? []).map((contour) => contour.name), 'contour'),
|
|
26
|
+
...dependenciesFromIds(trail.id, trail.crosses, 'cross'),
|
|
27
|
+
...dependenciesFromIds(trail.id, trail.resources.map(({ id }) => id), 'resource'),
|
|
28
|
+
...dependencyFromTarget(trail.id, replacedByTarget(trail), 'replaced-by'),
|
|
29
|
+
];
|
|
30
|
+
const contourDependencies = (contour) => dependenciesFromIds(contour.name, getContourReferences(contour).map((reference) => reference.contour), 'schema-reference');
|
|
31
|
+
const signalDependencies = (signal) => [
|
|
32
|
+
...dependenciesFromIds(signal.id, signal.from ?? [], 'signal-from'),
|
|
33
|
+
...dependencyFromTarget(signal.id, replacedByTarget(signal), 'replaced-by'),
|
|
34
|
+
];
|
|
35
|
+
const resourceDependencies = (resource) => dependencyFromTarget(resource.id, replacedByTarget(resource), 'replaced-by');
|
|
36
|
+
const nodeKind = (id, contours, trails, signals, resources) => {
|
|
37
|
+
if (contours.has(id)) {
|
|
38
|
+
return 'contour';
|
|
39
|
+
}
|
|
40
|
+
if (trails.has(id)) {
|
|
41
|
+
return 'trail';
|
|
42
|
+
}
|
|
43
|
+
if (signals.has(id)) {
|
|
44
|
+
return 'signal';
|
|
45
|
+
}
|
|
46
|
+
if (resources.has(id)) {
|
|
47
|
+
return 'resource';
|
|
48
|
+
}
|
|
49
|
+
return 'unknown';
|
|
50
|
+
};
|
|
51
|
+
const displayKind = (kind) => kind === 'unknown' ? 'Node' : kind[0]?.toUpperCase() + kind.slice(1);
|
|
52
|
+
const draftIdsFromKeys = (keys) => [...keys].filter(isDraftId);
|
|
53
|
+
const collectDeclaredDraftIds = (topo) => new Set([
|
|
54
|
+
...draftIdsFromKeys(topo.contours.keys()),
|
|
55
|
+
...draftIdsFromKeys(topo.trails.keys()),
|
|
56
|
+
...draftIdsFromKeys(topo.signals.keys()),
|
|
57
|
+
...draftIdsFromKeys(topo.resources.keys()),
|
|
58
|
+
]);
|
|
59
|
+
const findingForDraftId = (id, kind) => ({
|
|
60
|
+
id,
|
|
61
|
+
kind,
|
|
62
|
+
message: `${displayKind(id ? kind : 'unknown')} "${id}" is draft and cannot appear in the established graph.`,
|
|
63
|
+
rule: 'draft-id',
|
|
64
|
+
});
|
|
65
|
+
const findingForContamination = (id, kind, reason) => {
|
|
66
|
+
const dependencyLabel = isDraftId(reason.dependsOn)
|
|
67
|
+
? `draft "${reason.dependsOn}"`
|
|
68
|
+
: `draft-contaminated "${reason.dependsOn}"`;
|
|
69
|
+
return {
|
|
70
|
+
dependsOn: reason.dependsOn,
|
|
71
|
+
id,
|
|
72
|
+
kind,
|
|
73
|
+
message: `Established ${kind} "${id}" depends on ${dependencyLabel} ` +
|
|
74
|
+
`via ${reason.via} and cannot appear in the established graph.`,
|
|
75
|
+
rule: 'draft-contamination',
|
|
76
|
+
via: reason.via,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
const contaminationReason = (dependency, contaminatedIds) => {
|
|
80
|
+
if (contaminatedIds.has(dependency.fromId)) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
if (!isDraftId(dependency.toId) && !contaminatedIds.has(dependency.toId)) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
dependsOn: dependency.toId,
|
|
88
|
+
via: dependency.kind,
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
const markContaminatedDependency = (dependency, contaminatedIds, reasons) => {
|
|
92
|
+
const reason = contaminationReason(dependency, contaminatedIds);
|
|
93
|
+
if (reason === undefined) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
contaminatedIds.add(dependency.fromId);
|
|
97
|
+
reasons.set(dependency.fromId, reason);
|
|
98
|
+
return true;
|
|
99
|
+
};
|
|
100
|
+
const propagateContaminatedIds = (declaredDraftIds, dependencies) => {
|
|
101
|
+
const contaminatedIds = new Set(declaredDraftIds);
|
|
102
|
+
const reasons = new Map();
|
|
103
|
+
const visit = () => {
|
|
104
|
+
if (dependencies.some((dependency) => markContaminatedDependency(dependency, contaminatedIds, reasons))) {
|
|
105
|
+
visit();
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
visit();
|
|
109
|
+
return { contaminatedIds, reasons };
|
|
110
|
+
};
|
|
111
|
+
const contaminationFindingForId = (id, declaredDraftIds, reasons, contours, trails, signals, resources) => {
|
|
112
|
+
if (declaredDraftIds.has(id)) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
const reason = reasons.get(id);
|
|
116
|
+
if (reason === undefined) {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
return findingForContamination(id, nodeKind(id, contours, trails, signals, resources), reason);
|
|
120
|
+
};
|
|
121
|
+
const collectFindings = (declaredDraftIds, contaminatedIds, reasons, contours, trails, signals, resources) => [
|
|
122
|
+
...[...declaredDraftIds]
|
|
123
|
+
.toSorted()
|
|
124
|
+
.map((id) => findingForDraftId(id, nodeKind(id, contours, trails, signals, resources))),
|
|
125
|
+
...[...contaminatedIds].toSorted().flatMap((id) => {
|
|
126
|
+
const finding = contaminationFindingForId(id, declaredDraftIds, reasons, contours, trails, signals, resources);
|
|
127
|
+
return finding === undefined ? [] : [finding];
|
|
128
|
+
}),
|
|
129
|
+
];
|
|
130
|
+
const collectDependencies = (topo) => [
|
|
131
|
+
...[...topo.contours.values()].flatMap(contourDependencies),
|
|
132
|
+
...[...topo.trails.values()].flatMap(trailDependencies),
|
|
133
|
+
...[...topo.signals.values()].flatMap(signalDependencies),
|
|
134
|
+
...[...topo.resources.values()].flatMap(resourceDependencies),
|
|
135
|
+
];
|
|
136
|
+
export const deriveDraftReport = (topo) => {
|
|
137
|
+
const declaredDraftIds = collectDeclaredDraftIds(topo);
|
|
138
|
+
const dependencies = collectDependencies(topo);
|
|
139
|
+
const { contaminatedIds, reasons } = propagateContaminatedIds(declaredDraftIds, dependencies);
|
|
140
|
+
const findings = collectFindings(declaredDraftIds, contaminatedIds, reasons, topo.contours, topo.trails, topo.signals, topo.resources);
|
|
141
|
+
return {
|
|
142
|
+
contaminatedIds,
|
|
143
|
+
declaredDraftIds,
|
|
144
|
+
dependencies,
|
|
145
|
+
findings,
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
export const validateDraftFreeTopo = (topo) => {
|
|
149
|
+
const analysis = deriveDraftReport(topo);
|
|
150
|
+
if (analysis.findings.length === 0) {
|
|
151
|
+
return Result.ok();
|
|
152
|
+
}
|
|
153
|
+
return Result.err(new ValidationError(`Established topo validation failed with ${analysis.findings.length} draft issue(s)`, {
|
|
154
|
+
context: { issues: analysis.findings },
|
|
155
|
+
}));
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../src/draft.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Provides a structured error hierarchy with category-based mapping
|
|
5
5
|
* to exit codes, HTTP status codes, and JSON-RPC error codes.
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
7
|
+
export declare const errorCategories: readonly ["validation", "not_found", "conflict", "permission", "timeout", "rate_limit", "network", "internal", "auth", "cancelled"];
|
|
8
|
+
export type ErrorCategory = (typeof errorCategories)[number];
|
|
8
9
|
export declare abstract class TrailsError extends Error {
|
|
9
10
|
abstract readonly category: ErrorCategory;
|
|
10
11
|
abstract readonly retryable: boolean;
|
|
@@ -61,6 +62,10 @@ export declare class NetworkError extends TrailsError {
|
|
|
61
62
|
readonly retryable: true;
|
|
62
63
|
}
|
|
63
64
|
export declare class InternalError extends TrailsError {
|
|
65
|
+
readonly category: ErrorCategory;
|
|
66
|
+
readonly retryable: false;
|
|
67
|
+
}
|
|
68
|
+
export declare class DerivationError extends TrailsError {
|
|
64
69
|
readonly category: "internal";
|
|
65
70
|
readonly retryable: false;
|
|
66
71
|
}
|
|
@@ -72,9 +77,62 @@ export declare class CancelledError extends TrailsError {
|
|
|
72
77
|
readonly category: "cancelled";
|
|
73
78
|
readonly retryable: false;
|
|
74
79
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Returned when a detour exhausts all recovery attempts.
|
|
82
|
+
*
|
|
83
|
+
* Inherits the wrapped error's category for trailhead mapping (e.g. a
|
|
84
|
+
* `RetryExhaustedError<ConflictError>` maps to HTTP 409), but always
|
|
85
|
+
* sets `retryable = false` to prevent amplification across `ctx.cross()`
|
|
86
|
+
* boundaries or stacked layers.
|
|
87
|
+
*/
|
|
88
|
+
export declare class RetryExhaustedError<TErr extends TrailsError = TrailsError> extends InternalError {
|
|
89
|
+
readonly category: ErrorCategory;
|
|
90
|
+
readonly cause: TErr;
|
|
91
|
+
/** Number of recovery attempts made before exhaustion. */
|
|
92
|
+
readonly attempts: number;
|
|
93
|
+
/** Name of the detour whose recovery was exhausted. */
|
|
94
|
+
readonly detour: string;
|
|
95
|
+
constructor(wrapped: TErr, metadata: {
|
|
96
|
+
readonly attempts: number;
|
|
97
|
+
readonly detour: string;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
export declare const exitCodeMap: {
|
|
101
|
+
readonly auth: 9;
|
|
102
|
+
readonly cancelled: 130;
|
|
103
|
+
readonly conflict: 3;
|
|
104
|
+
readonly internal: 8;
|
|
105
|
+
readonly network: 7;
|
|
106
|
+
readonly not_found: 2;
|
|
107
|
+
readonly permission: 4;
|
|
108
|
+
readonly rate_limit: 6;
|
|
109
|
+
readonly timeout: 5;
|
|
110
|
+
readonly validation: 1;
|
|
111
|
+
};
|
|
112
|
+
export declare const statusCodeMap: {
|
|
113
|
+
readonly auth: 401;
|
|
114
|
+
readonly cancelled: 499;
|
|
115
|
+
readonly conflict: 409;
|
|
116
|
+
readonly internal: 500;
|
|
117
|
+
readonly network: 502;
|
|
118
|
+
readonly not_found: 404;
|
|
119
|
+
readonly permission: 403;
|
|
120
|
+
readonly rate_limit: 429;
|
|
121
|
+
readonly timeout: 504;
|
|
122
|
+
readonly validation: 400;
|
|
123
|
+
};
|
|
124
|
+
export declare const jsonRpcCodeMap: {
|
|
125
|
+
readonly auth: -32600;
|
|
126
|
+
readonly cancelled: -32603;
|
|
127
|
+
readonly conflict: -32603;
|
|
128
|
+
readonly internal: -32603;
|
|
129
|
+
readonly network: -32603;
|
|
130
|
+
readonly not_found: -32601;
|
|
131
|
+
readonly permission: -32600;
|
|
132
|
+
readonly rate_limit: -32603;
|
|
133
|
+
readonly timeout: -32603;
|
|
134
|
+
readonly validation: -32602;
|
|
135
|
+
};
|
|
78
136
|
export declare const retryableMap: Record<ErrorCategory, boolean>;
|
|
79
137
|
/** Type guard: narrows unknown to TrailsError */
|
|
80
138
|
export declare const isTrailsError: (error?: unknown) => error is TrailsError;
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAMH,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
CHANGED
|
@@ -6,6 +6,21 @@
|
|
|
6
6
|
* to exit codes, HTTP status codes, and JSON-RPC error codes.
|
|
7
7
|
*/
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
|
+
// Category
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export const errorCategories = [
|
|
12
|
+
'validation',
|
|
13
|
+
'not_found',
|
|
14
|
+
'conflict',
|
|
15
|
+
'permission',
|
|
16
|
+
'timeout',
|
|
17
|
+
'rate_limit',
|
|
18
|
+
'network',
|
|
19
|
+
'internal',
|
|
20
|
+
'auth',
|
|
21
|
+
'cancelled',
|
|
22
|
+
];
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
9
24
|
// Base class
|
|
10
25
|
// ---------------------------------------------------------------------------
|
|
11
26
|
export class TrailsError extends Error {
|
|
@@ -68,6 +83,10 @@ export class InternalError extends TrailsError {
|
|
|
68
83
|
category = 'internal';
|
|
69
84
|
retryable = false;
|
|
70
85
|
}
|
|
86
|
+
export class DerivationError extends TrailsError {
|
|
87
|
+
category = 'internal';
|
|
88
|
+
retryable = false;
|
|
89
|
+
}
|
|
71
90
|
export class AuthError extends TrailsError {
|
|
72
91
|
category = 'auth';
|
|
73
92
|
retryable = false;
|
|
@@ -76,6 +95,30 @@ export class CancelledError extends TrailsError {
|
|
|
76
95
|
category = 'cancelled';
|
|
77
96
|
retryable = false;
|
|
78
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Returned when a detour exhausts all recovery attempts.
|
|
100
|
+
*
|
|
101
|
+
* Inherits the wrapped error's category for trailhead mapping (e.g. a
|
|
102
|
+
* `RetryExhaustedError<ConflictError>` maps to HTTP 409), but always
|
|
103
|
+
* sets `retryable = false` to prevent amplification across `ctx.cross()`
|
|
104
|
+
* boundaries or stacked layers.
|
|
105
|
+
*/
|
|
106
|
+
export class RetryExhaustedError extends InternalError {
|
|
107
|
+
category;
|
|
108
|
+
cause;
|
|
109
|
+
/** Number of recovery attempts made before exhaustion. */
|
|
110
|
+
attempts;
|
|
111
|
+
/** Name of the detour whose recovery was exhausted. */
|
|
112
|
+
detour;
|
|
113
|
+
constructor(wrapped, metadata) {
|
|
114
|
+
super(`Recovery exhausted after ${metadata.attempts} attempts: ${wrapped.message}`, { cause: wrapped });
|
|
115
|
+
this.cause = wrapped;
|
|
116
|
+
this.attempts = metadata.attempts;
|
|
117
|
+
this.detour = metadata.detour;
|
|
118
|
+
// Dynamic — inherited from wrapped error at construction time.
|
|
119
|
+
this.category = wrapped.category;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
79
122
|
// ---------------------------------------------------------------------------
|
|
80
123
|
// Taxonomy maps
|
|
81
124
|
// ---------------------------------------------------------------------------
|
|
@@ -135,7 +178,7 @@ export const isTrailsError = (error) => error instanceof TrailsError;
|
|
|
135
178
|
/** Returns true if the error is retryable (TrailsError with retryable category). */
|
|
136
179
|
export const isRetryable = (error) => {
|
|
137
180
|
if (isTrailsError(error)) {
|
|
138
|
-
return
|
|
181
|
+
return error.retryable;
|
|
139
182
|
}
|
|
140
183
|
return false;
|
|
141
184
|
};
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/execute.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Centralized trail execution pipeline.
|
|
3
3
|
*
|
|
4
|
-
* Validates input, builds context, composes
|
|
4
|
+
* Validates input, builds context, composes layers, and runs the
|
|
5
5
|
* implementation. Surfaces (CLI, MCP, HTTP) delegate here instead
|
|
6
6
|
* of reimplementing the pipeline.
|
|
7
7
|
*/
|
|
8
|
+
import type { z } from 'zod';
|
|
8
9
|
import type { AnyTrail } from './trail.js';
|
|
9
|
-
import type {
|
|
10
|
-
import type {
|
|
10
|
+
import type { Layer } from './layer.js';
|
|
11
|
+
import type { ResourceOverrideMap } from './resource.js';
|
|
12
|
+
import type { Topo } from './topo.js';
|
|
11
13
|
import type { TrailContextInit } from './types.js';
|
|
12
14
|
import { Result } from './result.js';
|
|
13
15
|
/** Options for executeTrail. */
|
|
@@ -16,17 +18,32 @@ export interface ExecuteTrailOptions {
|
|
|
16
18
|
readonly ctx?: Partial<TrailContextInit> | undefined;
|
|
17
19
|
/** AbortSignal override (takes final precedence over ctx and factory). */
|
|
18
20
|
readonly abortSignal?: AbortSignal | undefined;
|
|
19
|
-
/**
|
|
20
|
-
readonly
|
|
21
|
+
/** Layers to compose around the implementation. */
|
|
22
|
+
readonly layers?: readonly Layer[] | undefined;
|
|
21
23
|
/** Factory that produces a base TrailContext (takes precedence over defaults). */
|
|
22
24
|
readonly createContext?: (() => TrailContextInit | Promise<TrailContextInit>) | undefined;
|
|
23
|
-
/** Explicit
|
|
24
|
-
readonly
|
|
25
|
-
/** Config values for
|
|
25
|
+
/** Explicit resource instance overrides keyed by resource ID. */
|
|
26
|
+
readonly resources?: ResourceOverrideMap | undefined;
|
|
27
|
+
/** Config values for resources that declare a `config` schema, keyed by resource ID. */
|
|
26
28
|
readonly configValues?: Readonly<Record<string, Record<string, unknown>>> | undefined;
|
|
29
|
+
/** Topo used for signal-driven activation; required for `ctx.fire()` to work. */
|
|
30
|
+
readonly topo?: Topo | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Override the validation schema used for input validation.
|
|
33
|
+
*
|
|
34
|
+
* When a trail is invoked via `ctx.cross()` and the target declares
|
|
35
|
+
* `crossInput`, the cross function merges `trail.input` with
|
|
36
|
+
* `trail.crossInput` and passes the merged schema here so validation
|
|
37
|
+
* accepts both public and composition-only fields.
|
|
38
|
+
*
|
|
39
|
+
* Used by the cross execution path; not part of the public API.
|
|
40
|
+
*
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
readonly validationSchema?: z.ZodType | undefined;
|
|
27
44
|
}
|
|
28
45
|
/**
|
|
29
|
-
* Execute a trail through the standard validate-context-
|
|
46
|
+
* Execute a trail through the standard validate-context-layers-run pipeline.
|
|
30
47
|
*
|
|
31
48
|
* The function never throws -- unexpected exceptions are caught and
|
|
32
49
|
* returned as `Result.err(InternalError)`.
|
package/dist/execute.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,KAAK,EAOV,gBAAgB,EACjB,MAAM,YAAY,CAAC;AA0BpB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAcrC,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;IACrD,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/C,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,CAAC;IAC/C,kFAAkF;IAClF,QAAQ,CAAC,aAAa,CAAC,EACnB,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,GACpD,SAAS,CAAC;IACd,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACrD,wFAAwF;IACxF,QAAQ,CAAC,YAAY,CAAC,EAClB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjD,SAAS,CAAC;IACd,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACjC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC;CACnD;AAy0BD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,QAAQ,EACf,UAAU,OAAO,EACjB,UAAU,mBAAmB,KAC5B,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CA2BhC,CAAC"}
|