@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,294 +0,0 @@
1
- use std::collections::BTreeMap;
2
-
3
- use serde_json::Value as JsonValue;
4
-
5
- use crate::live_state::LiveStateRow;
6
- use crate::live_state::{LiveStateFilter, LiveStateReader, LiveStateScanRequest};
7
- use crate::schema::schema_key_from_definition;
8
- use crate::{LixError, NullableKeyFilter, GLOBAL_VERSION_ID};
9
-
10
- const REGISTERED_SCHEMA_KEY: &str = "lix_registered_schema";
11
-
12
- /// Engine2 schema visibility boundary.
13
- ///
14
- /// SQL planning receives a schema snapshot from live state. System schemas are
15
- /// seeded as ordinary `lix_registered_schema` rows during initialization, so
16
- /// runtime schema visibility has one source of truth.
17
- pub(crate) struct SchemaRegistry;
18
-
19
- impl SchemaRegistry {
20
- pub(crate) fn new() -> Self {
21
- Self
22
- }
23
-
24
- /// Loads schema definitions visible for SQL planning at `version_id`.
25
- pub(crate) async fn visible_schemas<R>(
26
- &self,
27
- live_state: &R,
28
- version_id: &str,
29
- ) -> Result<Vec<JsonValue>, LixError>
30
- where
31
- R: LiveStateReader + ?Sized,
32
- {
33
- let mut schemas = BTreeMap::new();
34
- for row in live_state
35
- .scan_rows(&LiveStateScanRequest {
36
- filter: LiveStateFilter {
37
- schema_keys: vec![REGISTERED_SCHEMA_KEY.to_string()],
38
- version_ids: vec![version_id.to_string()],
39
- file_ids: vec![NullableKeyFilter::Null],
40
- include_tombstones: false,
41
- ..LiveStateFilter::default()
42
- },
43
- ..LiveStateScanRequest::default()
44
- })
45
- .await?
46
- .into_iter()
47
- .filter(|row| version_scoped_schema_row_is_visible(row, version_id))
48
- {
49
- let Some((key, schema)) = decode_registered_schema_row(&row)? else {
50
- continue;
51
- };
52
- upsert_latest_schema(&mut schemas, key, schema);
53
- }
54
- Ok(schemas.into_values().map(|(_, schema)| schema).collect())
55
- }
56
- }
57
-
58
- fn version_scoped_schema_row_is_visible(row: &LiveStateRow, requested_version_id: &str) -> bool {
59
- requested_version_id == GLOBAL_VERSION_ID || !row.global
60
- }
61
-
62
- fn upsert_latest_schema(
63
- schemas: &mut BTreeMap<String, (crate::schema::SchemaKey, JsonValue)>,
64
- key: crate::schema::SchemaKey,
65
- schema: JsonValue,
66
- ) {
67
- let should_replace = schemas
68
- .get(&key.schema_key)
69
- .is_none_or(|(existing, _)| !schema_key_is_older(&key, existing));
70
- if should_replace {
71
- schemas.insert(key.schema_key.clone(), (key, schema));
72
- }
73
- }
74
-
75
- fn schema_key_is_older(
76
- candidate: &crate::schema::SchemaKey,
77
- existing: &crate::schema::SchemaKey,
78
- ) -> bool {
79
- match (candidate.version_number(), existing.version_number()) {
80
- (Some(candidate_version), Some(existing_version)) => candidate_version < existing_version,
81
- _ => candidate.schema_version < existing.schema_version,
82
- }
83
- }
84
-
85
- fn decode_registered_schema_row(
86
- row: &LiveStateRow,
87
- ) -> Result<Option<(crate::schema::SchemaKey, JsonValue)>, LixError> {
88
- if row.schema_key != REGISTERED_SCHEMA_KEY {
89
- return Err(LixError::new(
90
- "LIX_ERROR_UNKNOWN",
91
- format!(
92
- "expected lix_registered_schema row, got schema_key={}",
93
- row.schema_key
94
- ),
95
- ));
96
- }
97
-
98
- let Some(snapshot_content) = row.snapshot_content.as_deref() else {
99
- return Ok(None);
100
- };
101
-
102
- let snapshot: JsonValue = serde_json::from_str(snapshot_content).map_err(|err| {
103
- LixError::new(
104
- "LIX_ERROR_UNKNOWN",
105
- format!("invalid registered schema snapshot JSON: {err}"),
106
- )
107
- })?;
108
- let schema = snapshot.get("value").cloned().ok_or_else(|| {
109
- LixError::new(
110
- "LIX_ERROR_UNKNOWN",
111
- "registered schema snapshot missing value",
112
- )
113
- })?;
114
- let key = schema_key_from_definition(&schema)?;
115
- Ok(Some((key, schema)))
116
- }
117
-
118
- #[cfg(test)]
119
- mod tests {
120
- use async_trait::async_trait;
121
- use serde_json::json;
122
-
123
- use super::*;
124
- use crate::live_state::LiveStateRowRequest;
125
- use crate::GLOBAL_VERSION_ID;
126
-
127
- #[tokio::test]
128
- async fn visible_schemas_are_loaded_from_registered_schema_rows() {
129
- let registry = SchemaRegistry::new();
130
-
131
- let schemas = registry
132
- .visible_schemas(
133
- &RowsLiveStateReader::new(vec![
134
- registered_schema_row("lix_registered_schema", "1"),
135
- registered_schema_row("lix_key_value", "1"),
136
- ]),
137
- "global",
138
- )
139
- .await
140
- .expect("schema visibility should load");
141
-
142
- assert!(schemas.iter().any(|schema| {
143
- schema.get("x-lix-key").and_then(JsonValue::as_str) == Some("lix_registered_schema")
144
- }));
145
- assert!(schemas.iter().any(|schema| {
146
- schema.get("x-lix-key").and_then(JsonValue::as_str) == Some("lix_key_value")
147
- }));
148
- }
149
-
150
- #[tokio::test]
151
- async fn visible_schemas_include_registered_schema_rows() {
152
- let registry = SchemaRegistry::new();
153
-
154
- let schemas = registry
155
- .visible_schemas(
156
- &RowsLiveStateReader::new(vec![registered_schema_row(
157
- "engine2_dynamic_schema",
158
- "1",
159
- )]),
160
- "global",
161
- )
162
- .await
163
- .expect("schema visibility should load");
164
-
165
- assert!(schemas.iter().any(|schema| {
166
- schema.get("x-lix-key").and_then(JsonValue::as_str) == Some("engine2_dynamic_schema")
167
- }));
168
- }
169
-
170
- #[tokio::test]
171
- async fn visible_schemas_ignore_projected_global_schema_rows_for_version_scope() {
172
- let registry = SchemaRegistry::new();
173
- let mut global_only = registered_schema_row("global_only_schema", "1");
174
- global_only.global = true;
175
- global_only.version_id = "main".to_string();
176
-
177
- let schemas = registry
178
- .visible_schemas(&RowsLiveStateReader::new(vec![global_only]), "main")
179
- .await
180
- .expect("schema visibility should load");
181
-
182
- assert!(schemas.is_empty());
183
- }
184
-
185
- #[tokio::test]
186
- async fn visible_schemas_are_empty_when_no_schema_rows_are_visible() {
187
- let registry = SchemaRegistry::new();
188
-
189
- let schemas = registry
190
- .visible_schemas(&RowsLiveStateReader::new(Vec::new()), "global")
191
- .await
192
- .expect("schema visibility should load");
193
-
194
- assert!(schemas.is_empty());
195
- }
196
-
197
- struct RowsLiveStateReader {
198
- rows: Vec<LiveStateRow>,
199
- }
200
-
201
- impl RowsLiveStateReader {
202
- fn new(rows: Vec<LiveStateRow>) -> Self {
203
- Self { rows }
204
- }
205
- }
206
-
207
- #[async_trait]
208
- impl LiveStateReader for RowsLiveStateReader {
209
- async fn scan_rows(
210
- &self,
211
- request: &LiveStateScanRequest,
212
- ) -> Result<Vec<LiveStateRow>, LixError> {
213
- Ok(self
214
- .rows
215
- .iter()
216
- .filter(|row| {
217
- request.filter.schema_keys.is_empty()
218
- || request.filter.schema_keys.contains(&row.schema_key)
219
- })
220
- .filter(|row| {
221
- request.filter.version_ids.is_empty()
222
- || request.filter.version_ids.contains(&row.version_id)
223
- })
224
- .cloned()
225
- .collect())
226
- }
227
-
228
- async fn load_row(
229
- &self,
230
- request: &LiveStateRowRequest,
231
- ) -> Result<Option<LiveStateRow>, LixError> {
232
- Ok(self
233
- .rows
234
- .iter()
235
- .find(|row| {
236
- row.schema_key == request.schema_key
237
- && row.version_id == request.version_id
238
- && row.entity_id == request.entity_id
239
- })
240
- .cloned())
241
- }
242
- }
243
-
244
- fn registered_schema_row(schema_key: &str, schema_version: &str) -> LiveStateRow {
245
- LiveStateRow {
246
- entity_id: registered_schema_entity_id(schema_key, schema_version),
247
- file_id: None,
248
- schema_key: REGISTERED_SCHEMA_KEY.to_string(),
249
- schema_version: "1".to_string(),
250
- version_id: GLOBAL_VERSION_ID.to_string(),
251
- metadata: None,
252
- change_id: Some("change-registered-schema".to_string()),
253
- commit_id: None,
254
- global: true,
255
- untracked: true,
256
- created_at: "2026-04-23T00:00:00Z".to_string(),
257
- updated_at: "2026-04-23T01:00:00Z".to_string(),
258
- snapshot_content: Some(
259
- json!({
260
- "value": {
261
- "x-lix-key": schema_key,
262
- "x-lix-version": schema_version,
263
- "type": "object",
264
- "properties": {
265
- "id": { "type": "string" }
266
- },
267
- "required": ["id"],
268
- "additionalProperties": false
269
- }
270
- })
271
- .to_string(),
272
- ),
273
- }
274
- }
275
-
276
- fn registered_schema_entity_id(
277
- schema_key: &str,
278
- schema_version: &str,
279
- ) -> crate::entity_identity::EntityIdentity {
280
- crate::entity_identity::EntityIdentity::from_primary_key_paths(
281
- &json!({
282
- "value": {
283
- "x-lix-key": schema_key,
284
- "x-lix-version": schema_version,
285
- }
286
- }),
287
- &[
288
- vec!["value".to_string(), "x-lix-key".to_string()],
289
- vec!["value".to_string(), "x-lix-version".to_string()],
290
- ],
291
- )
292
- .expect("registered schema identity should derive")
293
- }
294
- }