mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-11 17:21:13 +00:00
183 lines
6.5 KiB
TypeScript
183 lines
6.5 KiB
TypeScript
import { resolveHeartbeatPrompt } from "../../auto-reply/heartbeat.js";
|
|
import { resolveSessionAgentIds } from "../agent-scope.js";
|
|
import {
|
|
buildBootstrapInjectionStats,
|
|
buildBootstrapPromptWarning,
|
|
buildBootstrapTruncationReportMeta,
|
|
analyzeBootstrapBudget,
|
|
} from "../bootstrap-budget.js";
|
|
import {
|
|
makeBootstrapWarn as makeBootstrapWarnImpl,
|
|
resolveBootstrapContextForRun as resolveBootstrapContextForRunImpl,
|
|
} from "../bootstrap-files.js";
|
|
import { resolveCliBackendConfig } from "../cli-backends.js";
|
|
import { hashCliSessionText, resolveCliSessionReuse } from "../cli-session.js";
|
|
import { resolveOpenClawDocsPath } from "../docs-path.js";
|
|
import {
|
|
resolveBootstrapMaxChars,
|
|
resolveBootstrapPromptTruncationWarningMode,
|
|
resolveBootstrapTotalMaxChars,
|
|
} from "../pi-embedded-helpers.js";
|
|
import { buildSystemPromptReport } from "../system-prompt-report.js";
|
|
import { redactRunIdentifier, resolveRunWorkspaceDir } from "../workspace-run.js";
|
|
import { prepareCliBundleMcpConfig } from "./bundle-mcp.js";
|
|
import { buildSystemPrompt, normalizeCliModel } from "./helpers.js";
|
|
import { cliBackendLog } from "./log.js";
|
|
import type { PreparedCliRunContext, RunCliAgentParams } from "./types.js";
|
|
|
|
const prepareDeps = {
|
|
makeBootstrapWarn: makeBootstrapWarnImpl,
|
|
resolveBootstrapContextForRun: resolveBootstrapContextForRunImpl,
|
|
};
|
|
|
|
export function setCliRunnerPrepareTestDeps(overrides: Partial<typeof prepareDeps>): void {
|
|
Object.assign(prepareDeps, overrides);
|
|
}
|
|
|
|
export async function prepareCliRunContext(
|
|
params: RunCliAgentParams,
|
|
): Promise<PreparedCliRunContext> {
|
|
const started = Date.now();
|
|
const workspaceResolution = resolveRunWorkspaceDir({
|
|
workspaceDir: params.workspaceDir,
|
|
sessionKey: params.sessionKey,
|
|
agentId: params.agentId,
|
|
config: params.config,
|
|
});
|
|
const resolvedWorkspace = workspaceResolution.workspaceDir;
|
|
const redactedSessionId = redactRunIdentifier(params.sessionId);
|
|
const redactedSessionKey = redactRunIdentifier(params.sessionKey);
|
|
const redactedWorkspace = redactRunIdentifier(resolvedWorkspace);
|
|
if (workspaceResolution.usedFallback) {
|
|
cliBackendLog.warn(
|
|
`[workspace-fallback] caller=runCliAgent reason=${workspaceResolution.fallbackReason} run=${params.runId} session=${redactedSessionId} sessionKey=${redactedSessionKey} agent=${workspaceResolution.agentId} workspace=${redactedWorkspace}`,
|
|
);
|
|
}
|
|
const workspaceDir = resolvedWorkspace;
|
|
|
|
const backendResolved = resolveCliBackendConfig(params.provider, params.config);
|
|
if (!backendResolved) {
|
|
throw new Error(`Unknown CLI backend: ${params.provider}`);
|
|
}
|
|
const preparedBackend = await prepareCliBundleMcpConfig({
|
|
enabled: backendResolved.bundleMcp,
|
|
backend: backendResolved.config,
|
|
workspaceDir,
|
|
config: params.config,
|
|
warn: (message) => cliBackendLog.warn(message),
|
|
});
|
|
const extraSystemPrompt = params.extraSystemPrompt?.trim() ?? "";
|
|
const extraSystemPromptHash = hashCliSessionText(extraSystemPrompt);
|
|
const reusableCliSession = resolveCliSessionReuse({
|
|
binding:
|
|
params.cliSessionBinding ??
|
|
(params.cliSessionId ? { sessionId: params.cliSessionId } : undefined),
|
|
authProfileId: params.authProfileId,
|
|
extraSystemPromptHash,
|
|
mcpConfigHash: preparedBackend.mcpConfigHash,
|
|
});
|
|
if (reusableCliSession.invalidatedReason) {
|
|
cliBackendLog.info(
|
|
`cli session reset: provider=${params.provider} reason=${reusableCliSession.invalidatedReason}`,
|
|
);
|
|
}
|
|
const modelId = (params.model ?? "default").trim() || "default";
|
|
const normalizedModel = normalizeCliModel(modelId, preparedBackend.backend);
|
|
const modelDisplay = `${params.provider}/${modelId}`;
|
|
|
|
const sessionLabel = params.sessionKey ?? params.sessionId;
|
|
const { bootstrapFiles, contextFiles } = await prepareDeps.resolveBootstrapContextForRun({
|
|
workspaceDir,
|
|
config: params.config,
|
|
sessionKey: params.sessionKey,
|
|
sessionId: params.sessionId,
|
|
warn: prepareDeps.makeBootstrapWarn({
|
|
sessionLabel,
|
|
warn: (message) => cliBackendLog.warn(message),
|
|
}),
|
|
});
|
|
const bootstrapMaxChars = resolveBootstrapMaxChars(params.config);
|
|
const bootstrapTotalMaxChars = resolveBootstrapTotalMaxChars(params.config);
|
|
const bootstrapAnalysis = analyzeBootstrapBudget({
|
|
files: buildBootstrapInjectionStats({
|
|
bootstrapFiles,
|
|
injectedFiles: contextFiles,
|
|
}),
|
|
bootstrapMaxChars,
|
|
bootstrapTotalMaxChars,
|
|
});
|
|
const bootstrapPromptWarningMode = resolveBootstrapPromptTruncationWarningMode(params.config);
|
|
const bootstrapPromptWarning = buildBootstrapPromptWarning({
|
|
analysis: bootstrapAnalysis,
|
|
mode: bootstrapPromptWarningMode,
|
|
seenSignatures: params.bootstrapPromptWarningSignaturesSeen,
|
|
previousSignature: params.bootstrapPromptWarningSignature,
|
|
});
|
|
const { defaultAgentId, sessionAgentId } = resolveSessionAgentIds({
|
|
sessionKey: params.sessionKey,
|
|
config: params.config,
|
|
agentId: params.agentId,
|
|
});
|
|
const heartbeatPrompt =
|
|
sessionAgentId === defaultAgentId
|
|
? resolveHeartbeatPrompt(params.config?.agents?.defaults?.heartbeat?.prompt)
|
|
: undefined;
|
|
const docsPath = await resolveOpenClawDocsPath({
|
|
workspaceDir,
|
|
argv1: process.argv[1],
|
|
cwd: process.cwd(),
|
|
moduleUrl: import.meta.url,
|
|
});
|
|
const systemPrompt = buildSystemPrompt({
|
|
workspaceDir,
|
|
config: params.config,
|
|
defaultThinkLevel: params.thinkLevel,
|
|
extraSystemPrompt,
|
|
ownerNumbers: params.ownerNumbers,
|
|
heartbeatPrompt,
|
|
docsPath: docsPath ?? undefined,
|
|
tools: [],
|
|
contextFiles,
|
|
modelDisplay,
|
|
agentId: sessionAgentId,
|
|
});
|
|
const systemPromptReport = buildSystemPromptReport({
|
|
source: "run",
|
|
generatedAt: Date.now(),
|
|
sessionId: params.sessionId,
|
|
sessionKey: params.sessionKey,
|
|
provider: params.provider,
|
|
model: modelId,
|
|
workspaceDir,
|
|
bootstrapMaxChars,
|
|
bootstrapTotalMaxChars,
|
|
bootstrapTruncation: buildBootstrapTruncationReportMeta({
|
|
analysis: bootstrapAnalysis,
|
|
warningMode: bootstrapPromptWarningMode,
|
|
warning: bootstrapPromptWarning,
|
|
}),
|
|
sandbox: { mode: "off", sandboxed: false },
|
|
systemPrompt,
|
|
bootstrapFiles,
|
|
injectedFiles: contextFiles,
|
|
skillsPrompt: "",
|
|
tools: [],
|
|
});
|
|
|
|
return {
|
|
params,
|
|
started,
|
|
workspaceDir,
|
|
backendResolved,
|
|
preparedBackend,
|
|
reusableCliSession,
|
|
modelId,
|
|
normalizedModel,
|
|
systemPrompt,
|
|
systemPromptReport,
|
|
bootstrapPromptWarningLines: bootstrapPromptWarning.lines,
|
|
heartbeatPrompt,
|
|
extraSystemPromptHash,
|
|
};
|
|
}
|