openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
118 lines (117 loc) • 5.89 kB
JavaScript
import { i as generateSecureToken } from "./secure-random-B2AO8OrW.mjs";
import { n as extractAssistantTextForPhase } from "./chat-message-content-C-d0FKNG.mjs";
import { n as deriveContextPromptTokens, o as hasNonzeroUsage, u as normalizeUsage } from "./usage-B5bs3hAI.mjs";
import { n as buildAgentHookContextIdentityFields, t as buildAgentHookContextChannelFields } from "./hook-agent-context-vC-cM68i.mjs";
import { n as assertMemoryAudienceSession, t as assertMemoryAudienceCurrent } from "./memory-audience-B18hFdi8.mjs";
import { a as extractAssistantVisibleText } from "./embedded-agent-utils-BDIGXaqj.mjs";
import { i as toNormalizedUsage } from "./usage-accumulator-zbnmV2Ez.mjs";
//#region src/agents/embedded-agent-runner/run/agent-hook-context.ts
function buildEmbeddedAgentHookContext(run, agentId, trace) {
if (run.memoryAudience) assertMemoryAudienceSession(run.memoryAudience, run.sessionKey);
return {
runId: run.runId,
jobId: run.jobId,
trace,
agentId,
sessionKey: run.sessionKey,
sessionId: run.sessionId,
memoryAudience: run.memoryAudience,
assertMemoryAudienceCurrent: run.memoryAudience ? () => assertMemoryAudienceCurrent(run.memoryAudience) : void 0,
sandboxed: run.sandbox?.enabled === true,
workspaceDir: run.workspaceDir,
trigger: run.trigger,
...buildAgentHookContextChannelFields(run),
...buildAgentHookContextIdentityFields(run)
};
}
//#endregion
//#region src/agents/embedded-agent-runner/run/helpers.ts
const RUNTIME_AUTH_REFRESH_MARGIN_MS = 3e5;
const RUNTIME_AUTH_REFRESH_RETRY_MS = 6e4;
const RUNTIME_AUTH_REFRESH_MIN_DELAY_MS = 5e3;
const ANTHROPIC_MAGIC_STRING_TRIGGER_REFUSAL = "ANTHROPIC_MAGIC_STRING_TRIGGER_REFUSAL";
const ANTHROPIC_MAGIC_STRING_REPLACEMENT = "[redacted]";
/** Anthropic's transport interprets this marker even for native-owned attempts. */
function resolveEmbeddedAttemptBasePrompt(params) {
if (params.provider !== "anthropic") return params.prompt;
return params.prompt.replaceAll(ANTHROPIC_MAGIC_STRING_TRIGGER_REFUSAL, ANTHROPIC_MAGIC_STRING_REPLACEMENT);
}
function createRunRecoveryDiagId() {
return `ovf-${Date.now().toString(36)}-${generateSecureToken(4)}`;
}
const BASE_RUN_RETRY_ITERATIONS = 24;
const RUN_RETRY_ITERATIONS_PER_PROFILE = 8;
const MIN_RUN_RETRY_ITERATIONS = 32;
const MAX_RUN_RETRY_ITERATIONS = 160;
function resolveMaxRunRetryIterations(profileCandidateCount) {
const scaled = BASE_RUN_RETRY_ITERATIONS + Math.max(1, profileCandidateCount) * RUN_RETRY_ITERATIONS_PER_PROFILE;
return Math.min(MAX_RUN_RETRY_ITERATIONS, Math.max(MIN_RUN_RETRY_ITERATIONS, scaled));
}
function resolveReportedModelRef(params) {
const assistantProvider = params.assistant?.provider?.trim();
const assistantModel = params.assistant?.model?.trim();
if (assistantProvider?.toLowerCase() === "openclaw") return {
provider: params.provider,
model: params.model
};
return {
provider: assistantProvider || params.provider,
model: assistantModel || params.model
};
}
function resolveLatestCallUsage(params) {
const currentAttempt = params.currentAttemptCandidates.find(hasNonzeroUsage);
return {
currentAttempt,
latest: [
currentAttempt,
params.carriedUsage,
params.transcriptFallback
].find(hasNonzeroUsage)
};
}
function normalizeAssistantUsageForContext(assistant) {
if (assistant?.api === "cli" && assistant.usage && typeof assistant.usage === "object" && !Array.isArray(assistant.usage) && assistant.usage.contextUsage === void 0) return { contextUsage: { state: "unavailable" } };
return normalizeUsage(assistant?.usage);
}
function buildUsageAgentMetaFields(params) {
const usage = toNormalizedUsage(params.usageAccumulator);
const lastCallUsage = [normalizeUsage(params.latestUsage), params.lastRunPromptUsage].find(hasNonzeroUsage);
return {
usage,
lastCallUsage,
promptTokens: deriveContextPromptTokens({ lastCallUsage }),
...usage?.cost ? { costUsd: usage.cost.total } : {}
};
}
/** Error returns retain usage so the session does not keep an older context total. */
function buildErrorAgentMeta(params) {
const usageMeta = buildUsageAgentMetaFields({
usageAccumulator: params.usageAccumulator,
latestUsage: normalizeAssistantUsageForContext(params.currentAttemptAssistant),
lastRunPromptUsage: params.lastRunPromptUsage
});
return {
sessionId: params.sessionId,
...params.sessionFile ? { sessionFile: params.sessionFile } : {},
provider: params.provider,
model: params.model,
...params.credentialSource ? { credentialSource: params.credentialSource } : {},
...params.contextTokens ? { contextTokens: params.contextTokens } : {},
...params.contextTokens ? { contextTokensSource: params.contextTokensSource ?? "resolved" } : {},
...usageMeta.usage ? { usage: usageMeta.usage } : {},
...usageMeta.lastCallUsage ? { lastCallUsage: usageMeta.lastCallUsage } : {},
...usageMeta.promptTokens ? { promptTokens: usageMeta.promptTokens } : {},
...usageMeta.costUsd !== void 0 ? { costUsd: usageMeta.costUsd } : {}
};
}
function resolveFinalAssistantVisibleText(lastAssistant) {
if (!lastAssistant) return;
return extractAssistantVisibleText(lastAssistant).trim() || void 0;
}
function resolveFinalAssistantRawText(lastAssistant) {
if (!lastAssistant) return;
return (extractAssistantTextForPhase(lastAssistant, { phase: "final_answer" }) ?? extractAssistantTextForPhase(lastAssistant) ?? "").trim() || void 0;
}
//#endregion
export { buildUsageAgentMetaFields as a, resolveEmbeddedAttemptBasePrompt as c, resolveLatestCallUsage as d, resolveMaxRunRetryIterations as f, buildErrorAgentMeta as i, resolveFinalAssistantRawText as l, buildEmbeddedAgentHookContext as m, RUNTIME_AUTH_REFRESH_MIN_DELAY_MS as n, createRunRecoveryDiagId as o, resolveReportedModelRef as p, RUNTIME_AUTH_REFRESH_RETRY_MS as r, normalizeAssistantUsageForContext as s, RUNTIME_AUTH_REFRESH_MARGIN_MS as t, resolveFinalAssistantVisibleText as u };