|
1 | 1 | import { resolveHeartbeatPrompt } from "../../auto-reply/heartbeat.js"; |
| 2 | +import { |
| 3 | + createMcpLoopbackServerConfig, |
| 4 | + getActiveMcpLoopbackRuntime, |
| 5 | +} from "../../gateway/mcp-http.js"; |
2 | 6 | import { resolveSessionAgentIds } from "../agent-scope.js"; |
3 | 7 | import { |
4 | 8 | buildBootstrapInjectionStats, |
@@ -28,6 +32,8 @@ import type { PreparedCliRunContext, RunCliAgentParams } from "./types.js"; |
28 | 32 | const prepareDeps = { |
29 | 33 | makeBootstrapWarn: makeBootstrapWarnImpl, |
30 | 34 | resolveBootstrapContextForRun: resolveBootstrapContextForRunImpl, |
| 35 | + getActiveMcpLoopbackRuntime, |
| 36 | + createMcpLoopbackServerConfig, |
31 | 37 | }; |
32 | 38 |
|
33 | 39 | export function setCliRunnerPrepareTestDeps(overrides: Partial<typeof prepareDeps>): void { |
@@ -59,30 +65,10 @@ export async function prepareCliRunContext( |
59 | 65 | if (!backendResolved) { |
60 | 66 | throw new Error(`Unknown CLI backend: ${params.provider}`); |
61 | 67 | } |
62 | | - const preparedBackend = await prepareCliBundleMcpConfig({ |
63 | | - enabled: backendResolved.bundleMcp, |
64 | | - backend: backendResolved.config, |
65 | | - workspaceDir, |
66 | | - config: params.config, |
67 | | - warn: (message) => cliBackendLog.warn(message), |
68 | | - }); |
69 | 68 | const extraSystemPrompt = params.extraSystemPrompt?.trim() ?? ""; |
70 | 69 | const extraSystemPromptHash = hashCliSessionText(extraSystemPrompt); |
71 | | - const reusableCliSession = resolveCliSessionReuse({ |
72 | | - binding: |
73 | | - params.cliSessionBinding ?? |
74 | | - (params.cliSessionId ? { sessionId: params.cliSessionId } : undefined), |
75 | | - authProfileId: params.authProfileId, |
76 | | - extraSystemPromptHash, |
77 | | - mcpConfigHash: preparedBackend.mcpConfigHash, |
78 | | - }); |
79 | | - if (reusableCliSession.invalidatedReason) { |
80 | | - cliBackendLog.info( |
81 | | - `cli session reset: provider=${params.provider} reason=${reusableCliSession.invalidatedReason}`, |
82 | | - ); |
83 | | - } |
84 | 70 | const modelId = (params.model ?? "default").trim() || "default"; |
85 | | - const normalizedModel = normalizeCliModel(modelId, preparedBackend.backend); |
| 71 | + const normalizedModel = normalizeCliModel(modelId, backendResolved.config); |
86 | 72 | const modelDisplay = `${params.provider}/${modelId}`; |
87 | 73 |
|
88 | 74 | const sessionLabel = params.sessionKey ?? params.sessionId; |
@@ -118,6 +104,40 @@ export async function prepareCliRunContext( |
118 | 104 | config: params.config, |
119 | 105 | agentId: params.agentId, |
120 | 106 | }); |
| 107 | + const mcpLoopbackRuntime = |
| 108 | + backendResolved.id === "claude-cli" ? prepareDeps.getActiveMcpLoopbackRuntime() : undefined; |
| 109 | + const preparedBackend = await prepareCliBundleMcpConfig({ |
| 110 | + enabled: backendResolved.bundleMcp, |
| 111 | + backend: backendResolved.config, |
| 112 | + workspaceDir, |
| 113 | + config: params.config, |
| 114 | + additionalConfig: mcpLoopbackRuntime |
| 115 | + ? prepareDeps.createMcpLoopbackServerConfig(mcpLoopbackRuntime.port) |
| 116 | + : undefined, |
| 117 | + env: mcpLoopbackRuntime |
| 118 | + ? { |
| 119 | + OPENCLAW_MCP_TOKEN: mcpLoopbackRuntime.token, |
| 120 | + OPENCLAW_MCP_AGENT_ID: sessionAgentId ?? "", |
| 121 | + OPENCLAW_MCP_ACCOUNT_ID: params.agentAccountId ?? "", |
| 122 | + OPENCLAW_MCP_SESSION_KEY: params.sessionKey ?? "", |
| 123 | + OPENCLAW_MCP_MESSAGE_CHANNEL: params.messageProvider ?? "", |
| 124 | + } |
| 125 | + : undefined, |
| 126 | + warn: (message) => cliBackendLog.warn(message), |
| 127 | + }); |
| 128 | + const reusableCliSession = resolveCliSessionReuse({ |
| 129 | + binding: |
| 130 | + params.cliSessionBinding ?? |
| 131 | + (params.cliSessionId ? { sessionId: params.cliSessionId } : undefined), |
| 132 | + authProfileId: params.authProfileId, |
| 133 | + extraSystemPromptHash, |
| 134 | + mcpConfigHash: preparedBackend.mcpConfigHash, |
| 135 | + }); |
| 136 | + if (reusableCliSession.invalidatedReason) { |
| 137 | + cliBackendLog.info( |
| 138 | + `cli session reset: provider=${params.provider} reason=${reusableCliSession.invalidatedReason}`, |
| 139 | + ); |
| 140 | + } |
121 | 141 | const heartbeatPrompt = |
122 | 142 | sessionAgentId === defaultAgentId |
123 | 143 | ? resolveHeartbeatPrompt(params.config?.agents?.defaults?.heartbeat?.prompt) |
|
0 commit comments