@lix-js/sdk 0.6.0-preview.4 → 0.6.0-preview.5
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.
- package/README.md +1 -1
- package/SKILL.md +65 -64
- package/dist/engine-wasm/index.js +4 -4
- package/dist/engine-wasm/wasm/lix_engine.d.ts +5 -5
- package/dist/engine-wasm/wasm/lix_engine.js +130 -118
- package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
- package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +9 -8
- package/dist/generated/builtin-schemas.d.ts +69 -69
- package/dist/generated/builtin-schemas.js +94 -94
- package/dist/open-lix.d.ts +33 -26
- package/dist/open-lix.js +10 -10
- package/dist/sqlite/index.js +86 -30
- package/dist-engine-src/README.md +3 -3
- package/dist-engine-src/src/backend/capabilities.rs +67 -0
- package/dist-engine-src/src/backend/conformance/baseline.rs +1127 -0
- package/dist-engine-src/src/backend/conformance/factory.rs +93 -0
- package/dist-engine-src/src/backend/conformance/failure_tests.rs +608 -0
- package/dist-engine-src/src/backend/conformance/fixtures.rs +26 -0
- package/dist-engine-src/src/backend/conformance/mod.rs +75 -0
- package/dist-engine-src/src/backend/conformance/model.rs +28 -0
- package/dist-engine-src/src/backend/conformance/model_based.rs +257 -0
- package/dist-engine-src/src/backend/conformance/persistence.rs +204 -0
- package/dist-engine-src/src/backend/conformance/projection.rs +21 -0
- package/dist-engine-src/src/backend/conformance/pushdown.rs +24 -0
- package/dist-engine-src/src/backend/conformance/runner.rs +90 -0
- package/dist-engine-src/src/backend/conformance/scan.rs +24 -0
- package/dist-engine-src/src/backend/conformance/write.rs +16 -0
- package/dist-engine-src/src/backend/error.rs +94 -0
- package/dist-engine-src/src/backend/in_memory.rs +670 -0
- package/dist-engine-src/src/backend/mod.rs +36 -9
- package/dist-engine-src/src/backend/predicate.rs +80 -0
- package/dist-engine-src/src/backend/traits.rs +260 -0
- package/dist-engine-src/src/backend/types.rs +224 -81
- package/dist-engine-src/src/binary_cas/context.rs +8 -8
- package/dist-engine-src/src/binary_cas/kv.rs +234 -259
- package/dist-engine-src/src/{version → branch}/context.rs +12 -12
- package/dist-engine-src/src/branch/lifecycle.rs +221 -0
- package/dist-engine-src/src/branch/mod.rs +13 -0
- package/dist-engine-src/src/branch/refs.rs +321 -0
- package/dist-engine-src/src/branch/stage_rows.rs +67 -0
- package/dist-engine-src/src/branch/types.rs +21 -0
- package/dist-engine-src/src/catalog/context.rs +18 -18
- package/dist-engine-src/src/catalog/snapshot.rs +8 -8
- package/dist-engine-src/src/changelog/bench_support.rs +785 -0
- package/dist-engine-src/src/changelog/change.rs +1 -0
- package/dist-engine-src/src/changelog/codec.rs +497 -0
- package/dist-engine-src/src/changelog/commit.rs +1 -0
- package/dist-engine-src/src/changelog/context.rs +1614 -0
- package/dist-engine-src/src/changelog/mod.rs +29 -0
- package/dist-engine-src/src/changelog/store.rs +163 -0
- package/dist-engine-src/src/changelog/test_support.rs +54 -0
- package/dist-engine-src/src/changelog/types.rs +213 -0
- package/dist-engine-src/src/commit_graph/context.rs +317 -274
- package/dist-engine-src/src/commit_graph/mod.rs +2 -4
- package/dist-engine-src/src/commit_graph/types.rs +22 -42
- package/dist-engine-src/src/commit_graph/walker.rs +133 -103
- package/dist-engine-src/src/common/error.rs +52 -18
- package/dist-engine-src/src/common/identity.rs +2 -2
- package/dist-engine-src/src/common/mod.rs +1 -1
- package/dist-engine-src/src/domain.rs +42 -46
- package/dist-engine-src/src/engine.rs +74 -96
- package/dist-engine-src/src/{entity_identity.rs → entity_pk.rs} +89 -92
- package/dist-engine-src/src/functions/context.rs +56 -52
- package/dist-engine-src/src/functions/state.rs +51 -52
- package/dist-engine-src/src/init.rs +288 -154
- package/dist-engine-src/src/json_store/context.rs +15 -266
- package/dist-engine-src/src/json_store/mod.rs +26 -0
- package/dist-engine-src/src/json_store/store.rs +103 -718
- package/dist-engine-src/src/json_store/types.rs +4 -9
- package/dist-engine-src/src/lib.rs +49 -19
- package/dist-engine-src/src/live_state/context.rs +654 -790
- package/dist-engine-src/src/live_state/mod.rs +9 -3
- package/dist-engine-src/src/live_state/overlay.rs +4 -4
- package/dist-engine-src/src/live_state/types.rs +30 -21
- package/dist-engine-src/src/live_state/visibility.rs +514 -71
- package/dist-engine-src/src/plugin/install.rs +48 -48
- package/dist-engine-src/src/plugin/manifest.rs +7 -7
- package/dist-engine-src/src/plugin/materializer.rs +0 -275
- package/dist-engine-src/src/plugin/plugin_manifest.json +4 -3
- package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +2 -2
- package/dist-engine-src/src/schema/builtin/lix_branch_descriptor.json +34 -0
- package/dist-engine-src/src/schema/builtin/lix_branch_ref.json +48 -0
- package/dist-engine-src/src/schema/builtin/lix_change.json +3 -3
- package/dist-engine-src/src/schema/builtin/lix_commit.json +1 -1
- package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +6 -6
- package/dist-engine-src/src/schema/builtin/mod.rs +18 -20
- package/dist-engine-src/src/schema/compatibility.rs +11 -11
- package/dist-engine-src/src/schema/definition.json +2 -2
- package/dist-engine-src/src/schema/definition.rs +5 -5
- package/dist-engine-src/src/schema/key.rs +3 -3
- package/dist-engine-src/src/schema/mod.rs +1 -1
- package/dist-engine-src/src/schema/tests.rs +18 -18
- package/dist-engine-src/src/session/context.rs +803 -148
- package/dist-engine-src/src/session/create_branch.rs +94 -0
- package/dist-engine-src/src/session/execute.rs +223 -83
- package/dist-engine-src/src/session/merge/analysis.rs +9 -3
- package/dist-engine-src/src/session/merge/{version.rs → branch.rs} +119 -129
- package/dist-engine-src/src/session/merge/conflicts.rs +2 -2
- package/dist-engine-src/src/session/merge/mod.rs +5 -6
- package/dist-engine-src/src/session/merge/stats.rs +7 -11
- package/dist-engine-src/src/session/mod.rs +15 -12
- package/dist-engine-src/src/session/switch_branch.rs +113 -0
- package/dist-engine-src/src/session/transaction.rs +495 -14
- package/dist-engine-src/src/sql2/{classify.rs → bind/classify.rs} +3 -75
- package/dist-engine-src/src/sql2/bind/error.rs +5 -0
- package/dist-engine-src/src/sql2/bind/expr.rs +29 -0
- package/dist-engine-src/src/sql2/bind/mod.rs +12 -0
- package/dist-engine-src/src/sql2/{udfs/public_call.rs → bind/public_udf.rs} +71 -3
- package/dist-engine-src/src/sql2/bind/read.rs +65 -0
- package/dist-engine-src/src/sql2/bind/statement.rs +2236 -0
- package/dist-engine-src/src/sql2/bind/table.rs +273 -0
- package/dist-engine-src/src/sql2/bind/write.rs +86 -0
- package/dist-engine-src/src/sql2/branch_scope.rs +436 -0
- package/dist-engine-src/src/sql2/catalog/capability.rs +20 -0
- package/dist-engine-src/src/sql2/catalog/entity_surface.rs +296 -0
- package/dist-engine-src/src/sql2/catalog/mod.rs +15 -0
- package/dist-engine-src/src/sql2/catalog/registry.rs +556 -0
- package/dist-engine-src/src/sql2/catalog/schema.rs +88 -0
- package/dist-engine-src/src/sql2/catalog/surface.rs +41 -0
- package/dist-engine-src/src/sql2/change_materialization.rs +122 -0
- package/dist-engine-src/src/sql2/context.rs +36 -30
- package/dist-engine-src/src/sql2/error.rs +1 -1
- package/dist-engine-src/src/sql2/exec/bound_public_write.rs +1593 -0
- package/dist-engine-src/src/sql2/exec/datafusion.rs +5266 -0
- package/dist-engine-src/src/sql2/exec/fast_write.rs +82 -0
- package/dist-engine-src/src/sql2/exec/mod.rs +24 -0
- package/dist-engine-src/src/sql2/exec/write.rs +661 -0
- package/dist-engine-src/src/sql2/filesystem_planner.rs +72 -77
- package/dist-engine-src/src/sql2/filesystem_visibility.rs +21 -21
- package/dist-engine-src/src/sql2/history_projection.rs +8 -8
- package/dist-engine-src/src/sql2/history_route.rs +35 -31
- package/dist-engine-src/src/sql2/mod.rs +28 -23
- package/dist-engine-src/src/sql2/optimize/datafusion.rs +1 -0
- package/dist-engine-src/src/sql2/optimize/mod.rs +2 -0
- package/dist-engine-src/src/sql2/optimize/simple_write.rs +116 -0
- package/dist-engine-src/src/sql2/parse/mod.rs +69 -0
- package/dist-engine-src/src/sql2/parse/normalize.rs +1 -0
- package/dist-engine-src/src/sql2/plan/branch_scope.rs +24 -0
- package/dist-engine-src/src/sql2/plan/mod.rs +5 -0
- package/dist-engine-src/src/sql2/plan/predicate.rs +22 -0
- package/dist-engine-src/src/sql2/plan/write.rs +147 -0
- package/dist-engine-src/src/sql2/predicate_typecheck.rs +258 -0
- package/dist-engine-src/src/sql2/{version_provider.rs → providers/branch.rs} +218 -214
- package/dist-engine-src/src/sql2/{change_provider.rs → providers/change.rs} +156 -42
- package/dist-engine-src/src/sql2/{directory_provider.rs → providers/directory.rs} +291 -322
- package/dist-engine-src/src/sql2/{directory_history_provider.rs → providers/directory_history.rs} +56 -42
- package/dist-engine-src/src/sql2/providers/entity.rs +1484 -0
- package/dist-engine-src/src/sql2/{entity_history_provider.rs → providers/entity_history.rs} +43 -31
- package/dist-engine-src/src/sql2/{file_provider.rs → providers/file.rs} +323 -316
- package/dist-engine-src/src/sql2/{file_history_provider.rs → providers/file_history.rs} +60 -46
- package/dist-engine-src/src/sql2/{history_provider.rs → providers/history.rs} +46 -32
- package/dist-engine-src/src/sql2/{lix_state_provider.rs → providers/lix_state.rs} +359 -329
- package/dist-engine-src/src/sql2/providers/mod.rs +508 -0
- package/dist-engine-src/src/sql2/read_only.rs +2 -2
- package/dist-engine-src/src/sql2/session.rs +47 -96
- package/dist-engine-src/src/sql2/storage/constraints.rs +1 -0
- package/dist-engine-src/src/sql2/storage/mod.rs +1 -0
- package/dist-engine-src/src/sql2/test_support/differential.rs +712 -0
- package/dist-engine-src/src/sql2/test_support/generators.rs +354 -0
- package/dist-engine-src/src/sql2/test_support/mod.rs +2 -0
- package/dist-engine-src/src/sql2/udfs/{lix_active_version_commit_id.rs → lix_active_branch_commit_id.rs} +7 -7
- package/dist-engine-src/src/sql2/udfs/mod.rs +3 -6
- package/dist-engine-src/src/sql2/write_normalization.rs +45 -22
- package/dist-engine-src/src/storage/conformance.rs +399 -0
- package/dist-engine-src/src/storage/context.rs +552 -288
- package/dist-engine-src/src/storage/mod.rs +48 -10
- package/dist-engine-src/src/storage/point.rs +440 -0
- package/dist-engine-src/src/storage/read_scope.rs +43 -64
- package/dist-engine-src/src/storage/reader.rs +867 -0
- package/dist-engine-src/src/storage/scan.rs +784 -0
- package/dist-engine-src/src/storage/spaces.rs +236 -0
- package/dist-engine-src/src/storage/stats.rs +80 -0
- package/dist-engine-src/src/storage/write_set.rs +962 -0
- package/dist-engine-src/src/storage_bench.rs +136 -4828
- package/dist-engine-src/src/test_support.rs +360 -138
- package/dist-engine-src/src/tracked_state/bench_support.rs +394 -0
- package/dist-engine-src/src/tracked_state/codec.rs +155 -1057
- package/dist-engine-src/src/tracked_state/commit_root_rebuild.rs +358 -0
- package/dist-engine-src/src/tracked_state/context.rs +1927 -993
- package/dist-engine-src/src/tracked_state/diff.rs +1715 -261
- package/dist-engine-src/src/tracked_state/merge.rs +74 -88
- package/dist-engine-src/src/tracked_state/mod.rs +19 -16
- package/dist-engine-src/src/tracked_state/{materialization.rs → row_materialization.rs} +50 -178
- package/dist-engine-src/src/tracked_state/storage.rs +243 -191
- package/dist-engine-src/src/tracked_state/tree.rs +247 -371
- package/dist-engine-src/src/tracked_state/types.rs +49 -42
- package/dist-engine-src/src/transaction/bench_support.rs +407 -0
- package/dist-engine-src/src/transaction/commit.rs +821 -713
- package/dist-engine-src/src/transaction/context.rs +705 -600
- package/dist-engine-src/src/transaction/mod.rs +13 -2
- package/dist-engine-src/src/transaction/normalization.rs +63 -76
- package/dist-engine-src/src/transaction/prep.rs +13 -13
- package/dist-engine-src/src/transaction/schema_resolver.rs +19 -5
- package/dist-engine-src/src/transaction/staging.rs +228 -434
- package/dist-engine-src/src/transaction/types.rs +41 -98
- package/dist-engine-src/src/transaction/validation.rs +382 -446
- package/dist-engine-src/src/untracked_state/codec.rs +337 -29
- package/dist-engine-src/src/untracked_state/context.rs +7 -7
- package/dist-engine-src/src/untracked_state/materialization.rs +2 -2
- package/dist-engine-src/src/untracked_state/mod.rs +1 -1
- package/dist-engine-src/src/untracked_state/storage.rs +659 -157
- package/dist-engine-src/src/untracked_state/types.rs +21 -21
- package/package.json +71 -68
- package/dist-engine-src/src/backend/kv.rs +0 -358
- package/dist-engine-src/src/backend/testing.rs +0 -658
- package/dist-engine-src/src/commit_store/codec.rs +0 -887
- package/dist-engine-src/src/commit_store/context.rs +0 -944
- package/dist-engine-src/src/commit_store/materialization.rs +0 -84
- package/dist-engine-src/src/commit_store/mod.rs +0 -16
- package/dist-engine-src/src/commit_store/storage.rs +0 -600
- package/dist-engine-src/src/commit_store/types.rs +0 -215
- package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +0 -34
- package/dist-engine-src/src/schema/builtin/lix_version_ref.json +0 -48
- package/dist-engine-src/src/session/create_version.rs +0 -88
- package/dist-engine-src/src/session/merge/apply.rs +0 -23
- package/dist-engine-src/src/session/optimization9_sql2_bench.rs +0 -100
- package/dist-engine-src/src/session/switch_version.rs +0 -110
- package/dist-engine-src/src/sql2/entity_provider.rs +0 -3211
- package/dist-engine-src/src/sql2/execute.rs +0 -3533
- package/dist-engine-src/src/sql2/public_bind/assignment.rs +0 -46
- package/dist-engine-src/src/sql2/public_bind/capability.rs +0 -41
- package/dist-engine-src/src/sql2/public_bind/dml.rs +0 -172
- package/dist-engine-src/src/sql2/public_bind/mod.rs +0 -26
- package/dist-engine-src/src/sql2/public_bind/table.rs +0 -168
- package/dist-engine-src/src/sql2/version_scope.rs +0 -394
- package/dist-engine-src/src/storage/types.rs +0 -501
- package/dist-engine-src/src/tracked_state/by_file_index.rs +0 -98
- package/dist-engine-src/src/tracked_state/materializer.rs +0 -488
- package/dist-engine-src/src/transaction/live_state_overlay.rs +0 -35
- package/dist-engine-src/src/version/lifecycle.rs +0 -221
- package/dist-engine-src/src/version/mod.rs +0 -13
- package/dist-engine-src/src/version/refs.rs +0 -330
- package/dist-engine-src/src/version/stage_rows.rs +0 -67
- package/dist-engine-src/src/version/types.rs +0 -21
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use crate::
|
|
1
|
+
use crate::entity_pk::EntityPk;
|
|
2
2
|
use crate::NullableKeyFilter;
|
|
3
3
|
|
|
4
4
|
/// Durable local row excluded from changelog and commit membership.
|
|
@@ -7,7 +7,7 @@ use crate::NullableKeyFilter;
|
|
|
7
7
|
/// directly, and mutable JSON payloads are stored inline in the sidecar row.
|
|
8
8
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
9
9
|
pub(crate) struct UntrackedStateRow {
|
|
10
|
-
pub(crate)
|
|
10
|
+
pub(crate) entity_pk: EntityPk,
|
|
11
11
|
pub(crate) schema_key: String,
|
|
12
12
|
pub(crate) file_id: Option<String>,
|
|
13
13
|
pub(crate) snapshot_content: Option<String>,
|
|
@@ -15,13 +15,13 @@ pub(crate) struct UntrackedStateRow {
|
|
|
15
15
|
pub(crate) created_at: String,
|
|
16
16
|
pub(crate) updated_at: String,
|
|
17
17
|
pub(crate) global: bool,
|
|
18
|
-
pub(crate)
|
|
18
|
+
pub(crate) branch_id: String,
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
impl UntrackedStateRow {
|
|
22
22
|
pub(crate) fn as_ref(&self) -> UntrackedStateRowRef<'_> {
|
|
23
23
|
UntrackedStateRowRef {
|
|
24
|
-
|
|
24
|
+
entity_pk: &self.entity_pk,
|
|
25
25
|
schema_key: &self.schema_key,
|
|
26
26
|
file_id: self.file_id.as_deref(),
|
|
27
27
|
snapshot_content: self.snapshot_content.as_deref(),
|
|
@@ -29,7 +29,7 @@ impl UntrackedStateRow {
|
|
|
29
29
|
created_at: &self.created_at,
|
|
30
30
|
updated_at: &self.updated_at,
|
|
31
31
|
global: self.global,
|
|
32
|
-
|
|
32
|
+
branch_id: &self.branch_id,
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -40,7 +40,7 @@ impl UntrackedStateRow {
|
|
|
40
40
|
/// without making untracked_state depend on transaction or live-state types.
|
|
41
41
|
#[derive(Debug, Clone, Copy)]
|
|
42
42
|
pub(crate) struct UntrackedStateRowRef<'a> {
|
|
43
|
-
pub(crate)
|
|
43
|
+
pub(crate) entity_pk: &'a EntityPk,
|
|
44
44
|
pub(crate) schema_key: &'a str,
|
|
45
45
|
pub(crate) file_id: Option<&'a str>,
|
|
46
46
|
pub(crate) snapshot_content: Option<&'a str>,
|
|
@@ -48,13 +48,13 @@ pub(crate) struct UntrackedStateRowRef<'a> {
|
|
|
48
48
|
pub(crate) created_at: &'a str,
|
|
49
49
|
pub(crate) updated_at: &'a str,
|
|
50
50
|
pub(crate) global: bool,
|
|
51
|
-
pub(crate)
|
|
51
|
+
pub(crate) branch_id: &'a str,
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
/// Hydrated boundary shape for callers that still work with JSON payloads.
|
|
55
55
|
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
|
56
56
|
pub(crate) struct MaterializedUntrackedStateRow {
|
|
57
|
-
pub(crate)
|
|
57
|
+
pub(crate) entity_pk: EntityPk,
|
|
58
58
|
pub(crate) schema_key: String,
|
|
59
59
|
pub(crate) file_id: Option<String>,
|
|
60
60
|
pub(crate) snapshot_content: Option<String>,
|
|
@@ -63,32 +63,32 @@ pub(crate) struct MaterializedUntrackedStateRow {
|
|
|
63
63
|
pub(crate) created_at: String,
|
|
64
64
|
pub(crate) updated_at: String,
|
|
65
65
|
pub(crate) global: bool,
|
|
66
|
-
pub(crate)
|
|
66
|
+
pub(crate) branch_id: String,
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
/// Stable identity for one local untracked overlay row.
|
|
70
70
|
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
|
71
71
|
pub(crate) struct UntrackedStateIdentity {
|
|
72
|
-
pub(crate)
|
|
72
|
+
pub(crate) branch_id: String,
|
|
73
73
|
pub(crate) schema_key: String,
|
|
74
|
-
pub(crate)
|
|
74
|
+
pub(crate) entity_pk: EntityPk,
|
|
75
75
|
pub(crate) file_id: Option<String>,
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
79
79
|
pub(crate) struct UntrackedStateIdentityRef<'a> {
|
|
80
|
-
pub(crate)
|
|
80
|
+
pub(crate) branch_id: &'a str,
|
|
81
81
|
pub(crate) schema_key: &'a str,
|
|
82
|
-
pub(crate)
|
|
82
|
+
pub(crate) entity_pk: &'a EntityPk,
|
|
83
83
|
pub(crate) file_id: Option<&'a str>,
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
impl UntrackedStateIdentity {
|
|
87
87
|
pub(crate) fn as_ref(&self) -> UntrackedStateIdentityRef<'_> {
|
|
88
88
|
UntrackedStateIdentityRef {
|
|
89
|
-
|
|
89
|
+
branch_id: &self.branch_id,
|
|
90
90
|
schema_key: &self.schema_key,
|
|
91
|
-
|
|
91
|
+
entity_pk: &self.entity_pk,
|
|
92
92
|
file_id: self.file_id.as_deref(),
|
|
93
93
|
}
|
|
94
94
|
}
|
|
@@ -97,9 +97,9 @@ impl UntrackedStateIdentity {
|
|
|
97
97
|
impl<'a> From<UntrackedStateRowRef<'a>> for UntrackedStateIdentityRef<'a> {
|
|
98
98
|
fn from(row: UntrackedStateRowRef<'a>) -> Self {
|
|
99
99
|
Self {
|
|
100
|
-
|
|
100
|
+
branch_id: row.branch_id,
|
|
101
101
|
schema_key: row.schema_key,
|
|
102
|
-
|
|
102
|
+
entity_pk: row.entity_pk,
|
|
103
103
|
file_id: row.file_id,
|
|
104
104
|
}
|
|
105
105
|
}
|
|
@@ -111,9 +111,9 @@ pub(crate) struct UntrackedStateFilter {
|
|
|
111
111
|
#[serde(default)]
|
|
112
112
|
pub(crate) schema_keys: Vec<String>,
|
|
113
113
|
#[serde(default)]
|
|
114
|
-
pub(crate)
|
|
114
|
+
pub(crate) entity_pks: Vec<EntityPk>,
|
|
115
115
|
#[serde(default)]
|
|
116
|
-
pub(crate)
|
|
116
|
+
pub(crate) branch_ids: Vec<String>,
|
|
117
117
|
#[serde(default)]
|
|
118
118
|
pub(crate) file_ids: Vec<NullableKeyFilter<String>>,
|
|
119
119
|
}
|
|
@@ -140,7 +140,7 @@ pub(crate) struct UntrackedStateScanRequest {
|
|
|
140
140
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
141
141
|
pub(crate) struct UntrackedStateRowRequest {
|
|
142
142
|
pub(crate) schema_key: String,
|
|
143
|
-
pub(crate)
|
|
144
|
-
pub(crate)
|
|
143
|
+
pub(crate) branch_id: String,
|
|
144
|
+
pub(crate) entity_pk: EntityPk,
|
|
145
145
|
pub(crate) file_id: NullableKeyFilter<String>,
|
|
146
146
|
}
|
package/package.json
CHANGED
|
@@ -1,69 +1,72 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
2
|
+
"name": "@lix-js/sdk",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.6.0-preview.5",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"dist-engine-src",
|
|
10
|
+
"SKILL.md"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./sqlite": {
|
|
18
|
+
"types": "./dist/sqlite/index.d.ts",
|
|
19
|
+
"default": "./dist/sqlite/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"description": "WASM-backed JS SDK wrapper for Lix",
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=22"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"better-sqlite3": "^12.9.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependenciesMeta": {
|
|
30
|
+
"better-sqlite3": {
|
|
31
|
+
"optional": true
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"better-sqlite3": "^12.10.0",
|
|
36
|
+
"typescript": "^5.5.4",
|
|
37
|
+
"vitest": "^4.0.18"
|
|
38
|
+
},
|
|
39
|
+
"nx": {
|
|
40
|
+
"targets": {
|
|
41
|
+
"build": {
|
|
42
|
+
"inputs": [
|
|
43
|
+
"default",
|
|
44
|
+
"^default",
|
|
45
|
+
"publicEnv",
|
|
46
|
+
"nodeVersion",
|
|
47
|
+
"platform",
|
|
48
|
+
"{workspaceRoot}/Cargo.toml",
|
|
49
|
+
"{workspaceRoot}/Cargo.lock",
|
|
50
|
+
"{workspaceRoot}/packages/engine/**/*",
|
|
51
|
+
"{workspaceRoot}/packages/rs-sdk/**/*",
|
|
52
|
+
"{workspaceRoot}/packages/js-sdk/Cargo.toml",
|
|
53
|
+
"{workspaceRoot}/packages/js-sdk/wasm-bindgen.rs"
|
|
54
|
+
],
|
|
55
|
+
"outputs": [
|
|
56
|
+
"{projectRoot}/dist",
|
|
57
|
+
"{projectRoot}/dist-engine-src",
|
|
58
|
+
"{projectRoot}/src/engine-wasm/wasm"
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"scripts": {
|
|
64
|
+
"build": "node ./scripts/build.js",
|
|
65
|
+
"sync:builtin-schemas": "node ./scripts/sync-builtin-schemas.js",
|
|
66
|
+
"sync:engine-src": "node ./scripts/sync-engine-src.js",
|
|
67
|
+
"typecheck": "pnpm run sync:builtin-schemas && tsc -p tsconfig.json --noEmit",
|
|
68
|
+
"test": "node ./scripts/build.js && vitest run",
|
|
69
|
+
"test:watch": "node ./scripts/build.js && vitest",
|
|
70
|
+
"format": "prettier --write --ignore-unknown ."
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
#[derive(Debug, Clone, PartialEq, Eq, Default)]
|
|
2
|
-
pub struct BytePage {
|
|
3
|
-
bytes: Vec<u8>,
|
|
4
|
-
offsets: Vec<u32>,
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
impl BytePage {
|
|
8
|
-
pub fn new() -> Self {
|
|
9
|
-
Self {
|
|
10
|
-
bytes: Vec::new(),
|
|
11
|
-
offsets: vec![0],
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
pub fn len(&self) -> usize {
|
|
16
|
-
self.offsets.len().saturating_sub(1)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
pub fn is_empty(&self) -> bool {
|
|
20
|
-
self.len() == 0
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
pub fn get(&self, index: usize) -> Option<&[u8]> {
|
|
24
|
-
let start = usize::try_from(*self.offsets.get(index)?).ok()?;
|
|
25
|
-
let end = usize::try_from(*self.offsets.get(index + 1)?).ok()?;
|
|
26
|
-
self.bytes.get(start..end)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
pub fn iter(&self) -> BytePageIter<'_> {
|
|
30
|
-
BytePageIter {
|
|
31
|
-
page: self,
|
|
32
|
-
index: 0,
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
pub struct BytePageIter<'a> {
|
|
38
|
-
page: &'a BytePage,
|
|
39
|
-
index: usize,
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
impl<'a> Iterator for BytePageIter<'a> {
|
|
43
|
-
type Item = &'a [u8];
|
|
44
|
-
|
|
45
|
-
fn next(&mut self) -> Option<Self::Item> {
|
|
46
|
-
let value = self.page.get(self.index)?;
|
|
47
|
-
self.index += 1;
|
|
48
|
-
Some(value)
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
#[derive(Debug, Clone, PartialEq, Eq, Default)]
|
|
53
|
-
pub struct BytePageBuilder {
|
|
54
|
-
bytes: Vec<u8>,
|
|
55
|
-
offsets: Vec<u32>,
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
impl BytePageBuilder {
|
|
59
|
-
pub fn new() -> Self {
|
|
60
|
-
Self {
|
|
61
|
-
bytes: Vec::new(),
|
|
62
|
-
offsets: vec![0],
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
pub fn with_capacity(items: usize, bytes: usize) -> Self {
|
|
67
|
-
let mut offsets = Vec::with_capacity(items.saturating_add(1));
|
|
68
|
-
offsets.push(0);
|
|
69
|
-
Self {
|
|
70
|
-
bytes: Vec::with_capacity(bytes),
|
|
71
|
-
offsets,
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
pub fn from_page(page: BytePage) -> Self {
|
|
76
|
-
Self {
|
|
77
|
-
bytes: page.bytes,
|
|
78
|
-
offsets: page.offsets,
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
pub fn len(&self) -> usize {
|
|
83
|
-
self.offsets.len().saturating_sub(1)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
pub fn is_empty(&self) -> bool {
|
|
87
|
-
self.len() == 0
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
pub fn get(&self, index: usize) -> Option<&[u8]> {
|
|
91
|
-
let start = usize::try_from(*self.offsets.get(index)?).ok()?;
|
|
92
|
-
let end = usize::try_from(*self.offsets.get(index + 1)?).ok()?;
|
|
93
|
-
self.bytes.get(start..end)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
pub fn push(&mut self, value: impl AsRef<[u8]>) {
|
|
97
|
-
let value = value.as_ref();
|
|
98
|
-
self.bytes.extend_from_slice(value);
|
|
99
|
-
let end = u32::try_from(self.bytes.len()).expect("byte page exceeds u32 offset capacity");
|
|
100
|
-
self.offsets.push(end);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
pub fn finish(self) -> BytePage {
|
|
104
|
-
BytePage {
|
|
105
|
-
bytes: self.bytes,
|
|
106
|
-
offsets: self.offsets,
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/// Ordered byte range for backend KV scans.
|
|
112
|
-
///
|
|
113
|
-
/// Ranges are half-open: `start <= key < end`. `Prefix` is explicit because it
|
|
114
|
-
/// is a common access pattern and lets each backend choose the safest
|
|
115
|
-
/// implementation for its storage engine.
|
|
116
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
117
|
-
pub enum BackendKvScanRange {
|
|
118
|
-
Prefix(Vec<u8>),
|
|
119
|
-
Range { start: Vec<u8>, end: Vec<u8> },
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
impl BackendKvScanRange {
|
|
123
|
-
pub fn prefix(prefix: impl Into<Vec<u8>>) -> Self {
|
|
124
|
-
Self::Prefix(prefix.into())
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
pub fn range(start: impl Into<Vec<u8>>, end: impl Into<Vec<u8>>) -> Self {
|
|
128
|
-
Self::Range {
|
|
129
|
-
start: start.into(),
|
|
130
|
-
end: end.into(),
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
136
|
-
pub struct BackendKvGetRequest {
|
|
137
|
-
pub groups: Vec<BackendKvGetGroup>,
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
141
|
-
pub struct BackendKvGetGroup {
|
|
142
|
-
pub namespace: String,
|
|
143
|
-
pub keys: Vec<Vec<u8>>,
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
impl BackendKvGetGroup {
|
|
147
|
-
pub fn namespace(&self) -> &str {
|
|
148
|
-
&self.namespace
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
153
|
-
pub struct BackendKvValueBatch {
|
|
154
|
-
pub groups: Vec<BackendKvValueGroup>,
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
158
|
-
pub struct BackendKvValueGroup {
|
|
159
|
-
namespace: String,
|
|
160
|
-
values: BytePage,
|
|
161
|
-
present: Vec<bool>,
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
impl BackendKvValueGroup {
|
|
165
|
-
pub fn new(namespace: impl Into<String>, values: BytePage, present: Vec<bool>) -> Self {
|
|
166
|
-
assert_eq!(
|
|
167
|
-
values.len(),
|
|
168
|
-
present.len(),
|
|
169
|
-
"backend value batch must have one value slot per presence bit"
|
|
170
|
-
);
|
|
171
|
-
Self {
|
|
172
|
-
namespace: namespace.into(),
|
|
173
|
-
values,
|
|
174
|
-
present,
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
pub fn namespace(&self) -> &str {
|
|
179
|
-
&self.namespace
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
pub fn len(&self) -> usize {
|
|
183
|
-
self.present.len()
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
pub fn is_empty(&self) -> bool {
|
|
187
|
-
self.present.is_empty()
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
pub fn value(&self, index: usize) -> Option<Option<&[u8]>> {
|
|
191
|
-
let present = *self.present.get(index)?;
|
|
192
|
-
if present {
|
|
193
|
-
Some(Some(
|
|
194
|
-
self.values
|
|
195
|
-
.get(index)
|
|
196
|
-
.expect("backend value batch invariant violated"),
|
|
197
|
-
))
|
|
198
|
-
} else {
|
|
199
|
-
Some(None)
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
pub fn values_iter(&self) -> impl Iterator<Item = Option<&[u8]>> {
|
|
204
|
-
(0..self.len()).filter_map(|index| self.value(index))
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
pub fn into_parts(self) -> (String, BytePage, Vec<bool>) {
|
|
208
|
-
(self.namespace, self.values, self.present)
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
213
|
-
pub struct BackendKvExistsBatch {
|
|
214
|
-
pub groups: Vec<BackendKvExistsGroup>,
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
218
|
-
pub struct BackendKvExistsGroup {
|
|
219
|
-
pub namespace: String,
|
|
220
|
-
pub exists: Vec<bool>,
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
224
|
-
pub struct BackendKvScanRequest {
|
|
225
|
-
pub namespace: String,
|
|
226
|
-
pub range: BackendKvScanRange,
|
|
227
|
-
pub after: Option<Vec<u8>>,
|
|
228
|
-
pub limit: usize,
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
232
|
-
pub struct BackendKvKeyPage {
|
|
233
|
-
pub keys: BytePage,
|
|
234
|
-
pub resume_after: Option<Vec<u8>>,
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
238
|
-
pub struct BackendKvValuePage {
|
|
239
|
-
pub values: BytePage,
|
|
240
|
-
pub resume_after: Option<Vec<u8>>,
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
244
|
-
pub struct BackendKvEntryPage {
|
|
245
|
-
pub keys: BytePage,
|
|
246
|
-
pub values: BytePage,
|
|
247
|
-
pub resume_after: Option<Vec<u8>>,
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
impl BackendKvEntryPage {
|
|
251
|
-
pub fn len(&self) -> usize {
|
|
252
|
-
self.keys.len()
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
pub fn is_empty(&self) -> bool {
|
|
256
|
-
self.keys.is_empty()
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
pub fn key(&self, index: usize) -> Option<&[u8]> {
|
|
260
|
-
self.keys.get(index)
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
pub fn value(&self, index: usize) -> Option<&[u8]> {
|
|
264
|
-
self.values.get(index)
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
#[derive(Debug, Clone, PartialEq, Eq, Default)]
|
|
269
|
-
pub struct BackendKvWriteBatch {
|
|
270
|
-
pub groups: Vec<BackendKvWriteGroup>,
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
274
|
-
pub struct BackendKvWriteGroup {
|
|
275
|
-
namespace: String,
|
|
276
|
-
put_keys: BytePageBuilder,
|
|
277
|
-
put_values: BytePageBuilder,
|
|
278
|
-
deletes: BytePageBuilder,
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
impl BackendKvWriteGroup {
|
|
282
|
-
pub fn new(namespace: impl Into<String>) -> Self {
|
|
283
|
-
Self {
|
|
284
|
-
namespace: namespace.into(),
|
|
285
|
-
put_keys: BytePageBuilder::new(),
|
|
286
|
-
put_values: BytePageBuilder::new(),
|
|
287
|
-
deletes: BytePageBuilder::new(),
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
pub fn from_pages(
|
|
292
|
-
namespace: impl Into<String>,
|
|
293
|
-
put_keys: BytePage,
|
|
294
|
-
put_values: BytePage,
|
|
295
|
-
deletes: BytePage,
|
|
296
|
-
) -> Self {
|
|
297
|
-
assert_eq!(
|
|
298
|
-
put_keys.len(),
|
|
299
|
-
put_values.len(),
|
|
300
|
-
"backend write batch must have one value per put key"
|
|
301
|
-
);
|
|
302
|
-
Self {
|
|
303
|
-
namespace: namespace.into(),
|
|
304
|
-
put_keys: BytePageBuilder::from_page(put_keys),
|
|
305
|
-
put_values: BytePageBuilder::from_page(put_values),
|
|
306
|
-
deletes: BytePageBuilder::from_page(deletes),
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
pub fn put(&mut self, key: impl AsRef<[u8]>, value: impl AsRef<[u8]>) {
|
|
311
|
-
self.put_keys.push(key);
|
|
312
|
-
self.put_values.push(value);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
pub fn delete(&mut self, key: impl AsRef<[u8]>) {
|
|
316
|
-
self.deletes.push(key);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
pub fn namespace(&self) -> &str {
|
|
320
|
-
&self.namespace
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
pub fn put_count(&self) -> usize {
|
|
324
|
-
self.put_keys.len()
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
pub fn delete_count(&self) -> usize {
|
|
328
|
-
self.deletes.len()
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
pub fn put_key(&self, index: usize) -> Option<&[u8]> {
|
|
332
|
-
self.put_keys.get(index)
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
pub fn put_value(&self, index: usize) -> Option<&[u8]> {
|
|
336
|
-
self.put_values.get(index)
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
pub fn delete_key(&self, index: usize) -> Option<&[u8]> {
|
|
340
|
-
self.deletes.get(index)
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
pub fn into_parts(self) -> (String, BytePage, BytePage, BytePage) {
|
|
344
|
-
(
|
|
345
|
-
self.namespace,
|
|
346
|
-
self.put_keys.finish(),
|
|
347
|
-
self.put_values.finish(),
|
|
348
|
-
self.deletes.finish(),
|
|
349
|
-
)
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
|
|
354
|
-
pub struct BackendKvWriteStats {
|
|
355
|
-
pub puts: usize,
|
|
356
|
-
pub deletes: usize,
|
|
357
|
-
pub bytes_written: usize,
|
|
358
|
-
}
|