From 13d8a4a014a01fc7fbe12aea3de2776ce10eb368 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 26 Jul 2026 16:18:31 +0000 Subject: [PATCH] chore(release): version packages --- .changeset/accept-canonical-driver-names.md | 5 ---- .changeset/add-blixt-nameplate-host-calls.md | 5 ---- .changeset/add-home-link-four-reads.md | 5 ---- .changeset/add-home-link-relay.md | 5 ---- .../bundle-drivers-from-device-drivers.md | 5 ---- ...channel-drivers-keep-their-control-path.md | 5 ---- .../driver-version-switching-that-works.md | 5 ---- ...driver-versions-and-override-visibility.md | 5 ---- .changeset/fix-home-link-route-handle.md | 5 ---- .../fix-home-link-session-clock-skew.md | 5 ---- .changeset/map-rated-power-key.md | 5 ---- .changeset/normalize-telemetry-keys.md | 5 ---- .../rebuild-update-dialog-as-inventory.md | 5 ---- .changeset/refresh-x-net-security.md | 5 ---- .changeset/remote-home-link-beta.md | 5 ---- .changeset/secure-local-home-link-passkeys.md | 5 ---- .../show-driver-verification-when-picking.md | 5 ---- .changeset/show-home-link-overview.md | 5 ---- CHANGELOG.md | 26 +++++++++++++++++++ package-lock.json | 4 +-- package.json | 2 +- 21 files changed, 29 insertions(+), 93 deletions(-) delete mode 100644 .changeset/accept-canonical-driver-names.md delete mode 100644 .changeset/add-blixt-nameplate-host-calls.md delete mode 100644 .changeset/add-home-link-four-reads.md delete mode 100644 .changeset/add-home-link-relay.md delete mode 100644 .changeset/bundle-drivers-from-device-drivers.md delete mode 100644 .changeset/channel-drivers-keep-their-control-path.md delete mode 100644 .changeset/driver-version-switching-that-works.md delete mode 100644 .changeset/driver-versions-and-override-visibility.md delete mode 100644 .changeset/fix-home-link-route-handle.md delete mode 100644 .changeset/fix-home-link-session-clock-skew.md delete mode 100644 .changeset/map-rated-power-key.md delete mode 100644 .changeset/normalize-telemetry-keys.md delete mode 100644 .changeset/rebuild-update-dialog-as-inventory.md delete mode 100644 .changeset/refresh-x-net-security.md delete mode 100644 .changeset/remote-home-link-beta.md delete mode 100644 .changeset/secure-local-home-link-passkeys.md delete mode 100644 .changeset/show-driver-verification-when-picking.md delete mode 100644 .changeset/show-home-link-overview.md diff --git a/.changeset/accept-canonical-driver-names.md b/.changeset/accept-canonical-driver-names.md deleted file mode 100644 index 70437f99..00000000 --- a/.changeset/accept-canonical-driver-names.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Accept the canonical driver spellings alongside the current ones, so srcfl/device-drivers can convert its catalog one driver at a time without any site losing telemetry. `host.emit` reads `W` and `SoC_nom_fract` when `w` and `soc` are absent, and `write`, `write_registers` and `now_ms` are registered as aliases of `modbus_write`, `modbus_write_multi` and `millis`. Nothing is removed; the older names keep working until the catalog has moved. diff --git a/.changeset/add-blixt-nameplate-host-calls.md b/.changeset/add-blixt-nameplate-host-calls.md deleted file mode 100644 index f26f2f9a..00000000 --- a/.changeset/add-blixt-nameplate-host-calls.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add the four Blixt L1 host services FTW was still missing, so a driver converted in `srcfl/device-drivers` runs here unchanged. `host.set_model(name)` and `host.set_rated_w(watts)` record the rest of the nameplate beside make and serial, and the host repeats both on every emit so they reach Nova's `model` and `rated_power_w` without the driver restating them each poll. `host.set_warmup_s(seconds)` holds off the first poll for a device that answers Modbus before its registers are meaningful. `host.decode_string(registers, start, count)` reads ASCII from a register block — two characters per register, high byte first, trailing padding stripped — replacing the byte loop a dozen catalog drivers hand-roll. Nothing is removed and no existing driver behaves differently. diff --git a/.changeset/add-home-link-four-reads.md b/.changeset/add-home-link-four-reads.md deleted file mode 100644 index f62711ed..00000000 --- a/.changeset/add-home-link-four-reads.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add encrypted Home Link sessions for four bounded, read-only Core views with session-bound one-use grants. diff --git a/.changeset/add-home-link-relay.md b/.changeset/add-home-link-relay.md deleted file mode 100644 index 0e462723..00000000 --- a/.changeset/add-home-link-relay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add the first Home Link remote transport: a strict versioned wire and a separate invite-only relay that forwards only encrypted session frames. diff --git a/.changeset/bundle-drivers-from-device-drivers.md b/.changeset/bundle-drivers-from-device-drivers.md deleted file mode 100644 index 8125ae86..00000000 --- a/.changeset/bundle-drivers-from-device-drivers.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -The bundled `drivers/` tree is now a generated snapshot of srcfl/device-drivers, pinned by commit, with CI failing if the two drift. It had become a second source of truth and had already diverged: a Sungrow fix landed upstream while the bundled copy kept reading a battery block on inverters that have no battery, which is what took a customer's SG12RT offline. That copy is now correct, and cannot silently fall behind again. diff --git a/.changeset/channel-drivers-keep-their-control-path.md b/.changeset/channel-drivers-keep-their-control-path.md deleted file mode 100644 index b42fb153..00000000 --- a/.changeset/channel-drivers-keep-their-control-path.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -A driver downloaded from the signed channel can now control the hardware it was ported to control. FTW refused any device-drivers artifact that was not marked read-only, and the channel marked all of them read-only, so the same source file could drive a battery when it shipped with the build and could not when it was downloaded. A driver published with a control path now runs under the same terms as the bundled copy of that same source. A driver that declares itself read-only — a meter, a telemetry gateway — still gets a read-only policy, and a manifest whose read_only and control_enabled disagree is refused outright. diff --git a/.changeset/driver-version-switching-that-works.md b/.changeset/driver-version-switching-that-works.md deleted file mode 100644 index 7fde6a4d..00000000 --- a/.changeset/driver-version-switching-that-works.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Switch driver versions, and switch back when the new one misbehaves. Nothing from the signed channel could be installed at all: the metadata parser only read a DRIVER table written inline, and signed artifacts assign it from a local, so every install failed validation with an empty id and version. The Versions list rendered no rows because it read the version off the wrong object, and its install call omitted the repository id the API requires. Going back to the bundled driver was impossible once a channel version was installed — the bundled copy is not an install, so nothing could activate it — which is the case that matters most, since installing over the bundled driver is the first thing anyone does. Each driver row now says which version runs, whether it came from the channel or your own file, and how well tested it is; the version list offers one click to switch, a standing way back to the copy that shipped with the build, and an undo after a switch. diff --git a/.changeset/driver-versions-and-override-visibility.md b/.changeset/driver-versions-and-override-visibility.md deleted file mode 100644 index 91e917ea..00000000 --- a/.changeset/driver-versions-and-override-visibility.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Pick which driver version runs, and see when your own copy has fallen behind. The signed channel keeps every version it has ever published, but rollback only stepped back one, so a specific older version was out of reach from the UI. Each managed driver now has a Versions list showing what is downloaded, what the channel offers, and which one is live. A driver you supply yourself is now also told when the channel has something newer — your copy keeps running until you decide otherwise. diff --git a/.changeset/fix-home-link-route-handle.md b/.changeset/fix-home-link-route-handle.md deleted file mode 100644 index 7b648f19..00000000 --- a/.changeset/fix-home-link-route-handle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Accept the shipped Home Link route-handle format in remote browser invites. diff --git a/.changeset/fix-home-link-session-clock-skew.md b/.changeset/fix-home-link-session-clock-skew.md deleted file mode 100644 index c7490c11..00000000 --- a/.changeset/fix-home-link-session-clock-skew.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Fix Home Link sessions being rejected over a few milliseconds of clock difference between the gateway and the browser. A gateway now issues a session lifetime below the verifier ceiling, so remote passkey access works instead of failing with "Could not reach this home". Reads also reopen a bounded session instead of leaving the page dead until a reload, and a failed session or read now states its cause. diff --git a/.changeset/map-rated-power-key.md b/.changeset/map-rated-power-key.md deleted file mode 100644 index 807afc75..00000000 --- a/.changeset/map-rated-power-key.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Map `rated_W`, `rated_power_W` and `rated_w` onto `rated_power_w`, the name `nova.DerTelemetry` reads. None of the three was mapped, so a device's rated AC power has never reached Nova — including from our own `zap.lua`, which emits `rated_power_W`. diff --git a/.changeset/normalize-telemetry-keys.md b/.changeset/normalize-telemetry-keys.md deleted file mode 100644 index 44fd9d0d..00000000 --- a/.changeset/normalize-telemetry-keys.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Map driver emit keys onto the names the Nova payload reads. Catalog drivers emit `import_wh`, `export_wh`, `charge_wh`, `discharge_wh`, `lifetime_wh` and `hz`, while `DerTelemetry` reads `total_import_wh`, `total_export_wh`, `total_charge_wh`, `total_discharge_wh`, `total_generation_wh` and `freq_hz` — so those values never left the gateway. The canonical `@srcful/data-models` spellings map onto the same names, so the driver catalog can convert without a further host change. diff --git a/.changeset/rebuild-update-dialog-as-inventory.md b/.changeset/rebuild-update-dialog-as-inventory.md deleted file mode 100644 index 78e6d939..00000000 --- a/.changeset/rebuild-update-dialog-as-inventory.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -The update dialog now leads with what the box is running. Every configured component keeps a row in one table — Core, the optimizer and each driver — whether or not it has an update waiting, so a driver only appeared when it was behind and could never be checked otherwise. The summary counts the whole inventory instead of Core alone, and says when the last check ran, which the dialog knew but never showed. Two fixes came out of the same pass: the optimizer row drew "v1.3.2 → v1.3.2" beside the words "up to date", and the notification dot lit for any listed driver rather than only the ones with work waiting. Both channel controls now sit together, so an optimizer tracking beta while Core tracks stable is visible rather than implied, and the dialog no longer implies that the channel governs drivers: only Core and the optimizer subscribe to one, while a driver is pinned to an exact version and takes its channel per install. Core's version is printed once instead of three times; the two backup lists collapse into one section carrying their counts; and Restart, which drops dispatch until Core is healthy again, asks first and no longer carries the same weight as the primary action. diff --git a/.changeset/refresh-x-net-security.md b/.changeset/refresh-x-net-security.md deleted file mode 100644 index abc3b27e..00000000 --- a/.changeset/refresh-x-net-security.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Update Go network dependencies to include current DNS parser security fixes. diff --git a/.changeset/remote-home-link-beta.md b/.changeset/remote-home-link-beta.md deleted file mode 100644 index 45faab05..00000000 --- a/.changeset/remote-home-link-beta.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add opt-in Home Link remote access with local passkey setup, end-to-end encrypted relay sessions, and four bounded read-only views. diff --git a/.changeset/secure-local-home-link-passkeys.md b/.changeset/secure-local-home-link-passkeys.md deleted file mode 100644 index 22535162..00000000 --- a/.changeset/secure-local-home-link-passkeys.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add local, revocable Home Link passkey enrollment and verification. diff --git a/.changeset/show-driver-verification-when-picking.md b/.changeset/show-driver-verification-when-picking.md deleted file mode 100644 index daa85682..00000000 --- a/.changeset/show-driver-verification-when-picking.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Setup now says how well tested a driver is before you pick one. The signed channel carries drivers that have run on customer sites for months alongside ones nobody has put on hardware, and both used to be described identically. Each option now ends in plain words — verified on hardware, in testing, untested — and selecting one shows its version, whether it came from your own override, the signed channel or this build, and what the driver says about its own testing. diff --git a/.changeset/show-home-link-overview.md b/.changeset/show-home-link-overview.md deleted file mode 100644 index 3c6cb2ce..00000000 --- a/.changeset/show-home-link-overview.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Show Home Link as a readable remote energy overview instead of raw JSON, and fix its light and dark theme colours. diff --git a/CHANGELOG.md b/CHANGELOG.md index f2d8fc70..7df1aca5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ # Changelog +## 1.12.0 + +### Minor Changes + +- 86a6c83: Accept the canonical driver spellings alongside the current ones, so srcfl/device-drivers can convert its catalog one driver at a time without any site losing telemetry. `host.emit` reads `W` and `SoC_nom_fract` when `w` and `soc` are absent, and `write`, `write_registers` and `now_ms` are registered as aliases of `modbus_write`, `modbus_write_multi` and `millis`. Nothing is removed; the older names keep working until the catalog has moved. +- 7673003: Add the four Blixt L1 host services FTW was still missing, so a driver converted in `srcfl/device-drivers` runs here unchanged. `host.set_model(name)` and `host.set_rated_w(watts)` record the rest of the nameplate beside make and serial, and the host repeats both on every emit so they reach Nova's `model` and `rated_power_w` without the driver restating them each poll. `host.set_warmup_s(seconds)` holds off the first poll for a device that answers Modbus before its registers are meaningful. `host.decode_string(registers, start, count)` reads ASCII from a register block — two characters per register, high byte first, trailing padding stripped — replacing the byte loop a dozen catalog drivers hand-roll. Nothing is removed and no existing driver behaves differently. +- a5a797e: Add encrypted Home Link sessions for four bounded, read-only Core views with session-bound one-use grants. +- e1d8055: Add the first Home Link remote transport: a strict versioned wire and a separate invite-only relay that forwards only encrypted session frames. +- 8b16975: A driver downloaded from the signed channel can now control the hardware it was ported to control. FTW refused any device-drivers artifact that was not marked read-only, and the channel marked all of them read-only, so the same source file could drive a battery when it shipped with the build and could not when it was downloaded. A driver published with a control path now runs under the same terms as the bundled copy of that same source. A driver that declares itself read-only — a meter, a telemetry gateway — still gets a read-only policy, and a manifest whose read_only and control_enabled disagree is refused outright. +- a9847e8: Switch driver versions, and switch back when the new one misbehaves. Nothing from the signed channel could be installed at all: the metadata parser only read a DRIVER table written inline, and signed artifacts assign it from a local, so every install failed validation with an empty id and version. The Versions list rendered no rows because it read the version off the wrong object, and its install call omitted the repository id the API requires. Going back to the bundled driver was impossible once a channel version was installed — the bundled copy is not an install, so nothing could activate it — which is the case that matters most, since installing over the bundled driver is the first thing anyone does. Each driver row now says which version runs, whether it came from the channel or your own file, and how well tested it is; the version list offers one click to switch, a standing way back to the copy that shipped with the build, and an undo after a switch. +- 25c5604: Pick which driver version runs, and see when your own copy has fallen behind. The signed channel keeps every version it has ever published, but rollback only stepped back one, so a specific older version was out of reach from the UI. Each managed driver now has a Versions list showing what is downloaded, what the channel offers, and which one is live. A driver you supply yourself is now also told when the channel has something newer — your copy keeps running until you decide otherwise. +- a5f9c23: Add opt-in Home Link remote access with local passkey setup, end-to-end encrypted relay sessions, and four bounded read-only views. +- 1418c00: Add local, revocable Home Link passkey enrollment and verification. +- f83c6df: Setup now says how well tested a driver is before you pick one. The signed channel carries drivers that have run on customer sites for months alongside ones nobody has put on hardware, and both used to be described identically. Each option now ends in plain words — verified on hardware, in testing, untested — and selecting one shows its version, whether it came from your own override, the signed channel or this build, and what the driver says about its own testing. + +### Patch Changes + +- c1c9fd6: The bundled `drivers/` tree is now a generated snapshot of srcfl/device-drivers, pinned by commit, with CI failing if the two drift. It had become a second source of truth and had already diverged: a Sungrow fix landed upstream while the bundled copy kept reading a battery block on inverters that have no battery, which is what took a customer's SG12RT offline. That copy is now correct, and cannot silently fall behind again. +- f1bd56f: Accept the shipped Home Link route-handle format in remote browser invites. +- 1efb08e: Fix Home Link sessions being rejected over a few milliseconds of clock difference between the gateway and the browser. A gateway now issues a session lifetime below the verifier ceiling, so remote passkey access works instead of failing with "Could not reach this home". Reads also reopen a bounded session instead of leaving the page dead until a reload, and a failed session or read now states its cause. +- b641b2c: Map `rated_W`, `rated_power_W` and `rated_w` onto `rated_power_w`, the name `nova.DerTelemetry` reads. None of the three was mapped, so a device's rated AC power has never reached Nova — including from our own `zap.lua`, which emits `rated_power_W`. +- d39ace3: Map driver emit keys onto the names the Nova payload reads. Catalog drivers emit `import_wh`, `export_wh`, `charge_wh`, `discharge_wh`, `lifetime_wh` and `hz`, while `DerTelemetry` reads `total_import_wh`, `total_export_wh`, `total_charge_wh`, `total_discharge_wh`, `total_generation_wh` and `freq_hz` — so those values never left the gateway. The canonical `@srcful/data-models` spellings map onto the same names, so the driver catalog can convert without a further host change. +- 63b5f8b: The update dialog now leads with what the box is running. Every configured component keeps a row in one table — Core, the optimizer and each driver — whether or not it has an update waiting, so a driver only appeared when it was behind and could never be checked otherwise. The summary counts the whole inventory instead of Core alone, and says when the last check ran, which the dialog knew but never showed. Two fixes came out of the same pass: the optimizer row drew "v1.3.2 → v1.3.2" beside the words "up to date", and the notification dot lit for any listed driver rather than only the ones with work waiting. Both channel controls now sit together, so an optimizer tracking beta while Core tracks stable is visible rather than implied, and the dialog no longer implies that the channel governs drivers: only Core and the optimizer subscribe to one, while a driver is pinned to an exact version and takes its channel per install. Core's version is printed once instead of three times; the two backup lists collapse into one section carrying their counts; and Restart, which drops dispatch until Core is healthy again, asks first and no longer carries the same weight as the primary action. +- bbc3f6e: Update Go network dependencies to include current DNS parser security fixes. +- b2993b5: Show Home Link as a readable remote energy overview instead of raw JSON, and fix its light and dark theme colours. + ## 1.11.4 ### Patch Changes diff --git a/package-lock.json b/package-lock.json index 31c40b97..fd3320e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ftw", - "version": "1.11.4", + "version": "1.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ftw", - "version": "1.11.4", + "version": "1.12.0", "devDependencies": { "@changesets/cli": "^2.27.10" } diff --git a/package.json b/package.json index 1fd31cb1..208771b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ftw", - "version": "1.11.4", + "version": "1.12.0", "private": true, "type": "module", "description": "FTW — local-first home energy coordination. Version metadata only; the runtime is Go and the mathematical planner is Python/CVXPY.",