UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

354 lines (353 loc) 15.8 kB
import { s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js"; import { o as toAgentModelListLike } from "./model-input-B2zxl6MM.js"; import { d as resolveAgentModelFallbacksOverride, v as resolveSessionAgentId } from "./agent-scope-MrLta7Pq.js"; import { a as resolveAgentDir, c as resolveDefaultAgentId, o as resolveAgentWorkspaceDir, r as resolveAgentConfig } from "./agent-scope-config-CgCYpZfK.js"; import { r as resolveProviderIdForAuth } from "./provider-auth-aliases-BNZrcvHv.js"; import { i as listOpenAIAuthProfileProvidersForAgentRuntime } from "./openai-routing-DXJmS9CT.js"; import { n as ensureAuthProfileStore } from "./store-C8spD0DG.js"; import { t as CODEX_APP_SERVER_AUTH_MARKER } from "./model-auth-markers-Sq8HdQFX.js"; import { c as resolveDefaultModelForAgent } from "./model-selection-CA_65iXi.js"; import { n as formatTaskStatusDetail, r as formatTaskStatusTitle, t as buildTaskStatusSnapshot } from "./task-status-Cy2RAZFL.js"; import { s as resolveContextTokensForModel } from "./context-CvrdNrKN.js"; import { o as shouldPreferActiveRuntimeAliasAuthLabel, t as areRuntimeModelRefsEquivalent } from "./model-runtime-aliases-6XX4uD6a.js"; import { c as resolveMainSessionAlias, s as resolveInternalSessionKey } from "./sessions-helpers-hMXef98o.js"; import { t as formatDurationCompact } from "./format-duration-BrZ-AaEJ.js"; import { a as listTasksForSessionKeyForStatus, r as listTasksForAgentIdForStatus } from "./task-status-access-ihiHv2MJ.js"; import { t as normalizeGroupActivation } from "./group-activation-qzpxwTmf.js"; import { t as resolveFastModeState } from "./fast-mode-CmAyxTkZ.js"; import { t as resolveModelAuthLabel } from "./model-auth-label-DIkVJu0_.js"; import { o as resolveUsageProviderId } from "./provider-usage.shared-DOxrEMuU.js"; import { n as resolveSelectedAndActiveModel } from "./model-runtime-CZ08KJDf.js"; import { r as formatUsageWindowSummary } from "./provider-usage-MK2Gg9-P.js"; import { t as loadProviderUsageSummary } from "./provider-usage.load-DRNSvlul.js"; import os from "node:os"; //#region src/status/status-text.ts const USAGE_OAUTH_ONLY_PROVIDERS = new Set([ "anthropic", "github-copilot", "google-gemini-cli", "openai" ]); let statusMessageRuntimePromise = null; let agentHarnessSelectionRuntimePromise = null; let statusQueueRuntimePromise = null; let statusSubagentsRuntimePromise = null; function loadStatusMessageRuntime() { return statusMessageRuntimePromise ??= import("./status-message.runtime.js").then((module) => module.loadStatusMessageRuntimeModule()); } function loadAgentHarnessSelectionRuntime() { return agentHarnessSelectionRuntimePromise ??= import("./selection-CzZjc_QD.js"); } function loadStatusSubagentsRuntime() { return statusSubagentsRuntimePromise ??= import("./status-subagents.runtime.js"); } function loadStatusQueueRuntime() { return statusQueueRuntimePromise ??= import("./status-queue.runtime.js"); } function resolveStatusRuntimeContextTokens(params) { return resolveContextTokensForModel({ cfg: params.cfg, provider: params.provider, model: params.model, allowAsyncLoad: false }); } function shouldLoadUsageSummary(params) { if (!params.provider) return false; if (!USAGE_OAUTH_ONLY_PROVIDERS.has(params.provider)) return true; const auth = normalizeOptionalLowercaseString(params.selectedModelAuth); return Boolean(params.credentialType === "oauth" || params.credentialType === "token" || auth?.startsWith("oauth") || auth?.startsWith("token")); } function resolveUsageCredentialType(authLabel) { const auth = normalizeOptionalLowercaseString(authLabel); if (!auth) return; if (auth.startsWith("oauth")) return "oauth"; if (auth.startsWith("token")) return "token"; if (auth.startsWith("api-key") || auth.startsWith("api key")) return "api_key"; } function resolveCodexSyntheticUsageAuthProfileId(params) { const normalizedProfileId = params.profileId?.trim(); if (!normalizedProfileId) return; try { const credential = ensureAuthProfileStore(params.agentDir, { allowKeychainPrompt: false, config: params.cfg, readOnly: true, syncExternalCli: false }).profiles[normalizedProfileId]; if (!credential) return; const credentialProvider = normalizeOptionalLowercaseString(credential.provider); return resolveProviderIdForAuth(credential.provider, { config: params.cfg }) === "openai" || credentialProvider === "openai-codex" || credentialProvider === "codex-cli" ? normalizedProfileId : void 0; } catch { return; } } function shouldUseCodexSyntheticUsage(params) { const harness = normalizeOptionalLowercaseString(params.effectiveHarness); const provider = normalizeOptionalLowercaseString(params.provider); return harness === "codex" && (provider === "openai" || provider === "codex"); } function formatSessionTaskLine(sessionKey) { const snapshot = buildTaskStatusSnapshot(listTasksForSessionKeyForStatus(sessionKey)); const task = snapshot.focus; if (!task) return; const headline = snapshot.activeCount > 0 ? `${snapshot.activeCount} active · ${snapshot.totalCount} total` : snapshot.recentFailureCount > 0 ? `${snapshot.recentFailureCount} recent failure${snapshot.recentFailureCount === 1 ? "" : "s"}` : "recently finished"; const title = formatTaskStatusTitle(task); const detail = formatTaskStatusDetail(task); const parts = [ headline, task.runtime, title, detail ].filter(Boolean); return parts.length ? `📌 Tasks: ${parts.join(" · ")}` : void 0; } async function resolveStatusHarnessId(params) { try { const { selectAgentHarness } = await loadAgentHarnessSelectionRuntime(); return normalizeOptionalLowercaseString(selectAgentHarness({ provider: params.provider, modelId: params.model, config: params.cfg, agentId: params.agentId, sessionKey: params.sessionKey, agentHarnessId: params.sessionEntry?.agentHarnessId }).id) || void 0; } catch { return; } } function resolveStatusRuntimeProvider(params) { const harness = normalizeOptionalLowercaseString(params.effectiveHarness); const provider = normalizeOptionalLowercaseString(params.provider); if (harness === "codex" && (provider === "openai" || provider === "codex")) return "openai"; if (harness === "claude-cli" && provider === "anthropic") return "claude-cli"; return params.provider; } function formatAgentTaskCountsLine(agentId) { const snapshot = buildTaskStatusSnapshot(listTasksForAgentIdForStatus(agentId)); if (snapshot.totalCount === 0) return; return `📌 Tasks: ${snapshot.activeCount} active · ${snapshot.totalCount} total · agent-local`; } function formatStatusUptimeDuration(ms) { return formatDurationCompact(ms, { spaced: true }) ?? "0s"; } function buildStatusUptimeLine() { const gatewayUptimeMs = Math.max(0, Math.round(process.uptime() * 1e3)); const systemUptimeMs = Math.max(0, Math.round(os.uptime() * 1e3)); return `⏱️ Uptime: gateway ${formatStatusUptimeDuration(gatewayUptimeMs)} · system ${formatStatusUptimeDuration(systemUptimeMs)}`; } async function buildStatusText(params) { const { cfg, sessionEntry, sessionKey, parentSessionKey, sessionScope, storePath, statusChannel, provider, model, contextTokens, resolvedThinkLevel, resolvedFastMode, resolvedVerboseLevel, resolvedReasoningLevel, resolvedElevatedLevel, resolveDefaultThinkingLevel, isGroup, defaultGroupActivation } = params; const statusAgentId = sessionKey ? resolveSessionAgentId({ sessionKey, config: cfg }) : resolveDefaultAgentId(cfg); const statusAgentDir = resolveAgentDir(cfg, statusAgentId); const statusWorkspaceDir = params.workspaceDir ?? sessionEntry?.spawnedWorkspaceDir ?? resolveAgentWorkspaceDir(cfg, statusAgentId); const modelRefs = resolveSelectedAndActiveModel({ selectedProvider: provider, selectedModel: model, sessionEntry }); const effectiveHarness = params.resolvedHarness ?? await resolveStatusHarnessId({ cfg, provider, model, agentId: statusAgentId, sessionKey, sessionEntry }); const selectedStatusProvider = resolveStatusRuntimeProvider({ provider, effectiveHarness }); const selectedAuthProviders = listOpenAIAuthProfileProvidersForAgentRuntime({ provider, harnessRuntime: effectiveHarness, config: cfg }); const activeProvider = modelRefs.active.provider || provider; const activeStatusProvider = resolveStatusRuntimeProvider({ provider: activeProvider, effectiveHarness }); const activeAuthProviders = listOpenAIAuthProfileProvidersForAgentRuntime({ provider: activeProvider, harnessRuntime: effectiveHarness, config: cfg }); let selectedModelAuth = Object.hasOwn(params, "modelAuthOverride") ? params.modelAuthOverride : resolveModelAuthLabel({ provider: selectedStatusProvider, acceptedProviderIds: selectedAuthProviders, cfg, sessionEntry, agentDir: statusAgentDir, workspaceDir: statusWorkspaceDir, includeExternalProfiles: false }); const activeModelAuth = Object.hasOwn(params, "activeModelAuthOverride") ? params.activeModelAuthOverride : modelRefs.activeDiffers ? resolveModelAuthLabel({ provider: activeStatusProvider, acceptedProviderIds: activeAuthProviders, cfg, sessionEntry, agentDir: statusAgentDir, workspaceDir: statusWorkspaceDir, includeExternalProfiles: false }) : selectedModelAuth; if (shouldPreferActiveRuntimeAliasAuthLabel({ runtimeAliasModelEquivalent: areRuntimeModelRefsEquivalent(modelRefs.selected.label, modelRefs.active.label, { config: cfg }), selectedAuthLabel: selectedModelAuth, activeAuthLabel: activeModelAuth })) selectedModelAuth = activeModelAuth; const usageAuthLabel = modelRefs.activeDiffers ? activeModelAuth : selectedModelAuth; const selectedUsageCredentialType = resolveUsageCredentialType(usageAuthLabel); const useCodexSyntheticUsage = shouldUseCodexSyntheticUsage({ provider: activeStatusProvider, effectiveHarness }) && (selectedUsageCredentialType === "oauth" || selectedUsageCredentialType === "token"); const codexUsageAuthProfileId = useCodexSyntheticUsage ? resolveCodexSyntheticUsageAuthProfileId({ profileId: sessionEntry?.authProfileOverride, cfg, agentDir: statusAgentDir }) : void 0; const usageCredentialType = useCodexSyntheticUsage ? "token" : selectedUsageCredentialType; const currentUsageProvider = resolveUsageProviderId(activeStatusProvider, { credentialType: usageCredentialType }) ?? resolveUsageProviderId(activeProvider, { credentialType: usageCredentialType }); let usageLine = null; if (currentUsageProvider && shouldLoadUsageSummary({ provider: currentUsageProvider, selectedModelAuth: usageAuthLabel, credentialType: usageCredentialType })) try { const usageSummaryTimeoutMs = useCodexSyntheticUsage ? 8e3 : 3500; let usageTimeout; const usageEntry = (await Promise.race([loadProviderUsageSummary({ timeoutMs: usageSummaryTimeoutMs, providers: [currentUsageProvider], agentDir: statusAgentDir, workspaceDir: statusWorkspaceDir, config: cfg, auth: useCodexSyntheticUsage ? [{ provider: "openai", token: CODEX_APP_SERVER_AUTH_MARKER, ...codexUsageAuthProfileId ? { authProfileId: codexUsageAuthProfileId } : {}, hookProvider: "codex" }] : void 0 }), new Promise((_, reject) => { usageTimeout = setTimeout(() => reject(/* @__PURE__ */ new Error("usage summary timeout")), usageSummaryTimeoutMs); })]).finally(() => { if (usageTimeout) clearTimeout(usageTimeout); })).providers[0]; if (usageEntry && !usageEntry.error && (usageEntry.windows.length > 0 || Boolean(usageEntry.summary?.trim()))) { const summaryLine = formatUsageWindowSummary(usageEntry, { now: Date.now(), maxWindows: 2, includeResets: true }); if (summaryLine) usageLine = `📊 Usage: ${summaryLine}`; } } catch { usageLine = null; } const { getFollowupQueueDepth, resolveQueueSettings } = await loadStatusQueueRuntime(); const queueSettings = resolveQueueSettings({ cfg, channel: statusChannel, sessionEntry }); const queueKey = sessionKey ?? sessionEntry?.sessionId; const queueDepth = queueKey ? getFollowupQueueDepth(queueKey) : 0; const queueOverrides = Boolean(sessionEntry?.queueDebounceMs ?? sessionEntry?.queueCap ?? sessionEntry?.queueDrop); let subagentsLine; let taskLine; if (sessionKey) { const { mainKey, alias } = resolveMainSessionAlias(cfg); const requesterKey = resolveInternalSessionKey({ key: sessionKey, alias, mainKey }); taskLine = params.skipDefaultTaskLookup ? params.taskLineOverride : params.taskLineOverride ?? formatSessionTaskLine(requesterKey); if (!taskLine && !params.skipDefaultTaskLookup) taskLine = formatAgentTaskCountsLine(statusAgentId); const { buildSubagentsStatusLine, countPendingDescendantRuns, listControlledSubagentRuns } = await loadStatusSubagentsRuntime(); subagentsLine = buildSubagentsStatusLine({ runs: listControlledSubagentRuns(requesterKey), verboseEnabled: resolvedVerboseLevel && resolvedVerboseLevel !== "off", pendingDescendantsForRun: (entry) => countPendingDescendantRuns(entry.childSessionKey) }); } const groupActivation = isGroup ? normalizeGroupActivation(sessionEntry?.groupActivation) ?? defaultGroupActivation() : void 0; const agentDefaults = cfg.agents?.defaults ?? {}; const agentConfig = resolveAgentConfig(cfg, statusAgentId); const effectiveFastMode = resolvedFastMode ?? resolveFastModeState({ cfg, provider, model, agentId: statusAgentId, sessionEntry }).enabled; const agentFallbacksOverride = resolveAgentModelFallbacksOverride(cfg, statusAgentId); const configuredDefaultRef = resolveDefaultModelForAgent({ cfg, agentId: statusAgentId, allowPluginNormalization: false }); const configuredDefaultModelLabel = `${configuredDefaultRef.provider}/${configuredDefaultRef.model}`; const { buildStatusMessage } = await loadStatusMessageRuntime(); const explicitThinkingDefault = agentConfig?.thinkingDefault ?? agentDefaults.thinkingDefault; const runtimeContextTokens = resolveStatusRuntimeContextTokens({ cfg, provider: activeStatusProvider, model: modelRefs.active.model || model }); return buildStatusMessage({ config: cfg, agent: { ...agentDefaults, model: { ...toAgentModelListLike(agentDefaults.model), primary: params.primaryModelLabelOverride ?? `${provider}/${model}`, ...agentFallbacksOverride === void 0 ? {} : { fallbacks: agentFallbacksOverride } }, ...typeof contextTokens === "number" && contextTokens > 0 ? { contextTokens } : {}, thinkingDefault: explicitThinkingDefault, verboseDefault: agentDefaults.verboseDefault, reasoningDefault: agentConfig?.reasoningDefault ?? agentDefaults.reasoningDefault, elevatedDefault: agentDefaults.elevatedDefault }, agentId: statusAgentId, configuredDefaultModelLabel, explicitConfiguredContextTokens: typeof agentDefaults.contextTokens === "number" && agentDefaults.contextTokens > 0 ? agentDefaults.contextTokens : void 0, runtimeContextTokens, sessionEntry, sessionKey, parentSessionKey, sessionScope, sessionStorePath: storePath, groupActivation, resolvedThink: resolvedThinkLevel ?? explicitThinkingDefault ?? await resolveDefaultThinkingLevel(), resolvedFast: effectiveFastMode, resolvedHarness: effectiveHarness, resolvedVerbose: resolvedVerboseLevel, resolvedReasoning: resolvedReasoningLevel, resolvedElevated: resolvedElevatedLevel, modelAuth: selectedModelAuth, activeModelAuth, uptimeLine: buildStatusUptimeLine(), usageLine: usageLine ?? void 0, queue: { mode: queueSettings.mode, depth: queueDepth, debounceMs: queueSettings.debounceMs, cap: queueSettings.cap, dropPolicy: queueSettings.dropPolicy, showDetails: queueOverrides }, subagentsLine, taskLine, mediaDecisions: params.mediaDecisions, includeTranscriptUsage: params.includeTranscriptUsage ?? true }); } //#endregion export { buildStatusText as t };