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

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 (165) hide show
  1. package/SKILL.md +4 -5
  2. package/dist/engine-wasm/wasm/lix_engine.js +1 -1
  3. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  4. package/dist/generated/builtin-schemas.d.ts +87 -162
  5. package/dist/generated/builtin-schemas.js +139 -236
  6. package/dist/open-lix.d.ts +1 -1
  7. package/dist-engine-src/src/binary_cas/types.rs +0 -6
  8. package/dist-engine-src/src/catalog/context.rs +412 -0
  9. package/dist-engine-src/src/catalog/mod.rs +10 -0
  10. package/dist-engine-src/src/catalog/schema.rs +4 -0
  11. package/dist-engine-src/src/catalog/snapshot.rs +1114 -0
  12. package/dist-engine-src/src/cel/mod.rs +1 -1
  13. package/dist-engine-src/src/cel/provider.rs +1 -1
  14. package/dist-engine-src/src/commit_graph/context.rs +328 -1015
  15. package/dist-engine-src/src/commit_graph/mod.rs +2 -3
  16. package/dist-engine-src/src/commit_graph/types.rs +7 -43
  17. package/dist-engine-src/src/commit_graph/walker.rs +57 -81
  18. package/dist-engine-src/src/commit_store/codec.rs +887 -0
  19. package/dist-engine-src/src/commit_store/context.rs +944 -0
  20. package/dist-engine-src/src/commit_store/materialization.rs +84 -0
  21. package/dist-engine-src/src/commit_store/mod.rs +16 -0
  22. package/dist-engine-src/src/commit_store/storage.rs +600 -0
  23. package/dist-engine-src/src/commit_store/types.rs +215 -0
  24. package/dist-engine-src/src/common/identity.rs +15 -5
  25. package/dist-engine-src/src/common/json_pointer.rs +67 -0
  26. package/dist-engine-src/src/common/metadata.rs +17 -12
  27. package/dist-engine-src/src/common/mod.rs +5 -5
  28. package/dist-engine-src/src/domain.rs +324 -0
  29. package/dist-engine-src/src/engine.rs +29 -43
  30. package/dist-engine-src/src/entity_identity.rs +238 -118
  31. package/dist-engine-src/src/functions/context.rs +17 -52
  32. package/dist-engine-src/src/functions/deterministic.rs +1 -1
  33. package/dist-engine-src/src/functions/mod.rs +1 -1
  34. package/dist-engine-src/src/functions/provider.rs +4 -4
  35. package/dist-engine-src/src/functions/state.rs +39 -66
  36. package/dist-engine-src/src/functions/types.rs +1 -1
  37. package/dist-engine-src/src/init.rs +204 -151
  38. package/dist-engine-src/src/json_store/context.rs +354 -60
  39. package/dist-engine-src/src/json_store/encoded.rs +6 -6
  40. package/dist-engine-src/src/json_store/mod.rs +4 -1
  41. package/dist-engine-src/src/json_store/store.rs +884 -11
  42. package/dist-engine-src/src/json_store/types.rs +166 -1
  43. package/dist-engine-src/src/lib.rs +10 -9
  44. package/dist-engine-src/src/live_state/context.rs +608 -830
  45. package/dist-engine-src/src/live_state/mod.rs +3 -3
  46. package/dist-engine-src/src/live_state/overlay.rs +7 -7
  47. package/dist-engine-src/src/live_state/reader.rs +5 -5
  48. package/dist-engine-src/src/live_state/types.rs +19 -36
  49. package/dist-engine-src/src/live_state/visibility.rs +19 -14
  50. package/dist-engine-src/src/plugin/archive.rs +3 -6
  51. package/dist-engine-src/src/plugin/install.rs +0 -18
  52. package/dist-engine-src/src/plugin/plugin_manifest.json +0 -1
  53. package/dist-engine-src/src/schema/annotations/defaults.rs +2 -7
  54. package/dist-engine-src/src/schema/builtin/lix_account.json +0 -1
  55. package/dist-engine-src/src/schema/builtin/lix_active_account.json +0 -1
  56. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +0 -1
  57. package/dist-engine-src/src/schema/builtin/lix_change.json +11 -10
  58. package/dist-engine-src/src/schema/builtin/lix_change_author.json +0 -1
  59. package/dist-engine-src/src/schema/builtin/lix_commit.json +8 -46
  60. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +29 -22
  61. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +0 -1
  62. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +0 -1
  63. package/dist-engine-src/src/schema/builtin/lix_key_value.json +0 -1
  64. package/dist-engine-src/src/schema/builtin/lix_label.json +10 -3
  65. package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +74 -0
  66. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +2 -8
  67. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +0 -1
  68. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +0 -1
  69. package/dist-engine-src/src/schema/builtin/mod.rs +10 -59
  70. package/dist-engine-src/src/schema/compatibility.rs +787 -0
  71. package/dist-engine-src/src/schema/definition.json +47 -17
  72. package/dist-engine-src/src/schema/definition.rs +202 -96
  73. package/dist-engine-src/src/schema/key.rs +9 -77
  74. package/dist-engine-src/src/schema/mod.rs +4 -4
  75. package/dist-engine-src/src/schema/tests.rs +133 -92
  76. package/dist-engine-src/src/session/context.rs +40 -42
  77. package/dist-engine-src/src/session/create_version.rs +22 -14
  78. package/dist-engine-src/src/session/execute.rs +45 -14
  79. package/dist-engine-src/src/session/merge/apply.rs +4 -4
  80. package/dist-engine-src/src/session/merge/conflicts.rs +3 -2
  81. package/dist-engine-src/src/session/merge/stats.rs +1 -1
  82. package/dist-engine-src/src/session/merge/version.rs +35 -45
  83. package/dist-engine-src/src/session/mod.rs +4 -2
  84. package/dist-engine-src/src/session/optimization9_sql2_bench.rs +100 -0
  85. package/dist-engine-src/src/session/switch_version.rs +16 -28
  86. package/dist-engine-src/src/sql2/change_provider.rs +14 -20
  87. package/dist-engine-src/src/sql2/classify.rs +61 -26
  88. package/dist-engine-src/src/sql2/context.rs +22 -18
  89. package/dist-engine-src/src/sql2/directory_history_provider.rs +28 -20
  90. package/dist-engine-src/src/sql2/directory_provider.rs +131 -83
  91. package/dist-engine-src/src/sql2/entity_history_provider.rs +10 -14
  92. package/dist-engine-src/src/sql2/entity_provider.rs +680 -169
  93. package/dist-engine-src/src/sql2/error.rs +21 -1
  94. package/dist-engine-src/src/sql2/execute.rs +325 -264
  95. package/dist-engine-src/src/sql2/file_history_provider.rs +29 -21
  96. package/dist-engine-src/src/sql2/file_provider.rs +533 -108
  97. package/dist-engine-src/src/sql2/filesystem_planner.rs +58 -94
  98. package/dist-engine-src/src/sql2/filesystem_visibility.rs +37 -23
  99. package/dist-engine-src/src/sql2/history_projection.rs +3 -27
  100. package/dist-engine-src/src/sql2/history_provider.rs +11 -17
  101. package/dist-engine-src/src/sql2/history_route.rs +22 -8
  102. package/dist-engine-src/src/sql2/lix_state_provider.rs +178 -96
  103. package/dist-engine-src/src/sql2/mod.rs +6 -3
  104. package/dist-engine-src/src/sql2/predicate_typecheck.rs +246 -0
  105. package/dist-engine-src/src/sql2/public_bind/assignment.rs +46 -0
  106. package/dist-engine-src/src/sql2/public_bind/capability.rs +41 -0
  107. package/dist-engine-src/src/sql2/public_bind/dml.rs +166 -0
  108. package/dist-engine-src/src/sql2/public_bind/mod.rs +25 -0
  109. package/dist-engine-src/src/sql2/public_bind/table.rs +168 -0
  110. package/dist-engine-src/src/sql2/read_only.rs +10 -12
  111. package/dist-engine-src/src/sql2/session.rs +7 -10
  112. package/dist-engine-src/src/sql2/udfs/lix_timestamp.rs +76 -0
  113. package/dist-engine-src/src/sql2/udfs/mod.rs +8 -1
  114. package/dist-engine-src/src/sql2/udfs/public_call.rs +211 -0
  115. package/dist-engine-src/src/sql2/version_provider.rs +46 -31
  116. package/dist-engine-src/src/sql2/version_scope.rs +4 -4
  117. package/dist-engine-src/src/storage_bench.rs +1782 -325
  118. package/dist-engine-src/src/test_support.rs +183 -36
  119. package/dist-engine-src/src/tracked_state/by_file_index.rs +20 -24
  120. package/dist-engine-src/src/tracked_state/codec.rs +1519 -181
  121. package/dist-engine-src/src/tracked_state/context.rs +1155 -271
  122. package/dist-engine-src/src/tracked_state/diff.rs +249 -57
  123. package/dist-engine-src/src/tracked_state/materialization.rs +365 -103
  124. package/dist-engine-src/src/tracked_state/materializer.rs +488 -0
  125. package/dist-engine-src/src/tracked_state/merge.rs +37 -19
  126. package/dist-engine-src/src/tracked_state/mod.rs +8 -7
  127. package/dist-engine-src/src/tracked_state/storage.rs +138 -6
  128. package/dist-engine-src/src/tracked_state/tree.rs +695 -252
  129. package/dist-engine-src/src/tracked_state/types.rs +176 -6
  130. package/dist-engine-src/src/transaction/commit.rs +695 -435
  131. package/dist-engine-src/src/transaction/context.rs +551 -310
  132. package/dist-engine-src/src/transaction/live_state_overlay.rs +9 -8
  133. package/dist-engine-src/src/transaction/mod.rs +2 -0
  134. package/dist-engine-src/src/transaction/normalization.rs +311 -447
  135. package/dist-engine-src/src/transaction/prep.rs +37 -0
  136. package/dist-engine-src/src/transaction/schema_resolver.rs +93 -71
  137. package/dist-engine-src/src/transaction/staging.rs +701 -406
  138. package/dist-engine-src/src/transaction/types.rs +231 -122
  139. package/dist-engine-src/src/transaction/validation.rs +2717 -1698
  140. package/dist-engine-src/src/untracked_state/codec.rs +40 -96
  141. package/dist-engine-src/src/untracked_state/context.rs +21 -5
  142. package/dist-engine-src/src/untracked_state/materialization.rs +10 -104
  143. package/dist-engine-src/src/untracked_state/mod.rs +3 -5
  144. package/dist-engine-src/src/untracked_state/storage.rs +105 -57
  145. package/dist-engine-src/src/untracked_state/types.rs +63 -13
  146. package/dist-engine-src/src/version/context.rs +1 -13
  147. package/dist-engine-src/src/version/lifecycle.rs +221 -0
  148. package/dist-engine-src/src/version/mod.rs +3 -2
  149. package/dist-engine-src/src/version/refs.rs +12 -103
  150. package/dist-engine-src/src/version/stage_rows.rs +15 -19
  151. package/package.json +1 -1
  152. package/dist-engine-src/src/changelog/codec.rs +0 -321
  153. package/dist-engine-src/src/changelog/context.rs +0 -92
  154. package/dist-engine-src/src/changelog/materialization.rs +0 -121
  155. package/dist-engine-src/src/changelog/mod.rs +0 -13
  156. package/dist-engine-src/src/changelog/reader.rs +0 -20
  157. package/dist-engine-src/src/changelog/storage.rs +0 -220
  158. package/dist-engine-src/src/changelog/types.rs +0 -38
  159. package/dist-engine-src/src/schema/builtin/lix_change_set.json +0 -18
  160. package/dist-engine-src/src/schema/builtin/lix_change_set_element.json +0 -75
  161. package/dist-engine-src/src/schema/builtin/lix_entity_label.json +0 -63
  162. package/dist-engine-src/src/schema_registry.rs +0 -294
  163. package/dist-engine-src/src/sql2/commit_derived_provider.rs +0 -591
  164. package/dist-engine-src/src/tracked_state/rebuild.rs +0 -771
  165. 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
+ }