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

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 (169) hide show
  1. package/SKILL.md +46 -8
  2. package/dist/engine-wasm/wasm/lix_engine.d.ts +25 -1
  3. package/dist/engine-wasm/wasm/lix_engine.js +60 -2
  4. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  5. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +5 -0
  6. package/dist/generated/builtin-schemas.d.ts +87 -162
  7. package/dist/generated/builtin-schemas.js +139 -236
  8. package/dist/open-lix.d.ts +10 -3
  9. package/dist/open-lix.js +39 -0
  10. package/dist-engine-src/src/binary_cas/types.rs +0 -6
  11. package/dist-engine-src/src/catalog/context.rs +412 -0
  12. package/dist-engine-src/src/catalog/mod.rs +10 -0
  13. package/dist-engine-src/src/catalog/schema.rs +4 -0
  14. package/dist-engine-src/src/catalog/snapshot.rs +1114 -0
  15. package/dist-engine-src/src/cel/mod.rs +1 -1
  16. package/dist-engine-src/src/cel/provider.rs +1 -1
  17. package/dist-engine-src/src/commit_graph/context.rs +328 -1015
  18. package/dist-engine-src/src/commit_graph/mod.rs +2 -3
  19. package/dist-engine-src/src/commit_graph/types.rs +7 -43
  20. package/dist-engine-src/src/commit_graph/walker.rs +57 -81
  21. package/dist-engine-src/src/commit_store/codec.rs +887 -0
  22. package/dist-engine-src/src/commit_store/context.rs +944 -0
  23. package/dist-engine-src/src/commit_store/materialization.rs +84 -0
  24. package/dist-engine-src/src/commit_store/mod.rs +16 -0
  25. package/dist-engine-src/src/commit_store/storage.rs +600 -0
  26. package/dist-engine-src/src/commit_store/types.rs +215 -0
  27. package/dist-engine-src/src/common/identity.rs +15 -5
  28. package/dist-engine-src/src/common/json_pointer.rs +67 -0
  29. package/dist-engine-src/src/common/metadata.rs +17 -12
  30. package/dist-engine-src/src/common/mod.rs +5 -5
  31. package/dist-engine-src/src/domain.rs +324 -0
  32. package/dist-engine-src/src/engine.rs +29 -43
  33. package/dist-engine-src/src/entity_identity.rs +238 -118
  34. package/dist-engine-src/src/functions/context.rs +17 -52
  35. package/dist-engine-src/src/functions/deterministic.rs +1 -1
  36. package/dist-engine-src/src/functions/mod.rs +1 -1
  37. package/dist-engine-src/src/functions/provider.rs +4 -4
  38. package/dist-engine-src/src/functions/state.rs +39 -66
  39. package/dist-engine-src/src/functions/types.rs +1 -1
  40. package/dist-engine-src/src/init.rs +204 -151
  41. package/dist-engine-src/src/json_store/context.rs +354 -60
  42. package/dist-engine-src/src/json_store/encoded.rs +6 -6
  43. package/dist-engine-src/src/json_store/mod.rs +4 -1
  44. package/dist-engine-src/src/json_store/store.rs +884 -11
  45. package/dist-engine-src/src/json_store/types.rs +166 -1
  46. package/dist-engine-src/src/lib.rs +11 -10
  47. package/dist-engine-src/src/live_state/context.rs +608 -830
  48. package/dist-engine-src/src/live_state/mod.rs +3 -3
  49. package/dist-engine-src/src/live_state/overlay.rs +7 -7
  50. package/dist-engine-src/src/live_state/reader.rs +5 -5
  51. package/dist-engine-src/src/live_state/types.rs +19 -36
  52. package/dist-engine-src/src/live_state/visibility.rs +19 -14
  53. package/dist-engine-src/src/plugin/archive.rs +3 -6
  54. package/dist-engine-src/src/plugin/install.rs +0 -18
  55. package/dist-engine-src/src/plugin/plugin_manifest.json +0 -1
  56. package/dist-engine-src/src/schema/annotations/defaults.rs +2 -7
  57. package/dist-engine-src/src/schema/builtin/lix_account.json +0 -1
  58. package/dist-engine-src/src/schema/builtin/lix_active_account.json +0 -1
  59. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +0 -1
  60. package/dist-engine-src/src/schema/builtin/lix_change.json +11 -10
  61. package/dist-engine-src/src/schema/builtin/lix_change_author.json +0 -1
  62. package/dist-engine-src/src/schema/builtin/lix_commit.json +8 -46
  63. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +29 -22
  64. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +0 -1
  65. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +0 -1
  66. package/dist-engine-src/src/schema/builtin/lix_key_value.json +0 -1
  67. package/dist-engine-src/src/schema/builtin/lix_label.json +10 -3
  68. package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +74 -0
  69. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +2 -8
  70. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +0 -1
  71. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +0 -1
  72. package/dist-engine-src/src/schema/builtin/mod.rs +10 -59
  73. package/dist-engine-src/src/schema/compatibility.rs +787 -0
  74. package/dist-engine-src/src/schema/definition.json +47 -17
  75. package/dist-engine-src/src/schema/definition.rs +202 -96
  76. package/dist-engine-src/src/schema/key.rs +9 -77
  77. package/dist-engine-src/src/schema/mod.rs +4 -4
  78. package/dist-engine-src/src/schema/tests.rs +133 -92
  79. package/dist-engine-src/src/session/context.rs +86 -48
  80. package/dist-engine-src/src/session/create_version.rs +22 -14
  81. package/dist-engine-src/src/session/execute.rs +117 -23
  82. package/dist-engine-src/src/session/merge/apply.rs +4 -4
  83. package/dist-engine-src/src/session/merge/conflicts.rs +3 -2
  84. package/dist-engine-src/src/session/merge/stats.rs +1 -1
  85. package/dist-engine-src/src/session/merge/version.rs +35 -45
  86. package/dist-engine-src/src/session/mod.rs +9 -7
  87. package/dist-engine-src/src/session/optimization9_sql2_bench.rs +100 -0
  88. package/dist-engine-src/src/session/switch_version.rs +17 -28
  89. package/dist-engine-src/src/session/transaction.rs +76 -0
  90. package/dist-engine-src/src/sql2/change_provider.rs +14 -20
  91. package/dist-engine-src/src/sql2/classify.rs +75 -48
  92. package/dist-engine-src/src/sql2/context.rs +22 -18
  93. package/dist-engine-src/src/sql2/directory_history_provider.rs +28 -20
  94. package/dist-engine-src/src/sql2/directory_provider.rs +131 -83
  95. package/dist-engine-src/src/sql2/entity_history_provider.rs +10 -14
  96. package/dist-engine-src/src/sql2/entity_provider.rs +680 -169
  97. package/dist-engine-src/src/sql2/error.rs +24 -5
  98. package/dist-engine-src/src/sql2/execute.rs +426 -272
  99. package/dist-engine-src/src/sql2/file_history_provider.rs +29 -21
  100. package/dist-engine-src/src/sql2/file_provider.rs +533 -108
  101. package/dist-engine-src/src/sql2/filesystem_planner.rs +58 -94
  102. package/dist-engine-src/src/sql2/filesystem_visibility.rs +37 -23
  103. package/dist-engine-src/src/sql2/history_projection.rs +3 -27
  104. package/dist-engine-src/src/sql2/history_provider.rs +11 -17
  105. package/dist-engine-src/src/sql2/history_route.rs +22 -8
  106. package/dist-engine-src/src/sql2/lix_state_provider.rs +178 -96
  107. package/dist-engine-src/src/sql2/mod.rs +8 -4
  108. package/dist-engine-src/src/sql2/predicate_typecheck.rs +246 -0
  109. package/dist-engine-src/src/sql2/public_bind/assignment.rs +46 -0
  110. package/dist-engine-src/src/sql2/public_bind/capability.rs +41 -0
  111. package/dist-engine-src/src/sql2/public_bind/dml.rs +172 -0
  112. package/dist-engine-src/src/sql2/public_bind/mod.rs +26 -0
  113. package/dist-engine-src/src/sql2/public_bind/table.rs +168 -0
  114. package/dist-engine-src/src/sql2/read_only.rs +10 -12
  115. package/dist-engine-src/src/sql2/session.rs +7 -10
  116. package/dist-engine-src/src/sql2/udfs/lix_timestamp.rs +76 -0
  117. package/dist-engine-src/src/sql2/udfs/mod.rs +8 -1
  118. package/dist-engine-src/src/sql2/udfs/public_call.rs +238 -0
  119. package/dist-engine-src/src/sql2/version_provider.rs +46 -31
  120. package/dist-engine-src/src/sql2/version_scope.rs +4 -4
  121. package/dist-engine-src/src/storage_bench.rs +1782 -325
  122. package/dist-engine-src/src/test_support.rs +183 -36
  123. package/dist-engine-src/src/tracked_state/by_file_index.rs +20 -24
  124. package/dist-engine-src/src/tracked_state/codec.rs +1519 -181
  125. package/dist-engine-src/src/tracked_state/context.rs +1155 -271
  126. package/dist-engine-src/src/tracked_state/diff.rs +249 -57
  127. package/dist-engine-src/src/tracked_state/materialization.rs +365 -103
  128. package/dist-engine-src/src/tracked_state/materializer.rs +488 -0
  129. package/dist-engine-src/src/tracked_state/merge.rs +37 -19
  130. package/dist-engine-src/src/tracked_state/mod.rs +8 -7
  131. package/dist-engine-src/src/tracked_state/storage.rs +138 -6
  132. package/dist-engine-src/src/tracked_state/tree.rs +695 -252
  133. package/dist-engine-src/src/tracked_state/types.rs +176 -6
  134. package/dist-engine-src/src/transaction/commit.rs +695 -435
  135. package/dist-engine-src/src/transaction/context.rs +551 -310
  136. package/dist-engine-src/src/transaction/live_state_overlay.rs +9 -8
  137. package/dist-engine-src/src/transaction/mod.rs +2 -0
  138. package/dist-engine-src/src/transaction/normalization.rs +311 -447
  139. package/dist-engine-src/src/transaction/prep.rs +37 -0
  140. package/dist-engine-src/src/transaction/schema_resolver.rs +93 -71
  141. package/dist-engine-src/src/transaction/staging.rs +701 -406
  142. package/dist-engine-src/src/transaction/types.rs +231 -122
  143. package/dist-engine-src/src/transaction/validation.rs +2717 -1698
  144. package/dist-engine-src/src/untracked_state/codec.rs +40 -96
  145. package/dist-engine-src/src/untracked_state/context.rs +21 -5
  146. package/dist-engine-src/src/untracked_state/materialization.rs +10 -104
  147. package/dist-engine-src/src/untracked_state/mod.rs +3 -5
  148. package/dist-engine-src/src/untracked_state/storage.rs +105 -57
  149. package/dist-engine-src/src/untracked_state/types.rs +63 -13
  150. package/dist-engine-src/src/version/context.rs +1 -13
  151. package/dist-engine-src/src/version/lifecycle.rs +221 -0
  152. package/dist-engine-src/src/version/mod.rs +3 -2
  153. package/dist-engine-src/src/version/refs.rs +12 -103
  154. package/dist-engine-src/src/version/stage_rows.rs +15 -19
  155. package/package.json +1 -1
  156. package/dist-engine-src/src/changelog/codec.rs +0 -321
  157. package/dist-engine-src/src/changelog/context.rs +0 -92
  158. package/dist-engine-src/src/changelog/materialization.rs +0 -121
  159. package/dist-engine-src/src/changelog/mod.rs +0 -13
  160. package/dist-engine-src/src/changelog/reader.rs +0 -20
  161. package/dist-engine-src/src/changelog/storage.rs +0 -220
  162. package/dist-engine-src/src/changelog/types.rs +0 -38
  163. package/dist-engine-src/src/schema/builtin/lix_change_set.json +0 -18
  164. package/dist-engine-src/src/schema/builtin/lix_change_set_element.json +0 -75
  165. package/dist-engine-src/src/schema/builtin/lix_entity_label.json +0 -63
  166. package/dist-engine-src/src/schema_registry.rs +0 -294
  167. package/dist-engine-src/src/sql2/commit_derived_provider.rs +0 -591
  168. package/dist-engine-src/src/tracked_state/rebuild.rs +0 -771
  169. package/dist-engine-src/src/tracked_state/tree_types.rs +0 -176
@@ -1,20 +1,110 @@
1
+ use crate::commit_store::{ChangeLocator, ChangeLocatorRef, ChangeRef};
1
2
  use crate::entity_identity::EntityIdentity;
2
- use crate::{NullableKeyFilter, RowMetadata};
3
+ use crate::json_store::JsonRef;
4
+ use crate::{LixError, NullableKeyFilter};
3
5
 
4
- /// Rebuildable tracked state row.
6
+ pub(crate) const TRACKED_STATE_HASH_BYTES: usize = 32;
7
+
8
+ /// Content-addressed root id for one tracked-state projection tree.
9
+ #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
10
+ pub(crate) struct TrackedStateRootId([u8; TRACKED_STATE_HASH_BYTES]);
11
+
12
+ impl TrackedStateRootId {
13
+ pub(crate) fn new(bytes: [u8; TRACKED_STATE_HASH_BYTES]) -> Self {
14
+ Self(bytes)
15
+ }
16
+
17
+ pub(crate) fn from_slice(bytes: &[u8]) -> Result<Self, LixError> {
18
+ if bytes.len() != TRACKED_STATE_HASH_BYTES {
19
+ return Err(LixError::new(
20
+ "LIX_ERROR_UNKNOWN",
21
+ format!(
22
+ "tracked-state tree root id must be {TRACKED_STATE_HASH_BYTES} bytes, got {}",
23
+ bytes.len()
24
+ ),
25
+ ));
26
+ }
27
+ let mut out = [0_u8; TRACKED_STATE_HASH_BYTES];
28
+ out.copy_from_slice(bytes);
29
+ Ok(Self(out))
30
+ }
31
+
32
+ pub(crate) fn as_bytes(&self) -> &[u8; TRACKED_STATE_HASH_BYTES] {
33
+ &self.0
34
+ }
35
+ }
36
+
37
+ /// Root-independent tracked entity identity.
38
+ #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
39
+ pub(crate) struct TrackedStateKey {
40
+ pub(crate) schema_key: String,
41
+ pub(crate) file_id: Option<String>,
42
+ pub(crate) entity_id: EntityIdentity,
43
+ }
44
+
45
+ /// Zero-copy view of primary tracked-state key.
46
+ #[derive(Debug, Clone, Copy)]
47
+ pub(crate) struct TrackedStateKeyRef<'a> {
48
+ pub(crate) schema_key: &'a str,
49
+ pub(crate) file_id: Option<&'a str>,
50
+ pub(crate) entity_id: &'a EntityIdentity,
51
+ }
52
+
53
+ /// Zero-copy tracked-state projection delta prepared from commit_store facts.
54
+ #[derive(Debug, Clone, Copy)]
55
+ pub(crate) struct TrackedStateDeltaRef<'a> {
56
+ pub(crate) change: ChangeRef<'a>,
57
+ pub(crate) locator: ChangeLocatorRef<'a>,
58
+ pub(crate) created_at: &'a str,
59
+ pub(crate) updated_at: &'a str,
60
+ }
61
+
62
+ /// Owned per-commit projection delta entry.
63
+ ///
64
+ /// Normal commits persist these entries in `tracked_state.delta_pack`. Full
65
+ /// projection roots are materialized separately from these deltas.
66
+ #[derive(Debug, Clone, PartialEq, Eq)]
67
+ pub(crate) struct TrackedStateDeltaEntry {
68
+ pub(crate) key: TrackedStateKey,
69
+ pub(crate) value: TrackedStateIndexValue,
70
+ }
71
+
72
+ /// Projection value stored in tracked-state trees.
73
+ #[derive(Debug, Clone, PartialEq, Eq)]
74
+ pub(crate) struct TrackedStateIndexValue {
75
+ pub(crate) change_locator: ChangeLocator,
76
+ pub(crate) deleted: bool,
77
+ pub(crate) snapshot_ref: Option<JsonRef>,
78
+ pub(crate) metadata_ref: Option<JsonRef>,
79
+ pub(crate) created_at: String,
80
+ pub(crate) updated_at: String,
81
+ }
82
+
83
+ /// Zero-copy view of a tracked-state projection value.
84
+ #[derive(Debug, Clone, Copy)]
85
+ pub(crate) struct TrackedStateIndexValueRef<'a> {
86
+ pub(crate) change_locator: ChangeLocatorRef<'a>,
87
+ pub(crate) deleted: bool,
88
+ pub(crate) snapshot_ref: Option<&'a JsonRef>,
89
+ pub(crate) metadata_ref: Option<&'a JsonRef>,
90
+ pub(crate) created_at: &'a str,
91
+ pub(crate) updated_at: &'a str,
92
+ }
93
+
94
+ /// Materialized tracked-state projection row.
5
95
  ///
6
96
  /// Tracked rows are the projection that can be rebuilt from changelog facts.
7
97
  /// They intentionally do not carry an `untracked` flag: untracked local overlay
8
98
  /// data belongs to `untracked_state`, and the serving `live_state` facade is
9
99
  /// responsible for combining both sources.
10
100
  #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
11
- pub(crate) struct TrackedStateRow {
101
+ pub(crate) struct MaterializedTrackedStateRow {
12
102
  pub(crate) entity_id: EntityIdentity,
13
103
  pub(crate) schema_key: String,
14
104
  pub(crate) file_id: Option<String>,
15
105
  pub(crate) snapshot_content: Option<String>,
16
- pub(crate) metadata: Option<RowMetadata>,
17
- pub(crate) schema_version: String,
106
+ pub(crate) metadata: Option<String>,
107
+ pub(crate) deleted: bool,
18
108
  pub(crate) created_at: String,
19
109
  pub(crate) updated_at: String,
20
110
  pub(crate) change_id: String,
@@ -41,7 +131,7 @@ pub(crate) struct TrackedStateProjection {
41
131
  pub(crate) columns: Vec<String>,
42
132
  }
43
133
 
44
- /// Scan request for the rebuildable tracked-state projection.
134
+ /// Scan request for the tracked-state projection.
45
135
  #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, Default)]
46
136
  pub(crate) struct TrackedStateScanRequest {
47
137
  #[serde(default)]
@@ -59,3 +149,83 @@ pub(crate) struct TrackedStateRowRequest {
59
149
  pub(crate) entity_id: EntityIdentity,
60
150
  pub(crate) file_id: NullableKeyFilter<String>,
61
151
  }
152
+
153
+ #[derive(Debug, PartialEq, Eq)]
154
+ pub(crate) struct TrackedStateMutation {
155
+ pub(crate) encoded_key: Vec<u8>,
156
+ pub(crate) encoded_value: Vec<u8>,
157
+ }
158
+
159
+ impl TrackedStateMutation {
160
+ pub(crate) fn put_encoded(encoded_key: Vec<u8>, encoded_value: Vec<u8>) -> Self {
161
+ Self {
162
+ encoded_key,
163
+ encoded_value,
164
+ }
165
+ }
166
+ }
167
+
168
+ #[derive(Debug, Clone, PartialEq, Eq)]
169
+ pub(crate) struct TrackedStateTreeScanRequest {
170
+ pub(crate) schema_keys: Vec<String>,
171
+ pub(crate) entity_ids: Vec<EntityIdentity>,
172
+ pub(crate) file_ids: Vec<NullableKeyFilter<String>>,
173
+ pub(crate) include_tombstones: bool,
174
+ pub(crate) limit: Option<usize>,
175
+ }
176
+
177
+ impl Default for TrackedStateTreeScanRequest {
178
+ fn default() -> Self {
179
+ Self {
180
+ schema_keys: Vec::new(),
181
+ entity_ids: Vec::new(),
182
+ file_ids: Vec::new(),
183
+ include_tombstones: true,
184
+ limit: None,
185
+ }
186
+ }
187
+ }
188
+
189
+ impl TrackedStateTreeScanRequest {
190
+ pub(crate) fn matches(&self, key: &TrackedStateKey, value: &TrackedStateIndexValue) -> bool {
191
+ if !self.include_tombstones && value.deleted {
192
+ return false;
193
+ }
194
+ self.matches_key(key)
195
+ }
196
+
197
+ pub(crate) fn matches_key(&self, key: &TrackedStateKey) -> bool {
198
+ if !self.schema_keys.is_empty() && !self.schema_keys.contains(&key.schema_key) {
199
+ return false;
200
+ }
201
+ if !self.entity_ids.is_empty() && !self.entity_ids.contains(&key.entity_id) {
202
+ return false;
203
+ }
204
+ if !self.file_ids.is_empty()
205
+ && !self.file_ids.iter().any(|filter| match filter {
206
+ NullableKeyFilter::Any => true,
207
+ NullableKeyFilter::Null => key.file_id.is_none(),
208
+ NullableKeyFilter::Value(value) => key.file_id.as_ref() == Some(value),
209
+ })
210
+ {
211
+ return false;
212
+ }
213
+ true
214
+ }
215
+ }
216
+
217
+ #[derive(Debug, Clone, PartialEq, Eq)]
218
+ pub(crate) struct TrackedStateApplyResult {
219
+ pub(crate) root_id: TrackedStateRootId,
220
+ pub(crate) row_count: usize,
221
+ pub(crate) tree_height: usize,
222
+ pub(crate) chunk_count: usize,
223
+ pub(crate) chunk_bytes: usize,
224
+ pub(crate) persisted_root: bool,
225
+ }
226
+
227
+ #[derive(Debug, Clone, PartialEq, Eq)]
228
+ pub(crate) struct TrackedStateTreeDiffEntry {
229
+ pub(crate) before: Option<(TrackedStateKey, TrackedStateIndexValue)>,
230
+ pub(crate) after: Option<(TrackedStateKey, TrackedStateIndexValue)>,
231
+ }