diff --git a/.changeset/history-keeps-its-errors.md b/.changeset/history-keeps-its-errors.md new file mode 100644 index 0000000..e846094 --- /dev/null +++ b/.changeset/history-keeps-its-errors.md @@ -0,0 +1,21 @@ +--- +"fiber": patch +--- + +A response body that fails to load, or a history clear that fails, is reported +in the History tab again instead of vanishing the moment the tab opens. + +History now catches up with what the MCP server records whenever the tab is +opened, and a catch-up that succeeded cleared every error on the way — including +the one the tab was being opened to show. It now clears only an earlier failure +to list history, which is the one a successful list resolves. + +Also moves rustls to 0.23.45 for RUSTSEC-2026-0285, in which TLS 1.3 handshake +messages were accepted across encryption level boundaries, and fast-uri (used by +the editor's schema linting) to 3.1.8 for two advisories on how it parses a +URI's authority. + +Clicking another collection's settings cog while a settings drawer is open now +reliably switches to that collection. The click also counted as dismissing the +open drawer, and when the dismissal landed last the drawer closed and stayed +closed. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb53f10..14eb72d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -891,8 +891,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.6: - resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -2045,7 +2045,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.6 + fast-uri: 3.1.8 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -2139,7 +2139,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.6: {} + fast-uri@3.1.8: {} fast-wrap-ansi@0.2.2: dependencies: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 3746ae0..eb6487e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3890,9 +3890,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.43" +version = "0.23.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" dependencies = [ "aws-lc-rs", "once_cell", @@ -5057,7 +5057,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.3", + "getrandom 0.3.4", "once_cell", "rustix", "windows-sys 0.61.2", diff --git a/src/lib/components/SectionSettings.svelte b/src/lib/components/SectionSettings.svelte index ec39cdc..ef397ad 100644 --- a/src/lib/components/SectionSettings.svelte +++ b/src/lib/components/SectionSettings.svelte @@ -304,8 +304,20 @@ and usable — you are configuring a collection you can still see. --> + { + if (event.target instanceof Element && event.target.closest('[data-opens-settings]')) { + event.preventDefault(); + } + }} >
Section settings diff --git a/src/lib/components/Sidebar.svelte b/src/lib/components/Sidebar.svelte index fd2d2e7..1051de1 100644 --- a/src/lib/components/Sidebar.svelte +++ b/src/lib/components/Sidebar.svelte @@ -1110,6 +1110,7 @@ {...props} type="button" aria-label="Settings for {section.name}" + data-opens-settings onclick={(event) => { event.stopPropagation(); onOpenSettings(section); diff --git a/src/lib/history.svelte.ts b/src/lib/history.svelte.ts index 26e41c3..48a2609 100644 --- a/src/lib/history.svelte.ts +++ b/src/lib/history.svelte.ts @@ -97,13 +97,31 @@ class History { * clicked went nowhere. */ viewingId = $state(null); + /** + * The message of the last list that failed, if `error` still shows it. + * + * A list that succeeds resolves that error and no other. `refresh` runs + * every time the History tab opens, and clearing `error` outright there + * wiped a failed body load or clear the moment the tab that reports it was + * opened. + */ + #listError: string | null = null; + + #listed(): void { + if (this.error !== null && this.error === this.#listError) this.error = null; + this.#listError = null; + } + + #listFailed(error: unknown): void { + this.error = this.#listError = String(error); + } async load(): Promise { try { this.entries = (await historyList()).map(fromRecord); - this.error = null; + this.#listed(); } catch (error) { - this.error = String(error); + this.#listFailed(error); } } @@ -123,9 +141,9 @@ class History { let records: HistoryRecord[]; try { records = await historyList(); - this.error = null; + this.#listed(); } catch (error) { - this.error = String(error); + this.#listFailed(error); return; } const known = new Set(this.entries.map((entry) => entry.id));