openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
292 lines (291 loc) • 12.7 kB
JavaScript
import { c as normalizeOptionalString, s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js";
import { h as resolveEffectiveModelFallbacks } from "./agent-scope-MrLta7Pq.js";
import { r as resolveProviderIdForAuth } from "./provider-auth-aliases-BNZrcvHv.js";
import { _ as selectApplicableRuntimeConfig, i as getRuntimeConfigSnapshot, s as getRuntimeConfigSourceSnapshot } from "./runtime-snapshot-D93_HOsR.js";
import "./config-C9RxTsn1.js";
import { a as normalizeAnyChannelId, o as normalizeChannelId } from "./registry-9YoS2BJP.js";
import { t as getChannelPlugin } from "./registry-MkxNn1Ue.js";
import { t as normalizeChatType } from "./chat-type-CxEvM45e.js";
import "./plugins-t2ejWcVy.js";
import { o as isReasoningTagProvider } from "./user-turn-transcript-BKLlhoCh.js";
import { t as resolveMessageSecretScope } from "./message-secret-scope-BDjNhgwD.js";
import { t as resolveCommandSecretRefsViaGateway } from "./command-secret-gateway-CsdFbI5A.js";
import { d as getScopedChannelsCommandSecretTargets, t as getAgentRuntimeCommandSecretTargetIds } from "./command-secret-targets-DY8QOUoE.js";
import { t as hasInboundAudio } from "./inbound-media-Bidp906t.js";
import { n as resolveOriginMessageProvider, r as resolveOriginMessageTo } from "./origin-routing-DAROa9u0.js";
//#region src/auto-reply/reply/agent-runner-auth-profile.ts
/** Keeps an auth profile only when the current provider shares the primary auth scope. */
function resolveProviderScopedAuthProfile(params) {
const aliasParams = {
config: params.config,
workspaceDir: params.workspaceDir
};
const authProfileId = resolveProviderIdForAuth(params.provider, aliasParams) === resolveProviderIdForAuth(params.primaryProvider, aliasParams) ? params.authProfileId : void 0;
return {
authProfileId,
authProfileIdSource: authProfileId ? params.authProfileIdSource : void 0
};
}
/** Resolves the auth profile override for a queued follow-up run. */
function resolveRunAuthProfile(run, provider, params) {
return resolveProviderScopedAuthProfile({
provider,
primaryProvider: run.provider,
authProfileId: run.authProfileId,
authProfileIdSource: run.authProfileIdSource,
config: params?.config ?? run.config,
workspaceDir: run.workspaceDir
});
}
//#endregion
//#region src/auto-reply/reply/agent-runner-run-params.ts
/** Builds embedded-agent run parameters from queued follow-up run state. */
/** Resolves whether a provider/model run should enforce final-answer tags. */
const resolveEnforceFinalTagWithResolver = (run, provider, model = run.model, isReasoningTagProvider) => (run.skipProviderRuntimeHints ? false : void 0) ?? (run.enforceFinalTag || isReasoningTagProvider?.(provider, {
config: run.config,
workspaceDir: run.workspaceDir,
modelId: model
}) || false);
/** Builds model fallback options for an embedded follow-up run. */
function resolveModelFallbackOptions(run, configOverride = run.config) {
const config = configOverride;
const fallbacksOverride = resolveEffectiveModelFallbacks({
cfg: config,
agentId: run.agentId,
sessionKey: run.sessionKey,
hasSessionModelOverride: run.hasSessionModelOverride === true,
modelOverrideSource: run.modelOverrideSource,
hasAutoFallbackProvenance: run.hasAutoFallbackProvenance === true
});
return {
cfg: config,
provider: run.provider,
model: run.model,
agentDir: run.agentDir,
agentId: run.agentId,
sessionKey: run.runtimePolicySessionKey ?? run.sessionKey,
fallbacksOverride
};
}
/** Builds the shared embedded-agent run params from a queued follow-up run. */
function buildEmbeddedRunBaseParams$1(params) {
const config = params.run.config;
const modelFallbacksOverride = resolveEffectiveModelFallbacks({
cfg: config,
agentId: params.run.agentId,
sessionKey: params.run.sessionKey,
hasSessionModelOverride: params.run.hasSessionModelOverride === true,
modelOverrideSource: params.run.modelOverrideSource,
hasAutoFallbackProvenance: params.run.hasAutoFallbackProvenance === true
});
return {
sessionFile: params.run.sessionFile,
workspaceDir: params.run.workspaceDir,
cwd: params.run.cwd,
agentDir: params.run.agentDir,
config,
skillsSnapshot: params.run.skillsSnapshot,
ownerNumbers: params.run.ownerNumbers,
inputProvenance: params.run.inputProvenance,
senderIsOwner: params.run.senderIsOwner,
enforceFinalTag: resolveEnforceFinalTagWithResolver(params.run, params.provider, params.model, params.isReasoningTagProvider),
silentExpected: params.run.silentExpected,
allowEmptyAssistantReplyAsSilent: params.run.allowEmptyAssistantReplyAsSilent,
silentReplyPromptMode: params.run.silentReplyPromptMode,
sourceReplyDeliveryMode: params.run.sourceReplyDeliveryMode,
provider: params.provider,
model: params.model,
modelFallbacksOverride,
...params.authProfile,
thinkLevel: params.run.thinkLevel,
verboseLevel: params.run.verboseLevel,
reasoningLevel: params.run.reasoningLevel,
execOverrides: params.run.execOverrides,
bashElevated: params.run.bashElevated,
timeoutMs: params.run.timeoutMs,
runId: params.runId,
promptCacheKey: params.promptCacheKey,
allowTransientCooldownProbe: params.allowTransientCooldownProbe
};
}
//#endregion
//#region src/auto-reply/reply/agent-runner-utils.ts
/** Utilities for queued reply runtime config, auth, threading, and embedded run params. */
const BUN_FETCH_SOCKET_ERROR_RE = /socket connection was closed unexpectedly/i;
/** Selects the freshest runtime config usable by queued reply execution. */
function resolveQueuedReplyRuntimeConfig(config) {
return selectApplicableRuntimeConfig({
inputConfig: config,
runtimeConfig: typeof getRuntimeConfigSnapshot === "function" ? getRuntimeConfigSnapshot() : null,
runtimeSourceConfig: typeof getRuntimeConfigSourceSnapshot === "function" ? getRuntimeConfigSourceSnapshot() : null
}) ?? config;
}
/** Resolves command secrets for queued reply execution, scoped to the origin route. */
async function resolveQueuedReplyExecutionConfig(config, params) {
const runtimeConfig = resolveQueuedReplyRuntimeConfig(config);
const { resolvedConfig } = await resolveCommandSecretRefsViaGateway({
config: runtimeConfig,
commandName: "reply",
targetIds: getAgentRuntimeCommandSecretTargetIds()
});
const baseResolvedConfig = resolvedConfig ?? runtimeConfig;
const scope = resolveMessageSecretScope({
channel: params?.originatingChannel,
fallbackChannel: params?.messageProvider,
accountId: params?.originatingAccountId,
fallbackAccountId: params?.agentAccountId
});
if (!scope.channel) return baseResolvedConfig;
const scopedTargets = getScopedChannelsCommandSecretTargets({
config: baseResolvedConfig,
channel: scope.channel,
accountId: scope.accountId
});
if (scopedTargets.targetIds.size === 0) return baseResolvedConfig;
return (await resolveCommandSecretRefsViaGateway({
config: baseResolvedConfig,
commandName: "reply",
targetIds: scopedTargets.targetIds,
...scopedTargets.allowedPaths ? { allowedPaths: scopedTargets.allowedPaths } : {}
})).resolvedConfig ?? baseResolvedConfig;
}
/**
* Build provider-specific threading context for tool auto-injection.
*/
/** Builds channel threading context for message-tool replies. */
function buildThreadingToolContext(params) {
const { sessionCtx, config, hasRepliedRef } = params;
const currentMessageId = sessionCtx.InputProvenance?.kind === "internal_system" && sessionCtx.InputProvenance.sourceTool === "restart-sentinel" ? sessionCtx.ReplyToId : sessionCtx.MessageSidFull ?? sessionCtx.MessageSid;
const originProvider = resolveOriginMessageProvider({
originatingChannel: sessionCtx.OriginatingChannel,
provider: sessionCtx.Provider
});
const originTo = resolveOriginMessageTo({
originatingTo: sessionCtx.OriginatingTo,
to: sessionCtx.To
});
if (!config) return { currentMessageId };
const rawProvider = normalizeOptionalLowercaseString(originProvider);
if (!rawProvider) return { currentMessageId };
const provider = normalizeChannelId(rawProvider) ?? normalizeAnyChannelId(rawProvider);
const threading = provider ? getChannelPlugin(provider)?.threading : void 0;
if (!threading?.buildToolContext) return {
currentChannelId: normalizeOptionalString(originTo),
currentChannelProvider: provider ?? rawProvider,
currentMessageId,
hasRepliedRef
};
const context = threading.buildToolContext({
cfg: config,
accountId: sessionCtx.AccountId,
context: {
Channel: originProvider,
From: sessionCtx.From,
To: originTo,
ChatType: sessionCtx.ChatType,
CurrentMessageId: currentMessageId,
ReplyToId: sessionCtx.ReplyToId,
ReplyToIdFull: sessionCtx.ReplyToIdFull,
ThreadLabel: sessionCtx.ThreadLabel,
MessageThreadId: sessionCtx.MessageThreadId,
TransportThreadId: sessionCtx.TransportThreadId,
NativeChannelId: sessionCtx.NativeChannelId
},
hasRepliedRef
}) ?? {};
const hasAdapterCurrentMessageId = Object.hasOwn(context, "currentMessageId");
return {
...context,
currentChannelProvider: provider,
currentMessageId: hasAdapterCurrentMessageId ? context.currentMessageId : currentMessageId
};
}
/** Detects Bun socket-close errors that should be formatted more clearly. */
const isBunFetchSocketError = (message) => message ? BUN_FETCH_SOCKET_ERROR_RE.test(message) : false;
/** Formats Bun socket-close errors for user-facing reply output. */
const formatBunFetchSocketError = (message) => {
return [
"⚠️ LLM connection failed. This could be due to server issues, network problems, or context length exceeded (e.g., with local LLMs like LM Studio). Original error:",
"```",
message.trim() || "Unknown error",
"```"
].join("\n");
};
/** Builds base embedded run params with auth and provider runtime hints. */
function buildEmbeddedRunBaseParams(params) {
return buildEmbeddedRunBaseParams$1({
...params,
isReasoningTagProvider
});
}
function buildEmbeddedContextFromTemplate(params) {
const config = params.run.config;
const chatType = normalizeChatType(params.sessionCtx.ChatType) ?? params.run.chatType;
return {
sessionId: params.run.sessionId,
sessionKey: params.run.sessionKey,
sandboxSessionKey: params.run.runtimePolicySessionKey,
agentId: params.run.agentId,
messageProvider: resolveOriginMessageProvider({
originatingChannel: params.sessionCtx.OriginatingChannel,
provider: params.sessionCtx.Provider
}),
...chatType ? { chatType } : {},
agentAccountId: params.sessionCtx.AccountId,
messageTo: resolveOriginMessageTo({
originatingTo: params.sessionCtx.OriginatingTo,
to: params.sessionCtx.To
}),
messageThreadId: params.sessionCtx.MessageThreadId ?? void 0,
memberRoleIds: normalizeMemberRoleIds(params.sessionCtx.MemberRoleIds),
...buildThreadingToolContext({
sessionCtx: params.sessionCtx,
config,
hasRepliedRef: params.hasRepliedRef
}),
currentInboundAudio: hasInboundAudio(params.sessionCtx)
};
}
function normalizeMemberRoleIds(value) {
const roles = Array.isArray(value) ? value.map((roleId) => normalizeOptionalString(roleId)).filter((roleId) => Boolean(roleId)) : [];
return roles.length > 0 ? roles : void 0;
}
function buildTemplateSenderContext(sessionCtx) {
return {
senderId: normalizeOptionalString(sessionCtx.SenderId),
senderName: normalizeOptionalString(sessionCtx.SenderName),
senderUsername: normalizeOptionalString(sessionCtx.SenderUsername),
senderE164: normalizeOptionalString(sessionCtx.SenderE164)
};
}
/** Builds extra context payloads for embedded run execution. */
function buildEmbeddedRunContexts(params) {
return {
authProfile: resolveRunAuthProfile(params.run, params.provider),
embeddedContext: buildEmbeddedContextFromTemplate({
run: params.run,
sessionCtx: params.sessionCtx,
hasRepliedRef: params.hasRepliedRef
}),
senderContext: buildTemplateSenderContext(params.sessionCtx)
};
}
/** Builds execution-specific embedded run params for queued reply dispatch. */
function buildEmbeddedRunExecutionParams(params) {
const { authProfile, embeddedContext, senderContext } = buildEmbeddedRunContexts(params);
return {
embeddedContext,
senderContext,
runBaseParams: buildEmbeddedRunBaseParams({
run: params.run,
provider: params.provider,
model: params.model,
runId: params.runId,
promptCacheKey: params.promptCacheKey,
authProfile,
allowTransientCooldownProbe: params.allowTransientCooldownProbe
})
};
}
//#endregion
export { resolveQueuedReplyExecutionConfig as a, resolveRunAuthProfile as c, isBunFetchSocketError as i, buildThreadingToolContext as n, resolveQueuedReplyRuntimeConfig as o, formatBunFetchSocketError as r, resolveModelFallbackOptions as s, buildEmbeddedRunExecutionParams as t };