@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,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
- }