openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
230 lines (229 loc) • 10.4 kB
JavaScript
import { i as resolveGlobalSingleton } from "./global-singleton-Dc_stLtU.js";
import { y as uniqueStrings } from "./string-normalization-DsCfAx8q.js";
import { u as resolveToolProfilePolicy } from "./tool-policy-shared-DIyS0iQC.js";
import { n as pickSandboxToolPolicy } from "./sandbox-tool-policy-G7E6RfNN.js";
import { a as collectExplicitDenylist, i as collectExplicitAllowlist, l as mergeAlsoAllowPolicy } from "./tool-policy-Wi0C45cX.js";
import "./message-channel-constants-2zSoJXQC.js";
import { n as normalizeMessageChannel } from "./message-channel-core-AaEWic-A.js";
import { t as normalizeChatType } from "./chat-type-CG0X_HJM.js";
import { n as resolveEffectiveToolPolicy, o as resolveTrustedGroupId, s as sessionKeyNamesGroupConversation } from "./agent-tools.policy-NF_9Y4S4.js";
import { n as resolveWorkspaceRoot } from "./workspace-dir-CA-p1R3_.js";
import { n as resolveRequesterToolPolicies } from "./requester-tool-policy-QJhnbudW.js";
import { AsyncLocalStorage } from "node:async_hooks";
//#region src/agents/session-placement-computer.ts
const placementComputer = resolveGlobalSingleton(Symbol.for("openclaw.sessionPlacementComputer"), () => new AsyncLocalStorage());
/** Absence means ordinary node routing; null explicitly withholds an unavailable placed desktop. */
function resolveSessionPlacementComputer(run) {
const context = placementComputer.getStore();
return context ? run && run.runId === context.runId && context.isActive() ? context.bind(run) : null : void 0;
}
/** Select policy facts without opening a transport or activating a dormant sandbox. */
function resolveSessionPlacementSandboxToolPolicy(policy, scope) {
const context = placementComputer.getStore();
return policy && context && scope.runId === context.runId && scope.agentId === context.agentId && context.isActive() ? context.sandboxToolPolicy ?? policy : policy;
}
function withSessionPlacementComputer(context, run) {
return placementComputer.run(context, run);
}
//#endregion
//#region src/agents/conversation-capability-profile.ts
/**
* Resolves the conversation-scoped runtime facts that tool and harness policy
* hot paths share. Keep this internal: it prepares existing config/state, not a
* new public access-profile config surface.
*/
function resolveManifestToolProfileNames(snapshot, profile) {
if (!profile) return [];
return uniqueStrings((snapshot?.plugins ?? []).flatMap((plugin) => (plugin.contracts?.tools ?? []).filter((toolName) => plugin.toolMetadata?.[toolName]?.profiles?.some((candidate) => candidate === profile))));
}
function resolveConversationCapabilityProfile(params) {
const messageProvider = params.messageProvider;
const effective = resolveEffectiveToolPolicy({
config: params.config,
sessionKey: params.sessionKey,
agentId: params.agentId,
modelProvider: params.modelProvider,
modelId: params.modelId
});
const sandboxToolPolicy = resolveSessionPlacementSandboxToolPolicy(params.sandboxToolPolicy, {
runId: params.runId,
agentId: effective.agentId
});
const trustedGroup = resolveTrustedGroupId({
sessionKey: params.sessionKey,
spawnedBy: params.spawnedBy,
groupId: params.groupId
});
const trustedGroupChannel = trustedGroup.dropped ? null : params.groupChannel;
const trustedGroupSpace = trustedGroup.dropped ? null : params.groupSpace;
const isOwnerInternalSession = params.senderIsOwner === true && normalizeMessageChannel(messageProvider ?? params.messageChannel) === "webchat";
const subagentSessionKey = params.sandboxSessionKey ?? params.sessionKey;
const requesterPolicies = resolveRequesterToolPolicies({
config: params.config,
sessionKey: params.sessionKey,
subagentSessionKey,
agentId: effective.agentId,
spawnedBy: params.spawnedBy,
messageProvider,
groupId: trustedGroup.groupId,
groupChannel: trustedGroupChannel,
groupSpace: trustedGroupSpace,
accountId: params.scheduledToolPolicy?.ownerAccountId ?? params.agentAccountId,
senderId: params.senderId,
senderName: params.senderName,
senderUsername: params.senderUsername,
senderE164: params.senderE164,
inputProvenance: params.inputProvenance,
trustedInternalHandoff: params.trustedInternalHandoff,
sessionId: params.sessionId,
modelProvider: params.modelProvider,
modelId: params.modelId,
senderPolicyMode: params.scheduledToolPolicy || isOwnerInternalSession ? "never" : "always",
groupPolicySessionKey: params.scheduledToolPolicy?.ownerSessionKey,
requireConfiguredGroupAccount: params.scheduledToolPolicy?.mode === "account",
conversationPolicy: pickSandboxToolPolicy(params.conversationToolPolicy)
});
const { groupPolicy, senderPolicy, subagentPolicy, inheritedToolPolicy } = requesterPolicies;
const profilePolicy = mergeAlsoAllowPolicy(resolveToolProfilePolicy(effective.profile), resolveManifestToolProfileNames(params.pluginMetadataSnapshot, effective.profile));
const providerProfilePolicy = mergeAlsoAllowPolicy(resolveToolProfilePolicy(effective.providerProfile), resolveManifestToolProfileNames(params.pluginMetadataSnapshot, effective.providerProfile));
const configuredOverridePolicies = [
effective.globalPolicy,
effective.globalProviderPolicy,
effective.agentPolicy,
effective.agentProviderPolicy,
groupPolicy,
senderPolicy,
sandboxToolPolicy,
subagentPolicy
];
const runtimeToolPolicy = params.runtimeToolAllowlist ? { allow: params.runtimeToolAllowlist } : void 0;
const runtimeToolPolicyForInheritance = params.inheritRuntimeToolAllowlist === true ? runtimeToolPolicy : void 0;
const runtimeToolAlsoAllowlist = uniqueStrings((params.runtimePluginToolGrant?.toolNames ?? []).map((entry) => entry.trim()).filter(Boolean));
const mergeRuntimeToolAlsoAllowlist = (configured) => {
const merged = uniqueStrings([...configured ?? [], ...runtimeToolAlsoAllowlist]);
return merged.length > 0 ? merged : void 0;
};
const explicitOverridePolicies = [...configuredOverridePolicies, runtimeToolPolicy];
const explicitToolAllowlistPolicies = [
profilePolicy,
providerProfilePolicy,
...configuredOverridePolicies,
inheritedToolPolicy,
runtimeToolPolicy
];
const inheritancePolicies = [
profilePolicy,
providerProfilePolicy,
...configuredOverridePolicies,
inheritedToolPolicy,
runtimeToolPolicyForInheritance
];
return {
agentId: effective.agentId,
serviceIdentity: {
agentId: effective.agentId,
agentDir: params.agentDir,
accountId: params.agentAccountId,
runId: params.runId,
sessionId: params.sessionId
},
model: {
provider: params.modelProvider,
id: params.modelId,
api: params.modelApi,
contextWindowTokens: params.modelContextWindowTokens,
hasVision: params.modelHasVision
},
conversation: {
scope: resolveConversationScope({
chatType: params.chatType,
sessionKey: params.sessionKey,
runSessionKey: params.runSessionKey,
trustedGroup,
groupChannel: trustedGroupChannel,
groupSpace: trustedGroupSpace
}),
chatType: normalizeChatType(params.chatType),
sessionKey: params.runSessionKey ?? params.sessionKey,
policySessionKey: params.sessionKey,
runSessionKey: params.runSessionKey,
sessionId: params.sessionId,
messageProvider,
messageChannel: params.messageChannel,
messageTo: params.messageTo,
messageThreadId: params.messageThreadId,
currentChannelId: params.currentChannelId,
currentMessagingTarget: params.currentMessagingTarget,
currentThreadTs: params.currentThreadTs,
currentMessageId: params.currentMessageId,
groupId: trustedGroup.groupId,
groupChannel: trustedGroupChannel,
groupSpace: trustedGroupSpace,
memberRoleIds: params.memberRoleIds,
spawnedBy: params.spawnedBy
},
sender: {
id: params.senderId,
name: params.senderName,
username: params.senderUsername,
e164: params.senderE164,
isOwner: params.senderIsOwner
},
workspace: {
workspaceDir: params.workspaceDir,
cwd: params.cwd,
spawnWorkspaceDir: params.spawnWorkspaceDir,
workspaceRoot: resolveWorkspaceRoot(params.workspaceDir),
runtimeRoot: resolveWorkspaceRoot(params.cwd ?? params.workspaceDir),
spawnWorkspaceRoot: params.spawnWorkspaceDir ? resolveWorkspaceRoot(params.spawnWorkspaceDir) : void 0,
instructionRoot: params.agentDir ?? params.workspaceDir,
isCanonicalWorkspace: params.isCanonicalWorkspace
},
instructions: {
agentDir: params.agentDir,
workspaceDir: params.workspaceDir,
promptMode: params.promptMode,
isCanonicalWorkspace: params.isCanonicalWorkspace
},
skills: { snapshot: params.skillsSnapshot },
policy: {
agentId: effective.agentId,
sessionKey: params.sessionKey,
subagentSessionKey,
trustedGroup,
profile: effective.profile,
providerProfile: effective.providerProfile,
profilePolicy,
providerProfilePolicy,
profileAlsoAllow: mergeRuntimeToolAlsoAllowlist(effective.profileAlsoAllow),
providerProfileAlsoAllow: mergeRuntimeToolAlsoAllowlist(effective.providerProfileAlsoAllow),
globalPolicy: effective.globalPolicy,
globalProviderPolicy: effective.globalProviderPolicy,
agentPolicy: effective.agentPolicy,
agentProviderPolicy: effective.agentProviderPolicy,
groupPolicy,
senderPolicy,
sandboxPolicy: sandboxToolPolicy,
subagentPolicy,
inheritedToolPolicy,
delegated: requesterPolicies.delegated,
requesterPolicySource: requesterPolicies.requesterPolicySource,
runtimeToolPolicyForInheritance,
inheritancePolicies,
explicitToolAllowlist: collectExplicitAllowlist(explicitToolAllowlistPolicies),
explicitToolOverrideAllowlist: collectExplicitAllowlist(explicitOverridePolicies),
explicitToolDenylist: collectExplicitDenylist(explicitToolAllowlistPolicies),
runtimePluginToolGrant: params.runtimePluginToolGrant
}
};
}
function resolveConversationScope(params) {
const chatType = normalizeChatType(params.chatType);
if (chatType === "direct") return "direct";
if (chatType === "group" || chatType === "channel") return "shared";
if (sessionKeyNamesGroupConversation(params.runSessionKey) || sessionKeyNamesGroupConversation(params.sessionKey)) return "shared";
if (params.trustedGroup.dropped) return "unknown";
return params.trustedGroup.groupId?.trim() || params.groupChannel?.trim() || params.groupSpace?.trim() ? "shared" : "unknown";
}
//#endregion
export { resolveSessionPlacementComputer as n, withSessionPlacementComputer as r, resolveConversationCapabilityProfile as t };