diff --git a/CHANGELOG.md b/CHANGELOG.md index e44f0ae8..520c5436 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.0.0] - 2026-09-18 + ### Added - **`ConnectorBuilder::owns_scheme` — a connector may declare that it must be the @@ -971,7 +973,8 @@ This is an early release. Please report issues, suggest features, or contribute --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[2.0.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [1.1.0]: https://github.com/aimdb-dev/aimdb/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/aimdb-dev/aimdb/compare/v0.5.0...v1.0.0 [0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...v0.5.0 diff --git a/Cargo.lock b/Cargo.lock index 4c85e06e..acbe12ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ dependencies = [ [[package]] name = "aimdb-cli" -version = "0.6.0" +version = "0.7.0" dependencies = [ "aimdb-client", "aimdb-codegen", @@ -102,7 +102,7 @@ dependencies = [ [[package]] name = "aimdb-client" -version = "0.6.0" +version = "0.7.0" dependencies = [ "aimdb-core", "aimdb-serial-connector", @@ -121,7 +121,7 @@ dependencies = [ [[package]] name = "aimdb-codegen" -version = "0.2.0" +version = "0.3.0" dependencies = [ "prettyplease", "proc-macro2", @@ -133,10 +133,9 @@ dependencies = [ [[package]] name = "aimdb-core" -version = "1.2.0" +version = "2.0.0" dependencies = [ "aimdb-derive", - "anyhow", "async-channel", "defmt 1.1.1", "futures", @@ -157,7 +156,7 @@ dependencies = [ [[package]] name = "aimdb-data-contracts" -version = "0.4.0" +version = "0.2.0" dependencies = [ "aimdb-core", "aimdb-derive", @@ -171,7 +170,7 @@ dependencies = [ [[package]] name = "aimdb-derive" -version = "0.3.0" +version = "0.2.0" dependencies = [ "proc-macro2", "quote", @@ -180,7 +179,7 @@ dependencies = [ [[package]] name = "aimdb-embassy-adapter" -version = "0.6.0" +version = "0.7.0" dependencies = [ "aimdb-core", "critical-section", @@ -194,7 +193,6 @@ dependencies = [ "embassy-time-driver", "embedded-io-async 0.7.0", "futures", - "futures-core", "heapless 0.9.3", "rand 0.10.1", "tracing", @@ -228,11 +226,10 @@ dependencies = [ [[package]] name = "aimdb-mcp" -version = "0.8.0" +version = "0.9.0" dependencies = [ "aimdb-client", "aimdb-codegen", - "aimdb-core", "anyhow", "chrono", "clap", @@ -266,7 +263,6 @@ dependencies = [ "aimdb-embassy-adapter", "aimdb-mountain-mqtt", "aimdb-tokio-adapter", - "async-stream", "critical-section", "defmt 1.1.1", "embassy-futures 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -278,16 +274,12 @@ dependencies = [ "embedded-io-async 0.7.0", "embedded-tls", "futures", - "futures-core", - "futures-util", "heapless 0.8.0", "rand 0.8.6", - "rand_core 0.6.4", "rcgen", "rumqttc", "rustls-native-certs", "serde", - "thiserror 2.0.17", "tokio", "tokio-rustls", "tokio-test", @@ -296,7 +288,7 @@ dependencies = [ [[package]] name = "aimdb-persistence" -version = "0.1.1" +version = "0.2.0" dependencies = [ "aimdb-core", "aimdb-tokio-adapter", @@ -308,7 +300,7 @@ dependencies = [ [[package]] name = "aimdb-persistence-sqlite" -version = "0.1.1" +version = "0.2.0" dependencies = [ "aimdb-persistence", "rusqlite", @@ -371,7 +363,7 @@ dependencies = [ [[package]] name = "aimdb-tokio-adapter" -version = "0.6.0" +version = "0.7.0" dependencies = [ "aimdb-client", "aimdb-core", @@ -384,7 +376,6 @@ dependencies = [ "tokio", "tokio-test", "tokio-util", - "tracing", ] [[package]] @@ -419,7 +410,7 @@ dependencies = [ [[package]] name = "aimdb-websocket-connector" -version = "0.2.0" +version = "0.3.0" dependencies = [ "aimdb-core", "aimdb-data-contracts", @@ -2287,7 +2278,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hello-mailbox" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-sync", @@ -2297,7 +2288,7 @@ dependencies = [ [[package]] name = "hello-mailbox-async" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-tokio-adapter", @@ -2306,7 +2297,7 @@ dependencies = [ [[package]] name = "hello-single-latest" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-sync", @@ -2315,7 +2306,7 @@ dependencies = [ [[package]] name = "hello-single-latest-async" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-tokio-adapter", @@ -2324,7 +2315,7 @@ dependencies = [ [[package]] name = "hello-spmc-ring" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-sync", @@ -2333,7 +2324,7 @@ dependencies = [ [[package]] name = "hello-spmc-ring-async" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-tokio-adapter", @@ -3450,7 +3441,7 @@ dependencies = [ [[package]] name = "readme-quickstart" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-tokio-adapter", @@ -4201,7 +4192,7 @@ dependencies = [ [[package]] name = "sync-api-demo" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-sync", @@ -4421,7 +4412,7 @@ dependencies = [ [[package]] name = "tokio-knx-connector-demo" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-knx-connector", @@ -4448,7 +4439,7 @@ dependencies = [ [[package]] name = "tokio-mqtt-connector-demo" -version = "1.1.0" +version = "2.0.0" dependencies = [ "aimdb-core", "aimdb-data-contracts", diff --git a/Cargo.toml b/Cargo.toml index 707a6ecc..34ffbd3f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,7 +57,7 @@ default-members = ["aimdb-core"] debug = 2 [workspace.package] -version = "1.1.0" +version = "2.0.0" edition = "2021" # The compiler we build and test with, and so the only one we can honestly # promise consumers. Bump it together with rust-toolchain.toml. diff --git a/Makefile b/Makefile index 3be1a8ce..23d0e812 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ help: @printf " security Run all security checks (deny + audit)\n" @printf "\n" @printf " $(YELLOW)Release Management:$(NC)\n" - @printf " publish-check Test crates.io publish (dry-run, no git commit required)\n" + @printf " publish-check Dry-run the full publish set (no git commit required)\n" @printf " publish Publish all crates to crates.io (requires clean git state)\n" @printf "\n" @printf " $(YELLOW)WASM Commands:$(NC)\n" @@ -626,18 +626,26 @@ security: deny audit @printf "$(BLUE)✓ Known vulnerabilities checked$(NC)\n" ## Release Management commands +# Dry-runs the whole publish set, not one crate. Passing every package to a +# single `cargo publish` invocation lets Cargo resolve the workspace's internal +# `path` + `version` deps against the siblings being packaged alongside them, so +# a not-yet-published `aimdb-core 2.0.0` no longer fails the check — that needs +# Cargo >= 1.83, and the toolchain is pinned well above it. +# +# Two phases because `--no-verify` is per-invocation, not per-package: +# 1. package every crate (manifest, metadata, file list, version resolution) +# 2. verification-build the ones that compile on the host publish-check: - @printf "$(GREEN)Testing crates.io publish readiness...$(NC)\n" - @printf "$(YELLOW)Note: cargo package requires dependencies to exist on crates.io.$(NC)\n" - @printf "$(YELLOW) Only aimdb-derive (no deps) will fully validate before first publish.$(NC)\n" - @printf "$(YELLOW) This is expected behavior - actual publish will work in order.$(NC)\n" + @printf "$(GREEN)Testing crates.io publish readiness ($(words $(PUBLISH_ORDER)) crates)...$(NC)\n" + @printf "\n" + @printf "$(YELLOW) → Phase 1/2: packaging all $(words $(PUBLISH_ORDER)) crates (cross-resolved)$(NC)\n" + @cargo publish --dry-run --no-verify $(foreach p,$(PUBLISH_ORDER),-p $(p)) @printf "\n" - @printf "$(YELLOW) → Testing aimdb-derive (full validation)$(NC)\n" - @cargo publish --dry-run -p aimdb-derive - @printf "$(GREEN)✓ aimdb-derive is ready to publish!$(NC)\n" + @printf "$(YELLOW) → Phase 2/2: verification builds ($(words $(PUBLISH_VERIFIABLE)) crates)$(NC)\n" + @cargo publish --dry-run $(foreach p,$(PUBLISH_VERIFIABLE),-p $(p)) @printf "\n" - @printf "$(BLUE)ℹ Other crates cannot be fully validated until dependencies are published.$(NC)\n" - @printf "$(BLUE) Run 'make publish' to publish all crates in dependency order.$(NC)\n" + @printf "$(GREEN)✓ All $(words $(PUBLISH_ORDER)) crates are ready to publish!$(NC)\n" + @printf "$(BLUE)ℹ $(PUBLISH_HOST_UNBUILDABLE) was packaged but not verification-built (wasm32-only).$(NC)\n" # Topological publish order over normal + build dependencies (issue #242). # Verified against `cargo metadata`: every crate is listed after everything it @@ -666,6 +674,21 @@ PUBLISH_ORDER := \ aimdb-cli \ aimdb-mcp +# Crates `publish-check`'s verification phase leaves out, because +# `cargo publish` verifies on the host and these cannot build there. +# +# `aimdb-wasm-adapter`'s default `wasm-runtime` feature is a deliberate +# `compile_error!` off wasm32 (its web-sys bridge futures are !Send), so the +# host verification build can never succeed. Nothing in the workspace depends on +# it, so phase 1 still packages it — manifest, metadata and version resolution +# stay covered — and only the build is skipped. +# +# Narrower than PUBLISH_NO_VERIFY below on purpose: `aimdb-embassy-adapter` does +# verify on the host, and skips verification at publish time for an unrelated +# reason (see there). +PUBLISH_HOST_UNBUILDABLE := aimdb-wasm-adapter +PUBLISH_VERIFIABLE := $(filter-out $(PUBLISH_HOST_UNBUILDABLE),$(PUBLISH_ORDER)) + # Crates published without a verification build. # # `aimdb-embassy-adapter` needs embassy-sync's `poll_next_message` / diff --git a/aimdb-client/CHANGELOG.md b/aimdb-client/CHANGELOG.md index 123fb25f..502a829b 100644 --- a/aimdb-client/CHANGELOG.md +++ b/aimdb-client/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.7.0] - 2026-09-18 + ### Changed - **`tcp://` endpoint validation shares one grammar with the connector.** @@ -122,7 +124,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v0.6.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.7.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.6.0]: https://github.com/aimdb-dev/aimdb/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...v0.5.0 [0.4.0]: https://github.com/aimdb-dev/aimdb/compare/v0.3.0...v0.4.0 diff --git a/aimdb-client/Cargo.toml b/aimdb-client/Cargo.toml index 6548c24c..1f074b45 100644 --- a/aimdb-client/Cargo.toml +++ b/aimdb-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-client" -version = "0.6.0" +version = "0.7.0" edition = "2021" rust-version.workspace = true license.workspace = true @@ -26,7 +26,7 @@ transport-tcp = ["dep:aimdb-tcp-connector", "aimdb-tokio-adapter/net"] # Core dependencies - protocol types from aimdb-core. `connector-session` # exposes the shared session engine (`run_client`/`ClientHandle`) plus the AimX # codec that the engine-based client (`crate::engine`) builds on. -aimdb-core = { version = "1.1.0", path = "../aimdb-core", features = [ +aimdb-core = { version = "2.0.0", path = "../aimdb-core", features = [ "std", "connector-session", ] } @@ -50,7 +50,7 @@ tokio = { version = "1", features = ["net", "io-util", "macros", "fs"] } futures = { version = "0.3", default-features = false, features = ["alloc"] } # Supplies the `TimeOps` clock the engine-based client hands to `run_client` # (reconnect backoff / keepalive). This client always drives the engine on tokio. -aimdb-tokio-adapter = { version = "0.6.0", path = "../aimdb-tokio-adapter" } +aimdb-tokio-adapter = { version = "0.7.0", path = "../aimdb-tokio-adapter" } # Error handling anyhow = "1" diff --git a/aimdb-codegen/CHANGELOG.md b/aimdb-codegen/CHANGELOG.md index 66c07d04..2bece6d6 100644 --- a/aimdb-codegen/CHANGELOG.md +++ b/aimdb-codegen/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0] - 2026-09-18 + ### Added - **Issue #177 - generated postcard records now have a true into-slice codec.** @@ -20,7 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed (breaking) - Emitted task scaffolds now use `Producer` / `Consumer` (no `, TokioAdapter` second parameter) and emitted doc tables show the same form, matching the M14 cleanup in `aimdb-core` (Design 029). Regenerate downstream scaffolds after upgrading. -- Emitted `configure_schema` signature changed from `` to ``; emitted prelude now imports `aimdb_executor::RuntimeAdapter` instead of `Spawn` (Issue #88). Regenerate downstream schemas. +- Emitted `configure_schema` is no longer generic over the runtime: `fn configure_schema(builder: &mut AimDbBuilder)` (was ``), following the removal of `R` from core's object graph (Issue #131). The emitted prelude imports from `aimdb_core` only — the `aimdb_executor` import is gone with the crate (Issue #88, design 038 §3.1). Regenerate downstream schemas. ## [0.2.0] - 2026-05-22 diff --git a/aimdb-codegen/Cargo.toml b/aimdb-codegen/Cargo.toml index ee938734..aabbb6a4 100644 --- a/aimdb-codegen/Cargo.toml +++ b/aimdb-codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-codegen" -version = "0.2.0" +version = "0.3.0" edition = "2021" rust-version.workspace = true authors.workspace = true diff --git a/aimdb-core/CHANGELOG.md b/aimdb-core/CHANGELOG.md index eeb4387a..0938bf41 100644 --- a/aimdb-core/CHANGELOG.md +++ b/aimdb-core/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.0.0] - 2026-09-18 + ### Added - **`ByteStream::split`, with `ByteRead` / `ByteWrite`.** @@ -700,8 +702,8 @@ warning fires if you exceed 1000 interned keys. --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v1.2.0...HEAD -[1.2.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v1.2.0 +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[2.0.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [1.1.0]: https://github.com/aimdb-dev/aimdb/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/aimdb-dev/aimdb/compare/v0.5.0...v1.0.0 [0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...v0.5.0 diff --git a/aimdb-core/Cargo.toml b/aimdb-core/Cargo.toml index 574e72a5..ff2da3fd 100644 --- a/aimdb-core/Cargo.toml +++ b/aimdb-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-core" -version = "1.2.0" +version = "2.0.0" edition = "2021" rust-version.workspace = true license.workspace = true @@ -22,7 +22,6 @@ derive = ["aimdb-derive"] std = [ "alloc", # std includes alloc "serde", - "anyhow", "remote", # AimX remote access now rides the shared session engine: `with_remote_access` # builds the `session::aimx` server, so std pulls in the connector-session module. @@ -72,7 +71,7 @@ test-utils = ["std"] [dependencies] # Derive macros (optional) -aimdb-derive = { version = "0.3.0", path = "../aimdb-derive", optional = true } +aimdb-derive = { version = "0.2.0", path = "../aimdb-derive", optional = true } # Stream trait for bidirectional connectors (minimal, no_std compatible) futures-core = { version = "0.3", default-features = false } @@ -99,7 +98,6 @@ serde = { workspace = true, optional = true } # Error handling (thiserror 2.x is no_std-capable; DbError derives it on every target) thiserror = { version = "2.0.16", default-features = false } -anyhow = { workspace = true, optional = true } # `raw_value` lets the connector-session `EnvelopeCodec` splice an already- # serialized record-value `Payload` into a JSON envelope without re-escaping. # Only compiled when `serde_json` is pulled in (std / diff --git a/aimdb-data-contracts/CHANGELOG.md b/aimdb-data-contracts/CHANGELOG.md index 5ef68785..a0f0432e 100644 --- a/aimdb-data-contracts/CHANGELOG.md +++ b/aimdb-data-contracts/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.0] - 2026-09-18 + ### Changed (breaking) — Design 041: capability traits as first-class verbs - **`Simulatable` reshaped for compile-time-only simulation.** `simulate(config: &SimulationConfig, ...)` → `simulate(params: &Self::Params, ...)` with a new associated `type Params`. `SimulationConfig` (including its runtime `enabled` gate) and `SimulationParams` are removed; `SimProfile

{ interval_ms, params }` and off-the-shelf `RandomWalkParams` replace them (`type Params = RandomWalkParams` is the migration path for existing scalar-walk impls). `simulatable` now also requires `aimdb-core` (for the new `SimulatableRegistrarExt`) and `rand` drops the `std_rng` feature (RNG is always caller-supplied). diff --git a/aimdb-data-contracts/Cargo.toml b/aimdb-data-contracts/Cargo.toml index 43d2cc73..a80e4ba2 100644 --- a/aimdb-data-contracts/Cargo.toml +++ b/aimdb-data-contracts/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-data-contracts" -version = "0.4.0" +version = "0.2.0" edition.workspace = true rust-version.workspace = true authors.workspace = true @@ -45,14 +45,14 @@ postcard = { version = "1.0", default-features = false, features = [ # migration_chain! + #[derive(Linkable)] proc-macros (build-time only; no # target/runtime/no_std impact — see aimdb-derive). No cycle: aimdb-derive # emits token paths to this crate but does not depend on it. -aimdb-derive = { version = "0.3.0", path = "../aimdb-derive", optional = true } +aimdb-derive = { version = "0.2.0", path = "../aimdb-derive", optional = true } # Optional: shared by the `linkable`, `observable`, and `simulatable` registrar # ext traits (RecordRegistrar/RuntimeContext). 1.2.0 is the true minimum: the # `observable` feature's `.observe()` calls `RecordRegistrar::signal_gauge`, # added in 1.2.0. Note: aimdb-core requires the alloc feature for core # functionality. -aimdb-core = { version = "1.2.0", path = "../aimdb-core", optional = true, default-features = false, features = [ +aimdb-core = { version = "2.0.0", path = "../aimdb-core", optional = true, default-features = false, features = [ "alloc", ] } # RNG is caller-supplied, so we need only the `Rng`/`RngExt` traits and the diff --git a/aimdb-derive/CHANGELOG.md b/aimdb-derive/CHANGELOG.md index fb619634..03ae7e2c 100644 --- a/aimdb-derive/CHANGELOG.md +++ b/aimdb-derive/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.0] - 2026-09-18 + ### Added - **`#[derive(Linkable)]` proc-macro** (design 041 §3.3). Emits a JSON `aimdb_data_contracts::Linkable` impl (`serde_json::to_vec`/`from_slice` via the `__private` re-export, same foreign-crate-path pattern as `migration_chain!`) — replaces the hand-written `from_bytes`/`to_bytes` boilerplate every JSON-wire type repeated. `no_std + alloc` compatible; binary wire formats (e.g. KNX DPT codecs) still implement `Linkable` by hand. @@ -38,5 +40,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v0.1.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.2.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.1.0]: https://github.com/aimdb-dev/aimdb/releases/tag/v0.1.0 diff --git a/aimdb-derive/Cargo.toml b/aimdb-derive/Cargo.toml index 321e029e..46def998 100644 --- a/aimdb-derive/Cargo.toml +++ b/aimdb-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-derive" -version = "0.3.0" +version = "0.2.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/aimdb-embassy-adapter/CHANGELOG.md b/aimdb-embassy-adapter/CHANGELOG.md index 1c88e63f..bd8fdbe0 100644 --- a/aimdb-embassy-adapter/CHANGELOG.md +++ b/aimdb-embassy-adapter/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.7.0] - 2026-09-18 + ### Added - **`ByteStream::split` for `EmbassyTcpStream` and `EmbassyUart`.** The TCP @@ -189,7 +191,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v0.6.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.7.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.6.0]: https://github.com/aimdb-dev/aimdb/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...v0.5.0 [0.4.0]: https://github.com/aimdb-dev/aimdb/compare/v0.3.0...v0.4.0 diff --git a/aimdb-embassy-adapter/Cargo.toml b/aimdb-embassy-adapter/Cargo.toml index 435b9020..4a8d910c 100644 --- a/aimdb-embassy-adapter/Cargo.toml +++ b/aimdb-embassy-adapter/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-embassy-adapter" -version = "0.6.0" +version = "0.7.0" edition = "2021" rust-version.workspace = true license.workspace = true @@ -56,13 +56,10 @@ observability = ["aimdb-core/observability", "embassy-runtime"] [dependencies] # Core AimDB types - no_std for Embassy (requires alloc for typed APIs) -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false, features = [ +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false, features = [ "alloc", ] } -# Stream trait for bidirectional connectors (minimal, no_std compatible) -futures-core = { version = "0.3", default-features = false } - # Generic framed `Connection` over async UART halves (feature `connector-io`). embedded-io-async = { workspace = true, optional = true } diff --git a/aimdb-knx-connector/CHANGELOG.md b/aimdb-knx-connector/CHANGELOG.md index f5633ede..bd995f96 100644 --- a/aimdb-knx-connector/CHANGELOG.md +++ b/aimdb-knx-connector/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.5.0] - 2026-09-18 + ### Changed - **One connector for both runtimes (breaking).** @@ -195,7 +197,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Initial beta release for production evaluation. -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.4.0]: https://github.com/aimdb-dev/aimdb/compare/v0.3.1...v0.4.0 [0.3.1]: https://github.com/aimdb-dev/aimdb/compare/v0.3.0...v0.3.1 [0.3.0]: https://github.com/aimdb-dev/aimdb/compare/v0.2.0...v0.3.0 diff --git a/aimdb-knx-connector/Cargo.toml b/aimdb-knx-connector/Cargo.toml index 8d6e9ca1..34863fd4 100644 --- a/aimdb-knx-connector/Cargo.toml +++ b/aimdb-knx-connector/Cargo.toml @@ -66,7 +66,7 @@ log = ["aimdb-core/log"] defmt = ["aimdb-core/defmt", "knx-pico/defmt"] [dependencies] -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false } +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false } # aimdb-dev fork: upstream 0.3.0 panics on an npdu_length=1 telegram. A patch # won't do — patches aren't published, so dependants resolve back to upstream. diff --git a/aimdb-mqtt-connector/CHANGELOG.md b/aimdb-mqtt-connector/CHANGELOG.md index 236631f1..adc757cf 100644 --- a/aimdb-mqtt-connector/CHANGELOG.md +++ b/aimdb-mqtt-connector/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.7.0] - 2026-09-18 + ### Changed (breaking) - **The embedded session is event-driven: nothing polls.** The @@ -406,7 +408,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v0.6.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.7.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.6.0]: https://github.com/aimdb-dev/aimdb/compare/v0.5.1...v0.6.0 [0.5.1]: https://github.com/aimdb-dev/aimdb/compare/v0.5.0...v0.5.1 [0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...v0.5.0 diff --git a/aimdb-mqtt-connector/Cargo.toml b/aimdb-mqtt-connector/Cargo.toml index 18a6221d..187c709d 100644 --- a/aimdb-mqtt-connector/Cargo.toml +++ b/aimdb-mqtt-connector/Cargo.toml @@ -20,12 +20,9 @@ std = [ "aimdb-core/std", "aimdb-core/alloc", "aimdb-core/connector-session", - "thiserror", "tokio", "rumqttc", "uuid", - "async-stream", - "futures-util", ] # Deprecated alias for `std`, kept so existing manifests keep working. tokio-runtime = ["std"] @@ -76,7 +73,6 @@ embassy-runtime = [ embedded-tls = [ "embedded", "dep:embedded-tls", - "dep:rand_core", "dep:embedded-io-async", ] @@ -137,11 +133,8 @@ _test-embassy-broker = [ ] [dependencies] -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false } -aimdb-embassy-adapter = { version = "0.6.0", path = "../aimdb-embassy-adapter", default-features = false, optional = true } - -# Error handling (std only) -thiserror = { workspace = true, optional = true } +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false } +aimdb-embassy-adapter = { version = "0.7.0", path = "../aimdb-embassy-adapter", default-features = false, optional = true } # UUID generation for client IDs (std only) uuid = { version = "1.0", features = ["v4"], optional = true } @@ -157,11 +150,6 @@ rumqttc = { version = "0.25", optional = true, default-features = false } # `TlsConfiguration::default()` loads these too, but `expect`s on failure — and # a panic on the connect path is what an FFI consumer cannot afford. rustls-native-certs = { version = "0.8", optional = true } -async-stream = { version = "0.3", optional = true } -futures-util = { version = "0.3", optional = true, default-features = false, features = [ - "alloc", -] } -futures-core = { version = "0.3", default-features = false } # Embassy runtime dependencies (no_std). Only embassy-sync still comes from the # local checkout — see the workspace `[patch.crates-io]` for why. @@ -189,7 +177,6 @@ embedded-tls = { version = "0.19", default-features = false, optional = true, fe "p384", ] } embedded-io-async = { workspace = true, optional = true } -rand_core = { version = "0.6", default-features = false, optional = true } # Optional observability defmt = { workspace = true, optional = true } diff --git a/aimdb-persistence-sqlite/CHANGELOG.md b/aimdb-persistence-sqlite/CHANGELOG.md index e958f7b5..7e4613d2 100644 --- a/aimdb-persistence-sqlite/CHANGELOG.md +++ b/aimdb-persistence-sqlite/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.0] - 2026-09-18 + ### Changed (breaking) — Design 047 - **`query` honors MQTT pattern semantics.** The `*` → SQL `%` rewrite is gone: @@ -59,6 +61,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/aimdb-persistence-sqlite-v0.1.1...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.2.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.1.1]: https://github.com/aimdb-dev/aimdb/compare/aimdb-persistence-sqlite-v0.1.0...aimdb-persistence-sqlite-v0.1.1 [0.1.0]: https://github.com/aimdb-dev/aimdb/releases/tag/aimdb-persistence-sqlite-v0.1.0 diff --git a/aimdb-persistence-sqlite/Cargo.toml b/aimdb-persistence-sqlite/Cargo.toml index 3fdb49dc..f33c52d6 100644 --- a/aimdb-persistence-sqlite/Cargo.toml +++ b/aimdb-persistence-sqlite/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-persistence-sqlite" -version = "0.1.1" +version = "0.2.0" edition = "2021" rust-version.workspace = true license.workspace = true @@ -15,7 +15,7 @@ default = [] tracing = ["dep:tracing"] [dependencies] -aimdb-persistence = { version = "0.1.1", path = "../aimdb-persistence" } +aimdb-persistence = { version = "0.2.0", path = "../aimdb-persistence" } rusqlite = { version = "0.32", features = ["bundled"] } serde_json = { workspace = true, features = ["std"] } tokio = { workspace = true, features = ["sync"] } diff --git a/aimdb-persistence/CHANGELOG.md b/aimdb-persistence/CHANGELOG.md index cbd3088c..23e2430e 100644 --- a/aimdb-persistence/CHANGELOG.md +++ b/aimdb-persistence/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.0] - 2026-09-18 + ### Changed (breaking) — Design 047 - **`with_persistence`'s registered `QueryHandlerFn` returns the shared @@ -85,6 +87,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/aimdb-persistence-v0.1.1...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.2.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.1.1]: https://github.com/aimdb-dev/aimdb/compare/aimdb-persistence-v0.1.0...aimdb-persistence-v0.1.1 [0.1.0]: https://github.com/aimdb-dev/aimdb/releases/tag/aimdb-persistence-v0.1.0 diff --git a/aimdb-persistence/Cargo.toml b/aimdb-persistence/Cargo.toml index eac28d36..83617795 100644 --- a/aimdb-persistence/Cargo.toml +++ b/aimdb-persistence/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-persistence" -version = "0.1.1" +version = "0.2.0" edition = "2021" rust-version.workspace = true license.workspace = true @@ -16,7 +16,7 @@ std = ["aimdb-core/std", "serde_json/std"] tracing = ["dep:tracing"] [dependencies] -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false, features = [ +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false, features = [ "std", ] } serde = { workspace = true, features = ["derive"] } diff --git a/aimdb-serial-connector/CHANGELOG.md b/aimdb-serial-connector/CHANGELOG.md index 36712055..f19db501 100644 --- a/aimdb-serial-connector/CHANGELOG.md +++ b/aimdb-serial-connector/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.0] - 2026-09-18 + ### Changed - **Features name what the code needs; no runtime appears in the public surface.** diff --git a/aimdb-serial-connector/Cargo.toml b/aimdb-serial-connector/Cargo.toml index 64d59124..1bee980c 100644 --- a/aimdb-serial-connector/Cargo.toml +++ b/aimdb-serial-connector/Cargo.toml @@ -66,7 +66,7 @@ defmt = ["dep:defmt", "aimdb-core/defmt"] [dependencies] # AimX protocol (codec + dispatch) and the generic session connectors live in # core; this crate contributes only the serial transport triple + sugar. -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false } +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false } # Shared framing (no_std). `alloc` enables the `encode_vec`/`decode_vec` helpers. cobs = { workspace = true, features = ["alloc"] } @@ -75,11 +75,11 @@ tokio = { workspace = true, optional = true, features = ["io-util"] } tokio-serial = { workspace = true, optional = true } # --- embassy half (no_std) --- -aimdb-embassy-adapter = { version = "0.6.0", path = "../aimdb-embassy-adapter", default-features = false, optional = true } +aimdb-embassy-adapter = { version = "0.7.0", path = "../aimdb-embassy-adapter", default-features = false, optional = true } embedded-io-async = { workspace = true, optional = true } # --- test-only --- -aimdb-tokio-adapter = { version = "0.6.0", path = "../aimdb-tokio-adapter", optional = true } +aimdb-tokio-adapter = { version = "0.7.0", path = "../aimdb-tokio-adapter", optional = true } # --- logging --- defmt = { workspace = true, optional = true } diff --git a/aimdb-sync/CHANGELOG.md b/aimdb-sync/CHANGELOG.md index b61e69b0..da307361 100644 --- a/aimdb-sync/CHANGELOG.md +++ b/aimdb-sync/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.6.0] - 2026-09-18 + ### Added - **`AimDbHandle::shutdown(&self)`, `shutdown_timeout(&self, _)` and @@ -215,8 +217,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v0.6.0...HEAD -[0.6.0]: https://github.com/aimdb-dev/aimdb/compare/v0.5.0...v0.6.0 +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.6.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...v0.5.0 [0.4.0]: https://github.com/aimdb-dev/aimdb/compare/v0.3.0...v0.4.0 [0.3.0]: https://github.com/aimdb-dev/aimdb/compare/v0.2.0...v0.3.0 diff --git a/aimdb-sync/Cargo.toml b/aimdb-sync/Cargo.toml index c8e662b1..37d1a609 100644 --- a/aimdb-sync/Cargo.toml +++ b/aimdb-sync/Cargo.toml @@ -16,10 +16,10 @@ categories = ["database", "api-bindings"] # ["std", "alloc", "derive"], so inheriting it would pull anyhow/serde/remote # into the `--no-default-features` build and silently un-no_std this crate. # The `std` feature below forwards to `aimdb-core/std` for the std path. -aimdb-core = { path = "../aimdb-core", version = "1.1.0", default-features = false, features = [ +aimdb-core = { path = "../aimdb-core", version = "2.0.0", default-features = false, features = [ "alloc", ] } -aimdb-tokio-adapter = { path = "../aimdb-tokio-adapter", version = "0.6.0", optional = true } +aimdb-tokio-adapter = { path = "../aimdb-tokio-adapter", version = "0.7.0", optional = true } # Tokio for channels and runtime tokio = { version = "1.40", features = ["sync", "rt", "time", "macros"], optional = true } @@ -30,7 +30,7 @@ thiserror = { version = "2.0.16", default-features = false } # Optional: Settable::set (feature `data-contracts`) for the `set_value` family. # aimdb-sync depends on the contracts crate, never the reverse — the contracts # crate has no `sync` feature. -aimdb-data-contracts = { path = "../aimdb-data-contracts", version = "0.4.0", optional = true, default-features = false, features = [ +aimdb-data-contracts = { path = "../aimdb-data-contracts", version = "0.2.0", optional = true, default-features = false, features = [ "settable", ] } diff --git a/aimdb-tcp-connector/CHANGELOG.md b/aimdb-tcp-connector/CHANGELOG.md index 1c2cde7b..ed196b63 100644 --- a/aimdb-tcp-connector/CHANGELOG.md +++ b/aimdb-tcp-connector/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.0] - 2026-09-18 + ### Changed - **Features name what the code needs, not an executor.** New `connector` diff --git a/aimdb-tcp-connector/Cargo.toml b/aimdb-tcp-connector/Cargo.toml index 34ac3ad6..7d0a32dd 100644 --- a/aimdb-tcp-connector/Cargo.toml +++ b/aimdb-tcp-connector/Cargo.toml @@ -59,15 +59,15 @@ _test-embassy-loopback = [ ] [dependencies] -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false } +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false } -aimdb-embassy-adapter = { version = "0.6.0", path = "../aimdb-embassy-adapter", default-features = false, optional = true } +aimdb-embassy-adapter = { version = "0.7.0", path = "../aimdb-embassy-adapter", default-features = false, optional = true } # Test-only: the loopback harness stands up two real stacks (see # `_test-embassy-loopback`). The crate itself names no socket type. embassy-net = { workspace = true, optional = true } -aimdb-tokio-adapter = { version = "0.6.0", path = "../aimdb-tokio-adapter", optional = true } +aimdb-tokio-adapter = { version = "0.7.0", path = "../aimdb-tokio-adapter", optional = true } # test-only (see `_test-embassy-loopback`) embassy-net-driver-channel = { version = "0.4.0", optional = true } diff --git a/aimdb-tokio-adapter/CHANGELOG.md b/aimdb-tokio-adapter/CHANGELOG.md index 839d8b25..efeed7c8 100644 --- a/aimdb-tokio-adapter/CHANGELOG.md +++ b/aimdb-tokio-adapter/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.7.0] - 2026-09-18 + ### Changed (breaking) - **`TokioNet::listen` yields `std::io::Result` instead of `TransportResult`.** @@ -144,7 +146,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v0.6.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.7.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.6.0]: https://github.com/aimdb-dev/aimdb/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...v0.5.0 [0.4.0]: https://github.com/aimdb-dev/aimdb/compare/v0.3.0...v0.4.0 diff --git a/aimdb-tokio-adapter/Cargo.toml b/aimdb-tokio-adapter/Cargo.toml index ce007301..718a164c 100644 --- a/aimdb-tokio-adapter/Cargo.toml +++ b/aimdb-tokio-adapter/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-tokio-adapter" -version = "0.6.0" +version = "0.7.0" edition = "2021" rust-version.workspace = true authors.workspace = true @@ -31,7 +31,7 @@ net = ["tokio-runtime", "aimdb-core/connector-session", "tokio/net", "tokio/io-u embedded-io = ["net", "dep:embedded-io-async"] # Observability features -tracing = ["aimdb-core/tracing", "dep:tracing"] +tracing = ["aimdb-core/tracing"] observability = ["aimdb-core/observability", "tokio-runtime"] # Testing features @@ -39,7 +39,7 @@ test-utils = ["aimdb-core/test-utils", "tokio-runtime"] [dependencies] # Core AimDB types - std version for Tokio (for DbError integration) -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false, features = [ +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false, features = [ "std", ] } @@ -63,9 +63,6 @@ embedded-io-async = { workspace = true, optional = true, features = ["std"] } # `RuntimeOps::log` forwards to the `log` facade; the binary picks the backend. log = "0.4" -# Observability (optional) -tracing = { workspace = true, optional = true } - [dev-dependencies] # For async testing tokio-test = { workspace = true } diff --git a/aimdb-uds-connector/CHANGELOG.md b/aimdb-uds-connector/CHANGELOG.md index 21821133..0b3a34f1 100644 --- a/aimdb-uds-connector/CHANGELOG.md +++ b/aimdb-uds-connector/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.0] - 2026-09-18 + ### Changed - **Reports through the `log_*` facade instead of `tracing::` directly** (design diff --git a/aimdb-uds-connector/Cargo.toml b/aimdb-uds-connector/Cargo.toml index 51e9a665..c2f85219 100644 --- a/aimdb-uds-connector/Cargo.toml +++ b/aimdb-uds-connector/Cargo.toml @@ -23,7 +23,7 @@ log = ["aimdb-core/log"] # AimX protocol (codec + dispatch) and the generic session connectors live in # core; this crate contributes only the UDS transport triple + sugar. UDS is # Linux/std-only, so there is no Embassy half. -aimdb-core = { version = "1.1.0", path = "../aimdb-core", features = [ +aimdb-core = { version = "2.0.0", path = "../aimdb-core", features = [ "std", "connector-session", ] } diff --git a/aimdb-wasm-adapter/CHANGELOG.md b/aimdb-wasm-adapter/CHANGELOG.md index 83e5bd29..cf371765 100644 --- a/aimdb-wasm-adapter/CHANGELOG.md +++ b/aimdb-wasm-adapter/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0] - 2026-09-18 + ### Added - **A schema-name collision trips a `debug_assert!`.** `SchemaRegistry` keys on diff --git a/aimdb-wasm-adapter/Cargo.toml b/aimdb-wasm-adapter/Cargo.toml index 47aa6a3e..854001d2 100644 --- a/aimdb-wasm-adapter/Cargo.toml +++ b/aimdb-wasm-adapter/Cargo.toml @@ -30,14 +30,14 @@ observability = ["aimdb-core/observability"] [dependencies] # Core AimDB types (no std, no tokio — the connector-session engines and the # AimX codec cross-compile to wasm32; the bridge rides `run_client`) -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false, features = [ +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false, features = [ "alloc", "connector-session", "remote", ] } # Data contracts (alloc only — no std) -aimdb-data-contracts = { version = "0.4.0", path = "../aimdb-data-contracts", default-features = false, features = [ +aimdb-data-contracts = { version = "0.2.0", path = "../aimdb-data-contracts", default-features = false, features = [ "alloc", ] } diff --git a/aimdb-websocket-connector/CHANGELOG.md b/aimdb-websocket-connector/CHANGELOG.md index 47e55830..1aedaeee 100644 --- a/aimdb-websocket-connector/CHANGELOG.md +++ b/aimdb-websocket-connector/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0] - 2026-09-18 + ### Added - **`GET /version` returns the AimX version this server speaks** as diff --git a/aimdb-websocket-connector/Cargo.toml b/aimdb-websocket-connector/Cargo.toml index 420f9d54..e584b714 100644 --- a/aimdb-websocket-connector/Cargo.toml +++ b/aimdb-websocket-connector/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-websocket-connector" -version = "0.2.0" +version = "0.3.0" edition = "2021" rust-version.workspace = true license.workspace = true @@ -33,8 +33,8 @@ tokio-runtime = ["server"] tracing = ["dep:tracing"] [dependencies] -aimdb-core = { version = "1.1.0", path = "../aimdb-core", default-features = false } -aimdb-data-contracts = { version = "0.4.0", path = "../aimdb-data-contracts", default-features = false } +aimdb-core = { version = "2.0.0", path = "../aimdb-core", default-features = false } +aimdb-data-contracts = { version = "0.2.0", path = "../aimdb-data-contracts", default-features = false } # Async runtime tokio = { version = "1", features = [ diff --git a/docs/releases/v2.0.0.md b/docs/releases/v2.0.0.md new file mode 100644 index 00000000..ba1d75b1 --- /dev/null +++ b/docs/releases/v2.0.0.md @@ -0,0 +1,222 @@ +# AimDB v2.0.0 Release Notes + +**One wire protocol, one runtime abstraction, three new transports.** + +> Typed dataplane for distributed systems + +--- + +## 🎯 Highlights + +AimDB 2.0 converges every transport on a single wire protocol (**AimX 3.0**), removes the runtime generic `R` from the public API, retires `aimdb-executor`, and adds **Unix-socket, serial and TCP** transports alongside the existing MQTT, KNX and WebSocket connectors. The simplification passes (designs 034/036/037/038) cut ~2,500 lines from the library crates with no capability loss. + +This is a breaking release. A pre-3.0 client is now **refused at the handshake** rather than failing on its first call, so servers and clients must be upgraded together. + +--- + +## 💥 Breaking Changes + +### 1. AimX 3.0 — one protocol for every transport + +`aimdb-ws-protocol` is **deleted**. The WebSocket connector and the browser `WsBridge` now speak the same AimX tagged frames as UDS, serial and TCP, over the same session engine. AimX gained the two features that justified the old WS fork: wildcard/multi-record subscribe and shared `record.query` / `record.list` result shapes. + +`PROTOCOL_VERSION` moves **`"2.0"` → `"3.0"`**, and `hello` now *negotiates* instead of ignoring the version. Compatibility is by **major** version; a missing or malformed version fails closed with `RpcError::VersionMismatch`. + +`record.query` results changed shape: + +```jsonc +// 1.x +{ "values": [{ "record": "…", "value": …, "stored_at": … }], "count": 3 } +// 2.0 +{ "records": [{ "topic": "…", "payload": …, "ts": … }], "total": 3 } +``` + +**Browser clients** must declare the version in the upgrade URL — a browser cannot set WebSocket handshake headers, so the server refuses an incompatible or absent version with **HTTP 426 Upgrade Required** before the socket opens. The JS `WsBridge` API is unchanged and appends it automatically; hand-rolled clients need `…/ws?v=3.0`. See `aimdb_core::remote::{VERSION_PARAM, ws_url_with_version}`. + +> **Caveat (design 047 §3.6):** server-seeded auto-subscriptions are invisible to `run_client`-based consumers. Drive your own `subscribe` for records you want streamed. + +### 2. Dot is the only topic separator + +`topic_matches` now splits patterns on **`.` only** — RabbitMQ topic-exchange semantics (`*` one segment, `#` zero or more). Previously it split on `/`, so a dot-separated key like `temp.vienna` silently failed to match `temp.*`. `/` survives only inside external broker addresses (`mqtt://sensors/temp/x`), which are unaffected. + +```diff +- ws.subscribe("sensors/#") ++ ws.subscribe("sensors.#") +``` + +### 3. The runtime generic `R` is gone + +Records (`T`) are the only generic surface left; the runtime travels as `Arc`. `AimDb`, `AimDbBuilder`, `TypedRecord`, `RecordRegistrar<'a, T>`, `TransformBuilder`, `JoinBuilder` and `ConnectorBuilder` are all non-generic over the runtime, and there is no `NoRuntime` typestate. + +```diff +- async fn task(mut rx: Consumer) { … } ++ async fn task(mut rx: Consumer) { … } +``` + +`RuntimeContext` is now a concrete struct: `time().now()` returns `u64` nanos, with `sleep(Duration)` / `sleep_millis` / `sleep_secs`. + +**Close semantics changed on Embassy:** a join fan-in queue now closes on *all* runtimes once every input forwarder exits, so a `no_std` handler's `while let Ok(_) = rx.recv().await` loop ends instead of parking forever. Treat `Err(QueueClosed)` as end-of-inputs. + +### 4. `aimdb-executor` is retired + +`RuntimeOps`, `LogLevel`, `BoxFuture` and `ExecutorError` / `ExecutorResult` now live in `aimdb_core::executor`, re-exported at the crate root. The superseded generic trait family (`RuntimeAdapter`, `TimeOps`, `Logger`, `Runtime`, `RuntimeInfo`) and `aimdb_core::time` are deleted — adapters implement **one** trait instead of four. + +### 5. Remote access is a connector + +`AimDbBuilder::with_remote_access(config)` is removed. Register a session connector instead; it binds synchronously, so bind errors still surface from `build()`. + +### 6. CLI and MCP take an endpoint, not a socket path + +The per-command `--socket` flags are gone in favour of a global `--connect ` (`unix://`, `serial://DEVICE?baud=N`, or a bare path). `AIMDB_SOCKET` → `AIMDB_CONNECT`; every MCP tool's `socket_path` parameter is renamed `endpoint`. `discover_instances` keeps `socket_path`. + +### 7. Capability traits and codecs (`aimdb-data-contracts`) + +`linkable` is now **format-neutral** — derive users must enable the new `linkable-json`. `Simulatable::simulate` takes an associated `Self::Params` (`SimulationConfig` / `SimulationParams` are removed); `Observable` loses `ICON` and `format_log()` (use `ObservableRegistrarExt::log(node_id)`); `Settable` moves behind a new `settable` feature. + +### 8. Smaller surface changes + +- `DbError` and `SyncError` are `#[non_exhaustive]` — add a wildcard arm, or match on the new `kind()` / `DbErrorKind`. +- `BufferReader` is poll-based (design 037 W8), removing the last per-message heap allocation on the consume path. +- `ConsumerTrait::subscribe_any` is infallible — drop the `Ok(…)` wrap and the dead `Err` arm. +- `RecordMetadata` drops `created_at` / `last_update`; core keeps no wall-clock state for the `no_std` AimX server. +- `with_serializer_raw` / `with_deserializer_raw` are gone — use `.with_serializer(|_ctx, v| …)`. +- The `std` feature no longer pulls `tokio`. Depend on it directly if you relied on the transitive dependency. +- MQTT knobs (`with_qos` / `with_retain`) leave the generic link builders — use `aimdb-mqtt-connector`'s `MqttLinkExt`, or generic `with_config(key, value)`. + +--- + +## ✨ Also New + +- **Three transports** — `aimdb-uds-connector`, `aimdb-serial-connector` and `aimdb-tcp-connector`, each contributing only a `Dialer`/`Listener`/`Connection` triple over the shared session engine. One code path serves both Tokio and Embassy. +- **A `log` destination for FFI hosts (design 050).** An optional, non-default `log` feature on `aimdb-core` sits alongside `tracing`, for hosts that cannot be handed a process-global subscriber. Every crate that reports now goes through the same facade; with the feature off — the default, and every MCU build — nothing changes. +- **Per-link record codecs (#178).** One `Linkable` type can select JSON, bounded Postcard or a custom codec independently per route, fused at registration time with no runtime registry. +- **`ConnectorBuilder::owns_scheme`** — a connector can declare it must be the only one registered under its scheme; `build()` rejects a collision by name instead of silently double-publishing every route. +- **`AimDbHandle::shutdown(&self)` / `is_closed()`** — the shutdown contract a foreign-language binding needs. A shutdown now also releases the database, waking a consumer parked in `get()`. +- **Faster remote reads (#196).** Typed records serialize straight to JSON bytes: 16 → 6 allocations per reply/event and a 1.55×–1.61× speedup on the measured host. + +--- + +## 🔒 Security & Correctness Fixes + +- **A non-terminal `#` no longer matches everything after it.** `topic_matches("a.#.secret", "a.public")` returned `true`, so an ACL grant of that shape behaved like a blanket `a.#` over the whole subtree. `#` now absorbs zero or more segments *with the pattern continuing afterwards*. Only ever tightens what an interior `#` admits; trailing `#` and `*` grants are unaffected. +- **SQLite queries honour pattern semantics.** The `*` → SQL `%` rewrite is gone: `%` crosses `.`, so `sensors.*` also returned `sensors.secret.deep` — outside the pattern, and on the WebSocket path outside the grant that authorized it. +- **A peer's `seq` can no longer crash the client demux.** An update with `seq == u64::MAX` overflowed on the next frame — a debug-build panic from one crafted frame — and a repeated or reordered `seq` invented phantom gaps. +- **An abandoned RPC call no longer leaks.** `ClientHandle::call` is now cancel-safe; a timed-out request frees its pending-call entry in `O(1)` instead of growing the demux map for the life of the connection. + +--- + +## 🚀 Migration Guide + +**Step 1 — swap the executor import.** + +```diff +- use aimdb_executor::{RuntimeOps, BoxFuture}; ++ use aimdb_core::{RuntimeOps, BoxFuture}; +``` + +Custom adapters implement `RuntimeOps` only; delete the `RuntimeAdapter` / `TimeOps` / `Logger` / `Runtime` impls. + +**Step 2 — drop the runtime type parameter.** + +```diff +- Producer Consumer ++ Producer Consumer +``` + +Regenerate any `aimdb-codegen` scaffolds — the emitted `configure_schema` is now non-generic (`fn configure_schema(builder: &mut AimDbBuilder)`) and the emitted prelude imports from `aimdb_core` only. + +**Step 3 — replace `with_remote_access`.** + +```diff + let db = AimDbBuilder::new() +- .with_remote_access(config) ++ .with_connector(aimdb_uds_connector::UdsServer::from_config(config)) + .build()?; +``` + +**Step 4 — move subscriptions to dot patterns.** + +```diff +- ws.subscribe("sensors/#") ++ ws.subscribe("sensors.#") +``` + +**Step 5 — update tooling invocations.** + +```diff +- aimdb record list --socket /tmp/app.sock ++ aimdb record list --connect unix:///tmp/app.sock +- export AIMDB_SOCKET=/tmp/app.sock ++ export AIMDB_CONNECT=unix:///tmp/app.sock +``` + +**Step 6 — if you use `#[derive(Linkable)]`, enable `linkable-json`.** + +```diff +- aimdb-data-contracts = { version = "0.2", features = ["linkable"] } ++ aimdb-data-contracts = { version = "0.2", features = ["linkable-json"] } +``` + +**Step 7 — upgrade clients and servers together.** A 2.x client cannot talk to a 1.x server, and vice versa. + +--- + +## 📦 Published Crates + +### New + +| Crate | Version | +|---|---| +| `aimdb-uds-connector` | 0.1.0 | +| `aimdb-serial-connector` | 0.1.0 | +| `aimdb-tcp-connector` | 0.1.0 | + +### Updated + +| Crate | Version | | Crate | Version | +|---|---|---|---|---| +| `aimdb-core` | 1.1.0 → **2.0.0** | | `aimdb-persistence` | 0.1.1 → **0.2.0** | +| `aimdb-derive` | 0.1.0 → **0.2.0** | | `aimdb-persistence-sqlite` | 0.1.1 → **0.2.0** | +| `aimdb-data-contracts` | 0.1.1 → **0.2.0** | | `aimdb-mqtt-connector` | 0.6.0 → **0.7.0** | +| `aimdb-client` | 0.6.0 → **0.7.0** | | `aimdb-knx-connector` | 0.4.0 → **0.5.0** | +| `aimdb-codegen` | 0.2.0 → **0.3.0** | | `aimdb-websocket-connector` | 0.2.0 → **0.3.0** | +| `aimdb-embassy-adapter` | 0.6.0 → **0.7.0** | | `aimdb-wasm-adapter` | 0.2.0 → **0.3.0** | +| `aimdb-tokio-adapter` | 0.6.0 → **0.7.0** | | `aimdb-cli` | 0.6.0 → **0.7.0** | +| `aimdb-sync` | 0.5.0 → **0.6.0** | | `aimdb-mcp` | 0.8.0 → **0.9.0** | + +### Retired + +- **`aimdb-executor`** — folded into `aimdb_core::executor`. Last published version 0.2.0. +- **`aimdb-ws-protocol`** — superseded by AimX. Last published version 0.1.0, which speaks a protocol 2.0.0 refuses at the handshake. + +--- + +## 📖 Design Documents + +- **036–038** — follow-up refactoring, zero-alloc consume path, and the technical-debt/simplification review +- **041** — data-contracts integration: capability traits as first-class verbs +- **045** — per-link codec selection +- **047** — retire the WS protocol, converge on AimX +- **050** — a `log` destination for FFI hosts +- **052** — runtime-neutral connectors + +--- + +## 🤝 Contributing + +```bash +git clone https://github.com/aimdb-dev/aimdb.git +cd aimdb +make check # fmt + clippy + test + embedded + wasm cross-compile +``` + +--- + +## 📄 License + +Apache License 2.0 — see [LICENSE](https://github.com/aimdb-dev/aimdb/blob/main/LICENSE). + +--- + +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[2.0.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 diff --git a/tools/aimdb-cli/CHANGELOG.md b/tools/aimdb-cli/CHANGELOG.md index c1364cd9..c704dae4 100644 --- a/tools/aimdb-cli/CHANGELOG.md +++ b/tools/aimdb-cli/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.7.0] - 2026-09-18 + ### Added - **`aimdb watch` reports delivery gaps.** The watcher rides the loss-aware `AimxConnection::subscribe`, printing a `⚠️ gap: N update(s) dropped` line before the event that follows a gap, plus a session total when watching stops. A silent hole in the value stream is no longer indistinguishable from an idle producer. It also prints a `📸 snapshot complete (N records)` line when the late-join burst closes — the one marker that tells a complete initial state from a truncated one — and a notice in place of any frame whose payload did not decode. @@ -82,7 +84,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v0.5.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.7.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.5.0]: https://github.com/aimdb-dev/aimdb/compare/v0.4.0...v0.5.0 [0.4.0]: https://github.com/aimdb-dev/aimdb/compare/v0.3.0...v0.4.0 [0.3.0]: https://github.com/aimdb-dev/aimdb/compare/v0.1.0...v0.3.0 diff --git a/tools/aimdb-cli/Cargo.toml b/tools/aimdb-cli/Cargo.toml index 73b6cea3..3c4b6019 100644 --- a/tools/aimdb-cli/Cargo.toml +++ b/tools/aimdb-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-cli" -version = "0.6.0" +version = "0.7.0" edition = "2021" rust-version.workspace = true authors.workspace = true @@ -17,14 +17,14 @@ path = "src/main.rs" [dependencies] # AimDB client library -aimdb-client = { version = "0.6.0", path = "../../aimdb-client" } -aimdb-codegen = { version = "0.2.0", path = "../../aimdb-codegen" } +aimdb-client = { version = "0.7.0", path = "../../aimdb-client" } +aimdb-codegen = { version = "0.3.0", path = "../../aimdb-codegen" } # Core dependencies - reuse protocol types from aimdb-core. # `observability` keeps the optional RecordMetadata fields (signal_stats, # stage_profiling, buffer metrics) in the client-side struct — without it # serde silently drops them from `record list --format json` output. -aimdb-core = { version = "1.1.0", path = "../../aimdb-core", features = [ +aimdb-core = { version = "2.0.0", path = "../../aimdb-core", features = [ "std", "observability", ] } diff --git a/tools/aimdb-mcp/CHANGELOG.md b/tools/aimdb-mcp/CHANGELOG.md index 3cdb7fce..6848ee56 100644 --- a/tools/aimdb-mcp/CHANGELOG.md +++ b/tools/aimdb-mcp/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.9.0] - 2026-09-18 + ### Changed (breaking) - **Tools take an `endpoint` (a `scheme://` URL), not a `socket_path` (Issue #123).** Every tool's `socket_path` parameter is renamed `endpoint` and now accepts any endpoint URL — `unix://PATH`, `serial://DEVICE?baud=N` (with the `transport-serial` feature), or a bare path (the `unix://` shorthand). The startup `--socket ` flag is now `--connect `, and the `AIMDB_SOCKET` env var is now `AIMDB_CONNECT` (resolution order: explicit `endpoint` → `--connect` → `AIMDB_CONNECT`). The connection pool is keyed by endpoint URL, and public-mode SSRF stripping now strips `endpoint`. `get_instance_info`'s result field `socket_path` is renamed `endpoint`; `discover_instances` (Unix-socket discovery) keeps `socket_path`. New `transport-serial` feature (off by default; pulls libudev) adds the serial transport to the resolver. @@ -139,7 +141,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- -[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/aimdb-mcp-v0.8.0...HEAD +[Unreleased]: https://github.com/aimdb-dev/aimdb/compare/v2.0.0...HEAD +[0.9.0]: https://github.com/aimdb-dev/aimdb/compare/v1.1.0...v2.0.0 [0.8.0]: https://github.com/aimdb-dev/aimdb/compare/aimdb-mcp-v0.7.0...aimdb-mcp-v0.8.0 [0.7.0]: https://github.com/aimdb-dev/aimdb/compare/aimdb-mcp-v0.6.1...aimdb-mcp-v0.7.0 [0.6.1]: https://github.com/aimdb-dev/aimdb/compare/aimdb-mcp-v0.6.0...aimdb-mcp-v0.6.1 diff --git a/tools/aimdb-mcp/Cargo.toml b/tools/aimdb-mcp/Cargo.toml index 70850d52..2a25b422 100644 --- a/tools/aimdb-mcp/Cargo.toml +++ b/tools/aimdb-mcp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aimdb-mcp" -version = "0.8.0" +version = "0.9.0" edition = "2021" rust-version.workspace = true authors.workspace = true @@ -33,14 +33,10 @@ transport-serial = ["aimdb-client/transport-serial"] [dependencies] # AimDB dependencies -aimdb-client = { version = "0.6.0", path = "../../aimdb-client", features = [ - "observability", -] } -aimdb-codegen = { version = "0.2.0", path = "../../aimdb-codegen" } -aimdb-core = { version = "1.1.0", path = "../../aimdb-core", features = [ - "std", +aimdb-client = { version = "0.7.0", path = "../../aimdb-client", features = [ "observability", ] } +aimdb-codegen = { version = "0.3.0", path = "../../aimdb-codegen" } # Async runtime tokio = { version = "1.48", features = [