@graphrefly/ts 0.0.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/LICENSE +21 -0
- package/dist/adapters/index.cjs +9015 -0
- package/dist/adapters/index.cjs.map +1 -0
- package/dist/adapters/index.d.cts +678 -0
- package/dist/adapters/index.d.ts +678 -0
- package/dist/adapters/index.js +2894 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/observe-storage.cjs +260 -0
- package/dist/adapters/observe-storage.cjs.map +1 -0
- package/dist/adapters/observe-storage.d.cts +77 -0
- package/dist/adapters/observe-storage.d.ts +77 -0
- package/dist/adapters/observe-storage.js +161 -0
- package/dist/adapters/observe-storage.js.map +1 -0
- package/dist/append-log-DisvEReb.d.cts +189 -0
- package/dist/append-log-DzKMmjxx.d.ts +189 -0
- package/dist/chunk-2ILL7HQI.js +1189 -0
- package/dist/chunk-2ILL7HQI.js.map +1 -0
- package/dist/chunk-4VLAQHZI.js +330 -0
- package/dist/chunk-4VLAQHZI.js.map +1 -0
- package/dist/chunk-6PHB5CJS.js +229 -0
- package/dist/chunk-6PHB5CJS.js.map +1 -0
- package/dist/chunk-COHO25CZ.js +2449 -0
- package/dist/chunk-COHO25CZ.js.map +1 -0
- package/dist/chunk-D6BG7U6A.js +161 -0
- package/dist/chunk-D6BG7U6A.js.map +1 -0
- package/dist/chunk-DJC4CHLQ.js +818 -0
- package/dist/chunk-DJC4CHLQ.js.map +1 -0
- package/dist/chunk-DK554R7P.js +67 -0
- package/dist/chunk-DK554R7P.js.map +1 -0
- package/dist/chunk-DKP56CSW.js +322 -0
- package/dist/chunk-DKP56CSW.js.map +1 -0
- package/dist/chunk-G4M3NHRJ.js +688 -0
- package/dist/chunk-G4M3NHRJ.js.map +1 -0
- package/dist/chunk-GAJW5I5P.js +1 -0
- package/dist/chunk-GAJW5I5P.js.map +1 -0
- package/dist/chunk-GDL26N2T.js +282 -0
- package/dist/chunk-GDL26N2T.js.map +1 -0
- package/dist/chunk-GTPCOEOZ.js +741 -0
- package/dist/chunk-GTPCOEOZ.js.map +1 -0
- package/dist/chunk-H2HTHFVN.js +1 -0
- package/dist/chunk-H2HTHFVN.js.map +1 -0
- package/dist/chunk-HDRL4VQQ.js +218 -0
- package/dist/chunk-HDRL4VQQ.js.map +1 -0
- package/dist/chunk-I3IHOHCJ.js +2267 -0
- package/dist/chunk-I3IHOHCJ.js.map +1 -0
- package/dist/chunk-JIMUDQN3.js +965 -0
- package/dist/chunk-JIMUDQN3.js.map +1 -0
- package/dist/chunk-JR4IKCR2.js +462 -0
- package/dist/chunk-JR4IKCR2.js.map +1 -0
- package/dist/chunk-K3FXTC3I.js +165 -0
- package/dist/chunk-K3FXTC3I.js.map +1 -0
- package/dist/chunk-OOEN33FB.js +65 -0
- package/dist/chunk-OOEN33FB.js.map +1 -0
- package/dist/chunk-PKVBHGBM.js +554 -0
- package/dist/chunk-PKVBHGBM.js.map +1 -0
- package/dist/chunk-RIIOUTGM.js +1857 -0
- package/dist/chunk-RIIOUTGM.js.map +1 -0
- package/dist/chunk-SCRFRCGR.js +33 -0
- package/dist/chunk-SCRFRCGR.js.map +1 -0
- package/dist/chunk-SWTLEQL6.js +53 -0
- package/dist/chunk-SWTLEQL6.js.map +1 -0
- package/dist/chunk-SZAETNNA.js +1 -0
- package/dist/chunk-SZAETNNA.js.map +1 -0
- package/dist/chunk-TEW47IVR.js +49 -0
- package/dist/chunk-TEW47IVR.js.map +1 -0
- package/dist/chunk-Y3ZLRGHC.js +1482 -0
- package/dist/chunk-Y3ZLRGHC.js.map +1 -0
- package/dist/chunk-Z2ANQ6JW.js +149 -0
- package/dist/chunk-Z2ANQ6JW.js.map +1 -0
- package/dist/codec-BB7p8fJc.d.cts +38 -0
- package/dist/codec-BB7p8fJc.d.ts +38 -0
- package/dist/composition/index.cjs +2505 -0
- package/dist/composition/index.cjs.map +1 -0
- package/dist/composition/index.d.cts +95 -0
- package/dist/composition/index.d.ts +95 -0
- package/dist/composition/index.js +19 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/core/index.cjs +2475 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +25 -0
- package/dist/core/index.d.ts +25 -0
- package/dist/core/index.js +74 -0
- package/dist/core/index.js.map +1 -0
- package/dist/cqrs/index.cjs +595 -0
- package/dist/cqrs/index.cjs.map +1 -0
- package/dist/cqrs/index.d.cts +200 -0
- package/dist/cqrs/index.d.ts +200 -0
- package/dist/cqrs/index.js +557 -0
- package/dist/cqrs/index.js.map +1 -0
- package/dist/data-structures/index.cjs +4277 -0
- package/dist/data-structures/index.cjs.map +1 -0
- package/dist/data-structures/index.d.cts +22 -0
- package/dist/data-structures/index.d.ts +22 -0
- package/dist/data-structures/index.js +31 -0
- package/dist/data-structures/index.js.map +1 -0
- package/dist/describe-BZb7AS2y.d.ts +57 -0
- package/dist/describe-Ciu8SUnN.d.cts +57 -0
- package/dist/graph/index.cjs +7832 -0
- package/dist/graph/index.cjs.map +1 -0
- package/dist/graph/index.d.cts +251 -0
- package/dist/graph/index.d.ts +251 -0
- package/dist/graph/index.js +131 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph-DfdF9zy4.d.ts +666 -0
- package/dist/graph-s23RbbFO.d.cts +666 -0
- package/dist/index-CAEmLCYF.d.cts +166 -0
- package/dist/index-SnzZu3x7.d.ts +166 -0
- package/dist/index.cjs +15409 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +23 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +582 -0
- package/dist/index.js.map +1 -0
- package/dist/messages-BZqrGGm1.d.cts +55 -0
- package/dist/messages-BZqrGGm1.d.ts +55 -0
- package/dist/messaging/index.cjs +818 -0
- package/dist/messaging/index.cjs.map +1 -0
- package/dist/messaging/index.d.cts +235 -0
- package/dist/messaging/index.d.ts +235 -0
- package/dist/messaging/index.js +767 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/observe-event-log-0SVsx7JG.d.cts +88 -0
- package/dist/observe-event-log-Dnm76owp.d.ts +88 -0
- package/dist/operators/index.cjs +3774 -0
- package/dist/operators/index.cjs.map +1 -0
- package/dist/operators/index.d.cts +308 -0
- package/dist/operators/index.d.ts +308 -0
- package/dist/operators/index.js +112 -0
- package/dist/operators/index.js.map +1 -0
- package/dist/orchestration/index.cjs +3541 -0
- package/dist/orchestration/index.cjs.map +1 -0
- package/dist/orchestration/index.d.cts +302 -0
- package/dist/orchestration/index.d.ts +302 -0
- package/dist/orchestration/index.js +1004 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/patterns/index.cjs +1045 -0
- package/dist/patterns/index.cjs.map +1 -0
- package/dist/patterns/index.d.cts +39 -0
- package/dist/patterns/index.d.ts +39 -0
- package/dist/patterns/index.js +33 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/reactive-collection-BxBqtIOE.d.cts +344 -0
- package/dist/reactive-collection-Cb1II1Fi.d.ts +344 -0
- package/dist/reactive-collection-storage-BNiEc-Gd.d.ts +217 -0
- package/dist/reactive-collection-storage-D-KmjE0J.d.cts +217 -0
- package/dist/reactive-map-BcB4KsQR.d.ts +256 -0
- package/dist/reactive-map-D-g3dv8I.d.cts +256 -0
- package/dist/read-through-B1CYPfq_.d.cts +82 -0
- package/dist/read-through-DwyJhGs1.d.ts +82 -0
- package/dist/render/index.cjs +250 -0
- package/dist/render/index.cjs.map +1 -0
- package/dist/render/index.d.cts +58 -0
- package/dist/render/index.d.ts +58 -0
- package/dist/render/index.js +20 -0
- package/dist/render/index.js.map +1 -0
- package/dist/resilience-Dig3Q7n0.d.cts +45 -0
- package/dist/resilience-Dig3Q7n0.d.ts +45 -0
- package/dist/semantic-memory-graph-BYoIlP35.d.cts +356 -0
- package/dist/semantic-memory-graph-CxyXLms3.d.ts +356 -0
- package/dist/solutions/index.cjs +3249 -0
- package/dist/solutions/index.cjs.map +1 -0
- package/dist/solutions/index.d.cts +520 -0
- package/dist/solutions/index.d.ts +520 -0
- package/dist/solutions/index.js +31 -0
- package/dist/solutions/index.js.map +1 -0
- package/dist/sources/browser.cjs +3095 -0
- package/dist/sources/browser.cjs.map +1 -0
- package/dist/sources/browser.d.cts +39 -0
- package/dist/sources/browser.d.ts +39 -0
- package/dist/sources/browser.js +137 -0
- package/dist/sources/browser.js.map +1 -0
- package/dist/sources/index.cjs +3021 -0
- package/dist/sources/index.cjs.map +1 -0
- package/dist/sources/index.d.cts +7 -0
- package/dist/sources/index.d.ts +7 -0
- package/dist/sources/index.js +63 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/node.cjs +675 -0
- package/dist/sources/node.cjs.map +1 -0
- package/dist/sources/node.d.cts +109 -0
- package/dist/sources/node.d.ts +109 -0
- package/dist/sources/node.js +639 -0
- package/dist/sources/node.js.map +1 -0
- package/dist/storage/browser.cjs +777 -0
- package/dist/storage/browser.cjs.map +1 -0
- package/dist/storage/browser.d.cts +40 -0
- package/dist/storage/browser.d.ts +40 -0
- package/dist/storage/browser.js +275 -0
- package/dist/storage/browser.js.map +1 -0
- package/dist/storage/index.cjs +1989 -0
- package/dist/storage/index.cjs.map +1 -0
- package/dist/storage/index.d.cts +92 -0
- package/dist/storage/index.d.ts +92 -0
- package/dist/storage/index.js +161 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/node.cjs +898 -0
- package/dist/storage/node.cjs.map +1 -0
- package/dist/storage/node.d.cts +66 -0
- package/dist/storage/node.d.ts +66 -0
- package/dist/storage/node.js +402 -0
- package/dist/storage/node.js.map +1 -0
- package/dist/testing/index.cjs +95 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +20 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.js +8 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types-bNMSWKqF.d.cts +732 -0
- package/dist/types-h12mNYbq.d.ts +732 -0
- package/package.json +250 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/content-addressed.ts","../src/storage/reactive-collection.ts","../src/storage/wal.ts"],"sourcesContent":["import { strictCanonicalJsonBytes } from \"../json/codec.js\";\nimport type { KvStorageTier } from \"./kv.js\";\n\n/** Content-addressed KV access mode for D82 passive storage helpers. */\nexport type ContentAddressedMode = \"read\" | \"write\" | \"read-write\" | \"read-strict\";\n\n/** Error thrown when a read-strict content-addressed lookup misses. */\nexport class ContentAddressedMissError extends Error {\n\treadonly key: string;\n\treadonly context: unknown;\n\n\tconstructor(key: string, context: unknown) {\n\t\tsuper(`content-addressed lookup miss in read-strict mode: ${key}`);\n\t\tthis.name = \"ContentAddressedMissError\";\n\t\tthis.key = key;\n\t\tthis.context = context;\n\t}\n}\n\n/** Options for {@link contentAddressedKv}. */\nexport interface ContentAddressedKvOptions<Ctx, V> {\n\t/** Underlying D82 KV tier. */\n\tkv: KvStorageTier<V>;\n\t/** Select the JSON-encodable data that participates in the content key. */\n\tkeyContext?: (ctx: Ctx) => unknown;\n\t/** Optional namespace prefix for sharing one KV tier across consumers. */\n\tkeyPrefix?: string;\n\t/** Access mode. Defaults to read-write. */\n\tmode?: ContentAddressedMode;\n}\n\n/** Content-addressed helper handle over a D82 KV tier. */\nexport interface ContentAddressedKv<Ctx, V> {\n\tkeyFor(ctx: Ctx): Promise<string>;\n\tlookup(ctx: Ctx): Promise<V | undefined>;\n\tstore(ctx: Ctx, value: V): Promise<void>;\n\tforget(ctx: Ctx): Promise<void>;\n}\n\nexport type ContentAddressedStorageOptions<Ctx, V> = ContentAddressedKvOptions<Ctx, V>;\nexport type ContentAddressedStorage<Ctx, V> = ContentAddressedKv<Ctx, V>;\n\nconst SHA_256 = \"SHA-256\";\nconst HEX_TABLE = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\n\nfunction bytesToHex(bytes: Uint8Array): string {\n\tlet out = \"\";\n\tfor (const byte of bytes) out += HEX_TABLE[byte];\n\treturn out;\n}\n\nfunction sha256Hex(data: Uint8Array): Promise<string> {\n\tconst digestInput = Uint8Array.from(data);\n\treturn globalThis.crypto.subtle\n\t\t.digest(SHA_256, digestInput)\n\t\t.then((buf) => bytesToHex(new Uint8Array(buf)));\n}\n\n/** Build a content-addressed helper over a D82 KV tier. */\nexport function contentAddressedKv<Ctx, V>(\n\topts: ContentAddressedKvOptions<Ctx, V>,\n): ContentAddressedKv<Ctx, V> {\n\tconst { kv, keyContext, keyPrefix, mode = \"read-write\" } = opts;\n\tconst contextForKey = keyContext ?? ((ctx: Ctx) => ctx as unknown);\n\n\tfunction keyFor(ctx: Ctx): Promise<string> {\n\t\tlet bytes: Uint8Array;\n\t\ttry {\n\t\t\tbytes = strictCanonicalJsonBytes(contextForKey(ctx));\n\t\t} catch (err) {\n\t\t\treturn Promise.resolve().then(() => {\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\treturn Promise.resolve()\n\t\t\t.then(() => sha256Hex(bytes))\n\t\t\t.then((hex) => (keyPrefix ? `${keyPrefix}:${hex}` : hex));\n\t}\n\n\treturn {\n\t\tkeyFor,\n\t\tlookup(ctx) {\n\t\t\tif (mode === \"write\") return Promise.resolve(undefined);\n\t\t\treturn keyFor(ctx).then((key) =>\n\t\t\t\tkv.get(key).then((value) => {\n\t\t\t\t\tif (value === undefined && mode === \"read-strict\") {\n\t\t\t\t\t\tthrow new ContentAddressedMissError(key, ctx);\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tstore(ctx, value) {\n\t\t\tif (mode === \"read\") return Promise.resolve();\n\t\t\treturn keyFor(ctx).then((key) => kv.set(key, value));\n\t\t},\n\t\tforget(ctx) {\n\t\t\tif (mode === \"read\" || mode === \"write\") return Promise.resolve();\n\t\t\treturn keyFor(ctx).then((key) => kv.delete(key));\n\t\t},\n\t};\n}\n\n/** Alias for consumers that name the same D82 helper by storage role rather than KV tier. */\nexport function contentAddressedStorage<Ctx, V>(\n\topts: ContentAddressedStorageOptions<Ctx, V>,\n): ContentAddressedStorage<Ctx, V> {\n\treturn contentAddressedKv(opts);\n}\n","import type {\n\tIndexChange,\n\tListChange,\n\tLogChange,\n\tMapChange,\n} from \"../graph/data-structures/change.js\";\nimport type { IndexRow } from \"../graph/data-structures/reactive-index.js\";\nimport { strictCanonicalJsonBytes, strictJsonCodecFor } from \"../json/codec.js\";\nimport type { AppendLogStorageTier } from \"./append-log.js\";\nimport type { Codec } from \"./codec.js\";\nimport type { KvStorageTier } from \"./kv.js\";\n\n/** D161 strict-JSON snapshot frame format tag for reactive collection persistence. */\nexport const REACTIVE_COLLECTION_SNAPSHOT_FORMAT =\n\t\"graphrefly.reactive-collection.snapshot.v1\" as const;\n/** D161 strict-JSON change frame format tag for reactive collection persistence. */\nexport const REACTIVE_COLLECTION_CHANGE_FORMAT =\n\t\"graphrefly.reactive-collection.change.v1\" as const;\n/** D161 v1 frame version for reactive collection snapshot/change storage. */\nexport const REACTIVE_COLLECTION_FRAME_VERSION = 1 as const;\n\n/** D161 collection kinds recognized by the unified persistence frame envelope. */\nexport type ReactiveCollectionStorageKind =\n\t| \"reactiveList\"\n\t| \"reactiveLog\"\n\t| \"reactiveMap\"\n\t| \"reactiveIndex\";\n\n/** D161 durable baseline frame; storage is passive and does not own graph restore. */\nexport interface ReactiveCollectionSnapshotFrame<\n\tK extends ReactiveCollectionStorageKind = ReactiveCollectionStorageKind,\n\tS = unknown,\n> {\n\treadonly format: typeof REACTIVE_COLLECTION_SNAPSHOT_FORMAT;\n\treadonly version: typeof REACTIVE_COLLECTION_FRAME_VERSION;\n\treadonly kind: K;\n\t/** Last append-log seq reflected by this snapshot; -1 means no change-log entry. */\n\treadonly changeCursor: number;\n\treadonly snapshot: S;\n}\n\n/** D161 append-log change frame; change-log replay is collection-state folding, not graph restore. */\nexport interface ReactiveCollectionChangeFrame<\n\tK extends ReactiveCollectionStorageKind = ReactiveCollectionStorageKind,\n\tC = unknown,\n> {\n\treadonly format: typeof REACTIVE_COLLECTION_CHANGE_FORMAT;\n\treadonly version: typeof REACTIVE_COLLECTION_FRAME_VERSION;\n\treadonly kind: K;\n\treadonly change: C;\n}\n\n/** D161 passive load/fold result consumed by synchronous restoreReactive* helpers. */\nexport interface ReactiveCollectionRestoreState<\n\tK extends ReactiveCollectionStorageKind = ReactiveCollectionStorageKind,\n\tS = unknown,\n> {\n\treadonly kind: K;\n\treadonly state: S;\n\treadonly source: \"empty\" | \"changes\" | \"snapshot\" | \"snapshot+changes\";\n\treadonly snapshot: { readonly found: boolean; readonly changeCursor: number };\n\treadonly changes: { readonly applied: number; readonly cursor: number };\n}\n\n/** D161 restore state for a reactiveList materialized as a strict-JSON array snapshot. */\nexport type ReactiveListRestoreState<T = unknown> = ReactiveCollectionRestoreState<\n\t\"reactiveList\",\n\treadonly T[]\n>;\n\n/** D161 restore state for a reactiveLog materialized as a strict-JSON array snapshot. */\nexport type ReactiveLogRestoreState<T = unknown> = ReactiveCollectionRestoreState<\n\t\"reactiveLog\",\n\treadonly T[]\n>;\n\n/** D161 passive restore-state shape for reactiveMap; policy-aware restore remains deferred. */\nexport type ReactiveMapRestoreState<K = unknown, V = unknown> = ReactiveCollectionRestoreState<\n\t\"reactiveMap\",\n\treadonly (readonly [K, V])[]\n>;\n\n/** D161 passive restore-state shape for reactiveIndex; key-codec restore remains deferred. */\nexport type ReactiveIndexRestoreState<K = unknown, V = unknown> = ReactiveCollectionRestoreState<\n\t\"reactiveIndex\",\n\treadonly IndexRow<K, V>[]\n>;\n\n/** D161 passive storage inputs for collection load/fold helpers. */\nexport interface LoadReactiveCollectionStateOptions {\n\treadonly snapshotStore: KvStorageTier<unknown>;\n\treadonly snapshotKey?: string;\n\treadonly storagePrefix?: string;\n\treadonly changeLog?: AppendLogStorageTier<unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction ownKeys(value: Record<string, unknown>): readonly string[] {\n\treturn Object.keys(value).sort();\n}\n\nfunction assertKeys(\n\tvalue: Record<string, unknown>,\n\texpected: readonly string[],\n\tlabel: string,\n): void {\n\tconst actual = ownKeys(value);\n\tconst want = [...expected].sort();\n\tif (actual.length !== want.length || actual.some((key, i) => key !== want[i])) {\n\t\tthrow new TypeError(`${label}: unexpected frame fields ${actual.join(\",\")}`);\n\t}\n}\n\nfunction assertSafeInteger(value: unknown, label: string, min = 0): number {\n\tif (!Number.isSafeInteger(value) || (value as number) < min) {\n\t\tthrow new TypeError(`${label} must be a safe integer >= ${min}`);\n\t}\n\treturn value as number;\n}\n\nfunction assertKind<K extends ReactiveCollectionStorageKind>(\n\tvalue: unknown,\n\texpected: K,\n\tlabel: string,\n): K {\n\tif (value !== expected) throw new TypeError(`${label}: kind must be ${expected}`);\n\treturn expected;\n}\n\nfunction assertArray<T = unknown>(value: unknown, label: string): readonly T[] {\n\tif (!Array.isArray(value)) throw new TypeError(`${label}: snapshot must be an array`);\n\treturn value as readonly T[];\n}\n\nfunction strictJsonIdentity(value: unknown): string {\n\treturn Array.from(strictCanonicalJsonBytes(value)).join(\",\");\n}\n\nfunction assertEntryArray<K = unknown, V = unknown>(\n\tvalue: unknown,\n\tlabel: string,\n): readonly (readonly [K, V])[] {\n\tconst entries = assertArray<unknown>(value, label);\n\tconst seen = new Set<string>();\n\tfor (const [i, entry] of entries.entries()) {\n\t\tif (!Array.isArray(entry) || entry.length !== 2) {\n\t\t\tthrow new TypeError(`${label}: entry ${i} must be [key,value]`);\n\t\t}\n\t\tconst key = strictJsonIdentity(entry[0]);\n\t\tif (seen.has(key)) throw new TypeError(`${label}: entry ${i} duplicates an earlier key`);\n\t\tseen.add(key);\n\t}\n\treturn entries as readonly (readonly [K, V])[];\n}\n\nfunction assertIndexRows<K = unknown, V = unknown>(\n\tvalue: unknown,\n\tlabel: string,\n): readonly IndexRow<K, V>[] {\n\tconst rows = assertArray<unknown>(value, label);\n\tconst seen = new Set<string>();\n\tfor (const [i, row] of rows.entries()) {\n\t\tif (!isRecord(row)) throw new TypeError(`${label}: row ${i} must be an object`);\n\t\tassertKeys(row, [\"primary\", \"secondary\", \"value\"], `${label} row`);\n\t\tconst primary = strictJsonIdentity(row.primary);\n\t\tif (seen.has(primary)) {\n\t\t\tthrow new TypeError(`${label}: row ${i} duplicates an earlier primary`);\n\t\t}\n\t\tseen.add(primary);\n\t}\n\treturn rows as readonly IndexRow<K, V>[];\n}\n\n/** Build the default D161 snapshot key for a storage prefix. */\nexport function collectionSnapshotKey(storagePrefix = \"reactive-collection\"): string {\n\tif (storagePrefix.length === 0) throw new TypeError(\"storagePrefix must be non-empty\");\n\treturn `${storagePrefix}/snapshot`;\n}\n\n/** Build a D161 strict-JSON snapshot frame before validation/encoding. */\nexport function reactiveCollectionSnapshotFrame<K extends ReactiveCollectionStorageKind, S>(\n\tkind: K,\n\tsnapshot: S,\n\topts: { readonly changeCursor?: number } = {},\n): ReactiveCollectionSnapshotFrame<K, S> {\n\tconst changeCursor = opts.changeCursor ?? -1;\n\tif (!Number.isSafeInteger(changeCursor) || changeCursor < -1) {\n\t\tthrow new RangeError(\"reactive collection snapshot changeCursor must be a safe integer >= -1\");\n\t}\n\treturn {\n\t\tformat: REACTIVE_COLLECTION_SNAPSHOT_FORMAT,\n\t\tversion: REACTIVE_COLLECTION_FRAME_VERSION,\n\t\tkind,\n\t\tchangeCursor,\n\t\tsnapshot,\n\t};\n}\n\n/** Build a D161 strict-JSON change frame before validation/encoding. */\nexport function reactiveCollectionChangeFrame<K extends ReactiveCollectionStorageKind, C>(\n\tkind: K,\n\tchange: C,\n): ReactiveCollectionChangeFrame<K, C> {\n\treturn {\n\t\tformat: REACTIVE_COLLECTION_CHANGE_FORMAT,\n\t\tversion: REACTIVE_COLLECTION_FRAME_VERSION,\n\t\tkind,\n\t\tchange,\n\t};\n}\n\n/** Validate a D161 snapshot frame and reject non-strict-JSON payloads honestly. */\nexport function assertReactiveCollectionSnapshotFrame<\n\tK extends ReactiveCollectionStorageKind,\n\tS = unknown,\n>(value: unknown, expectedKind: K): ReactiveCollectionSnapshotFrame<K, S> {\n\tif (!isRecord(value)) throw new TypeError(\"reactive collection snapshot frame must be an object\");\n\tassertKeys(value, [\"changeCursor\", \"format\", \"kind\", \"snapshot\", \"version\"], \"snapshot frame\");\n\tif (value.format !== REACTIVE_COLLECTION_SNAPSHOT_FORMAT) {\n\t\tthrow new TypeError(\"snapshot frame: invalid format\");\n\t}\n\tif (value.version !== REACTIVE_COLLECTION_FRAME_VERSION) {\n\t\tthrow new TypeError(\"snapshot frame: invalid version\");\n\t}\n\tassertKind(value.kind, expectedKind, \"snapshot frame\");\n\tassertSafeInteger(value.changeCursor, \"snapshot frame changeCursor\", -1);\n\tstrictJsonCodecFor<unknown>().encode(value);\n\treturn value as unknown as ReactiveCollectionSnapshotFrame<K, S>;\n}\n\n/** Validate a D161 change frame and reject non-strict-JSON payloads honestly. */\nexport function assertReactiveCollectionChangeFrame<\n\tK extends ReactiveCollectionStorageKind,\n\tC = unknown,\n>(value: unknown, expectedKind: K): ReactiveCollectionChangeFrame<K, C> {\n\tif (!isRecord(value)) throw new TypeError(\"reactive collection change frame must be an object\");\n\tassertKeys(value, [\"change\", \"format\", \"kind\", \"version\"], \"change frame\");\n\tif (value.format !== REACTIVE_COLLECTION_CHANGE_FORMAT) {\n\t\tthrow new TypeError(\"change frame: invalid format\");\n\t}\n\tif (value.version !== REACTIVE_COLLECTION_FRAME_VERSION) {\n\t\tthrow new TypeError(\"change frame: invalid version\");\n\t}\n\tassertKind(value.kind, expectedKind, \"change frame\");\n\tif (!Object.hasOwn(value, \"change\")) throw new TypeError(\"change frame: change is required\");\n\tstrictJsonCodecFor<unknown>().encode(value);\n\treturn value as unknown as ReactiveCollectionChangeFrame<K, C>;\n}\n\n/** Codec for D161 snapshot frames with strict JSON validation on both encode and decode. */\nexport function reactiveCollectionSnapshotFrameCodec<\n\tK extends ReactiveCollectionStorageKind,\n\tS = unknown,\n>(kind: K): Codec<ReactiveCollectionSnapshotFrame<K, S>> {\n\tconst codec = strictJsonCodecFor<unknown>();\n\treturn {\n\t\tencode(value) {\n\t\t\treturn codec.encode(assertReactiveCollectionSnapshotFrame<K, S>(value, kind));\n\t\t},\n\t\tdecode(bytes) {\n\t\t\treturn assertReactiveCollectionSnapshotFrame<K, S>(codec.decode(bytes), kind);\n\t\t},\n\t};\n}\n\n/** Codec for D161 change frames with strict JSON validation on both encode and decode. */\nexport function reactiveCollectionChangeFrameCodec<\n\tK extends ReactiveCollectionStorageKind,\n\tC = unknown,\n>(kind: K): Codec<ReactiveCollectionChangeFrame<K, C>> {\n\tconst codec = strictJsonCodecFor<unknown>();\n\treturn {\n\t\tencode(value) {\n\t\t\treturn codec.encode(assertReactiveCollectionChangeFrame<K, C>(value, kind));\n\t\t},\n\t\tdecode(bytes) {\n\t\t\treturn assertReactiveCollectionChangeFrame<K, C>(codec.decode(bytes), kind);\n\t\t},\n\t};\n}\n\nfunction assertListChange<T>(value: unknown): ListChange<T> {\n\tif (!isRecord(value) || typeof value.kind !== \"string\") {\n\t\tthrow new TypeError(\"reactiveList change must be an object with kind\");\n\t}\n\tswitch (value.kind) {\n\t\tcase \"append\":\n\t\t\tif (!Object.hasOwn(value, \"value\")) throw new TypeError(\"reactiveList append.value required\");\n\t\t\tassertKeys(value, [\"kind\", \"value\"], \"reactiveList append\");\n\t\t\treturn value as unknown as ListChange<T>;\n\t\tcase \"appendMany\":\n\t\t\tassertKeys(value, [\"kind\", \"values\"], \"reactiveList appendMany\");\n\t\t\tassertArray<T>(value.values, \"reactiveList appendMany.values\");\n\t\t\treturn value as unknown as ListChange<T>;\n\t\tcase \"insert\":\n\t\t\tassertKeys(value, [\"index\", \"kind\", \"value\"], \"reactiveList insert\");\n\t\t\tassertSafeInteger(value.index, \"reactiveList insert.index\", 0);\n\t\t\treturn value as unknown as ListChange<T>;\n\t\tcase \"insertMany\":\n\t\t\tassertKeys(value, [\"index\", \"kind\", \"values\"], \"reactiveList insertMany\");\n\t\t\tassertSafeInteger(value.index, \"reactiveList insertMany.index\", 0);\n\t\t\tassertArray<T>(value.values, \"reactiveList insertMany.values\");\n\t\t\treturn value as unknown as ListChange<T>;\n\t\tcase \"pop\":\n\t\t\tassertKeys(value, [\"index\", \"kind\", \"value\"], \"reactiveList pop\");\n\t\t\tassertSafeInteger(value.index, \"reactiveList pop.index\", 0);\n\t\t\treturn value as unknown as ListChange<T>;\n\t\tcase \"trimHead\":\n\t\t\tassertKeys(value, [\"kind\", \"n\"], \"reactiveList trimHead\");\n\t\t\tassertSafeInteger(value.n, \"reactiveList trimHead.n\", 0);\n\t\t\treturn value as unknown as ListChange<T>;\n\t\tcase \"clear\":\n\t\t\tassertKeys(value, [\"count\", \"kind\"], \"reactiveList clear\");\n\t\t\tassertSafeInteger(value.count, \"reactiveList clear.count\", 0);\n\t\t\treturn value as unknown as ListChange<T>;\n\t\tdefault:\n\t\t\tthrow new TypeError(`unsupported reactiveList change kind ${value.kind}`);\n\t}\n}\n\nfunction assertLogChange<T>(value: unknown): LogChange<T> {\n\tif (!isRecord(value) || typeof value.kind !== \"string\") {\n\t\tthrow new TypeError(\"reactiveLog change must be an object with kind\");\n\t}\n\tswitch (value.kind) {\n\t\tcase \"append\":\n\t\t\tif (!Object.hasOwn(value, \"value\")) throw new TypeError(\"reactiveLog append.value required\");\n\t\t\tassertKeys(value, [\"kind\", \"value\"], \"reactiveLog append\");\n\t\t\treturn value as unknown as LogChange<T>;\n\t\tcase \"appendMany\":\n\t\t\tassertKeys(value, [\"kind\", \"values\"], \"reactiveLog appendMany\");\n\t\t\tassertArray<T>(value.values, \"reactiveLog appendMany.values\");\n\t\t\treturn value as unknown as LogChange<T>;\n\t\tcase \"trimHead\":\n\t\t\tassertKeys(value, [\"kind\", \"n\"], \"reactiveLog trimHead\");\n\t\t\tassertSafeInteger(value.n, \"reactiveLog trimHead.n\", 0);\n\t\t\treturn value as unknown as LogChange<T>;\n\t\tcase \"clear\":\n\t\t\tassertKeys(value, [\"count\", \"kind\"], \"reactiveLog clear\");\n\t\t\tassertSafeInteger(value.count, \"reactiveLog clear.count\", 0);\n\t\t\treturn value as unknown as LogChange<T>;\n\t\tdefault:\n\t\t\tthrow new TypeError(`unsupported reactiveLog change kind ${value.kind}`);\n\t}\n}\n\nfunction assertMapChange<K, V>(value: unknown): MapChange<K, V> {\n\tif (!isRecord(value) || typeof value.kind !== \"string\") {\n\t\tthrow new TypeError(\"reactiveMap change must be an object with kind\");\n\t}\n\tswitch (value.kind) {\n\t\tcase \"set\":\n\t\t\tif (!Object.hasOwn(value, \"key\")) throw new TypeError(\"reactiveMap set.key required\");\n\t\t\tif (!Object.hasOwn(value, \"value\")) throw new TypeError(\"reactiveMap set.value required\");\n\t\t\tassertKeys(value, [\"key\", \"kind\", \"value\"], \"reactiveMap set\");\n\t\t\treturn value as unknown as MapChange<K, V>;\n\t\tcase \"delete\":\n\t\t\tif (!Object.hasOwn(value, \"key\")) throw new TypeError(\"reactiveMap delete.key required\");\n\t\t\tif (!Object.hasOwn(value, \"previous\")) {\n\t\t\t\tthrow new TypeError(\"reactiveMap delete.previous required\");\n\t\t\t}\n\t\t\tassertKeys(value, [\"key\", \"kind\", \"previous\", \"reason\"], \"reactiveMap delete\");\n\t\t\tif (\n\t\t\t\tvalue.reason !== \"expired\" &&\n\t\t\t\tvalue.reason !== \"lru-evict\" &&\n\t\t\t\tvalue.reason !== \"archived\" &&\n\t\t\t\tvalue.reason !== \"explicit\"\n\t\t\t) {\n\t\t\t\tthrow new TypeError(\"reactiveMap delete.reason is invalid\");\n\t\t\t}\n\t\t\treturn value as unknown as MapChange<K, V>;\n\t\tcase \"clear\":\n\t\t\tassertKeys(value, [\"count\", \"kind\"], \"reactiveMap clear\");\n\t\t\tassertSafeInteger(value.count, \"reactiveMap clear.count\", 0);\n\t\t\treturn value as unknown as MapChange<K, V>;\n\t\tdefault:\n\t\t\tthrow new TypeError(`unsupported reactiveMap change kind ${value.kind}`);\n\t}\n}\n\nfunction assertIndexChange<K, V>(value: unknown): IndexChange<K, V> {\n\tif (!isRecord(value) || typeof value.kind !== \"string\") {\n\t\tthrow new TypeError(\"reactiveIndex change must be an object with kind\");\n\t}\n\tswitch (value.kind) {\n\t\tcase \"upsert\":\n\t\t\tif (!Object.hasOwn(value, \"primary\")) {\n\t\t\t\tthrow new TypeError(\"reactiveIndex upsert.primary required\");\n\t\t\t}\n\t\t\tif (!Object.hasOwn(value, \"secondary\")) {\n\t\t\t\tthrow new TypeError(\"reactiveIndex upsert.secondary required\");\n\t\t\t}\n\t\t\tif (!Object.hasOwn(value, \"value\"))\n\t\t\t\tthrow new TypeError(\"reactiveIndex upsert.value required\");\n\t\t\tassertKeys(value, [\"kind\", \"primary\", \"secondary\", \"value\"], \"reactiveIndex upsert\");\n\t\t\treturn value as unknown as IndexChange<K, V>;\n\t\tcase \"delete\":\n\t\t\tif (!Object.hasOwn(value, \"primary\")) {\n\t\t\t\tthrow new TypeError(\"reactiveIndex delete.primary required\");\n\t\t\t}\n\t\t\tassertKeys(value, [\"kind\", \"primary\"], \"reactiveIndex delete\");\n\t\t\treturn value as unknown as IndexChange<K, V>;\n\t\tcase \"deleteMany\":\n\t\t\tassertKeys(value, [\"kind\", \"primaries\"], \"reactiveIndex deleteMany\");\n\t\t\tassertArray<K>(value.primaries, \"reactiveIndex deleteMany.primaries\");\n\t\t\treturn value as unknown as IndexChange<K, V>;\n\t\tcase \"clear\":\n\t\t\tassertKeys(value, [\"count\", \"kind\"], \"reactiveIndex clear\");\n\t\t\tassertSafeInteger(value.count, \"reactiveIndex clear.count\", 0);\n\t\t\treturn value as unknown as IndexChange<K, V>;\n\t\tdefault:\n\t\t\tthrow new TypeError(`unsupported reactiveIndex change kind ${value.kind}`);\n\t}\n}\n\nfunction applyListChange<T>(state: T[], change: ListChange<T>): void {\n\tswitch (change.kind) {\n\t\tcase \"append\":\n\t\t\tstate.push(change.value);\n\t\t\treturn;\n\t\tcase \"appendMany\":\n\t\t\tstate.push(...change.values);\n\t\t\treturn;\n\t\tcase \"insert\":\n\t\t\tif (change.index > state.length)\n\t\t\t\tthrow new Error(\"reactiveList insert change is out of range\");\n\t\t\tstate.splice(change.index, 0, change.value);\n\t\t\treturn;\n\t\tcase \"insertMany\":\n\t\t\tif (change.index > state.length) {\n\t\t\t\tthrow new Error(\"reactiveList insertMany change is out of range\");\n\t\t\t}\n\t\t\tstate.splice(change.index, 0, ...change.values);\n\t\t\treturn;\n\t\tcase \"pop\":\n\t\t\tif (change.index >= state.length) throw new Error(\"reactiveList pop change is out of range\");\n\t\t\tif (!strictJsonEquals(state[change.index], change.value)) {\n\t\t\t\tthrow new Error(\"reactiveList pop change value does not match current state\");\n\t\t\t}\n\t\t\tstate.splice(change.index, 1);\n\t\t\treturn;\n\t\tcase \"trimHead\":\n\t\t\tif (change.n > state.length) throw new Error(\"reactiveList trimHead change is out of range\");\n\t\t\tstate.splice(0, change.n);\n\t\t\treturn;\n\t\tcase \"clear\":\n\t\t\tif (change.count !== state.length) {\n\t\t\t\tthrow new Error(\"reactiveList clear change count does not match current state\");\n\t\t\t}\n\t\t\tstate.length = 0;\n\t\t\treturn;\n\t}\n}\n\nfunction strictJsonEquals(a: unknown, b: unknown): boolean {\n\tconst left = strictCanonicalJsonBytes(a);\n\tconst right = strictCanonicalJsonBytes(b);\n\tif (left.byteLength !== right.byteLength) return false;\n\tfor (let i = 0; i < left.byteLength; i += 1) if (left[i] !== right[i]) return false;\n\treturn true;\n}\n\nfunction findJsonIndex<T>(\n\tvalues: readonly T[],\n\tmatch: (value: T) => unknown,\n\tkey: unknown,\n\tlabel: string,\n): number {\n\tlet found = -1;\n\tfor (let i = 0; i < values.length; i += 1) {\n\t\tif (strictJsonEquals(match(values[i] as T), key)) {\n\t\t\tif (found !== -1) throw new Error(`${label} duplicate JSON key in restore state`);\n\t\t\tfound = i;\n\t\t}\n\t}\n\treturn found;\n}\n\nfunction cmpOrd(a: unknown, b: unknown): number {\n\tif (a === b) return 0;\n\tconst ta = typeof a;\n\tif (\n\t\tta === typeof b &&\n\t\t(ta === \"number\" || ta === \"string\" || ta === \"boolean\" || ta === \"bigint\")\n\t) {\n\t\tconst ax = a as number | string | bigint | boolean;\n\t\tconst bx = b as number | string | bigint | boolean;\n\t\treturn ax < bx ? -1 : ax > bx ? 1 : 0;\n\t}\n\treturn String(a).localeCompare(String(b));\n}\n\nfunction applyLogChange<T>(state: T[], change: LogChange<T>): void {\n\tswitch (change.kind) {\n\t\tcase \"append\":\n\t\t\tstate.push(change.value);\n\t\t\treturn;\n\t\tcase \"appendMany\":\n\t\t\tstate.push(...change.values);\n\t\t\treturn;\n\t\tcase \"trimHead\":\n\t\t\tif (change.n > state.length) throw new Error(\"reactiveLog trimHead change is out of range\");\n\t\t\tstate.splice(0, change.n);\n\t\t\treturn;\n\t\tcase \"clear\":\n\t\t\tif (change.count !== state.length) {\n\t\t\t\tthrow new Error(\"reactiveLog clear change count does not match current state\");\n\t\t\t}\n\t\t\tstate.length = 0;\n\t\t\treturn;\n\t}\n}\n\nfunction applyMapChange<K, V>(state: Array<readonly [K, V]>, change: MapChange<K, V>): void {\n\tswitch (change.kind) {\n\t\tcase \"set\": {\n\t\t\tconst index = findJsonIndex(state, ([key]) => key, change.key, \"reactiveMap\");\n\t\t\tif (index === -1) state.push([change.key, change.value] as const);\n\t\t\telse state[index] = [change.key, change.value] as const;\n\t\t\treturn;\n\t\t}\n\t\tcase \"delete\": {\n\t\t\tconst index = findJsonIndex(state, ([key]) => key, change.key, \"reactiveMap\");\n\t\t\tif (index === -1) throw new Error(\"reactiveMap delete change key is missing\");\n\t\t\tif (!strictJsonEquals(state[index]?.[1], change.previous)) {\n\t\t\t\tthrow new Error(\"reactiveMap delete change previous value does not match current state\");\n\t\t\t}\n\t\t\tstate.splice(index, 1);\n\t\t\treturn;\n\t\t}\n\t\tcase \"clear\":\n\t\t\tif (change.count !== state.length) {\n\t\t\t\tthrow new Error(\"reactiveMap clear change count does not match current state\");\n\t\t\t}\n\t\t\tstate.length = 0;\n\t\t\treturn;\n\t}\n}\n\nfunction sortIndexRows<K, V>(state: Array<IndexRow<K, V>>): void {\n\tstate.sort((a, b) => {\n\t\tconst bySecondary = cmpOrd(a.secondary, b.secondary);\n\t\treturn bySecondary === 0 ? cmpOrd(a.primary, b.primary) : bySecondary;\n\t});\n}\n\nfunction applyIndexChange<K, V>(state: Array<IndexRow<K, V>>, change: IndexChange<K, V>): void {\n\tswitch (change.kind) {\n\t\tcase \"upsert\": {\n\t\t\tconst index = findJsonIndex(state, (row) => row.primary, change.primary, \"reactiveIndex\");\n\t\t\tconst row: IndexRow<K, V> = {\n\t\t\t\tprimary: change.primary,\n\t\t\t\tsecondary: change.secondary,\n\t\t\t\tvalue: change.value,\n\t\t\t};\n\t\t\tif (index === -1) state.push(row);\n\t\t\telse state[index] = row;\n\t\t\tsortIndexRows(state);\n\t\t\treturn;\n\t\t}\n\t\tcase \"delete\": {\n\t\t\tconst index = findJsonIndex(state, (row) => row.primary, change.primary, \"reactiveIndex\");\n\t\t\tif (index === -1) throw new Error(\"reactiveIndex delete change primary is missing\");\n\t\t\tstate.splice(index, 1);\n\t\t\treturn;\n\t\t}\n\t\tcase \"deleteMany\": {\n\t\t\tfor (const primary of change.primaries) {\n\t\t\t\tconst index = findJsonIndex(state, (row) => row.primary, primary, \"reactiveIndex\");\n\t\t\t\tif (index === -1) {\n\t\t\t\t\tthrow new Error(\"reactiveIndex deleteMany change primary is missing\");\n\t\t\t\t}\n\t\t\t\tstate.splice(index, 1);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase \"clear\":\n\t\t\tif (change.count !== state.length) {\n\t\t\t\tthrow new Error(\"reactiveIndex clear change count does not match current state\");\n\t\t\t}\n\t\t\tstate.length = 0;\n\t\t\treturn;\n\t}\n}\n\nfunction finishState<K extends ReactiveCollectionStorageKind, T>(\n\tkind: K,\n\tstate: T[],\n\tsnapshotFound: boolean,\n\tsnapshotCursor: number,\n\tapplied: number,\n\tcursor: number,\n): ReactiveCollectionRestoreState<K, readonly T[]> {\n\treturn {\n\t\tkind,\n\t\tstate,\n\t\tsource: snapshotFound\n\t\t\t? applied > 0\n\t\t\t\t? \"snapshot+changes\"\n\t\t\t\t: \"snapshot\"\n\t\t\t: applied > 0\n\t\t\t\t? \"changes\"\n\t\t\t\t: \"empty\",\n\t\tsnapshot: { found: snapshotFound, changeCursor: snapshotCursor },\n\t\tchanges: { applied, cursor },\n\t};\n}\n\nfunction loadState<K extends ReactiveCollectionStorageKind, T, C>(\n\tkind: K,\n\topts: LoadReactiveCollectionStateOptions,\n\tassertSnapshot: (value: unknown) => readonly T[],\n\tassertChange: (value: unknown) => C,\n\tapplyChange: (state: T[], change: C) => void,\n): Promise<ReactiveCollectionRestoreState<K, readonly T[]>> {\n\tconst key = opts.snapshotKey ?? collectionSnapshotKey(opts.storagePrefix);\n\treturn opts.snapshotStore.get(key).then((snapshotValue) => {\n\t\tlet snapshotFound = false;\n\t\tlet snapshotCursor = -1;\n\t\tlet state: T[] = [];\n\n\t\tif (snapshotValue !== undefined) {\n\t\t\tconst frame = assertReactiveCollectionSnapshotFrame<K, readonly T[]>(snapshotValue, kind);\n\t\t\tstate = [...assertSnapshot(frame.snapshot)];\n\t\t\tsnapshotFound = true;\n\t\t\tsnapshotCursor = frame.changeCursor;\n\t\t}\n\n\t\tif (opts.changeLog === undefined) {\n\t\t\treturn finishState(kind, state, snapshotFound, snapshotCursor, 0, snapshotCursor);\n\t\t}\n\n\t\treturn opts.changeLog.read({ after: snapshotCursor }).then((entries) => {\n\t\t\tlet applied = 0;\n\t\t\tlet cursor = snapshotCursor;\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst expectedSeq = cursor + 1;\n\t\t\t\tif (!Number.isSafeInteger(entry.seq) || entry.seq !== expectedSeq) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`reactive collection change log is non-contiguous: expected seq ${expectedSeq}, got ${entry.seq}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst frame = assertReactiveCollectionChangeFrame<K, C>(entry.value, kind);\n\t\t\t\tconst change = assertChange(frame.change);\n\t\t\t\tapplyChange(state, change);\n\t\t\t\tapplied += 1;\n\t\t\t\tcursor = entry.seq;\n\t\t\t}\n\t\t\treturn finishState(kind, state, snapshotFound, snapshotCursor, applied, cursor);\n\t\t});\n\t});\n}\n\n/** D161 passive load/fold for reactiveList; reads storage but never mutates graph topology. */\nexport function loadReactiveListState<T = unknown>(\n\topts: LoadReactiveCollectionStateOptions,\n): Promise<ReactiveListRestoreState<T>> {\n\treturn loadState<\"reactiveList\", T, ListChange<T>>(\n\t\t\"reactiveList\",\n\t\topts,\n\t\t(value) => assertArray<T>(value, \"reactiveList snapshot\"),\n\t\tassertListChange,\n\t\tapplyListChange,\n\t);\n}\n\n/** D161 passive load/fold for reactiveLog; reads storage but never mutates graph topology. */\nexport function loadReactiveLogState<T = unknown>(\n\topts: LoadReactiveCollectionStateOptions,\n): Promise<ReactiveLogRestoreState<T>> {\n\treturn loadState<\"reactiveLog\", T, LogChange<T>>(\n\t\t\"reactiveLog\",\n\t\topts,\n\t\t(value) => assertArray<T>(value, \"reactiveLog snapshot\"),\n\t\tassertLogChange,\n\t\tapplyLogChange,\n\t);\n}\n\n/** D161 passive load/fold scaffold for reactiveMap; synchronous policy restore is deferred. */\nexport function loadReactiveMapState<K = unknown, V = unknown>(\n\topts: LoadReactiveCollectionStateOptions,\n): Promise<ReactiveMapRestoreState<K, V>> {\n\treturn loadState<\"reactiveMap\", readonly [K, V], MapChange<K, V>>(\n\t\t\"reactiveMap\",\n\t\topts,\n\t\t(value) => assertEntryArray<K, V>(value, \"reactiveMap snapshot\"),\n\t\tassertMapChange,\n\t\tapplyMapChange,\n\t);\n}\n\n/** D161 passive load/fold scaffold for reactiveIndex; key-codec restore is deferred. */\nexport function loadReactiveIndexState<K = unknown, V = unknown>(\n\topts: LoadReactiveCollectionStateOptions,\n): Promise<ReactiveIndexRestoreState<K, V>> {\n\treturn loadState<\"reactiveIndex\", IndexRow<K, V>, IndexChange<K, V>>(\n\t\t\"reactiveIndex\",\n\t\topts,\n\t\t(value) => assertIndexRows<K, V>(value, \"reactiveIndex snapshot\"),\n\t\tassertIndexChange,\n\t\tapplyIndexChange,\n\t);\n}\n","import { strictCanonicalJsonBytes, strictJsonCodecFor } from \"../json/codec.js\";\nimport type { ChangeLifecycle, StorageTimestampNs } from \"./change.js\";\nimport { nowNs } from \"./change.js\";\nimport type { Codec } from \"./codec.js\";\nimport {\n\tassertNonNegativeDecimalIntegerString,\n\ttype NonNegativeDecimalIntegerString,\n} from \"./scalar.js\";\n\n/** Storage key segment for passive WAL frame facts. */\nexport const WAL_KEY_SEGMENT = \"wal\";\n\n/** Decimal sequence padding for lexicographically ordered WAL frame keys. */\nexport const WAL_FRAME_SEQ_PAD = 20;\n\n/** First passive WAL frame format version. */\nexport const WAL_FORMAT_VERSION = 1;\n\n/** Passive WAL frame body; this is a storage fact, not graph restore input. */\nexport interface WalFrameBody<T = unknown> {\n\treadonly t: \"c\";\n\treadonly lifecycle: ChangeLifecycle;\n\treadonly path: string;\n\treadonly change: T;\n\treadonly frame_seq: number;\n\treadonly frame_t_ns: StorageTimestampNs;\n\treadonly format_version: typeof WAL_FORMAT_VERSION;\n}\n\n/** Checksummed passive WAL frame. */\nexport interface WalFrame<T = unknown> extends WalFrameBody<T> {\n\treadonly checksum: string;\n}\n\n/** Options for constructing a passive WAL frame. */\nexport interface WalFrameOptions<T = unknown> {\n\treadonly path: string;\n\treadonly change: T;\n\treadonly frame_seq: number;\n\treadonly lifecycle?: ChangeLifecycle;\n\treadonly frame_t_ns?: StorageTimestampNs;\n}\n\nconst SHA_256 = \"SHA-256\";\nconst HEX_TABLE = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\nconst CHECKSUM_RE = /^[0-9a-f]{64}$/;\nconst WAL_BODY_KEYS = new Set([\n\t\"t\",\n\t\"lifecycle\",\n\t\"path\",\n\t\"change\",\n\t\"frame_seq\",\n\t\"frame_t_ns\",\n\t\"format_version\",\n]);\nconst WAL_FRAME_KEYS = new Set([...WAL_BODY_KEYS, \"checksum\"]);\n\nfunction bytesToHex(bytes: Uint8Array): string {\n\tlet out = \"\";\n\tfor (const byte of bytes) out += HEX_TABLE[byte];\n\treturn out;\n}\n\nfunction sha256Hex(data: Uint8Array): Promise<string> {\n\tconst digestInput = Uint8Array.from(data);\n\treturn globalThis.crypto.subtle\n\t\t.digest(SHA_256, digestInput)\n\t\t.then((buf) => bytesToHex(new Uint8Array(buf)));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isLifecycle(value: unknown): value is ChangeLifecycle {\n\treturn value === \"spec\" || value === \"data\" || value === \"ownership\";\n}\n\nfunction assertOnlyKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>): void {\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new TypeError(`walFrameCodec: unknown field ${key}`);\n\t}\n}\n\nfunction assertFrameSeq(value: unknown, label: string): number {\n\tif (!Number.isSafeInteger(value) || (value as number) < 0) {\n\t\tthrow new TypeError(`${label} must be a non-negative safe integer`);\n\t}\n\treturn value as number;\n}\n\nfunction assertWalFrameBody<T = unknown>(\n\tvalue: unknown,\n\tallowedKeys: ReadonlySet<string> = WAL_BODY_KEYS,\n): WalFrameBody<T> {\n\tif (!isRecord(value)) throw new TypeError(\"walFrameCodec: frame must be an object\");\n\tassertOnlyKeys(value, allowedKeys);\n\tif (value.t !== \"c\") throw new TypeError(\"walFrameCodec: t must be c\");\n\tif (!isLifecycle(value.lifecycle)) {\n\t\tthrow new TypeError(\"walFrameCodec: lifecycle must be spec, data, or ownership\");\n\t}\n\tif (typeof value.path !== \"string\" || value.path.length === 0) {\n\t\tthrow new TypeError(\"walFrameCodec: path must be a non-empty string\");\n\t}\n\tif (!Object.hasOwn(value, \"change\")) {\n\t\tthrow new TypeError(\"walFrameCodec: change payload is required\");\n\t}\n\tconst frameSeq = assertFrameSeq(value.frame_seq, \"walFrameCodec: frame_seq\");\n\tconst frameTimestamp = assertNonNegativeDecimalIntegerString(\n\t\tvalue.frame_t_ns,\n\t\t\"walFrameCodec: frame_t_ns\",\n\t);\n\tif (value.format_version !== WAL_FORMAT_VERSION) {\n\t\tthrow new TypeError(`walFrameCodec: format_version must be ${WAL_FORMAT_VERSION}`);\n\t}\n\treturn {\n\t\tt: \"c\",\n\t\tlifecycle: value.lifecycle,\n\t\tpath: value.path,\n\t\tchange: value.change as T,\n\t\tframe_seq: frameSeq,\n\t\tframe_t_ns: frameTimestamp,\n\t\tformat_version: WAL_FORMAT_VERSION,\n\t};\n}\n\n/** Build the namespace prefix for passive WAL frame keys. */\nexport function walFramePrefix(namespace: string): string {\n\tif (namespace.length === 0) return WAL_KEY_SEGMENT;\n\treturn `${namespace}/${WAL_KEY_SEGMENT}`;\n}\n\n/** Build the deterministic storage key for a WAL frame sequence number. */\nexport function walFrameKey(prefix: string, frameSeq: number): string {\n\tif (!Number.isSafeInteger(frameSeq) || frameSeq < 0) {\n\t\tthrow new RangeError(\n\t\t\t`walFrameKey: frameSeq must be a non-negative safe integer, got ${frameSeq}`,\n\t\t);\n\t}\n\treturn `${prefix}/${frameSeq.toString().padStart(WAL_FRAME_SEQ_PAD, \"0\")}`;\n}\n\n/** Hash the canonical WAL frame body, excluding the checksum field itself. */\nexport function walFrameChecksum<T = unknown>(body: WalFrameBody<T>): Promise<string> {\n\tlet bytes: Uint8Array;\n\ttry {\n\t\tbytes = strictCanonicalJsonBytes(assertWalFrameBody<T>(body));\n\t} catch (err) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tthrow err;\n\t\t});\n\t}\n\treturn sha256Hex(bytes);\n}\n\n/** Construct a passive WAL frame with a canonical checksum. */\nexport function walFrame<T = unknown>(opts: WalFrameOptions<T>): Promise<WalFrame<T>> {\n\tconst body: WalFrameBody<T> = {\n\t\tt: \"c\",\n\t\tlifecycle: opts.lifecycle ?? \"data\",\n\t\tpath: opts.path,\n\t\tchange: opts.change,\n\t\tframe_seq: opts.frame_seq,\n\t\tframe_t_ns: opts.frame_t_ns ?? nowNs(),\n\t\tformat_version: WAL_FORMAT_VERSION,\n\t};\n\treturn walFrameChecksum(body).then((checksum) => ({ ...body, checksum }));\n}\n\n/** Validate a decoded passive WAL frame without verifying its checksum bytes. */\nexport function assertWalFrame<T = unknown>(value: unknown): WalFrame<T> {\n\tif (!isRecord(value)) throw new TypeError(\"walFrameCodec: frame must be an object\");\n\tassertOnlyKeys(value, WAL_FRAME_KEYS);\n\tconst body = assertWalFrameBody<T>(value, WAL_FRAME_KEYS);\n\tconst checksum = (value as Record<string, unknown>).checksum;\n\tif (typeof checksum !== \"string\" || !CHECKSUM_RE.test(checksum)) {\n\t\tthrow new TypeError(\"walFrameCodec: checksum must be a lowercase sha256 hex string\");\n\t}\n\treturn { ...body, checksum } as WalFrame<T>;\n}\n\n/** Verify that a passive WAL frame checksum matches its body. */\nexport function verifyWalFrameChecksum<T = unknown>(frame: WalFrame<T>): Promise<boolean> {\n\tlet checked: WalFrame<T>;\n\ttry {\n\t\tchecked = assertWalFrame<T>(frame);\n\t} catch (err) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tthrow err;\n\t\t});\n\t}\n\tconst { checksum, ...body } = checked;\n\treturn walFrameChecksum(body).then((expected) => expected === checksum);\n}\n\n/** Strict canonical JSON codec for passive WAL frames; this is not a restore codec. */\nexport function walFrameCodec<T = unknown>(): Codec<WalFrame<T>> {\n\tconst codec = strictJsonCodecFor<unknown>();\n\treturn {\n\t\tencode(value) {\n\t\t\treturn codec.encode(assertWalFrame(value));\n\t\t},\n\t\tdecode(bytes) {\n\t\t\treturn assertWalFrame<T>(codec.decode(bytes));\n\t\t},\n\t};\n}\n\nexport type WalFrameTimestampNs = NonNegativeDecimalIntegerString;\n"],"mappings":"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","names":["row","SHA_256","HEX_TABLE","bytesToHex","sha256Hex","isRecord"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-H2HTHFVN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// src/graph/render.ts
|
|
2
|
+
function describeToMermaid(snapshot, opts = {}) {
|
|
3
|
+
const direction = normalizeDirection(opts.direction);
|
|
4
|
+
const flat = flattenDescribe(snapshot);
|
|
5
|
+
const nodes = sortedNodes(flat.nodes);
|
|
6
|
+
const ids = /* @__PURE__ */ new Map();
|
|
7
|
+
for (let i = 0; i < nodes.length; i += 1) ids.set(nodes[i].id, `n${i}`);
|
|
8
|
+
const lines = [`flowchart ${direction}`];
|
|
9
|
+
for (const node of nodes) {
|
|
10
|
+
lines.push(` ${ids.get(node.id)}["${escapeMermaidLabel(node.id)}"]`);
|
|
11
|
+
}
|
|
12
|
+
for (const edge of sortedEdges(flat.edges)) {
|
|
13
|
+
const from = ids.get(edge.from);
|
|
14
|
+
const to = ids.get(edge.to);
|
|
15
|
+
if (from === void 0 || to === void 0) continue;
|
|
16
|
+
lines.push(` ${from} --> ${to}`);
|
|
17
|
+
}
|
|
18
|
+
return lines.join("\n");
|
|
19
|
+
}
|
|
20
|
+
function mermaidLiveUrl(mermaidSource, opts = {}) {
|
|
21
|
+
const payload = {
|
|
22
|
+
code: mermaidSource,
|
|
23
|
+
mermaid: { theme: opts.theme ?? "default" },
|
|
24
|
+
autoSync: opts.autoSync ?? true
|
|
25
|
+
};
|
|
26
|
+
return `https://mermaid.live/edit#base64:${base64UrlEncode(JSON.stringify(payload))}`;
|
|
27
|
+
}
|
|
28
|
+
function describeToMermaidUrl(snapshot, opts = {}) {
|
|
29
|
+
return mermaidLiveUrl(describeToMermaid(snapshot, opts), opts);
|
|
30
|
+
}
|
|
31
|
+
function describeToD2(snapshot, opts = {}) {
|
|
32
|
+
const direction = normalizeDirection(opts.direction);
|
|
33
|
+
const flat = flattenDescribe(snapshot);
|
|
34
|
+
const nodes = sortedNodes(flat.nodes);
|
|
35
|
+
const ids = /* @__PURE__ */ new Map();
|
|
36
|
+
for (let i = 0; i < nodes.length; i += 1) ids.set(nodes[i].id, `n${i}`);
|
|
37
|
+
const lines = [`direction: ${d2Direction(direction)}`];
|
|
38
|
+
for (const node of nodes) {
|
|
39
|
+
lines.push(`${ids.get(node.id)}: "${escapeD2Label(node.id)}"`);
|
|
40
|
+
}
|
|
41
|
+
for (const edge of sortedEdges(flat.edges)) {
|
|
42
|
+
const from = ids.get(edge.from);
|
|
43
|
+
const to = ids.get(edge.to);
|
|
44
|
+
if (from === void 0 || to === void 0) continue;
|
|
45
|
+
lines.push(`${from} -> ${to}`);
|
|
46
|
+
}
|
|
47
|
+
return lines.join("\n");
|
|
48
|
+
}
|
|
49
|
+
function describeToPretty(snapshot, opts = {}) {
|
|
50
|
+
const flat = flattenDescribe(snapshot);
|
|
51
|
+
const includeEdges = opts.includeEdges ?? true;
|
|
52
|
+
const lines = [`Graph ${flat.name ?? "(anonymous)"}`, "Nodes:"];
|
|
53
|
+
for (const node of sortedNodes(flat.nodes)) {
|
|
54
|
+
lines.push(`- ${node.id} (${node.factory}/${node.status}): ${formatValue(node)}`);
|
|
55
|
+
}
|
|
56
|
+
if (includeEdges) {
|
|
57
|
+
lines.push("Edges:");
|
|
58
|
+
for (const edge of sortedEdges(flat.edges)) lines.push(`- ${edge.from} -> ${edge.to}`);
|
|
59
|
+
}
|
|
60
|
+
return lines.join("\n");
|
|
61
|
+
}
|
|
62
|
+
function describeToAscii(snapshot, opts = {}) {
|
|
63
|
+
const flat = flattenDescribe(snapshot);
|
|
64
|
+
const outgoing = /* @__PURE__ */ new Map();
|
|
65
|
+
for (const edge of sortedEdges(flat.edges)) {
|
|
66
|
+
const list = outgoing.get(edge.from);
|
|
67
|
+
if (list) list.push(edge.to);
|
|
68
|
+
else outgoing.set(edge.from, [edge.to]);
|
|
69
|
+
}
|
|
70
|
+
const lines = [`Graph ${flat.name ?? "(anonymous)"}`];
|
|
71
|
+
for (const node of sortedNodes(flat.nodes)) {
|
|
72
|
+
const value = opts.includeValues ? ` ${formatValue(node)}` : "";
|
|
73
|
+
const to = outgoing.get(node.id)?.join(", ") ?? "-";
|
|
74
|
+
lines.push(`${node.id} [${node.factory}/${node.status}${value}] -> ${to}`);
|
|
75
|
+
}
|
|
76
|
+
return lines.join("\n");
|
|
77
|
+
}
|
|
78
|
+
function describeToJson(snapshot, opts = {}) {
|
|
79
|
+
const includeEdges = opts.includeEdges ?? true;
|
|
80
|
+
const flat = flattenDescribe(snapshot);
|
|
81
|
+
const payload = {
|
|
82
|
+
...flat.name !== void 0 ? { name: flat.name } : {},
|
|
83
|
+
nodes: sortedNodes(flat.nodes).map((node) => sortJsonValue(node)),
|
|
84
|
+
edges: includeEdges ? sortedEdges(flat.edges) : []
|
|
85
|
+
};
|
|
86
|
+
return JSON.stringify(sortJsonValue(payload), null, opts.indent ?? 2);
|
|
87
|
+
}
|
|
88
|
+
function flattenDescribe(snapshot) {
|
|
89
|
+
const nodes = [];
|
|
90
|
+
const edges = [];
|
|
91
|
+
const visit = (snap) => {
|
|
92
|
+
nodes.push(...snap.nodes);
|
|
93
|
+
edges.push(...snap.edges);
|
|
94
|
+
for (const child of snap.subgraphs ?? []) visit(child);
|
|
95
|
+
};
|
|
96
|
+
visit(snapshot);
|
|
97
|
+
return { ...snapshot.name !== void 0 ? { name: snapshot.name } : {}, nodes, edges };
|
|
98
|
+
}
|
|
99
|
+
function sortedNodes(nodes) {
|
|
100
|
+
return [...nodes].sort((a, b) => compareText(a.id, b.id));
|
|
101
|
+
}
|
|
102
|
+
function sortedEdges(edges) {
|
|
103
|
+
const seen = /* @__PURE__ */ new Set();
|
|
104
|
+
const out = [];
|
|
105
|
+
for (const edge of edges) {
|
|
106
|
+
const key = `${edge.from}\0${edge.to}`;
|
|
107
|
+
if (seen.has(key)) continue;
|
|
108
|
+
seen.add(key);
|
|
109
|
+
out.push(edge);
|
|
110
|
+
}
|
|
111
|
+
return out.sort((a, b) => compareText(a.from, b.from) || compareText(a.to, b.to));
|
|
112
|
+
}
|
|
113
|
+
function compareText(a, b) {
|
|
114
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
115
|
+
}
|
|
116
|
+
function normalizeDirection(direction) {
|
|
117
|
+
if (direction === void 0) return "LR";
|
|
118
|
+
if (direction === "TD" || direction === "LR" || direction === "BT" || direction === "RL") {
|
|
119
|
+
return direction;
|
|
120
|
+
}
|
|
121
|
+
throw new Error(
|
|
122
|
+
`invalid diagram direction ${String(direction)}; expected one of: TD, LR, BT, RL`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
function d2Direction(direction) {
|
|
126
|
+
if (direction === "TD") return "down";
|
|
127
|
+
if (direction === "BT") return "up";
|
|
128
|
+
if (direction === "RL") return "left";
|
|
129
|
+
return "right";
|
|
130
|
+
}
|
|
131
|
+
function escapeMermaidLabel(value) {
|
|
132
|
+
return escapeQuotedLabel(value);
|
|
133
|
+
}
|
|
134
|
+
function escapeD2Label(value) {
|
|
135
|
+
return escapeQuotedLabel(value);
|
|
136
|
+
}
|
|
137
|
+
function escapeQuotedLabel(value) {
|
|
138
|
+
return JSON.stringify(value).slice(1, -1);
|
|
139
|
+
}
|
|
140
|
+
function formatValue(node) {
|
|
141
|
+
if (!("value" in node)) return "<SENTINEL>";
|
|
142
|
+
const value = node.value;
|
|
143
|
+
if (typeof value === "string") return JSON.stringify(value);
|
|
144
|
+
if (typeof value === "number" || typeof value === "boolean" || value == null)
|
|
145
|
+
return String(value);
|
|
146
|
+
try {
|
|
147
|
+
return JSON.stringify(value);
|
|
148
|
+
} catch {
|
|
149
|
+
return "[unserializable]";
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function sortJsonValue(value, seen = /* @__PURE__ */ new WeakSet()) {
|
|
153
|
+
if (typeof value === "bigint") return value.toString();
|
|
154
|
+
if (value === null || typeof value !== "object") return value;
|
|
155
|
+
if (seen.has(value)) return "[Circular]";
|
|
156
|
+
seen.add(value);
|
|
157
|
+
if (Array.isArray(value)) {
|
|
158
|
+
const out2 = value.map((item) => sortJsonValue(item, seen));
|
|
159
|
+
seen.delete(value);
|
|
160
|
+
return out2;
|
|
161
|
+
}
|
|
162
|
+
const obj = value;
|
|
163
|
+
const out = {};
|
|
164
|
+
for (const key of Object.keys(obj).sort(compareText)) out[key] = sortJsonValue(obj[key], seen);
|
|
165
|
+
seen.delete(value);
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
var B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
169
|
+
function base64UrlEncode(value) {
|
|
170
|
+
const bytes = utf8Bytes(value);
|
|
171
|
+
let out = "";
|
|
172
|
+
for (let i = 0; i < bytes.length; i += 3) {
|
|
173
|
+
const a = bytes[i];
|
|
174
|
+
const b = bytes[i + 1];
|
|
175
|
+
const c = bytes[i + 2];
|
|
176
|
+
out += B64[a >> 2];
|
|
177
|
+
out += B64[(a & 3) << 4 | (b ?? 0) >> 4];
|
|
178
|
+
out += b === void 0 ? "=" : B64[(b & 15) << 2 | (c ?? 0) >> 6];
|
|
179
|
+
out += c === void 0 ? "=" : B64[c & 63];
|
|
180
|
+
}
|
|
181
|
+
return out.replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/, "");
|
|
182
|
+
}
|
|
183
|
+
function utf8Bytes(value) {
|
|
184
|
+
const bytes = [];
|
|
185
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
186
|
+
let cp = value.charCodeAt(i);
|
|
187
|
+
if (cp >= 55296 && cp <= 56319 && i + 1 < value.length) {
|
|
188
|
+
const lo = value.charCodeAt(i + 1);
|
|
189
|
+
if (lo >= 56320 && lo <= 57343) {
|
|
190
|
+
cp = 65536 + (cp - 55296 << 10) + (lo - 56320);
|
|
191
|
+
i += 1;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (cp <= 127) bytes.push(cp);
|
|
195
|
+
else if (cp <= 2047) bytes.push(192 | cp >> 6, 128 | cp & 63);
|
|
196
|
+
else if (cp <= 65535)
|
|
197
|
+
bytes.push(224 | cp >> 12, 128 | cp >> 6 & 63, 128 | cp & 63);
|
|
198
|
+
else
|
|
199
|
+
bytes.push(
|
|
200
|
+
240 | cp >> 18,
|
|
201
|
+
128 | cp >> 12 & 63,
|
|
202
|
+
128 | cp >> 6 & 63,
|
|
203
|
+
128 | cp & 63
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
return bytes;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export {
|
|
210
|
+
describeToMermaid,
|
|
211
|
+
mermaidLiveUrl,
|
|
212
|
+
describeToMermaidUrl,
|
|
213
|
+
describeToD2,
|
|
214
|
+
describeToPretty,
|
|
215
|
+
describeToAscii,
|
|
216
|
+
describeToJson
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=chunk-HDRL4VQQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/graph/render.ts"],"sourcesContent":["/**\n * Pure renderers over `DescribeSnapshot` (D39 / D40 tail).\n *\n * Render is graph-layer presentation: no Graph method, no topology mutation, no substrate behavior.\n */\n\nimport type { DescribeEdge, DescribeNode, DescribeSnapshot } from \"./describe.js\";\n\nexport type DiagramDirection = \"TD\" | \"LR\" | \"BT\" | \"RL\";\n\nexport interface DescribeToMermaidOptions {\n\t/** Diagram direction; default \"LR\". */\n\tdirection?: DiagramDirection;\n}\n\nexport type MermaidLiveTheme = \"default\" | \"dark\" | \"forest\" | \"neutral\" | \"base\";\n\nexport interface MermaidLiveUrlOptions {\n\t/** Mermaid Live theme; default \"default\". */\n\ttheme?: MermaidLiveTheme;\n\t/** Mermaid Live auto-sync flag; default true. */\n\tautoSync?: boolean;\n}\n\nexport interface DescribeToMermaidUrlOptions\n\textends DescribeToMermaidOptions,\n\t\tMermaidLiveUrlOptions {}\n\nexport interface DescribeToD2Options {\n\t/** Diagram direction; default \"LR\". */\n\tdirection?: DiagramDirection;\n}\n\nexport interface DescribeToPrettyOptions {\n\t/** Include the Edges section; default true. */\n\tincludeEdges?: boolean;\n}\n\nexport interface DescribeToAsciiOptions {\n\t/** Include cached values; default false. */\n\tincludeValues?: boolean;\n}\n\nexport interface DescribeToJsonOptions {\n\t/** Include edges; default true. */\n\tincludeEdges?: boolean;\n\t/** JSON indent; default 2. */\n\tindent?: number;\n}\n\ninterface FlatSnapshot {\n\tname?: string;\n\tnodes: DescribeNode[];\n\tedges: DescribeEdge[];\n}\n\n/** Render a D39 describe snapshot as Mermaid flowchart text. */\nexport function describeToMermaid(\n\tsnapshot: DescribeSnapshot,\n\topts: DescribeToMermaidOptions = {},\n): string {\n\tconst direction = normalizeDirection(opts.direction);\n\tconst flat = flattenDescribe(snapshot);\n\tconst nodes = sortedNodes(flat.nodes);\n\tconst ids = new Map<string, string>();\n\tfor (let i = 0; i < nodes.length; i += 1) ids.set(nodes[i]!.id, `n${i}`);\n\n\tconst lines = [`flowchart ${direction}`];\n\tfor (const node of nodes) {\n\t\tlines.push(` ${ids.get(node.id)!}[\"${escapeMermaidLabel(node.id)}\"]`);\n\t}\n\tfor (const edge of sortedEdges(flat.edges)) {\n\t\tconst from = ids.get(edge.from);\n\t\tconst to = ids.get(edge.to);\n\t\tif (from === undefined || to === undefined) continue;\n\t\tlines.push(` ${from} --> ${to}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/** Encode arbitrary Mermaid source as a mermaid.live deep link. */\nexport function mermaidLiveUrl(mermaidSource: string, opts: MermaidLiveUrlOptions = {}): string {\n\tconst payload = {\n\t\tcode: mermaidSource,\n\t\tmermaid: { theme: opts.theme ?? \"default\" },\n\t\tautoSync: opts.autoSync ?? true,\n\t};\n\treturn `https://mermaid.live/edit#base64:${base64UrlEncode(JSON.stringify(payload))}`;\n}\n\n/** Render a D39 describe snapshot as a mermaid.live deep link. */\nexport function describeToMermaidUrl(\n\tsnapshot: DescribeSnapshot,\n\topts: DescribeToMermaidUrlOptions = {},\n): string {\n\treturn mermaidLiveUrl(describeToMermaid(snapshot, opts), opts);\n}\n\n/** Render a D39 describe snapshot as D2 diagram text. */\nexport function describeToD2(snapshot: DescribeSnapshot, opts: DescribeToD2Options = {}): string {\n\tconst direction = normalizeDirection(opts.direction);\n\tconst flat = flattenDescribe(snapshot);\n\tconst nodes = sortedNodes(flat.nodes);\n\tconst ids = new Map<string, string>();\n\tfor (let i = 0; i < nodes.length; i += 1) ids.set(nodes[i]!.id, `n${i}`);\n\n\tconst lines = [`direction: ${d2Direction(direction)}`];\n\tfor (const node of nodes) {\n\t\tlines.push(`${ids.get(node.id)!}: \"${escapeD2Label(node.id)}\"`);\n\t}\n\tfor (const edge of sortedEdges(flat.edges)) {\n\t\tconst from = ids.get(edge.from);\n\t\tconst to = ids.get(edge.to);\n\t\tif (from === undefined || to === undefined) continue;\n\t\tlines.push(`${from} -> ${to}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/** Render a D39 describe snapshot as compact human-readable plaintext. */\nexport function describeToPretty(\n\tsnapshot: DescribeSnapshot,\n\topts: DescribeToPrettyOptions = {},\n): string {\n\tconst flat = flattenDescribe(snapshot);\n\tconst includeEdges = opts.includeEdges ?? true;\n\tconst lines: string[] = [`Graph ${flat.name ?? \"(anonymous)\"}`, \"Nodes:\"];\n\tfor (const node of sortedNodes(flat.nodes)) {\n\t\tlines.push(`- ${node.id} (${node.factory}/${node.status}): ${formatValue(node)}`);\n\t}\n\tif (includeEdges) {\n\t\tlines.push(\"Edges:\");\n\t\tfor (const edge of sortedEdges(flat.edges)) lines.push(`- ${edge.from} -> ${edge.to}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/** Render a D39 describe snapshot as a compact ASCII adjacency diagram. */\nexport function describeToAscii(\n\tsnapshot: DescribeSnapshot,\n\topts: DescribeToAsciiOptions = {},\n): string {\n\tconst flat = flattenDescribe(snapshot);\n\tconst outgoing = new Map<string, string[]>();\n\tfor (const edge of sortedEdges(flat.edges)) {\n\t\tconst list = outgoing.get(edge.from);\n\t\tif (list) list.push(edge.to);\n\t\telse outgoing.set(edge.from, [edge.to]);\n\t}\n\tconst lines: string[] = [`Graph ${flat.name ?? \"(anonymous)\"}`];\n\tfor (const node of sortedNodes(flat.nodes)) {\n\t\tconst value = opts.includeValues ? ` ${formatValue(node)}` : \"\";\n\t\tconst to = outgoing.get(node.id)?.join(\", \") ?? \"-\";\n\t\tlines.push(`${node.id} [${node.factory}/${node.status}${value}] -> ${to}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/** Render a D39 describe snapshot as deterministic JSON text. */\nexport function describeToJson(\n\tsnapshot: DescribeSnapshot,\n\topts: DescribeToJsonOptions = {},\n): string {\n\tconst includeEdges = opts.includeEdges ?? true;\n\tconst flat = flattenDescribe(snapshot);\n\tconst payload: FlatSnapshot = {\n\t\t...(flat.name !== undefined ? { name: flat.name } : {}),\n\t\tnodes: sortedNodes(flat.nodes).map((node) => sortJsonValue(node) as DescribeNode),\n\t\tedges: includeEdges ? sortedEdges(flat.edges) : [],\n\t};\n\treturn JSON.stringify(sortJsonValue(payload), null, opts.indent ?? 2);\n}\n\nfunction flattenDescribe(snapshot: DescribeSnapshot): FlatSnapshot {\n\tconst nodes: DescribeNode[] = [];\n\tconst edges: DescribeEdge[] = [];\n\tconst visit = (snap: DescribeSnapshot): void => {\n\t\tnodes.push(...snap.nodes);\n\t\tedges.push(...snap.edges);\n\t\tfor (const child of snap.subgraphs ?? []) visit(child);\n\t};\n\tvisit(snapshot);\n\treturn { ...(snapshot.name !== undefined ? { name: snapshot.name } : {}), nodes, edges };\n}\n\nfunction sortedNodes(nodes: readonly DescribeNode[]): DescribeNode[] {\n\treturn [...nodes].sort((a, b) => compareText(a.id, b.id));\n}\n\nfunction sortedEdges(edges: readonly DescribeEdge[]): DescribeEdge[] {\n\tconst seen = new Set<string>();\n\tconst out: DescribeEdge[] = [];\n\tfor (const edge of edges) {\n\t\tconst key = `${edge.from}\\0${edge.to}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tout.push(edge);\n\t}\n\treturn out.sort((a, b) => compareText(a.from, b.from) || compareText(a.to, b.to));\n}\n\nfunction compareText(a: string, b: string): number {\n\treturn a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction normalizeDirection(direction: unknown): DiagramDirection {\n\tif (direction === undefined) return \"LR\";\n\tif (direction === \"TD\" || direction === \"LR\" || direction === \"BT\" || direction === \"RL\") {\n\t\treturn direction;\n\t}\n\tthrow new Error(\n\t\t`invalid diagram direction ${String(direction)}; expected one of: TD, LR, BT, RL`,\n\t);\n}\n\nfunction d2Direction(direction: DiagramDirection): string {\n\tif (direction === \"TD\") return \"down\";\n\tif (direction === \"BT\") return \"up\";\n\tif (direction === \"RL\") return \"left\";\n\treturn \"right\";\n}\n\nfunction escapeMermaidLabel(value: string): string {\n\treturn escapeQuotedLabel(value);\n}\n\nfunction escapeD2Label(value: string): string {\n\treturn escapeQuotedLabel(value);\n}\n\nfunction escapeQuotedLabel(value: string): string {\n\treturn JSON.stringify(value).slice(1, -1);\n}\n\nfunction formatValue(node: DescribeNode): string {\n\tif (!(\"value\" in node)) return \"<SENTINEL>\";\n\tconst value = node.value;\n\tif (typeof value === \"string\") return JSON.stringify(value);\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value == null)\n\t\treturn String(value);\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch {\n\t\treturn \"[unserializable]\";\n\t}\n}\n\nfunction sortJsonValue(value: unknown, seen: WeakSet<object> = new WeakSet()): unknown {\n\tif (typeof value === \"bigint\") return value.toString();\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (seen.has(value)) return \"[Circular]\";\n\tseen.add(value);\n\tif (Array.isArray(value)) {\n\t\tconst out = value.map((item) => sortJsonValue(item, seen));\n\t\tseen.delete(value);\n\t\treturn out;\n\t}\n\tconst obj = value as Record<string, unknown>;\n\tconst out: Record<string, unknown> = {};\n\tfor (const key of Object.keys(obj).sort(compareText)) out[key] = sortJsonValue(obj[key], seen);\n\tseen.delete(value);\n\treturn out;\n}\n\nconst B64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nfunction base64UrlEncode(value: string): string {\n\tconst bytes = utf8Bytes(value);\n\tlet out = \"\";\n\tfor (let i = 0; i < bytes.length; i += 3) {\n\t\tconst a = bytes[i]!;\n\t\tconst b = bytes[i + 1];\n\t\tconst c = bytes[i + 2];\n\t\tout += B64[a >> 2];\n\t\tout += B64[((a & 0x03) << 4) | ((b ?? 0) >> 4)];\n\t\tout += b === undefined ? \"=\" : B64[((b & 0x0f) << 2) | ((c ?? 0) >> 6)];\n\t\tout += c === undefined ? \"=\" : B64[c & 0x3f];\n\t}\n\treturn out.replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/, \"\");\n}\n\nfunction utf8Bytes(value: string): number[] {\n\tconst bytes: number[] = [];\n\tfor (let i = 0; i < value.length; i += 1) {\n\t\tlet cp = value.charCodeAt(i);\n\t\tif (cp >= 0xd800 && cp <= 0xdbff && i + 1 < value.length) {\n\t\t\tconst lo = value.charCodeAt(i + 1);\n\t\t\tif (lo >= 0xdc00 && lo <= 0xdfff) {\n\t\t\t\tcp = 0x10000 + ((cp - 0xd800) << 10) + (lo - 0xdc00);\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\t\tif (cp <= 0x7f) bytes.push(cp);\n\t\telse if (cp <= 0x7ff) bytes.push(0xc0 | (cp >> 6), 0x80 | (cp & 0x3f));\n\t\telse if (cp <= 0xffff)\n\t\t\tbytes.push(0xe0 | (cp >> 12), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));\n\t\telse\n\t\t\tbytes.push(\n\t\t\t\t0xf0 | (cp >> 18),\n\t\t\t\t0x80 | ((cp >> 12) & 0x3f),\n\t\t\t\t0x80 | ((cp >> 6) & 0x3f),\n\t\t\t\t0x80 | (cp & 0x3f),\n\t\t\t);\n\t}\n\treturn bytes;\n}\n"],"mappings":";AAyDO,SAAS,kBACf,UACA,OAAiC,CAAC,GACzB;AACT,QAAM,YAAY,mBAAmB,KAAK,SAAS;AACnD,QAAM,OAAO,gBAAgB,QAAQ;AACrC,QAAM,QAAQ,YAAY,KAAK,KAAK;AACpC,QAAM,MAAM,oBAAI,IAAoB;AACpC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,EAAG,KAAI,IAAI,MAAM,CAAC,EAAG,IAAI,IAAI,CAAC,EAAE;AAEvE,QAAM,QAAQ,CAAC,aAAa,SAAS,EAAE;AACvC,aAAW,QAAQ,OAAO;AACzB,UAAM,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE,CAAE,KAAK,mBAAmB,KAAK,EAAE,CAAC,IAAI;AAAA,EACtE;AACA,aAAW,QAAQ,YAAY,KAAK,KAAK,GAAG;AAC3C,UAAM,OAAO,IAAI,IAAI,KAAK,IAAI;AAC9B,UAAM,KAAK,IAAI,IAAI,KAAK,EAAE;AAC1B,QAAI,SAAS,UAAa,OAAO,OAAW;AAC5C,UAAM,KAAK,KAAK,IAAI,QAAQ,EAAE,EAAE;AAAA,EACjC;AACA,SAAO,MAAM,KAAK,IAAI;AACvB;AAGO,SAAS,eAAe,eAAuB,OAA8B,CAAC,GAAW;AAC/F,QAAM,UAAU;AAAA,IACf,MAAM;AAAA,IACN,SAAS,EAAE,OAAO,KAAK,SAAS,UAAU;AAAA,IAC1C,UAAU,KAAK,YAAY;AAAA,EAC5B;AACA,SAAO,oCAAoC,gBAAgB,KAAK,UAAU,OAAO,CAAC,CAAC;AACpF;AAGO,SAAS,qBACf,UACA,OAAoC,CAAC,GAC5B;AACT,SAAO,eAAe,kBAAkB,UAAU,IAAI,GAAG,IAAI;AAC9D;AAGO,SAAS,aAAa,UAA4B,OAA4B,CAAC,GAAW;AAChG,QAAM,YAAY,mBAAmB,KAAK,SAAS;AACnD,QAAM,OAAO,gBAAgB,QAAQ;AACrC,QAAM,QAAQ,YAAY,KAAK,KAAK;AACpC,QAAM,MAAM,oBAAI,IAAoB;AACpC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,EAAG,KAAI,IAAI,MAAM,CAAC,EAAG,IAAI,IAAI,CAAC,EAAE;AAEvE,QAAM,QAAQ,CAAC,cAAc,YAAY,SAAS,CAAC,EAAE;AACrD,aAAW,QAAQ,OAAO;AACzB,UAAM,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,CAAE,MAAM,cAAc,KAAK,EAAE,CAAC,GAAG;AAAA,EAC/D;AACA,aAAW,QAAQ,YAAY,KAAK,KAAK,GAAG;AAC3C,UAAM,OAAO,IAAI,IAAI,KAAK,IAAI;AAC9B,UAAM,KAAK,IAAI,IAAI,KAAK,EAAE;AAC1B,QAAI,SAAS,UAAa,OAAO,OAAW;AAC5C,UAAM,KAAK,GAAG,IAAI,OAAO,EAAE,EAAE;AAAA,EAC9B;AACA,SAAO,MAAM,KAAK,IAAI;AACvB;AAGO,SAAS,iBACf,UACA,OAAgC,CAAC,GACxB;AACT,QAAM,OAAO,gBAAgB,QAAQ;AACrC,QAAM,eAAe,KAAK,gBAAgB;AAC1C,QAAM,QAAkB,CAAC,SAAS,KAAK,QAAQ,aAAa,IAAI,QAAQ;AACxE,aAAW,QAAQ,YAAY,KAAK,KAAK,GAAG;AAC3C,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,OAAO,IAAI,KAAK,MAAM,MAAM,YAAY,IAAI,CAAC,EAAE;AAAA,EACjF;AACA,MAAI,cAAc;AACjB,UAAM,KAAK,QAAQ;AACnB,eAAW,QAAQ,YAAY,KAAK,KAAK,EAAG,OAAM,KAAK,KAAK,KAAK,IAAI,OAAO,KAAK,EAAE,EAAE;AAAA,EACtF;AACA,SAAO,MAAM,KAAK,IAAI;AACvB;AAGO,SAAS,gBACf,UACA,OAA+B,CAAC,GACvB;AACT,QAAM,OAAO,gBAAgB,QAAQ;AACrC,QAAM,WAAW,oBAAI,IAAsB;AAC3C,aAAW,QAAQ,YAAY,KAAK,KAAK,GAAG;AAC3C,UAAM,OAAO,SAAS,IAAI,KAAK,IAAI;AACnC,QAAI,KAAM,MAAK,KAAK,KAAK,EAAE;AAAA,QACtB,UAAS,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,EACvC;AACA,QAAM,QAAkB,CAAC,SAAS,KAAK,QAAQ,aAAa,EAAE;AAC9D,aAAW,QAAQ,YAAY,KAAK,KAAK,GAAG;AAC3C,UAAM,QAAQ,KAAK,gBAAgB,IAAI,YAAY,IAAI,CAAC,KAAK;AAC7D,UAAM,KAAK,SAAS,IAAI,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK;AAChD,UAAM,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,OAAO,IAAI,KAAK,MAAM,GAAG,KAAK,QAAQ,EAAE,EAAE;AAAA,EAC1E;AACA,SAAO,MAAM,KAAK,IAAI;AACvB;AAGO,SAAS,eACf,UACA,OAA8B,CAAC,GACtB;AACT,QAAM,eAAe,KAAK,gBAAgB;AAC1C,QAAM,OAAO,gBAAgB,QAAQ;AACrC,QAAM,UAAwB;AAAA,IAC7B,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,IACrD,OAAO,YAAY,KAAK,KAAK,EAAE,IAAI,CAAC,SAAS,cAAc,IAAI,CAAiB;AAAA,IAChF,OAAO,eAAe,YAAY,KAAK,KAAK,IAAI,CAAC;AAAA,EAClD;AACA,SAAO,KAAK,UAAU,cAAc,OAAO,GAAG,MAAM,KAAK,UAAU,CAAC;AACrE;AAEA,SAAS,gBAAgB,UAA0C;AAClE,QAAM,QAAwB,CAAC;AAC/B,QAAM,QAAwB,CAAC;AAC/B,QAAM,QAAQ,CAAC,SAAiC;AAC/C,UAAM,KAAK,GAAG,KAAK,KAAK;AACxB,UAAM,KAAK,GAAG,KAAK,KAAK;AACxB,eAAW,SAAS,KAAK,aAAa,CAAC,EAAG,OAAM,KAAK;AAAA,EACtD;AACA,QAAM,QAAQ;AACd,SAAO,EAAE,GAAI,SAAS,SAAS,SAAY,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC,GAAI,OAAO,MAAM;AACxF;AAEA,SAAS,YAAY,OAAgD;AACpE,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;AACzD;AAEA,SAAS,YAAY,OAAgD;AACpE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAsB,CAAC;AAC7B,aAAW,QAAQ,OAAO;AACzB,UAAM,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,EAAE;AACpC,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,QAAI,KAAK,IAAI;AAAA,EACd;AACA,SAAO,IAAI,KAAK,CAAC,GAAG,MAAM,YAAY,EAAE,MAAM,EAAE,IAAI,KAAK,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;AACjF;AAEA,SAAS,YAAY,GAAW,GAAmB;AAClD,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AACjC;AAEA,SAAS,mBAAmB,WAAsC;AACjE,MAAI,cAAc,OAAW,QAAO;AACpC,MAAI,cAAc,QAAQ,cAAc,QAAQ,cAAc,QAAQ,cAAc,MAAM;AACzF,WAAO;AAAA,EACR;AACA,QAAM,IAAI;AAAA,IACT,6BAA6B,OAAO,SAAS,CAAC;AAAA,EAC/C;AACD;AAEA,SAAS,YAAY,WAAqC;AACzD,MAAI,cAAc,KAAM,QAAO;AAC/B,MAAI,cAAc,KAAM,QAAO;AAC/B,MAAI,cAAc,KAAM,QAAO;AAC/B,SAAO;AACR;AAEA,SAAS,mBAAmB,OAAuB;AAClD,SAAO,kBAAkB,KAAK;AAC/B;AAEA,SAAS,cAAc,OAAuB;AAC7C,SAAO,kBAAkB,KAAK;AAC/B;AAEA,SAAS,kBAAkB,OAAuB;AACjD,SAAO,KAAK,UAAU,KAAK,EAAE,MAAM,GAAG,EAAE;AACzC;AAEA,SAAS,YAAY,MAA4B;AAChD,MAAI,EAAE,WAAW,MAAO,QAAO;AAC/B,QAAM,QAAQ,KAAK;AACnB,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,SAAS;AACvE,WAAO,OAAO,KAAK;AACpB,MAAI;AACH,WAAO,KAAK,UAAU,KAAK;AAAA,EAC5B,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,cAAc,OAAgB,OAAwB,oBAAI,QAAQ,GAAY;AACtF,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,SAAS;AACrD,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,MAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAC5B,OAAK,IAAI,KAAK;AACd,MAAI,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAMA,OAAM,MAAM,IAAI,CAAC,SAAS,cAAc,MAAM,IAAI,CAAC;AACzD,SAAK,OAAO,KAAK;AACjB,WAAOA;AAAA,EACR;AACA,QAAM,MAAM;AACZ,QAAM,MAA+B,CAAC;AACtC,aAAW,OAAO,OAAO,KAAK,GAAG,EAAE,KAAK,WAAW,EAAG,KAAI,GAAG,IAAI,cAAc,IAAI,GAAG,GAAG,IAAI;AAC7F,OAAK,OAAO,KAAK;AACjB,SAAO;AACR;AAEA,IAAM,MAAM;AAEZ,SAAS,gBAAgB,OAAuB;AAC/C,QAAM,QAAQ,UAAU,KAAK;AAC7B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACzC,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,IAAI,MAAM,IAAI,CAAC;AACrB,UAAM,IAAI,MAAM,IAAI,CAAC;AACrB,WAAO,IAAI,KAAK,CAAC;AACjB,WAAO,KAAM,IAAI,MAAS,KAAO,KAAK,MAAM,CAAE;AAC9C,WAAO,MAAM,SAAY,MAAM,KAAM,IAAI,OAAS,KAAO,KAAK,MAAM,CAAE;AACtE,WAAO,MAAM,SAAY,MAAM,IAAI,IAAI,EAAI;AAAA,EAC5C;AACA,SAAO,IAAI,WAAW,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,EAAE,QAAQ,OAAO,EAAE;AACvE;AAEA,SAAS,UAAU,OAAyB;AAC3C,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACzC,QAAI,KAAK,MAAM,WAAW,CAAC;AAC3B,QAAI,MAAM,SAAU,MAAM,SAAU,IAAI,IAAI,MAAM,QAAQ;AACzD,YAAM,KAAK,MAAM,WAAW,IAAI,CAAC;AACjC,UAAI,MAAM,SAAU,MAAM,OAAQ;AACjC,aAAK,SAAY,KAAK,SAAW,OAAO,KAAK;AAC7C,aAAK;AAAA,MACN;AAAA,IACD;AACA,QAAI,MAAM,IAAM,OAAM,KAAK,EAAE;AAAA,aACpB,MAAM,KAAO,OAAM,KAAK,MAAQ,MAAM,GAAI,MAAQ,KAAK,EAAK;AAAA,aAC5D,MAAM;AACd,YAAM,KAAK,MAAQ,MAAM,IAAK,MAAS,MAAM,IAAK,IAAO,MAAQ,KAAK,EAAK;AAAA;AAE3E,YAAM;AAAA,QACL,MAAQ,MAAM;AAAA,QACd,MAAS,MAAM,KAAM;AAAA,QACrB,MAAS,MAAM,IAAK;AAAA,QACpB,MAAQ,KAAK;AAAA,MACd;AAAA,EACF;AACA,SAAO;AACR;","names":["out"]}
|