diff --git a/.changeset/live-container-credentials.md b/.changeset/live-container-credentials.md deleted file mode 100644 index 4c4cb17..0000000 --- a/.changeset/live-container-credentials.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -"fiber": minor ---- - -Signing in again now reaches a running containerised MCP server. - -Under ToolHive the server took its credentials from `FIBER_SECRETS`, read once -at startup, so a container held whatever was true when it began: you signed in, -the keychain got the new token, and the server went on presenting the expired -one until someone re-exported the secrets and replaced the workload. - -Credentials can now travel through the collections directory the container -already mounts. The app rewrites that file whenever a credential changes, the -server re-reads it, and the 401 retry that was already there picks the new value -up — no re-export, no restart. - -The file is sealed with XChaCha20-Poly1305 and the key stays out of the mount: -in the keychain on the app's side, in ToolHive's encrypted store on the -container's. Its existence is the opt-in, so a desktop-only install never has -credentials on disk. New: `fiber mcp file-key` and `fiber mcp export-secrets ---to `; `scripts/toolhive.sh` wires both up for you. - -Bearer collections needed a second fix to benefit: a static token cannot be -refreshed by replaying a request, so a 401 never dropped it, and a zero-TTL -cache entry has nothing else to expire it — a container would have presented -the token it started with for the life of the workload. A rejected credential -is now dropped from the cache whenever it came from a source that can change -underneath the process, so the next call reads the new one. The desktop app is -unaffected: it has no such source, and the same line there would have cost a -keychain prompt per 401. diff --git a/CHANGELOG.md b/CHANGELOG.md index 362e8fd..fb50cde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # fiber +## 0.15.0 + +### Minor Changes + +- [#92](https://github.com/MathiasWP/fiber/pull/92) [`2414209`](https://github.com/MathiasWP/fiber/commit/24142097e2d31c0695fab824cdf25c1d0300ac3a) Thanks [@MathiasWP](https://github.com/MathiasWP)! - Signing in again now reaches a running containerised MCP server. + + Under ToolHive the server took its credentials from `FIBER_SECRETS`, read once + at startup, so a container held whatever was true when it began: you signed in, + the keychain got the new token, and the server went on presenting the expired + one until someone re-exported the secrets and replaced the workload. + + Credentials can now travel through the collections directory the container + already mounts. The app rewrites that file whenever a credential changes, the + server re-reads it, and the 401 retry that was already there picks the new value + up — no re-export, no restart. + + The file is sealed with XChaCha20-Poly1305 and the key stays out of the mount: + in the keychain on the app's side, in ToolHive's encrypted store on the + container's. Its existence is the opt-in, so a desktop-only install never has + credentials on disk. New: `fiber mcp file-key` and `fiber mcp export-secrets + --to `; `scripts/toolhive.sh` wires both up for you. + + Bearer collections needed a second fix to benefit: a static token cannot be + refreshed by replaying a request, so a 401 never dropped it, and a zero-TTL + cache entry has nothing else to expire it — a container would have presented + the token it started with for the life of the workload. A rejected credential + is now dropped from the cache whenever it came from a source that can change + underneath the process, so the next call reads the new one. The desktop app is + unaffected: it has no such source, and the same line there would have cost a + keychain prompt per 401. + ## 0.14.10 ### Patch Changes diff --git a/package.json b/package.json index 5d15063..abb7cd0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fiber", "private": true, - "version": "0.14.10", + "version": "0.15.0", "type": "module", "packageManager": "pnpm@11.22.0", "engines": { diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 0303e28..d412033 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1354,7 +1354,7 @@ dependencies = [ [[package]] name = "fiber" -version = "0.14.10" +version = "0.15.0" dependencies = [ "base64 0.23.1", "chacha20poly1305", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index aef2199..ef6b406 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fiber" -version = "0.14.10" +version = "0.15.0" description = "A local-first API client" authors = ["Mathias Picker"] license = "MIT" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 96cbc98..4c49898 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "productName": "Fiber", - "version": "0.14.10", + "version": "0.15.0", "identifier": "dev.fiber.app", "build": { "frontendDist": "../build",