From 7bdc7ce7e4d9850e157b0738b55ebd6d56ea915e Mon Sep 17 00:00:00 2001 From: codes-res-by-bigbrother666sh Date: Fri, 27 Mar 2026 00:07:24 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(skill):=20follow=20opencli=20v1.4.1=20?= =?UTF-8?q?=E2=80=94=20add=20Google=20Search=20and=20TikTok=20internationa?= =?UTF-8?q?l?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - smart-search: 新增 Google Search/News 章节(public,无需浏览器) - smart-search: 新增 TikTok 国际版搜索(含 cookie warmup 说明) - smart-search: warmup 表格补充 TikTok 条目,public 列表补充 Google - patches/002: 更新 002 patch 行号至 539(适配 openclaw v2026.3.13) --- .../002-disable-web-search-env-var.patch | 4 +-- wiseflow/skills/smart-search/SKILL.md | 36 ++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/wiseflow/patches/002-disable-web-search-env-var.patch b/wiseflow/patches/002-disable-web-search-env-var.patch index 571c861..5f06785 100644 --- a/wiseflow/patches/002-disable-web-search-env-var.patch +++ b/wiseflow/patches/002-disable-web-search-env-var.patch @@ -1,8 +1,8 @@ diff --git a/src/agents/tools/web-search.ts b/src/agents/tools/web-search.ts -index 1e4983f85..aa7dac794 100644 +index 6e9518f1e..2731d6452 100644 --- a/src/agents/tools/web-search.ts +++ b/src/agents/tools/web-search.ts -@@ -420,6 +420,10 @@ function resolveSearchConfig(cfg?: OpenClawConfig): WebSearchConfig { +@@ -539,6 +539,10 @@ function resolveSearchConfig(cfg?: OpenClawConfig): WebSearchConfig { } function resolveSearchEnabled(params: { search?: WebSearchConfig; sandboxed?: boolean }): boolean { diff --git a/wiseflow/skills/smart-search/SKILL.md b/wiseflow/skills/smart-search/SKILL.md index 7f747a6..c12d876 100644 --- a/wiseflow/skills/smart-search/SKILL.md +++ b/wiseflow/skills/smart-search/SKILL.md @@ -37,14 +37,38 @@ Many platforms will return empty results or redirect to login if you navigate ** | 路透社 | Navigate `https://www.reuters.com` | Navigate to search URL | | Bilibili | Navigate `https://www.bilibili.com` | Navigate to search URL | | 小红书 | Navigate `https://www.xiaohongshu.com` | Navigate to search URL | +| TikTok | Navigate `https://www.tiktok.com` | Navigate to search URL | **Platforms that do NOT need warmup** (public APIs / no auth required): -- Bing, Baidu, Quark, GitHub, arXiv, Wikipedia, BBC, HackerNews, V2EX +- Google, Bing, Baidu, Quark, GitHub, arXiv, Wikipedia, BBC, HackerNews, V2EX --- ## General Web Search +### Google (recommended for global content, no login required) + +``` +https://www.google.com/search?q={keyword} +``` + +Time filters (append to URL): +- Last hour: `&tbs=qdr:h` +- Last day: `&tbs=qdr:d` +- Last week: `&tbs=qdr:w` +- Last month: `&tbs=qdr:m` +- Last year: `&tbs=qdr:y` + +Exact date range: `&tbs=cdr:1,cd_min:MM/DD/YYYY,cd_max:MM/DD/YYYY` + +### Google News + +``` +https://www.google.com/search?q={keyword}&tbm=nws +``` + +Sort by date: append `&tbs=sbd:1` + ### Bing (recommended for English and international content) ``` @@ -296,6 +320,16 @@ https://www.reddit.com/r/{subreddit}/search/?q={keyword}&restrict_sr=on&sort=rel Multi-keyword: join with `+` +### TikTok (international) + +``` +https://www.tiktok.com/search?q={keyword} +``` + +> **Note**: Cookie warmup required — navigate `https://www.tiktok.com` first. Wait ~3 seconds after navigating to search results for content to load. + +Multi-keyword: join with `%20` + --- ## Developer Platforms From b7d080548ed0077f1ad5bceeaba035876c122594 Mon Sep 17 00:00:00 2001 From: codes-res-by-bigbrother666sh Date: Sun, 29 Mar 2026 01:33:51 +0800 Subject: [PATCH 2/3] chore(sync): update openclaw to v2026.3.24, drop merged patch 001 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - openclaw.version: 2026.3.13 → 2026.3.24 (commit cff6dc94) - delete 001-browser-tab-recovery.patch: v2026.3.24 已原生内置全部 tab recovery 逻辑(isTabResolutionError / pickFallbackTargetId / listTabsForRecovery / runSnapshot try-catch),patch 不再必要 - regenerate 002-disable-web-search-env-var.patch: 目标文件从 agents/tools/web-search.ts 迁移到 web-search/runtime.ts,注入点 改为 resolveWebSearchEnabled 函数 - regenerate 003-act-field-validation.patch: 适配新上下文行号 - addon.json: 新增 openclaw_version / openclaw_commit 字段(OFB v0.4.0 规范) --- openclaw.version | 4 +- wiseflow/addon.json | 2 + .../patches/001-browser-tab-recovery.patch | 328 ------------------ .../002-disable-web-search-env-var.patch | 17 +- .../patches/003-act-field-validation.patch | 14 +- 5 files changed, 19 insertions(+), 346 deletions(-) delete mode 100644 wiseflow/patches/001-browser-tab-recovery.patch diff --git a/openclaw.version b/openclaw.version index adfba62..b5450f1 100644 --- a/openclaw.version +++ b/openclaw.version @@ -7,5 +7,5 @@ # git clone https://github.com/openclaw/openclaw openclaw # git -C openclaw checkout $OPENCLAW_COMMIT # -OPENCLAW_VERSION=2026.3.13 -OPENCLAW_COMMIT=61d171ab0b2fe4abc9afe89c518586274b4b76c2 +OPENCLAW_VERSION=2026.3.24 +OPENCLAW_COMMIT=cff6dc94e30794a269eb7805b6e636c3634a088c diff --git a/wiseflow/addon.json b/wiseflow/addon.json index ce64242..90a6c9a 100644 --- a/wiseflow/addon.json +++ b/wiseflow/addon.json @@ -2,6 +2,8 @@ "name": "wiseflow", "version": "0.3.0", "description": "浏览器反检测 + Tab Recovery + 互联网搜索增强(smart-search / rss-reader skills + 禁用内置 web_search)+ 新媒体小编 Crew 模板", + "openclaw_version": "2026.3.24", + "openclaw_commit": "cff6dc94e30794a269eb7805b6e636c3634a088c", "auto-activate": false, "internal_crews": ["new-media-editor"] } diff --git a/wiseflow/patches/001-browser-tab-recovery.patch b/wiseflow/patches/001-browser-tab-recovery.patch deleted file mode 100644 index 7796b8c..0000000 --- a/wiseflow/patches/001-browser-tab-recovery.patch +++ /dev/null @@ -1,328 +0,0 @@ -diff --git a/src/agents/tools/browser-tool.actions.ts b/src/agents/tools/browser-tool.actions.ts -index a4b6cb456..8fd27500c 100644 ---- a/src/agents/tools/browser-tool.actions.ts -+++ b/src/agents/tools/browser-tool.actions.ts -@@ -81,27 +81,35 @@ function isChromeStaleTargetError(profile: string | undefined, err: unknown): bo - return msg.includes("404:") && msg.includes("tab not found"); - } - --function stripTargetIdFromActRequest( -- request: Parameters[1], --): Parameters[1] | null { -- const targetId = typeof request.targetId === "string" ? request.targetId.trim() : undefined; -- if (!targetId) { -- return null; -- } -- const retryRequest = { ...request }; -- delete retryRequest.targetId; -- return retryRequest as Parameters[1]; -+function isTabResolutionError(err: unknown): boolean { -+ const msg = String(err).toLowerCase(); -+ return msg.includes("tab not found") || msg.includes("ambiguous target id prefix"); - } - --function canRetryChromeActWithoutTargetId(request: Parameters[1]): boolean { -- const typedRequest = request as Partial>; -- const kind = -- typeof typedRequest.kind === "string" -- ? typedRequest.kind -- : typeof typedRequest.action === "string" -- ? typedRequest.action -- : ""; -- return kind === "hover" || kind === "scrollIntoView" || kind === "wait"; -+function pickFallbackTargetId(tabs: unknown[]): string | undefined { -+ const list = tabs.filter((tab): tab is { targetId?: unknown; type?: unknown } => { -+ return Boolean(tab && typeof tab === "object"); -+ }); -+ const pages = list.filter((tab) => { -+ const type = typeof tab.type === "string" ? tab.type : "page"; -+ return type === "page"; -+ }); -+ const primary = pages[0] ?? list[0]; -+ const raw = primary?.targetId; -+ return typeof raw === "string" && raw.trim() ? raw.trim() : undefined; -+} -+ -+async function listTabsForRecovery(params: { -+ baseUrl?: string; -+ profile?: string; -+ proxyRequest: BrowserProxyRequest | null; -+}): Promise { -+ const { baseUrl, profile, proxyRequest } = params; -+ if (proxyRequest) { -+ const result = await proxyRequest({ method: "GET", path: "/tabs", profile }); -+ return ((result as { tabs?: unknown[] }).tabs ?? []).filter(Boolean); -+ } -+ return await browserTabs(baseUrl, { profile }).catch(() => []); - } - - export async function executeTabsAction(params: { -@@ -182,17 +190,37 @@ export async function executeSnapshotAction(params: { - labels, - mode, - }; -- const snapshot = proxyRequest -- ? ((await proxyRequest({ -- method: "GET", -- path: "/snapshot", -- profile, -- query: snapshotQuery, -- })) as Awaited>) -- : await browserSnapshot(baseUrl, { -- ...snapshotQuery, -- profile, -- }); -+ const runSnapshot = async (retryTargetId: string | undefined) => { -+ return proxyRequest -+ ? ((await proxyRequest({ -+ method: "GET", -+ path: "/snapshot", -+ profile, -+ query: { ...snapshotQuery, targetId: retryTargetId }, -+ })) as Awaited>) -+ : await browserSnapshot(baseUrl, { -+ ...snapshotQuery, -+ targetId: retryTargetId, -+ profile, -+ }); -+ }; -+ let snapshot: Awaited>; -+ try { -+ snapshot = await runSnapshot(targetId); -+ } catch (err) { -+ if (!isTabResolutionError(err)) { -+ throw err; -+ } -+ const tabs = await listTabsForRecovery({ baseUrl, profile, proxyRequest }); -+ const recoveredTargetId = pickFallbackTargetId(tabs); -+ if (!recoveredTargetId) { -+ throw new Error( -+ `Browser tab was lost and no recoverable tab is available. Run action=tabs${profile ? ` profile="${profile}"` : ""} to refresh tab state.`, -+ { cause: err }, -+ ); -+ } -+ snapshot = await runSnapshot(recoveredTargetId); -+ } - if (snapshot.format === "ai") { - const extractedText = snapshot.snapshot ?? ""; - const wrappedSnapshot = wrapExternalContent(extractedText, { -@@ -303,46 +331,37 @@ export async function executeActAction(params: { - }); - return jsonResult(result); - } catch (err) { -- if (isChromeStaleTargetError(profile, err)) { -- const retryRequest = stripTargetIdFromActRequest(request); -- const tabs = proxyRequest -- ? (( -- (await proxyRequest({ -- method: "GET", -- path: "/tabs", -+ if (isTabResolutionError(err)) { -+ const tabs = await listTabsForRecovery({ baseUrl, profile, proxyRequest }); -+ const fallbackTargetId = pickFallbackTargetId(tabs); -+ if (fallbackTargetId) { -+ // Retry with the specific fallback tab targetId. -+ const recoveredRequest = { ...request, targetId: fallbackTargetId }; -+ const recovered = proxyRequest -+ ? await proxyRequest({ -+ method: "POST", -+ path: "/act", - profile, -- })) as { tabs?: unknown[] } -- ).tabs ?? []) -- : await browserTabs(baseUrl, { profile }).catch(() => []); -- // Some Chrome relay targetIds can go stale between snapshots and actions. -- // Only retry safe read-only actions, and only when exactly one tab remains attached. -- if (retryRequest && canRetryChromeActWithoutTargetId(request) && tabs.length === 1) { -- try { -- const retryResult = proxyRequest -- ? await proxyRequest({ -- method: "POST", -- path: "/act", -- profile, -- body: retryRequest, -- }) -- : await browserAct(baseUrl, retryRequest, { -- profile, -- }); -- return jsonResult(retryResult); -- } catch { -- // Fall through to explicit stale-target guidance. -- } -+ body: recoveredRequest, -+ }) -+ : await browserAct(baseUrl, recoveredRequest as Parameters[1], { -+ profile, -+ }); -+ return jsonResult(recovered); - } -- if (!tabs.length) { -+ // No specific tab found — give Chrome-specific guidance if applicable. -+ if (isChromeStaleTargetError(profile, err)) { -+ if (!tabs.length) { -+ throw new Error( -+ "No Chrome tabs are attached via the OpenClaw Browser Relay extension. Click the toolbar icon on the tab you want to control (badge ON), then retry.", -+ { cause: err }, -+ ); -+ } - throw new Error( -- "No Chrome tabs are attached via the OpenClaw Browser Relay extension. Click the toolbar icon on the tab you want to control (badge ON), then retry.", -+ `Chrome tab not found (stale targetId?). Run action=tabs profile="chrome-relay" and use one of the returned targetIds.`, - { cause: err }, - ); - } -- throw new Error( -- `Chrome tab not found (stale targetId?). Run action=tabs profile="chrome-relay" and use one of the returned targetIds.`, -- { cause: err }, -- ); - } - throw err; - } -diff --git a/src/agents/tools/browser-tool.test.ts b/src/agents/tools/browser-tool.test.ts -index adaaea782..9cd664527 100644 ---- a/src/agents/tools/browser-tool.test.ts -+++ b/src/agents/tools/browser-tool.test.ts -@@ -287,6 +287,48 @@ describe("browser tool snapshot maxChars", () => { - expect(opts?.mode).toBeUndefined(); - }); - -+ it("recovers snapshot when target tab disappears", async () => { -+ browserClientMocks.browserSnapshot -+ .mockRejectedValueOnce(new Error("404: tab not found")) -+ .mockResolvedValueOnce({ -+ ok: true, -+ format: "ai", -+ targetId: "new-tab", -+ url: "https://example.com", -+ snapshot: "recovered", -+ }); -+ browserClientMocks.browserTabs.mockResolvedValueOnce([ -+ { -+ targetId: "new-tab", -+ type: "page", -+ title: "Recovered", -+ url: "https://example.com", -+ }, -+ ]); -+ -+ const tool = createBrowserTool(); -+ const result = await tool.execute?.("call-1", { -+ action: "snapshot", -+ snapshotFormat: "ai", -+ targetId: "stale-tab", -+ }); -+ -+ expect(browserClientMocks.browserSnapshot).toHaveBeenNthCalledWith( -+ 1, -+ undefined, -+ expect.objectContaining({ targetId: "stale-tab" }), -+ ); -+ expect(browserClientMocks.browserSnapshot).toHaveBeenNthCalledWith( -+ 2, -+ undefined, -+ expect.objectContaining({ targetId: "new-tab" }), -+ ); -+ expect(result?.details).toMatchObject({ -+ targetId: "new-tab", -+ ok: true, -+ }); -+ }); -+ - it("defaults to host when using profile=chrome-relay (even in sandboxed sessions)", async () => { - setResolvedBrowserProfiles({ - "chrome-relay": { -@@ -745,16 +787,23 @@ describe("browser tool external content wrapping", () => { - describe("browser tool act stale target recovery", () => { - registerBrowserToolAfterEachReset(); - -- it("retries safe chrome-relay act once without targetId when exactly one tab remains", async () => { -+ it("recovers act by retrying with fallback tab targetId when tab is stale", async () => { - browserActionsMocks.browserAct - .mockRejectedValueOnce(new Error("404: tab not found")) -- .mockResolvedValueOnce({ ok: true }); -- browserClientMocks.browserTabs.mockResolvedValueOnce([{ targetId: "only-tab" }]); -+ .mockResolvedValueOnce({ ok: true, targetId: "recovered-tab" }); -+ browserClientMocks.browserTabs.mockResolvedValueOnce([ -+ { -+ targetId: "recovered-tab", -+ type: "page", -+ title: "Recovered", -+ url: "https://example.com", -+ }, -+ ]); - - const tool = createBrowserTool(); - const result = await tool.execute?.("call-1", { - action: "act", -- profile: "chrome-relay", -+ profile: "chrome", - request: { - kind: "hover", - targetId: "stale-tab", -@@ -767,34 +816,48 @@ describe("browser tool act stale target recovery", () => { - 1, - undefined, - expect.objectContaining({ targetId: "stale-tab", kind: "hover", ref: "btn-1" }), -- expect.objectContaining({ profile: "chrome-relay" }), -+ expect.objectContaining({ profile: "chrome" }), - ); - expect(browserActionsMocks.browserAct).toHaveBeenNthCalledWith( - 2, - undefined, -- expect.not.objectContaining({ targetId: expect.anything() }), -- expect.objectContaining({ profile: "chrome-relay" }), -+ expect.objectContaining({ targetId: "recovered-tab" }), -+ expect.objectContaining({ profile: "chrome" }), - ); - expect(result?.details).toMatchObject({ ok: true }); - }); - -- it("does not retry mutating chrome-relay act requests without targetId", async () => { -- browserActionsMocks.browserAct.mockRejectedValueOnce(new Error("404: tab not found")); -- browserClientMocks.browserTabs.mockResolvedValueOnce([{ targetId: "only-tab" }]); -+ it("recovers act when target tab disappears (non-chrome profile)", async () => { -+ browserActionsMocks.browserAct -+ .mockRejectedValueOnce(new Error("404: tab not found")) -+ .mockResolvedValueOnce({ ok: true, targetId: "new-tab" }); -+ browserClientMocks.browserTabs.mockResolvedValueOnce([ -+ { -+ targetId: "new-tab", -+ type: "page", -+ title: "Recovered", -+ url: "https://example.com", -+ }, -+ ]); - - const tool = createBrowserTool(); -- await expect( -- tool.execute?.("call-1", { -- action: "act", -- profile: "chrome-relay", -- request: { -- kind: "click", -- targetId: "stale-tab", -- ref: "btn-1", -- }, -- }), -- ).rejects.toThrow(/Run action=tabs profile="chrome-relay"/i); -+ const result = await tool.execute?.("call-1", { -+ action: "act", -+ request: { kind: "click", ref: "e1", targetId: "stale-tab" }, -+ }); - -- expect(browserActionsMocks.browserAct).toHaveBeenCalledTimes(1); -+ expect(browserActionsMocks.browserAct).toHaveBeenNthCalledWith( -+ 1, -+ undefined, -+ expect.objectContaining({ targetId: "stale-tab" }), -+ expect.objectContaining({ profile: undefined }), -+ ); -+ expect(browserActionsMocks.browserAct).toHaveBeenNthCalledWith( -+ 2, -+ undefined, -+ expect.objectContaining({ targetId: "new-tab" }), -+ expect.objectContaining({ profile: undefined }), -+ ); -+ expect(result?.details).toMatchObject({ ok: true, targetId: "new-tab" }); - }); - }); diff --git a/wiseflow/patches/002-disable-web-search-env-var.patch b/wiseflow/patches/002-disable-web-search-env-var.patch index 5f06785..be219f0 100644 --- a/wiseflow/patches/002-disable-web-search-env-var.patch +++ b/wiseflow/patches/002-disable-web-search-env-var.patch @@ -1,12 +1,11 @@ -diff --git a/src/agents/tools/web-search.ts b/src/agents/tools/web-search.ts -index 6e9518f1e..2731d6452 100644 ---- a/src/agents/tools/web-search.ts -+++ b/src/agents/tools/web-search.ts -@@ -539,6 +539,10 @@ function resolveSearchConfig(cfg?: OpenClawConfig): WebSearchConfig { - } - - function resolveSearchEnabled(params: { search?: WebSearchConfig; sandboxed?: boolean }): boolean { -+ // Allow disabling via env var (e.g., set by wiseflow addon to route searches through the browser) +diff --git a/src/web-search/runtime.ts b/src/web-search/runtime.ts +index 31040fb3df..ec915c0bf5 100644 +--- a/src/web-search/runtime.ts ++++ b/src/web-search/runtime.ts +@@ -43,6 +43,9 @@ export function resolveWebSearchEnabled(params: { + search?: WebSearchConfig; + sandboxed?: boolean; + }): boolean { + if (process.env.OPENCLAW_DISABLE_WEB_SEARCH === "1") { + return false; + } diff --git a/wiseflow/patches/003-act-field-validation.patch b/wiseflow/patches/003-act-field-validation.patch index 419040f..baa7854 100644 --- a/wiseflow/patches/003-act-field-validation.patch +++ b/wiseflow/patches/003-act-field-validation.patch @@ -1,8 +1,8 @@ diff --git a/src/agents/tools/browser-tool.actions.ts b/src/agents/tools/browser-tool.actions.ts -index a4b6cb456..5d1d37b74 100644 +index 22da3a56c8..c5e55ab38f 100644 --- a/src/agents/tools/browser-tool.actions.ts +++ b/src/agents/tools/browser-tool.actions.ts -@@ -73,6 +73,41 @@ function formatConsoleToolResult(result: { +@@ -106,6 +106,41 @@ function formatConsoleToolResult(result: { }; } @@ -42,9 +42,9 @@ index a4b6cb456..5d1d37b74 100644 +} + function isChromeStaleTargetError(profile: string | undefined, err: unknown): boolean { - if (profile !== "chrome-relay" && profile !== "chrome") { + if (!profile) { return false; -@@ -290,6 +325,7 @@ export async function executeActAction(params: { +@@ -365,6 +400,7 @@ export async function executeActAction(params: { proxyRequest: BrowserProxyRequest | null; }): Promise> { const { request, baseUrl, profile, proxyRequest } = params; @@ -53,11 +53,11 @@ index a4b6cb456..5d1d37b74 100644 const result = proxyRequest ? await proxyRequest({ diff --git a/src/agents/tools/browser-tool.test.ts b/src/agents/tools/browser-tool.test.ts -index adaaea782..d59a081b5 100644 +index ccda6bedce..55f2c16d41 100644 --- a/src/agents/tools/browser-tool.test.ts +++ b/src/agents/tools/browser-tool.test.ts -@@ -798,3 +798,113 @@ describe("browser tool act stale target recovery", () => { - expect(browserActionsMocks.browserAct).toHaveBeenCalledTimes(1); +@@ -877,3 +877,113 @@ describe("browser tool act stale target recovery", () => { + expect(result?.details).toMatchObject({ ok: true, targetId: "new-tab" }); }); }); + From 1d414f09727fd5c38118507375ccf0acad1ba6d0 Mon Sep 17 00:00:00 2001 From: codes-res-by-bigbrother666sh Date: Sun, 29 Mar 2026 15:29:27 +0800 Subject: [PATCH 3/3] chore(sync): update openclaw to v2026.3.28, adapt patch 003 new path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - openclaw.version: 2026.3.24 → 2026.3.28 (commit f9b10792) 实际 tag commit 为 f9b10792,非用户提供的 4d9a54cc(缩写可能有误) - 003-act-field-validation.patch: browser tool 已整体迁移到 extensions/browser/src/,patch 目标路径从 src/agents/tools/browser-tool.{actions,test}.ts 更新为 extensions/browser/src/browser-tool.{actions,test}.ts - addon.json: 同步 openclaw_version / openclaw_commit --- openclaw.version | 4 ++-- wiseflow/addon.json | 4 ++-- .../patches/003-act-field-validation.patch | 24 +++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/openclaw.version b/openclaw.version index b5450f1..3e4d4e7 100644 --- a/openclaw.version +++ b/openclaw.version @@ -7,5 +7,5 @@ # git clone https://github.com/openclaw/openclaw openclaw # git -C openclaw checkout $OPENCLAW_COMMIT # -OPENCLAW_VERSION=2026.3.24 -OPENCLAW_COMMIT=cff6dc94e30794a269eb7805b6e636c3634a088c +OPENCLAW_VERSION=2026.3.28 +OPENCLAW_COMMIT=f9b1079283a8ee25a7cee77c8f8225d5c813bc30 diff --git a/wiseflow/addon.json b/wiseflow/addon.json index 90a6c9a..0e91933 100644 --- a/wiseflow/addon.json +++ b/wiseflow/addon.json @@ -2,8 +2,8 @@ "name": "wiseflow", "version": "0.3.0", "description": "浏览器反检测 + Tab Recovery + 互联网搜索增强(smart-search / rss-reader skills + 禁用内置 web_search)+ 新媒体小编 Crew 模板", - "openclaw_version": "2026.3.24", - "openclaw_commit": "cff6dc94e30794a269eb7805b6e636c3634a088c", + "openclaw_version": "2026.3.28", + "openclaw_commit": "f9b1079283a8ee25a7cee77c8f8225d5c813bc30", "auto-activate": false, "internal_crews": ["new-media-editor"] } diff --git a/wiseflow/patches/003-act-field-validation.patch b/wiseflow/patches/003-act-field-validation.patch index baa7854..24114d4 100644 --- a/wiseflow/patches/003-act-field-validation.patch +++ b/wiseflow/patches/003-act-field-validation.patch @@ -1,8 +1,8 @@ -diff --git a/src/agents/tools/browser-tool.actions.ts b/src/agents/tools/browser-tool.actions.ts -index 22da3a56c8..c5e55ab38f 100644 ---- a/src/agents/tools/browser-tool.actions.ts -+++ b/src/agents/tools/browser-tool.actions.ts -@@ -106,6 +106,41 @@ function formatConsoleToolResult(result: { +diff --git a/extensions/browser/src/browser-tool.actions.ts b/extensions/browser/src/browser-tool.actions.ts +index bbd92145c0..d79c3fed84 100644 +--- a/extensions/browser/src/browser-tool.actions.ts ++++ b/extensions/browser/src/browser-tool.actions.ts +@@ -112,6 +112,41 @@ function formatConsoleToolResult(result: { }; } @@ -44,7 +44,7 @@ index 22da3a56c8..c5e55ab38f 100644 function isChromeStaleTargetError(profile: string | undefined, err: unknown): boolean { if (!profile) { return false; -@@ -365,6 +400,7 @@ export async function executeActAction(params: { +@@ -343,6 +378,7 @@ export async function executeActAction(params: { proxyRequest: BrowserProxyRequest | null; }): Promise> { const { request, baseUrl, profile, proxyRequest } = params; @@ -52,12 +52,12 @@ index 22da3a56c8..c5e55ab38f 100644 try { const result = proxyRequest ? await proxyRequest({ -diff --git a/src/agents/tools/browser-tool.test.ts b/src/agents/tools/browser-tool.test.ts -index ccda6bedce..55f2c16d41 100644 ---- a/src/agents/tools/browser-tool.test.ts -+++ b/src/agents/tools/browser-tool.test.ts -@@ -877,3 +877,113 @@ describe("browser tool act stale target recovery", () => { - expect(result?.details).toMatchObject({ ok: true, targetId: "new-tab" }); +diff --git a/extensions/browser/src/browser-tool.test.ts b/extensions/browser/src/browser-tool.test.ts +index c9d48521a3..a05bc04b42 100644 +--- a/extensions/browser/src/browser-tool.test.ts ++++ b/extensions/browser/src/browser-tool.test.ts +@@ -818,3 +818,113 @@ describe("browser tool act stale target recovery", () => { + expect(browserActionsMocks.browserAct).toHaveBeenCalledTimes(1); }); }); +