openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
79 lines (78 loc) • 3.88 kB
JavaScript
import "./fs-safe-aqmM_n6V.js";
import { i as readLocalFileSafely } from "./secure-temp-dir-XAWcZnE2.js";
import "./agent-scope-MrLta7Pq.js";
import { o as resolveAgentWorkspaceDir } from "./agent-scope-config-CgCYpZfK.js";
import { n as resolveWorkspaceRoot, r as resolvePathFromInput } from "./workspace-dir-DzA-cRQQ.js";
import { t as isToolAllowedByPolicies } from "./tool-policy-match-Dj5a1jle.js";
import { r as resolveGroupToolPolicy } from "./agent-tools.policy-dtD_g0G1.js";
import { i as getAgentScopedMediaLocalRootsForSources, r as getAgentScopedMediaLocalRoots, s as resolveEffectiveToolFsRootExpansionAllowed } from "./local-roots-BqdtViGS.js";
import path from "node:path";
//#region src/media/read-capability.ts
function isAgentScopedHostMediaReadAllowed(params) {
if (!resolveEffectiveToolFsRootExpansionAllowed({
cfg: params.cfg,
agentId: params.agentId
})) return false;
const groupPolicy = resolveGroupToolPolicy({
config: params.cfg,
sessionKey: params.sessionKey,
messageProvider: params.messageProvider,
groupId: params.groupId,
groupChannel: params.groupChannel,
groupSpace: params.groupSpace,
accountId: params.accountId,
senderId: params.requesterSenderId,
senderName: params.requesterSenderName,
senderUsername: params.requesterSenderUsername,
senderE164: params.requesterSenderE164
});
if (groupPolicy && !isToolAllowedByPolicies("read", [groupPolicy])) return false;
return true;
}
/** Creates a host reader bound to the agent workspace and configured local-file safety checks. */
function createAgentScopedHostMediaReadFile(params) {
if (!isAgentScopedHostMediaReadAllowed(params)) return;
const workspaceRoot = resolveWorkspaceRoot(params.workspaceDir ?? (params.agentId ? resolveAgentWorkspaceDir(params.cfg, params.agentId) : void 0));
return async (filePath) => {
return (await readLocalFileSafely({ filePath: resolvePathFromInput(filePath, workspaceRoot) })).buffer;
};
}
function appendWorkspaceDirToLocalRoots(roots, workspaceDir) {
if (!workspaceDir) return roots;
const resolvedWorkspaceDir = path.resolve(workspaceDir);
if (!roots?.length) return [resolvedWorkspaceDir];
if (roots.some((root) => path.resolve(root) === resolvedWorkspaceDir)) return roots;
return [...roots, resolvedWorkspaceDir];
}
/** Resolves roots and optional host read capability for outbound media in an agent context. */
function resolveAgentScopedOutboundMediaAccess(params) {
const resolvedWorkspaceDir = params.workspaceDir ?? params.mediaAccess?.workspaceDir ?? (params.agentId ? resolveAgentWorkspaceDir(params.cfg, params.agentId) : void 0);
const hostMediaReadAllowed = isAgentScopedHostMediaReadAllowed(params);
const localRoots = appendWorkspaceDirToLocalRoots(params.mediaAccess?.localRoots ?? (hostMediaReadAllowed ? getAgentScopedMediaLocalRootsForSources({
cfg: params.cfg,
agentId: params.agentId,
mediaSources: params.mediaSources
}) : getAgentScopedMediaLocalRoots(params.cfg, params.agentId)), resolvedWorkspaceDir);
const readFile = params.mediaAccess?.readFile ?? params.mediaReadFile ?? (hostMediaReadAllowed ? createAgentScopedHostMediaReadFile({
cfg: params.cfg,
agentId: params.agentId,
workspaceDir: resolvedWorkspaceDir,
sessionKey: params.sessionKey,
messageProvider: params.messageProvider,
groupId: params.groupId,
groupChannel: params.groupChannel,
groupSpace: params.groupSpace,
accountId: params.accountId,
requesterSenderId: params.requesterSenderId,
requesterSenderName: params.requesterSenderName,
requesterSenderUsername: params.requesterSenderUsername,
requesterSenderE164: params.requesterSenderE164
}) : void 0);
return {
...localRoots?.length ? { localRoots } : {},
...readFile ? { readFile } : {},
...resolvedWorkspaceDir ? { workspaceDir: resolvedWorkspaceDir } : {}
};
}
//#endregion
export { resolveAgentScopedOutboundMediaAccess as t };