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