mirror of
http://192.168.0.88:13333/lywsvip/openclaw-zero-token.git
synced 2026-05-10 09:08:54 +08:00
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
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
const XML_ESCAPE_MAP: Record<string, string> = {
|
|
"<": "<",
|
|
">": ">",
|
|
"&": "&",
|
|
'"': """,
|
|
"'": "'",
|
|
};
|
|
|
|
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, "</file>").replace(/<\s*file\b/gi, "<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>`;
|
|
}
|