diff --git a/CHANGELOG.md b/CHANGELOG.md index 2798234be8c4..c3f435a722fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ Docs: https://docs.openclaw.ai - Agents/subagents: recover stale completion announces by retrying unsupported transcript-wait wakes without transcript waiting and forcing a message-tool handoff when the requester run is already stale. Fixes #83699. (#83700) Thanks @galiniliev. - Agents/subagents: skip stale embedded-run wake probes for dormant completion requesters, so late subagent completions go straight to requester-agent/direct handoff instead of producing `reason=no_active_run` queue noise. (#82964) Thanks @galiniliev. - CLI: retry config snapshot reads after a transient failure so one rejected read no longer poisons later commands in the same process. (#83931) Thanks @honor2030. -- Media: decode URL path basenames before using them as remote media fallback filenames, so files like `My%20Report.pdf` are surfaced as `My Report.pdf`. Fixes #84050. +- Media: decode URL path basenames before using them as remote media fallback filenames, so files like `My%20Report.pdf` are surfaced as `My Report.pdf`. Fixes #84050. (#84052) Thanks @jbetala7. - WhatsApp: clarify inbound group diagnostics so observed but unregistered groups point to `channels.whatsapp.groups` without changing routing or sender authorization. (#83846) Thanks @neeravmakwana. - WhatsApp: drain pending outbound deliveries on a 30s periodic timer in addition to the reconnect handler, so messages enqueued while the provider is already connected no longer wait for the next reconnect to send. (#79083) Thanks @Oviemudiaga. - CLI/TUI: include gateway plugin slash commands in TUI autocomplete, so connected sessions can suggest plugin-owned commands exposed by the running Gateway. (#83640) Thanks @se7en-agent. diff --git a/src/media/fetch.test.ts b/src/media/fetch.test.ts index c7c91bccd47c..b76ea077e6e9 100644 --- a/src/media/fetch.test.ts +++ b/src/media/fetch.test.ts @@ -624,6 +624,7 @@ describe("readRemoteMediaBuffer", () => { it.each([ ["https://example.com/files/reports%2FQ1.pdf", "reports_Q1.pdf"], ["https://example.com/files/reports%5CQ1.pdf", "reports_Q1.pdf"], + ["https://example.com/files/reports%2F%2FQ1.pdf", "reports__Q1.pdf"], ])( "keeps decoded URL fallback separators inside the selected basename", async (url, fileName) => { diff --git a/src/media/fetch.ts b/src/media/fetch.ts index 69a1b34a93f3..e586a1ae3815 100644 --- a/src/media/fetch.ts +++ b/src/media/fetch.ts @@ -135,7 +135,7 @@ function basenameFromUrlPathname(pathname: string): string { return ""; } try { - return decodeURIComponent(base).replace(/[\\/]+/g, "_"); + return decodeURIComponent(base).replace(/[\\/]/g, "_"); } catch { return base; }