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

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 (196) hide show
  1. package/README.md +9 -0
  2. package/SKILL.md +468 -0
  3. package/dist/engine-wasm/index.d.ts +15 -11
  4. package/dist/engine-wasm/index.js +105 -38
  5. package/dist/engine-wasm/wasm/lix_engine.d.ts +14 -2
  6. package/dist/engine-wasm/wasm/lix_engine.js +18 -17
  7. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  8. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +2 -1
  9. package/dist/generated/builtin-schemas.d.ts +31 -41
  10. package/dist/generated/builtin-schemas.js +52 -56
  11. package/dist/open-lix.d.ts +141 -24
  12. package/dist/open-lix.js +199 -35
  13. package/dist/sqlite/index.js +99 -22
  14. package/dist-engine-src/README.md +18 -0
  15. package/dist-engine-src/src/backend/kv.rs +358 -0
  16. package/dist-engine-src/src/backend/mod.rs +12 -0
  17. package/dist-engine-src/src/backend/testing.rs +658 -0
  18. package/dist-engine-src/src/backend/types.rs +96 -0
  19. package/dist-engine-src/src/binary_cas/chunking.rs +31 -0
  20. package/dist-engine-src/src/binary_cas/codec.rs +346 -0
  21. package/dist-engine-src/src/binary_cas/context.rs +139 -0
  22. package/dist-engine-src/src/binary_cas/kv.rs +1063 -0
  23. package/dist-engine-src/src/binary_cas/mod.rs +11 -0
  24. package/dist-engine-src/src/binary_cas/types.rs +127 -0
  25. package/dist-engine-src/src/cel/context.rs +86 -0
  26. package/dist-engine-src/src/cel/error.rs +19 -0
  27. package/dist-engine-src/src/cel/mod.rs +8 -0
  28. package/dist-engine-src/src/cel/provider.rs +9 -0
  29. package/dist-engine-src/src/cel/runtime.rs +167 -0
  30. package/dist-engine-src/src/cel/value.rs +50 -0
  31. package/dist-engine-src/src/changelog/codec.rs +321 -0
  32. package/dist-engine-src/src/changelog/context.rs +92 -0
  33. package/dist-engine-src/src/changelog/materialization.rs +121 -0
  34. package/dist-engine-src/src/changelog/mod.rs +13 -0
  35. package/dist-engine-src/src/changelog/reader.rs +20 -0
  36. package/dist-engine-src/src/changelog/storage.rs +220 -0
  37. package/dist-engine-src/src/changelog/types.rs +38 -0
  38. package/dist-engine-src/src/commit_graph/context.rs +1588 -0
  39. package/dist-engine-src/src/commit_graph/mod.rs +12 -0
  40. package/dist-engine-src/src/commit_graph/types.rs +145 -0
  41. package/dist-engine-src/src/commit_graph/walker.rs +780 -0
  42. package/dist-engine-src/src/common/error.rs +313 -0
  43. package/dist-engine-src/src/common/fingerprint.rs +3 -0
  44. package/dist-engine-src/src/common/fs_path.rs +1336 -0
  45. package/dist-engine-src/src/common/identity.rs +135 -0
  46. package/dist-engine-src/src/common/metadata.rs +35 -0
  47. package/dist-engine-src/src/common/mod.rs +23 -0
  48. package/dist-engine-src/src/common/types.rs +105 -0
  49. package/dist-engine-src/src/common/wire.rs +222 -0
  50. package/dist-engine-src/src/engine.rs +239 -0
  51. package/dist-engine-src/src/entity_identity.rs +285 -0
  52. package/dist-engine-src/src/functions/context.rs +327 -0
  53. package/dist-engine-src/src/functions/deterministic.rs +113 -0
  54. package/dist-engine-src/src/functions/mod.rs +18 -0
  55. package/dist-engine-src/src/functions/provider.rs +130 -0
  56. package/dist-engine-src/src/functions/state.rs +363 -0
  57. package/dist-engine-src/src/functions/types.rs +37 -0
  58. package/dist-engine-src/src/init.rs +505 -0
  59. package/dist-engine-src/src/json_store/compression.rs +77 -0
  60. package/dist-engine-src/src/json_store/context.rs +129 -0
  61. package/dist-engine-src/src/json_store/encoded.rs +15 -0
  62. package/dist-engine-src/src/json_store/mod.rs +9 -0
  63. package/dist-engine-src/src/json_store/store.rs +236 -0
  64. package/dist-engine-src/src/json_store/types.rs +52 -0
  65. package/dist-engine-src/src/lib.rs +61 -0
  66. package/dist-engine-src/src/live_state/context.rs +2241 -0
  67. package/dist-engine-src/src/live_state/mod.rs +15 -0
  68. package/dist-engine-src/src/live_state/overlay.rs +75 -0
  69. package/dist-engine-src/src/live_state/reader.rs +23 -0
  70. package/dist-engine-src/src/live_state/types.rs +239 -0
  71. package/dist-engine-src/src/live_state/visibility.rs +218 -0
  72. package/dist-engine-src/src/plugin/archive.rs +441 -0
  73. package/dist-engine-src/src/plugin/component.rs +183 -0
  74. package/dist-engine-src/src/plugin/install.rs +637 -0
  75. package/dist-engine-src/src/plugin/manifest.rs +516 -0
  76. package/dist-engine-src/src/plugin/materializer.rs +477 -0
  77. package/dist-engine-src/src/plugin/mod.rs +33 -0
  78. package/dist-engine-src/src/plugin/plugin_manifest.json +119 -0
  79. package/dist-engine-src/src/plugin/storage.rs +74 -0
  80. package/dist-engine-src/src/schema/annotations/defaults.rs +280 -0
  81. package/dist-engine-src/src/schema/annotations/mod.rs +1 -0
  82. package/dist-engine-src/src/schema/builtin/lix_account.json +22 -0
  83. package/dist-engine-src/src/schema/builtin/lix_active_account.json +30 -0
  84. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +30 -0
  85. package/dist-engine-src/src/schema/builtin/lix_change.json +62 -0
  86. package/dist-engine-src/src/schema/builtin/lix_change_author.json +46 -0
  87. package/dist-engine-src/src/schema/builtin/lix_change_set.json +18 -0
  88. package/dist-engine-src/src/schema/builtin/lix_change_set_element.json +75 -0
  89. package/dist-engine-src/src/schema/builtin/lix_commit.json +62 -0
  90. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +46 -0
  91. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +53 -0
  92. package/dist-engine-src/src/schema/builtin/lix_entity_label.json +63 -0
  93. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +53 -0
  94. package/dist-engine-src/src/schema/builtin/lix_key_value.json +41 -0
  95. package/dist-engine-src/src/schema/builtin/lix_label.json +22 -0
  96. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +31 -0
  97. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +35 -0
  98. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +49 -0
  99. package/dist-engine-src/src/schema/builtin/mod.rs +271 -0
  100. package/dist-engine-src/src/schema/definition.json +157 -0
  101. package/dist-engine-src/src/schema/definition.rs +636 -0
  102. package/dist-engine-src/src/schema/key.rs +206 -0
  103. package/dist-engine-src/src/schema/mod.rs +20 -0
  104. package/dist-engine-src/src/schema/seed.rs +14 -0
  105. package/dist-engine-src/src/schema/tests.rs +739 -0
  106. package/dist-engine-src/src/schema_registry.rs +294 -0
  107. package/dist-engine-src/src/session/context.rs +366 -0
  108. package/dist-engine-src/src/session/create_version.rs +80 -0
  109. package/dist-engine-src/src/session/execute.rs +447 -0
  110. package/dist-engine-src/src/session/merge/analysis.rs +102 -0
  111. package/dist-engine-src/src/session/merge/apply.rs +23 -0
  112. package/dist-engine-src/src/session/merge/conflicts.rs +62 -0
  113. package/dist-engine-src/src/session/merge/mod.rs +11 -0
  114. package/dist-engine-src/src/session/merge/stats.rs +65 -0
  115. package/dist-engine-src/src/session/merge/version.rs +437 -0
  116. package/dist-engine-src/src/session/mod.rs +25 -0
  117. package/dist-engine-src/src/session/switch_version.rs +121 -0
  118. package/dist-engine-src/src/sql2/change_provider.rs +337 -0
  119. package/dist-engine-src/src/sql2/classify.rs +147 -0
  120. package/dist-engine-src/src/sql2/commit_derived_provider.rs +591 -0
  121. package/dist-engine-src/src/sql2/context.rs +307 -0
  122. package/dist-engine-src/src/sql2/directory_history_provider.rs +623 -0
  123. package/dist-engine-src/src/sql2/directory_provider.rs +2405 -0
  124. package/dist-engine-src/src/sql2/dml.rs +148 -0
  125. package/dist-engine-src/src/sql2/entity_history_provider.rs +444 -0
  126. package/dist-engine-src/src/sql2/entity_provider.rs +2700 -0
  127. package/dist-engine-src/src/sql2/error.rs +196 -0
  128. package/dist-engine-src/src/sql2/execute.rs +3379 -0
  129. package/dist-engine-src/src/sql2/file_history_provider.rs +902 -0
  130. package/dist-engine-src/src/sql2/file_provider.rs +3254 -0
  131. package/dist-engine-src/src/sql2/filesystem_planner.rs +1526 -0
  132. package/dist-engine-src/src/sql2/filesystem_predicates.rs +159 -0
  133. package/dist-engine-src/src/sql2/filesystem_visibility.rs +369 -0
  134. package/dist-engine-src/src/sql2/history_projection.rs +80 -0
  135. package/dist-engine-src/src/sql2/history_provider.rs +418 -0
  136. package/dist-engine-src/src/sql2/history_route.rs +643 -0
  137. package/dist-engine-src/src/sql2/lix_state_provider.rs +2430 -0
  138. package/dist-engine-src/src/sql2/mod.rs +43 -0
  139. package/dist-engine-src/src/sql2/read_only.rs +65 -0
  140. package/dist-engine-src/src/sql2/record_batch.rs +17 -0
  141. package/dist-engine-src/src/sql2/result_metadata.rs +29 -0
  142. package/dist-engine-src/src/sql2/runtime.rs +60 -0
  143. package/dist-engine-src/src/sql2/session.rs +135 -0
  144. package/dist-engine-src/src/sql2/udfs/common.rs +295 -0
  145. package/dist-engine-src/src/sql2/udfs/lix_active_version_commit_id.rs +53 -0
  146. package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +47 -0
  147. package/dist-engine-src/src/sql2/udfs/lix_json.rs +100 -0
  148. package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +99 -0
  149. package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +99 -0
  150. package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +82 -0
  151. package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +85 -0
  152. package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +76 -0
  153. package/dist-engine-src/src/sql2/udfs/mod.rs +82 -0
  154. package/dist-engine-src/src/sql2/version_provider.rs +1187 -0
  155. package/dist-engine-src/src/sql2/version_scope.rs +394 -0
  156. package/dist-engine-src/src/sql2/write_normalization.rs +345 -0
  157. package/dist-engine-src/src/storage/context.rs +356 -0
  158. package/dist-engine-src/src/storage/mod.rs +14 -0
  159. package/dist-engine-src/src/storage/read_scope.rs +88 -0
  160. package/dist-engine-src/src/storage/types.rs +501 -0
  161. package/dist-engine-src/src/storage_bench.rs +3406 -0
  162. package/dist-engine-src/src/test_support.rs +81 -0
  163. package/dist-engine-src/src/tracked_state/by_file_index.rs +102 -0
  164. package/dist-engine-src/src/tracked_state/codec.rs +747 -0
  165. package/dist-engine-src/src/tracked_state/context.rs +983 -0
  166. package/dist-engine-src/src/tracked_state/diff.rs +494 -0
  167. package/dist-engine-src/src/tracked_state/materialization.rs +141 -0
  168. package/dist-engine-src/src/tracked_state/merge.rs +474 -0
  169. package/dist-engine-src/src/tracked_state/mod.rs +31 -0
  170. package/dist-engine-src/src/tracked_state/rebuild.rs +771 -0
  171. package/dist-engine-src/src/tracked_state/storage.rs +243 -0
  172. package/dist-engine-src/src/tracked_state/tree.rs +2744 -0
  173. package/dist-engine-src/src/tracked_state/tree_types.rs +176 -0
  174. package/dist-engine-src/src/tracked_state/types.rs +61 -0
  175. package/dist-engine-src/src/transaction/commit.rs +1224 -0
  176. package/dist-engine-src/src/transaction/context.rs +1307 -0
  177. package/dist-engine-src/src/transaction/live_state_overlay.rs +34 -0
  178. package/dist-engine-src/src/transaction/mod.rs +11 -0
  179. package/dist-engine-src/src/transaction/normalization.rs +1026 -0
  180. package/dist-engine-src/src/transaction/schema_resolver.rs +127 -0
  181. package/dist-engine-src/src/transaction/staging.rs +1436 -0
  182. package/dist-engine-src/src/transaction/types.rs +351 -0
  183. package/dist-engine-src/src/transaction/validation.rs +4811 -0
  184. package/dist-engine-src/src/untracked_state/codec.rs +363 -0
  185. package/dist-engine-src/src/untracked_state/context.rs +82 -0
  186. package/dist-engine-src/src/untracked_state/materialization.rs +157 -0
  187. package/dist-engine-src/src/untracked_state/mod.rs +17 -0
  188. package/dist-engine-src/src/untracked_state/storage.rs +348 -0
  189. package/dist-engine-src/src/untracked_state/types.rs +96 -0
  190. package/dist-engine-src/src/version/context.rs +52 -0
  191. package/dist-engine-src/src/version/mod.rs +12 -0
  192. package/dist-engine-src/src/version/refs.rs +421 -0
  193. package/dist-engine-src/src/version/stage_rows.rs +71 -0
  194. package/dist-engine-src/src/version/types.rs +21 -0
  195. package/dist-engine-src/src/wasm/mod.rs +60 -0
  196. package/package.json +68 -63
@@ -0,0 +1,243 @@
1
+ use std::collections::HashMap;
2
+
3
+ use crate::storage::{KvGetGroup, KvGetRequest, StorageReader, StorageWriteSet};
4
+ use crate::tracked_state::codec::PendingChunkWrite;
5
+ use crate::tracked_state::tree_types::{TrackedStateRootId, TRACKED_STATE_HASH_BYTES};
6
+ use crate::LixError;
7
+
8
+ pub(crate) const TRACKED_STATE_CHUNK_NAMESPACE: &'static str = "tracked_state.tree.chunk";
9
+ pub(crate) const TRACKED_STATE_ROOT_NAMESPACE: &'static str = "tracked_state.tree.root";
10
+ pub(crate) const TRACKED_STATE_BY_FILE_ROOT_NAMESPACE: &'static str =
11
+ "tracked_state.tree.root.by_file";
12
+
13
+ async fn get_one(
14
+ store: &mut (impl StorageReader + ?Sized),
15
+ namespace: &str,
16
+ key: Vec<u8>,
17
+ ) -> Result<Option<Vec<u8>>, LixError> {
18
+ Ok(store
19
+ .get_values(KvGetRequest {
20
+ groups: vec![KvGetGroup {
21
+ namespace: namespace.to_string(),
22
+ keys: vec![key],
23
+ }],
24
+ })
25
+ .await?
26
+ .groups
27
+ .into_iter()
28
+ .next()
29
+ .and_then(|group| group.single_value_owned()))
30
+ }
31
+
32
+ pub(crate) async fn load_root(
33
+ store: &mut (impl StorageReader + ?Sized),
34
+ commit_id: &str,
35
+ ) -> Result<Option<TrackedStateRootId>, LixError> {
36
+ let Some(bytes) = get_one(
37
+ store,
38
+ TRACKED_STATE_ROOT_NAMESPACE,
39
+ commit_id.as_bytes().to_vec(),
40
+ )
41
+ .await?
42
+ else {
43
+ return Ok(None);
44
+ };
45
+ TrackedStateRootId::from_slice(&bytes).map(Some)
46
+ }
47
+
48
+ pub(crate) fn stage_root(
49
+ writes: &mut StorageWriteSet,
50
+ commit_id: &str,
51
+ root_id: &TrackedStateRootId,
52
+ ) {
53
+ writes.put(
54
+ TRACKED_STATE_ROOT_NAMESPACE,
55
+ commit_id.as_bytes().to_vec(),
56
+ root_id.as_bytes().to_vec(),
57
+ );
58
+ }
59
+
60
+ pub(crate) async fn load_by_file_root(
61
+ store: &mut (impl StorageReader + ?Sized),
62
+ commit_id: &str,
63
+ ) -> Result<Option<TrackedStateRootId>, LixError> {
64
+ let Some(bytes) = get_one(
65
+ store,
66
+ TRACKED_STATE_BY_FILE_ROOT_NAMESPACE,
67
+ commit_id.as_bytes().to_vec(),
68
+ )
69
+ .await?
70
+ else {
71
+ return Ok(None);
72
+ };
73
+ TrackedStateRootId::from_slice(&bytes).map(Some)
74
+ }
75
+
76
+ pub(crate) fn stage_by_file_root(
77
+ writes: &mut StorageWriteSet,
78
+ commit_id: &str,
79
+ root_id: &TrackedStateRootId,
80
+ ) {
81
+ writes.put(
82
+ TRACKED_STATE_BY_FILE_ROOT_NAMESPACE,
83
+ commit_id.as_bytes().to_vec(),
84
+ root_id.as_bytes().to_vec(),
85
+ );
86
+ }
87
+
88
+ #[cfg(test)]
89
+ pub(crate) fn stage_delete_root(writes: &mut StorageWriteSet, commit_id: &str) {
90
+ writes.delete(TRACKED_STATE_ROOT_NAMESPACE, commit_id.as_bytes().to_vec());
91
+ writes.delete(
92
+ TRACKED_STATE_BY_FILE_ROOT_NAMESPACE,
93
+ commit_id.as_bytes().to_vec(),
94
+ );
95
+ }
96
+
97
+ pub(crate) async fn read_chunk(
98
+ store: &mut (impl StorageReader + ?Sized),
99
+ hash: &[u8; TRACKED_STATE_HASH_BYTES],
100
+ ) -> Result<Option<Vec<u8>>, LixError> {
101
+ get_one(store, TRACKED_STATE_CHUNK_NAMESPACE, hash.to_vec()).await
102
+ }
103
+
104
+ pub(crate) fn verify_chunk_hash(
105
+ expected: &[u8; TRACKED_STATE_HASH_BYTES],
106
+ bytes: &[u8],
107
+ ) -> Result<(), LixError> {
108
+ let actual = crate::tracked_state::codec::hash_bytes(bytes);
109
+ if &actual != expected {
110
+ return Err(LixError::new(
111
+ "LIX_ERROR_UNKNOWN",
112
+ "tracked-state chunk hash mismatch",
113
+ ));
114
+ }
115
+ Ok(())
116
+ }
117
+
118
+ pub(crate) fn stage_chunks(writes: &mut StorageWriteSet, chunks: &[PendingChunkWrite]) {
119
+ for chunk in chunks {
120
+ writes.put(
121
+ TRACKED_STATE_CHUNK_NAMESPACE,
122
+ chunk.hash.to_vec(),
123
+ chunk.data.clone(),
124
+ );
125
+ }
126
+ }
127
+
128
+ #[allow(dead_code)]
129
+ #[derive(Debug, Default)]
130
+ pub(crate) struct TrackedStateChunkOverlay {
131
+ chunks: HashMap<[u8; TRACKED_STATE_HASH_BYTES], Vec<u8>>,
132
+ }
133
+
134
+ impl TrackedStateChunkOverlay {
135
+ pub(crate) fn new() -> Self {
136
+ Self::default()
137
+ }
138
+
139
+ pub(crate) async fn read_chunk(
140
+ &self,
141
+ store: &mut (impl StorageReader + ?Sized),
142
+ hash: &[u8; TRACKED_STATE_HASH_BYTES],
143
+ ) -> Result<Option<Vec<u8>>, LixError> {
144
+ if let Some(bytes) = self.chunks.get(hash) {
145
+ return Ok(Some(bytes.clone()));
146
+ }
147
+ read_chunk(store, hash).await
148
+ }
149
+
150
+ pub(crate) fn stage_chunks(
151
+ &mut self,
152
+ writes: &mut StorageWriteSet,
153
+ chunks: &[PendingChunkWrite],
154
+ ) {
155
+ for chunk in chunks {
156
+ self.chunks.insert(chunk.hash, chunk.data.clone());
157
+ }
158
+ stage_chunks(writes, chunks);
159
+ }
160
+ }
161
+
162
+ #[cfg(test)]
163
+ mod tests {
164
+ use std::fs;
165
+ use std::path::{Path, PathBuf};
166
+
167
+ #[test]
168
+ fn production_tracked_state_sources_do_not_call_storage_batch_writer() {
169
+ let tracked_state_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("src/tracked_state");
170
+ let forbidden = ["write", "kv", "batch"].join("_");
171
+
172
+ for path in rust_sources(&tracked_state_dir) {
173
+ let source =
174
+ fs::read_to_string(&path).expect("tracked_state source should be readable");
175
+ for (line_number, line) in production_lines(&source) {
176
+ assert!(
177
+ !line.contains(&forbidden),
178
+ "production tracked_state source must stage into StorageWriteSet instead of calling {forbidden}: {}:{}",
179
+ path.display(),
180
+ line_number
181
+ );
182
+ }
183
+ }
184
+ }
185
+
186
+ fn rust_sources(dir: &Path) -> Vec<PathBuf> {
187
+ let mut sources = Vec::new();
188
+ for entry in fs::read_dir(dir).expect("tracked_state source dir should be readable") {
189
+ let path = entry
190
+ .expect("tracked_state source entry should be readable")
191
+ .path();
192
+ if path.is_dir() {
193
+ sources.extend(rust_sources(&path));
194
+ } else if path.extension().and_then(|extension| extension.to_str()) == Some("rs") {
195
+ sources.push(path);
196
+ }
197
+ }
198
+ sources
199
+ }
200
+
201
+ fn production_lines(source: &str) -> Vec<(usize, &str)> {
202
+ let mut lines = Vec::new();
203
+ let mut skipping_cfg_test_item = false;
204
+ let mut pending_cfg_test = false;
205
+ let mut item_started = false;
206
+ let mut brace_depth = 0i32;
207
+
208
+ for (index, line) in source.lines().enumerate() {
209
+ let trimmed = line.trim();
210
+ if trimmed == "#[cfg(test)]" {
211
+ pending_cfg_test = true;
212
+ continue;
213
+ }
214
+
215
+ if pending_cfg_test || skipping_cfg_test_item {
216
+ if pending_cfg_test && !item_started && trimmed.ends_with(';') {
217
+ pending_cfg_test = false;
218
+ continue;
219
+ }
220
+ let opens = line.matches('{').count() as i32;
221
+ let closes = line.matches('}').count() as i32;
222
+ if opens > 0 {
223
+ item_started = true;
224
+ skipping_cfg_test_item = true;
225
+ }
226
+ if item_started {
227
+ brace_depth += opens - closes;
228
+ if brace_depth <= 0 {
229
+ pending_cfg_test = false;
230
+ skipping_cfg_test_item = false;
231
+ item_started = false;
232
+ brace_depth = 0;
233
+ }
234
+ }
235
+ continue;
236
+ }
237
+
238
+ lines.push((index + 1, line));
239
+ }
240
+
241
+ lines
242
+ }
243
+ }