UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

66 lines (65 loc) 2.91 kB
import "./redact-DduLliKq.js"; import "./errors-BXgSefBE.js"; import { _ as uniqueStrings } from "./string-normalization-WNUDCpXX.js"; import "./fs-safe-defaults-B7hUN42l.js"; import "./fs-safe-aqmM_n6V.js"; import { a as root } from "./secure-temp-dir-XAWcZnE2.js"; import "./replace-file-BrS02dAb.js"; import "./path-guards-CBe_wA_B.js"; import "./private-file-store-BAvApZYp.js"; import "./shared-CuqTS6Vs.js"; import "./runtime-shared-DR5938Io.js"; import "./fs-safe-advanced-CBe_wA_B.js"; import "./ports-CoxQQbiY.js"; import "./ssrf-CvPEXMGn.js"; import "./sibling-temp-file-CBe_wA_B.js"; import "./channel-secret-collector-runtime-DsG-cUnu.js"; import { i as wrapExternalContent } from "./external-content-pX-Pk1Iu.js"; import "./channel-access-compat-D8U8oQUf.js"; //#region src/security/channel-metadata.ts const DEFAULT_MAX_CHARS = 800; const DEFAULT_MAX_ENTRY_CHARS = 400; function normalizeEntry(entry) { return entry.replace(/\s+/g, " ").trim(); } function truncateText(value, maxChars) { if (maxChars <= 0) return ""; if (value.length <= maxChars) return value; return `${value.slice(0, Math.max(0, maxChars - 3)).trimEnd()}...`; } /** * Build bounded, externally wrapped channel metadata for prompt context. * Channel-provided labels can be user-controlled, so callers must treat this as untrusted content. */ function buildUntrustedChannelMetadata(params) { const deduped = uniqueStrings(params.entries.map((entry) => typeof entry === "string" ? normalizeEntry(entry) : "").filter((entry) => Boolean(entry)).map((entry) => truncateText(entry, DEFAULT_MAX_ENTRY_CHARS))); if (deduped.length === 0) return; const body = deduped.join("\n"); return wrapExternalContent(truncateText(`${`UNTRUSTED channel metadata (${params.source})`}\n${`${params.label}:\n${body}`}`, params.maxChars ?? DEFAULT_MAX_CHARS), { source: "channel_metadata", includeWarning: false }); } //#endregion //#region src/plugin-sdk/security-runtime.ts /** * @deprecated Broad public SDK barrel. Prefer focused security/SSRF/secret * subpaths and avoid adding new imports here. */ /** Safely open a path beneath a trusted root while rejecting hardlinks and unsafe symlinks by default. */ async function openFileWithinRoot(params) { return await (await root(params.rootDir)).open(params.relativePath, { hardlinks: params.rejectHardlinks === false ? "allow" : "reject", nonBlockingRead: params.nonBlockingRead, symlinks: params.allowSymlinkTargetWithinRoot === true ? "follow-within-root" : "reject" }); } /** Copy a source file into a path beneath a trusted root using fs-safe root policy. */ async function writeFileFromPathWithinRoot(params) { await (await root(params.rootDir)).copyIn(params.relativePath, params.sourcePath, { mkdir: params.mkdir, sourceHardlinks: "reject" }); } //#endregion export { writeFileFromPathWithinRoot as n, buildUntrustedChannelMetadata as r, openFileWithinRoot as t };