@ontrails/core 1.0.0-beta.14 → 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 +11 -0
- package/README.md +17 -13
- 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/draft.d.ts +5 -5
- package/dist/draft.d.ts.map +1 -1
- package/dist/draft.js +28 -27
- package/dist/draft.js.map +1 -1
- 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 +31 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -13
- 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 +8 -2
- package/dist/internal/topo-saves.d.ts.map +1 -1
- package/dist/internal/topo-saves.js +162 -23
- package/dist/internal/topo-saves.js.map +1 -1
- 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 +23 -20
- package/dist/internal/topo-store-read.d.ts.map +1 -1
- package/dist/internal/topo-store-read.js +82 -83
- package/dist/internal/topo-store-read.js.map +1 -1
- package/dist/internal/topo-store.d.ts +19 -5
- package/dist/internal/topo-store.d.ts.map +1 -1
- package/dist/internal/topo-store.js +174 -124
- package/dist/internal/topo-store.js.map +1 -1
- 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 +2 -2
- package/dist/internal/trails-db.d.ts.map +1 -1
- package/dist/internal/trails-db.js +8 -8
- package/dist/internal/trails-db.js.map +1 -1
- 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 +36 -22
- package/dist/topo-store.d.ts.map +1 -1
- package/dist/topo-store.js +215 -71
- package/dist/topo-store.js.map +1 -1
- 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.js +2 -2
- package/dist/validate-established-topo.js.map +1 -1
- package/dist/validate-topo.d.ts.map +1 -1
- package/dist/validate-topo.js +24 -7
- 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 +8 -2
- 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__/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 +41 -36
- package/src/__tests__/topo-store.test.ts +493 -93
- package/src/__tests__/topo.test.ts +350 -54
- package/src/__tests__/trail.test.ts +189 -24
- package/src/__tests__/trails-db.test.ts +32 -25
- 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 +147 -25
- 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/draft.ts +56 -52
- package/src/errors.ts +62 -18
- package/src/execute.ts +840 -29
- package/src/fire.ts +295 -0
- package/src/index.ts +116 -29
- 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 +140 -132
- package/src/internal/topo-store.ts +291 -186
- package/src/internal/tracing.ts +187 -0
- package/src/internal/trails-db.ts +9 -11
- 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 +313 -104
- 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 +2 -2
- package/src/validate-topo.ts +32 -8
- 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/internal/topo-saves.ts +0 -429
- package/src/provision.ts +0 -148
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { getContourReferences } from '../contour.js';
|
|
1
2
|
import { deriveCliPath } from '../derive.js';
|
|
2
3
|
import { Result } from '../result.js';
|
|
3
4
|
import { validateEstablishedTopo } from '../validate-established-topo.js';
|
|
4
5
|
import { zodToJsonSchema } from '../validation.js';
|
|
5
|
-
import {
|
|
6
|
+
import { ensureTopoSnapshotSchema, insertTopoSnapshotRecord, } from './topo-snapshots.js';
|
|
6
7
|
const canonicalLeaf = (value) => {
|
|
7
8
|
switch (typeof value) {
|
|
8
9
|
case 'bigint': {
|
|
@@ -100,7 +101,7 @@ const sortKeys = (value) => {
|
|
|
100
101
|
}
|
|
101
102
|
return sorted;
|
|
102
103
|
};
|
|
103
|
-
const normalizeTrailRows = (trails,
|
|
104
|
+
const normalizeTrailRows = (trails, snapshotId) => trails.map((trail) => ({
|
|
104
105
|
description: trail.description ?? null,
|
|
105
106
|
exampleCount: trail.examples?.length ?? 0,
|
|
106
107
|
hasExamples: (trail.examples?.length ?? 0) > 0 ? 1 : 0,
|
|
@@ -109,89 +110,105 @@ const normalizeTrailRows = (trails, saveId) => trails.map((trail) => ({
|
|
|
109
110
|
idempotent: trail.idempotent === true ? 1 : 0,
|
|
110
111
|
intent: trail.intent,
|
|
111
112
|
meta: trail.meta === undefined ? null : stableJson(trail.meta),
|
|
112
|
-
|
|
113
|
+
pattern: trail.pattern ?? null,
|
|
114
|
+
snapshotId,
|
|
113
115
|
}));
|
|
114
|
-
const normalizeCrossingRows = (trails,
|
|
115
|
-
|
|
116
|
+
const normalizeCrossingRows = (trails, snapshotId) => trails.flatMap((trail) => [...new Set(trail.crosses)].toSorted().map((targetId) => ({
|
|
117
|
+
snapshotId,
|
|
116
118
|
sourceId: trail.id,
|
|
117
119
|
targetId,
|
|
118
120
|
})));
|
|
119
|
-
const
|
|
121
|
+
export const normalizeFiresRows = (trails, snapshotId) => trails.flatMap((trail) => [...new Set(trail.fires)].toSorted().map((signalId) => ({
|
|
122
|
+
signalId,
|
|
123
|
+
snapshotId,
|
|
124
|
+
trailId: trail.id,
|
|
125
|
+
})));
|
|
126
|
+
export const normalizeOnRows = (trails, snapshotId) => trails.flatMap((trail) => [...new Set(trail.on)].toSorted().map((signalId) => ({
|
|
127
|
+
signalId,
|
|
128
|
+
snapshotId,
|
|
129
|
+
trailId: trail.id,
|
|
130
|
+
})));
|
|
131
|
+
const normalizeTrailResourceRows = (trails, snapshotId) => trails.flatMap((trail) => [...new Set(trail.resources.map((resource) => resource.id))]
|
|
120
132
|
.toSorted()
|
|
121
|
-
.map((
|
|
122
|
-
|
|
123
|
-
|
|
133
|
+
.map((resourceId) => ({
|
|
134
|
+
resourceId,
|
|
135
|
+
snapshotId,
|
|
124
136
|
trailId: trail.id,
|
|
125
137
|
})));
|
|
126
|
-
const
|
|
127
|
-
hasHealth:
|
|
128
|
-
hasMock:
|
|
129
|
-
id:
|
|
130
|
-
|
|
138
|
+
const normalizeResourceRows = (resources, snapshotId) => resources.map((resource) => ({
|
|
139
|
+
hasHealth: resource.health === undefined ? 0 : 1,
|
|
140
|
+
hasMock: resource.mock === undefined ? 0 : 1,
|
|
141
|
+
id: resource.id,
|
|
142
|
+
snapshotId,
|
|
131
143
|
}));
|
|
132
|
-
const normalizeSignalRows = (signals,
|
|
144
|
+
const normalizeSignalRows = (signals, snapshotId) => signals.map((signal) => ({
|
|
133
145
|
description: signal.description ?? null,
|
|
134
146
|
id: signal.id,
|
|
135
|
-
|
|
147
|
+
snapshotId,
|
|
136
148
|
}));
|
|
137
|
-
const normalizeTrailSignalRows = (signals,
|
|
138
|
-
saveId,
|
|
149
|
+
const normalizeTrailSignalRows = (signals, snapshotId) => signals.flatMap((signal) => [...new Set(signal.from)].toSorted().map((trailId) => ({
|
|
139
150
|
signalId: signal.id,
|
|
151
|
+
snapshotId,
|
|
140
152
|
trailId,
|
|
141
153
|
})));
|
|
142
154
|
/**
|
|
143
|
-
* Project
|
|
155
|
+
* Project surface rows for stored topo.
|
|
144
156
|
*
|
|
145
|
-
* Currently records only CLI-derived rows. MCP, HTTP, and other
|
|
157
|
+
* Currently records only CLI-derived rows. MCP, HTTP, and other surface
|
|
146
158
|
* projections are intentionally deferred until the topo-store schema supports
|
|
147
|
-
* multi-
|
|
159
|
+
* multi-surface representation. The JSON export (`surface_map` in
|
|
148
160
|
* `topo_exports`) is more faithful for now. See ADR-0015 for the target shape.
|
|
149
161
|
*/
|
|
150
|
-
const
|
|
162
|
+
const normalizeSurfaceRows = (trails, snapshotId) => trails.map((trail) => ({
|
|
151
163
|
derivedName: deriveCliPath(trail.id).join(' '),
|
|
152
164
|
method: null,
|
|
153
|
-
|
|
165
|
+
snapshotId,
|
|
166
|
+
surface: 'cli',
|
|
154
167
|
trailId: trail.id,
|
|
155
|
-
trailhead: 'cli',
|
|
156
168
|
}));
|
|
157
|
-
const buildExampleId = (
|
|
158
|
-
const normalizeExampleRows = (trails,
|
|
169
|
+
const buildExampleId = (snapshotId, trailId, ordinal) => `${snapshotId}:${trailId}:${ordinal.toString().padStart(4, '0')}`;
|
|
170
|
+
const normalizeExampleRows = (trails, snapshotId) => trails.flatMap((trail) => (trail.examples ?? []).map((example, index) => ({
|
|
159
171
|
description: example.description ?? null,
|
|
160
172
|
error: example.error ?? null,
|
|
161
173
|
expected: example.expected === undefined ? null : stableJson(example.expected),
|
|
162
|
-
|
|
174
|
+
expectedMatch: example.expectedMatch === undefined
|
|
175
|
+
? null
|
|
176
|
+
: stableJson(example.expectedMatch),
|
|
177
|
+
id: buildExampleId(snapshotId, trail.id, index),
|
|
163
178
|
input: stableJson(example.input),
|
|
164
179
|
name: example.name,
|
|
165
180
|
ordinal: index,
|
|
166
|
-
|
|
181
|
+
snapshotId,
|
|
167
182
|
trailId: trail.id,
|
|
168
183
|
})));
|
|
169
|
-
const normalizeTopoProjection = (topo,
|
|
184
|
+
const normalizeTopoProjection = (topo, snapshotId) => {
|
|
170
185
|
const trails = topo.list().toSorted((a, b) => a.id.localeCompare(b.id));
|
|
171
|
-
const
|
|
172
|
-
.
|
|
186
|
+
const resources = topo
|
|
187
|
+
.listResources()
|
|
173
188
|
.toSorted((a, b) => a.id.localeCompare(b.id));
|
|
174
189
|
const signals = topo
|
|
175
190
|
.listSignals()
|
|
176
191
|
.toSorted((a, b) => a.id.localeCompare(b.id));
|
|
177
192
|
return {
|
|
178
|
-
crossings: normalizeCrossingRows(trails,
|
|
179
|
-
examples: normalizeExampleRows(trails,
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
193
|
+
crossings: normalizeCrossingRows(trails, snapshotId),
|
|
194
|
+
examples: normalizeExampleRows(trails, snapshotId),
|
|
195
|
+
fires: normalizeFiresRows(trails, snapshotId),
|
|
196
|
+
on: normalizeOnRows(trails, snapshotId),
|
|
197
|
+
resources: normalizeResourceRows(resources, snapshotId),
|
|
198
|
+
signals: normalizeSignalRows(signals, snapshotId),
|
|
199
|
+
surfaces: normalizeSurfaceRows(trails, snapshotId),
|
|
200
|
+
trailResources: normalizeTrailResourceRows(trails, snapshotId),
|
|
201
|
+
trailSignals: normalizeTrailSignalRows(signals, snapshotId),
|
|
202
|
+
trails: normalizeTrailRows(trails, snapshotId),
|
|
186
203
|
};
|
|
187
204
|
};
|
|
188
205
|
/**
|
|
189
206
|
* Look up a cached JSON schema by content hash.
|
|
190
207
|
*
|
|
191
|
-
* The query matches on `zod_hash` without filtering by `
|
|
192
|
-
* cache is intentionally cross-
|
|
208
|
+
* The query matches on `zod_hash` without filtering by `snapshot_id` because the
|
|
209
|
+
* cache is intentionally cross-snapshot: if the Zod schema definition has not
|
|
193
210
|
* changed (same hash), the serialized JSON Schema is reused regardless of
|
|
194
|
-
* which
|
|
211
|
+
* which snapshot produced it. This is safe as long as `zodToJsonSchema` is
|
|
195
212
|
* deterministic for a given `_def` hash — the `schemaDefinitionHash` pipeline
|
|
196
213
|
* guarantees that structurally identical schemas produce the same hash.
|
|
197
214
|
*/
|
|
@@ -207,7 +224,7 @@ const readCachedJsonSchema = (db, ownerId, ownerKind, schemaKind, zodHash) => {
|
|
|
207
224
|
.get(ownerId, ownerKind, schemaKind, zodHash);
|
|
208
225
|
return row?.json_schema;
|
|
209
226
|
};
|
|
210
|
-
const resolveSchemaRow = (db, ownerId, ownerKind,
|
|
227
|
+
const resolveSchemaRow = (db, ownerId, ownerKind, snapshotId, schemaKind, schema) => {
|
|
211
228
|
const zodHash = schemaDefinitionHash(schema);
|
|
212
229
|
const cachedJson = readCachedJsonSchema(db, ownerId, ownerKind, schemaKind, zodHash);
|
|
213
230
|
if (cachedJson !== undefined) {
|
|
@@ -216,8 +233,8 @@ const resolveSchemaRow = (db, ownerId, ownerKind, saveId, schemaKind, schema) =>
|
|
|
216
233
|
jsonSchema: cachedJson,
|
|
217
234
|
ownerId,
|
|
218
235
|
ownerKind,
|
|
219
|
-
saveId,
|
|
220
236
|
schemaKind,
|
|
237
|
+
snapshotId,
|
|
221
238
|
zodHash,
|
|
222
239
|
},
|
|
223
240
|
value: parseJsonRecord(cachedJson),
|
|
@@ -229,15 +246,15 @@ const resolveSchemaRow = (db, ownerId, ownerKind, saveId, schemaKind, schema) =>
|
|
|
229
246
|
jsonSchema: generated.json,
|
|
230
247
|
ownerId,
|
|
231
248
|
ownerKind,
|
|
232
|
-
saveId,
|
|
233
249
|
schemaKind,
|
|
250
|
+
snapshotId,
|
|
234
251
|
zodHash,
|
|
235
252
|
},
|
|
236
253
|
value: generated.value,
|
|
237
254
|
};
|
|
238
255
|
};
|
|
239
|
-
const materializeTrailSchema = (db,
|
|
240
|
-
const inputSchema = resolveSchemaRow(db, trail.id, 'trail',
|
|
256
|
+
const materializeTrailSchema = (db, snapshotId, trail) => {
|
|
257
|
+
const inputSchema = resolveSchemaRow(db, trail.id, 'trail', snapshotId, 'input', trail.input);
|
|
241
258
|
if (trail.output === undefined) {
|
|
242
259
|
return {
|
|
243
260
|
rows: [inputSchema.row],
|
|
@@ -246,7 +263,7 @@ const materializeTrailSchema = (db, saveId, trail) => {
|
|
|
246
263
|
},
|
|
247
264
|
};
|
|
248
265
|
}
|
|
249
|
-
const outputSchema = resolveSchemaRow(db, trail.id, 'trail',
|
|
266
|
+
const outputSchema = resolveSchemaRow(db, trail.id, 'trail', snapshotId, 'output', trail.output);
|
|
250
267
|
return {
|
|
251
268
|
rows: [inputSchema.row, outputSchema.row],
|
|
252
269
|
value: {
|
|
@@ -255,11 +272,11 @@ const materializeTrailSchema = (db, saveId, trail) => {
|
|
|
255
272
|
},
|
|
256
273
|
};
|
|
257
274
|
};
|
|
258
|
-
const materializeTrailSchemas = (db,
|
|
275
|
+
const materializeTrailSchemas = (db, snapshotId, trails) => {
|
|
259
276
|
const rows = [];
|
|
260
277
|
const trailSchemas = new Map();
|
|
261
278
|
for (const trail of trails) {
|
|
262
|
-
const materialized = materializeTrailSchema(db,
|
|
279
|
+
const materialized = materializeTrailSchema(db, snapshotId, trail);
|
|
263
280
|
rows.push(...materialized.rows);
|
|
264
281
|
trailSchemas.set(trail.id, materialized.value);
|
|
265
282
|
}
|
|
@@ -268,11 +285,11 @@ const materializeTrailSchemas = (db, saveId, trails) => {
|
|
|
268
285
|
trailSchemas,
|
|
269
286
|
};
|
|
270
287
|
};
|
|
271
|
-
const materializeSignalSchemas = (db,
|
|
288
|
+
const materializeSignalSchemas = (db, snapshotId, signals) => {
|
|
272
289
|
const rows = [];
|
|
273
290
|
const signalPayloads = new Map();
|
|
274
291
|
for (const signal of signals) {
|
|
275
|
-
const payloadSchema = resolveSchemaRow(db, signal.id, 'signal',
|
|
292
|
+
const payloadSchema = resolveSchemaRow(db, signal.id, 'signal', snapshotId, 'payload', signal.payload);
|
|
276
293
|
rows.push(payloadSchema.row);
|
|
277
294
|
signalPayloads.set(signal.id, payloadSchema.value);
|
|
278
295
|
}
|
|
@@ -281,9 +298,9 @@ const materializeSignalSchemas = (db, saveId, signals) => {
|
|
|
281
298
|
signalPayloads,
|
|
282
299
|
};
|
|
283
300
|
};
|
|
284
|
-
const materializeSchemas = (db,
|
|
285
|
-
const trailMaterial = materializeTrailSchemas(db,
|
|
286
|
-
const signalMaterial = materializeSignalSchemas(db,
|
|
301
|
+
const materializeSchemas = (db, snapshotId, signals, trails) => {
|
|
302
|
+
const trailMaterial = materializeTrailSchemas(db, snapshotId, trails);
|
|
303
|
+
const signalMaterial = materializeSignalSchemas(db, snapshotId, signals);
|
|
287
304
|
return {
|
|
288
305
|
rows: [...trailMaterial.rows, ...signalMaterial.rows],
|
|
289
306
|
signalPayloads: signalMaterial.signalPayloads,
|
|
@@ -308,21 +325,25 @@ const addExtendedMetadata = (entry, raw, trail) => {
|
|
|
308
325
|
if (typeof raw['replacedBy'] === 'string') {
|
|
309
326
|
entry['replacedBy'] = raw['replacedBy'];
|
|
310
327
|
}
|
|
311
|
-
if (trail.detours
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
entry['detours'] = detours;
|
|
328
|
+
if (trail.detours.length > 0) {
|
|
329
|
+
entry['detours'] = trail.detours.map((d) => ({
|
|
330
|
+
maxAttempts: Math.max(1, Math.min(d.maxAttempts ?? 1, 5)),
|
|
331
|
+
on: d.on.name,
|
|
332
|
+
}));
|
|
317
333
|
}
|
|
318
334
|
};
|
|
319
335
|
const addTrailRelations = (entry, trail) => {
|
|
320
336
|
if (trail.crosses.length > 0) {
|
|
321
337
|
entry['crosses'] = trail.crosses.toSorted();
|
|
322
338
|
}
|
|
323
|
-
if (trail.
|
|
324
|
-
entry['
|
|
325
|
-
.map((
|
|
339
|
+
if (trail.contours.length > 0) {
|
|
340
|
+
entry['contours'] = trail.contours
|
|
341
|
+
.map((contour) => contour.name)
|
|
342
|
+
.toSorted();
|
|
343
|
+
}
|
|
344
|
+
if (trail.resources.length > 0) {
|
|
345
|
+
entry['resources'] = trail.resources
|
|
346
|
+
.map((resource) => resource.id)
|
|
326
347
|
.toSorted();
|
|
327
348
|
}
|
|
328
349
|
};
|
|
@@ -342,6 +363,9 @@ const buildTrailEntryBase = (trail, trailSchema) => {
|
|
|
342
363
|
if (trail.description !== undefined) {
|
|
343
364
|
entry['description'] = trail.description;
|
|
344
365
|
}
|
|
366
|
+
if (trail.pattern !== undefined) {
|
|
367
|
+
entry['pattern'] = trail.pattern;
|
|
368
|
+
}
|
|
345
369
|
return {
|
|
346
370
|
entry,
|
|
347
371
|
raw,
|
|
@@ -374,21 +398,37 @@ const signalToEntryRecord = (signal, payloadSchema) => {
|
|
|
374
398
|
}
|
|
375
399
|
return sortKeys(entry);
|
|
376
400
|
};
|
|
377
|
-
const
|
|
401
|
+
const resourceToEntryRecord = (resource) => {
|
|
378
402
|
const entry = {
|
|
379
403
|
exampleCount: 0,
|
|
380
|
-
id:
|
|
381
|
-
kind: '
|
|
404
|
+
id: resource.id,
|
|
405
|
+
kind: 'resource',
|
|
382
406
|
trailheads: [],
|
|
383
407
|
};
|
|
384
|
-
if (
|
|
385
|
-
entry['description'] =
|
|
408
|
+
if (resource.description !== undefined) {
|
|
409
|
+
entry['description'] = resource.description;
|
|
386
410
|
}
|
|
387
|
-
if (
|
|
411
|
+
if (resource.health !== undefined) {
|
|
388
412
|
entry['healthcheck'] = true;
|
|
389
413
|
}
|
|
390
414
|
return sortKeys(entry);
|
|
391
415
|
};
|
|
416
|
+
const contourToEntryRecord = (contour) => {
|
|
417
|
+
const schema = sortedJsonSchema(contour);
|
|
418
|
+
const entry = {
|
|
419
|
+
exampleCount: contour.examples?.length ?? 0,
|
|
420
|
+
id: contour.name,
|
|
421
|
+
identity: contour.identity,
|
|
422
|
+
kind: 'contour',
|
|
423
|
+
schema: schema.value,
|
|
424
|
+
trailheads: [],
|
|
425
|
+
};
|
|
426
|
+
const references = getContourReferences(contour);
|
|
427
|
+
if (references.length > 0) {
|
|
428
|
+
entry['references'] = references;
|
|
429
|
+
}
|
|
430
|
+
return sortKeys(entry);
|
|
431
|
+
};
|
|
392
432
|
const requireTrailSchema = (trailSchemas, trailId) => {
|
|
393
433
|
const schema = trailSchemas.get(trailId);
|
|
394
434
|
if (schema === undefined) {
|
|
@@ -403,11 +443,12 @@ const requireSignalPayload = (signalPayloads, signalId) => {
|
|
|
403
443
|
}
|
|
404
444
|
return payload;
|
|
405
445
|
};
|
|
406
|
-
const
|
|
446
|
+
const buildSurfaceMap = (contours, generatedAt, resources, signalPayloads, signals, trailSchemas, trails) => {
|
|
407
447
|
const entries = [
|
|
448
|
+
...contours.map((contour) => contourToEntryRecord(contour)),
|
|
408
449
|
...trails.map((trail) => trailToEntryRecord(trail, requireTrailSchema(trailSchemas, trail.id))),
|
|
409
450
|
...signals.map((signal) => signalToEntryRecord(signal, requireSignalPayload(signalPayloads, signal.id))),
|
|
410
|
-
...
|
|
451
|
+
...resources.map((resource) => resourceToEntryRecord(resource)),
|
|
411
452
|
].toSorted((a, b) => a.id.localeCompare(b.id));
|
|
412
453
|
return {
|
|
413
454
|
entries,
|
|
@@ -415,8 +456,8 @@ const buildTrailheadMap = (generatedAt, provisions, signalPayloads, signals, tra
|
|
|
415
456
|
version: '1.0',
|
|
416
457
|
};
|
|
417
458
|
};
|
|
418
|
-
const
|
|
419
|
-
const { generatedAt: _unused, ...rest } =
|
|
459
|
+
const hashSurfaceMapRecord = (surfaceMap) => {
|
|
460
|
+
const { generatedAt: _unused, ...rest } = surfaceMap;
|
|
420
461
|
return hashValue(rest);
|
|
421
462
|
};
|
|
422
463
|
const entryPayload = (entry) => {
|
|
@@ -426,36 +467,40 @@ const entryPayload = (entry) => {
|
|
|
426
467
|
const entriesForKind = (entries, kind) => Object.fromEntries(entries
|
|
427
468
|
.filter((entry) => entry.kind === kind)
|
|
428
469
|
.map((entry) => [entry.id, entryPayload(entry)]));
|
|
429
|
-
const buildSerializedLock = (hash, topo,
|
|
470
|
+
const buildSerializedLock = (hash, topo, surfaceMap) => sortKeys({
|
|
430
471
|
apps: sortKeys({
|
|
431
472
|
[topo.name]: sortKeys({
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
473
|
+
contours: entriesForKind(surfaceMap.entries, 'contour'),
|
|
474
|
+
resources: entriesForKind(surfaceMap.entries, 'resource'),
|
|
475
|
+
signals: entriesForKind(surfaceMap.entries, 'signal'),
|
|
476
|
+
trails: entriesForKind(surfaceMap.entries, 'trail'),
|
|
435
477
|
}),
|
|
436
478
|
}),
|
|
437
|
-
generatedAt:
|
|
479
|
+
generatedAt: surfaceMap.generatedAt,
|
|
438
480
|
hash,
|
|
439
481
|
version: 1,
|
|
440
482
|
});
|
|
441
|
-
const buildStoredTopoExport = (db,
|
|
483
|
+
const buildStoredTopoExport = (db, snapshot, topo) => {
|
|
484
|
+
const contours = topo
|
|
485
|
+
.listContours()
|
|
486
|
+
.toSorted((a, b) => a.name.localeCompare(b.name));
|
|
442
487
|
const trails = topo.list().toSorted((a, b) => a.id.localeCompare(b.id));
|
|
443
|
-
const
|
|
444
|
-
.
|
|
488
|
+
const resources = topo
|
|
489
|
+
.listResources()
|
|
445
490
|
.toSorted((a, b) => a.id.localeCompare(b.id));
|
|
446
491
|
const signals = topo
|
|
447
492
|
.listSignals()
|
|
448
493
|
.toSorted((a, b) => a.id.localeCompare(b.id));
|
|
449
|
-
const schemas = materializeSchemas(db,
|
|
450
|
-
const
|
|
451
|
-
const
|
|
452
|
-
const serializedLock = `${JSON.stringify(buildSerializedLock(
|
|
494
|
+
const schemas = materializeSchemas(db, snapshot.id, signals, trails);
|
|
495
|
+
const surfaceMap = buildSurfaceMap(contours, snapshot.createdAt, resources, schemas.signalPayloads, signals, schemas.trailSchemas, trails);
|
|
496
|
+
const surfaceHash = hashSurfaceMapRecord(surfaceMap);
|
|
497
|
+
const serializedLock = `${JSON.stringify(buildSerializedLock(surfaceHash, topo, surfaceMap), null, 2)}\n`;
|
|
453
498
|
return {
|
|
454
499
|
exportRow: {
|
|
455
|
-
saveId: save.id,
|
|
456
500
|
serializedLock,
|
|
457
|
-
|
|
458
|
-
|
|
501
|
+
snapshotId: snapshot.id,
|
|
502
|
+
surfaceHash,
|
|
503
|
+
surfaceMap: `${JSON.stringify(surfaceMap, null, 2)}\n`,
|
|
459
504
|
},
|
|
460
505
|
schemaRows: schemas.rows,
|
|
461
506
|
};
|
|
@@ -467,8 +512,8 @@ const insertRows = (db, rows, statement, toParams) => {
|
|
|
467
512
|
};
|
|
468
513
|
const insertProjectedRows = (db, projection) => {
|
|
469
514
|
insertRows(db, projection.trails, `INSERT INTO topo_trails (
|
|
470
|
-
id, intent, idempotent, has_output, has_examples, example_count, description, meta,
|
|
471
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, (row) => [
|
|
515
|
+
id, intent, idempotent, has_output, has_examples, example_count, description, pattern, meta, snapshot_id
|
|
516
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, (row) => [
|
|
472
517
|
row.id,
|
|
473
518
|
row.intent,
|
|
474
519
|
row.idempotent,
|
|
@@ -476,27 +521,32 @@ const insertProjectedRows = (db, projection) => {
|
|
|
476
521
|
row.hasExamples,
|
|
477
522
|
row.exampleCount,
|
|
478
523
|
row.description,
|
|
524
|
+
row.pattern,
|
|
479
525
|
row.meta,
|
|
480
|
-
row.
|
|
526
|
+
row.snapshotId,
|
|
481
527
|
]);
|
|
482
|
-
insertRows(db, projection.crossings, 'INSERT INTO topo_crossings (source_id, target_id,
|
|
483
|
-
insertRows(db, projection.
|
|
484
|
-
VALUES (?, ?, ?)`, (row) => [row.trailId, row.
|
|
485
|
-
insertRows(db, projection.
|
|
486
|
-
VALUES (?, ?, ?, ?)`, (row) => [row.id, row.hasMock, row.hasHealth, row.
|
|
487
|
-
insertRows(db, projection.signals, 'INSERT INTO topo_signals (id, description,
|
|
488
|
-
insertRows(db, projection.trailSignals, `INSERT INTO topo_trail_signals (trail_id, signal_id,
|
|
489
|
-
VALUES (?, ?, ?)`, (row) => [row.trailId, row.signalId, row.
|
|
490
|
-
insertRows(db, projection.
|
|
528
|
+
insertRows(db, projection.crossings, 'INSERT INTO topo_crossings (source_id, target_id, snapshot_id) VALUES (?, ?, ?)', (row) => [row.sourceId, row.targetId, row.snapshotId]);
|
|
529
|
+
insertRows(db, projection.trailResources, `INSERT INTO topo_trail_resources (trail_id, resource_id, snapshot_id)
|
|
530
|
+
VALUES (?, ?, ?)`, (row) => [row.trailId, row.resourceId, row.snapshotId]);
|
|
531
|
+
insertRows(db, projection.resources, `INSERT INTO topo_resources (id, has_mock, has_health, snapshot_id)
|
|
532
|
+
VALUES (?, ?, ?, ?)`, (row) => [row.id, row.hasMock, row.hasHealth, row.snapshotId]);
|
|
533
|
+
insertRows(db, projection.signals, 'INSERT INTO topo_signals (id, description, snapshot_id) VALUES (?, ?, ?)', (row) => [row.id, row.description, row.snapshotId]);
|
|
534
|
+
insertRows(db, projection.trailSignals, `INSERT INTO topo_trail_signals (trail_id, signal_id, snapshot_id)
|
|
535
|
+
VALUES (?, ?, ?)`, (row) => [row.trailId, row.signalId, row.snapshotId]);
|
|
536
|
+
insertRows(db, projection.fires, `INSERT INTO topo_trail_fires (trail_id, signal_id, snapshot_id)
|
|
537
|
+
VALUES (?, ?, ?)`, (row) => [row.trailId, row.signalId, row.snapshotId]);
|
|
538
|
+
insertRows(db, projection.on, `INSERT INTO topo_trail_on (trail_id, signal_id, snapshot_id)
|
|
539
|
+
VALUES (?, ?, ?)`, (row) => [row.trailId, row.signalId, row.snapshotId]);
|
|
540
|
+
insertRows(db, projection.surfaces, `INSERT INTO topo_surfaces (trail_id, surface, derived_name, method, snapshot_id)
|
|
491
541
|
VALUES (?, ?, ?, ?, ?)`, (row) => [
|
|
492
542
|
row.trailId,
|
|
493
|
-
row.
|
|
543
|
+
row.surface,
|
|
494
544
|
row.derivedName,
|
|
495
545
|
row.method,
|
|
496
|
-
row.
|
|
546
|
+
row.snapshotId,
|
|
497
547
|
]);
|
|
498
548
|
insertRows(db, projection.examples, `INSERT INTO topo_examples (
|
|
499
|
-
id, trail_id, ordinal, name, description, input, expected, error,
|
|
549
|
+
id, trail_id, ordinal, name, description, input, expected, error, snapshot_id
|
|
500
550
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, (row) => [
|
|
501
551
|
row.id,
|
|
502
552
|
row.trailId,
|
|
@@ -506,66 +556,66 @@ const insertProjectedRows = (db, projection) => {
|
|
|
506
556
|
row.input,
|
|
507
557
|
row.expected,
|
|
508
558
|
row.error,
|
|
509
|
-
row.
|
|
559
|
+
row.snapshotId,
|
|
510
560
|
]);
|
|
511
561
|
};
|
|
512
562
|
const insertSchemaRows = (db, rows) => {
|
|
513
563
|
insertRows(db, rows, `INSERT INTO topo_schemas (
|
|
514
|
-
owner_id, owner_kind, schema_kind, zod_hash, json_schema,
|
|
564
|
+
owner_id, owner_kind, schema_kind, zod_hash, json_schema, snapshot_id
|
|
515
565
|
) VALUES (?, ?, ?, ?, ?, ?)`, (row) => [
|
|
516
566
|
row.ownerId,
|
|
517
567
|
row.ownerKind,
|
|
518
568
|
row.schemaKind,
|
|
519
569
|
row.zodHash,
|
|
520
570
|
row.jsonSchema,
|
|
521
|
-
row.
|
|
571
|
+
row.snapshotId,
|
|
522
572
|
]);
|
|
523
573
|
};
|
|
524
574
|
const insertStoredExport = (db, exportRow) => {
|
|
525
575
|
db.run(`INSERT INTO topo_exports (
|
|
526
|
-
|
|
576
|
+
snapshot_id, surface_map, surface_hash, serialized_lock
|
|
527
577
|
) VALUES (?, ?, ?, ?)`, [
|
|
528
|
-
exportRow.
|
|
529
|
-
exportRow.
|
|
530
|
-
exportRow.
|
|
578
|
+
exportRow.snapshotId,
|
|
579
|
+
exportRow.surfaceMap,
|
|
580
|
+
exportRow.surfaceHash,
|
|
531
581
|
exportRow.serializedLock,
|
|
532
582
|
]);
|
|
533
583
|
};
|
|
534
|
-
export const getStoredTopoExport = (db,
|
|
584
|
+
export const getStoredTopoExport = (db, snapshotId) => {
|
|
535
585
|
const row = db
|
|
536
|
-
.query(`SELECT
|
|
586
|
+
.query(`SELECT surface_map, surface_hash, serialized_lock
|
|
537
587
|
FROM topo_exports
|
|
538
|
-
WHERE
|
|
539
|
-
.get(
|
|
588
|
+
WHERE snapshot_id = ?`)
|
|
589
|
+
.get(snapshotId);
|
|
540
590
|
if (row === undefined || row === null) {
|
|
541
591
|
return undefined;
|
|
542
592
|
}
|
|
543
593
|
return {
|
|
544
594
|
lockContent: row.serialized_lock,
|
|
545
|
-
|
|
546
|
-
|
|
595
|
+
surfaceHash: row.surface_hash,
|
|
596
|
+
surfaceMapJson: row.surface_map,
|
|
547
597
|
};
|
|
548
598
|
};
|
|
549
|
-
export const
|
|
599
|
+
export const createTopoSnapshot = (db, topo, input) => {
|
|
550
600
|
const validated = validateEstablishedTopo(topo);
|
|
551
601
|
if (validated.isErr()) {
|
|
552
602
|
return Result.err(validated.error);
|
|
553
603
|
}
|
|
554
|
-
|
|
555
|
-
const
|
|
604
|
+
ensureTopoSnapshotSchema(db);
|
|
605
|
+
const snapshotInput = {
|
|
556
606
|
...input,
|
|
557
|
-
|
|
607
|
+
resourceCount: input?.resourceCount ?? topo.resources.size,
|
|
558
608
|
signalCount: input?.signalCount ?? topo.signals.size,
|
|
559
609
|
trailCount: input?.trailCount ?? topo.trails.size,
|
|
560
610
|
};
|
|
561
|
-
const
|
|
562
|
-
const record =
|
|
611
|
+
const snapshot = db.transaction(() => {
|
|
612
|
+
const record = insertTopoSnapshotRecord(db, snapshotInput);
|
|
563
613
|
const artifacts = buildStoredTopoExport(db, record, topo);
|
|
564
614
|
insertProjectedRows(db, normalizeTopoProjection(topo, record.id));
|
|
565
615
|
insertSchemaRows(db, artifacts.schemaRows);
|
|
566
616
|
insertStoredExport(db, artifacts.exportRow);
|
|
567
617
|
return record;
|
|
568
618
|
})();
|
|
569
|
-
return Result.ok(
|
|
619
|
+
return Result.ok(snapshot);
|
|
570
620
|
};
|
|
571
621
|
//# sourceMappingURL=topo-store.js.map
|