@lix-js/sdk 0.6.0-preview.4 → 0.6.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 (223) hide show
  1. package/README.md +76 -4
  2. package/dist/errors.d.ts +7 -0
  3. package/dist/errors.js +19 -0
  4. package/dist/index.d.ts +4 -5
  5. package/dist/index.js +3 -3
  6. package/dist/native.d.ts +1 -0
  7. package/dist/native.js +47 -0
  8. package/dist/open-lix.d.ts +39 -201
  9. package/dist/open-lix.js +59 -284
  10. package/dist/result.d.ts +18 -0
  11. package/dist/result.js +48 -0
  12. package/dist/types.d.ts +114 -1
  13. package/dist/value.d.ts +28 -0
  14. package/dist/value.js +245 -0
  15. package/package.json +20 -50
  16. package/SKILL.md +0 -506
  17. package/dist/builtin-schemas.d.ts +0 -1
  18. package/dist/builtin-schemas.js +0 -1
  19. package/dist/engine-wasm/index.d.ts +0 -87
  20. package/dist/engine-wasm/index.js +0 -339
  21. package/dist/engine-wasm/wasm/lix_engine.d.ts +0 -79
  22. package/dist/engine-wasm/wasm/lix_engine.js +0 -821
  23. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  24. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +0 -26
  25. package/dist/generated/builtin-schemas.d.ts +0 -427
  26. package/dist/generated/builtin-schemas.js +0 -643
  27. package/dist/sqlite/index.d.ts +0 -12
  28. package/dist/sqlite/index.js +0 -303
  29. package/dist-engine-src/README.md +0 -18
  30. package/dist-engine-src/src/backend/kv.rs +0 -358
  31. package/dist-engine-src/src/backend/mod.rs +0 -12
  32. package/dist-engine-src/src/backend/testing.rs +0 -658
  33. package/dist-engine-src/src/backend/types.rs +0 -96
  34. package/dist-engine-src/src/binary_cas/chunking.rs +0 -31
  35. package/dist-engine-src/src/binary_cas/codec.rs +0 -346
  36. package/dist-engine-src/src/binary_cas/context.rs +0 -139
  37. package/dist-engine-src/src/binary_cas/kv.rs +0 -1063
  38. package/dist-engine-src/src/binary_cas/mod.rs +0 -11
  39. package/dist-engine-src/src/binary_cas/types.rs +0 -121
  40. package/dist-engine-src/src/catalog/context.rs +0 -412
  41. package/dist-engine-src/src/catalog/mod.rs +0 -10
  42. package/dist-engine-src/src/catalog/schema.rs +0 -4
  43. package/dist-engine-src/src/catalog/snapshot.rs +0 -1114
  44. package/dist-engine-src/src/cel/context.rs +0 -86
  45. package/dist-engine-src/src/cel/error.rs +0 -19
  46. package/dist-engine-src/src/cel/mod.rs +0 -8
  47. package/dist-engine-src/src/cel/provider.rs +0 -9
  48. package/dist-engine-src/src/cel/runtime.rs +0 -167
  49. package/dist-engine-src/src/cel/value.rs +0 -50
  50. package/dist-engine-src/src/commit_graph/context.rs +0 -901
  51. package/dist-engine-src/src/commit_graph/mod.rs +0 -11
  52. package/dist-engine-src/src/commit_graph/types.rs +0 -109
  53. package/dist-engine-src/src/commit_graph/walker.rs +0 -756
  54. package/dist-engine-src/src/commit_store/codec.rs +0 -887
  55. package/dist-engine-src/src/commit_store/context.rs +0 -944
  56. package/dist-engine-src/src/commit_store/materialization.rs +0 -84
  57. package/dist-engine-src/src/commit_store/mod.rs +0 -16
  58. package/dist-engine-src/src/commit_store/storage.rs +0 -600
  59. package/dist-engine-src/src/commit_store/types.rs +0 -215
  60. package/dist-engine-src/src/common/error.rs +0 -313
  61. package/dist-engine-src/src/common/fingerprint.rs +0 -3
  62. package/dist-engine-src/src/common/fs_path.rs +0 -1336
  63. package/dist-engine-src/src/common/identity.rs +0 -145
  64. package/dist-engine-src/src/common/json_pointer.rs +0 -67
  65. package/dist-engine-src/src/common/metadata.rs +0 -40
  66. package/dist-engine-src/src/common/mod.rs +0 -23
  67. package/dist-engine-src/src/common/types.rs +0 -105
  68. package/dist-engine-src/src/common/wire.rs +0 -222
  69. package/dist-engine-src/src/domain.rs +0 -324
  70. package/dist-engine-src/src/engine.rs +0 -225
  71. package/dist-engine-src/src/entity_identity.rs +0 -405
  72. package/dist-engine-src/src/functions/context.rs +0 -292
  73. package/dist-engine-src/src/functions/deterministic.rs +0 -113
  74. package/dist-engine-src/src/functions/mod.rs +0 -18
  75. package/dist-engine-src/src/functions/provider.rs +0 -130
  76. package/dist-engine-src/src/functions/state.rs +0 -336
  77. package/dist-engine-src/src/functions/types.rs +0 -37
  78. package/dist-engine-src/src/init.rs +0 -558
  79. package/dist-engine-src/src/json_store/compression.rs +0 -77
  80. package/dist-engine-src/src/json_store/context.rs +0 -423
  81. package/dist-engine-src/src/json_store/encoded.rs +0 -15
  82. package/dist-engine-src/src/json_store/mod.rs +0 -12
  83. package/dist-engine-src/src/json_store/store.rs +0 -1109
  84. package/dist-engine-src/src/json_store/types.rs +0 -217
  85. package/dist-engine-src/src/lib.rs +0 -62
  86. package/dist-engine-src/src/live_state/context.rs +0 -2019
  87. package/dist-engine-src/src/live_state/mod.rs +0 -15
  88. package/dist-engine-src/src/live_state/overlay.rs +0 -75
  89. package/dist-engine-src/src/live_state/reader.rs +0 -23
  90. package/dist-engine-src/src/live_state/types.rs +0 -222
  91. package/dist-engine-src/src/live_state/visibility.rs +0 -223
  92. package/dist-engine-src/src/plugin/archive.rs +0 -438
  93. package/dist-engine-src/src/plugin/component.rs +0 -183
  94. package/dist-engine-src/src/plugin/install.rs +0 -619
  95. package/dist-engine-src/src/plugin/manifest.rs +0 -516
  96. package/dist-engine-src/src/plugin/materializer.rs +0 -477
  97. package/dist-engine-src/src/plugin/mod.rs +0 -33
  98. package/dist-engine-src/src/plugin/plugin_manifest.json +0 -118
  99. package/dist-engine-src/src/plugin/storage.rs +0 -74
  100. package/dist-engine-src/src/schema/annotations/defaults.rs +0 -275
  101. package/dist-engine-src/src/schema/annotations/mod.rs +0 -1
  102. package/dist-engine-src/src/schema/builtin/lix_account.json +0 -21
  103. package/dist-engine-src/src/schema/builtin/lix_active_account.json +0 -29
  104. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +0 -29
  105. package/dist-engine-src/src/schema/builtin/lix_change.json +0 -63
  106. package/dist-engine-src/src/schema/builtin/lix_change_author.json +0 -45
  107. package/dist-engine-src/src/schema/builtin/lix_commit.json +0 -24
  108. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +0 -53
  109. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +0 -52
  110. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +0 -52
  111. package/dist-engine-src/src/schema/builtin/lix_key_value.json +0 -40
  112. package/dist-engine-src/src/schema/builtin/lix_label.json +0 -29
  113. package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +0 -74
  114. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +0 -25
  115. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +0 -34
  116. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +0 -48
  117. package/dist-engine-src/src/schema/builtin/mod.rs +0 -222
  118. package/dist-engine-src/src/schema/compatibility.rs +0 -787
  119. package/dist-engine-src/src/schema/definition.json +0 -187
  120. package/dist-engine-src/src/schema/definition.rs +0 -742
  121. package/dist-engine-src/src/schema/key.rs +0 -138
  122. package/dist-engine-src/src/schema/mod.rs +0 -20
  123. package/dist-engine-src/src/schema/seed.rs +0 -14
  124. package/dist-engine-src/src/schema/tests.rs +0 -780
  125. package/dist-engine-src/src/session/context.rs +0 -404
  126. package/dist-engine-src/src/session/create_version.rs +0 -88
  127. package/dist-engine-src/src/session/execute.rs +0 -541
  128. package/dist-engine-src/src/session/merge/analysis.rs +0 -102
  129. package/dist-engine-src/src/session/merge/apply.rs +0 -23
  130. package/dist-engine-src/src/session/merge/conflicts.rs +0 -63
  131. package/dist-engine-src/src/session/merge/mod.rs +0 -11
  132. package/dist-engine-src/src/session/merge/stats.rs +0 -65
  133. package/dist-engine-src/src/session/merge/version.rs +0 -427
  134. package/dist-engine-src/src/session/mod.rs +0 -27
  135. package/dist-engine-src/src/session/optimization9_sql2_bench.rs +0 -100
  136. package/dist-engine-src/src/session/switch_version.rs +0 -110
  137. package/dist-engine-src/src/session/transaction.rs +0 -76
  138. package/dist-engine-src/src/sql2/change_provider.rs +0 -331
  139. package/dist-engine-src/src/sql2/classify.rs +0 -174
  140. package/dist-engine-src/src/sql2/context.rs +0 -311
  141. package/dist-engine-src/src/sql2/directory_history_provider.rs +0 -631
  142. package/dist-engine-src/src/sql2/directory_provider.rs +0 -2453
  143. package/dist-engine-src/src/sql2/dml.rs +0 -148
  144. package/dist-engine-src/src/sql2/entity_history_provider.rs +0 -440
  145. package/dist-engine-src/src/sql2/entity_provider.rs +0 -3211
  146. package/dist-engine-src/src/sql2/error.rs +0 -215
  147. package/dist-engine-src/src/sql2/execute.rs +0 -3533
  148. package/dist-engine-src/src/sql2/file_history_provider.rs +0 -910
  149. package/dist-engine-src/src/sql2/file_provider.rs +0 -3679
  150. package/dist-engine-src/src/sql2/filesystem_planner.rs +0 -1490
  151. package/dist-engine-src/src/sql2/filesystem_predicates.rs +0 -159
  152. package/dist-engine-src/src/sql2/filesystem_visibility.rs +0 -383
  153. package/dist-engine-src/src/sql2/history_projection.rs +0 -56
  154. package/dist-engine-src/src/sql2/history_provider.rs +0 -412
  155. package/dist-engine-src/src/sql2/history_route.rs +0 -657
  156. package/dist-engine-src/src/sql2/lix_state_provider.rs +0 -2512
  157. package/dist-engine-src/src/sql2/mod.rs +0 -47
  158. package/dist-engine-src/src/sql2/predicate_typecheck.rs +0 -246
  159. package/dist-engine-src/src/sql2/public_bind/assignment.rs +0 -46
  160. package/dist-engine-src/src/sql2/public_bind/capability.rs +0 -41
  161. package/dist-engine-src/src/sql2/public_bind/dml.rs +0 -172
  162. package/dist-engine-src/src/sql2/public_bind/mod.rs +0 -26
  163. package/dist-engine-src/src/sql2/public_bind/table.rs +0 -168
  164. package/dist-engine-src/src/sql2/read_only.rs +0 -63
  165. package/dist-engine-src/src/sql2/record_batch.rs +0 -17
  166. package/dist-engine-src/src/sql2/result_metadata.rs +0 -29
  167. package/dist-engine-src/src/sql2/runtime.rs +0 -60
  168. package/dist-engine-src/src/sql2/session.rs +0 -132
  169. package/dist-engine-src/src/sql2/udfs/common.rs +0 -295
  170. package/dist-engine-src/src/sql2/udfs/lix_active_version_commit_id.rs +0 -53
  171. package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +0 -47
  172. package/dist-engine-src/src/sql2/udfs/lix_json.rs +0 -100
  173. package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +0 -99
  174. package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +0 -99
  175. package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +0 -82
  176. package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +0 -85
  177. package/dist-engine-src/src/sql2/udfs/lix_timestamp.rs +0 -76
  178. package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +0 -76
  179. package/dist-engine-src/src/sql2/udfs/mod.rs +0 -89
  180. package/dist-engine-src/src/sql2/udfs/public_call.rs +0 -238
  181. package/dist-engine-src/src/sql2/version_provider.rs +0 -1202
  182. package/dist-engine-src/src/sql2/version_scope.rs +0 -394
  183. package/dist-engine-src/src/sql2/write_normalization.rs +0 -345
  184. package/dist-engine-src/src/storage/context.rs +0 -356
  185. package/dist-engine-src/src/storage/mod.rs +0 -14
  186. package/dist-engine-src/src/storage/read_scope.rs +0 -88
  187. package/dist-engine-src/src/storage/types.rs +0 -501
  188. package/dist-engine-src/src/storage_bench.rs +0 -4863
  189. package/dist-engine-src/src/test_support.rs +0 -228
  190. package/dist-engine-src/src/tracked_state/by_file_index.rs +0 -98
  191. package/dist-engine-src/src/tracked_state/codec.rs +0 -2085
  192. package/dist-engine-src/src/tracked_state/context.rs +0 -1867
  193. package/dist-engine-src/src/tracked_state/diff.rs +0 -686
  194. package/dist-engine-src/src/tracked_state/materialization.rs +0 -403
  195. package/dist-engine-src/src/tracked_state/materializer.rs +0 -488
  196. package/dist-engine-src/src/tracked_state/merge.rs +0 -492
  197. package/dist-engine-src/src/tracked_state/mod.rs +0 -32
  198. package/dist-engine-src/src/tracked_state/storage.rs +0 -375
  199. package/dist-engine-src/src/tracked_state/tree.rs +0 -3187
  200. package/dist-engine-src/src/tracked_state/types.rs +0 -231
  201. package/dist-engine-src/src/transaction/commit.rs +0 -1484
  202. package/dist-engine-src/src/transaction/context.rs +0 -1548
  203. package/dist-engine-src/src/transaction/live_state_overlay.rs +0 -35
  204. package/dist-engine-src/src/transaction/mod.rs +0 -13
  205. package/dist-engine-src/src/transaction/normalization.rs +0 -890
  206. package/dist-engine-src/src/transaction/prep.rs +0 -37
  207. package/dist-engine-src/src/transaction/schema_resolver.rs +0 -149
  208. package/dist-engine-src/src/transaction/staging.rs +0 -1731
  209. package/dist-engine-src/src/transaction/types.rs +0 -460
  210. package/dist-engine-src/src/transaction/validation.rs +0 -5830
  211. package/dist-engine-src/src/untracked_state/codec.rs +0 -307
  212. package/dist-engine-src/src/untracked_state/context.rs +0 -98
  213. package/dist-engine-src/src/untracked_state/materialization.rs +0 -63
  214. package/dist-engine-src/src/untracked_state/mod.rs +0 -15
  215. package/dist-engine-src/src/untracked_state/storage.rs +0 -396
  216. package/dist-engine-src/src/untracked_state/types.rs +0 -146
  217. package/dist-engine-src/src/version/context.rs +0 -40
  218. package/dist-engine-src/src/version/lifecycle.rs +0 -221
  219. package/dist-engine-src/src/version/mod.rs +0 -13
  220. package/dist-engine-src/src/version/refs.rs +0 -330
  221. package/dist-engine-src/src/version/stage_rows.rs +0 -67
  222. package/dist-engine-src/src/version/types.rs +0 -21
  223. package/dist-engine-src/src/wasm/mod.rs +0 -60
@@ -1,303 +0,0 @@
1
- import DatabaseConstructor from "better-sqlite3";
2
- const openFileHandles = new Set();
3
- export function createBetterSqlite3Backend(options) {
4
- if (!options.path) {
5
- throw new Error("createBetterSqlite3Backend() requires a non-empty path");
6
- }
7
- const registryKey = registryKeyForPath(options.path);
8
- if (registryKey && openFileHandles.has(registryKey)) {
9
- throw doubleOpenError(options.path);
10
- }
11
- let activeRegistryKey = registryKey;
12
- let db;
13
- if (activeRegistryKey) {
14
- openFileHandles.add(activeRegistryKey);
15
- }
16
- try {
17
- db = new DatabaseConstructor(options.path, options.databaseOptions);
18
- initializeDatabase(db);
19
- return new BetterSqlite3Backend(db, activeRegistryKey);
20
- }
21
- catch (error) {
22
- if (activeRegistryKey) {
23
- openFileHandles.delete(activeRegistryKey);
24
- }
25
- if (db) {
26
- try {
27
- db.close();
28
- }
29
- catch {
30
- // Ignore close errors while preserving the original open failure.
31
- }
32
- }
33
- throw error;
34
- }
35
- }
36
- function initializeDatabase(db) {
37
- db.exec(`
38
- CREATE TABLE IF NOT EXISTS lix_kv (
39
- namespace TEXT NOT NULL,
40
- key BLOB NOT NULL,
41
- value BLOB NOT NULL,
42
- PRIMARY KEY (namespace, key)
43
- ) WITHOUT ROWID
44
- `);
45
- }
46
- class BetterSqlite3Backend {
47
- #db;
48
- #registryKey;
49
- #closed = false;
50
- constructor(db, registryKey) {
51
- this.#db = db;
52
- this.#registryKey = registryKey;
53
- }
54
- beginReadTransaction() {
55
- this.#ensureOpen();
56
- if (this.#db.inTransaction) {
57
- throw new Error("cannot open nested Lix backend transaction");
58
- }
59
- this.#db.exec("BEGIN DEFERRED");
60
- return new BetterSqlite3Transaction(this.#db);
61
- }
62
- beginWriteTransaction() {
63
- this.#ensureOpen();
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
- }
70
- close() {
71
- if (this.#closed)
72
- return;
73
- try {
74
- this.#db.close();
75
- }
76
- finally {
77
- this.#closed = true;
78
- if (this.#registryKey) {
79
- openFileHandles.delete(this.#registryKey);
80
- }
81
- }
82
- }
83
- #ensureOpen() {
84
- if (this.#closed) {
85
- throw new Error("better-sqlite3 Lix backend is closed");
86
- }
87
- }
88
- }
89
- class BetterSqlite3Transaction {
90
- #db;
91
- #closed = false;
92
- constructor(db) {
93
- this.#db = db;
94
- }
95
- getValues(request) {
96
- this.#ensureOpen();
97
- return getValues(this.#db, request);
98
- }
99
- existsMany(request) {
100
- this.#ensureOpen();
101
- return existsMany(this.#db, request);
102
- }
103
- scanKeys(request) {
104
- this.#ensureOpen();
105
- const { pairs, resumeAfter } = scanPage(this.#db, request);
106
- return {
107
- keys: pairs.map(({ key }) => key),
108
- resumeAfter,
109
- };
110
- }
111
- scanValues(request) {
112
- this.#ensureOpen();
113
- const { pairs, resumeAfter } = scanPage(this.#db, request);
114
- return {
115
- values: pairs.map(({ value }) => value),
116
- resumeAfter,
117
- };
118
- }
119
- scanEntries(request) {
120
- this.#ensureOpen();
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;
148
- }
149
- commit() {
150
- this.#ensureOpen();
151
- this.#db.exec("COMMIT");
152
- this.#closed = true;
153
- }
154
- rollback() {
155
- this.#ensureOpen();
156
- this.#db.exec("ROLLBACK");
157
- this.#closed = true;
158
- }
159
- #ensureOpen() {
160
- if (this.#closed) {
161
- throw new Error("Lix backend transaction is closed");
162
- }
163
- }
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
- }
193
- function kvGet(db, namespace, key) {
194
- const row = db
195
- .prepare("SELECT value FROM lix_kv WHERE namespace = ? AND key = ?")
196
- .get(namespace, sqliteBytes(key));
197
- if (!isObject(row) || !("value" in row)) {
198
- return null;
199
- }
200
- return bytesFromUnknown(row.value, "lix_kv.value");
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
- }
210
- function kvScan(db, namespace, range, limit) {
211
- const { sql, params } = scanQuery(namespace, range, limit);
212
- return db.prepare(sql).all(...params).map((row) => {
213
- if (!isObject(row) || !("key" in row) || !("value" in row)) {
214
- throw new Error("invalid lix_kv scan row");
215
- }
216
- return {
217
- key: bytesFromUnknown(row.key, "lix_kv.key"),
218
- value: bytesFromUnknown(row.value, "lix_kv.value"),
219
- };
220
- });
221
- }
222
- function scanQuery(namespace, range, limit) {
223
- const params = [namespace];
224
- const clauses = ["namespace = ?"];
225
- if (range.kind === "prefix") {
226
- clauses.push("key >= ?");
227
- params.push(sqliteBytes(range.prefix));
228
- const end = prefixUpperBound(range.prefix);
229
- if (end) {
230
- clauses.push("key < ?");
231
- params.push(sqliteBytes(end));
232
- }
233
- }
234
- else {
235
- clauses.push("key >= ?", "key < ?");
236
- params.push(sqliteBytes(range.start), sqliteBytes(range.end));
237
- }
238
- let sql = `SELECT key, value FROM lix_kv WHERE ${clauses.join(" AND ")} ORDER BY key`;
239
- if (limit != null) {
240
- sql += " LIMIT ?";
241
- params.push(limit);
242
- }
243
- return { sql, params };
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
- }
254
- function prefixUpperBound(prefix) {
255
- const end = new Uint8Array(prefix);
256
- for (let index = end.length - 1; index >= 0; index--) {
257
- if (end[index] !== 0xff) {
258
- end[index] += 1;
259
- return end.slice(0, index + 1);
260
- }
261
- }
262
- return null;
263
- }
264
- function bytesFromUnknown(value, context) {
265
- if (value instanceof Uint8Array) {
266
- return new Uint8Array(value);
267
- }
268
- throw new Error(`${context} must be bytes`);
269
- }
270
- function sqliteBytes(bytes) {
271
- const buffer = globalThis.Buffer;
272
- return buffer ? buffer.from(bytes) : bytes;
273
- }
274
- function registryKeyForPath(filename) {
275
- if (filename === ":memory:") {
276
- return null;
277
- }
278
- if (filename.startsWith("/")) {
279
- return normalizeAbsolutePath(filename);
280
- }
281
- const cwd = globalThis.process?.cwd?.() ?? "/";
282
- return normalizeAbsolutePath(`${cwd}/${filename}`);
283
- }
284
- function normalizeAbsolutePath(filename) {
285
- const segments = [];
286
- for (const segment of filename.split("/")) {
287
- if (!segment || segment === ".") {
288
- continue;
289
- }
290
- if (segment === "..") {
291
- segments.pop();
292
- continue;
293
- }
294
- segments.push(segment);
295
- }
296
- return `/${segments.join("/")}`;
297
- }
298
- function doubleOpenError(filename) {
299
- return new Error(`createBetterSqlite3Backend() already has an open handle for ${filename}; close the existing Lix handle before opening this file again`);
300
- }
301
- function isObject(value) {
302
- return typeof value === "object" && value !== null;
303
- }
@@ -1,18 +0,0 @@
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.
@@ -1,358 +0,0 @@
1
- #[derive(Debug, Clone, PartialEq, Eq, Default)]
2
- pub struct BytePage {
3
- bytes: Vec<u8>,
4
- offsets: Vec<u32>,
5
- }
6
-
7
- impl BytePage {
8
- pub fn new() -> Self {
9
- Self {
10
- bytes: Vec::new(),
11
- offsets: vec![0],
12
- }
13
- }
14
-
15
- pub fn len(&self) -> usize {
16
- self.offsets.len().saturating_sub(1)
17
- }
18
-
19
- pub fn is_empty(&self) -> bool {
20
- self.len() == 0
21
- }
22
-
23
- pub fn get(&self, index: usize) -> Option<&[u8]> {
24
- let start = usize::try_from(*self.offsets.get(index)?).ok()?;
25
- let end = usize::try_from(*self.offsets.get(index + 1)?).ok()?;
26
- self.bytes.get(start..end)
27
- }
28
-
29
- pub fn iter(&self) -> BytePageIter<'_> {
30
- BytePageIter {
31
- page: self,
32
- index: 0,
33
- }
34
- }
35
- }
36
-
37
- pub struct BytePageIter<'a> {
38
- page: &'a BytePage,
39
- index: usize,
40
- }
41
-
42
- impl<'a> Iterator for BytePageIter<'a> {
43
- type Item = &'a [u8];
44
-
45
- fn next(&mut self) -> Option<Self::Item> {
46
- let value = self.page.get(self.index)?;
47
- self.index += 1;
48
- Some(value)
49
- }
50
- }
51
-
52
- #[derive(Debug, Clone, PartialEq, Eq, Default)]
53
- pub struct BytePageBuilder {
54
- bytes: Vec<u8>,
55
- offsets: Vec<u32>,
56
- }
57
-
58
- impl BytePageBuilder {
59
- pub fn new() -> Self {
60
- Self {
61
- bytes: Vec::new(),
62
- offsets: vec![0],
63
- }
64
- }
65
-
66
- pub fn with_capacity(items: usize, bytes: usize) -> Self {
67
- let mut offsets = Vec::with_capacity(items.saturating_add(1));
68
- offsets.push(0);
69
- Self {
70
- bytes: Vec::with_capacity(bytes),
71
- offsets,
72
- }
73
- }
74
-
75
- pub fn from_page(page: BytePage) -> Self {
76
- Self {
77
- bytes: page.bytes,
78
- offsets: page.offsets,
79
- }
80
- }
81
-
82
- pub fn len(&self) -> usize {
83
- self.offsets.len().saturating_sub(1)
84
- }
85
-
86
- pub fn is_empty(&self) -> bool {
87
- self.len() == 0
88
- }
89
-
90
- pub fn get(&self, index: usize) -> Option<&[u8]> {
91
- let start = usize::try_from(*self.offsets.get(index)?).ok()?;
92
- let end = usize::try_from(*self.offsets.get(index + 1)?).ok()?;
93
- self.bytes.get(start..end)
94
- }
95
-
96
- pub fn push(&mut self, value: impl AsRef<[u8]>) {
97
- let value = value.as_ref();
98
- self.bytes.extend_from_slice(value);
99
- let end = u32::try_from(self.bytes.len()).expect("byte page exceeds u32 offset capacity");
100
- self.offsets.push(end);
101
- }
102
-
103
- pub fn finish(self) -> BytePage {
104
- BytePage {
105
- bytes: self.bytes,
106
- offsets: self.offsets,
107
- }
108
- }
109
- }
110
-
111
- /// Ordered byte range for backend KV scans.
112
- ///
113
- /// Ranges are half-open: `start <= key < end`. `Prefix` is explicit because it
114
- /// is a common access pattern and lets each backend choose the safest
115
- /// implementation for its storage engine.
116
- #[derive(Debug, Clone, PartialEq, Eq)]
117
- pub enum BackendKvScanRange {
118
- Prefix(Vec<u8>),
119
- Range { start: Vec<u8>, end: Vec<u8> },
120
- }
121
-
122
- impl BackendKvScanRange {
123
- pub fn prefix(prefix: impl Into<Vec<u8>>) -> Self {
124
- Self::Prefix(prefix.into())
125
- }
126
-
127
- pub fn range(start: impl Into<Vec<u8>>, end: impl Into<Vec<u8>>) -> Self {
128
- Self::Range {
129
- start: start.into(),
130
- end: end.into(),
131
- }
132
- }
133
- }
134
-
135
- #[derive(Debug, Clone, PartialEq, Eq)]
136
- pub struct BackendKvGetRequest {
137
- pub groups: Vec<BackendKvGetGroup>,
138
- }
139
-
140
- #[derive(Debug, Clone, PartialEq, Eq)]
141
- pub struct BackendKvGetGroup {
142
- pub namespace: String,
143
- pub keys: Vec<Vec<u8>>,
144
- }
145
-
146
- impl BackendKvGetGroup {
147
- pub fn namespace(&self) -> &str {
148
- &self.namespace
149
- }
150
- }
151
-
152
- #[derive(Debug, Clone, PartialEq, Eq)]
153
- pub struct BackendKvValueBatch {
154
- pub groups: Vec<BackendKvValueGroup>,
155
- }
156
-
157
- #[derive(Debug, Clone, PartialEq, Eq)]
158
- pub struct BackendKvValueGroup {
159
- namespace: String,
160
- values: BytePage,
161
- present: Vec<bool>,
162
- }
163
-
164
- impl BackendKvValueGroup {
165
- pub fn new(namespace: impl Into<String>, values: BytePage, present: Vec<bool>) -> Self {
166
- assert_eq!(
167
- values.len(),
168
- present.len(),
169
- "backend value batch must have one value slot per presence bit"
170
- );
171
- Self {
172
- namespace: namespace.into(),
173
- values,
174
- present,
175
- }
176
- }
177
-
178
- pub fn namespace(&self) -> &str {
179
- &self.namespace
180
- }
181
-
182
- pub fn len(&self) -> usize {
183
- self.present.len()
184
- }
185
-
186
- pub fn is_empty(&self) -> bool {
187
- self.present.is_empty()
188
- }
189
-
190
- pub fn value(&self, index: usize) -> Option<Option<&[u8]>> {
191
- let present = *self.present.get(index)?;
192
- if present {
193
- Some(Some(
194
- self.values
195
- .get(index)
196
- .expect("backend value batch invariant violated"),
197
- ))
198
- } else {
199
- Some(None)
200
- }
201
- }
202
-
203
- pub fn values_iter(&self) -> impl Iterator<Item = Option<&[u8]>> {
204
- (0..self.len()).filter_map(|index| self.value(index))
205
- }
206
-
207
- pub fn into_parts(self) -> (String, BytePage, Vec<bool>) {
208
- (self.namespace, self.values, self.present)
209
- }
210
- }
211
-
212
- #[derive(Debug, Clone, PartialEq, Eq)]
213
- pub struct BackendKvExistsBatch {
214
- pub groups: Vec<BackendKvExistsGroup>,
215
- }
216
-
217
- #[derive(Debug, Clone, PartialEq, Eq)]
218
- pub struct BackendKvExistsGroup {
219
- pub namespace: String,
220
- pub exists: Vec<bool>,
221
- }
222
-
223
- #[derive(Debug, Clone, PartialEq, Eq)]
224
- pub struct BackendKvScanRequest {
225
- pub namespace: String,
226
- pub range: BackendKvScanRange,
227
- pub after: Option<Vec<u8>>,
228
- pub limit: usize,
229
- }
230
-
231
- #[derive(Debug, Clone, PartialEq, Eq)]
232
- pub struct BackendKvKeyPage {
233
- pub keys: BytePage,
234
- pub resume_after: Option<Vec<u8>>,
235
- }
236
-
237
- #[derive(Debug, Clone, PartialEq, Eq)]
238
- pub struct BackendKvValuePage {
239
- pub values: BytePage,
240
- pub resume_after: Option<Vec<u8>>,
241
- }
242
-
243
- #[derive(Debug, Clone, PartialEq, Eq)]
244
- pub struct BackendKvEntryPage {
245
- pub keys: BytePage,
246
- pub values: BytePage,
247
- pub resume_after: Option<Vec<u8>>,
248
- }
249
-
250
- impl BackendKvEntryPage {
251
- pub fn len(&self) -> usize {
252
- self.keys.len()
253
- }
254
-
255
- pub fn is_empty(&self) -> bool {
256
- self.keys.is_empty()
257
- }
258
-
259
- pub fn key(&self, index: usize) -> Option<&[u8]> {
260
- self.keys.get(index)
261
- }
262
-
263
- pub fn value(&self, index: usize) -> Option<&[u8]> {
264
- self.values.get(index)
265
- }
266
- }
267
-
268
- #[derive(Debug, Clone, PartialEq, Eq, Default)]
269
- pub struct BackendKvWriteBatch {
270
- pub groups: Vec<BackendKvWriteGroup>,
271
- }
272
-
273
- #[derive(Debug, Clone, PartialEq, Eq)]
274
- pub struct BackendKvWriteGroup {
275
- namespace: String,
276
- put_keys: BytePageBuilder,
277
- put_values: BytePageBuilder,
278
- deletes: BytePageBuilder,
279
- }
280
-
281
- impl BackendKvWriteGroup {
282
- pub fn new(namespace: impl Into<String>) -> Self {
283
- Self {
284
- namespace: namespace.into(),
285
- put_keys: BytePageBuilder::new(),
286
- put_values: BytePageBuilder::new(),
287
- deletes: BytePageBuilder::new(),
288
- }
289
- }
290
-
291
- pub fn from_pages(
292
- namespace: impl Into<String>,
293
- put_keys: BytePage,
294
- put_values: BytePage,
295
- deletes: BytePage,
296
- ) -> Self {
297
- assert_eq!(
298
- put_keys.len(),
299
- put_values.len(),
300
- "backend write batch must have one value per put key"
301
- );
302
- Self {
303
- namespace: namespace.into(),
304
- put_keys: BytePageBuilder::from_page(put_keys),
305
- put_values: BytePageBuilder::from_page(put_values),
306
- deletes: BytePageBuilder::from_page(deletes),
307
- }
308
- }
309
-
310
- pub fn put(&mut self, key: impl AsRef<[u8]>, value: impl AsRef<[u8]>) {
311
- self.put_keys.push(key);
312
- self.put_values.push(value);
313
- }
314
-
315
- pub fn delete(&mut self, key: impl AsRef<[u8]>) {
316
- self.deletes.push(key);
317
- }
318
-
319
- pub fn namespace(&self) -> &str {
320
- &self.namespace
321
- }
322
-
323
- pub fn put_count(&self) -> usize {
324
- self.put_keys.len()
325
- }
326
-
327
- pub fn delete_count(&self) -> usize {
328
- self.deletes.len()
329
- }
330
-
331
- pub fn put_key(&self, index: usize) -> Option<&[u8]> {
332
- self.put_keys.get(index)
333
- }
334
-
335
- pub fn put_value(&self, index: usize) -> Option<&[u8]> {
336
- self.put_values.get(index)
337
- }
338
-
339
- pub fn delete_key(&self, index: usize) -> Option<&[u8]> {
340
- self.deletes.get(index)
341
- }
342
-
343
- pub fn into_parts(self) -> (String, BytePage, BytePage, BytePage) {
344
- (
345
- self.namespace,
346
- self.put_keys.finish(),
347
- self.put_values.finish(),
348
- self.deletes.finish(),
349
- )
350
- }
351
- }
352
-
353
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
354
- pub struct BackendKvWriteStats {
355
- pub puts: usize,
356
- pub deletes: usize,
357
- pub bytes_written: usize,
358
- }
@@ -1,12 +0,0 @@
1
- mod kv;
2
- #[cfg(test)]
3
- pub(crate) mod testing;
4
- mod types;
5
-
6
- pub use kv::{
7
- BackendKvEntryPage, BackendKvExistsBatch, BackendKvExistsGroup, BackendKvGetGroup,
8
- BackendKvGetRequest, BackendKvKeyPage, BackendKvScanRange, BackendKvScanRequest,
9
- BackendKvValueBatch, BackendKvValueGroup, BackendKvValuePage, BackendKvWriteBatch,
10
- BackendKvWriteGroup, BackendKvWriteStats, BytePage, BytePageBuilder,
11
- };
12
- pub use types::{Backend, BackendReadTransaction, BackendWriteTransaction};