UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

292 lines (291 loc) 12.7 kB
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 };