




















@@ -27,6 +27,7 @@ import {
2727mimeTypeFromFilePath,
2828normalizeMimeType,
2929} from "./mime.js";
30+import { resolveMediaBufferPath } from "./store.js";
30313132export { getDefaultLocalRoots, LocalMediaAccessError };
3233export type { LocalMediaAccessErrorCode };
@@ -56,6 +57,46 @@ type WebMediaOptions = {
5657hostReadCapability?: boolean;
5758};
585960+async function resolveMediaStoreUriToPath(mediaUrl: string): Promise<string | null> {
61+if (!mediaUrl.startsWith("media://")) {
62+return null;
63+}
64+let parsed: URL;
65+try {
66+parsed = new URL(mediaUrl);
67+} catch (err) {
68+throw new LocalMediaAccessError("invalid-path", `Invalid media URI: ${mediaUrl}`, {
69+cause: err,
70+});
71+}
72+if (parsed.hostname !== "inbound") {
73+throw new LocalMediaAccessError(
74+"path-not-allowed",
75+`Unsupported media URI location: ${parsed.hostname || "(missing)"}`,
76+);
77+}
78+let id: string;
79+try {
80+id = decodeURIComponent(parsed.pathname.replace(/^\/+/, ""));
81+} catch (err) {
82+throw new LocalMediaAccessError("invalid-path", `Invalid media URI: ${mediaUrl}`, {
83+cause: err,
84+});
85+}
86+if (!id || id.includes("/")) {
87+throw new LocalMediaAccessError("invalid-path", `Invalid media URI: ${mediaUrl}`);
88+}
89+try {
90+return await resolveMediaBufferPath(id, "inbound");
91+} catch (err) {
92+throw new LocalMediaAccessError(
93+"invalid-path",
94+err instanceof Error ? err.message : `Invalid media URI: ${mediaUrl}`,
95+{ cause: err },
96+);
97+}
98+}
99+59100function resolveWebMediaOptions(params: {
60101maxBytesOrOptions?: number | WebMediaOptions;
61102options?: { ssrfPolicy?: SsrFPolicy; localRoots?: readonly string[] | "any" };
@@ -356,7 +397,10 @@ async function loadWebMediaInternal(
356397} = options;
357398// Strip MEDIA: prefix used by agent tools (e.g. TTS) to tag media paths.
358399// Be lenient: LLM output may add extra whitespace (e.g. " MEDIA : /tmp/x.png").
359-mediaUrl = mediaUrl.replace(/^\s*MEDIA\s*:\s*/i, "");
400+if (!/^\s*media:\/\//i.test(mediaUrl)) {
401+mediaUrl = mediaUrl.replace(/^\s*MEDIA\s*:\s*/i, "");
402+}
403+mediaUrl = (await resolveMediaStoreUriToPath(mediaUrl)) ?? mediaUrl;
360404// Use fileURLToPath for proper handling of file:// URLs (handles file://localhost/path, etc.)
361405if (mediaUrl.startsWith("file://")) {
362406try {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。