From 089fe992ae54c398107afc3db5fd3d26080139f9 Mon Sep 17 00:00:00 2001 From: Owais Jamil Date: Fri, 17 Jul 2026 20:49:26 -0500 Subject: [PATCH] build: clean up the crates --- Cargo.lock | 71 ++------------- Cargo.toml | 16 +--- ROADMAP.md | 39 ++++----- TODO.md | 17 ++-- crates/inkfinite-cli/Cargo.toml | 17 ++-- .../src/bin/generate-bindings.rs | 22 ++--- .../src/{main.rs => bin/inkfinite-cli.rs} | 0 .../Cargo.toml | 10 ++- .../lib.rs => inkfinite-core/src/crdt/mod.rs} | 8 +- .../src => inkfinite-core/src/crdt}/tests.rs | 12 ++- .../src/engine/mod.rs} | 87 ++++++++++--------- .../src/engine}/tests.rs | 18 ++-- .../src/file}/migration.rs | 10 +-- .../lib.rs => inkfinite-core/src/file/mod.rs} | 8 +- .../src/file}/persistence.rs | 10 +-- .../src => inkfinite-core/src/file}/tests.rs | 37 ++++---- crates/inkfinite-core/src/ipc/mod.rs | 4 + .../src/lib.rs | 11 ++- .../src/proto/mod.rs} | 2 +- .../src/render/mod.rs} | 2 +- .../tests/bindings.rs | 6 +- crates/inkfinite-engine/Cargo.toml | 20 ----- crates/inkfinite-file/Cargo.toml | 21 ----- crates/inkfinite-ipc/Cargo.toml | 15 ---- crates/inkfinite-ipc/src/lib.rs | 4 - crates/inkfinite-model/Cargo.toml | 16 ---- crates/inkfinite-protocol/Cargo.toml | 17 ---- crates/inkfinite-render-svg/Cargo.toml | 14 --- fixtures/v2/shape-registry.json | 2 +- package.json | 4 +- packages/bindings/src/index.ts | 2 +- packages/bindings/src/model.ts | 2 +- packages/bindings/src/protocol.ts | 2 +- packages/bindings/src/registry.ts | 2 +- packages/bindings/src/transaction.ts | 2 +- 35 files changed, 181 insertions(+), 349 deletions(-) rename crates/{inkfinite-protocol => inkfinite-cli}/src/bin/generate-bindings.rs (98%) rename crates/inkfinite-cli/src/{main.rs => bin/inkfinite-cli.rs} (100%) rename crates/{inkfinite-crdt => inkfinite-core}/Cargo.toml (59%) rename crates/{inkfinite-crdt/src/lib.rs => inkfinite-core/src/crdt/mod.rs} (99%) rename crates/{inkfinite-crdt/src => inkfinite-core/src/crdt}/tests.rs (94%) rename crates/{inkfinite-engine/src/lib.rs => inkfinite-core/src/engine/mod.rs} (97%) rename crates/{inkfinite-engine/src => inkfinite-core/src/engine}/tests.rs (98%) rename crates/{inkfinite-file/src => inkfinite-core/src/file}/migration.rs (98%) rename crates/{inkfinite-file/src/lib.rs => inkfinite-core/src/file/mod.rs} (93%) rename crates/{inkfinite-file/src => inkfinite-core/src/file}/persistence.rs (99%) rename crates/{inkfinite-file/src => inkfinite-core/src/file}/tests.rs (90%) create mode 100644 crates/inkfinite-core/src/ipc/mod.rs rename crates/{inkfinite-model => inkfinite-core}/src/lib.rs (99%) rename crates/{inkfinite-protocol/src/lib.rs => inkfinite-core/src/proto/mod.rs} (99%) rename crates/{inkfinite-render-svg/src/lib.rs => inkfinite-core/src/render/mod.rs} (50%) rename crates/{inkfinite-protocol => inkfinite-core}/tests/bindings.rs (97%) delete mode 100644 crates/inkfinite-engine/Cargo.toml delete mode 100644 crates/inkfinite-file/Cargo.toml delete mode 100644 crates/inkfinite-ipc/Cargo.toml delete mode 100644 crates/inkfinite-ipc/src/lib.rs delete mode 100644 crates/inkfinite-model/Cargo.toml delete mode 100644 crates/inkfinite-protocol/Cargo.toml delete mode 100644 crates/inkfinite-render-svg/Cargo.toml diff --git a/Cargo.lock b/Cargo.lock index f073f82..828be20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1835,86 +1835,25 @@ dependencies = [ name = "inkfinite-cli" version = "0.0.0" dependencies = [ - "inkfinite-engine", - "inkfinite-file", - "inkfinite-ipc", - "inkfinite-model", - "inkfinite-protocol", - "inkfinite-render-svg", -] - -[[package]] -name = "inkfinite-crdt" -version = "0.0.0" -dependencies = [ - "automerge", - "inkfinite-model", - "serde", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "inkfinite-engine" -version = "0.0.0" -dependencies = [ - "inkfinite-crdt", - "inkfinite-model", - "inkfinite-protocol", - "proptest", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "inkfinite-file" -version = "0.0.0" -dependencies = [ - "inkfinite-crdt", - "inkfinite-engine", - "inkfinite-model", - "inkfinite-protocol", - "serde", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "inkfinite-ipc" -version = "0.0.0" -dependencies = [ - "inkfinite-engine", - "inkfinite-protocol", -] - -[[package]] -name = "inkfinite-model" -version = "0.0.0" -dependencies = [ + "inkfinite-core", "schemars 1.2.1", - "serde", "serde_json", "ts-rs", ] [[package]] -name = "inkfinite-protocol" +name = "inkfinite-core" version = "0.0.0" dependencies = [ - "inkfinite-model", + "automerge", + "proptest", "schemars 1.2.1", "serde", "serde_json", + "thiserror 2.0.18", "ts-rs", ] -[[package]] -name = "inkfinite-render-svg" -version = "0.0.0" -dependencies = [ - "inkfinite-model", -] - [[package]] name = "ipnet" version = "2.12.0" diff --git a/Cargo.toml b/Cargo.toml index 56dce46..509786f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,13 +2,7 @@ members = [ "apps/desktop/src-tauri", "crates/inkfinite-cli", - "crates/inkfinite-crdt", - "crates/inkfinite-engine", - "crates/inkfinite-file", - "crates/inkfinite-ipc", - "crates/inkfinite-model", - "crates/inkfinite-protocol", - "crates/inkfinite-render-svg", + "crates/inkfinite-core", ] resolver = "2" @@ -20,13 +14,7 @@ version = "0.0.0" [workspace.dependencies] automerge = "=0.10.0" -inkfinite-crdt = { path = "crates/inkfinite-crdt" } -inkfinite-engine = { path = "crates/inkfinite-engine" } -inkfinite-file = { path = "crates/inkfinite-file" } -inkfinite-ipc = { path = "crates/inkfinite-ipc" } -inkfinite-model = { path = "crates/inkfinite-model" } -inkfinite-protocol = { path = "crates/inkfinite-protocol" } -inkfinite-render-svg = { path = "crates/inkfinite-render-svg" } +inkfinite-core = { path = "crates/inkfinite-core" } schemars = "1.2.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/ROADMAP.md b/ROADMAP.md index 33ad4d5..76b6136 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -93,20 +93,14 @@ patch for the frontend's read-only document mirror. ### Crate and package boundaries -| Unit | Responsibility | -| ---------------------- | ------------------------------------------------------------------------ | -| `inkfinite-model` | IDs, records, semantic metadata, versions, schema/binding generation | -| `inkfinite-crdt` | Automerge mapping, heads, merge, sync, compaction, materialization | -| `inkfinite-engine` | Transactions, inverse operations, validation, queries, layout, revisions | -| `inkfinite-file` | Import, migration, atomic saves, locking, recovery, export | -| `inkfinite-protocol` | Serializable Tauri, CLI, and IPC requests and responses | -| `inkfinite-render-svg` | Deterministic headless rendering of built-in shapes | -| `inkfinite-ipc` | Authenticated local-socket server and client | -| `inkfinite-cli` | `clap`, formatting, exit codes, and calls into shared crates | -| `editor-runtime` | Framework-neutral tools, camera, selection, and previews | -| `renderer-canvas` | Svelte-independent Canvas 2D renderer | -| `input-dom` | Browser input normalization | -| `bindings` | Generated TypeScript records; never hand-edited | +| Unit | Responsibility | +| ------------------ | ----------------------------------------------------------------------- | +| `inkfinite-core` | Document model and engine plus CRDT, file, protocol, rendering, and IPC | +| `inkfinite-cli` | `clap`, formatting, exit codes, and calls into shared Rust code | +| `editor-runtime` | Framework-neutral tools, camera, selection, and previews | +| `renderer-canvas` | Svelte-independent Canvas 2D renderer | +| `input-dom` | Browser input normalization | +| `bindings` | Generated TypeScript records; never hand-edited | Business logic must not depend on Tauri, Svelte, CLI parsing, or a transport. @@ -135,8 +129,8 @@ V2-02 completed this gate on July 17, 2026. The proof exchanged compact files between Rust and JavaScript, converged offline edits independent of merge order, and validated deterministic hierarchy repair before adoption. Automerge passed, so Yjs/Yrs was not evaluated. V2-05 moved the reusable Rust coverage into -`inkfinite-crdt` and `inkfinite-engine`, then removed the disposable proof. The -measurements below preserve the architecture-gate evidence. +`inkfinite-core::crdt` and the transaction engine, then removed the disposable +proof. The measurements below preserve the architecture-gate evidence. On the V2-01 Apple M1 reference machine, the 3.98 MB, 10,000-shape JSON fixture produced a 211 KB compact Rust document. Rust import, load, and save took 1.76 s, @@ -153,7 +147,7 @@ cross-language tests passed without changing the Inkfinite proof boundary. Production code depends on the Inkfinite-owned CRDT contracts rather than Automerge types, so changes to Automerge's low-level API remain isolated. -V2-06 completed on July 17, 2026. `inkfinite-model` and `inkfinite-protocol` +V2-06 completed on July 17, 2026. `inkfinite-core`'s root model and `proto` module derive Schemars and `ts-rs` bindings from the Rust records. The binding generator writes document, transaction, and protocol schemas under `schemas/` and bindings under `packages/bindings/src/`. Its `--check` mode fails @@ -166,10 +160,10 @@ hit test for the frozen 10,000-shape board. The V1 medians are 0.61 ms and 0.22 ms. V2-11 may add a spatial index only if its linear query path misses the 1 ms budget. -V2-07 completed on July 17, 2026. inkfinite-file imports the frozen v1 desktop -and web envelopes into normalized pages, default layers, scene containers, -bindings, styles, and deterministic draw order. It writes compact canonical -Automerge files through same-directory temporary files, flushes before +V2-07 completed on July 17, 2026. `inkfinite-core::file` imports the frozen v1 +desktop and web envelopes into normalized pages, default layers, scene +containers, bindings, styles, and deterministic draw order. It writes compact +canonical Automerge files through same-directory temporary files, flushes before replacement, holds advisory locks, and retains bounded recovery snapshots plus encoded change journals across failed writes. JSON export is deterministic and history-free, as documented in [docs/v2-file-format.md](docs/v2-file-format.md). @@ -450,7 +444,8 @@ recovery prompts, and release migrations. ## Risks and open questions - Automerge's Rust API is lower-level than its JavaScript API. The architecture - gate must contain it inside `inkfinite-crdt`; Yjs/Yrs is the defined fallback. + gate must contain it inside `inkfinite-core::crdt`; Yjs/Yrs is the defined + fallback. - Concurrent hierarchy edits can violate referential invariants. Repair rules need property-based convergence tests before the v2 schema is frozen. - CRDT history, freehand strokes, assets, and large boards may raise memory and diff --git a/TODO.md b/TODO.md index f98bc4b..daa9c6e 100644 --- a/TODO.md +++ b/TODO.md @@ -142,7 +142,7 @@ Acceptance criteria: checks run on a fork before an atomic commit. - [x] Undo and redo emit actor-scoped compensating changes and preserve intervening edits from other actors. -- [x] Production `inkfinite-crdt` tests absorb the reusable V2-02 cases for +- [x] Production `inkfinite-core::crdt` tests absorb the reusable V2-02 cases for nested data, patches, heads, actor IDs, undo, fork repair, convergence, transport-independent sync, save/load, compaction, and 10,000 shapes. Preserve the measured benchmark result, then remove @@ -156,7 +156,7 @@ Acceptance criteria: Verification: ```sh -cargo test -p inkfinite-engine -p inkfinite-crdt +cargo test -p inkfinite-core test ! -d spikes/crdt-automerge ``` @@ -179,12 +179,12 @@ Acceptance criteria: Verification: -- `cargo run -p inkfinite-protocol --bin generate-bindings` generates the +- `cargo run -p inkfinite-cli --bin generate-bindings` generates the schemas, bindings, and shared fixture. Running it again leaves the generated files unchanged. -- `cargo run -p inkfinite-protocol --bin generate-bindings -- --check` fails +- `cargo run -p inkfinite-cli --bin generate-bindings -- --check` fails when any generated artifact is stale. -- `cargo test -p inkfinite-model -p inkfinite-protocol` runs the Rust registry +- `cargo test -p inkfinite-core` runs the Rust registry and shared-fixture conformance tests. - `pnpm --filter bindings test` typechecks the bindings and runs the TypeScript fixture conformance test. @@ -211,7 +211,7 @@ Acceptance criteria: Verification: ```sh -cargo test -p inkfinite-file +cargo test -p inkfinite-core file:: ``` ## Milestone 3: Desktop vertical slice @@ -409,7 +409,7 @@ Acceptance criteria: Verification: ```sh -cargo test -p inkfinite-render-svg +cargo test -p inkfinite-core render:: ``` ### V2-15: Ship read-only and schema CLI commands @@ -485,7 +485,8 @@ Acceptance criteria: Verification: ```sh -cargo test -p inkfinite-ipc -p inkfinite-cli -p desktop +cargo test -p inkfinite-core ipc:: +cargo test -p inkfinite-cli -p desktop ``` ### V2-18: Add reviewable agent proposals and explicit apply diff --git a/crates/inkfinite-cli/Cargo.toml b/crates/inkfinite-cli/Cargo.toml index 3f437d5..c09e8f2 100644 --- a/crates/inkfinite-cli/Cargo.toml +++ b/crates/inkfinite-cli/Cargo.toml @@ -8,16 +8,17 @@ version.workspace = true [[bin]] name = "inkfinite" -path = "src/main.rs" +path = "src/bin/inkfinite-cli.rs" + +[[bin]] +name = "generate-bindings" +path = "src/bin/generate-bindings.rs" [dependencies] -inkfinite-engine.workspace = true -inkfinite-file.workspace = true -inkfinite-ipc.workspace = true -inkfinite-model.workspace = true -inkfinite-protocol.workspace = true -inkfinite-render-svg.workspace = true +inkfinite-core.workspace = true +schemars.workspace = true +serde_json.workspace = true +ts-rs.workspace = true [lints] workspace = true - diff --git a/crates/inkfinite-protocol/src/bin/generate-bindings.rs b/crates/inkfinite-cli/src/bin/generate-bindings.rs similarity index 98% rename from crates/inkfinite-protocol/src/bin/generate-bindings.rs rename to crates/inkfinite-cli/src/bin/generate-bindings.rs index b7aaaf0..859e07e 100644 --- a/crates/inkfinite-protocol/src/bin/generate-bindings.rs +++ b/crates/inkfinite-cli/src/bin/generate-bindings.rs @@ -5,7 +5,13 @@ use std::error::Error; use std::fs; use std::path::{Path, PathBuf}; -use inkfinite_model::{ +use inkfinite_core::proto::{ + AffectedRegion, AssetPatch, Bounds, CommitResult, DocumentPatch, DocumentPath, InverseMetadata, + LayerContentsDisposition, LayerPatch, LayoutAxis, Operation, Proposal, ProposalId, + ProtocolError, Query, QueryResult, RecordId, Request, Response, SaveResult, SessionId, + ShapeAlignment, ShapePatch, TransactionDraft, TransactionId, Warning, +}; +use inkfinite_core::{ ActorId, AssetId, AssetRecord, AssetSource, BindingAnchor, BindingId, BindingKind, BindingRecord, ChangeHash, ContainerLayout, Document, DocumentId, DocumentSnapshot, FormatId, GEOMETRY_BOUNDS, GEOMETRY_COORDINATE_SYSTEM, GEOMETRY_ROTATION, Insets, LayerId, LayerRecord, @@ -13,12 +19,6 @@ use inkfinite_model::{ SemanticMetadata, ShapeId, ShapeKind, ShapeParent, ShapeRecord, ShapeStyle, SiblingAnchor, StackDirection, Timestamp, Transform, Vec2, builtin_shape_kinds, validate_shape_properties, }; -use inkfinite_protocol::{ - AffectedRegion, AssetPatch, Bounds, CommitResult, DocumentPatch, DocumentPath, InverseMetadata, - LayerContentsDisposition, LayerPatch, LayoutAxis, Operation, Proposal, ProposalId, - ProtocolError, Query, QueryResult, RecordId, Request, Response, SaveResult, SessionId, - ShapeAlignment, ShapePatch, TransactionDraft, TransactionId, Warning, -}; use schemars::JsonSchema; use serde_json::{Value, json}; use ts_rs::{Config, TS}; @@ -27,7 +27,7 @@ const RECTANGLE_KIND: &str = "rect"; const GENERATED_TS_HEADER: &str = concat!( "// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.\n", - "// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-protocol --bin generate-bindings`.\n\n", + "// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-cli --bin generate-bindings`.\n\n", ); const GENERATED_JSON_COMMENT: &str = @@ -293,7 +293,7 @@ fn fixture_json() -> Result> { .collect::>(); let fixture = json!({ - "_generated_by": "cargo run -p inkfinite-protocol --bin generate-bindings", + "_generated_by": "cargo run -p inkfinite-cli --bin generate-bindings", "_do_not_edit": true, "format": "inkfinite.shape-registry-fixture", "version": 1, @@ -318,8 +318,8 @@ fn fixture_json() -> Result> { Ok(format!("{}\n", serde_json::to_string_pretty(&fixture)?)) } -fn fixture_shape() -> inkfinite_model::ShapeRecord { - inkfinite_model::ShapeRecord { +fn fixture_shape() -> inkfinite_core::ShapeRecord { + inkfinite_core::ShapeRecord { id: ShapeId::from("shape:fixture"), kind: ShapeKind::from("rect"), parent: ShapeParent::Layer(LayerId::from("layer:fixture")), diff --git a/crates/inkfinite-cli/src/main.rs b/crates/inkfinite-cli/src/bin/inkfinite-cli.rs similarity index 100% rename from crates/inkfinite-cli/src/main.rs rename to crates/inkfinite-cli/src/bin/inkfinite-cli.rs diff --git a/crates/inkfinite-crdt/Cargo.toml b/crates/inkfinite-core/Cargo.toml similarity index 59% rename from crates/inkfinite-crdt/Cargo.toml rename to crates/inkfinite-core/Cargo.toml index 261912a..4a5b78a 100644 --- a/crates/inkfinite-crdt/Cargo.toml +++ b/crates/inkfinite-core/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "inkfinite-crdt" -description = "Project-owned CRDT contracts for Inkfinite documents" +name = "inkfinite-core" +description = "Shared document contracts and services for Inkfinite" edition.workspace = true license.workspace = true rust-version.workspace = true @@ -8,10 +8,14 @@ version.workspace = true [dependencies] automerge.workspace = true -inkfinite-model.workspace = true +schemars.workspace = true serde.workspace = true serde_json.workspace = true +ts-rs.workspace = true thiserror.workspace = true +[dev-dependencies] +proptest = "1.7" + [lints] workspace = true diff --git a/crates/inkfinite-crdt/src/lib.rs b/crates/inkfinite-core/src/crdt/mod.rs similarity index 99% rename from crates/inkfinite-crdt/src/lib.rs rename to crates/inkfinite-core/src/crdt/mod.rs index 209d7b1..2b22f5d 100644 --- a/crates/inkfinite-crdt/src/lib.rs +++ b/crates/inkfinite-core/src/crdt/mod.rs @@ -4,16 +4,16 @@ use std::str::FromStr; +use crate::{ + ActorId, ChangeHash, Document, DocumentId, DocumentSnapshot, FormatId, INKFINITE_FORMAT_ID, + INKFINITE_FORMAT_VERSION, +}; use automerge::sync::{State as AutomergeSyncState, SyncDoc}; use automerge::transaction::{CommitOptions, Transactable}; use automerge::{ ActorId as AutomergeActorId, AutoCommit, AutoSerde, Change, ObjId, ObjType, ROOT, ReadDoc, ScalarValue, }; -use inkfinite_model::{ - ActorId, ChangeHash, Document, DocumentId, DocumentSnapshot, FormatId, INKFINITE_FORMAT_ID, - INKFINITE_FORMAT_VERSION, -}; use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; use thiserror::Error; diff --git a/crates/inkfinite-crdt/src/tests.rs b/crates/inkfinite-core/src/crdt/tests.rs similarity index 94% rename from crates/inkfinite-crdt/src/tests.rs rename to crates/inkfinite-core/src/crdt/tests.rs index 3753b8f..4693914 100644 --- a/crates/inkfinite-crdt/src/tests.rs +++ b/crates/inkfinite-core/src/crdt/tests.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use inkfinite_model::{ActorId, Document, DocumentId, ShapeId, ShapeProperties}; +use crate::{ActorId, Document, DocumentId, ShapeId, ShapeProperties}; use serde_json::json; use super::{AutomergeDocument, AutomergeSyncSession, CrdtDocument, SyncSession}; @@ -54,9 +54,7 @@ fn changes_and_transport_independent_sync_converge() { let mut right = AutomergeDocument::load(&bytes, ActorId::from("actor:right")).unwrap(); let base = left.heads(); let mut changed = empty_document(); - changed - .page_ids - .push(inkfinite_model::PageId::from("page:one")); + changed.page_ids.push(crate::PageId::from("page:one")); left.commit_document(&changed, "add page id").unwrap(); assert_eq!(left.changes_since(&base).unwrap().len(), 1); @@ -108,12 +106,12 @@ fn ten_thousand_shape_projection_round_trips() { assert_eq!(loaded.snapshot().unwrap().document, document); } -fn crate_test_shape(index: u32) -> inkfinite_model::ShapeRecord { - use inkfinite_model::{ +fn crate_test_shape(index: u32) -> crate::ShapeRecord { + use crate::{ LayerId, Opacity, Origin, Provenance, RecordVersion, SemanticMetadata, ShapeKind, ShapeParent, ShapeStyle, Timestamp, Transform, Vec2, }; - inkfinite_model::ShapeRecord { + crate::ShapeRecord { id: ShapeId::new(format!("shape:{index:05}")), kind: ShapeKind::from("rect"), parent: ShapeParent::Layer(LayerId::from("layer:one")), diff --git a/crates/inkfinite-engine/src/lib.rs b/crates/inkfinite-core/src/engine/mod.rs similarity index 97% rename from crates/inkfinite-engine/src/lib.rs rename to crates/inkfinite-core/src/engine/mod.rs index 1b447e8..1fb5c6f 100644 --- a/crates/inkfinite-engine/src/lib.rs +++ b/crates/inkfinite-core/src/engine/mod.rs @@ -5,22 +5,22 @@ use std::cmp::Ordering; use std::collections::{BTreeMap, BTreeSet}; -use inkfinite_crdt::{AutomergeDocument, CrdtError, EncodedChange}; -use inkfinite_model::{ - ActorId, AssetId, BindingId, ChangeHash, ContainerLayout, Document, DocumentId, LayerId, - Origin, PageId, RecordVersion, ShapeId, ShapeParent, ShapeProperties, ShapeRecord, - SiblingAnchor, -}; -use inkfinite_protocol::{ +use crate::crdt::{AutomergeDocument, CrdtError, EncodedChange}; +use crate::proto::{ AffectedRegion, AssetPatch, Bounds, DocumentPatch, InverseMetadata, LayerContentsDisposition, LayerPatch, LayoutAxis, Operation, Query, QueryResult, RecordId, ShapeAlignment, ShapePatch, TransactionId, Warning, }; +use crate::{ + ActorId, AssetId, BindingId, ChangeHash, ContainerLayout, Document, DocumentId, LayerId, + Origin, PageId, RecordVersion, ShapeId, ShapeParent, ShapeProperties, ShapeRecord, + SiblingAnchor, +}; use thiserror::Error; -pub use inkfinite_crdt::CrdtDocument; -pub use inkfinite_model::DocumentSnapshot; -pub use inkfinite_protocol::{CommitResult, TransactionDraft}; +pub use crate::DocumentSnapshot; +pub use crate::crdt::CrdtDocument; +pub use crate::proto::{CommitResult, TransactionDraft}; /// Recoverable rejection from transaction, merge, validation, or query processing. #[derive(Debug, Error)] @@ -61,11 +61,11 @@ struct HistoryEntry { #[derive(Clone, Default)] struct ExpectedRecords { - pages: BTreeMap, - layers: BTreeMap, + pages: BTreeMap, + layers: BTreeMap, shapes: BTreeMap, - bindings: BTreeMap, - assets: BTreeMap, + bindings: BTreeMap, + assets: BTreeMap, } /// Rust-owned document state plus actor-scoped undo and redo metadata. @@ -382,7 +382,7 @@ impl TransactionEngine { base_heads: self.crdt.heads(), description: format!("{action} actor transaction"), operations, - timestamp: inkfinite_model::Timestamp(self.history_sequence.cast_signed()), + timestamp: crate::Timestamp(self.history_sequence.cast_signed()), } } } @@ -831,8 +831,8 @@ fn merge_shape_compensation( current: &ShapeRecord, ) -> Result<(), EngineError> { if let Some(before) = patch.transform { - patch.transform = Some(inkfinite_model::Transform { - translation: inkfinite_model::Vec2 { + patch.transform = Some(crate::Transform { + translation: crate::Vec2 { x: merge_history_value( &before.translation.x, &expected.transform.translation.x, @@ -921,7 +921,7 @@ fn merge_shape_compensation( patch.metadata = Some(merged); } if let Some(before) = patch.style { - patch.style = Some(inkfinite_model::ShapeStyle { + patch.style = Some(crate::ShapeStyle { opacity: merge_history_value( &before.opacity, &expected.style.opacity, @@ -1160,7 +1160,7 @@ fn apply_operation( binding_id, expected_version, } => { - let binding = inkfinite_model::BindingRecord { + let binding = crate::BindingRecord { version: RecordVersion(1), ..binding(document, binding_id, *expected_version)?.clone() }; @@ -1185,7 +1185,7 @@ fn apply_operation( asset_id, expected_version, } => { - let asset = inkfinite_model::AssetRecord { + let asset = crate::AssetRecord { version: RecordVersion(1), ..asset(document, asset_id, *expected_version)?.clone() }; @@ -1383,7 +1383,7 @@ fn delete_page( .flat_map(|layer_id| descendant_ids_for_layer(document, layer_id)) .collect(); let mut inverse = vec![Operation::CreatePage { - page: inkfinite_model::PageRecord { + page: crate::PageRecord { layer_ids: Vec::new(), version: RecordVersion(1), ..page.clone() @@ -1449,7 +1449,7 @@ fn delete_layer( } let root_ids = layer.shape_ids.clone(); let mut inverse = vec![Operation::CreateLayer { - layer: inkfinite_model::LayerRecord { + layer: crate::LayerRecord { shape_ids: Vec::new(), version: RecordVersion(1), ..layer.clone() @@ -1482,7 +1482,7 @@ fn delete_layer( } LayerContentsDisposition::Delete => { let mut inverse = vec![Operation::CreateLayer { - layer: inkfinite_model::LayerRecord { + layer: crate::LayerRecord { shape_ids: Vec::new(), version: RecordVersion(1), ..layer.clone() @@ -1505,7 +1505,7 @@ fn delete_layer( fn remove_layer_record( document: &mut Document, - layer: &inkfinite_model::LayerRecord, + layer: &crate::LayerRecord, ) -> Result<(), EngineError> { let page = document .pages @@ -1587,7 +1587,7 @@ fn append_binding_restoration( || shape_ids.contains(&binding.target_shape_id) { operations.push(Operation::CreateBinding { - binding: inkfinite_model::BindingRecord { + binding: crate::BindingRecord { version: RecordVersion(1), ..binding.clone() }, @@ -1884,9 +1884,9 @@ pub fn validate_document(document: &Document) -> Result<(), EngineError> { } fn validate_shape_schema(shape: &ShapeRecord) -> Result<(), EngineError> { - inkfinite_model::validate_shape_properties(shape.kind.as_str(), &shape.properties) + crate::validate_shape_properties(shape.kind.as_str(), &shape.properties) .map_err(|error| EngineError::Schema(format!("shape {}: {error}", shape.id)))?; - if shape.kind.as_str() != inkfinite_model::CONTAINER_KIND + if shape.kind.as_str() != crate::CONTAINER_KIND && (!shape.child_ids.is_empty() || shape.layout.is_some()) { return Err(EngineError::Schema(format!( @@ -1947,7 +1947,7 @@ fn validate_shape_schema(shape: &ShapeRecord) -> Result<(), EngineError> { fn validate_layout_numbers( shape: &ShapeRecord, gap: f64, - padding: &inkfinite_model::Insets, + padding: &crate::Insets, ) -> Result<(), EngineError> { if ![ gap, @@ -2016,18 +2016,19 @@ pub fn repair_document(document: &mut Document) -> Result, EngineEr layers.dedup(); if layers.is_empty() { let layer_id = LayerId::new(format!("layer:recovered:{}", page_id.as_str())); - document.layers.entry(layer_id.clone()).or_insert_with(|| { - inkfinite_model::LayerRecord { + document + .layers + .entry(layer_id.clone()) + .or_insert_with(|| crate::LayerRecord { id: layer_id.clone(), page_id: page_id.clone(), name: "Recovered".into(), shape_ids: Vec::new(), visible: true, locked: false, - opacity: inkfinite_model::Opacity::OPAQUE, + opacity: crate::Opacity::OPAQUE, version: RecordVersion(1), - } - }); + }); layers.push(layer_id.clone()); warnings.push(warning( "recovered_layer", @@ -2481,7 +2482,7 @@ fn world_shape_bounds(document: &Document, shape_id: &ShapeId) -> Bounds { bounds } -fn transformed_bounds(width: f64, height: f64, transform: inkfinite_model::Transform) -> Bounds { +fn transformed_bounds(width: f64, height: f64, transform: crate::Transform) -> Bounds { let cos = transform.rotation.cos(); let sin = transform.rotation.sin(); let points = [(0.0, 0.0), (width, 0.0), (0.0, height), (width, height)].map(|(x, y)| { @@ -2611,7 +2612,7 @@ fn ensure_acyclic(document: &Document, start: &ShapeId) -> Result<(), EngineErro fn ensure_binding_endpoints( document: &Document, - binding: &inkfinite_model::BindingRecord, + binding: &crate::BindingRecord, ) -> Result<(), EngineError> { if !document.shapes.contains_key(&binding.source_shape_id) || !document.shapes.contains_key(&binding.target_shape_id) @@ -2671,7 +2672,7 @@ fn page<'a>( document: &'a Document, id: &PageId, expected: Option, -) -> Result<&'a inkfinite_model::PageRecord, EngineError> { +) -> Result<&'a crate::PageRecord, EngineError> { let value = document .pages .get(id) @@ -2683,7 +2684,7 @@ fn page_mut<'a>( document: &'a mut Document, id: &PageId, expected: Option, -) -> Result<&'a mut inkfinite_model::PageRecord, EngineError> { +) -> Result<&'a mut crate::PageRecord, EngineError> { let value = document .pages .get_mut(id) @@ -2695,7 +2696,7 @@ fn layer<'a>( document: &'a Document, id: &LayerId, expected: Option, -) -> Result<&'a inkfinite_model::LayerRecord, EngineError> { +) -> Result<&'a crate::LayerRecord, EngineError> { let value = document .layers .get(id) @@ -2707,7 +2708,7 @@ fn layer_mut<'a>( document: &'a mut Document, id: &LayerId, expected: Option, -) -> Result<&'a mut inkfinite_model::LayerRecord, EngineError> { +) -> Result<&'a mut crate::LayerRecord, EngineError> { let value = document .layers .get_mut(id) @@ -2743,7 +2744,7 @@ fn binding<'a>( document: &'a Document, id: &BindingId, expected: Option, -) -> Result<&'a inkfinite_model::BindingRecord, EngineError> { +) -> Result<&'a crate::BindingRecord, EngineError> { let value = document .bindings .get(id) @@ -2755,7 +2756,7 @@ fn asset<'a>( document: &'a Document, id: &AssetId, expected: Option, -) -> Result<&'a inkfinite_model::AssetRecord, EngineError> { +) -> Result<&'a crate::AssetRecord, EngineError> { let value = document .assets .get(id) @@ -2767,7 +2768,7 @@ fn asset_mut<'a>( document: &'a mut Document, id: &AssetId, expected: Option, -) -> Result<&'a mut inkfinite_model::AssetRecord, EngineError> { +) -> Result<&'a mut crate::AssetRecord, EngineError> { let value = document .assets .get_mut(id) @@ -2905,7 +2906,7 @@ fn remove_shape_child( fn containing_layer<'a>( document: &'a Document, shape: &ShapeRecord, -) -> Option<&'a inkfinite_model::LayerRecord> { +) -> Option<&'a crate::LayerRecord> { let mut parent = shape.parent.clone(); loop { match parent { diff --git a/crates/inkfinite-engine/src/tests.rs b/crates/inkfinite-core/src/engine/tests.rs similarity index 98% rename from crates/inkfinite-engine/src/tests.rs rename to crates/inkfinite-core/src/engine/tests.rs index d658528..7b384a5 100644 --- a/crates/inkfinite-engine/src/tests.rs +++ b/crates/inkfinite-core/src/engine/tests.rs @@ -2,17 +2,17 @@ use std::collections::BTreeMap; -use inkfinite_crdt::{AutomergeDocument, CrdtDocument}; -use inkfinite_model::{ +use crate::crdt::{AutomergeDocument, CrdtDocument}; +use crate::proto::{ + Bounds, LayerPatch, Operation, Query, ShapeAlignment, ShapePatch, TransactionDraft, + TransactionId, +}; +use crate::{ ActorId, BindingAnchor, BindingId, BindingKind, BindingRecord, Document, DocumentId, LayerId, LayerRecord, Opacity, Origin, PageId, PageRecord, Provenance, RecordVersion, SemanticMetadata, ShapeId, ShapeKind, ShapeParent, ShapeProperties, ShapeRecord, ShapeStyle, SiblingAnchor, Timestamp, Transform, Vec2, }; -use inkfinite_protocol::{ - Bounds, LayerPatch, Operation, Query, ShapeAlignment, ShapePatch, TransactionDraft, - TransactionId, -}; use proptest::prelude::*; use serde_json::json; @@ -379,7 +379,7 @@ fn layer_visual_changes_return_regions_and_deletes_honor_locked_descendants() { "delete locked content", vec![Operation::DeleteLayer { layer_id: LayerId::from("layer:one"), - contents: inkfinite_protocol::LayerContentsDisposition::Delete, + contents: crate::proto::LayerContentsDisposition::Delete, expected_version: Some(RecordVersion(1)), }], ); @@ -448,9 +448,7 @@ fn queries_bounds_alignment_and_distribution_share_the_transaction_engine() { let result = engine.query(&query).unwrap(); assert_eq!( result.records, - vec![inkfinite_protocol::RecordId::Shape(ShapeId::from( - "shape:a" - ))] + vec![crate::proto::RecordId::Shape(ShapeId::from("shape:a"))] ); let align = transaction( diff --git a/crates/inkfinite-file/src/migration.rs b/crates/inkfinite-core/src/file/migration.rs similarity index 98% rename from crates/inkfinite-file/src/migration.rs rename to crates/inkfinite-core/src/file/migration.rs index 80d5256..1171b4d 100644 --- a/crates/inkfinite-file/src/migration.rs +++ b/crates/inkfinite-core/src/file/migration.rs @@ -2,8 +2,8 @@ use std::collections::{BTreeMap, BTreeSet}; -use inkfinite_engine::{TransactionEngine, validate_document}; -use inkfinite_model::{ +use crate::engine::{TransactionEngine, validate_document}; +use crate::{ ActorId, BindingAnchor, BindingId, BindingKind, BindingRecord, Document, DocumentId, LayerId, LayerRecord, Opacity, Origin, PageId, PageRecord, Provenance, RecordVersion, SemanticMetadata, ShapeId, ShapeKind, ShapeParent, ShapeProperties, ShapeRecord, ShapeStyle, Timestamp, @@ -12,7 +12,7 @@ use inkfinite_model::{ use serde::Deserialize; use serde_json::{Map, Value}; -use crate::FileError; +use super::FileError; /// A normalized v2 document produced by importing a v1 JSON file. #[derive(Clone, Debug)] @@ -368,7 +368,7 @@ fn migrate(envelope: LegacyEnvelope, actor_id: &ActorId) -> Result Result Result { + ) -> Result { Ok(self.engine.commit(transaction)?) } diff --git a/crates/inkfinite-file/src/tests.rs b/crates/inkfinite-core/src/file/tests.rs similarity index 90% rename from crates/inkfinite-file/src/tests.rs rename to crates/inkfinite-core/src/file/tests.rs index 3f7794d..82bc226 100644 --- a/crates/inkfinite-file/src/tests.rs +++ b/crates/inkfinite-core/src/file/tests.rs @@ -3,12 +3,12 @@ use std::fs; use std::path::PathBuf; use std::sync::atomic::{AtomicU64, Ordering}; -use inkfinite_engine::TransactionDraft; -use inkfinite_model::{ +use crate::engine::TransactionDraft; +use crate::proto::{Operation, TransactionId}; +use crate::{ ActorId, Document, DocumentId, LayerId, LayerRecord, Opacity, Origin, PageId, PageRecord, RecordVersion, Timestamp, }; -use inkfinite_protocol::{Operation, TransactionId}; use serde_json::Value; use super::{ @@ -20,7 +20,7 @@ static TEST_COUNTER: AtomicU64 = AtomicU64::new(0); #[test] fn imports_all_valid_v1_features_into_normalized_v2_records() { - let input = include_str!("../../../fixtures/v1/desktop/all-features.inkfinite.json"); + let input = include_str!("../../../../fixtures/v1/desktop/all-features.inkfinite.json"); let imported = import_v1_json(input, ActorId::from("actor:test")).expect("fixture imports"); let source: Value = serde_json::from_str(input).expect("fixture JSON"); let document = &imported.document; @@ -35,7 +35,7 @@ fn imports_all_valid_v1_features_into_normalized_v2_records() { document .page_ids .iter() - .map(inkfinite_model::PageId::as_str) + .map(crate::PageId::as_str) .collect::>(), expected_page_ids ); @@ -91,23 +91,24 @@ fn imports_all_valid_v1_features_into_normalized_v2_records() { ); assert!(matches!( document.bindings[&"binding:arrow-start".into()].anchor, - inkfinite_model::BindingAnchor::Edge { x: 1.0, y: 0.0 } + crate::BindingAnchor::Edge { x: 1.0, y: 0.0 } )); assert!(matches!( document.bindings[&"binding:arrow-end".into()].anchor, - inkfinite_model::BindingAnchor::Center + crate::BindingAnchor::Center )); } #[test] fn imports_web_and_performance_v1_fixtures() { - let web = include_str!("../../../fixtures/v1/web/all-features.web.json"); + let web = include_str!("../../../../fixtures/v1/web/all-features.web.json"); let imported = import_v1_json(web, ActorId::from("actor:web")).expect("web fixture imports"); assert_eq!(imported.document.page_ids.len(), 2); assert_eq!(imported.document.layers.len(), 2); assert_eq!(imported.document.shapes.len(), 16); - let performance = include_str!("../../../fixtures/v1/performance/board-10000.inkfinite.json"); + let performance = + include_str!("../../../../fixtures/v1/performance/board-10000.inkfinite.json"); let imported = import_v1_json(performance, ActorId::from("actor:performance")) .expect("large fixture imports"); assert_eq!(imported.document.page_ids, vec![PageId::from("page:10000")]); @@ -125,10 +126,10 @@ fn imports_web_and_performance_v1_fixtures() { fn rejects_invalid_and_newer_inputs_before_persistence() { let actor = ActorId::from("actor:test"); let invalid_inputs = [ - include_str!("../../../fixtures/v1/invalid/malformed-json.inkfinite.json"), - include_str!("../../../fixtures/v1/invalid/missing-envelope-fields.json"), - include_str!("../../../fixtures/v1/invalid/dangling-references.inkfinite.json"), - include_str!("../../../fixtures/v1/invalid/duplicate-order.inkfinite.json"), + include_str!("../../../../fixtures/v1/invalid/malformed-json.inkfinite.json"), + include_str!("../../../../fixtures/v1/invalid/missing-envelope-fields.json"), + include_str!("../../../../fixtures/v1/invalid/dangling-references.inkfinite.json"), + include_str!("../../../../fixtures/v1/invalid/duplicate-order.inkfinite.json"), ]; for input in invalid_inputs { assert!( @@ -152,7 +153,7 @@ fn rejects_invalid_and_newer_inputs_before_persistence() { let destination = temporary.path.join("existing.inkfinite"); fs::write( &source, - include_str!("../../../fixtures/v1/invalid/duplicate-order.inkfinite.json"), + include_str!("../../../../fixtures/v1/invalid/duplicate-order.inkfinite.json"), ) .expect("write source"); fs::write(&destination, b"keep this file").expect("write destination"); @@ -166,7 +167,7 @@ fn rejects_invalid_and_newer_inputs_before_persistence() { #[test] fn canonical_sessions_lock_save_reopen_and_export_deterministically() { - let input = include_str!("../../../fixtures/v1/desktop/all-features.inkfinite.json"); + let input = include_str!("../../../../fixtures/v1/desktop/all-features.inkfinite.json"); let imported = import_v1_json(input, ActorId::from("actor:test")).expect("fixture imports"); let expected_document = imported.document.clone(); let temporary = TestDirectory::new(); @@ -200,7 +201,7 @@ fn canonical_sessions_lock_save_reopen_and_export_deterministically() { let canonical_bytes = fs::read(&canonical).expect("canonical bytes"); assert!(serde_json::from_slice::(&canonical_bytes).is_err()); - let exported: inkfinite_model::DocumentSnapshot = + let exported: crate::DocumentSnapshot = serde_json::from_str(&fs::read_to_string(&snapshot_json).expect("snapshot JSON")) .expect("snapshot parses"); assert_eq!(exported.document, expected_document); @@ -297,11 +298,11 @@ fn recovery_restores_journal_after_canonical_replace_failure() { ); } -fn flatten_shape_order(document: &Document, shape_ids: &[inkfinite_model::ShapeId]) -> Vec { +fn flatten_shape_order(document: &Document, shape_ids: &[crate::ShapeId]) -> Vec { let mut flattened = Vec::new(); for shape_id in shape_ids { if let Some(shape) = document.shapes.get(shape_id) { - if shape.kind.as_str() != inkfinite_model::CONTAINER_KIND { + if shape.kind.as_str() != crate::CONTAINER_KIND { flattened.push(shape_id.as_str().to_owned()); } flattened.extend(flatten_shape_order(document, &shape.child_ids)); diff --git a/crates/inkfinite-core/src/ipc/mod.rs b/crates/inkfinite-core/src/ipc/mod.rs new file mode 100644 index 0000000..bcbadda --- /dev/null +++ b/crates/inkfinite-core/src/ipc/mod.rs @@ -0,0 +1,4 @@ +//! Authenticated local IPC boundary. + +pub use crate::engine::{CommitResult, TransactionDraft}; +pub use crate::proto::{ProtocolError, Request, Response}; diff --git a/crates/inkfinite-model/src/lib.rs b/crates/inkfinite-core/src/lib.rs similarity index 99% rename from crates/inkfinite-model/src/lib.rs rename to crates/inkfinite-core/src/lib.rs index 44369ae..a127196 100644 --- a/crates/inkfinite-model/src/lib.rs +++ b/crates/inkfinite-core/src/lib.rs @@ -1,4 +1,13 @@ -//! Durable, transport-independent records for Inkfinite v2 documents. +//! Durable, transport-independent contracts and services for Inkfinite. + +#![forbid(unsafe_code)] + +pub mod crdt; +pub mod engine; +pub mod file; +pub mod ipc; +pub mod proto; +pub mod render; use std::collections::BTreeMap; use std::fmt; diff --git a/crates/inkfinite-protocol/src/lib.rs b/crates/inkfinite-core/src/proto/mod.rs similarity index 99% rename from crates/inkfinite-protocol/src/lib.rs rename to crates/inkfinite-core/src/proto/mod.rs index a53fa28..3ff1ee9 100644 --- a/crates/inkfinite-protocol/src/lib.rs +++ b/crates/inkfinite-core/src/proto/mod.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; -use inkfinite_model::{ +use crate::{ ActorId, AssetId, AssetRecord, BindingId, BindingRecord, ChangeHash, ContainerLayout, DocumentId, DocumentSnapshot, LayerId, LayerRecord, Opacity, Origin, PageId, PageRecord, RecordVersion, SemanticMetadata, ShapeId, ShapeParent, ShapeProperties, ShapeRecord, diff --git a/crates/inkfinite-render-svg/src/lib.rs b/crates/inkfinite-core/src/render/mod.rs similarity index 50% rename from crates/inkfinite-render-svg/src/lib.rs rename to crates/inkfinite-core/src/render/mod.rs index fe6d0bb..a9eb50b 100644 --- a/crates/inkfinite-render-svg/src/lib.rs +++ b/crates/inkfinite-core/src/render/mod.rs @@ -1,3 +1,3 @@ //! Deterministic SVG rendering boundary. -pub use inkfinite_model::DocumentSnapshot; +pub use crate::DocumentSnapshot; diff --git a/crates/inkfinite-protocol/tests/bindings.rs b/crates/inkfinite-core/tests/bindings.rs similarity index 97% rename from crates/inkfinite-protocol/tests/bindings.rs rename to crates/inkfinite-core/tests/bindings.rs index 867a299..377c105 100644 --- a/crates/inkfinite-protocol/tests/bindings.rs +++ b/crates/inkfinite-core/tests/bindings.rs @@ -1,8 +1,8 @@ -use inkfinite_model::{ +use inkfinite_core::proto::{Bounds, TransactionDraft}; +use inkfinite_core::{ GEOMETRY_BOUNDS, GEOMETRY_COORDINATE_SYSTEM, GEOMETRY_ROTATION, ShapeProperties, ShapeRecord, builtin_shape_kinds, validate_shape_properties, }; -use inkfinite_protocol::{Bounds, TransactionDraft}; use serde_json::Value; #[test] @@ -74,7 +74,7 @@ fn shared_shape_fixture_matches_the_rust_registry_and_bindings() { assert_bounds_close(actual, expected); } -fn transformed_bounds(width: f64, height: f64, transform: inkfinite_model::Transform) -> Bounds { +fn transformed_bounds(width: f64, height: f64, transform: inkfinite_core::Transform) -> Bounds { let cos = transform.rotation.cos(); let sin = transform.rotation.sin(); let points = [(0.0, 0.0), (width, 0.0), (0.0, height), (width, height)].map(|(x, y)| { diff --git a/crates/inkfinite-engine/Cargo.toml b/crates/inkfinite-engine/Cargo.toml deleted file mode 100644 index 0a55bfc..0000000 --- a/crates/inkfinite-engine/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "inkfinite-engine" -description = "Validated transaction engine for Inkfinite documents" -edition.workspace = true -license.workspace = true -rust-version.workspace = true -version.workspace = true - -[dependencies] -inkfinite-crdt.workspace = true -inkfinite-model.workspace = true -inkfinite-protocol.workspace = true -serde_json.workspace = true -thiserror.workspace = true - -[dev-dependencies] -proptest = "1.7" - -[lints] -workspace = true diff --git a/crates/inkfinite-file/Cargo.toml b/crates/inkfinite-file/Cargo.toml deleted file mode 100644 index cce9085..0000000 --- a/crates/inkfinite-file/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "inkfinite-file" -description = "Import, migration, and persistence boundary for Inkfinite" -edition.workspace = true -license.workspace = true -rust-version.workspace = true -version.workspace = true - -[dependencies] -inkfinite-crdt.workspace = true -inkfinite-engine.workspace = true -inkfinite-model.workspace = true -serde.workspace = true -serde_json.workspace = true -thiserror.workspace = true - -[dev-dependencies] -inkfinite-protocol.workspace = true - -[lints] -workspace = true diff --git a/crates/inkfinite-ipc/Cargo.toml b/crates/inkfinite-ipc/Cargo.toml deleted file mode 100644 index ba5eb28..0000000 --- a/crates/inkfinite-ipc/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "inkfinite-ipc" -description = "Local IPC boundary for Inkfinite" -edition.workspace = true -license.workspace = true -rust-version.workspace = true -version.workspace = true - -[dependencies] -inkfinite-engine.workspace = true -inkfinite-protocol.workspace = true - -[lints] -workspace = true - diff --git a/crates/inkfinite-ipc/src/lib.rs b/crates/inkfinite-ipc/src/lib.rs deleted file mode 100644 index 1b8a349..0000000 --- a/crates/inkfinite-ipc/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! Authenticated local IPC boundary. - -pub use inkfinite_engine::{CommitResult, TransactionDraft}; -pub use inkfinite_protocol::{ProtocolError, Request, Response}; diff --git a/crates/inkfinite-model/Cargo.toml b/crates/inkfinite-model/Cargo.toml deleted file mode 100644 index 87ac7e7..0000000 --- a/crates/inkfinite-model/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "inkfinite-model" -description = "Durable document records and identifiers for Inkfinite" -edition.workspace = true -license.workspace = true -rust-version.workspace = true -version.workspace = true - -[dependencies] -schemars.workspace = true -serde.workspace = true -serde_json.workspace = true -ts-rs.workspace = true - -[lints] -workspace = true diff --git a/crates/inkfinite-protocol/Cargo.toml b/crates/inkfinite-protocol/Cargo.toml deleted file mode 100644 index 1f7025e..0000000 --- a/crates/inkfinite-protocol/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "inkfinite-protocol" -description = "Transport-independent requests and responses for Inkfinite" -edition.workspace = true -license.workspace = true -rust-version.workspace = true -version.workspace = true - -[dependencies] -inkfinite-model.workspace = true -schemars.workspace = true -serde.workspace = true -serde_json.workspace = true -ts-rs.workspace = true - -[lints] -workspace = true diff --git a/crates/inkfinite-render-svg/Cargo.toml b/crates/inkfinite-render-svg/Cargo.toml deleted file mode 100644 index 98b44a6..0000000 --- a/crates/inkfinite-render-svg/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "inkfinite-render-svg" -description = "Deterministic SVG rendering boundary for Inkfinite" -edition.workspace = true -license.workspace = true -rust-version.workspace = true -version.workspace = true - -[dependencies] -inkfinite-model.workspace = true - -[lints] -workspace = true - diff --git a/fixtures/v2/shape-registry.json b/fixtures/v2/shape-registry.json index 6458aeb..3b89293 100644 --- a/fixtures/v2/shape-registry.json +++ b/fixtures/v2/shape-registry.json @@ -1,6 +1,6 @@ { "_do_not_edit": true, - "_generated_by": "cargo run -p inkfinite-protocol --bin generate-bindings", + "_generated_by": "cargo run -p inkfinite-cli --bin generate-bindings", "format": "inkfinite.shape-registry-fixture", "geometry": { "bounds": "axis_aligned_enclosing_bounds", diff --git a/package.json b/package.json index b548dd5..7a779fa 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "scripts": { "fixtures:v1": "node scripts/generate-v1-fixtures.mjs", "baseline:v1": "node scripts/capture-v1-performance.mjs --output fixtures/v1/performance/baseline.json", - "bindings:generate": "cargo run -p inkfinite-protocol --bin generate-bindings", - "bindings:check": "cargo run -p inkfinite-protocol --bin generate-bindings -- --check", + "bindings:generate": "cargo run -p inkfinite-cli --bin generate-bindings", + "bindings:check": "cargo run -p inkfinite-cli --bin generate-bindings -- --check", "bindings:test": "pnpm --filter bindings test" }, "devDependencies": { "dprint": "^0.50.2", "typescript": "^5.9.3" }, diff --git a/packages/bindings/src/index.ts b/packages/bindings/src/index.ts index ffa055e..8c2e220 100644 --- a/packages/bindings/src/index.ts +++ b/packages/bindings/src/index.ts @@ -1,5 +1,5 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-protocol --bin generate-bindings`. +// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-cli --bin generate-bindings`. export * from "./model.js"; export * from "./protocol.js"; diff --git a/packages/bindings/src/model.ts b/packages/bindings/src/model.ts index 656fb5d..a6a4a1c 100644 --- a/packages/bindings/src/model.ts +++ b/packages/bindings/src/model.ts @@ -1,5 +1,5 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-protocol --bin generate-bindings`. +// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-cli --bin generate-bindings`. export type JsonValue = number | string | boolean | Array | { [key in string]: JsonValue } | null; diff --git a/packages/bindings/src/protocol.ts b/packages/bindings/src/protocol.ts index 6acfcee..8389b53 100644 --- a/packages/bindings/src/protocol.ts +++ b/packages/bindings/src/protocol.ts @@ -1,5 +1,5 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-protocol --bin generate-bindings`. +// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-cli --bin generate-bindings`. import type { ActorId, ChangeHash, DocumentId, DocumentSnapshot, JsonValue, Origin } from "./model.js"; import type { CommitResult, DocumentPath, Proposal, ProposalId, Query, QueryResult, SaveResult, TransactionDraft } from "./transaction.js"; diff --git a/packages/bindings/src/registry.ts b/packages/bindings/src/registry.ts index dec4348..4c2bf65 100644 --- a/packages/bindings/src/registry.ts +++ b/packages/bindings/src/registry.ts @@ -1,5 +1,5 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-protocol --bin generate-bindings`. +// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-cli --bin generate-bindings`. import type { JsonValue, Transform } from "./model.js"; import type { Bounds } from "./transaction.js"; diff --git a/packages/bindings/src/transaction.ts b/packages/bindings/src/transaction.ts index 660f018..c73ef38 100644 --- a/packages/bindings/src/transaction.ts +++ b/packages/bindings/src/transaction.ts @@ -1,5 +1,5 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-protocol --bin generate-bindings`. +// Generated by Inkfinite's binding generator. Run `cargo run -p inkfinite-cli --bin generate-bindings`. import type { ActorId, AssetId, AssetRecord, BindingId, BindingRecord, ChangeHash, ContainerLayout, -- 2.51.2