@lix-js/sdk 0.6.0-preview.1 → 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 (205) hide show
  1. package/SKILL.md +304 -320
  2. package/dist/engine-wasm/wasm/lix_engine.d.ts +5 -0
  3. package/dist/engine-wasm/wasm/lix_engine.js +9 -13
  4. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  5. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +1 -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 +103 -14
  9. package/dist/open-lix.js +3 -0
  10. package/dist/sqlite/index.js +99 -22
  11. package/dist-engine-src/README.md +18 -0
  12. package/dist-engine-src/src/backend/kv.rs +358 -0
  13. package/dist-engine-src/src/backend/mod.rs +12 -0
  14. package/dist-engine-src/src/backend/testing.rs +658 -0
  15. package/dist-engine-src/src/backend/types.rs +96 -0
  16. package/dist-engine-src/src/binary_cas/chunking.rs +31 -0
  17. package/dist-engine-src/src/binary_cas/codec.rs +346 -0
  18. package/dist-engine-src/src/binary_cas/context.rs +139 -0
  19. package/dist-engine-src/src/binary_cas/kv.rs +1063 -0
  20. package/dist-engine-src/src/binary_cas/mod.rs +11 -0
  21. package/dist-engine-src/src/binary_cas/types.rs +121 -0
  22. package/dist-engine-src/src/catalog/context.rs +412 -0
  23. package/dist-engine-src/src/catalog/mod.rs +10 -0
  24. package/dist-engine-src/src/catalog/schema.rs +4 -0
  25. package/dist-engine-src/src/catalog/snapshot.rs +1114 -0
  26. package/dist-engine-src/src/cel/context.rs +86 -0
  27. package/dist-engine-src/src/cel/error.rs +19 -0
  28. package/dist-engine-src/src/cel/mod.rs +8 -0
  29. package/dist-engine-src/src/cel/provider.rs +9 -0
  30. package/dist-engine-src/src/cel/runtime.rs +167 -0
  31. package/dist-engine-src/src/cel/value.rs +50 -0
  32. package/dist-engine-src/src/commit_graph/context.rs +901 -0
  33. package/dist-engine-src/src/commit_graph/mod.rs +11 -0
  34. package/dist-engine-src/src/commit_graph/types.rs +109 -0
  35. package/dist-engine-src/src/commit_graph/walker.rs +756 -0
  36. package/dist-engine-src/src/commit_store/codec.rs +887 -0
  37. package/dist-engine-src/src/commit_store/context.rs +944 -0
  38. package/dist-engine-src/src/commit_store/materialization.rs +84 -0
  39. package/dist-engine-src/src/commit_store/mod.rs +16 -0
  40. package/dist-engine-src/src/commit_store/storage.rs +600 -0
  41. package/dist-engine-src/src/commit_store/types.rs +215 -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 +145 -0
  46. package/dist-engine-src/src/common/json_pointer.rs +67 -0
  47. package/dist-engine-src/src/common/metadata.rs +40 -0
  48. package/dist-engine-src/src/common/mod.rs +23 -0
  49. package/dist-engine-src/src/common/types.rs +105 -0
  50. package/dist-engine-src/src/common/wire.rs +222 -0
  51. package/dist-engine-src/src/domain.rs +324 -0
  52. package/dist-engine-src/src/engine.rs +225 -0
  53. package/dist-engine-src/src/entity_identity.rs +405 -0
  54. package/dist-engine-src/src/functions/context.rs +292 -0
  55. package/dist-engine-src/src/functions/deterministic.rs +113 -0
  56. package/dist-engine-src/src/functions/mod.rs +18 -0
  57. package/dist-engine-src/src/functions/provider.rs +130 -0
  58. package/dist-engine-src/src/functions/state.rs +336 -0
  59. package/dist-engine-src/src/functions/types.rs +37 -0
  60. package/dist-engine-src/src/init.rs +558 -0
  61. package/dist-engine-src/src/json_store/compression.rs +77 -0
  62. package/dist-engine-src/src/json_store/context.rs +423 -0
  63. package/dist-engine-src/src/json_store/encoded.rs +15 -0
  64. package/dist-engine-src/src/json_store/mod.rs +12 -0
  65. package/dist-engine-src/src/json_store/store.rs +1109 -0
  66. package/dist-engine-src/src/json_store/types.rs +217 -0
  67. package/dist-engine-src/src/lib.rs +62 -0
  68. package/dist-engine-src/src/live_state/context.rs +2019 -0
  69. package/dist-engine-src/src/live_state/mod.rs +15 -0
  70. package/dist-engine-src/src/live_state/overlay.rs +75 -0
  71. package/dist-engine-src/src/live_state/reader.rs +23 -0
  72. package/dist-engine-src/src/live_state/types.rs +222 -0
  73. package/dist-engine-src/src/live_state/visibility.rs +223 -0
  74. package/dist-engine-src/src/plugin/archive.rs +438 -0
  75. package/dist-engine-src/src/plugin/component.rs +183 -0
  76. package/dist-engine-src/src/plugin/install.rs +619 -0
  77. package/dist-engine-src/src/plugin/manifest.rs +516 -0
  78. package/dist-engine-src/src/plugin/materializer.rs +477 -0
  79. package/dist-engine-src/src/plugin/mod.rs +33 -0
  80. package/dist-engine-src/src/plugin/plugin_manifest.json +118 -0
  81. package/dist-engine-src/src/plugin/storage.rs +74 -0
  82. package/dist-engine-src/src/schema/annotations/defaults.rs +275 -0
  83. package/dist-engine-src/src/schema/annotations/mod.rs +1 -0
  84. package/dist-engine-src/src/schema/builtin/lix_account.json +21 -0
  85. package/dist-engine-src/src/schema/builtin/lix_active_account.json +29 -0
  86. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +29 -0
  87. package/dist-engine-src/src/schema/builtin/lix_change.json +63 -0
  88. package/dist-engine-src/src/schema/builtin/lix_change_author.json +45 -0
  89. package/dist-engine-src/src/schema/builtin/lix_commit.json +24 -0
  90. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +53 -0
  91. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +52 -0
  92. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +52 -0
  93. package/dist-engine-src/src/schema/builtin/lix_key_value.json +40 -0
  94. package/dist-engine-src/src/schema/builtin/lix_label.json +29 -0
  95. package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +74 -0
  96. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +25 -0
  97. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +34 -0
  98. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +48 -0
  99. package/dist-engine-src/src/schema/builtin/mod.rs +222 -0
  100. package/dist-engine-src/src/schema/compatibility.rs +787 -0
  101. package/dist-engine-src/src/schema/definition.json +187 -0
  102. package/dist-engine-src/src/schema/definition.rs +742 -0
  103. package/dist-engine-src/src/schema/key.rs +138 -0
  104. package/dist-engine-src/src/schema/mod.rs +20 -0
  105. package/dist-engine-src/src/schema/seed.rs +14 -0
  106. package/dist-engine-src/src/schema/tests.rs +780 -0
  107. package/dist-engine-src/src/session/context.rs +364 -0
  108. package/dist-engine-src/src/session/create_version.rs +88 -0
  109. package/dist-engine-src/src/session/execute.rs +478 -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 +63 -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 +427 -0
  116. package/dist-engine-src/src/session/mod.rs +27 -0
  117. package/dist-engine-src/src/session/optimization9_sql2_bench.rs +100 -0
  118. package/dist-engine-src/src/session/switch_version.rs +109 -0
  119. package/dist-engine-src/src/sql2/change_provider.rs +331 -0
  120. package/dist-engine-src/src/sql2/classify.rs +182 -0
  121. package/dist-engine-src/src/sql2/context.rs +311 -0
  122. package/dist-engine-src/src/sql2/directory_history_provider.rs +631 -0
  123. package/dist-engine-src/src/sql2/directory_provider.rs +2453 -0
  124. package/dist-engine-src/src/sql2/dml.rs +148 -0
  125. package/dist-engine-src/src/sql2/entity_history_provider.rs +440 -0
  126. package/dist-engine-src/src/sql2/entity_provider.rs +3211 -0
  127. package/dist-engine-src/src/sql2/error.rs +216 -0
  128. package/dist-engine-src/src/sql2/execute.rs +3440 -0
  129. package/dist-engine-src/src/sql2/file_history_provider.rs +910 -0
  130. package/dist-engine-src/src/sql2/file_provider.rs +3679 -0
  131. package/dist-engine-src/src/sql2/filesystem_planner.rs +1490 -0
  132. package/dist-engine-src/src/sql2/filesystem_predicates.rs +159 -0
  133. package/dist-engine-src/src/sql2/filesystem_visibility.rs +383 -0
  134. package/dist-engine-src/src/sql2/history_projection.rs +56 -0
  135. package/dist-engine-src/src/sql2/history_provider.rs +412 -0
  136. package/dist-engine-src/src/sql2/history_route.rs +657 -0
  137. package/dist-engine-src/src/sql2/lix_state_provider.rs +2512 -0
  138. package/dist-engine-src/src/sql2/mod.rs +46 -0
  139. package/dist-engine-src/src/sql2/predicate_typecheck.rs +246 -0
  140. package/dist-engine-src/src/sql2/public_bind/assignment.rs +46 -0
  141. package/dist-engine-src/src/sql2/public_bind/capability.rs +41 -0
  142. package/dist-engine-src/src/sql2/public_bind/dml.rs +166 -0
  143. package/dist-engine-src/src/sql2/public_bind/mod.rs +25 -0
  144. package/dist-engine-src/src/sql2/public_bind/table.rs +168 -0
  145. package/dist-engine-src/src/sql2/read_only.rs +63 -0
  146. package/dist-engine-src/src/sql2/record_batch.rs +17 -0
  147. package/dist-engine-src/src/sql2/result_metadata.rs +29 -0
  148. package/dist-engine-src/src/sql2/runtime.rs +60 -0
  149. package/dist-engine-src/src/sql2/session.rs +132 -0
  150. package/dist-engine-src/src/sql2/udfs/common.rs +295 -0
  151. package/dist-engine-src/src/sql2/udfs/lix_active_version_commit_id.rs +53 -0
  152. package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +47 -0
  153. package/dist-engine-src/src/sql2/udfs/lix_json.rs +100 -0
  154. package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +99 -0
  155. package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +99 -0
  156. package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +82 -0
  157. package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +85 -0
  158. package/dist-engine-src/src/sql2/udfs/lix_timestamp.rs +76 -0
  159. package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +76 -0
  160. package/dist-engine-src/src/sql2/udfs/mod.rs +89 -0
  161. package/dist-engine-src/src/sql2/udfs/public_call.rs +211 -0
  162. package/dist-engine-src/src/sql2/version_provider.rs +1202 -0
  163. package/dist-engine-src/src/sql2/version_scope.rs +394 -0
  164. package/dist-engine-src/src/sql2/write_normalization.rs +345 -0
  165. package/dist-engine-src/src/storage/context.rs +356 -0
  166. package/dist-engine-src/src/storage/mod.rs +14 -0
  167. package/dist-engine-src/src/storage/read_scope.rs +88 -0
  168. package/dist-engine-src/src/storage/types.rs +501 -0
  169. package/dist-engine-src/src/storage_bench.rs +4863 -0
  170. package/dist-engine-src/src/test_support.rs +228 -0
  171. package/dist-engine-src/src/tracked_state/by_file_index.rs +98 -0
  172. package/dist-engine-src/src/tracked_state/codec.rs +2085 -0
  173. package/dist-engine-src/src/tracked_state/context.rs +1867 -0
  174. package/dist-engine-src/src/tracked_state/diff.rs +686 -0
  175. package/dist-engine-src/src/tracked_state/materialization.rs +403 -0
  176. package/dist-engine-src/src/tracked_state/materializer.rs +488 -0
  177. package/dist-engine-src/src/tracked_state/merge.rs +492 -0
  178. package/dist-engine-src/src/tracked_state/mod.rs +32 -0
  179. package/dist-engine-src/src/tracked_state/storage.rs +375 -0
  180. package/dist-engine-src/src/tracked_state/tree.rs +3187 -0
  181. package/dist-engine-src/src/tracked_state/types.rs +231 -0
  182. package/dist-engine-src/src/transaction/commit.rs +1484 -0
  183. package/dist-engine-src/src/transaction/context.rs +1548 -0
  184. package/dist-engine-src/src/transaction/live_state_overlay.rs +35 -0
  185. package/dist-engine-src/src/transaction/mod.rs +13 -0
  186. package/dist-engine-src/src/transaction/normalization.rs +890 -0
  187. package/dist-engine-src/src/transaction/prep.rs +37 -0
  188. package/dist-engine-src/src/transaction/schema_resolver.rs +149 -0
  189. package/dist-engine-src/src/transaction/staging.rs +1731 -0
  190. package/dist-engine-src/src/transaction/types.rs +460 -0
  191. package/dist-engine-src/src/transaction/validation.rs +5830 -0
  192. package/dist-engine-src/src/untracked_state/codec.rs +307 -0
  193. package/dist-engine-src/src/untracked_state/context.rs +98 -0
  194. package/dist-engine-src/src/untracked_state/materialization.rs +63 -0
  195. package/dist-engine-src/src/untracked_state/mod.rs +15 -0
  196. package/dist-engine-src/src/untracked_state/storage.rs +396 -0
  197. package/dist-engine-src/src/untracked_state/types.rs +146 -0
  198. package/dist-engine-src/src/version/context.rs +40 -0
  199. package/dist-engine-src/src/version/lifecycle.rs +221 -0
  200. package/dist-engine-src/src/version/mod.rs +13 -0
  201. package/dist-engine-src/src/version/refs.rs +330 -0
  202. package/dist-engine-src/src/version/stage_rows.rs +67 -0
  203. package/dist-engine-src/src/version/types.rs +21 -0
  204. package/dist-engine-src/src/wasm/mod.rs +60 -0
  205. package/package.json +68 -64
@@ -0,0 +1,275 @@
1
+ use serde_json::{Map as JsonMap, Value as JsonValue};
2
+
3
+ use crate::cel::{CelEvaluator, CelFunctionProvider};
4
+ use crate::LixError;
5
+
6
+ pub(crate) fn apply_schema_defaults<P>(
7
+ snapshot: &mut JsonMap<String, JsonValue>,
8
+ schema: &JsonValue,
9
+ evaluator: &CelEvaluator,
10
+ functions: P,
11
+ schema_key: &str,
12
+ ) -> Result<bool, LixError>
13
+ where
14
+ P: CelFunctionProvider,
15
+ {
16
+ apply_schema_defaults_with_context(
17
+ snapshot,
18
+ schema,
19
+ &snapshot.clone(),
20
+ evaluator,
21
+ functions,
22
+ schema_key,
23
+ )
24
+ }
25
+
26
+ pub(crate) fn apply_schema_defaults_with_shared_runtime<P>(
27
+ snapshot: &mut JsonMap<String, JsonValue>,
28
+ schema: &JsonValue,
29
+ functions: P,
30
+ schema_key: &str,
31
+ ) -> Result<bool, LixError>
32
+ where
33
+ P: CelFunctionProvider,
34
+ {
35
+ apply_schema_defaults(
36
+ snapshot,
37
+ schema,
38
+ crate::cel::shared_runtime(),
39
+ functions,
40
+ schema_key,
41
+ )
42
+ }
43
+
44
+ pub(crate) fn apply_schema_defaults_with_context<P>(
45
+ snapshot: &mut JsonMap<String, JsonValue>,
46
+ schema: &JsonValue,
47
+ context: &JsonMap<String, JsonValue>,
48
+ evaluator: &CelEvaluator,
49
+ functions: P,
50
+ schema_key: &str,
51
+ ) -> Result<bool, LixError>
52
+ where
53
+ P: CelFunctionProvider,
54
+ {
55
+ let Some(properties) = schema.get("properties").and_then(|value| value.as_object()) else {
56
+ return Ok(false);
57
+ };
58
+ let mut ordered_properties: Vec<(&String, &JsonValue)> = properties.iter().collect();
59
+ ordered_properties.sort_by(|(left_name, _), (right_name, _)| left_name.cmp(right_name));
60
+
61
+ let mut changed = false;
62
+ for (field_name, field_schema) in ordered_properties {
63
+ if snapshot.contains_key(field_name) {
64
+ continue;
65
+ }
66
+
67
+ if let Some(expression) = field_schema
68
+ .get("x-lix-default")
69
+ .and_then(|value| value.as_str())
70
+ {
71
+ let value = evaluator
72
+ .evaluate_with_functions(expression, context, functions.clone())
73
+ .map_err(|err| LixError {
74
+ code: "LIX_ERROR_UNKNOWN".to_string(),
75
+ message: format!(
76
+ "failed to evaluate x-lix-default for '{}.{}': {}",
77
+ schema_key, field_name, err.message
78
+ ),
79
+ hint: None,
80
+ details: None,
81
+ })?;
82
+ snapshot.insert(field_name.clone(), value);
83
+ changed = true;
84
+ continue;
85
+ }
86
+
87
+ if let Some(default_value) = field_schema.get("default") {
88
+ snapshot.insert(field_name.clone(), default_value.clone());
89
+ changed = true;
90
+ }
91
+ }
92
+
93
+ Ok(changed)
94
+ }
95
+
96
+ #[cfg(test)]
97
+ mod tests {
98
+ use serde_json::{json, Map as JsonMap, Value as JsonValue};
99
+
100
+ use crate::cel::{CelEvaluator, CelFunctionProvider};
101
+
102
+ use super::apply_schema_defaults_with_context;
103
+
104
+ #[test]
105
+ fn applies_x_lix_default_for_missing_fields() {
106
+ let evaluator = CelEvaluator::new();
107
+ let schema = json!({
108
+ "properties": {
109
+ "slug": {
110
+ "type": "string",
111
+ "x-lix-default": "name + '-slug'"
112
+ }
113
+ }
114
+ });
115
+ let mut snapshot = JsonMap::new();
116
+ snapshot.insert("name".to_string(), JsonValue::String("sample".to_string()));
117
+ let context = snapshot.clone();
118
+
119
+ let changed = apply_schema_defaults_with_context(
120
+ &mut snapshot,
121
+ &schema,
122
+ &context,
123
+ &evaluator,
124
+ fixed_functions(),
125
+ "test_schema",
126
+ "1",
127
+ )
128
+ .expect("apply defaults");
129
+
130
+ assert!(changed);
131
+ assert_eq!(
132
+ snapshot.get("slug"),
133
+ Some(&JsonValue::String("sample-slug".to_string()))
134
+ );
135
+ }
136
+
137
+ #[test]
138
+ fn x_lix_default_overrides_json_default() {
139
+ let evaluator = CelEvaluator::new();
140
+ let schema = json!({
141
+ "properties": {
142
+ "status": {
143
+ "type": "string",
144
+ "default": "literal",
145
+ "x-lix-default": "'computed'"
146
+ }
147
+ }
148
+ });
149
+ let mut snapshot = JsonMap::new();
150
+ let context = snapshot.clone();
151
+
152
+ let changed = apply_schema_defaults_with_context(
153
+ &mut snapshot,
154
+ &schema,
155
+ &context,
156
+ &evaluator,
157
+ fixed_functions(),
158
+ "test_schema",
159
+ "1",
160
+ )
161
+ .expect("apply defaults");
162
+
163
+ assert!(changed);
164
+ assert_eq!(
165
+ snapshot.get("status"),
166
+ Some(&JsonValue::String("computed".to_string()))
167
+ );
168
+ }
169
+
170
+ #[test]
171
+ fn does_not_default_explicit_null_values() {
172
+ let evaluator = CelEvaluator::new();
173
+ let schema = json!({
174
+ "properties": {
175
+ "status": {
176
+ "type": "string",
177
+ "x-lix-default": "'computed'"
178
+ }
179
+ }
180
+ });
181
+ let mut snapshot = JsonMap::new();
182
+ snapshot.insert("status".to_string(), JsonValue::Null);
183
+ let context = snapshot.clone();
184
+
185
+ let changed = apply_schema_defaults_with_context(
186
+ &mut snapshot,
187
+ &schema,
188
+ &context,
189
+ &evaluator,
190
+ fixed_functions(),
191
+ "test_schema",
192
+ "1",
193
+ )
194
+ .expect("apply defaults");
195
+
196
+ assert!(!changed);
197
+ assert_eq!(snapshot.get("status"), Some(&JsonValue::Null));
198
+ }
199
+
200
+ #[test]
201
+ fn applies_cel_defaults_in_stable_sorted_field_order() {
202
+ #[derive(Clone)]
203
+ struct CountingFunctions {
204
+ next: std::sync::Arc<std::sync::atomic::AtomicI64>,
205
+ }
206
+
207
+ impl CelFunctionProvider for CountingFunctions {
208
+ fn call_uuid_v7(&self) -> String {
209
+ let current = self.next.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
210
+ format!("uuid-{current}")
211
+ }
212
+
213
+ fn call_timestamp(&self) -> String {
214
+ let current = self.next.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
215
+ format!("ts-{current}")
216
+ }
217
+ }
218
+
219
+ let evaluator = CelEvaluator::new();
220
+ let schema = json!({
221
+ "properties": {
222
+ "z_uuid": {
223
+ "type": "string",
224
+ "x-lix-default": "lix_uuid_v7()"
225
+ },
226
+ "a_timestamp": {
227
+ "type": "string",
228
+ "x-lix-default": "lix_timestamp()"
229
+ }
230
+ }
231
+ });
232
+ let mut snapshot = JsonMap::new();
233
+ let context = snapshot.clone();
234
+
235
+ let changed = apply_schema_defaults_with_context(
236
+ &mut snapshot,
237
+ &schema,
238
+ &context,
239
+ &evaluator,
240
+ CountingFunctions {
241
+ next: std::sync::Arc::new(std::sync::atomic::AtomicI64::new(0)),
242
+ },
243
+ "test_schema",
244
+ "1",
245
+ )
246
+ .expect("apply defaults");
247
+
248
+ assert!(changed);
249
+ assert_eq!(
250
+ snapshot.get("a_timestamp"),
251
+ Some(&JsonValue::String("ts-0".to_string()))
252
+ );
253
+ assert_eq!(
254
+ snapshot.get("z_uuid"),
255
+ Some(&JsonValue::String("uuid-1".to_string()))
256
+ );
257
+ }
258
+
259
+ #[derive(Clone)]
260
+ struct FixedFunctions;
261
+
262
+ impl CelFunctionProvider for FixedFunctions {
263
+ fn call_uuid_v7(&self) -> String {
264
+ "uuid-fixed".to_string()
265
+ }
266
+
267
+ fn call_timestamp(&self) -> String {
268
+ "1970-01-01T00:00:00.000Z".to_string()
269
+ }
270
+ }
271
+
272
+ fn fixed_functions() -> FixedFunctions {
273
+ FixedFunctions
274
+ }
275
+ }
@@ -0,0 +1 @@
1
+ pub(crate) mod defaults;
@@ -0,0 +1,21 @@
1
+ {
2
+ "x-lix-key": "lix_account",
3
+ "x-lix-primary-key": [
4
+ "/id"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "id": {
9
+ "type": "string",
10
+ "x-lix-default": "lix_uuid_v7()"
11
+ },
12
+ "name": {
13
+ "type": "string"
14
+ }
15
+ },
16
+ "required": [
17
+ "id",
18
+ "name"
19
+ ],
20
+ "additionalProperties": false
21
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "x-lix-key": "lix_active_account",
3
+ "x-lix-primary-key": [
4
+ "/account_id"
5
+ ],
6
+ "x-lix-foreign-keys": [
7
+ {
8
+ "properties": [
9
+ "/account_id"
10
+ ],
11
+ "references": {
12
+ "schemaKey": "lix_account",
13
+ "properties": [
14
+ "/id"
15
+ ]
16
+ }
17
+ }
18
+ ],
19
+ "type": "object",
20
+ "properties": {
21
+ "account_id": {
22
+ "type": "string"
23
+ }
24
+ },
25
+ "required": [
26
+ "account_id"
27
+ ],
28
+ "additionalProperties": false
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "x-lix-key": "lix_binary_blob_ref",
3
+ "description": "Metadata pointer from a file version to its binary payload in internal CAS storage.",
4
+ "x-lix-primary-key": [
5
+ "/id"
6
+ ],
7
+ "type": "object",
8
+ "properties": {
9
+ "id": {
10
+ "type": "string",
11
+ "description": "File/entity identifier (matches lix_file.id) for this binary reference row."
12
+ },
13
+ "blob_hash": {
14
+ "type": "string",
15
+ "description": "BLAKE3 content hash used as the canonical CAS key for the binary payload."
16
+ },
17
+ "size_bytes": {
18
+ "type": "integer",
19
+ "minimum": 0,
20
+ "description": "Logical uncompressed file size in bytes for the referenced binary payload."
21
+ }
22
+ },
23
+ "required": [
24
+ "id",
25
+ "blob_hash",
26
+ "size_bytes"
27
+ ],
28
+ "additionalProperties": false
29
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "x-lix-key": "lix_change",
3
+ "description": "A change records one edit to a Lix entity, including what changed, when it changed, and which entity was affected.",
4
+ "x-lix-primary-key": [
5
+ "/id"
6
+ ],
7
+ "type": "object",
8
+ "properties": {
9
+ "id": {
10
+ "type": "string",
11
+ "x-lix-default": "lix_uuid_v7()",
12
+ "description": "Stable identifier for this change."
13
+ },
14
+ "entity_id": {
15
+ "type": "array",
16
+ "description": "Canonical JSON primary-key tuple for the entity this change applies to, scoped by (`schema_key`, `file_id`). Values are ordered according to the target schema's `x-lix-primary-key`.",
17
+ "items": {
18
+ "type": "string"
19
+ },
20
+ "minItems": 1
21
+ },
22
+ "schema_key": {
23
+ "type": "string",
24
+ "description": "Schema identifier of the entity (e.g. `lix_file_descriptor`, `lix_commit`, or a user-registered key)."
25
+ },
26
+ "file_id": {
27
+ "type": [
28
+ "string",
29
+ "null"
30
+ ],
31
+ "description": "Filesystem-scoped file identifier when the change belongs to a file; NULL for engine-internal entities (commits, versions, settings)."
32
+ },
33
+ "metadata": {
34
+ "type": [
35
+ "object",
36
+ "null"
37
+ ],
38
+ "description": "Optional user-provided JSON metadata attached to the change; NULL when nothing was supplied."
39
+ },
40
+ "created_at": {
41
+ "type": "string",
42
+ "examples": [
43
+ "2026-05-08T17:42:31.123Z"
44
+ ],
45
+ "description": "ISO-8601 timestamp at which the change was recorded (set via `lix_timestamp()` at write time)."
46
+ },
47
+ "snapshot_content": {
48
+ "type": [
49
+ "object",
50
+ "null"
51
+ ],
52
+ "description": "Entity JSON body at this change; NULL represents a tombstone (deletion)."
53
+ }
54
+ },
55
+ "required": [
56
+ "id",
57
+ "entity_id",
58
+ "schema_key",
59
+ "file_id",
60
+ "created_at"
61
+ ],
62
+ "additionalProperties": false
63
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "x-lix-key": "lix_change_author",
3
+ "x-lix-primary-key": [
4
+ "/change_id",
5
+ "/account_id"
6
+ ],
7
+ "x-lix-foreign-keys": [
8
+ {
9
+ "properties": [
10
+ "/change_id"
11
+ ],
12
+ "references": {
13
+ "schemaKey": "lix_change",
14
+ "properties": [
15
+ "/id"
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "properties": [
21
+ "/account_id"
22
+ ],
23
+ "references": {
24
+ "schemaKey": "lix_account",
25
+ "properties": [
26
+ "/id"
27
+ ]
28
+ }
29
+ }
30
+ ],
31
+ "type": "object",
32
+ "properties": {
33
+ "change_id": {
34
+ "type": "string"
35
+ },
36
+ "account_id": {
37
+ "type": "string"
38
+ }
39
+ },
40
+ "required": [
41
+ "change_id",
42
+ "account_id"
43
+ ],
44
+ "additionalProperties": false
45
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "x-lix-key": "lix_commit",
3
+ "description": "A commit is a stable point in project history. Versions point to commits. Use lix_commit_edge to inspect parent commits.",
4
+ "examples": [
5
+ {
6
+ "id": "commit_01jexample"
7
+ }
8
+ ],
9
+ "x-lix-primary-key": [
10
+ "/id"
11
+ ],
12
+ "type": "object",
13
+ "properties": {
14
+ "id": {
15
+ "type": "string",
16
+ "x-lix-default": "lix_uuid_v7()",
17
+ "description": "Stable identifier of this commit."
18
+ }
19
+ },
20
+ "required": [
21
+ "id"
22
+ ],
23
+ "additionalProperties": false
24
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "x-lix-key": "lix_commit_edge",
3
+ "description": "Direct parent relationship between two commits. Merge commits have one row per parent. The first parent is useful for showing mainline history or comparing a merge commit against the commit that was checked out before the merge.",
4
+ "examples": [
5
+ {
6
+ "parent_id": "commit-main",
7
+ "child_id": "commit-merge",
8
+ "parent_order": 0
9
+ },
10
+ {
11
+ "parent_id": "commit-feature",
12
+ "child_id": "commit-merge",
13
+ "parent_order": 1
14
+ }
15
+ ],
16
+ "x-lix-primary-key": ["/child_id", "/parent_order"],
17
+ "x-lix-unique": [["/parent_id", "/child_id"]],
18
+ "x-lix-foreign-keys": [
19
+ {
20
+ "properties": ["/parent_id"],
21
+ "references": {
22
+ "schemaKey": "lix_commit",
23
+ "properties": ["/id"]
24
+ }
25
+ },
26
+ {
27
+ "properties": ["/child_id"],
28
+ "references": {
29
+ "schemaKey": "lix_commit",
30
+ "properties": ["/id"]
31
+ }
32
+ }
33
+ ],
34
+ "type": "object",
35
+ "properties": {
36
+ "parent_id": {
37
+ "type": "string",
38
+ "description": "Identifier of the parent commit."
39
+ },
40
+ "child_id": {
41
+ "type": "string",
42
+ "description": "Identifier of the child commit."
43
+ },
44
+ "parent_order": {
45
+ "type": "integer",
46
+ "minimum": 0,
47
+ "examples": [0, 1],
48
+ "description": "Zero-based position of this parent in the child commit's ordered parent list. The first parent has order 0; additional merge parents have order 1, 2, and so on."
49
+ }
50
+ },
51
+ "required": ["parent_id", "child_id", "parent_order"],
52
+ "additionalProperties": false
53
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "x-lix-key": "lix_directory_descriptor",
3
+ "x-lix-primary-key": [
4
+ "/id"
5
+ ],
6
+ "x-lix-unique": [
7
+ [
8
+ "/parent_id",
9
+ "/name"
10
+ ]
11
+ ],
12
+ "x-lix-foreign-keys": [
13
+ {
14
+ "properties": [
15
+ "/parent_id"
16
+ ],
17
+ "references": {
18
+ "schemaKey": "lix_directory_descriptor",
19
+ "properties": [
20
+ "/id"
21
+ ]
22
+ }
23
+ }
24
+ ],
25
+ "type": "object",
26
+ "properties": {
27
+ "id": {
28
+ "type": "string",
29
+ "x-lix-default": "lix_uuid_v7()"
30
+ },
31
+ "parent_id": {
32
+ "type": [
33
+ "string",
34
+ "null"
35
+ ]
36
+ },
37
+ "name": {
38
+ "type": "string",
39
+ "pattern": "^(?!\\.{1,2}$)[^/\\\\]+$"
40
+ },
41
+ "hidden": {
42
+ "type": "boolean",
43
+ "x-lix-default": "false"
44
+ }
45
+ },
46
+ "required": [
47
+ "id",
48
+ "parent_id",
49
+ "name"
50
+ ],
51
+ "additionalProperties": false
52
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "x-lix-key": "lix_file_descriptor",
3
+ "x-lix-primary-key": [
4
+ "/id"
5
+ ],
6
+ "x-lix-unique": [
7
+ [
8
+ "/directory_id",
9
+ "/name"
10
+ ]
11
+ ],
12
+ "x-lix-foreign-keys": [
13
+ {
14
+ "properties": [
15
+ "/directory_id"
16
+ ],
17
+ "references": {
18
+ "schemaKey": "lix_directory_descriptor",
19
+ "properties": [
20
+ "/id"
21
+ ]
22
+ }
23
+ }
24
+ ],
25
+ "type": "object",
26
+ "properties": {
27
+ "id": {
28
+ "type": "string",
29
+ "x-lix-default": "lix_uuid_v7()"
30
+ },
31
+ "directory_id": {
32
+ "type": [
33
+ "string",
34
+ "null"
35
+ ]
36
+ },
37
+ "name": {
38
+ "type": "string",
39
+ "pattern": "^(?!\\.{1,2}$)[^/\\\\]+$"
40
+ },
41
+ "hidden": {
42
+ "type": "boolean",
43
+ "x-lix-default": "false"
44
+ }
45
+ },
46
+ "required": [
47
+ "id",
48
+ "directory_id",
49
+ "name"
50
+ ],
51
+ "additionalProperties": false
52
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "x-lix-key": "lix_key_value",
3
+ "x-lix-primary-key": [
4
+ "/key"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "key": {
9
+ "type": "string"
10
+ },
11
+ "value": {
12
+ "description": "Arbitrary JSON value. This field stays in the JSON domain even when different rows hold different JSON kinds.",
13
+ "anyOf": [
14
+ {
15
+ "type": "object"
16
+ },
17
+ {
18
+ "type": "array"
19
+ },
20
+ {
21
+ "type": "string"
22
+ },
23
+ {
24
+ "type": "number"
25
+ },
26
+ {
27
+ "type": "boolean"
28
+ },
29
+ {
30
+ "type": "null"
31
+ }
32
+ ]
33
+ }
34
+ },
35
+ "required": [
36
+ "key",
37
+ "value"
38
+ ],
39
+ "additionalProperties": false
40
+ }