@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
@@ -0,0 +1,37 @@
1
+ use crate::entity_identity::EntityIdentity;
2
+ use crate::untracked_state::UntrackedStateRow;
3
+ use crate::version::VERSION_REF_SCHEMA_KEY;
4
+ use crate::{LixError, GLOBAL_VERSION_ID};
5
+
6
+ pub(crate) struct PreparedVersionRefRow {
7
+ pub(crate) row: UntrackedStateRow,
8
+ }
9
+
10
+ pub(crate) fn prepare_version_ref_row(
11
+ version_id: &str,
12
+ commit_id: &str,
13
+ timestamp: &str,
14
+ ) -> Result<PreparedVersionRefRow, LixError> {
15
+ let snapshot = serde_json::json!({
16
+ "id": version_id,
17
+ "commit_id": commit_id,
18
+ });
19
+ let snapshot = crate::json_store::NormalizedJson::from_value(
20
+ &snapshot,
21
+ "engine version-ref snapshot_content",
22
+ )?;
23
+
24
+ Ok(PreparedVersionRefRow {
25
+ row: UntrackedStateRow {
26
+ entity_id: EntityIdentity::single(version_id),
27
+ schema_key: VERSION_REF_SCHEMA_KEY.to_string(),
28
+ file_id: None,
29
+ snapshot_content: Some(snapshot.as_str().to_string()),
30
+ metadata: None,
31
+ created_at: timestamp.to_string(),
32
+ updated_at: timestamp.to_string(),
33
+ global: true,
34
+ version_id: GLOBAL_VERSION_ID.to_string(),
35
+ },
36
+ })
37
+ }
@@ -2,45 +2,77 @@ use std::collections::BTreeMap;
2
2
  use std::sync::Arc;
3
3
 
4
4
  use async_trait::async_trait;
5
- use serde_json::Value as JsonValue;
6
5
 
7
- use crate::live_state::{LiveStateReader, LiveStateRow, LiveStateRowRequest, LiveStateScanRequest};
8
- use crate::schema_registry::SchemaRegistry;
9
- use crate::transaction::live_state_overlay::overlay_scan_rows;
10
- use crate::transaction::normalization::{
11
- remember_pending_registered_schema, TransactionSchemaCatalog, REGISTERED_SCHEMA_KEY,
6
+ use crate::catalog::{CatalogContext, CatalogSnapshot, SchemaCatalogFact};
7
+ use crate::domain::Domain;
8
+ use crate::live_state::{
9
+ LiveStateReader, LiveStateRowRequest, LiveStateScanRequest, MaterializedLiveStateRow,
12
10
  };
13
- use crate::transaction::staging::{StagedStateRowOverlay, StagedWriteSet};
11
+ use crate::transaction::live_state_overlay::overlay_scan_rows;
12
+ use crate::transaction::staging::PreparedStateRowOverlay;
14
13
  use crate::LixError;
15
14
 
16
15
  pub(crate) struct TransactionSchemaResolver {
17
- registry: Arc<SchemaRegistry>,
18
- catalogs_by_version: BTreeMap<String, TransactionSchemaCatalog>,
16
+ context: Arc<CatalogContext>,
17
+ catalogs_by_domain: BTreeMap<Domain, CatalogEntry>,
18
+ }
19
+
20
+ enum CatalogEntry {
21
+ SchemaFacts(Vec<SchemaCatalogFact>),
22
+ Catalog(CatalogSnapshot),
19
23
  }
20
24
 
21
25
  impl TransactionSchemaResolver {
22
- pub(crate) fn new(registry: Arc<SchemaRegistry>) -> Self {
26
+ pub(crate) fn new(context: Arc<CatalogContext>) -> Self {
23
27
  Self {
24
- registry,
25
- catalogs_by_version: BTreeMap::new(),
28
+ context,
29
+ catalogs_by_domain: BTreeMap::new(),
26
30
  }
27
31
  }
28
32
 
29
- async fn load_catalog_for_version(
33
+ async fn load_catalog_for_domain(
30
34
  &mut self,
31
35
  live_state: &dyn LiveStateReader,
32
- staged: StagedStateRowOverlay,
33
- version_id: &str,
36
+ staged: Option<&PreparedStateRowOverlay>,
37
+ domain: &Domain,
34
38
  ) -> Result<(), LixError> {
35
- if !self.catalogs_by_version.contains_key(version_id) {
36
- let reader = TransactionSchemaLiveStateReader {
37
- base: live_state,
38
- staged,
39
+ let domain = domain.schema_catalog_domain();
40
+ let needs_load = !self.catalogs_by_domain.contains_key(&domain);
41
+ if needs_load {
42
+ let facts = if let Some(staged) = staged {
43
+ let reader = TransactionSchemaLiveStateReader {
44
+ base: live_state,
45
+ staged,
46
+ };
47
+ self.context
48
+ .schema_facts_for_domain(&reader, &domain)
49
+ .await?
50
+ } else {
51
+ self.context
52
+ .schema_facts_for_domain(live_state, &domain)
53
+ .await?
39
54
  };
40
- let schemas = self.registry.visible_schemas(&reader, version_id).await?;
41
- let catalog = TransactionSchemaCatalog::from_visible_schemas(&schemas)?;
42
- self.catalogs_by_version
43
- .insert(version_id.to_string(), catalog);
55
+ self.catalogs_by_domain
56
+ .insert(domain.clone(), CatalogEntry::SchemaFacts(facts));
57
+ }
58
+
59
+ let should_materialize = self
60
+ .catalogs_by_domain
61
+ .get(&domain)
62
+ .is_some_and(|entry| matches!(entry, CatalogEntry::SchemaFacts(_)));
63
+ if should_materialize {
64
+ #[cfg(feature = "storage-benches")]
65
+ crate::storage_bench::record_transaction_schema_catalog_load();
66
+ let entry = self
67
+ .catalogs_by_domain
68
+ .remove(&domain)
69
+ .expect("schema catalog entry should exist after load");
70
+ let CatalogEntry::SchemaFacts(facts) = entry else {
71
+ unreachable!("catalog entry was checked as schema facts");
72
+ };
73
+ let catalog = CatalogSnapshot::from_schema_facts(&facts)?;
74
+ self.catalogs_by_domain
75
+ .insert(domain, CatalogEntry::Catalog(catalog));
44
76
  }
45
77
  Ok(())
46
78
  }
@@ -48,65 +80,55 @@ impl TransactionSchemaResolver {
48
80
  pub(crate) async fn catalog_for_row_normalization(
49
81
  &mut self,
50
82
  live_state: &dyn LiveStateReader,
51
- staged: StagedStateRowOverlay,
52
- version_id: &str,
53
- ) -> Result<&mut TransactionSchemaCatalog, LixError> {
54
- self.load_catalog_for_version(live_state, staged, version_id)
83
+ staged: &PreparedStateRowOverlay,
84
+ domain: &Domain,
85
+ ) -> Result<&mut CatalogSnapshot, LixError> {
86
+ self.load_catalog_for_domain(live_state, Some(staged), domain)
55
87
  .await?;
56
- Ok(self
57
- .catalogs_by_version
58
- .get_mut(version_id)
59
- .expect("catalog cache should contain requested version"))
88
+ let domain = domain.schema_catalog_domain();
89
+ match self
90
+ .catalogs_by_domain
91
+ .get_mut(&domain)
92
+ .expect("catalog cache should contain requested version")
93
+ {
94
+ CatalogEntry::Catalog(catalog) => Ok(catalog),
95
+ CatalogEntry::SchemaFacts(_) => {
96
+ unreachable!("schema catalog should be materialized before mutable access")
97
+ }
98
+ }
60
99
  }
61
100
 
62
101
  pub(crate) async fn catalog_for_validation(
63
102
  &mut self,
64
103
  live_state: &dyn LiveStateReader,
65
- staged_writes: &StagedWriteSet,
66
- version_id: &str,
67
- ) -> Result<TransactionSchemaCatalog, LixError> {
68
- let schemas = self
69
- .registry
70
- .visible_schemas(live_state, version_id)
104
+ domain: &Domain,
105
+ ) -> Result<&CatalogSnapshot, LixError> {
106
+ self.load_catalog_for_domain(live_state, None, domain)
71
107
  .await?;
72
- let mut catalog = TransactionSchemaCatalog::from_visible_schemas(&schemas)?;
73
- absorb_registered_schema_writes(&mut catalog, staged_writes, version_id)?;
74
- Ok(catalog)
75
- }
76
-
77
- pub(crate) fn remember_visible_schemas(
78
- &mut self,
79
- version_id: impl Into<String>,
80
- schemas: Vec<JsonValue>,
81
- ) -> Result<(), LixError> {
82
- let version_id = version_id.into();
83
- let catalog = TransactionSchemaCatalog::from_visible_schemas(&schemas)?;
84
- self.catalogs_by_version.insert(version_id, catalog);
85
- Ok(())
86
- }
87
- }
88
-
89
- fn absorb_registered_schema_writes(
90
- schema_catalog: &mut TransactionSchemaCatalog,
91
- staged_writes: &StagedWriteSet,
92
- version_id: &str,
93
- ) -> Result<(), LixError> {
94
- for row in &staged_writes.state_rows {
95
- if row.schema_scope_version_id() == version_id && row.schema_key == REGISTERED_SCHEMA_KEY {
96
- remember_pending_registered_schema(row.snapshot_content.as_deref(), schema_catalog)?;
108
+ let domain = domain.schema_catalog_domain();
109
+ match self
110
+ .catalogs_by_domain
111
+ .get(&domain)
112
+ .expect("catalog cache should contain requested version")
113
+ {
114
+ CatalogEntry::Catalog(catalog) => Ok(catalog),
115
+ CatalogEntry::SchemaFacts(_) => {
116
+ unreachable!("schema catalog should be materialized before validation access")
117
+ }
97
118
  }
98
119
  }
99
- for row in &staged_writes.adopted_rows {
100
- if row.schema_scope_version_id() == version_id && row.schema_key == REGISTERED_SCHEMA_KEY {
101
- remember_pending_registered_schema(row.snapshot_content.as_deref(), schema_catalog)?;
102
- }
120
+
121
+ pub(crate) fn remember_schema_facts(&mut self, domain: &Domain, facts: Vec<SchemaCatalogFact>) {
122
+ self.catalogs_by_domain.insert(
123
+ domain.schema_catalog_domain(),
124
+ CatalogEntry::SchemaFacts(facts),
125
+ );
103
126
  }
104
- Ok(())
105
127
  }
106
128
 
107
129
  struct TransactionSchemaLiveStateReader<'a> {
108
130
  base: &'a dyn LiveStateReader,
109
- staged: StagedStateRowOverlay,
131
+ staged: &'a PreparedStateRowOverlay,
110
132
  }
111
133
 
112
134
  #[async_trait]
@@ -114,14 +136,14 @@ impl LiveStateReader for TransactionSchemaLiveStateReader<'_> {
114
136
  async fn scan_rows(
115
137
  &self,
116
138
  request: &LiveStateScanRequest,
117
- ) -> Result<Vec<LiveStateRow>, LixError> {
118
- overlay_scan_rows(self.base, &self.staged, request).await
139
+ ) -> Result<Vec<MaterializedLiveStateRow>, LixError> {
140
+ overlay_scan_rows(self.base, self.staged, request).await
119
141
  }
120
142
 
121
143
  async fn load_row(
122
144
  &self,
123
145
  request: &LiveStateRowRequest,
124
- ) -> Result<Option<LiveStateRow>, LixError> {
146
+ ) -> Result<Option<MaterializedLiveStateRow>, LixError> {
125
147
  self.base.load_row(request).await
126
148
  }
127
149
  }