diff --git a/CHANGELOG.md b/CHANGELOG.md index 45f67b6..90d6917 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to the published WIP Rust crates are documented here. ## Unreleased +## 0.2.0 + +- Adds public Text View `Token`/`TokenKind`, `tokenize_object`, + `tokenize_interface`, and delimiter-free `to_plain_text`. Direct rendering uses + the same token generation path; HTML and terminal-color renderers are not included. +- Makes Client Interface caches scope-lifetime-aware, invalidates observations on + confirmed binding loss, and retains immutable contexts for in-flight calls. + - Adds `wip-text-view`, an independent single-entity Object/Interface signature library with Protocol validation, typed errors, full ordered declarations, documentation summaries and safe Text View quoting/escapes. No path, lookup, diff --git a/Cargo.lock b/Cargo.lock index cab6078..dc8a9b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1235,7 +1235,7 @@ checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" [[package]] name = "wip-client" -version = "0.1.0" +version = "0.2.0" dependencies = [ "wip-http", "wip-protocol", @@ -1243,7 +1243,7 @@ dependencies = [ [[package]] name = "wip-fs-server" -version = "0.1.0" +version = "0.2.0" dependencies = [ "http", "rustix 1.1.5", @@ -1256,7 +1256,7 @@ dependencies = [ [[package]] name = "wip-host" -version = "0.1.0" +version = "0.2.0" dependencies = [ "trybuild", "wip-interface", @@ -1265,7 +1265,7 @@ dependencies = [ [[package]] name = "wip-http" -version = "0.1.0" +version = "0.2.0" dependencies = [ "base64 0.22.1", "http", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "wip-interface" -version = "0.1.0" +version = "0.2.0" dependencies = [ "trybuild", "wip-interface-macros", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "wip-interface-macros" -version = "0.1.0" +version = "0.2.0" dependencies = [ "proc-macro2", "quote", @@ -1295,11 +1295,11 @@ dependencies = [ [[package]] name = "wip-protocol" -version = "0.1.0" +version = "0.2.0" [[package]] name = "wip-public-api-example" -version = "0.1.0" +version = "0.2.0" dependencies = [ "wip-client", "wip-host", @@ -1310,14 +1310,14 @@ dependencies = [ [[package]] name = "wip-text-view" -version = "0.1.0" +version = "0.2.0" dependencies = [ "wip-protocol", ] [[package]] name = "wip-tui" -version = "0.1.0" +version = "0.2.0" dependencies = [ "base64 0.22.1", "crossterm", diff --git a/Cargo.toml b/Cargo.toml index 5855ad8..85236ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,18 +3,18 @@ members = ["crates/*"] resolver = "3" [workspace.package] -version = "0.1.0" +version = "0.2.0" edition = "2024" rust-version = "1.88" license = "MIT OR Apache-2.0" repository = "https://gitea.hareworks.net/Hare/wip-rs" [workspace.dependencies] -wip-client = { version = "0.1.0", path = "crates/wip-client" } -wip-fs-server = { version = "0.1.0", path = "crates/wip-fs-server" } -wip-host = { version = "0.1.0", path = "crates/wip-host" } -wip-http = { version = "0.1.0", path = "crates/wip-http" } -wip-interface = { version = "0.1.0", path = "crates/wip-interface" } -wip-interface-macros = { version = "0.1.0", path = "crates/wip-interface-macros" } -wip-protocol = { version = "0.1.0", path = "crates/wip-protocol" } -wip-text-view = { version = "0.1.0", path = "crates/wip-text-view" } +wip-client = { version = "0.2.0", path = "crates/wip-client" } +wip-fs-server = { version = "0.2.0", path = "crates/wip-fs-server" } +wip-host = { version = "0.2.0", path = "crates/wip-host" } +wip-http = { version = "0.2.0", path = "crates/wip-http" } +wip-interface = { version = "0.2.0", path = "crates/wip-interface" } +wip-interface-macros = { version = "0.2.0", path = "crates/wip-interface-macros" } +wip-protocol = { version = "0.2.0", path = "crates/wip-protocol" } +wip-text-view = { version = "0.2.0", path = "crates/wip-text-view" } diff --git a/MIGRATION.md b/MIGRATION.md index 389461e..1c25ebe 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -1,6 +1,6 @@ # Structured Interface reference and scope publication migration -This unreleased API/wire change follows `wip-reference` canonical Core Model, +The 0.2.0 API/wire change follows `wip-reference` canonical Core Model, Protocol and WIP over HTTP at `6086f3c5ef10aa1464ce9c824750d7f667217bfd`. It replaces the earlier opaque Interface reference contract; HTTP routes and error codes have **not** changed. Peers must upgrade together: the codec does diff --git a/README.md b/README.md index 30962f0..d1f2306 100644 --- a/README.md +++ b/README.md @@ -58,13 +58,13 @@ wip-public-api-example | `wip-tui` | Keyboard-only interactive Worldspace tree, selected Entry and qualified operation panes, descriptor-driven argument editing, bounded result/diagnostic rendering, terminal lifecycle, and HTTP I/O workers over `wip-client`. | Independent cache/validator semantics, automatic operation retries, Host internals, backend paths, or persistent state. | | `wip-interface` | The public `WipType`/`interface` authoring API, Rust-to-protocol codecs, generated descriptors, and typed implementation dispatch. | Object publication, backend lifetime, or transport policy. | | `wip-interface-macros` | Procedural-macro expansion used by `wip-interface`. It is not an application dependency. | A supported direct user API. | -| `wip-host` | Opaque interface registration, explicit object membership, validator checks, interface-qualified dispatch against one host-owned instance, and descriptor-guided argument decoding inside that same resolution boundary. | Backend atomicity, global object lookup, or network serving. | +| `wip-host` | Scoped interface registration and publication lifetimes, explicit object membership, validator checks, interface-qualified dispatch against one host-owned instance, and descriptor-guided argument decoding inside that same resolution boundary. | Backend atomicity, global object lookup, or network serving. | | `wip-fs-server` | Linux directory-handle-confined request-time projection, complete depth-bounded observations and bounded file operations, standard `wip-http` dispatch, and a loopback HTTP binary. | A new wire profile, implicit symlink following, non-loopback cleartext, authentication policy, TLS termination, or filesystem-wide preregistration. | | `wip-public-api-example` | An independently compiled consumer of the protocol, authoring, and host public crates. Its DTOs and traits are application-owned; its implementation and backend handle remain host-private. | Reusable library API or a production server. | ## Published crates -The `0.1.0` release consists of these six crates: +The `0.2.0` release consists of these seven crates: - `wip-protocol` - `wip-interface-macros` — implementation dependency re-exported by `wip-interface` @@ -72,9 +72,10 @@ The `0.1.0` release consists of these six crates: - `wip-host` - `wip-http` - `wip-client` +- `wip-text-view` -The unreleased workspace also adds [`wip-text-view`](crates/wip-text-view/README.md) -as a seventh public library. Its `render_object(&Object)` API needs no path; +The [`wip-text-view`](crates/wip-text-view/README.md) library's +`render_object(&Object)` API needs no path; `render_interface(&Interface)` takes one borrowed entity pairing the complete structured reference with its descriptor, without changing Protocol wire fields. Both return one complete plain-text signature or a typed error. @@ -92,7 +93,7 @@ or application traits. ## Structured Interface references -The unreleased Protocol/HTTP API uses explicit `InterfaceReference { scope, +The 0.2.0 Protocol/HTTP API uses explicit `InterfaceReference { scope, name }` records and optional `scope_ref` observation/precondition metadata. Legacy opaque-string wire references are rejected. See [MIGRATION.md](MIGRATION.md) for construction examples, validation boundaries and downstream migration status. diff --git a/RELEASING.md b/RELEASING.md index b291079..61a068b 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,6 +1,6 @@ # Releasing -The seven public crates in the current workspace (including the unreleased `wip-text-view`) use one version and must be released in dependency order. The filesystem server, terminal client, and public-API example set `publish = false` and are never uploaded. +The seven public crates in the current workspace (including `wip-text-view`) use one version and must be released in dependency order. The filesystem server, terminal client, and public-API example set `publish = false` and are never uploaded. ## Preconditions @@ -71,8 +71,8 @@ Registry propagation can take time. A dependent dry-run reporting that a WIP cra After all seven uploads resolve successfully, tag the exact published commit and push the tag: ```console -git tag -a v0.1.0 -m "release: 0.1.0" -git push origin v0.1.0 +git tag -a v0.2.0 -m "chore: release 0.2.0" +git push origin v0.2.0 ``` Do not move or recreate a published version or its tag. Prepare a new version for any subsequent correction. diff --git a/crates/wip-client/README.md b/crates/wip-client/README.md index 45dfe63..59cfa91 100644 --- a/crates/wip-client/README.md +++ b/crates/wip-client/README.md @@ -6,7 +6,7 @@ Presentation-independent stateful runtime for Web Interface Protocol (WIP) clien ```toml [dependencies] -wip-client = "0.1.0" +wip-client = "0.2.0" ``` Applications provide the HTTP adapter and presentation layer, send each prepared request exactly as owned by the runtime, then return the corresponding response for completion. diff --git a/crates/wip-host/README.md b/crates/wip-host/README.md index 9de0d58..b8b5184 100644 --- a/crates/wip-host/README.md +++ b/crates/wip-host/README.md @@ -6,11 +6,11 @@ Framework-independent Host publication and operation dispatch for the Web Interf ```toml [dependencies] -wip-host = "0.1.0" -wip-interface = "0.1.0" +wip-host = "0.2.0" +wip-interface = "0.2.0" ``` -Protocol publication and dispatch use `wip_protocol::InterfaceReference { scope, name }` and compare both fields exactly. The legacy `InterfaceRef` registration token remains Host-private: `protocol_reference()` maps its opaque string verbatim to the name at root scope `/`, without parsing it. Registry lookup and fetch accept structured references; non-root references do not resolve legacy registrations. Legacy responses omit `scope_ref`. +Protocol publication and dispatch use `wip_protocol::InterfaceReference { scope, name }` and compare both fields exactly. Registration takes an explicit `Scope` and local name; `InterfaceRef::protocol_reference()` preserves those coordinates without parsing display text. Providers attach a current `ScopeObservation` inside the coherent backend boundary, and fetch returns its optional Object ref as `scope_ref`. Calls check a supplied `scope_ref` against that current binding; omission adds no identity precondition. Retire a Scope on Object deletion, replacement or movement; retained registry artifacts alone do not establish publication. Malformed interface-reference shapes fail calls as `InvalidRequest` before object resolution. A well-shaped reference outside the target path's ancestor-or-self scope fails at the membership check as `InterfaceMismatch`. diff --git a/crates/wip-http/README.md b/crates/wip-http/README.md index 6f15409..bd5482e 100644 --- a/crates/wip-http/README.md +++ b/crates/wip-http/README.md @@ -6,7 +6,7 @@ The crate maps the three WIP Core interactions to fixed HTTP routes and strict U ```toml [dependencies] -wip-http = "0.1.0" +wip-http = "0.2.0" ``` ```rust diff --git a/crates/wip-interface/README.md b/crates/wip-interface/README.md index ab7eda1..e6a1cbc 100644 --- a/crates/wip-interface/README.md +++ b/crates/wip-interface/README.md @@ -6,7 +6,7 @@ The crate re-exports `#[interface]` and `#[derive(WipType)]`, generates Interfac ```toml [dependencies] -wip-interface = "0.1.0" +wip-interface = "0.2.0" ``` ```rust diff --git a/crates/wip-protocol/README.md b/crates/wip-protocol/README.md index 8a0026d..02f841a 100644 --- a/crates/wip-protocol/README.md +++ b/crates/wip-protocol/README.md @@ -6,7 +6,7 @@ This crate defines the canonical Object and Interface Descriptor models, the thr ```toml [dependencies] -wip-protocol = "0.1.0" +wip-protocol = "0.2.0" ``` Interface identity is an exact `InterfaceReference { scope, name }` pair. @@ -16,7 +16,7 @@ and Object/interaction validation at response boundaries. Fetching needs no target Object path. Fetch responses and interface call targets carry optional opaque string `scope_ref` metadata, not a third identity field. Descriptors do not embed identity. See the repository's [migration guide](../../MIGRATION.md) -for the breaking Rust and HTTP wire changes and deferred consumer semantics. +for the breaking Rust and HTTP wire changes and consumer migration guidance. See the [API documentation](https://docs.rs/wip-protocol) for the complete model and validation rules. diff --git a/crates/wip-text-view/README.md b/crates/wip-text-view/README.md index 17d0a68..a0ddb76 100644 --- a/crates/wip-text-view/README.md +++ b/crates/wip-text-view/README.md @@ -5,6 +5,12 @@ Standalone Object and Interface signature rendering for WIP Text View, following `3-protocol.md`. Only `wip-protocol` and the Rust standard library are dependencies. No Client, Host, HTTP I/O, cache, UI framework or retrieval service is required. +```toml +[dependencies] +wip-text-view = "0.2.0" +wip-protocol = "0.2.0" +``` + ## Single-entity API ```rust