





















@@ -149,6 +149,66 @@ vi.mock("../../../src/agents/tools/common.js", async () => {
149149};
150150});
151151152+vi.mock("./browser-tool.runtime.js", () => {
153+const readStringValue = (value: unknown) => (typeof value === "string" ? value : undefined);
154+const readStringParam = (
155+params: Record<string, unknown>,
156+key: string,
157+opts?: { required?: boolean; label?: string },
158+) => {
159+const value = readStringValue(params[key])?.trim();
160+if (value) {
161+return value;
162+}
163+if (opts?.required) {
164+throw new Error(`${opts.label ?? key} required`);
165+}
166+return undefined;
167+};
168+169+return {
170+DEFAULT_AI_SNAPSHOT_MAX_CHARS: 40_000,
171+DEFAULT_UPLOAD_DIR: "/tmp/openclaw-browser-uploads",
172+BrowserToolSchema: {},
173+ ...browserActionsMocks,
174+ ...browserClientMocks,
175+ ...browserConfigMocks,
176+ ...configMocks,
177+ ...gatewayMocks,
178+ ...sessionTabRegistryMocks,
179+applyBrowserProxyPaths: vi.fn(),
180+getBrowserProfileCapabilities: (profile: Record<string, unknown>) => ({
181+usesChromeMcp: profile.driver === "existing-session",
182+}),
183+imageResultFromFile: toolCommonMocks.imageResultFromFile,
184+jsonResult: (result: unknown) => ({
185+content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
186+details: result,
187+}),
188+listNodes: nodesUtilsMocks.listNodes,
189+normalizeOptionalString: (value: unknown) => readStringValue(value)?.trim() || undefined,
190+persistBrowserProxyFiles: vi.fn(async () => new Map<string, string>()),
191+ readStringParam,
192+ readStringValue,
193+resolveExistingPathsWithinRoot: vi.fn(async ({ requestedPaths }) => ({
194+ok: true,
195+paths: requestedPaths,
196+})),
197+resolveNodeIdFromList: (nodes: Array<Record<string, unknown>>, requested: string) => {
198+const node = nodes.find(
199+(entry) => entry.nodeId === requested || entry.displayName === requested,
200+);
201+if (!node?.nodeId || typeof node.nodeId !== "string") {
202+throw new Error(`Node not found: ${requested}`);
203+}
204+return node.nodeId;
205+},
206+selectDefaultNodeFromList: (nodes: Array<Record<string, unknown>>) => nodes[0] ?? null,
207+wrapExternalContent: (text: string) =>
208+`<<<EXTERNAL_UNTRUSTED_CONTENT source="browser">>>\n${text}\n<<<END_EXTERNAL_UNTRUSTED_CONTENT>>>`,
209+};
210+});
211+152212import { __testing as browserToolActionsTesting } from "./browser-tool.actions.js";
153213import { __testing as browserToolTesting, createBrowserTool } from "./browser-tool.js";
154214import { DEFAULT_AI_SNAPSHOT_MAX_CHARS } from "./browser/constants.js";
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。