diff --git a/extensions/firecrawl/src/firecrawl-client.ts b/extensions/firecrawl/src/firecrawl-client.ts index 3a4ce1dc3f0..ba866cc7a36 100644 --- a/extensions/firecrawl/src/firecrawl-client.ts +++ b/extensions/firecrawl/src/firecrawl-client.ts @@ -104,22 +104,42 @@ async function postFirecrawlJson( }, async ({ response }) => { if (!response.ok) { - let detail = response.statusText; - const errorBody = await readResponseText(response, { maxBytes: 64_000 }); - try { - const payload = JSON.parse(errorBody.text) as Record; + let detail = + typeof response.statusText === "string" && response.statusText.trim() + ? response.statusText.trim() + : "request failed"; + + const readJsonPayload = async (): Promise | null> => { + const candidate = response as Response & { clone?: () => Response }; + const jsonResponse = typeof candidate.clone === "function" ? candidate.clone() : response; + if (typeof jsonResponse.json !== "function") { + return null; + } + try { + const payload = await jsonResponse.json(); + return payload && typeof payload === "object" && !Array.isArray(payload) + ? (payload as Record) + : null; + } catch { + return null; + } + }; + + const payload = await readJsonPayload(); + if (payload) { detail = typeof payload.error === "string" ? payload.error : typeof payload.message === "string" ? payload.message : detail; - } catch { + } else { + const errorBody = await readResponseText(response, { maxBytes: 64_000 }); if (errorBody.text) { detail = errorBody.text; } } - const safeDetail = wrapWebContent(detail.slice(0, 1_000), "web_fetch"); + const safeDetail = wrapWebContent(String(detail).slice(0, 1_000), "web_fetch"); throw new Error(`${params.errorLabel} API error (${response.status}): ${safeDetail}`); } return await parse(response); diff --git a/extensions/github-copilot/token.ts b/extensions/github-copilot/token.ts index 5c1076ad710..b2d8625f184 100644 --- a/extensions/github-copilot/token.ts +++ b/extensions/github-copilot/token.ts @@ -1 +1,7 @@ -export * from "openclaw/plugin-sdk/github-copilot-token"; +import { + DEFAULT_COPILOT_API_BASE_URL, + deriveCopilotApiBaseUrlFromToken, + resolveCopilotApiToken, +} from "openclaw/plugin-sdk/github-copilot-token"; + +export { DEFAULT_COPILOT_API_BASE_URL, deriveCopilotApiBaseUrlFromToken, resolveCopilotApiToken }; diff --git a/extensions/lobster/src/lobster-tool.test.ts b/extensions/lobster/src/lobster-tool.test.ts index 30621f54b19..5d8a7619bed 100644 --- a/extensions/lobster/src/lobster-tool.test.ts +++ b/extensions/lobster/src/lobster-tool.test.ts @@ -51,6 +51,7 @@ function fakeApi(overrides: Partial = {}): OpenClawPluginApi registerRealtimeVoiceProvider() {}, registerMediaUnderstandingProvider() {}, registerImageGenerationProvider() {}, + registerVideoGenerationProvider() {}, registerWebFetchProvider() {}, registerWebSearchProvider() {}, registerInteractiveHandler() {}, diff --git a/extensions/telegram/src/bot-native-commands.registry.test.ts b/extensions/telegram/src/bot-native-commands.registry.test.ts index 462af86acdb..74db86df8a0 100644 --- a/extensions/telegram/src/bot-native-commands.registry.test.ts +++ b/extensions/telegram/src/bot-native-commands.registry.test.ts @@ -57,6 +57,7 @@ function createTelegramPluginRegistry() { speechProviders: [], mediaUnderstandingProviders: [], imageGenerationProviders: [], + videoGenerationProviders: [], webFetchProviders: [], webSearchProviders: [], gatewayHandlers: {}, diff --git a/src/plugin-sdk/whatsapp-surface.ts b/src/plugin-sdk/whatsapp-surface.ts new file mode 100644 index 00000000000..93d197467e0 --- /dev/null +++ b/src/plugin-sdk/whatsapp-surface.ts @@ -0,0 +1,70 @@ +// Generated by scripts/generate-plugin-sdk-facades.mjs. Do not edit manually. +import type { PluginSdkFacadeTypeMap } from "../generated/plugin-sdk-facade-type-map.generated.js"; +type FacadeEntry = PluginSdkFacadeTypeMap["whatsapp-surface"]; +type FacadeModule = FacadeEntry["module"]; +type FacadeModule2 = FacadeEntry["sourceModules"]["source2"]["module"]; +import { + createLazyFacadeObjectValue, + loadBundledPluginPublicSurfaceModuleSync, +} from "./facade-runtime.js"; + +function loadFacadeModule(): FacadeModule { + return loadBundledPluginPublicSurfaceModuleSync({ + dirName: "whatsapp", + artifactBasename: "api.js", + }); +} + +function loadFacadeModule2(): FacadeModule2 { + return loadBundledPluginPublicSurfaceModuleSync({ + dirName: "whatsapp", + artifactBasename: "constants.js", + }); +} +export const DEFAULT_WEB_MEDIA_BYTES: FacadeModule2["DEFAULT_WEB_MEDIA_BYTES"] = + loadFacadeModule2()["DEFAULT_WEB_MEDIA_BYTES"]; +export const hasAnyWhatsAppAuth: FacadeModule["hasAnyWhatsAppAuth"] = ((...args) => + loadFacadeModule()["hasAnyWhatsAppAuth"](...args)) as FacadeModule["hasAnyWhatsAppAuth"]; +export const listEnabledWhatsAppAccounts: FacadeModule["listEnabledWhatsAppAccounts"] = (( + ...args +) => + loadFacadeModule()["listEnabledWhatsAppAccounts"]( + ...args, + )) as FacadeModule["listEnabledWhatsAppAccounts"]; +export const listWhatsAppDirectoryGroupsFromConfig: FacadeModule["listWhatsAppDirectoryGroupsFromConfig"] = + ((...args) => + loadFacadeModule()["listWhatsAppDirectoryGroupsFromConfig"]( + ...args, + )) as FacadeModule["listWhatsAppDirectoryGroupsFromConfig"]; +export const listWhatsAppDirectoryPeersFromConfig: FacadeModule["listWhatsAppDirectoryPeersFromConfig"] = + ((...args) => + loadFacadeModule()["listWhatsAppDirectoryPeersFromConfig"]( + ...args, + )) as FacadeModule["listWhatsAppDirectoryPeersFromConfig"]; +export const resolveWhatsAppAccount: FacadeModule["resolveWhatsAppAccount"] = ((...args) => + loadFacadeModule()["resolveWhatsAppAccount"](...args)) as FacadeModule["resolveWhatsAppAccount"]; +export const resolveWhatsAppGroupRequireMention: FacadeModule["resolveWhatsAppGroupRequireMention"] = + ((...args) => + loadFacadeModule()["resolveWhatsAppGroupRequireMention"]( + ...args, + )) as FacadeModule["resolveWhatsAppGroupRequireMention"]; +export const resolveWhatsAppGroupToolPolicy: FacadeModule["resolveWhatsAppGroupToolPolicy"] = (( + ...args +) => + loadFacadeModule()["resolveWhatsAppGroupToolPolicy"]( + ...args, + )) as FacadeModule["resolveWhatsAppGroupToolPolicy"]; +export const resolveWhatsAppOutboundTarget: FacadeModule["resolveWhatsAppOutboundTarget"] = (( + ...args +) => + loadFacadeModule()["resolveWhatsAppOutboundTarget"]( + ...args, + )) as FacadeModule["resolveWhatsAppOutboundTarget"]; +export const whatsappAccessControlTesting: FacadeModule["whatsappAccessControlTesting"] = + createLazyFacadeObjectValue( + () => loadFacadeModule()["whatsappAccessControlTesting"] as object, + ) as FacadeModule["whatsappAccessControlTesting"]; +export type WebChannelStatus = FacadeEntry["types"]["WebChannelStatus"]; +export type WebInboundMessage = FacadeEntry["types"]["WebInboundMessage"]; +export type WebListenerCloseReason = FacadeEntry["types"]["WebListenerCloseReason"]; +export type WebMonitorTuning = FacadeEntry["types"]["WebMonitorTuning"];