@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,351 @@
1
+ use std::collections::BTreeSet;
2
+
3
+ use crate::entity_identity::EntityIdentity;
4
+ use crate::live_state::LiveStateRow;
5
+ use crate::tracked_state::TrackedStateRow;
6
+ use crate::untracked_state::MaterializedUntrackedStateRow;
7
+ use crate::RowMetadata;
8
+
9
+ /// Incoming state row before transaction hydration.
10
+ ///
11
+ /// Write frontends produce this shape after decoding their own surface. The
12
+ /// transaction later assigns generated fields and turns it into a
13
+ /// `StagedStateRow`.
14
+ ///
15
+ /// SQL providers stage semantic rows, not final storage rows. INSERT providers
16
+ /// may omit defaulted snapshot fields and leave `entity_id` unset when the
17
+ /// target schema has an `x-lix-primary-key`; transaction normalization applies
18
+ /// schema defaults and derives the final identity. Typed UPDATE providers must
19
+ /// stage full rewritten snapshots after applying column assignments to the
20
+ /// existing row. Raw `lix_state` snapshot updates are replacement writes, not
21
+ /// implicit patches.
22
+ #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
23
+ pub(crate) struct StageRow {
24
+ pub(crate) entity_id: Option<EntityIdentity>,
25
+ pub(crate) schema_key: String,
26
+ pub(crate) file_id: Option<String>,
27
+ pub(crate) snapshot_content: Option<String>,
28
+ pub(crate) metadata: Option<RowMetadata>,
29
+ pub(crate) origin: Option<StageRowOrigin>,
30
+ pub(crate) schema_version: String,
31
+ pub(crate) created_at: Option<String>,
32
+ pub(crate) updated_at: Option<String>,
33
+ pub(crate) global: bool,
34
+ pub(crate) change_id: Option<String>,
35
+ pub(crate) commit_id: Option<String>,
36
+ pub(crate) untracked: bool,
37
+ pub(crate) version_id: String,
38
+ }
39
+
40
+ impl StageRow {
41
+ pub(crate) fn schema_scope_version_id(&self) -> &str {
42
+ if self.global {
43
+ crate::GLOBAL_VERSION_ID
44
+ } else {
45
+ self.version_id.as_str()
46
+ }
47
+ }
48
+ }
49
+
50
+ /// User-facing write operation that produced one physical staged row.
51
+ ///
52
+ /// Composite SQL surfaces such as `lix_file` lower one logical row into
53
+ /// multiple state rows. The transaction layer owns final constraint validation,
54
+ /// but error messages should stay in the vocabulary of the logical operation
55
+ /// when the caller did not write the physical state schema directly.
56
+ #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
57
+ pub(crate) struct StageRowOrigin {
58
+ pub(crate) surface: String,
59
+ pub(crate) operation: StageWriteOperation,
60
+ pub(crate) primary_key: Option<LogicalPrimaryKey>,
61
+ }
62
+
63
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
64
+ pub(crate) enum StageWriteOperation {
65
+ Insert,
66
+ Update,
67
+ Delete,
68
+ }
69
+
70
+ #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
71
+ pub(crate) struct LogicalPrimaryKey {
72
+ pub(crate) columns: Vec<String>,
73
+ pub(crate) values: Vec<String>,
74
+ }
75
+
76
+ /// Incoming file payload paired with staged filesystem rows.
77
+ #[derive(Debug, Clone, PartialEq, Eq)]
78
+ pub(crate) struct StageFileData {
79
+ pub(crate) file_id: String,
80
+ pub(crate) version_id: String,
81
+ pub(crate) untracked: bool,
82
+ pub(crate) data: Vec<u8>,
83
+ }
84
+
85
+ /// Existing canonical change adopted into another version's tracked projection.
86
+ ///
87
+ /// Merges use this path when the source side already owns the canonical
88
+ /// changelog fact. The target commit references that existing change id and
89
+ /// writes a target-version projection row without appending a copied change.
90
+ #[derive(Debug, Clone, PartialEq, Eq)]
91
+ pub(crate) struct StageAdoptedChange {
92
+ pub(crate) version_id: String,
93
+ pub(crate) change_id: String,
94
+ pub(crate) projected_row: TrackedStateRow,
95
+ }
96
+
97
+ /// One decoded write batch before transaction hydration.
98
+ #[derive(Debug, Clone, PartialEq, Eq)]
99
+ pub(crate) enum StageWrite {
100
+ Rows {
101
+ mode: StageWriteMode,
102
+ rows: Vec<StageRow>,
103
+ },
104
+ RowsWithFileData {
105
+ mode: StageWriteMode,
106
+ rows: Vec<StageRow>,
107
+ file_data: Vec<StageFileData>,
108
+ count: u64,
109
+ },
110
+ AdoptedChanges {
111
+ changes: Vec<StageAdoptedChange>,
112
+ },
113
+ }
114
+
115
+ #[derive(Debug, Clone, Copy, PartialEq, Eq)]
116
+ pub(crate) enum StageWriteMode {
117
+ Insert,
118
+ Replace,
119
+ }
120
+
121
+ /// Result returned after staging a decoded write batch.
122
+ #[derive(Debug, Clone, PartialEq, Eq)]
123
+ pub(crate) struct StageWriteOutcome {
124
+ pub(crate) count: u64,
125
+ }
126
+
127
+ /// Transaction-hydrated state row.
128
+ ///
129
+ /// This is the row form owned by a write transaction after generated fields
130
+ /// have been assigned but before the rows are durably flushed.
131
+ #[derive(Debug, Clone, PartialEq, Eq)]
132
+ pub(crate) struct StagedStateRow {
133
+ pub(crate) entity_id: EntityIdentity,
134
+ pub(crate) schema_key: String,
135
+ pub(crate) file_id: Option<String>,
136
+ pub(crate) snapshot_content: Option<String>,
137
+ pub(crate) metadata: Option<RowMetadata>,
138
+ pub(crate) origin: Option<StageRowOrigin>,
139
+ pub(crate) schema_version: String,
140
+ pub(crate) created_at: String,
141
+ pub(crate) updated_at: String,
142
+ pub(crate) global: bool,
143
+ pub(crate) change_id: Option<String>,
144
+ pub(crate) commit_id: Option<String>,
145
+ pub(crate) untracked: bool,
146
+ pub(crate) version_id: String,
147
+ }
148
+
149
+ impl StagedStateRow {
150
+ pub(crate) fn schema_scope_version_id(&self) -> &str {
151
+ if self.global {
152
+ crate::GLOBAL_VERSION_ID
153
+ } else {
154
+ self.version_id.as_str()
155
+ }
156
+ }
157
+ }
158
+
159
+ /// Transaction-hydrated projection for an adopted canonical change.
160
+ #[derive(Debug, Clone, PartialEq, Eq)]
161
+ pub(crate) struct StagedAdoptedStateRow {
162
+ pub(crate) entity_id: EntityIdentity,
163
+ pub(crate) schema_key: String,
164
+ pub(crate) file_id: Option<String>,
165
+ pub(crate) snapshot_content: Option<String>,
166
+ pub(crate) metadata: Option<RowMetadata>,
167
+ pub(crate) schema_version: String,
168
+ pub(crate) created_at: String,
169
+ pub(crate) updated_at: String,
170
+ pub(crate) global: bool,
171
+ pub(crate) change_id: String,
172
+ pub(crate) commit_id: String,
173
+ pub(crate) version_id: String,
174
+ }
175
+
176
+ impl StagedAdoptedStateRow {
177
+ pub(crate) fn schema_scope_version_id(&self) -> &str {
178
+ if self.global {
179
+ crate::GLOBAL_VERSION_ID
180
+ } else {
181
+ self.version_id.as_str()
182
+ }
183
+ }
184
+ }
185
+
186
+ impl From<StagedStateRow> for LiveStateRow {
187
+ fn from(row: StagedStateRow) -> Self {
188
+ LiveStateRow {
189
+ entity_id: row.entity_id,
190
+ schema_key: row.schema_key,
191
+ file_id: row.file_id,
192
+ snapshot_content: row.snapshot_content,
193
+ metadata: row.metadata,
194
+ schema_version: row.schema_version,
195
+ created_at: row.created_at,
196
+ updated_at: row.updated_at,
197
+ global: row.global,
198
+ change_id: row.change_id,
199
+ commit_id: row.commit_id,
200
+ untracked: row.untracked,
201
+ version_id: row.version_id,
202
+ }
203
+ }
204
+ }
205
+
206
+ impl From<&StagedStateRow> for LiveStateRow {
207
+ fn from(row: &StagedStateRow) -> Self {
208
+ LiveStateRow {
209
+ entity_id: row.entity_id.clone(),
210
+ schema_key: row.schema_key.clone(),
211
+ file_id: row.file_id.clone(),
212
+ snapshot_content: row.snapshot_content.clone(),
213
+ metadata: row.metadata.clone(),
214
+ schema_version: row.schema_version.clone(),
215
+ created_at: row.created_at.clone(),
216
+ updated_at: row.updated_at.clone(),
217
+ global: row.global,
218
+ change_id: row.change_id.clone(),
219
+ commit_id: row.commit_id.clone(),
220
+ untracked: row.untracked,
221
+ version_id: row.version_id.clone(),
222
+ }
223
+ }
224
+ }
225
+
226
+ impl From<StagedAdoptedStateRow> for LiveStateRow {
227
+ fn from(row: StagedAdoptedStateRow) -> Self {
228
+ LiveStateRow {
229
+ entity_id: row.entity_id,
230
+ schema_key: row.schema_key,
231
+ file_id: row.file_id,
232
+ snapshot_content: row.snapshot_content,
233
+ metadata: row.metadata,
234
+ schema_version: row.schema_version,
235
+ created_at: row.created_at,
236
+ updated_at: row.updated_at,
237
+ global: row.global,
238
+ change_id: Some(row.change_id),
239
+ commit_id: Some(row.commit_id),
240
+ untracked: false,
241
+ version_id: row.version_id,
242
+ }
243
+ }
244
+ }
245
+
246
+ impl From<&StagedAdoptedStateRow> for LiveStateRow {
247
+ fn from(row: &StagedAdoptedStateRow) -> Self {
248
+ LiveStateRow {
249
+ entity_id: row.entity_id.clone(),
250
+ schema_key: row.schema_key.clone(),
251
+ file_id: row.file_id.clone(),
252
+ snapshot_content: row.snapshot_content.clone(),
253
+ metadata: row.metadata.clone(),
254
+ schema_version: row.schema_version.clone(),
255
+ created_at: row.created_at.clone(),
256
+ updated_at: row.updated_at.clone(),
257
+ global: row.global,
258
+ change_id: Some(row.change_id.clone()),
259
+ commit_id: Some(row.commit_id.clone()),
260
+ untracked: false,
261
+ version_id: row.version_id.clone(),
262
+ }
263
+ }
264
+ }
265
+
266
+ impl From<&StagedAdoptedStateRow> for StagedStateRow {
267
+ fn from(row: &StagedAdoptedStateRow) -> Self {
268
+ StagedStateRow {
269
+ entity_id: row.entity_id.clone(),
270
+ schema_key: row.schema_key.clone(),
271
+ file_id: row.file_id.clone(),
272
+ snapshot_content: row.snapshot_content.clone(),
273
+ metadata: row.metadata.clone(),
274
+ origin: None,
275
+ schema_version: row.schema_version.clone(),
276
+ created_at: row.created_at.clone(),
277
+ updated_at: row.updated_at.clone(),
278
+ global: row.global,
279
+ change_id: Some(row.change_id.clone()),
280
+ commit_id: Some(row.commit_id.clone()),
281
+ untracked: false,
282
+ version_id: row.version_id.clone(),
283
+ }
284
+ }
285
+ }
286
+
287
+ impl From<StagedStateRow> for MaterializedUntrackedStateRow {
288
+ fn from(row: StagedStateRow) -> Self {
289
+ MaterializedUntrackedStateRow {
290
+ entity_id: row.entity_id,
291
+ schema_key: row.schema_key,
292
+ file_id: row.file_id,
293
+ snapshot_content: row.snapshot_content,
294
+ metadata: row.metadata,
295
+ schema_version: row.schema_version,
296
+ created_at: row.created_at,
297
+ updated_at: row.updated_at,
298
+ global: row.global,
299
+ version_id: row.version_id,
300
+ }
301
+ }
302
+ }
303
+
304
+ /// Transaction-local introduced-change membership accumulated while rows are staged.
305
+ ///
306
+ /// Final commit row materialization owns commit ids, parent heads, and commit
307
+ /// row timestamps. Staging only tracks which hydrated tracked changes the
308
+ /// future commit introduces for a version.
309
+ #[derive(Debug, Clone, Default, PartialEq, Eq)]
310
+ pub(crate) struct StagedCommitMembers {
311
+ pub(crate) commit_id: String,
312
+ pub(crate) commit_change_id: String,
313
+ pub(crate) change_set_id: String,
314
+ pub(crate) created_at: String,
315
+ pub(crate) change_ids: BTreeSet<String>,
316
+ pub(crate) allow_empty: bool,
317
+ }
318
+
319
+ impl StagedCommitMembers {
320
+ pub(crate) fn new(
321
+ commit_id: String,
322
+ commit_change_id: String,
323
+ change_set_id: String,
324
+ created_at: String,
325
+ ) -> Self {
326
+ Self {
327
+ commit_id,
328
+ commit_change_id,
329
+ change_set_id,
330
+ created_at,
331
+ change_ids: BTreeSet::new(),
332
+ allow_empty: false,
333
+ }
334
+ }
335
+
336
+ pub(crate) fn add_change_id(&mut self, change_id: String) {
337
+ self.change_ids.insert(change_id);
338
+ }
339
+
340
+ pub(crate) fn remove_change_id(&mut self, change_id: &str) {
341
+ self.change_ids.remove(change_id);
342
+ }
343
+
344
+ pub(crate) fn is_empty(&self) -> bool {
345
+ self.change_ids.is_empty()
346
+ }
347
+
348
+ pub(crate) fn allow_empty(&mut self) {
349
+ self.allow_empty = true;
350
+ }
351
+ }