@bjornpagen/bumbledb-log 0.20.2 → 1.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.
Files changed (192) hide show
  1. package/README.md +275 -114
  2. package/dist/admin.d.ts +24 -0
  3. package/dist/admin.d.ts.map +1 -0
  4. package/dist/admin.js +12 -0
  5. package/dist/admin.js.map +1 -0
  6. package/dist/bridge.d.ts +30 -0
  7. package/dist/bridge.d.ts.map +1 -0
  8. package/dist/bridge.js +92 -0
  9. package/dist/bridge.js.map +1 -0
  10. package/dist/codes.d.ts +11 -0
  11. package/dist/codes.d.ts.map +1 -0
  12. package/dist/codes.js +53 -0
  13. package/dist/codes.js.map +1 -0
  14. package/dist/command.d.ts +21 -0
  15. package/dist/command.d.ts.map +1 -0
  16. package/dist/command.js +12 -0
  17. package/dist/command.js.map +1 -0
  18. package/dist/errors.d.ts +78 -197
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +144 -114
  21. package/dist/errors.js.map +1 -1
  22. package/dist/history.d.ts +22 -0
  23. package/dist/history.d.ts.map +1 -0
  24. package/dist/history.js +12 -0
  25. package/dist/history.js.map +1 -0
  26. package/dist/identity.d.ts +144 -0
  27. package/dist/identity.d.ts.map +1 -0
  28. package/dist/identity.js +223 -0
  29. package/dist/identity.js.map +1 -0
  30. package/dist/index.d.ts +24 -31
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +16 -21
  33. package/dist/index.js.map +1 -1
  34. package/dist/machine.d.ts +151 -0
  35. package/dist/machine.d.ts.map +1 -0
  36. package/dist/machine.js +1128 -0
  37. package/dist/machine.js.map +1 -0
  38. package/dist/migration-ops.d.ts +20 -0
  39. package/dist/migration-ops.d.ts.map +1 -0
  40. package/dist/migration-ops.js +7 -0
  41. package/dist/migration-ops.js.map +1 -0
  42. package/dist/migrations/bin.d.ts +3 -0
  43. package/dist/migrations/bin.d.ts.map +1 -0
  44. package/dist/migrations/bin.js +43 -0
  45. package/dist/migrations/bin.js.map +1 -0
  46. package/dist/migrations/canonical.d.ts +40 -0
  47. package/dist/migrations/canonical.d.ts.map +1 -0
  48. package/dist/migrations/canonical.js +156 -0
  49. package/dist/migrations/canonical.js.map +1 -0
  50. package/dist/migrations/cli.d.ts +32 -0
  51. package/dist/migrations/cli.d.ts.map +1 -0
  52. package/dist/migrations/cli.js +147 -0
  53. package/dist/migrations/cli.js.map +1 -0
  54. package/dist/migrations/codec.d.ts +74 -0
  55. package/dist/migrations/codec.d.ts.map +1 -0
  56. package/dist/migrations/codec.js +2 -0
  57. package/dist/migrations/codec.js.map +1 -0
  58. package/dist/migrations/decode.d.ts +16 -0
  59. package/dist/migrations/decode.d.ts.map +1 -0
  60. package/dist/migrations/decode.js +302 -0
  61. package/dist/migrations/decode.js.map +1 -0
  62. package/dist/migrations/diff.d.ts +39 -0
  63. package/dist/migrations/diff.d.ts.map +1 -0
  64. package/dist/migrations/diff.js +385 -0
  65. package/dist/migrations/diff.js.map +1 -0
  66. package/dist/migrations/expr.d.ts +22 -0
  67. package/dist/migrations/expr.d.ts.map +1 -0
  68. package/dist/migrations/expr.js +228 -0
  69. package/dist/migrations/expr.js.map +1 -0
  70. package/dist/migrations/fail.d.ts +34 -0
  71. package/dist/migrations/fail.d.ts.map +1 -0
  72. package/dist/migrations/fail.js +69 -0
  73. package/dist/migrations/fail.js.map +1 -0
  74. package/dist/migrations/fsops.d.ts +37 -0
  75. package/dist/migrations/fsops.d.ts.map +1 -0
  76. package/dist/migrations/fsops.js +222 -0
  77. package/dist/migrations/fsops.js.map +1 -0
  78. package/dist/migrations/generate.d.ts +11 -0
  79. package/dist/migrations/generate.d.ts.map +1 -0
  80. package/dist/migrations/generate.js +479 -0
  81. package/dist/migrations/generate.js.map +1 -0
  82. package/dist/migrations/index.d.ts +25 -0
  83. package/dist/migrations/index.d.ts.map +1 -0
  84. package/dist/migrations/index.js +6 -0
  85. package/dist/migrations/index.js.map +1 -0
  86. package/dist/migrations/intent.d.ts +86 -0
  87. package/dist/migrations/intent.d.ts.map +1 -0
  88. package/dist/migrations/intent.js +97 -0
  89. package/dist/migrations/intent.js.map +1 -0
  90. package/dist/migrations/lock.d.ts +27 -0
  91. package/dist/migrations/lock.d.ts.map +1 -0
  92. package/dist/migrations/lock.js +14 -0
  93. package/dist/migrations/lock.js.map +1 -0
  94. package/dist/migrations/native.d.ts +37 -0
  95. package/dist/migrations/native.d.ts.map +1 -0
  96. package/dist/migrations/native.js +135 -0
  97. package/dist/migrations/native.js.map +1 -0
  98. package/dist/migrations/repo.d.ts +38 -0
  99. package/dist/migrations/repo.d.ts.map +1 -0
  100. package/dist/migrations/repo.js +191 -0
  101. package/dist/migrations/repo.js.map +1 -0
  102. package/dist/migrations/theory.d.ts +21 -0
  103. package/dist/migrations/theory.d.ts.map +1 -0
  104. package/dist/migrations/theory.js +107 -0
  105. package/dist/migrations/theory.js.map +1 -0
  106. package/dist/migrations/types.d.ts +243 -0
  107. package/dist/migrations/types.d.ts.map +1 -0
  108. package/dist/migrations/types.js +2 -0
  109. package/dist/migrations/types.js.map +1 -0
  110. package/dist/migrations/workflow.d.ts +11 -0
  111. package/dist/migrations/workflow.d.ts.map +1 -0
  112. package/dist/migrations/workflow.js +14 -0
  113. package/dist/migrations/workflow.js.map +1 -0
  114. package/dist/native.d.ts +600 -0
  115. package/dist/native.d.ts.map +1 -0
  116. package/dist/native.js +8 -0
  117. package/dist/native.js.map +1 -0
  118. package/dist/options.d.ts +106 -0
  119. package/dist/options.d.ts.map +1 -0
  120. package/dist/options.js +2 -0
  121. package/dist/options.js.map +1 -0
  122. package/dist/outcome.d.ts +291 -0
  123. package/dist/outcome.d.ts.map +1 -0
  124. package/dist/outcome.js +2 -0
  125. package/dist/outcome.js.map +1 -0
  126. package/dist/production.d.ts +12 -0
  127. package/dist/production.d.ts.map +1 -0
  128. package/dist/production.js +29 -0
  129. package/dist/production.js.map +1 -0
  130. package/dist/schema.d.ts +10 -0
  131. package/dist/schema.d.ts.map +1 -0
  132. package/dist/schema.js +9 -0
  133. package/dist/schema.js.map +1 -0
  134. package/dist/surface.d.ts +80 -0
  135. package/dist/surface.d.ts.map +1 -0
  136. package/dist/surface.js +2 -0
  137. package/dist/surface.js.map +1 -0
  138. package/dist/tenants.d.ts +20 -52
  139. package/dist/tenants.d.ts.map +1 -1
  140. package/dist/tenants.js +11 -330
  141. package/dist/tenants.js.map +1 -1
  142. package/pack-provenance.json +7 -0
  143. package/package.json +20 -23
  144. package/dist/braids.d.ts +0 -28
  145. package/dist/braids.d.ts.map +0 -1
  146. package/dist/braids.js +0 -45
  147. package/dist/braids.js.map +0 -1
  148. package/dist/bytes.d.ts +0 -26
  149. package/dist/bytes.d.ts.map +0 -1
  150. package/dist/bytes.js +0 -86
  151. package/dist/bytes.js.map +0 -1
  152. package/dist/chain.d.ts +0 -56
  153. package/dist/chain.d.ts.map +0 -1
  154. package/dist/chain.js +0 -137
  155. package/dist/chain.js.map +0 -1
  156. package/dist/codec.d.ts +0 -71
  157. package/dist/codec.d.ts.map +0 -1
  158. package/dist/codec.js +0 -179
  159. package/dist/codec.js.map +0 -1
  160. package/dist/descriptor.d.ts +0 -61
  161. package/dist/descriptor.d.ts.map +0 -1
  162. package/dist/descriptor.js +0 -160
  163. package/dist/descriptor.js.map +0 -1
  164. package/dist/keys.d.ts +0 -52
  165. package/dist/keys.d.ts.map +0 -1
  166. package/dist/keys.js +0 -166
  167. package/dist/keys.js.map +0 -1
  168. package/dist/manifest.d.ts +0 -42
  169. package/dist/manifest.d.ts.map +0 -1
  170. package/dist/manifest.js +0 -116
  171. package/dist/manifest.js.map +0 -1
  172. package/dist/replica.d.ts +0 -154
  173. package/dist/replica.d.ts.map +0 -1
  174. package/dist/replica.js +0 -820
  175. package/dist/replica.js.map +0 -1
  176. package/dist/store-s3.d.ts +0 -31
  177. package/dist/store-s3.d.ts.map +0 -1
  178. package/dist/store-s3.js +0 -299
  179. package/dist/store-s3.js.map +0 -1
  180. package/dist/store.d.ts +0 -129
  181. package/dist/store.d.ts.map +0 -1
  182. package/dist/store.js +0 -577
  183. package/dist/store.js.map +0 -1
  184. package/dist/tilde-family.json +0 -21
  185. package/dist/vector.d.ts +0 -31
  186. package/dist/vector.d.ts.map +0 -1
  187. package/dist/vector.js +0 -87
  188. package/dist/vector.js.map +0 -1
  189. package/dist/writer.d.ts +0 -106
  190. package/dist/writer.d.ts.map +0 -1
  191. package/dist/writer.js +0 -677
  192. package/dist/writer.js.map +0 -1
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The one native-codec seam of the migration GENERATOR (C11). Everything
3
+ * semantic — schema validation, canonical SchemaId, snapshot rendering, plan
4
+ * validation/rendering/digesting, manifest verification/appending, plan-set
5
+ * digests — happens in the native codec (P09: `schema_file::{schema_id,
6
+ * render}`, `migration::plan`, `migration::manifest`) reached through the P06
7
+ * bridge. TypeScript never reimplements framing, hashing or scalar
8
+ * arithmetic; this interface only names the two bounded read entrypoints the
9
+ * generator calls. `#migrations/native.ts` binds the production codec;
10
+ * authored tests drive the same generator through a scripted codec because
11
+ * physical digest bytes remain provisional until the F3 format freeze (C12).
12
+ *
13
+ * This module is types only — importing it performs no native work and does
14
+ * not load the addon.
15
+ */
16
+ import type { ExecutionPolicy, NativeRuntime, SchemaSpec } from "@bjornpagen/bumbledb";
17
+ import type { Effect } from "effect";
18
+ import type { LogError } from "../errors.js";
19
+ import type { JsonValue } from "./canonical.js";
20
+ export interface SchemaIdentity {
21
+ /** Canonical schema fingerprint, 64 lowercase hex (core v6 stream). */
22
+ readonly schemaId: string;
23
+ /** The canonical `schema_file::render` text, written verbatim to meta/. */
24
+ readonly snapshot: string;
25
+ }
26
+ export interface EntryPayload {
27
+ readonly sequence: string;
28
+ readonly id: string;
29
+ readonly fromSchemaId: string;
30
+ readonly toSchemaId: string;
31
+ readonly planDigest: string;
32
+ readonly prefixDigest: string;
33
+ }
34
+ export interface ChainRequest {
35
+ /** Parsed `manifest.json` tree when the repo has one; null roots a fresh chain. */
36
+ readonly manifest: JsonValue | null;
37
+ /** Required when `manifest` is null: the declared empty-base schema. */
38
+ readonly baseSchemaId: string | null;
39
+ /** Every recorded schema snapshot's parsed tree, in manifest order. */
40
+ readonly snapshots: readonly JsonValue[];
41
+ /** Every recorded plan's parsed tree, in manifest order (`bind_plans`). */
42
+ readonly plans: readonly JsonValue[];
43
+ /** A new plan to validate + append (data tree, `parse_plan` grammar). */
44
+ readonly append: JsonValue | null;
45
+ /** Request a `plan_set_digest` over entries [first, first+count). */
46
+ readonly planSet: {
47
+ readonly first: number;
48
+ readonly count: number;
49
+ } | null;
50
+ }
51
+ export interface ChainPayload {
52
+ readonly headPrefixDigest: string;
53
+ readonly planSetDigest: string | null;
54
+ readonly appended: {
55
+ readonly entry: EntryPayload;
56
+ /** Canonical `render_plan` text: written verbatim, never reformatted. */
57
+ readonly planText: string;
58
+ /** Canonical `render_manifest` text after the append. */
59
+ readonly manifestText: string;
60
+ } | null;
61
+ }
62
+ export interface MigrationCodec {
63
+ /** Validate + fingerprint + render the current schema natively. */
64
+ schemaIdentity(spec: SchemaSpec, work: ExecutionPolicy): Effect.Effect<SchemaIdentity, LogError, NativeRuntime>;
65
+ /**
66
+ * One native chain pass: parse + verify the manifest, bind every recorded
67
+ * plan's canonical digest, optionally validate/append a new plan (returning
68
+ * its canonical rendered text, the new manifest text and the new entry),
69
+ * and optionally compute a pending plan-set digest. Nothing is trusted
70
+ * from text.
71
+ */
72
+ verifyChain(request: ChainRequest, work: ExecutionPolicy): Effect.Effect<ChainPayload, LogError, NativeRuntime>;
73
+ }
74
+ //# sourceMappingURL=codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/migrations/codec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEzD,MAAM,WAAW,cAAc;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAA;IACnC,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;IACxC,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;IACpC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAA;IACjC,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC3E;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE;QAClB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;QAC5B,yEAAyE;QACzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;QACzB,yDAAyD;QACzD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;KAC7B,GAAG,IAAI,CAAA;CACR;AAED,MAAM,WAAW,cAAc;IAC9B,mEAAmE;IACnE,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;IAC/G;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;CAC/G"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/migrations/codec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { ActivationRef, GeneratedMigrations, MigrationManifest, MigrationPlan, RuntimeContract } from "./types.js";
2
+ export type DecodeResult<A> = {
3
+ readonly ok: true;
4
+ readonly value: A;
5
+ } | {
6
+ readonly ok: false;
7
+ readonly detail: string;
8
+ };
9
+ export declare function decodeManifestData(value: unknown): DecodeResult<MigrationManifest>;
10
+ export declare function decodePlanData(value: unknown): DecodeResult<MigrationPlan>;
11
+ export declare function decodeGeneratedMigrations(value: unknown): DecodeResult<GeneratedMigrations>;
12
+ export declare function decodeRuntimeContract(value: unknown): DecodeResult<RuntimeContract>;
13
+ export declare function decodeActivationRef(value: unknown): DecodeResult<ActivationRef>;
14
+ /** Decode a persisted ready-to-switch migrate outcome's activation field. */
15
+ export declare function decodeReadyToSwitchActivation(value: unknown): DecodeResult<ActivationRef>;
16
+ //# sourceMappingURL=decode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../src/migrations/decode.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACX,aAAa,EACb,mBAAmB,EAEnB,iBAAiB,EACjB,aAAa,EAIb,eAAe,EACf,MAAM,sBAAsB,CAAA;AAuB7B,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAMxH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAOlF;AAgED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,CAuD1E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,CA2C3F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,eAAe,CAAC,CAoBnF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,CA2E/E;AAED,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,CAQzF"}
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Bounded runtime decoding of untrusted generated data. The admin runner
3
+ * consumes the static index import — plain JSON data — and never trusts it:
4
+ * every plan and the manifest are structurally re-decoded here before
5
+ * anything crosses the bridge, and the native codec re-judges them again
6
+ * from canonical frames. A well-shaped object is still not a checked plan.
7
+ */
8
+ import { Result, Schema } from "effect";
9
+ import { DatabaseId, DecisionDigest, IncarnationId, OperationId, PlanSetDigest, parseDatabaseIdentity, parseSchemaId } from "#identity.ts";
10
+ import { planExpressionOf, planValueOf } from "#migrations/expr.ts";
11
+ const MAX_OPERATIONS = 65536;
12
+ const MAX_ROWS = 1_000_000;
13
+ const ManifestModel = Schema.Struct({
14
+ manifestVersion: Schema.Literal(1),
15
+ planVersion: Schema.Literal(1),
16
+ baseSchemaId: Schema.String,
17
+ basePrefixDigest: Schema.String,
18
+ entries: Schema.Array(Schema.Struct({
19
+ sequence: Schema.String,
20
+ id: Schema.String,
21
+ fromSchemaId: Schema.String,
22
+ toSchemaId: Schema.String,
23
+ planDigest: Schema.String,
24
+ prefixDigest: Schema.String
25
+ }))
26
+ });
27
+ const decodeManifestModel = Schema.decodeUnknownOption(ManifestModel);
28
+ function bad(detail) {
29
+ return { ok: false, detail };
30
+ }
31
+ export function decodeManifestData(value) {
32
+ const decoded = decodeManifestModel(value);
33
+ if (decoded._tag === "None") {
34
+ return bad("manifest shape");
35
+ }
36
+ const entries = decoded.value.entries;
37
+ return { ok: true, value: { ...decoded.value, entries } };
38
+ }
39
+ function isRecord(value) {
40
+ return typeof value === "object" && value !== null && !Array.isArray(value);
41
+ }
42
+ function decodeOperation(value) {
43
+ if (!isRecord(value) || typeof value.kind !== "string") {
44
+ return "operation shape";
45
+ }
46
+ switch (value.kind) {
47
+ case "map-relation": {
48
+ if (typeof value.source !== "string" || typeof value.target !== "string" || !Array.isArray(value.fields)) {
49
+ return "map-relation shape";
50
+ }
51
+ const fields = [];
52
+ for (const field of value.fields) {
53
+ if (!isRecord(field) || typeof field.target !== "string") {
54
+ return "map-relation field shape";
55
+ }
56
+ const expression = planExpressionOf(field.expression);
57
+ if (!expression.ok) {
58
+ return expression.detail;
59
+ }
60
+ fields.push({ target: field.target, expression: expression.expression });
61
+ }
62
+ return { kind: "map-relation", source: value.source, target: value.target, fields };
63
+ }
64
+ case "empty-relation":
65
+ return typeof value.target === "string"
66
+ ? { kind: "empty-relation", target: value.target }
67
+ : "empty-relation shape";
68
+ case "drop-relation":
69
+ return typeof value.source === "string" ? { kind: "drop-relation", source: value.source } : "drop-relation shape";
70
+ case "seed": {
71
+ if (typeof value.target !== "string" || !Array.isArray(value.rows) || value.rows.length > MAX_ROWS) {
72
+ return "seed shape";
73
+ }
74
+ const rows = [];
75
+ for (const row of value.rows) {
76
+ if (!Array.isArray(row)) {
77
+ return "seed row shape";
78
+ }
79
+ const cells = [];
80
+ for (const cell of row) {
81
+ const decoded = planValueOf(cell);
82
+ if (typeof decoded === "string") {
83
+ return decoded;
84
+ }
85
+ cells.push(decoded);
86
+ }
87
+ rows.push(cells);
88
+ }
89
+ return { kind: "seed", target: value.target, rows };
90
+ }
91
+ case "validate-schema":
92
+ return typeof value.schemaId === "string"
93
+ ? { kind: "validate-schema", schemaId: value.schemaId }
94
+ : "validate-schema shape";
95
+ default:
96
+ return `unknown operation kind ${value.kind}`;
97
+ }
98
+ }
99
+ export function decodePlanData(value) {
100
+ if (!isRecord(value)) {
101
+ return bad("plan shape");
102
+ }
103
+ if (value.planVersion !== 1) {
104
+ return bad("unsupported planVersion");
105
+ }
106
+ if (typeof value.sequence !== "string" ||
107
+ typeof value.id !== "string" ||
108
+ typeof value.fromSchemaId !== "string" ||
109
+ typeof value.toSchemaId !== "string" ||
110
+ !Array.isArray(value.operations) ||
111
+ value.operations.length > MAX_OPERATIONS) {
112
+ return bad("plan shape");
113
+ }
114
+ const operations = [];
115
+ for (const operation of value.operations) {
116
+ const decoded = decodeOperation(operation);
117
+ if (typeof decoded === "string") {
118
+ return bad(decoded);
119
+ }
120
+ operations.push(decoded);
121
+ }
122
+ const destructive = [];
123
+ if (value.destructive !== undefined) {
124
+ if (!Array.isArray(value.destructive)) {
125
+ return bad("destructive shape");
126
+ }
127
+ for (const loss of value.destructive) {
128
+ if (!isRecord(loss) || typeof loss.relation !== "string") {
129
+ return bad("destructive entry shape");
130
+ }
131
+ if (loss.field === undefined || loss.field === null) {
132
+ destructive.push({ relation: loss.relation });
133
+ }
134
+ else if (typeof loss.field === "string") {
135
+ destructive.push({ relation: loss.relation, field: loss.field });
136
+ }
137
+ else {
138
+ return bad("destructive field shape");
139
+ }
140
+ }
141
+ }
142
+ return {
143
+ ok: true,
144
+ value: {
145
+ planVersion: 1,
146
+ sequence: value.sequence,
147
+ id: value.id,
148
+ fromSchemaId: value.fromSchemaId,
149
+ toSchemaId: value.toSchemaId,
150
+ operations,
151
+ destructive
152
+ }
153
+ };
154
+ }
155
+ export function decodeGeneratedMigrations(value) {
156
+ if (!isRecord(value)) {
157
+ return bad("generated migrations shape");
158
+ }
159
+ const manifest = decodeManifestData(value.manifest);
160
+ if (!manifest.ok) {
161
+ return bad(manifest.detail);
162
+ }
163
+ if (!Array.isArray(value.plans)) {
164
+ return bad("plans shape");
165
+ }
166
+ if (value.plans.length !== manifest.value.entries.length) {
167
+ return bad("plan count does not match the manifest");
168
+ }
169
+ if (!Array.isArray(value.snapshots) || value.snapshots.length !== manifest.value.entries.length + 1) {
170
+ return bad("snapshots must be the empty-base schema plus one target per entry");
171
+ }
172
+ const snapshots = [];
173
+ for (const [index, raw] of value.snapshots.entries()) {
174
+ if (typeof raw !== "string" || raw.length === 0) {
175
+ return bad(`snapshot ${index} must be nonempty canonical schema-file text`);
176
+ }
177
+ snapshots.push(raw);
178
+ }
179
+ const plans = [];
180
+ for (const [index, raw] of value.plans.entries()) {
181
+ const plan = decodePlanData(raw);
182
+ if (!plan.ok) {
183
+ return bad(`plan ${index}: ${plan.detail}`);
184
+ }
185
+ const entry = manifest.value.entries[index];
186
+ if (entry === undefined ||
187
+ plan.value.sequence !== entry.sequence ||
188
+ plan.value.id !== entry.id ||
189
+ plan.value.fromSchemaId !== entry.fromSchemaId ||
190
+ plan.value.toSchemaId !== entry.toSchemaId) {
191
+ return bad(`plan ${index} disagrees with its manifest entry`);
192
+ }
193
+ plans.push(plan.value);
194
+ }
195
+ return { ok: true, value: { manifest: manifest.value, plans, snapshots } };
196
+ }
197
+ export function decodeRuntimeContract(value) {
198
+ if (!isRecord(value)) {
199
+ return bad("runtime contract shape");
200
+ }
201
+ if (value.contractVersion !== 1) {
202
+ return bad("unsupported contractVersion");
203
+ }
204
+ if (typeof value.schemaId !== "string" || typeof value.appliedPrefixDigest !== "string") {
205
+ return bad("runtime contract shape");
206
+ }
207
+ const steps = value.steps === undefined ? "0" : String(value.steps);
208
+ return {
209
+ ok: true,
210
+ value: {
211
+ contractVersion: 1,
212
+ schemaId: value.schemaId,
213
+ appliedPrefixDigest: value.appliedPrefixDigest,
214
+ steps
215
+ }
216
+ };
217
+ }
218
+ export function decodeActivationRef(value) {
219
+ if (!isRecord(value)) {
220
+ return bad("activation shape");
221
+ }
222
+ if (typeof value.operation !== "string") {
223
+ return bad("activation operation");
224
+ }
225
+ if (typeof value.planSetDigest !== "string") {
226
+ return bad("activation planSetDigest");
227
+ }
228
+ if (typeof value.targetGenesis !== "string") {
229
+ return bad("activation targetGenesis");
230
+ }
231
+ const operation = OperationId.parse(value.operation);
232
+ if (Result.isFailure(operation)) {
233
+ return bad("activation operation");
234
+ }
235
+ const planSetDigest = PlanSetDigest.fromHex(value.planSetDigest);
236
+ if (Result.isFailure(planSetDigest)) {
237
+ return bad("activation planSetDigest");
238
+ }
239
+ const targetGenesis = DecisionDigest.fromHex(value.targetGenesis);
240
+ if (Result.isFailure(targetGenesis)) {
241
+ return bad("activation targetGenesis");
242
+ }
243
+ if (typeof value.target === "string") {
244
+ const target = parseDatabaseIdentity(value.target);
245
+ if (Result.isFailure(target)) {
246
+ return bad("activation target");
247
+ }
248
+ return {
249
+ ok: true,
250
+ value: {
251
+ operation: operation.success,
252
+ planSetDigest: planSetDigest.success,
253
+ target: target.success,
254
+ targetGenesis: targetGenesis.success
255
+ }
256
+ };
257
+ }
258
+ if (!isRecord(value.target)) {
259
+ return bad("activation target");
260
+ }
261
+ if (typeof value.target.databaseId !== "string" ||
262
+ typeof value.target.incarnationId !== "string" ||
263
+ typeof value.target.schemaId !== "string") {
264
+ return bad("activation target");
265
+ }
266
+ const databaseId = DatabaseId.parse(value.target.databaseId);
267
+ if (Result.isFailure(databaseId)) {
268
+ return bad("activation target databaseId");
269
+ }
270
+ const incarnationId = IncarnationId.parse(value.target.incarnationId);
271
+ if (Result.isFailure(incarnationId)) {
272
+ return bad("activation target incarnationId");
273
+ }
274
+ const schemaId = parseSchemaId(value.target.schemaId);
275
+ if (Result.isFailure(schemaId)) {
276
+ return bad("activation target schemaId");
277
+ }
278
+ return {
279
+ ok: true,
280
+ value: {
281
+ operation: operation.success,
282
+ planSetDigest: planSetDigest.success,
283
+ target: {
284
+ databaseId: databaseId.success,
285
+ incarnationId: incarnationId.success,
286
+ schemaId: schemaId.success
287
+ },
288
+ targetGenesis: targetGenesis.success
289
+ }
290
+ };
291
+ }
292
+ /** Decode a persisted ready-to-switch migrate outcome's activation field. */
293
+ export function decodeReadyToSwitchActivation(value) {
294
+ if (!isRecord(value)) {
295
+ return bad("migrate outcome shape");
296
+ }
297
+ if (value.kind !== "completed" || !isRecord(value.value) || value.value.kind !== "ready-to-switch") {
298
+ return bad("migrate outcome is not ready-to-switch");
299
+ }
300
+ return decodeActivationRef(value.value.activation);
301
+ }
302
+ //# sourceMappingURL=decode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode.js","sourceRoot":"","sources":["../../src/migrations/decode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The pure schema diff: previous canonical snapshot versus current canonical
3
+ * snapshot, plus declared typed intent. Structural inference happens ONLY
4
+ * where one safe interpretation exists (unchanged relations/fields carried by
5
+ * identity projections, whole-relation additions, reorders); ambiguous
6
+ * rename-versus-drop, data destruction, required backfills and type changes
7
+ * REQUIRE typed intent or the diff returns the complete finite requirement
8
+ * list — generation never guesses from matching shapes and never fabricates
9
+ * a zero/null.
10
+ *
11
+ * Output is inert plan data with TOTAL ordinary-relation coverage (C11):
12
+ * every ordinary source relation becomes exactly one `map-relation` or
13
+ * `drop-relation`; every ordinary target relation exactly one
14
+ * `map-relation`/`empty-relation`. A source field no expression references is
15
+ * data loss and appears in `destructive` exactly once. Closed relations are
16
+ * sealed schema axioms — unnameable by data operations and exempt from
17
+ * coverage; their evolution is the schema change itself.
18
+ */
19
+ import type { IntentRequirement } from "./fail.js";
20
+ import type { MigrationIntentEntry } from "./intent.js";
21
+ import type { PlanLoss, PlanOperation, TheorySnapshot } from "./types.js";
22
+ export interface DiffResult {
23
+ /** Maps, empties and drops in canonical order (no seeds, no validate). */
24
+ readonly operations: readonly PlanOperation[];
25
+ readonly destructive: readonly PlanLoss[];
26
+ /** Ordinary target relations receiving declarative seed rows, target order. */
27
+ readonly seedRelations: readonly string[];
28
+ /** Deterministic tokens for the derived human label. */
29
+ readonly labelTokens: readonly string[];
30
+ /** Nonempty means: refuse generation with exactly these requirements. */
31
+ readonly requirements: readonly IntentRequirement[];
32
+ /**
33
+ * True only when every ordinary map is an identity projection.
34
+ * An explicit same-schema convert (units+1) is not identity.
35
+ */
36
+ readonly identity: boolean;
37
+ }
38
+ export declare function diffSchemas(prev: TheorySnapshot, next: TheorySnapshot, entries: readonly MigrationIntentEntry[]): DiffResult;
39
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/migrations/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,KAAK,EAAgB,QAAQ,EAAE,aAAa,EAAkB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEjH,MAAM,WAAW,UAAU;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAA;IAC7C,QAAQ,CAAC,WAAW,EAAE,SAAS,QAAQ,EAAE,CAAA;IACzC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;IACzC,wDAAwD;IACxD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACnD;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC1B;AAwBD,wBAAgB,WAAW,CAC1B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,SAAS,oBAAoB,EAAE,GACtC,UAAU,CA4fZ"}