Files
openclaw-zero-token/media/file-context.ts
sjhu 571e14a236 feat: upgrade to upstream v2026.3.28
Major upgrade from e26988a38 to upstream v2026.3.28 (f9b107928).
Key changes:
- Upstream src/, ui/, extensions/ (89 bundled extensions)
- Zero-token web providers preserved in src/zero-token/
- AskOnce plugin restored and registered as CLI command
- Added missing packages: @anthropic-ai/vertex-sdk, @modelcontextprotocol/sdk
- Fixed tsconfig rootDir, skipLibCheck for plugin-sdk DTS build
- Added askonce to bundled plugin metadata and package.json exports
- Fixed AskOnce CLI command registration (missing commands metadata)
- Restored AskOnce adapter imports (correct 5-level relative paths)
- Removed stale migration artifacts from root directory
2026-03-30 17:58:12 +08:00

49 lines
1.5 KiB
TypeScript

const XML_ESCAPE_MAP: Record<string, string> = {
"<": "&lt;",
">": "&gt;",
"&": "&amp;",
'"': "&quot;",
"'": "&apos;",
};
function xmlEscapeAttr(value: string): string {
return value.replace(/[<>&"']/g, (char) => XML_ESCAPE_MAP[char] ?? char);
}
function escapeFileBlockContent(value: string): string {
return value.replace(/<\s*\/\s*file\s*>/gi, "&lt;/file&gt;").replace(/<\s*file\b/gi, "&lt;file");
}
function sanitizeFileName(value: string | null | undefined, fallbackName: string): string {
const normalized = typeof value === "string" ? value.replace(/[\r\n\t]+/g, " ").trim() : "";
return normalized || fallbackName;
}
export function renderFileContextBlock(params: {
filename?: string | null;
fallbackName?: string;
mimeType?: string | null;
content: string;
surroundContentWithNewlines?: boolean;
}): string {
const fallbackName =
typeof params.fallbackName === "string" && params.fallbackName.trim().length > 0
? params.fallbackName.trim()
: "attachment";
const safeName = sanitizeFileName(params.filename, fallbackName);
const safeContent = escapeFileBlockContent(params.content);
const attrs = [
`name="${xmlEscapeAttr(safeName)}"`,
typeof params.mimeType === "string" && params.mimeType.trim()
? `mime="${xmlEscapeAttr(params.mimeType.trim())}"`
: undefined,
]
.filter(Boolean)
.join(" ");
if (params.surroundContentWithNewlines === false) {
return `<file ${attrs}>${safeContent}</file>`;
}
return `<file ${attrs}>\n${safeContent}\n</file>`;
}