From fdacfc571c2556d2eb0f8668ac3c45913db0a2fe Mon Sep 17 00:00:00 2001 From: Artale <117890364+arosstale@users.noreply.github.com> Date: Sat, 14 Feb 2026 01:38:38 +0100 Subject: [PATCH] fix(media): classify text/* MIME types as documents (openclaw#12341) thanks @arosstale Verified: - pnpm build - pnpm check - pnpm test Co-authored-by: arosstale <117890364+arosstale@users.noreply.github.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> --- CHANGELOG.md | 1 + src/media/constants.test.ts | 14 ++++++++++++++ src/media/constants.ts | 3 +++ 3 files changed, 18 insertions(+) create mode 100644 src/media/constants.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 52f195a220..d6917e8db6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ Docs: https://docs.openclaw.ai - Inbound/Web UI: preserve literal `\n` sequences when normalizing inbound text so Windows paths like `C:\\Work\\nxxx\\README.md` are not corrupted. (#11547) Thanks @mcaxtr. - Daemon/Windows: preserve literal backslashes in `gateway.cmd` command parsing so drive and UNC paths are not corrupted in runtime checks and doctor entrypoint comparisons. (#15642) Thanks @arosstale. - Security/Canvas: serve A2UI assets via the shared safe-open path (`openFileWithinRoot`) to close traversal/TOCTOU gaps, with traversal and symlink regression coverage. (#10525) Thanks @abdelsfane. +- Media: classify `text/*` MIME types as documents in media-kind routing so text attachments are no longer treated as unknown. (#12237) Thanks @arosstale. - Security/Gateway: breaking default-behavior change - canvas IP-based auth fallback now only accepts machine-scoped addresses (RFC1918, link-local, ULA IPv6, CGNAT); public-source IP matches now require bearer token auth. (#14661) Thanks @sumleo. - Security/Gateway: sanitize and truncate untrusted WebSocket header values in pre-handshake close logs to reduce log-poisoning risk. Thanks @thewilloftheshadow. - Security/WhatsApp: enforce `0o600` on `creds.json` and `creds.json.bak` on save/backup/restore paths to reduce credential file exposure. (#10529) Thanks @abdelsfane. diff --git a/src/media/constants.test.ts b/src/media/constants.test.ts new file mode 100644 index 0000000000..613f4c4b38 --- /dev/null +++ b/src/media/constants.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, it } from "vitest"; +import { mediaKindFromMime } from "./constants.js"; + +describe("mediaKindFromMime", () => { + it("classifies text mimes as document", () => { + expect(mediaKindFromMime("text/plain")).toBe("document"); + expect(mediaKindFromMime("text/csv")).toBe("document"); + expect(mediaKindFromMime("text/html; charset=utf-8")).toBe("document"); + }); + + it("keeps unknown mimes as unknown", () => { + expect(mediaKindFromMime("model/gltf+json")).toBe("unknown"); + }); +}); diff --git a/src/media/constants.ts b/src/media/constants.ts index 63fdc03fcc..5dec8cedbf 100644 --- a/src/media/constants.ts +++ b/src/media/constants.ts @@ -21,6 +21,9 @@ export function mediaKindFromMime(mime?: string | null): MediaKind { if (mime === "application/pdf") { return "document"; } + if (mime.startsWith("text/")) { + return "document"; + } if (mime.startsWith("application/")) { return "document"; }