@lix-js/sdk 0.6.0-preview.4 → 0.6.0-preview.5

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 (234) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +65 -64
  3. package/dist/engine-wasm/index.js +4 -4
  4. package/dist/engine-wasm/wasm/lix_engine.d.ts +5 -5
  5. package/dist/engine-wasm/wasm/lix_engine.js +130 -118
  6. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  7. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +9 -8
  8. package/dist/generated/builtin-schemas.d.ts +69 -69
  9. package/dist/generated/builtin-schemas.js +94 -94
  10. package/dist/open-lix.d.ts +33 -26
  11. package/dist/open-lix.js +10 -10
  12. package/dist/sqlite/index.js +86 -30
  13. package/dist-engine-src/README.md +3 -3
  14. package/dist-engine-src/src/backend/capabilities.rs +67 -0
  15. package/dist-engine-src/src/backend/conformance/baseline.rs +1127 -0
  16. package/dist-engine-src/src/backend/conformance/factory.rs +93 -0
  17. package/dist-engine-src/src/backend/conformance/failure_tests.rs +608 -0
  18. package/dist-engine-src/src/backend/conformance/fixtures.rs +26 -0
  19. package/dist-engine-src/src/backend/conformance/mod.rs +75 -0
  20. package/dist-engine-src/src/backend/conformance/model.rs +28 -0
  21. package/dist-engine-src/src/backend/conformance/model_based.rs +257 -0
  22. package/dist-engine-src/src/backend/conformance/persistence.rs +204 -0
  23. package/dist-engine-src/src/backend/conformance/projection.rs +21 -0
  24. package/dist-engine-src/src/backend/conformance/pushdown.rs +24 -0
  25. package/dist-engine-src/src/backend/conformance/runner.rs +90 -0
  26. package/dist-engine-src/src/backend/conformance/scan.rs +24 -0
  27. package/dist-engine-src/src/backend/conformance/write.rs +16 -0
  28. package/dist-engine-src/src/backend/error.rs +94 -0
  29. package/dist-engine-src/src/backend/in_memory.rs +670 -0
  30. package/dist-engine-src/src/backend/mod.rs +36 -9
  31. package/dist-engine-src/src/backend/predicate.rs +80 -0
  32. package/dist-engine-src/src/backend/traits.rs +260 -0
  33. package/dist-engine-src/src/backend/types.rs +224 -81
  34. package/dist-engine-src/src/binary_cas/context.rs +8 -8
  35. package/dist-engine-src/src/binary_cas/kv.rs +234 -259
  36. package/dist-engine-src/src/{version → branch}/context.rs +12 -12
  37. package/dist-engine-src/src/branch/lifecycle.rs +221 -0
  38. package/dist-engine-src/src/branch/mod.rs +13 -0
  39. package/dist-engine-src/src/branch/refs.rs +321 -0
  40. package/dist-engine-src/src/branch/stage_rows.rs +67 -0
  41. package/dist-engine-src/src/branch/types.rs +21 -0
  42. package/dist-engine-src/src/catalog/context.rs +18 -18
  43. package/dist-engine-src/src/catalog/snapshot.rs +8 -8
  44. package/dist-engine-src/src/changelog/bench_support.rs +785 -0
  45. package/dist-engine-src/src/changelog/change.rs +1 -0
  46. package/dist-engine-src/src/changelog/codec.rs +497 -0
  47. package/dist-engine-src/src/changelog/commit.rs +1 -0
  48. package/dist-engine-src/src/changelog/context.rs +1614 -0
  49. package/dist-engine-src/src/changelog/mod.rs +29 -0
  50. package/dist-engine-src/src/changelog/store.rs +163 -0
  51. package/dist-engine-src/src/changelog/test_support.rs +54 -0
  52. package/dist-engine-src/src/changelog/types.rs +213 -0
  53. package/dist-engine-src/src/commit_graph/context.rs +317 -274
  54. package/dist-engine-src/src/commit_graph/mod.rs +2 -4
  55. package/dist-engine-src/src/commit_graph/types.rs +22 -42
  56. package/dist-engine-src/src/commit_graph/walker.rs +133 -103
  57. package/dist-engine-src/src/common/error.rs +52 -18
  58. package/dist-engine-src/src/common/identity.rs +2 -2
  59. package/dist-engine-src/src/common/mod.rs +1 -1
  60. package/dist-engine-src/src/domain.rs +42 -46
  61. package/dist-engine-src/src/engine.rs +74 -96
  62. package/dist-engine-src/src/{entity_identity.rs → entity_pk.rs} +89 -92
  63. package/dist-engine-src/src/functions/context.rs +56 -52
  64. package/dist-engine-src/src/functions/state.rs +51 -52
  65. package/dist-engine-src/src/init.rs +288 -154
  66. package/dist-engine-src/src/json_store/context.rs +15 -266
  67. package/dist-engine-src/src/json_store/mod.rs +26 -0
  68. package/dist-engine-src/src/json_store/store.rs +103 -718
  69. package/dist-engine-src/src/json_store/types.rs +4 -9
  70. package/dist-engine-src/src/lib.rs +49 -19
  71. package/dist-engine-src/src/live_state/context.rs +654 -790
  72. package/dist-engine-src/src/live_state/mod.rs +9 -3
  73. package/dist-engine-src/src/live_state/overlay.rs +4 -4
  74. package/dist-engine-src/src/live_state/types.rs +30 -21
  75. package/dist-engine-src/src/live_state/visibility.rs +514 -71
  76. package/dist-engine-src/src/plugin/install.rs +48 -48
  77. package/dist-engine-src/src/plugin/manifest.rs +7 -7
  78. package/dist-engine-src/src/plugin/materializer.rs +0 -275
  79. package/dist-engine-src/src/plugin/plugin_manifest.json +4 -3
  80. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +2 -2
  81. package/dist-engine-src/src/schema/builtin/lix_branch_descriptor.json +34 -0
  82. package/dist-engine-src/src/schema/builtin/lix_branch_ref.json +48 -0
  83. package/dist-engine-src/src/schema/builtin/lix_change.json +3 -3
  84. package/dist-engine-src/src/schema/builtin/lix_commit.json +1 -1
  85. package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +6 -6
  86. package/dist-engine-src/src/schema/builtin/mod.rs +18 -20
  87. package/dist-engine-src/src/schema/compatibility.rs +11 -11
  88. package/dist-engine-src/src/schema/definition.json +2 -2
  89. package/dist-engine-src/src/schema/definition.rs +5 -5
  90. package/dist-engine-src/src/schema/key.rs +3 -3
  91. package/dist-engine-src/src/schema/mod.rs +1 -1
  92. package/dist-engine-src/src/schema/tests.rs +18 -18
  93. package/dist-engine-src/src/session/context.rs +803 -148
  94. package/dist-engine-src/src/session/create_branch.rs +94 -0
  95. package/dist-engine-src/src/session/execute.rs +223 -83
  96. package/dist-engine-src/src/session/merge/analysis.rs +9 -3
  97. package/dist-engine-src/src/session/merge/{version.rs → branch.rs} +119 -129
  98. package/dist-engine-src/src/session/merge/conflicts.rs +2 -2
  99. package/dist-engine-src/src/session/merge/mod.rs +5 -6
  100. package/dist-engine-src/src/session/merge/stats.rs +7 -11
  101. package/dist-engine-src/src/session/mod.rs +15 -12
  102. package/dist-engine-src/src/session/switch_branch.rs +113 -0
  103. package/dist-engine-src/src/session/transaction.rs +495 -14
  104. package/dist-engine-src/src/sql2/{classify.rs → bind/classify.rs} +3 -75
  105. package/dist-engine-src/src/sql2/bind/error.rs +5 -0
  106. package/dist-engine-src/src/sql2/bind/expr.rs +29 -0
  107. package/dist-engine-src/src/sql2/bind/mod.rs +12 -0
  108. package/dist-engine-src/src/sql2/{udfs/public_call.rs → bind/public_udf.rs} +71 -3
  109. package/dist-engine-src/src/sql2/bind/read.rs +65 -0
  110. package/dist-engine-src/src/sql2/bind/statement.rs +2236 -0
  111. package/dist-engine-src/src/sql2/bind/table.rs +273 -0
  112. package/dist-engine-src/src/sql2/bind/write.rs +86 -0
  113. package/dist-engine-src/src/sql2/branch_scope.rs +436 -0
  114. package/dist-engine-src/src/sql2/catalog/capability.rs +20 -0
  115. package/dist-engine-src/src/sql2/catalog/entity_surface.rs +296 -0
  116. package/dist-engine-src/src/sql2/catalog/mod.rs +15 -0
  117. package/dist-engine-src/src/sql2/catalog/registry.rs +556 -0
  118. package/dist-engine-src/src/sql2/catalog/schema.rs +88 -0
  119. package/dist-engine-src/src/sql2/catalog/surface.rs +41 -0
  120. package/dist-engine-src/src/sql2/change_materialization.rs +122 -0
  121. package/dist-engine-src/src/sql2/context.rs +36 -30
  122. package/dist-engine-src/src/sql2/error.rs +1 -1
  123. package/dist-engine-src/src/sql2/exec/bound_public_write.rs +1593 -0
  124. package/dist-engine-src/src/sql2/exec/datafusion.rs +5266 -0
  125. package/dist-engine-src/src/sql2/exec/fast_write.rs +82 -0
  126. package/dist-engine-src/src/sql2/exec/mod.rs +24 -0
  127. package/dist-engine-src/src/sql2/exec/write.rs +661 -0
  128. package/dist-engine-src/src/sql2/filesystem_planner.rs +72 -77
  129. package/dist-engine-src/src/sql2/filesystem_visibility.rs +21 -21
  130. package/dist-engine-src/src/sql2/history_projection.rs +8 -8
  131. package/dist-engine-src/src/sql2/history_route.rs +35 -31
  132. package/dist-engine-src/src/sql2/mod.rs +28 -23
  133. package/dist-engine-src/src/sql2/optimize/datafusion.rs +1 -0
  134. package/dist-engine-src/src/sql2/optimize/mod.rs +2 -0
  135. package/dist-engine-src/src/sql2/optimize/simple_write.rs +116 -0
  136. package/dist-engine-src/src/sql2/parse/mod.rs +69 -0
  137. package/dist-engine-src/src/sql2/parse/normalize.rs +1 -0
  138. package/dist-engine-src/src/sql2/plan/branch_scope.rs +24 -0
  139. package/dist-engine-src/src/sql2/plan/mod.rs +5 -0
  140. package/dist-engine-src/src/sql2/plan/predicate.rs +22 -0
  141. package/dist-engine-src/src/sql2/plan/write.rs +147 -0
  142. package/dist-engine-src/src/sql2/predicate_typecheck.rs +258 -0
  143. package/dist-engine-src/src/sql2/{version_provider.rs → providers/branch.rs} +218 -214
  144. package/dist-engine-src/src/sql2/{change_provider.rs → providers/change.rs} +156 -42
  145. package/dist-engine-src/src/sql2/{directory_provider.rs → providers/directory.rs} +291 -322
  146. package/dist-engine-src/src/sql2/{directory_history_provider.rs → providers/directory_history.rs} +56 -42
  147. package/dist-engine-src/src/sql2/providers/entity.rs +1484 -0
  148. package/dist-engine-src/src/sql2/{entity_history_provider.rs → providers/entity_history.rs} +43 -31
  149. package/dist-engine-src/src/sql2/{file_provider.rs → providers/file.rs} +323 -316
  150. package/dist-engine-src/src/sql2/{file_history_provider.rs → providers/file_history.rs} +60 -46
  151. package/dist-engine-src/src/sql2/{history_provider.rs → providers/history.rs} +46 -32
  152. package/dist-engine-src/src/sql2/{lix_state_provider.rs → providers/lix_state.rs} +359 -329
  153. package/dist-engine-src/src/sql2/providers/mod.rs +508 -0
  154. package/dist-engine-src/src/sql2/read_only.rs +2 -2
  155. package/dist-engine-src/src/sql2/session.rs +47 -96
  156. package/dist-engine-src/src/sql2/storage/constraints.rs +1 -0
  157. package/dist-engine-src/src/sql2/storage/mod.rs +1 -0
  158. package/dist-engine-src/src/sql2/test_support/differential.rs +712 -0
  159. package/dist-engine-src/src/sql2/test_support/generators.rs +354 -0
  160. package/dist-engine-src/src/sql2/test_support/mod.rs +2 -0
  161. package/dist-engine-src/src/sql2/udfs/{lix_active_version_commit_id.rs → lix_active_branch_commit_id.rs} +7 -7
  162. package/dist-engine-src/src/sql2/udfs/mod.rs +3 -6
  163. package/dist-engine-src/src/sql2/write_normalization.rs +45 -22
  164. package/dist-engine-src/src/storage/conformance.rs +399 -0
  165. package/dist-engine-src/src/storage/context.rs +552 -288
  166. package/dist-engine-src/src/storage/mod.rs +48 -10
  167. package/dist-engine-src/src/storage/point.rs +440 -0
  168. package/dist-engine-src/src/storage/read_scope.rs +43 -64
  169. package/dist-engine-src/src/storage/reader.rs +867 -0
  170. package/dist-engine-src/src/storage/scan.rs +784 -0
  171. package/dist-engine-src/src/storage/spaces.rs +236 -0
  172. package/dist-engine-src/src/storage/stats.rs +80 -0
  173. package/dist-engine-src/src/storage/write_set.rs +962 -0
  174. package/dist-engine-src/src/storage_bench.rs +136 -4828
  175. package/dist-engine-src/src/test_support.rs +360 -138
  176. package/dist-engine-src/src/tracked_state/bench_support.rs +394 -0
  177. package/dist-engine-src/src/tracked_state/codec.rs +155 -1057
  178. package/dist-engine-src/src/tracked_state/commit_root_rebuild.rs +358 -0
  179. package/dist-engine-src/src/tracked_state/context.rs +1927 -993
  180. package/dist-engine-src/src/tracked_state/diff.rs +1715 -261
  181. package/dist-engine-src/src/tracked_state/merge.rs +74 -88
  182. package/dist-engine-src/src/tracked_state/mod.rs +19 -16
  183. package/dist-engine-src/src/tracked_state/{materialization.rs → row_materialization.rs} +50 -178
  184. package/dist-engine-src/src/tracked_state/storage.rs +243 -191
  185. package/dist-engine-src/src/tracked_state/tree.rs +247 -371
  186. package/dist-engine-src/src/tracked_state/types.rs +49 -42
  187. package/dist-engine-src/src/transaction/bench_support.rs +407 -0
  188. package/dist-engine-src/src/transaction/commit.rs +821 -713
  189. package/dist-engine-src/src/transaction/context.rs +705 -600
  190. package/dist-engine-src/src/transaction/mod.rs +13 -2
  191. package/dist-engine-src/src/transaction/normalization.rs +63 -76
  192. package/dist-engine-src/src/transaction/prep.rs +13 -13
  193. package/dist-engine-src/src/transaction/schema_resolver.rs +19 -5
  194. package/dist-engine-src/src/transaction/staging.rs +228 -434
  195. package/dist-engine-src/src/transaction/types.rs +41 -98
  196. package/dist-engine-src/src/transaction/validation.rs +382 -446
  197. package/dist-engine-src/src/untracked_state/codec.rs +337 -29
  198. package/dist-engine-src/src/untracked_state/context.rs +7 -7
  199. package/dist-engine-src/src/untracked_state/materialization.rs +2 -2
  200. package/dist-engine-src/src/untracked_state/mod.rs +1 -1
  201. package/dist-engine-src/src/untracked_state/storage.rs +659 -157
  202. package/dist-engine-src/src/untracked_state/types.rs +21 -21
  203. package/package.json +71 -68
  204. package/dist-engine-src/src/backend/kv.rs +0 -358
  205. package/dist-engine-src/src/backend/testing.rs +0 -658
  206. package/dist-engine-src/src/commit_store/codec.rs +0 -887
  207. package/dist-engine-src/src/commit_store/context.rs +0 -944
  208. package/dist-engine-src/src/commit_store/materialization.rs +0 -84
  209. package/dist-engine-src/src/commit_store/mod.rs +0 -16
  210. package/dist-engine-src/src/commit_store/storage.rs +0 -600
  211. package/dist-engine-src/src/commit_store/types.rs +0 -215
  212. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +0 -34
  213. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +0 -48
  214. package/dist-engine-src/src/session/create_version.rs +0 -88
  215. package/dist-engine-src/src/session/merge/apply.rs +0 -23
  216. package/dist-engine-src/src/session/optimization9_sql2_bench.rs +0 -100
  217. package/dist-engine-src/src/session/switch_version.rs +0 -110
  218. package/dist-engine-src/src/sql2/entity_provider.rs +0 -3211
  219. package/dist-engine-src/src/sql2/execute.rs +0 -3533
  220. package/dist-engine-src/src/sql2/public_bind/assignment.rs +0 -46
  221. package/dist-engine-src/src/sql2/public_bind/capability.rs +0 -41
  222. package/dist-engine-src/src/sql2/public_bind/dml.rs +0 -172
  223. package/dist-engine-src/src/sql2/public_bind/mod.rs +0 -26
  224. package/dist-engine-src/src/sql2/public_bind/table.rs +0 -168
  225. package/dist-engine-src/src/sql2/version_scope.rs +0 -394
  226. package/dist-engine-src/src/storage/types.rs +0 -501
  227. package/dist-engine-src/src/tracked_state/by_file_index.rs +0 -98
  228. package/dist-engine-src/src/tracked_state/materializer.rs +0 -488
  229. package/dist-engine-src/src/transaction/live_state_overlay.rs +0 -35
  230. package/dist-engine-src/src/version/lifecycle.rs +0 -221
  231. package/dist-engine-src/src/version/mod.rs +0 -13
  232. package/dist-engine-src/src/version/refs.rs +0 -330
  233. package/dist-engine-src/src/version/stage_rows.rs +0 -67
  234. package/dist-engine-src/src/version/types.rs +0 -21
@@ -1,4 +1,4 @@
1
- use crate::entity_identity::EntityIdentity;
1
+ use crate::entity_pk::EntityPk;
2
2
  use crate::NullableKeyFilter;
3
3
 
4
4
  /// Durable local row excluded from changelog and commit membership.
@@ -7,7 +7,7 @@ use crate::NullableKeyFilter;
7
7
  /// directly, and mutable JSON payloads are stored inline in the sidecar row.
8
8
  #[derive(Debug, Clone, PartialEq, Eq)]
9
9
  pub(crate) struct UntrackedStateRow {
10
- pub(crate) entity_id: EntityIdentity,
10
+ pub(crate) entity_pk: EntityPk,
11
11
  pub(crate) schema_key: String,
12
12
  pub(crate) file_id: Option<String>,
13
13
  pub(crate) snapshot_content: Option<String>,
@@ -15,13 +15,13 @@ pub(crate) struct UntrackedStateRow {
15
15
  pub(crate) created_at: String,
16
16
  pub(crate) updated_at: String,
17
17
  pub(crate) global: bool,
18
- pub(crate) version_id: String,
18
+ pub(crate) branch_id: String,
19
19
  }
20
20
 
21
21
  impl UntrackedStateRow {
22
22
  pub(crate) fn as_ref(&self) -> UntrackedStateRowRef<'_> {
23
23
  UntrackedStateRowRef {
24
- entity_id: &self.entity_id,
24
+ entity_pk: &self.entity_pk,
25
25
  schema_key: &self.schema_key,
26
26
  file_id: self.file_id.as_deref(),
27
27
  snapshot_content: self.snapshot_content.as_deref(),
@@ -29,7 +29,7 @@ impl UntrackedStateRow {
29
29
  created_at: &self.created_at,
30
30
  updated_at: &self.updated_at,
31
31
  global: self.global,
32
- version_id: &self.version_id,
32
+ branch_id: &self.branch_id,
33
33
  }
34
34
  }
35
35
  }
@@ -40,7 +40,7 @@ impl UntrackedStateRow {
40
40
  /// without making untracked_state depend on transaction or live-state types.
41
41
  #[derive(Debug, Clone, Copy)]
42
42
  pub(crate) struct UntrackedStateRowRef<'a> {
43
- pub(crate) entity_id: &'a EntityIdentity,
43
+ pub(crate) entity_pk: &'a EntityPk,
44
44
  pub(crate) schema_key: &'a str,
45
45
  pub(crate) file_id: Option<&'a str>,
46
46
  pub(crate) snapshot_content: Option<&'a str>,
@@ -48,13 +48,13 @@ pub(crate) struct UntrackedStateRowRef<'a> {
48
48
  pub(crate) created_at: &'a str,
49
49
  pub(crate) updated_at: &'a str,
50
50
  pub(crate) global: bool,
51
- pub(crate) version_id: &'a str,
51
+ pub(crate) branch_id: &'a str,
52
52
  }
53
53
 
54
54
  /// Hydrated boundary shape for callers that still work with JSON payloads.
55
55
  #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
56
56
  pub(crate) struct MaterializedUntrackedStateRow {
57
- pub(crate) entity_id: EntityIdentity,
57
+ pub(crate) entity_pk: EntityPk,
58
58
  pub(crate) schema_key: String,
59
59
  pub(crate) file_id: Option<String>,
60
60
  pub(crate) snapshot_content: Option<String>,
@@ -63,32 +63,32 @@ pub(crate) struct MaterializedUntrackedStateRow {
63
63
  pub(crate) created_at: String,
64
64
  pub(crate) updated_at: String,
65
65
  pub(crate) global: bool,
66
- pub(crate) version_id: String,
66
+ pub(crate) branch_id: String,
67
67
  }
68
68
 
69
69
  /// Stable identity for one local untracked overlay row.
70
70
  #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
71
71
  pub(crate) struct UntrackedStateIdentity {
72
- pub(crate) version_id: String,
72
+ pub(crate) branch_id: String,
73
73
  pub(crate) schema_key: String,
74
- pub(crate) entity_id: EntityIdentity,
74
+ pub(crate) entity_pk: EntityPk,
75
75
  pub(crate) file_id: Option<String>,
76
76
  }
77
77
 
78
78
  #[derive(Debug, Clone, Copy, PartialEq, Eq)]
79
79
  pub(crate) struct UntrackedStateIdentityRef<'a> {
80
- pub(crate) version_id: &'a str,
80
+ pub(crate) branch_id: &'a str,
81
81
  pub(crate) schema_key: &'a str,
82
- pub(crate) entity_id: &'a EntityIdentity,
82
+ pub(crate) entity_pk: &'a EntityPk,
83
83
  pub(crate) file_id: Option<&'a str>,
84
84
  }
85
85
 
86
86
  impl UntrackedStateIdentity {
87
87
  pub(crate) fn as_ref(&self) -> UntrackedStateIdentityRef<'_> {
88
88
  UntrackedStateIdentityRef {
89
- version_id: &self.version_id,
89
+ branch_id: &self.branch_id,
90
90
  schema_key: &self.schema_key,
91
- entity_id: &self.entity_id,
91
+ entity_pk: &self.entity_pk,
92
92
  file_id: self.file_id.as_deref(),
93
93
  }
94
94
  }
@@ -97,9 +97,9 @@ impl UntrackedStateIdentity {
97
97
  impl<'a> From<UntrackedStateRowRef<'a>> for UntrackedStateIdentityRef<'a> {
98
98
  fn from(row: UntrackedStateRowRef<'a>) -> Self {
99
99
  Self {
100
- version_id: row.version_id,
100
+ branch_id: row.branch_id,
101
101
  schema_key: row.schema_key,
102
- entity_id: row.entity_id,
102
+ entity_pk: row.entity_pk,
103
103
  file_id: row.file_id,
104
104
  }
105
105
  }
@@ -111,9 +111,9 @@ pub(crate) struct UntrackedStateFilter {
111
111
  #[serde(default)]
112
112
  pub(crate) schema_keys: Vec<String>,
113
113
  #[serde(default)]
114
- pub(crate) entity_ids: Vec<EntityIdentity>,
114
+ pub(crate) entity_pks: Vec<EntityPk>,
115
115
  #[serde(default)]
116
- pub(crate) version_ids: Vec<String>,
116
+ pub(crate) branch_ids: Vec<String>,
117
117
  #[serde(default)]
118
118
  pub(crate) file_ids: Vec<NullableKeyFilter<String>>,
119
119
  }
@@ -140,7 +140,7 @@ pub(crate) struct UntrackedStateScanRequest {
140
140
  #[derive(Debug, Clone, PartialEq, Eq)]
141
141
  pub(crate) struct UntrackedStateRowRequest {
142
142
  pub(crate) schema_key: String,
143
- pub(crate) version_id: String,
144
- pub(crate) entity_id: EntityIdentity,
143
+ pub(crate) branch_id: String,
144
+ pub(crate) entity_pk: EntityPk,
145
145
  pub(crate) file_id: NullableKeyFilter<String>,
146
146
  }
package/package.json CHANGED
@@ -1,69 +1,72 @@
1
1
  {
2
- "name": "@lix-js/sdk",
3
- "type": "module",
4
- "version": "0.6.0-preview.4",
5
- "main": "./dist/index.js",
6
- "types": "./dist/index.d.ts",
7
- "files": [
8
- "dist",
9
- "dist-engine-src",
10
- "SKILL.md"
11
- ],
12
- "exports": {
13
- ".": {
14
- "types": "./dist/index.d.ts",
15
- "default": "./dist/index.js"
16
- },
17
- "./sqlite": {
18
- "types": "./dist/sqlite/index.d.ts",
19
- "default": "./dist/sqlite/index.js"
20
- }
21
- },
22
- "description": "WASM-backed JS SDK wrapper for Lix",
23
- "scripts": {
24
- "build": "node ./scripts/build.js",
25
- "sync:builtin-schemas": "node ./scripts/sync-builtin-schemas.js",
26
- "sync:engine-src": "node ./scripts/sync-engine-src.js",
27
- "prepack": "node ./scripts/sync-engine-src.js",
28
- "typecheck": "pnpm run sync:builtin-schemas && tsc -p tsconfig.json --noEmit",
29
- "test": "node ./scripts/build.js && vitest run",
30
- "test:watch": "node ./scripts/build.js && vitest"
31
- },
32
- "peerDependencies": {
33
- "better-sqlite3": "^12.9.0"
34
- },
35
- "peerDependenciesMeta": {
36
- "better-sqlite3": {
37
- "optional": true
38
- }
39
- },
40
- "devDependencies": {
41
- "better-sqlite3": "^12.9.0",
42
- "typescript": "^5.5.4",
43
- "vitest": "^4.0.18"
44
- },
45
- "nx": {
46
- "targets": {
47
- "build": {
48
- "inputs": [
49
- "default",
50
- "^default",
51
- "publicEnv",
52
- "nodeVersion",
53
- "platform",
54
- "{workspaceRoot}/Cargo.toml",
55
- "{workspaceRoot}/Cargo.lock",
56
- "{workspaceRoot}/packages/engine/**/*",
57
- "{workspaceRoot}/packages/rs-sdk/**/*",
58
- "{workspaceRoot}/packages/js-sdk/Cargo.toml",
59
- "{workspaceRoot}/packages/js-sdk/wasm-bindgen.rs"
60
- ],
61
- "outputs": [
62
- "{projectRoot}/dist",
63
- "{projectRoot}/dist-engine-src",
64
- "{projectRoot}/src/engine-wasm/wasm"
65
- ]
66
- }
67
- }
68
- }
69
- }
2
+ "name": "@lix-js/sdk",
3
+ "type": "module",
4
+ "version": "0.6.0-preview.5",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "dist-engine-src",
10
+ "SKILL.md"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ },
17
+ "./sqlite": {
18
+ "types": "./dist/sqlite/index.d.ts",
19
+ "default": "./dist/sqlite/index.js"
20
+ }
21
+ },
22
+ "description": "WASM-backed JS SDK wrapper for Lix",
23
+ "engines": {
24
+ "node": ">=22"
25
+ },
26
+ "peerDependencies": {
27
+ "better-sqlite3": "^12.9.0"
28
+ },
29
+ "peerDependenciesMeta": {
30
+ "better-sqlite3": {
31
+ "optional": true
32
+ }
33
+ },
34
+ "devDependencies": {
35
+ "better-sqlite3": "^12.10.0",
36
+ "typescript": "^5.5.4",
37
+ "vitest": "^4.0.18"
38
+ },
39
+ "nx": {
40
+ "targets": {
41
+ "build": {
42
+ "inputs": [
43
+ "default",
44
+ "^default",
45
+ "publicEnv",
46
+ "nodeVersion",
47
+ "platform",
48
+ "{workspaceRoot}/Cargo.toml",
49
+ "{workspaceRoot}/Cargo.lock",
50
+ "{workspaceRoot}/packages/engine/**/*",
51
+ "{workspaceRoot}/packages/rs-sdk/**/*",
52
+ "{workspaceRoot}/packages/js-sdk/Cargo.toml",
53
+ "{workspaceRoot}/packages/js-sdk/wasm-bindgen.rs"
54
+ ],
55
+ "outputs": [
56
+ "{projectRoot}/dist",
57
+ "{projectRoot}/dist-engine-src",
58
+ "{projectRoot}/src/engine-wasm/wasm"
59
+ ]
60
+ }
61
+ }
62
+ },
63
+ "scripts": {
64
+ "build": "node ./scripts/build.js",
65
+ "sync:builtin-schemas": "node ./scripts/sync-builtin-schemas.js",
66
+ "sync:engine-src": "node ./scripts/sync-engine-src.js",
67
+ "typecheck": "pnpm run sync:builtin-schemas && tsc -p tsconfig.json --noEmit",
68
+ "test": "node ./scripts/build.js && vitest run",
69
+ "test:watch": "node ./scripts/build.js && vitest",
70
+ "format": "prettier --write --ignore-unknown ."
71
+ }
72
+ }
@@ -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
- }