






















@@ -1,3 +1,4 @@
1+import { clampPositiveTimerTimeoutMs } from "openclaw/plugin-sdk/number-runtime";
12import {
23BrowserProfileUnavailableError,
34BrowserTabNotFoundError,
@@ -8,13 +9,16 @@ import {
89assertBrowserNavigationResultAllowed,
910withBrowserNavigationPolicy,
1011} from "../navigation-guard.js";
12+import { getBrowserProfileCapabilities } from "../profile-capabilities.js";
1113import type { BrowserRouteContext, ProfileContext } from "../server-context.js";
1214import { resolveTargetIdFromTabs } from "../target-id.js";
1315import { browserNavigationPolicyForProfile, resolveProfileContext } from "./agent.shared.js";
1416import { readRouteNonNegativeInteger } from "./route-numeric.js";
1517import type { BrowserRequest, BrowserResponse, BrowserRouteRegistrar } from "./types.js";
1618import { asyncBrowserRoute, jsonError, toStringOrEmpty } from "./utils.js";
171920+const DEFAULT_TAB_REACHABILITY_TIMEOUT_MS = 300;
21+1822function handleTabsRouteError(
1923ctx: BrowserRouteContext,
2024res: BrowserResponse,
@@ -48,8 +52,37 @@ async function withTabsProfileRoute(params: {
4852}
4953}
505451-async function ensureBrowserRunning(profileCtx: ProfileContext, res: BrowserResponse) {
52-if (!(await profileCtx.isReachable(300))) {
55+function resolveTabReachabilityTimeoutMs(
56+ctx: BrowserRouteContext,
57+profileCtx: ProfileContext,
58+): number {
59+if (!getBrowserProfileCapabilities(profileCtx.profile).usesChromeMcp) {
60+return DEFAULT_TAB_REACHABILITY_TIMEOUT_MS;
61+}
62+return (
63+clampPositiveTimerTimeoutMs(ctx.state().resolved.actionTimeoutMs) ??
64+DEFAULT_TAB_REACHABILITY_TIMEOUT_MS
65+);
66+}
67+68+async function checkTabReachability(
69+ctx: BrowserRouteContext,
70+profileCtx: ProfileContext,
71+signal?: AbortSignal,
72+) {
73+const timeoutMs = resolveTabReachabilityTimeoutMs(ctx, profileCtx);
74+return signal
75+ ? await profileCtx.isReachable(timeoutMs, { signal })
76+ : await profileCtx.isReachable(timeoutMs);
77+}
78+79+async function ensureBrowserRunning(
80+ctx: BrowserRouteContext,
81+profileCtx: ProfileContext,
82+res: BrowserResponse,
83+signal?: AbortSignal,
84+) {
85+if (!(await checkTabReachability(ctx, profileCtx, signal))) {
5386jsonError(
5487res,
5588new BrowserProfileUnavailableError("browser not running").status,
@@ -149,7 +182,7 @@ async function runTabTargetMutation(params: {
149182ctx: params.ctx,
150183mapTabError: true,
151184run: async (profileCtx) => {
152-if (!(await ensureBrowserRunning(profileCtx, params.res))) {
185+if (!(await ensureBrowserRunning(params.ctx, profileCtx, params.res, params.req.signal))) {
153186return;
154187}
155188await params.mutate(profileCtx, params.targetId);
@@ -167,7 +200,7 @@ export function registerBrowserTabRoutes(app: BrowserRouteRegistrar, ctx: Browse
167200 res,
168201 ctx,
169202run: async (profileCtx) => {
170-const reachable = await profileCtx.isReachable(300);
203+const reachable = await checkTabReachability(ctx, profileCtx, req.signal);
171204if (!reachable) {
172205return res.json({ running: false, tabs: [] as unknown[] });
173206}
@@ -277,7 +310,7 @@ export function registerBrowserTabRoutes(app: BrowserRouteRegistrar, ctx: Browse
277310mapTabError: true,
278311run: async (profileCtx) => {
279312if (action === "list") {
280-const reachable = await profileCtx.isReachable(300);
313+const reachable = await checkTabReachability(ctx, profileCtx, req.signal);
281314if (!reachable) {
282315return res.json({ ok: true, tabs: [] as unknown[] });
283316}
@@ -297,7 +330,7 @@ export function registerBrowserTabRoutes(app: BrowserRouteRegistrar, ctx: Browse
297330}
298331299332if (action === "label") {
300-if (!(await ensureBrowserRunning(profileCtx, res))) {
333+if (!(await ensureBrowserRunning(ctx, profileCtx, res, req.signal))) {
301334return;
302335}
303336const targetId = parseRequiredTargetId(
@@ -316,7 +349,7 @@ export function registerBrowserTabRoutes(app: BrowserRouteRegistrar, ctx: Browse
316349}
317350318351if (action === "close") {
319-if (!(await ensureBrowserRunning(profileCtx, res))) {
352+if (!(await ensureBrowserRunning(ctx, profileCtx, res, req.signal))) {
320353return;
321354}
322355const index = readTabIndex(res, req.body);
@@ -337,7 +370,7 @@ export function registerBrowserTabRoutes(app: BrowserRouteRegistrar, ctx: Browse
337370if (index === null || index === undefined) {
338371return;
339372}
340-if (!(await ensureBrowserRunning(profileCtx, res))) {
373+if (!(await ensureBrowserRunning(ctx, profileCtx, res, req.signal))) {
341374return;
342375}
343376const tabs = await profileCtx.listTabs();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。