@lix-js/sdk 0.6.0-preview.1 → 0.6.0-preview.2

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 (191) hide show
  1. package/SKILL.md +305 -320
  2. package/dist/engine-wasm/wasm/lix_engine.d.ts +5 -0
  3. package/dist/engine-wasm/wasm/lix_engine.js +9 -13
  4. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  5. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +1 -0
  6. package/dist/open-lix.d.ts +103 -14
  7. package/dist/open-lix.js +3 -0
  8. package/dist/sqlite/index.js +99 -22
  9. package/dist-engine-src/README.md +18 -0
  10. package/dist-engine-src/src/backend/kv.rs +358 -0
  11. package/dist-engine-src/src/backend/mod.rs +12 -0
  12. package/dist-engine-src/src/backend/testing.rs +658 -0
  13. package/dist-engine-src/src/backend/types.rs +96 -0
  14. package/dist-engine-src/src/binary_cas/chunking.rs +31 -0
  15. package/dist-engine-src/src/binary_cas/codec.rs +346 -0
  16. package/dist-engine-src/src/binary_cas/context.rs +139 -0
  17. package/dist-engine-src/src/binary_cas/kv.rs +1063 -0
  18. package/dist-engine-src/src/binary_cas/mod.rs +11 -0
  19. package/dist-engine-src/src/binary_cas/types.rs +127 -0
  20. package/dist-engine-src/src/cel/context.rs +86 -0
  21. package/dist-engine-src/src/cel/error.rs +19 -0
  22. package/dist-engine-src/src/cel/mod.rs +8 -0
  23. package/dist-engine-src/src/cel/provider.rs +9 -0
  24. package/dist-engine-src/src/cel/runtime.rs +167 -0
  25. package/dist-engine-src/src/cel/value.rs +50 -0
  26. package/dist-engine-src/src/changelog/codec.rs +321 -0
  27. package/dist-engine-src/src/changelog/context.rs +92 -0
  28. package/dist-engine-src/src/changelog/materialization.rs +121 -0
  29. package/dist-engine-src/src/changelog/mod.rs +13 -0
  30. package/dist-engine-src/src/changelog/reader.rs +20 -0
  31. package/dist-engine-src/src/changelog/storage.rs +220 -0
  32. package/dist-engine-src/src/changelog/types.rs +38 -0
  33. package/dist-engine-src/src/commit_graph/context.rs +1588 -0
  34. package/dist-engine-src/src/commit_graph/mod.rs +12 -0
  35. package/dist-engine-src/src/commit_graph/types.rs +145 -0
  36. package/dist-engine-src/src/commit_graph/walker.rs +780 -0
  37. package/dist-engine-src/src/common/error.rs +313 -0
  38. package/dist-engine-src/src/common/fingerprint.rs +3 -0
  39. package/dist-engine-src/src/common/fs_path.rs +1336 -0
  40. package/dist-engine-src/src/common/identity.rs +135 -0
  41. package/dist-engine-src/src/common/metadata.rs +35 -0
  42. package/dist-engine-src/src/common/mod.rs +23 -0
  43. package/dist-engine-src/src/common/types.rs +105 -0
  44. package/dist-engine-src/src/common/wire.rs +222 -0
  45. package/dist-engine-src/src/engine.rs +239 -0
  46. package/dist-engine-src/src/entity_identity.rs +285 -0
  47. package/dist-engine-src/src/functions/context.rs +327 -0
  48. package/dist-engine-src/src/functions/deterministic.rs +113 -0
  49. package/dist-engine-src/src/functions/mod.rs +18 -0
  50. package/dist-engine-src/src/functions/provider.rs +130 -0
  51. package/dist-engine-src/src/functions/state.rs +363 -0
  52. package/dist-engine-src/src/functions/types.rs +37 -0
  53. package/dist-engine-src/src/init.rs +505 -0
  54. package/dist-engine-src/src/json_store/compression.rs +77 -0
  55. package/dist-engine-src/src/json_store/context.rs +129 -0
  56. package/dist-engine-src/src/json_store/encoded.rs +15 -0
  57. package/dist-engine-src/src/json_store/mod.rs +9 -0
  58. package/dist-engine-src/src/json_store/store.rs +236 -0
  59. package/dist-engine-src/src/json_store/types.rs +52 -0
  60. package/dist-engine-src/src/lib.rs +61 -0
  61. package/dist-engine-src/src/live_state/context.rs +2241 -0
  62. package/dist-engine-src/src/live_state/mod.rs +15 -0
  63. package/dist-engine-src/src/live_state/overlay.rs +75 -0
  64. package/dist-engine-src/src/live_state/reader.rs +23 -0
  65. package/dist-engine-src/src/live_state/types.rs +239 -0
  66. package/dist-engine-src/src/live_state/visibility.rs +218 -0
  67. package/dist-engine-src/src/plugin/archive.rs +441 -0
  68. package/dist-engine-src/src/plugin/component.rs +183 -0
  69. package/dist-engine-src/src/plugin/install.rs +637 -0
  70. package/dist-engine-src/src/plugin/manifest.rs +516 -0
  71. package/dist-engine-src/src/plugin/materializer.rs +477 -0
  72. package/dist-engine-src/src/plugin/mod.rs +33 -0
  73. package/dist-engine-src/src/plugin/plugin_manifest.json +119 -0
  74. package/dist-engine-src/src/plugin/storage.rs +74 -0
  75. package/dist-engine-src/src/schema/annotations/defaults.rs +280 -0
  76. package/dist-engine-src/src/schema/annotations/mod.rs +1 -0
  77. package/dist-engine-src/src/schema/builtin/lix_account.json +22 -0
  78. package/dist-engine-src/src/schema/builtin/lix_active_account.json +30 -0
  79. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +30 -0
  80. package/dist-engine-src/src/schema/builtin/lix_change.json +62 -0
  81. package/dist-engine-src/src/schema/builtin/lix_change_author.json +46 -0
  82. package/dist-engine-src/src/schema/builtin/lix_change_set.json +18 -0
  83. package/dist-engine-src/src/schema/builtin/lix_change_set_element.json +75 -0
  84. package/dist-engine-src/src/schema/builtin/lix_commit.json +62 -0
  85. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +46 -0
  86. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +53 -0
  87. package/dist-engine-src/src/schema/builtin/lix_entity_label.json +63 -0
  88. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +53 -0
  89. package/dist-engine-src/src/schema/builtin/lix_key_value.json +41 -0
  90. package/dist-engine-src/src/schema/builtin/lix_label.json +22 -0
  91. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +31 -0
  92. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +35 -0
  93. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +49 -0
  94. package/dist-engine-src/src/schema/builtin/mod.rs +271 -0
  95. package/dist-engine-src/src/schema/definition.json +157 -0
  96. package/dist-engine-src/src/schema/definition.rs +636 -0
  97. package/dist-engine-src/src/schema/key.rs +206 -0
  98. package/dist-engine-src/src/schema/mod.rs +20 -0
  99. package/dist-engine-src/src/schema/seed.rs +14 -0
  100. package/dist-engine-src/src/schema/tests.rs +739 -0
  101. package/dist-engine-src/src/schema_registry.rs +294 -0
  102. package/dist-engine-src/src/session/context.rs +366 -0
  103. package/dist-engine-src/src/session/create_version.rs +80 -0
  104. package/dist-engine-src/src/session/execute.rs +447 -0
  105. package/dist-engine-src/src/session/merge/analysis.rs +102 -0
  106. package/dist-engine-src/src/session/merge/apply.rs +23 -0
  107. package/dist-engine-src/src/session/merge/conflicts.rs +62 -0
  108. package/dist-engine-src/src/session/merge/mod.rs +11 -0
  109. package/dist-engine-src/src/session/merge/stats.rs +65 -0
  110. package/dist-engine-src/src/session/merge/version.rs +437 -0
  111. package/dist-engine-src/src/session/mod.rs +25 -0
  112. package/dist-engine-src/src/session/switch_version.rs +121 -0
  113. package/dist-engine-src/src/sql2/change_provider.rs +337 -0
  114. package/dist-engine-src/src/sql2/classify.rs +147 -0
  115. package/dist-engine-src/src/sql2/commit_derived_provider.rs +591 -0
  116. package/dist-engine-src/src/sql2/context.rs +307 -0
  117. package/dist-engine-src/src/sql2/directory_history_provider.rs +623 -0
  118. package/dist-engine-src/src/sql2/directory_provider.rs +2405 -0
  119. package/dist-engine-src/src/sql2/dml.rs +148 -0
  120. package/dist-engine-src/src/sql2/entity_history_provider.rs +444 -0
  121. package/dist-engine-src/src/sql2/entity_provider.rs +2700 -0
  122. package/dist-engine-src/src/sql2/error.rs +196 -0
  123. package/dist-engine-src/src/sql2/execute.rs +3379 -0
  124. package/dist-engine-src/src/sql2/file_history_provider.rs +902 -0
  125. package/dist-engine-src/src/sql2/file_provider.rs +3254 -0
  126. package/dist-engine-src/src/sql2/filesystem_planner.rs +1526 -0
  127. package/dist-engine-src/src/sql2/filesystem_predicates.rs +159 -0
  128. package/dist-engine-src/src/sql2/filesystem_visibility.rs +369 -0
  129. package/dist-engine-src/src/sql2/history_projection.rs +80 -0
  130. package/dist-engine-src/src/sql2/history_provider.rs +418 -0
  131. package/dist-engine-src/src/sql2/history_route.rs +643 -0
  132. package/dist-engine-src/src/sql2/lix_state_provider.rs +2430 -0
  133. package/dist-engine-src/src/sql2/mod.rs +43 -0
  134. package/dist-engine-src/src/sql2/read_only.rs +65 -0
  135. package/dist-engine-src/src/sql2/record_batch.rs +17 -0
  136. package/dist-engine-src/src/sql2/result_metadata.rs +29 -0
  137. package/dist-engine-src/src/sql2/runtime.rs +60 -0
  138. package/dist-engine-src/src/sql2/session.rs +135 -0
  139. package/dist-engine-src/src/sql2/udfs/common.rs +295 -0
  140. package/dist-engine-src/src/sql2/udfs/lix_active_version_commit_id.rs +53 -0
  141. package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +47 -0
  142. package/dist-engine-src/src/sql2/udfs/lix_json.rs +100 -0
  143. package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +99 -0
  144. package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +99 -0
  145. package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +82 -0
  146. package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +85 -0
  147. package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +76 -0
  148. package/dist-engine-src/src/sql2/udfs/mod.rs +82 -0
  149. package/dist-engine-src/src/sql2/version_provider.rs +1187 -0
  150. package/dist-engine-src/src/sql2/version_scope.rs +394 -0
  151. package/dist-engine-src/src/sql2/write_normalization.rs +345 -0
  152. package/dist-engine-src/src/storage/context.rs +356 -0
  153. package/dist-engine-src/src/storage/mod.rs +14 -0
  154. package/dist-engine-src/src/storage/read_scope.rs +88 -0
  155. package/dist-engine-src/src/storage/types.rs +501 -0
  156. package/dist-engine-src/src/storage_bench.rs +3406 -0
  157. package/dist-engine-src/src/test_support.rs +81 -0
  158. package/dist-engine-src/src/tracked_state/by_file_index.rs +102 -0
  159. package/dist-engine-src/src/tracked_state/codec.rs +747 -0
  160. package/dist-engine-src/src/tracked_state/context.rs +983 -0
  161. package/dist-engine-src/src/tracked_state/diff.rs +494 -0
  162. package/dist-engine-src/src/tracked_state/materialization.rs +141 -0
  163. package/dist-engine-src/src/tracked_state/merge.rs +474 -0
  164. package/dist-engine-src/src/tracked_state/mod.rs +31 -0
  165. package/dist-engine-src/src/tracked_state/rebuild.rs +771 -0
  166. package/dist-engine-src/src/tracked_state/storage.rs +243 -0
  167. package/dist-engine-src/src/tracked_state/tree.rs +2744 -0
  168. package/dist-engine-src/src/tracked_state/tree_types.rs +176 -0
  169. package/dist-engine-src/src/tracked_state/types.rs +61 -0
  170. package/dist-engine-src/src/transaction/commit.rs +1224 -0
  171. package/dist-engine-src/src/transaction/context.rs +1307 -0
  172. package/dist-engine-src/src/transaction/live_state_overlay.rs +34 -0
  173. package/dist-engine-src/src/transaction/mod.rs +11 -0
  174. package/dist-engine-src/src/transaction/normalization.rs +1026 -0
  175. package/dist-engine-src/src/transaction/schema_resolver.rs +127 -0
  176. package/dist-engine-src/src/transaction/staging.rs +1436 -0
  177. package/dist-engine-src/src/transaction/types.rs +351 -0
  178. package/dist-engine-src/src/transaction/validation.rs +4811 -0
  179. package/dist-engine-src/src/untracked_state/codec.rs +363 -0
  180. package/dist-engine-src/src/untracked_state/context.rs +82 -0
  181. package/dist-engine-src/src/untracked_state/materialization.rs +157 -0
  182. package/dist-engine-src/src/untracked_state/mod.rs +17 -0
  183. package/dist-engine-src/src/untracked_state/storage.rs +348 -0
  184. package/dist-engine-src/src/untracked_state/types.rs +96 -0
  185. package/dist-engine-src/src/version/context.rs +52 -0
  186. package/dist-engine-src/src/version/mod.rs +12 -0
  187. package/dist-engine-src/src/version/refs.rs +421 -0
  188. package/dist-engine-src/src/version/stage_rows.rs +71 -0
  189. package/dist-engine-src/src/version/types.rs +21 -0
  190. package/dist-engine-src/src/wasm/mod.rs +60 -0
  191. package/package.json +68 -64
@@ -39,6 +39,11 @@ export class Lix {
39
39
  * @returns {Promise<any>}
40
40
  */
41
41
  mergeVersion(args: any): Promise<any>;
42
+ /**
43
+ * @param {any} args
44
+ * @returns {Promise<any>}
45
+ */
46
+ mergeVersionPreview(args: any): Promise<any>;
42
47
  /**
43
48
  * @param {any} args
44
49
  * @returns {Promise<any>}
@@ -63,6 +63,14 @@ export class Lix {
63
63
  const ret = wasm.lix_mergeVersion(this.__wbg_ptr, args);
64
64
  return ret;
65
65
  }
66
+ /**
67
+ * @param {any} args
68
+ * @returns {Promise<any>}
69
+ */
70
+ mergeVersionPreview(args) {
71
+ const ret = wasm.lix_mergeVersionPreview(this.__wbg_ptr, args);
72
+ return ret;
73
+ }
66
74
  /**
67
75
  * @param {any} args
68
76
  * @returns {Promise<any>}
@@ -183,18 +191,6 @@ function __wbg_get_imports() {
183
191
  return ret;
184
192
  }, arguments);
185
193
  },
186
- __wbg_call_812d25f1510c13c8: function () {
187
- return handleError(function (arg0, arg1, arg2, arg3) {
188
- const ret = arg0.call(arg1, arg2, arg3);
189
- return ret;
190
- }, arguments);
191
- },
192
- __wbg_call_e8c868596c950cf6: function () {
193
- return handleError(function (arg0, arg1, arg2, arg3, arg4) {
194
- const ret = arg0.call(arg1, arg2, arg3, arg4);
195
- return ret;
196
- }, arguments);
197
- },
198
194
  __wbg_done_57b39ecd9addfe81: function (arg0) {
199
195
  const ret = arg0.done;
200
196
  return ret;
@@ -434,7 +430,7 @@ function __wbg_get_imports() {
434
430
  return ret;
435
431
  },
436
432
  __wbindgen_cast_0000000000000001: function (arg0, arg1) {
437
- // Cast intrinsic for `Closure(Closure { dtor_idx: 3048, function: Function { arguments: [Externref], shim_idx: 3049, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
433
+ // Cast intrinsic for `Closure(Closure { dtor_idx: 3067, function: Function { arguments: [Externref], shim_idx: 3068, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
438
434
  const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h259bf120b5b35fc5, wasm_bindgen__convert__closures_____invoke__ha15a27e9815e3c81);
439
435
  return ret;
440
436
  },
@@ -7,6 +7,7 @@ export const lix_close: (a: number) => any;
7
7
  export const lix_createVersion: (a: number, b: any) => any;
8
8
  export const lix_execute: (a: number, b: any, c: any) => any;
9
9
  export const lix_mergeVersion: (a: number, b: any) => any;
10
+ export const lix_mergeVersionPreview: (a: number, b: any) => any;
10
11
  export const lix_switchVersion: (a: number, b: any) => any;
11
12
  export const openLix: (a: number) => any;
12
13
  export const wasm_bindgen__closure__destroy__h259bf120b5b35fc5: (a: number, b: number) => void;
@@ -30,8 +30,7 @@ export declare class Row {
30
30
  toValueMap(): Record<string, Value>;
31
31
  private availableColumns;
32
32
  }
33
- export type TransactionBeginMode = "read" | "write" | "deferred";
34
- export type KvScanRange = {
33
+ export type BackendKvScanRange = {
35
34
  kind: "prefix";
36
35
  prefix: Uint8Array;
37
36
  } | {
@@ -39,22 +38,78 @@ export type KvScanRange = {
39
38
  start: Uint8Array;
40
39
  end: Uint8Array;
41
40
  };
42
- export type KvPair = {
41
+ export type BackendKvGetRequest = {
42
+ groups: BackendKvGetGroup[];
43
+ };
44
+ export type BackendKvGetGroup = {
45
+ namespace: string;
46
+ keys: Uint8Array[];
47
+ };
48
+ export type BackendKvValueBatch = {
49
+ groups: BackendKvValueGroup[];
50
+ };
51
+ export type BackendKvValueGroup = {
52
+ namespace: string;
53
+ values: Array<Uint8Array | null>;
54
+ };
55
+ export type BackendKvExistsBatch = {
56
+ groups: BackendKvExistsGroup[];
57
+ };
58
+ export type BackendKvExistsGroup = {
59
+ namespace: string;
60
+ exists: boolean[];
61
+ };
62
+ export type BackendKvScanRequest = {
63
+ namespace: string;
64
+ range: BackendKvScanRange;
65
+ after?: Uint8Array | null;
66
+ limit: number;
67
+ };
68
+ export type BackendKvKeyPage = {
69
+ keys: Uint8Array[];
70
+ resumeAfter?: Uint8Array | null;
71
+ };
72
+ export type BackendKvValuePage = {
73
+ values: Uint8Array[];
74
+ resumeAfter?: Uint8Array | null;
75
+ };
76
+ export type BackendKvEntryPage = {
77
+ keys: Uint8Array[];
78
+ values: Uint8Array[];
79
+ resumeAfter?: Uint8Array | null;
80
+ };
81
+ export type BackendKvPut = {
43
82
  key: Uint8Array;
44
83
  value: Uint8Array;
45
84
  };
46
- export type LixBackendTransaction = {
47
- kvGet(namespace: string, key: Uint8Array): Uint8Array | null | undefined;
48
- kvScan(namespace: string, range: KvScanRange, limit?: number | null): KvPair[];
49
- kvPut(namespace: string, key: Uint8Array, value: Uint8Array): void;
50
- kvDelete(namespace: string, key: Uint8Array): void;
51
- commit(): void;
85
+ export type BackendKvWriteBatch = {
86
+ groups: BackendKvWriteGroup[];
87
+ };
88
+ export type BackendKvWriteGroup = {
89
+ namespace: string;
90
+ puts: BackendKvPut[];
91
+ deletes: Uint8Array[];
92
+ };
93
+ export type BackendKvWriteStats = {
94
+ puts: number;
95
+ deletes: number;
96
+ bytesWritten: number;
97
+ };
98
+ export type LixBackendReadTransaction = {
99
+ getValues(request: BackendKvGetRequest): BackendKvValueBatch;
100
+ existsMany(request: BackendKvGetRequest): BackendKvExistsBatch;
101
+ scanKeys(request: BackendKvScanRequest): BackendKvKeyPage;
102
+ scanValues(request: BackendKvScanRequest): BackendKvValuePage;
103
+ scanEntries(request: BackendKvScanRequest): BackendKvEntryPage;
52
104
  rollback(): void;
53
105
  };
106
+ export type LixBackendWriteTransaction = LixBackendReadTransaction & {
107
+ writeKvBatch(batch: BackendKvWriteBatch): BackendKvWriteStats;
108
+ commit(): void;
109
+ };
54
110
  export type LixBackend = {
55
- beginTransaction(mode: TransactionBeginMode): LixBackendTransaction;
56
- kvGet?(namespace: string, key: Uint8Array): Uint8Array | null | undefined;
57
- kvScan?(namespace: string, range: KvScanRange, limit?: number | null): KvPair[];
111
+ beginReadTransaction(): LixBackendReadTransaction;
112
+ beginWriteTransaction(): LixBackendWriteTransaction;
58
113
  close?(): void;
59
114
  };
60
115
  export type OpenLixOptions = {
@@ -82,15 +137,48 @@ export type MergeVersionOptions = {
82
137
  };
83
138
  export type MergeVersionOutcome = "alreadyUpToDate" | "fastForward" | "mergeCommitted";
84
139
  export type MergeVersionResult = {
140
+ /**
141
+ * How the merge was applied. `fastForward` advances the target ref without
142
+ * creating a merge commit, but can still make source changes visible.
143
+ */
85
144
  outcome: MergeVersionOutcome;
86
145
  targetVersionId: string;
87
146
  sourceVersionId: string;
88
- mergeBaseCommitId: string | null;
147
+ baseCommitId: string;
89
148
  targetHeadBeforeCommitId: string;
90
149
  sourceHeadBeforeCommitId: string;
91
150
  targetHeadAfterCommitId: string;
92
151
  createdMergeCommitId: string | null;
93
- appliedChangeCount: number;
152
+ changeStats: MergeChangeStats;
153
+ };
154
+ export type MergeVersionPreviewResult = {
155
+ outcome: MergeVersionOutcome;
156
+ targetVersionId: string;
157
+ sourceVersionId: string;
158
+ baseCommitId: string;
159
+ targetHeadCommitId: string;
160
+ sourceHeadCommitId: string;
161
+ changeStats: MergeChangeStats;
162
+ conflicts: MergeConflict[];
163
+ };
164
+ export type MergeChangeStats = {
165
+ total: number;
166
+ added: number;
167
+ modified: number;
168
+ removed: number;
169
+ };
170
+ export type MergeConflict = {
171
+ kind: "sameEntityChanged";
172
+ schemaKey: string;
173
+ entityId: string;
174
+ fileId: string | null;
175
+ target: MergeConflictSide;
176
+ source: MergeConflictSide;
177
+ };
178
+ export type MergeConflictSide = {
179
+ kind: "added" | "modified" | "removed";
180
+ beforeChangeId: string | null;
181
+ afterChangeId: string | null;
94
182
  };
95
183
  export type Lix = {
96
184
  /**
@@ -105,6 +193,7 @@ export type Lix = {
105
193
  activeVersionId(): Promise<string>;
106
194
  createVersion(options: CreateVersionOptions): Promise<CreateVersionResult>;
107
195
  switchVersion(options: SwitchVersionOptions): Promise<SwitchVersionResult>;
196
+ mergeVersionPreview(options: MergeVersionOptions): Promise<MergeVersionPreviewResult>;
108
197
  mergeVersion(options: MergeVersionOptions): Promise<MergeVersionResult>;
109
198
  close(): Promise<void>;
110
199
  };
package/dist/open-lix.js CHANGED
@@ -134,6 +134,9 @@ function createLixHandle(wasmLix) {
134
134
  async switchVersion(options) {
135
135
  return await runQueued(() => wasmLix.switchVersion(options));
136
136
  },
137
+ async mergeVersionPreview(options) {
138
+ return await runQueued(() => wasmLix.mergeVersionPreview(options));
139
+ },
137
140
  async mergeVersion(options) {
138
141
  return await runQueued(() => wasmLix.mergeVersion(options));
139
142
  },
@@ -51,21 +51,21 @@ class BetterSqlite3Backend {
51
51
  this.#db = db;
52
52
  this.#registryKey = registryKey;
53
53
  }
54
- beginTransaction(mode) {
54
+ beginReadTransaction() {
55
55
  this.#ensureOpen();
56
56
  if (this.#db.inTransaction) {
57
57
  throw new Error("cannot open nested Lix backend transaction");
58
58
  }
59
- this.#db.exec(mode === "write" ? "BEGIN IMMEDIATE" : "BEGIN DEFERRED");
59
+ this.#db.exec("BEGIN DEFERRED");
60
60
  return new BetterSqlite3Transaction(this.#db);
61
61
  }
62
- kvGet(namespace, key) {
62
+ beginWriteTransaction() {
63
63
  this.#ensureOpen();
64
- return kvGet(this.#db, namespace, key);
65
- }
66
- kvScan(namespace, range, limit) {
67
- this.#ensureOpen();
68
- return kvScan(this.#db, namespace, range, limit);
64
+ if (this.#db.inTransaction) {
65
+ throw new Error("cannot open nested Lix backend transaction");
66
+ }
67
+ this.#db.exec("BEGIN IMMEDIATE");
68
+ return new BetterSqlite3Transaction(this.#db);
69
69
  }
70
70
  close() {
71
71
  if (this.#closed)
@@ -92,27 +92,59 @@ class BetterSqlite3Transaction {
92
92
  constructor(db) {
93
93
  this.#db = db;
94
94
  }
95
- kvGet(namespace, key) {
95
+ getValues(request) {
96
+ this.#ensureOpen();
97
+ return getValues(this.#db, request);
98
+ }
99
+ existsMany(request) {
96
100
  this.#ensureOpen();
97
- return kvGet(this.#db, namespace, key);
101
+ return existsMany(this.#db, request);
98
102
  }
99
- kvScan(namespace, range, limit) {
103
+ scanKeys(request) {
100
104
  this.#ensureOpen();
101
- return kvScan(this.#db, namespace, range, limit);
105
+ const { pairs, resumeAfter } = scanPage(this.#db, request);
106
+ return {
107
+ keys: pairs.map(({ key }) => key),
108
+ resumeAfter,
109
+ };
102
110
  }
103
- kvPut(namespace, key, value) {
111
+ scanValues(request) {
104
112
  this.#ensureOpen();
105
- this.#db
106
- .prepare(`INSERT INTO lix_kv (namespace, key, value)
107
- VALUES (?, ?, ?)
108
- ON CONFLICT(namespace, key) DO UPDATE SET value = excluded.value`)
109
- .run(namespace, sqliteBytes(key), sqliteBytes(value));
113
+ const { pairs, resumeAfter } = scanPage(this.#db, request);
114
+ return {
115
+ values: pairs.map(({ value }) => value),
116
+ resumeAfter,
117
+ };
110
118
  }
111
- kvDelete(namespace, key) {
119
+ scanEntries(request) {
112
120
  this.#ensureOpen();
113
- this.#db
114
- .prepare("DELETE FROM lix_kv WHERE namespace = ? AND key = ?")
115
- .run(namespace, sqliteBytes(key));
121
+ const { pairs, resumeAfter } = scanPage(this.#db, request);
122
+ return {
123
+ keys: pairs.map(({ key }) => key),
124
+ values: pairs.map(({ value }) => value),
125
+ resumeAfter,
126
+ };
127
+ }
128
+ writeKvBatch(batch) {
129
+ this.#ensureOpen();
130
+ const stats = {
131
+ puts: 0,
132
+ deletes: 0,
133
+ bytesWritten: 0,
134
+ };
135
+ for (const group of batch.groups) {
136
+ for (const put of group.puts) {
137
+ stats.puts += 1;
138
+ stats.bytesWritten += put.key.length + put.value.length;
139
+ kvPut(this.#db, group.namespace, put.key, put.value);
140
+ }
141
+ for (const key of group.deletes) {
142
+ stats.deletes += 1;
143
+ stats.bytesWritten += key.length;
144
+ kvDelete(this.#db, group.namespace, key);
145
+ }
146
+ }
147
+ return stats;
116
148
  }
117
149
  commit() {
118
150
  this.#ensureOpen();
@@ -130,6 +162,34 @@ class BetterSqlite3Transaction {
130
162
  }
131
163
  }
132
164
  }
165
+ function getValues(db, request) {
166
+ return {
167
+ groups: request.groups.map((group) => ({
168
+ namespace: group.namespace,
169
+ values: group.keys.map((key) => kvGet(db, group.namespace, key)),
170
+ })),
171
+ };
172
+ }
173
+ function existsMany(db, request) {
174
+ return {
175
+ groups: request.groups.map((group) => ({
176
+ namespace: group.namespace,
177
+ exists: group.keys.map((key) => kvGet(db, group.namespace, key) !== null),
178
+ })),
179
+ };
180
+ }
181
+ function scanPage(db, request) {
182
+ const scanLimit = request.limit + 1 + (request.after ? 1 : 0);
183
+ const pairs = kvScan(db, request.namespace, request.range, scanLimit).filter((pair) => !request.after || compareBytes(pair.key, request.after) > 0);
184
+ const hasMore = pairs.length > request.limit;
185
+ const pagePairs = pairs.slice(0, request.limit);
186
+ return {
187
+ pairs: pagePairs,
188
+ resumeAfter: hasMore
189
+ ? (pagePairs.at(-1)?.key ?? null)
190
+ : null,
191
+ };
192
+ }
133
193
  function kvGet(db, namespace, key) {
134
194
  const row = db
135
195
  .prepare("SELECT value FROM lix_kv WHERE namespace = ? AND key = ?")
@@ -139,6 +199,14 @@ function kvGet(db, namespace, key) {
139
199
  }
140
200
  return bytesFromUnknown(row.value, "lix_kv.value");
141
201
  }
202
+ function kvPut(db, namespace, key, value) {
203
+ db.prepare(`INSERT INTO lix_kv (namespace, key, value)
204
+ VALUES (?, ?, ?)
205
+ ON CONFLICT(namespace, key) DO UPDATE SET value = excluded.value`).run(namespace, sqliteBytes(key), sqliteBytes(value));
206
+ }
207
+ function kvDelete(db, namespace, key) {
208
+ db.prepare("DELETE FROM lix_kv WHERE namespace = ? AND key = ?").run(namespace, sqliteBytes(key));
209
+ }
142
210
  function kvScan(db, namespace, range, limit) {
143
211
  const { sql, params } = scanQuery(namespace, range, limit);
144
212
  return db.prepare(sql).all(...params).map((row) => {
@@ -174,6 +242,15 @@ function scanQuery(namespace, range, limit) {
174
242
  }
175
243
  return { sql, params };
176
244
  }
245
+ function compareBytes(left, right) {
246
+ const length = Math.min(left.length, right.length);
247
+ for (let index = 0; index < length; index++) {
248
+ const delta = left[index] - right[index];
249
+ if (delta !== 0)
250
+ return delta;
251
+ }
252
+ return left.length - right.length;
253
+ }
177
254
  function prefixUpperBound(prefix) {
178
255
  const end = new Uint8Array(prefix);
179
256
  for (let index = end.length - 1; index >= 0; index--) {
@@ -0,0 +1,18 @@
1
+ # Bundled Lix Engine Source
2
+
3
+ This directory is a generated snapshot of the Rust engine source that backs this @lix-js/sdk release.
4
+
5
+ Source in the Lix monorepo: `packages/engine/src`
6
+
7
+ Agents should inspect these files when SDK behavior is unclear instead of relying only on SKILL.md prose.
8
+
9
+ Useful entry points:
10
+
11
+ - `src/sql2/entity_provider.rs` - registered schema SQL surfaces
12
+ - `src/sql2/change_provider.rs` - `lix_change` projection
13
+ - `src/sql2/version_provider.rs` - writable `lix_version` surface
14
+ - `src/transaction/validation.rs` - primary-key, unique, foreign-key, and shape validation
15
+ - `src/schema/definition.json` - Lix schema-definition meta-schema
16
+ - `src/schema/builtin/` - built-in schema definitions
17
+
18
+ Regenerate with `pnpm --filter @lix-js/sdk sync:engine-src` from the repo root.