From bf038f5ca4353df5e0738dadff326821bcff7a6d Mon Sep 17 00:00:00 2001 From: paisley <8197966+su8su@users.noreply.github.com> Date: Wed, 10 Jun 2026 17:52:05 +0800 Subject: [PATCH] feat:upgrade OpenClaw to 2026.6.5 and fix OAuth provider detection for auth-profile-only configs. (#1109) --- .../providers/provider-runtime-sync.ts | 2 + electron/utils/openclaw-auth-sqlite.ts | 297 ++++ electron/utils/openclaw-auth.ts | 91 +- ...ix-first-chat-no-response-fallback-poll.md | 34 + package.json | 8 +- pnpm-lock.yaml | 1216 ++++------------- src/stores/chat.ts | 33 +- tests/unit/chat-store-history-retry.test.ts | 133 ++ tests/unit/openclaw-auth-sqlite.test.ts | 92 ++ tests/unit/openclaw-auth.test.ts | 6 +- .../provider-service-stale-cleanup.test.ts | 38 + 11 files changed, 957 insertions(+), 993 deletions(-) create mode 100644 electron/utils/openclaw-auth-sqlite.ts create mode 100644 harness/specs/tasks/fix-first-chat-no-response-fallback-poll.md create mode 100644 tests/unit/openclaw-auth-sqlite.test.ts diff --git a/electron/services/providers/provider-runtime-sync.ts b/electron/services/providers/provider-runtime-sync.ts index ffd12dbc..c5c1ea1a 100644 --- a/electron/services/providers/provider-runtime-sync.ts +++ b/electron/services/providers/provider-runtime-sync.ts @@ -7,6 +7,7 @@ import { getProviderConfig, getProviderDefaultModel } from '../../utils/provider import { ensureAnthropicMessagesModelMaxTokens, ensureOpenClawProviderAgentRuntimePins, + migrateAllAgentAuthProfilesToSqlite, pruneInvalidApiProviderEntries, removeProviderFromOpenClaw, removeProviderKeyFromOpenClaw, @@ -210,6 +211,7 @@ export async function syncProviderApiKeyToRuntime( } export async function syncAllProviderAuthToRuntime(): Promise { + await migrateAllAgentAuthProfilesToSqlite(); const accounts = await listProviderAccounts(); for (const account of accounts) { const runtimeProviderKey = await resolveRuntimeProviderKey({ diff --git a/electron/utils/openclaw-auth-sqlite.ts b/electron/utils/openclaw-auth-sqlite.ts new file mode 100644 index 00000000..6b257e69 --- /dev/null +++ b/electron/utils/openclaw-auth-sqlite.ts @@ -0,0 +1,297 @@ +/** + * OpenClaw 2026.6+ persists agent auth in openclaw-agent.sqlite. + * ClawX historically wrote auth-profiles.json only; gateway runtime reads SQLite. + */ +import { chmodSync, existsSync, mkdirSync } from 'fs'; +import { access, readFile } from 'fs/promises'; +import { constants } from 'fs'; +import { join } from 'path'; +import { homedir } from 'os'; +import { DatabaseSync } from 'node:sqlite'; + +const AUTH_PROFILE_FILENAME = 'auth-profiles.json'; +const AUTH_SQLITE_FILENAME = 'openclaw-agent.sqlite'; +const PRIMARY_ROW_KEY = 'primary'; +const SCHEMA_VERSION = 1; + +const OPENCLAW_AGENT_SCHEMA_SQL = `CREATE TABLE IF NOT EXISTS schema_meta ( + meta_key TEXT NOT NULL PRIMARY KEY, + role TEXT NOT NULL, + schema_version INTEGER NOT NULL, + agent_id TEXT, + app_version TEXT, + created_at INTEGER NOT NULL, + updated_at INTEGER NOT NULL +); + +CREATE TABLE IF NOT EXISTS cache_entries ( + scope TEXT NOT NULL, + key TEXT NOT NULL, + value_json TEXT, + blob BLOB, + expires_at INTEGER, + updated_at INTEGER NOT NULL, + PRIMARY KEY (scope, key) +); + +CREATE INDEX IF NOT EXISTS idx_agent_cache_expiry + ON cache_entries(scope, expires_at, key) + WHERE expires_at IS NOT NULL; + +CREATE INDEX IF NOT EXISTS idx_agent_cache_updated + ON cache_entries(scope, updated_at DESC, key); + +CREATE TABLE IF NOT EXISTS auth_profile_store ( + store_key TEXT NOT NULL PRIMARY KEY, + store_json TEXT NOT NULL, + updated_at INTEGER NOT NULL +); + +CREATE TABLE IF NOT EXISTS auth_profile_state ( + state_key TEXT NOT NULL PRIMARY KEY, + state_json TEXT NOT NULL, + updated_at INTEGER NOT NULL +); +`; + +export interface PersistedAuthProfileCredential { + type: string; + provider: string; + key?: string; + access?: string; + refresh?: string; + expires?: number; + email?: string; + projectId?: string; + [extra: string]: unknown; +} + +export interface PersistedAuthProfilesStore { + version: number; + profiles: Record; + order?: Record; + lastGood?: Record; + usageStats?: Record; +} + +function getAgentAuthDir(agentId: string): string { + return join(homedir(), '.openclaw', 'agents', agentId, 'agent'); +} + +export function getAuthProfilesJsonPath(agentId: string): string { + return join(getAgentAuthDir(agentId), AUTH_PROFILE_FILENAME); +} + +export function getAuthProfilesSqlitePath(agentId: string): string { + return join(getAgentAuthDir(agentId), AUTH_SQLITE_FILENAME); +} + +function ensureAgentAuthDir(agentId: string): void { + const dir = getAgentAuthDir(agentId); + mkdirSync(dir, { recursive: true, mode: 0o700 }); +} + +function ensureDatabaseSchema(db: DatabaseSync, agentId: string): void { + db.exec(OPENCLAW_AGENT_SCHEMA_SQL); + db.exec(`PRAGMA user_version = ${SCHEMA_VERSION};`); + const now = Date.now(); + db.prepare(` + INSERT INTO schema_meta ( + meta_key, role, schema_version, agent_id, app_version, created_at, updated_at + ) VALUES (?, 'agent', ?, ?, NULL, ?, ?) + ON CONFLICT(meta_key) DO UPDATE SET + role = excluded.role, + schema_version = excluded.schema_version, + agent_id = excluded.agent_id, + updated_at = excluded.updated_at + `).run(PRIMARY_ROW_KEY, SCHEMA_VERSION, agentId, now, now); +} + +function tightenDatabasePermissions(sqlitePath: string): void { + try { + if (process.platform !== 'win32') { + chmodSync(sqlitePath, 0o600); + for (const suffix of ['-wal', '-shm']) { + const sidecar = `${sqlitePath}${suffix}`; + if (existsSync(sidecar)) { + chmodSync(sidecar, 0o600); + } + } + } + } catch { + // Best-effort; Windows ACLs differ from POSIX modes. + } +} + +function parseJsonCell(raw: string | null | undefined): Record | null { + if (!raw) return null; + try { + const parsed = JSON.parse(raw) as unknown; + return parsed && typeof parsed === 'object' ? parsed as Record : null; + } catch { + return null; + } +} + +function coerceAuthProfilesStore(raw: Record | null): PersistedAuthProfilesStore | null { + if (!raw || typeof raw !== 'object') return null; + const profiles = raw.profiles; + if (!profiles || typeof profiles !== 'object') return null; + const version = typeof raw.version === 'number' ? raw.version : 1; + const store: PersistedAuthProfilesStore = { + version, + profiles: profiles as Record, + }; + if (raw.order && typeof raw.order === 'object') { + store.order = raw.order as Record; + } + if (raw.lastGood && typeof raw.lastGood === 'object') { + store.lastGood = raw.lastGood as Record; + } + if (raw.usageStats && typeof raw.usageStats === 'object') { + store.usageStats = raw.usageStats as Record; + } + return store; +} + +function buildSecretsPayload(store: PersistedAuthProfilesStore): Record { + return { + version: store.version ?? 1, + profiles: store.profiles, + }; +} + +function buildStatePayload(store: PersistedAuthProfilesStore): Record | null { + if (!store.order && !store.lastGood && !store.usageStats) { + return null; + } + return { + version: 1, + ...(store.order ? { order: store.order } : {}), + ...(store.lastGood ? { lastGood: store.lastGood } : {}), + ...(store.usageStats ? { usageStats: store.usageStats } : {}), + }; +} + +function mergeStoreAndState( + secrets: Record | null, + state: Record | null, +): PersistedAuthProfilesStore | null { + const base = coerceAuthProfilesStore(secrets); + if (!base) return null; + if (!state) return base; + if (state.order && typeof state.order === 'object') { + base.order = state.order as Record; + } + if (state.lastGood && typeof state.lastGood === 'object') { + base.lastGood = state.lastGood as Record; + } + if (state.usageStats && typeof state.usageStats === 'object') { + base.usageStats = state.usageStats as Record; + } + return base; +} + +function hasPersistedProfiles(store: PersistedAuthProfilesStore | null | undefined): boolean { + return !!store && Object.keys(store.profiles).length > 0; +} + +function openAgentDatabase(agentId: string, sqlitePath: string): DatabaseSync { + ensureAgentAuthDir(agentId); + const db = new DatabaseSync(sqlitePath); + db.exec('PRAGMA synchronous = NORMAL;'); + db.exec('PRAGMA busy_timeout = 5000;'); + db.exec('PRAGMA foreign_keys = ON;'); + ensureDatabaseSchema(db, agentId); + return db; +} + +export function readAuthProfilesFromSqlite(agentId: string): PersistedAuthProfilesStore | null { + const sqlitePath = getAuthProfilesSqlitePath(agentId); + if (!existsSync(sqlitePath)) { + return null; + } + + const db = new DatabaseSync(sqlitePath, { readOnly: true }); + try { + const storeRow = db.prepare( + 'SELECT store_json FROM auth_profile_store WHERE store_key = ?', + ).get(PRIMARY_ROW_KEY) as { store_json?: string } | undefined; + const stateRow = db.prepare( + 'SELECT state_json FROM auth_profile_state WHERE state_key = ?', + ).get(PRIMARY_ROW_KEY) as { state_json?: string } | undefined; + return mergeStoreAndState( + parseJsonCell(storeRow?.store_json), + parseJsonCell(stateRow?.state_json), + ); + } catch (error) { + console.warn(`Failed to read auth profiles from SQLite (${sqlitePath}):`, error); + return null; + } finally { + db.close(); + } +} + +export function writeAuthProfilesToSqlite( + store: PersistedAuthProfilesStore, + agentId: string, +): void { + const sqlitePath = getAuthProfilesSqlitePath(agentId); + const db = openAgentDatabase(agentId, sqlitePath); + try { + const now = Date.now(); + const secretsPayload = JSON.stringify(buildSecretsPayload(store)); + db.prepare(` + INSERT INTO auth_profile_store (store_key, store_json, updated_at) + VALUES (?, ?, ?) + ON CONFLICT(store_key) DO UPDATE SET + store_json = excluded.store_json, + updated_at = excluded.updated_at + `).run(PRIMARY_ROW_KEY, secretsPayload, now); + + const statePayload = buildStatePayload(store); + if (statePayload) { + db.prepare(` + INSERT INTO auth_profile_state (state_key, state_json, updated_at) + VALUES (?, ?, ?) + ON CONFLICT(state_key) DO UPDATE SET + state_json = excluded.state_json, + updated_at = excluded.updated_at + `).run(PRIMARY_ROW_KEY, JSON.stringify(statePayload), now); + } else { + db.prepare('DELETE FROM auth_profile_state WHERE state_key = ?').run(PRIMARY_ROW_KEY); + } + } finally { + db.close(); + tightenDatabasePermissions(sqlitePath); + } +} + +export async function readAuthProfilesJson(agentId: string): Promise { + const jsonPath = getAuthProfilesJsonPath(agentId); + try { + await access(jsonPath, constants.F_OK); + const raw = JSON.parse(await readFile(jsonPath, 'utf-8')) as Record; + return coerceAuthProfilesStore(raw); + } catch { + return null; + } +} + +export async function migrateAuthProfilesJsonToSqliteIfNeeded(agentId: string): Promise { + const sqliteStore = readAuthProfilesFromSqlite(agentId); + if (hasPersistedProfiles(sqliteStore)) { + return false; + } + + const jsonStore = await readAuthProfilesJson(agentId); + if (!hasPersistedProfiles(jsonStore)) { + return false; + } + + writeAuthProfilesToSqlite(jsonStore!, agentId); + console.log( + `[auth-sync] Migrated auth-profiles.json to SQLite for agent "${agentId}"`, + ); + return true; +} diff --git a/electron/utils/openclaw-auth.ts b/electron/utils/openclaw-auth.ts index c7c47e0b..54b9e6de 100644 --- a/electron/utils/openclaw-auth.ts +++ b/electron/utils/openclaw-auth.ts @@ -1,7 +1,8 @@ /** * OpenClaw Auth Profiles Utility - * Writes API keys to configured OpenClaw agent auth-profiles.json files - * so the OpenClaw Gateway can load them for AI provider calls. + * Writes API keys to OpenClaw agent auth storage (SQLite primary since 2026.6+, + * with auth-profiles.json kept for migration compatibility) so the Gateway can + * load them for AI provider calls. * * All file I/O is asynchronous (fs/promises) to avoid blocking the * Electron main thread. On Windows + NTFS + Defender the synchronous @@ -39,6 +40,13 @@ import { CLAWX_OPENAI_IMAGE_DEFAULT_MODEL, CLAWX_OPENAI_IMAGE_PROVIDER_KEY, } from './openclaw-image-relay-constants'; +import { + migrateAuthProfilesJsonToSqliteIfNeeded, + readAuthProfilesFromSqlite, + readAuthProfilesJson, + writeAuthProfilesToSqlite, + type PersistedAuthProfilesStore, +} from './openclaw-auth-sqlite'; const AUTH_STORE_VERSION = 1; const AUTH_PROFILE_FILENAME = 'auth-profiles.json'; @@ -324,12 +332,7 @@ interface OAuthProfileEntry { projectId?: string; } -interface AuthProfilesStore { - version: number; - profiles: Record; - order?: Record; - lastGood?: Record; -} +type AuthProfilesStore = PersistedAuthProfilesStore; function removeProfilesForProvider(store: AuthProfilesStore, provider: string): boolean { const removedProfileIds = new Set(); @@ -414,22 +417,42 @@ function getAuthProfilesPath(agentId = 'main'): string { } async function readAuthProfiles(agentId = 'main'): Promise { - const filePath = getAuthProfilesPath(agentId); - try { - const data = await readJsonFile(filePath); - if (data?.version && data.profiles && typeof data.profiles === 'object') { - return data; - } - } catch (error) { - console.warn('Failed to read auth-profiles.json, creating fresh store:', error); + const sqliteStore = readAuthProfilesFromSqlite(agentId); + if (sqliteStore?.profiles && Object.keys(sqliteStore.profiles).length > 0) { + return sqliteStore; } + + const jsonStore = await readAuthProfilesJson(agentId); + if (jsonStore?.profiles && Object.keys(jsonStore.profiles).length > 0) { + try { + writeAuthProfilesToSqlite(jsonStore, agentId); + console.log(`[auth-sync] Backfilled SQLite auth store from JSON for agent "${agentId}"`); + } catch (error) { + console.warn(`Failed to backfill SQLite auth store for agent "${agentId}":`, error); + } + return jsonStore; + } + return { version: AUTH_STORE_VERSION, profiles: {} }; } async function writeAuthProfiles(store: AuthProfilesStore, agentId = 'main'): Promise { + writeAuthProfilesToSqlite(store, agentId); await writeJsonFile(getAuthProfilesPath(agentId), store); } +/** Migrate legacy JSON-only auth profiles into SQLite for all configured agents. */ +export async function migrateAllAgentAuthProfilesToSqlite(): Promise { + const agentIds = await discoverAgentIds(); + for (const agentId of agentIds) { + try { + await migrateAuthProfilesJsonToSqliteIfNeeded(agentId); + } catch (error) { + console.warn(`Failed to migrate auth profiles to SQLite for agent "${agentId}":`, error); + } + } +} + function getApiKeyFromAuthProfilesStore( store: AuthProfilesStore, provider: string, @@ -622,6 +645,7 @@ function normalizeAuthProfileProviderKey(provider: string): string { function addProvidersFromProfileEntries( profiles: Record | undefined, target: Set, + options?: { includeRawKeys?: boolean }, ): void { if (!profiles || typeof profiles !== 'object') { return; @@ -632,17 +656,28 @@ function addProvidersFromProfileEntries( ? ((profile as Record).provider as string) : undefined; if (!provider) continue; - target.add(normalizeAuthProfileProviderKey(provider)); + const normalized = normalizeAuthProfileProviderKey(provider); + target.add(normalized); + // The raw runtime key (e.g. "openai-codex") matters for active-provider + // checks: filterActiveProviderKeysForUi() and the OAuth account matching + // in ProviderService.listAccounts() both key off it. Newer OpenClaw + // versions no longer keep explicit models.providers/plugins entries for + // these providers, so the auth profile is the only remaining signal. + if (options?.includeRawKeys && provider !== normalized) { + target.add(provider); + } } } -async function getProvidersFromAuthProfileStores(): Promise> { +async function getProvidersFromAuthProfileStores( + options?: { includeRawKeys?: boolean }, +): Promise> { const providers = new Set(); const agentIds = await discoverAgentIds(); for (const agentId of agentIds) { const store = await readAuthProfiles(agentId); - addProvidersFromProfileEntries(store.profiles, providers); + addProvidersFromProfileEntries(store.profiles, providers, options); } return providers; @@ -675,9 +710,13 @@ async function collectActiveProviderIdsFromConfig(config: Record | undefined; - addProvidersFromProfileEntries(auth?.profiles as Record | undefined, activeProviders); + addProvidersFromProfileEntries( + auth?.profiles as Record | undefined, + activeProviders, + { includeRawKeys: true }, + ); - const authProfileProviders = await getProvidersFromAuthProfileStores(); + const authProfileProviders = await getProvidersFromAuthProfileStores({ includeRawKeys: true }); for (const provider of authProfileProviders) { activeProviders.add(provider); } @@ -1952,10 +1991,16 @@ export async function getActiveOpenClawProviders(): Promise> { // 4. auth.profiles — OAuth/device-token based providers may exist only in // auth-profiles without explicit models.providers entries yet. + // Raw keys (e.g. "openai-codex") are included so downstream logic can + // distinguish OAuth runtime providers from their UI alias ("openai"). const auth = config.auth as Record | undefined; - addProvidersFromProfileEntries(auth?.profiles as Record | undefined, activeProviders); + addProvidersFromProfileEntries( + auth?.profiles as Record | undefined, + activeProviders, + { includeRawKeys: true }, + ); - const authProfileProviders = await getProvidersFromAuthProfileStores(); + const authProfileProviders = await getProvidersFromAuthProfileStores({ includeRawKeys: true }); for (const provider of authProfileProviders) { activeProviders.add(provider); } diff --git a/harness/specs/tasks/fix-first-chat-no-response-fallback-poll.md b/harness/specs/tasks/fix-first-chat-no-response-fallback-poll.md new file mode 100644 index 00000000..92f7a50b --- /dev/null +++ b/harness/specs/tasks/fix-first-chat-no-response-fallback-poll.md @@ -0,0 +1,34 @@ +--- +id: fix-first-chat-no-response-fallback-poll +title: Restore fallback transcript polling so missing streamed events do not fail the first chat +scenario: gateway-backend-communication +taskType: runtime-bridge +intent: Prevent the false "The model did not respond within 120 seconds" / "No response received from the model" errors on the first chat after Gateway startup when streamed chat/runtime events never reach the renderer, by polling chat.history as a fallback progress source during active sends. +touchedAreas: + - harness/specs/tasks/fix-first-chat-no-response-fallback-poll.md + - src/stores/chat.ts + - tests/unit/chat-store-history-retry.test.ts +expectedUserBehavior: + - When a send receives no streamed chat/runtime events (e.g. first run after Gateway startup or a silent WS drop), the renderer polls chat.history and surfaces transcript progress instead of firing the 120s/130s no-response safety errors. + - When the transcript shows a conclusive assistant reply, the run closes normally (sending cleared, reply rendered) without any error banner. + - While streamed events are fresh, the fallback poll issues no extra chat.history RPCs, so healthy streamed runs are unaffected. + - Renderer continues to use the existing gateway rpc Main-process boundary for chat.history polling. +requiredProfiles: + - fast + - comms +requiredRules: + - gateway-readiness-policy + - renderer-main-boundary + - backend-communication-boundary + - api-client-transport-policy +requiredTests: + - pnpm exec vitest run tests/unit/chat-store-history-retry.test.ts + - pnpm run typecheck +acceptance: + - The active sendMessage path arms a fallback transcript poll that only issues chat.history RPCs after sustained streamed-event silence. + - Streamed chat events no longer permanently clear the fallback poll timer; the poll self-throttles via event freshness instead. + - A run whose transcript contains a final assistant reply closes without emitting the no-response safety errors even when zero streamed events arrive. + - Renderer does not add direct IPC calls or Gateway HTTP fetches outside the existing api-client invocation path. +docs: + required: false +--- diff --git a/package.json b/package.json index cbe05145..6336b000 100644 --- a/package.json +++ b/package.json @@ -102,9 +102,9 @@ "@larksuite/openclaw-lark": "2026.5.20", "@larksuiteoapi/node-sdk": "^1.61.1", "@monaco-editor/react": "^4.7.0", - "@openclaw/discord": "2026.5.20", - "@openclaw/qqbot": "2026.5.20", - "@openclaw/whatsapp": "2026.5.20", + "@openclaw/discord": "2026.6.5", + "@openclaw/qqbot": "2026.6.5", + "@openclaw/whatsapp": "2026.6.5", "@playwright/test": "^1.56.1", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", @@ -158,7 +158,7 @@ "monaco-editor": "^0.55.1", "mpg123-decoder": "^1.0.3", "ms": "^2.1.3", - "openclaw": "2026.5.20", + "openclaw": "2026.6.5", "opusscript": "^0.1.1", "pdfjs-dist": "^5.7.284", "playwright-core": "1.59.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0824ba72..955448ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,7 +53,7 @@ importers: version: 1.3.7 '@larksuite/openclaw-lark': specifier: 2026.5.20 - version: 2026.5.20(openclaw@2026.5.20(encoding@0.1.13)) + version: 2026.5.20(openclaw@2026.6.5(encoding@0.1.13)) '@larksuiteoapi/node-sdk': specifier: ^1.61.1 version: 1.62.0 @@ -61,14 +61,14 @@ importers: specifier: ^4.7.0 version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@openclaw/discord': - specifier: 2026.5.20 - version: 2026.5.20(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1)(openclaw@2026.5.20(encoding@0.1.13)) + specifier: 2026.6.5 + version: 2026.6.5(openclaw@2026.6.5(encoding@0.1.13)) '@openclaw/qqbot': - specifier: 2026.5.20 - version: 2026.5.20(openclaw@2026.5.20(encoding@0.1.13)) + specifier: 2026.6.5 + version: 2026.6.5(openclaw@2026.6.5(encoding@0.1.13)) '@openclaw/whatsapp': - specifier: 2026.5.20 - version: 2026.5.20(openclaw@2026.5.20(encoding@0.1.13))(sharp@0.34.5) + specifier: 2026.6.5 + version: 2026.6.5(openclaw@2026.6.5(encoding@0.1.13)) '@playwright/test': specifier: ^1.56.1 version: 1.59.0 @@ -113,13 +113,13 @@ importers: version: 0.34.48 '@soimy/dingtalk': specifier: ^3.6.3 - version: 3.6.4(openclaw@2026.5.20(encoding@0.1.13)) + version: 3.6.4(openclaw@2026.6.5(encoding@0.1.13)) '@tencent-connect/qqbot-connector': specifier: ^1.1.0 version: 1.1.0 '@tencent-weixin/openclaw-weixin': specifier: ^2.4.3 - version: 2.4.3(openclaw@2026.5.20(encoding@0.1.13)) + version: 2.4.3(openclaw@2026.6.5(encoding@0.1.13)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -152,7 +152,7 @@ importers: version: 5.2.0(vite@7.3.1(@types/node@25.5.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.9.0)) '@wecom/wecom-openclaw-plugin': specifier: ^2026.5.14 - version: 2026.5.14(openclaw@2026.5.20(encoding@0.1.13)) + version: 2026.5.14(openclaw@2026.6.5(encoding@0.1.13)) '@whiskeysockets/baileys': specifier: 7.0.0-rc.9 version: 7.0.0-rc.9(audio-decode@2.2.3)(jimp@1.6.1)(sharp@0.34.5) @@ -229,8 +229,8 @@ importers: specifier: ^2.1.3 version: 2.1.3 openclaw: - specifier: 2026.5.20 - version: 2026.5.20(encoding@0.1.13) + specifier: 2026.6.5 + version: 2026.6.5(encoding@0.1.13) opusscript: specifier: ^0.1.1 version: 0.1.1 @@ -352,8 +352,8 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@anthropic-ai/sdk@0.91.1': - resolution: {integrity: sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==} + '@anthropic-ai/sdk@0.100.1': + resolution: {integrity: sha512-RANcEe7LpiLczkKGOwoXOTuFdPhuubS0i4xaAKOMpcqc55YO0mukgxppV7eygx3DXNjxWT6RYOLPyOy0aIAmwg==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -371,111 +371,6 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/sha256-browser@5.2.0': - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - - '@aws-crypto/sha256-js@5.2.0': - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/supports-web-crypto@5.2.0': - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/client-bedrock-runtime@3.1048.0': - resolution: {integrity: sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/core@3.974.15': - resolution: {integrity: sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-env@3.972.41': - resolution: {integrity: sha512-n1EbJ98yvPWWdHZZv8bRBMqqDQJrtgtxyJ4xLy2Uqrh25BCOZQ7nnS1CsFXvuH8r0b0KVHDZEGEH5FxmEMP8jg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-http@3.972.43': - resolution: {integrity: sha512-TT76RN1NkI9WoyZqCNxOw6/WBMF7pYOTJcXbMokNFU+euSG40Kaf/t/FhDACVZWP+43wEM6ZynIPIkzS1wR1iA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-ini@3.972.46': - resolution: {integrity: sha512-hvcgcwOiS0nb2XFb5Op1Pz/vYaWz5K8kKullziGpdNRuG0NwzRXseuPt2CoBqknHGaSPVesu1aOn2OcctEYdCA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-login@3.972.45': - resolution: {integrity: sha512-MZQv4SNjByk1iOKmrqmzcUF/uCB05wjvEHyXKxmGQTUANTIVayX6HPUF0bzkWLvtnkH7sAn9kUCfkXbSpj9sDA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-node@3.972.48': - resolution: {integrity: sha512-QIbtJP0olSLZ2ImEu636pP+7JJbPfaL3xSJIFXhu472CWuondCc4bGOa8OeyhOFet8z4H1D/ZFKXc39FboWwYA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-process@3.972.41': - resolution: {integrity: sha512-7I/n1zkysouLOWvkEhjNEP4vMnD2v4kzzr3/3QBdrripEpn7ap1/I5DF3Hou1SUqkKWo1f3oPGMyFAA1FAMvsQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-sso@3.972.45': - resolution: {integrity: sha512-oHgbz/eFD8IKiksqDsz9ZMU4A59BpQq4QwJedBnGD80ZqYcHPPHZBwjBnxLVkB7iRVVHWpDclR8yWdD2PkQIUA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.972.45': - resolution: {integrity: sha512-CDhzKdb2onv5bpnjn/acgdNmJOQthPDLsPizU7rZflsEcgMMp8Mlri+U5hdxf8ldvZJpvM3vLU6D56vfJm5AMQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/eventstream-handler-node@3.972.18': - resolution: {integrity: sha512-QPQhwY/fstR8fMZFWrsJRNoTP6D1RjRPHGRX7u9/VkF3opCsvD0oXPz6qzkX94SchzvuS5vyFZbJbPcMEs2Jeg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-eventstream@3.972.14': - resolution: {integrity: sha512-DoZ4djVj/74XQ6M/IwxuKh543tTvLCL7u1Dx+VDHMgW9yGNrFSJJ1l0LrUQRaekic5CB12wUiiOoHL0VI6H0gg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-websocket@3.972.23': - resolution: {integrity: sha512-F0d4A9pJFiwljyKgSwU1Z5n+CXSv8bp+V5SthbS2rftB8wBN9z1K2Yyv3xbeK0AM2T0g4q6Ptf0shFF+oQZyiA==} - engines: {node: '>= 14.0.0'} - - '@aws-sdk/nested-clients@3.997.13': - resolution: {integrity: sha512-2pA6eyb5nSo/ZD2cayhOTEMoGQYgspq0RI05GDLkzQ3ajZ6isS6waV6E92Am/hz4LIlLUTrbwPLurJ/fuiHvkg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.996.30': - resolution: {integrity: sha512-HULDLMVzkmTSEv6//7kx2kRevp/VYUpm8hJNNFbmhxDn0fUiGTxVcM9yg31TukvTq8nyOBDUN2gH0o5IRbKjdw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/token-providers@3.1048.0': - resolution: {integrity: sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/token-providers@3.1056.0': - resolution: {integrity: sha512-81duvlltQlsfn5K+o8zILcystBRdbT1G2JJYVCML5NZHBz4CL/zf+sAemCtBh/uh6RQUMyInGeZLQ7/8igZhbA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/types@3.973.8': - resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/types@3.973.9': - resolution: {integrity: sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-locate-window@3.965.5': - resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/xml-builder@3.972.26': - resolution: {integrity: sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g==} - engines: {node: '>=20.0.0'} - - '@aws/lambda-invoke-store@0.2.4': - resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} - engines: {node: '>=18.0.0'} - '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -644,22 +539,8 @@ packages: resolution: {integrity: sha512-3yJ255e4ag3wfZu/DSxeOZK1UtnqNxnspmLaQetGT0pDkThNZoHs+Zg6dgZZ19JEVomXygvfHn9lNpICZuYtEA==} engines: {node: '>=22.12.0'} - '@earendil-works/pi-agent-core@0.75.4': - resolution: {integrity: sha512-cGYbysb4EqUf0B28OeqFq2ppm1XF3bYBOP71q9dv38yf/UJfzMjiXBeNelrcio+QWIoVrW+xzYm7sMzYIUc9Og==} - engines: {node: '>=22.19.0'} - - '@earendil-works/pi-ai@0.75.4': - resolution: {integrity: sha512-m/w8Hh3vQ0rAycwJiJWdzkypkn4295f4eq/966lDRy8aX5sk6bgYXH8TQmL16TO7Uwc7MbJG0QoyFHgX8RqXUQ==} - engines: {node: '>=22.19.0'} - hasBin: true - - '@earendil-works/pi-coding-agent@0.75.4': - resolution: {integrity: sha512-Fb+FRo08b5H9pYKbQJ708/5OKL0+K/yclhfCMEhrBzSPTZZ4c85nY1YsBo4qwL20ohBMlBezHMRuHzcJ1ylEoQ==} - engines: {node: '>=22.19.0'} - hasBin: true - - '@earendil-works/pi-tui@0.75.4': - resolution: {integrity: sha512-PDhKU7u6fmEcvHUFHzrRwGc/Ytokj/hO+X4RPf+MWKEGpvg3B1vHv88Ee+Dy33004tYkQF5YeXV4btJZcp5x1g==} + '@earendil-works/pi-tui@0.78.0': + resolution: {integrity: sha512-3a705FnsVVUhAyceShNB3kS2rpxcxLcx+hqB0u6MMMpHwQGbW+m++MqA6r7eOzq/8FLx5e3vDh38h/SVTk2qzw==} engines: {node: '>=22.19.0'} '@electron/asar@3.4.1': @@ -933,17 +814,8 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@google/genai@1.52.0': - resolution: {integrity: sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@modelcontextprotocol/sdk': ^1.25.2 - peerDependenciesMeta: - '@modelcontextprotocol/sdk': - optional: true - - '@google/genai@2.5.0': - resolution: {integrity: sha512-qDi3LLh9I3llJK0f9uV8kZ8EdT9oHPxGJJ9yOJ/i5YXYrVwRCs8jHo9x4e99uOeKYDvD3TZwT70p/H/LS3BixQ==} + '@google/genai@2.7.0': + resolution: {integrity: sha512-tv0DRtcndt2oEhBYy+5mA0TaXH98+L1Gt0AP9unBfH7DP20KhB7+O3QqAN1Lz+laMARGTHS7BFQSNpLbl4gm1g==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.25.2 @@ -979,8 +851,8 @@ packages: resolution: {integrity: sha512-ncvcXQe4vrqBLNqnVjQjke5NpNin6SO9bStfBZ4jgZk/xIjD9GMcH8vp8XKd7hw5akIzwITMiDMysIKvE5rHBw==} hasBin: true - '@homebridge/ciao@1.3.8': - resolution: {integrity: sha512-lNhpCsZVbdbjz2trFjQdzQ3cUIMZQMIMksi7wd3ntTIYgdaGLqT1Ms97DfVIJYHzRuduf56ISvgU8RRLTpK/ng==} + '@homebridge/ciao@1.3.9': + resolution: {integrity: sha512-TMy9zy173jDOpnFXDqL3BPIQn5lfcAkSsivYQatCCakoHk4fLGd7QjfAaNGYE3Ox+/ZI6Lq0e1gGcz1qdw/IbA==} hasBin: true '@hono/node-server@1.19.13': @@ -1360,76 +1232,8 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} - '@mariozechner/clipboard-darwin-arm64@0.3.6': - resolution: {integrity: sha512-HjaisYCAbHi/1+N1yDAQHc8ZXGffufIUT5NSOSVR3f3AuMDusxTtnbK8tZ7JFDkShua1oNGZoNwQHsc8MPtE0Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@mariozechner/clipboard-darwin-universal@0.3.6': - resolution: {integrity: sha512-8BWtPjOtJOJoykml3w0fx0zRrfWP31mXrJwfoA7xzNprkZw1uolCNfgmjDiVBseoKjp16EGITz7bN+61qn8dWA==} - engines: {node: '>= 10'} - os: [darwin] - - '@mariozechner/clipboard-darwin-x64@0.3.6': - resolution: {integrity: sha512-p9syiZD1kU4I+1ya7f7g+zD1GiUvR8fdlRlNmgsZNWlyjtc8rlV2EjTLd/35x1LsdBq020GVvtzp0ZmPgBI09Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@mariozechner/clipboard-linux-arm64-gnu@0.3.6': - resolution: {integrity: sha512-5JFf5rGofrm+V29HNF+wLthXphHdQpMbKDUYJ5tML6/Z5DLlLOV/9Ak4kDPtYyZ+Dzf+kAusE0VsFg4+tfP1IA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@mariozechner/clipboard-linux-arm64-musl@0.3.6': - resolution: {integrity: sha512-JlVjxxw0GbGC0djXYWRIqyteO3J1KZ/QG3udlEFaOD5TLOM1FnmXXAPDQBqr+aBVr720ef9K00dirYnJ0LDCtw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@mariozechner/clipboard-linux-riscv64-gnu@0.3.6': - resolution: {integrity: sha512-4t8BUi5zZ+L77otFQVnVSlaTyAX4TVk9EqQm4syMrEQp96trFEHEwwNHcNEBGzYv5+K7mxay50TthYkz47OWzQ==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@mariozechner/clipboard-linux-x64-gnu@0.3.6': - resolution: {integrity: sha512-trtPwcNLW37irwQCJLtCxLw757jjJZk3TSnY/MU9bhtWtA3K9b/eLW0e4RGhUXDoFRds9opNWWaUDuFLa8dm0w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@mariozechner/clipboard-linux-x64-musl@0.3.6': - resolution: {integrity: sha512-WfnzIvOCCWQiN0MmltCEo6cLceUDbYe+I7xyFZjaps5A+2Op/M2CY7Rey+C4ucQhrvmpoHmTSFgY9ODWk7snoA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@mariozechner/clipboard-win32-arm64-msvc@0.3.6': - resolution: {integrity: sha512-+8+1aHYsBPUjmW3otmWlg+Hijt0iJvoBBs5e0mxFeUd4gDaKMB8Bn6x7c6KVtscg7E5j5NFXnwQqNSIAO4p8zQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@mariozechner/clipboard-win32-x64-msvc@0.3.6': - resolution: {integrity: sha512-S4xfPmERC8ZkiLHe3vekZCjdDwNEETCuvCgQK2kP6/TnvmUkq1y2Pk+DjM4t8uh9KMX9bH4zs5ePcKa8GTXmfg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@mariozechner/clipboard@0.3.6': - resolution: {integrity: sha512-MXdtr+6+ntlIVHdrZYuZNQydu6o8yZswFJ2Ln81j2O/Y9B/LDHvEaIm95xWNPkjGTWriSOeLnQJRFs6dYb60bg==} - engines: {node: '>= 10'} - - '@mistralai/mistralai@2.2.1': - resolution: {integrity: sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==} + '@mistralai/mistralai@2.2.5': + resolution: {integrity: sha512-ATbWzKkNzNAZ+gtw9MI/c/ULTMG80tKUiRNIbQFfg4OP0uEZZpTfXZeBCNfs5Dq0uqMQ/tQWc4o6RRJQtMrpDA==} '@modelcontextprotocol/sdk@1.29.0': resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} @@ -1632,16 +1436,23 @@ packages: resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} engines: {node: ^18.17.0 || >=20.5.0} - '@openclaw/discord@2026.5.20': - resolution: {integrity: sha512-sQQ5fx5BoMtfqMj6k2wn3z3AwPEzXab5xhedDOiHJWuKZOfXOcIBfkiVl237ASVyopJKdh4LKed5BODmXiR20w==} + '@openclaw/discord@2026.6.5': + resolution: {integrity: sha512-Ww/89ODIdZdWZimNzHWoraJbWOrPIJDB+OfVZcQ5fOnsPNyY1p4RAni72wOOiFVkH+3FwLjniCcxA1eUfDkewA==} peerDependencies: - openclaw: '>=2026.5.20' + openclaw: '>=2026.6.5' peerDependenciesMeta: openclaw: optional: true + bundledDependencies: + - '@discordjs/voice' + - discord-api-types + - libopus-wasm + - typebox + - undici + - ws - '@openclaw/fs-safe@0.2.7': - resolution: {integrity: sha512-l/Yj3K2ChR/gI+bZo1wIe7rjKyTFwGOAw120cTCMRT8LZbVhJhTbiZLGIRBMv0Gc9GQjYE8EjPBza3RdrSSbyQ==} + '@openclaw/fs-safe@0.3.0': + resolution: {integrity: sha512-uIBE441CIt1kIURoP9qRGKZ8LkGyfD9ZzeESjwAd29ZPWtghws/5GR3Pjb67jKdcJHP1I6roNXcvnhzAU7lHlA==} engines: {node: '>=20.11'} '@openclaw/proxyline@0.3.3': @@ -1650,21 +1461,31 @@ packages: peerDependencies: undici: '>=8.3.0 <9' - '@openclaw/qqbot@2026.5.20': - resolution: {integrity: sha512-49UUbzgaacRFgcOAlTranJ2F+6wgRxBwsaUURdgoedgP28V5rbcaNCMBT8fsZpeHO7/w9fyoazR31c1heIC8hA==} + '@openclaw/qqbot@2026.6.5': + resolution: {integrity: sha512-vY/AbrWD271ReS/oXck2HeuCOB2W5NcgrVU5CJAo+BSp+tzqDZDMsCe/GIc/lwDOjWQg1Ez7+KGwfrlCmn4tjA==} peerDependencies: - openclaw: '>=2026.5.20' + openclaw: '>=2026.6.5' peerDependenciesMeta: openclaw: optional: true + bundledDependencies: + - '@tencent-connect/qqbot-connector' + - mpg123-decoder + - silk-wasm + - ws + - zod - '@openclaw/whatsapp@2026.5.20': - resolution: {integrity: sha512-pDtwNa0X+8VH+bqQrC771K5mjB7XNryJ+M7PHnHtLaYbLrUH+5Pe+7y4+Tv5IxskdT8cqz2xsWZeerhAXUdvIQ==} + '@openclaw/whatsapp@2026.6.5': + resolution: {integrity: sha512-YS/JK5By8AeFQDa6AfqdZk7OzPPWF6AoTV0K6zOdwKsQ7BAFTMTRKaHaniBLttVR3sDe5haLqBdJAvg3jrfBoQ==} peerDependencies: - openclaw: '>=2026.5.20' + openclaw: '>=2026.6.5' peerDependenciesMeta: openclaw: optional: true + bundledDependencies: + - audio-decode + - baileys + - typebox '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -2326,58 +2147,6 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@smithy/core@3.24.2': - resolution: {integrity: sha512-IKS7qX59fAGCYBmt5JChcDswQDupZqT2Yn2ZBA3UgTlsjRNNkQzZobbn95xoAAdtTyJmBiJB3Y02qR3rgy3Zog==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.24.6': - resolution: {integrity: sha512-wBXDRup6UU97VKyaiRo8AssnfStPtG0oAAfpq/bC0a1YYau8pM86YB4kM6ccoVi1mS8l/UHbn9oDM+7uozr/ug==} - engines: {node: '>=18.0.0'} - - '@smithy/credential-provider-imds@4.3.7': - resolution: {integrity: sha512-xj8gq/bjFABAh6qWPSDCYcY3kzQIm4b561C+YnHH4zGq8rOgzQ3Shk+JGlpUxSd41UGiO6FkLdUCtNX1FAeHgg==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.4.2': - resolution: {integrity: sha512-3wF40g8OOCA5BnwQUvwtzZqYBbWWftDjpAlWIUo6Yld3ZzJaMAKqg7MWQBPjE8oLaqvZQUE7tVGlZPsae6A4bQ==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.4.6': - resolution: {integrity: sha512-FEwEYJ1jlBKdhe9TPzfghEi1bP55ZeEImlDkEa62bBBYzUcnB6RUCyuiS2mqKt6ZVjUbBgcNhzfIctH+Hevx9g==} - engines: {node: '>=18.0.0'} - - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} - - '@smithy/node-http-handler@4.7.2': - resolution: {integrity: sha512-EdksTZ8UXYxGUgQ4mpIKrHoaj9WVGsp66TpZuixLAz1Jex8YDLnS4RH9ktGED5aOpN0OJlEtrsC9IGt76go1eA==} - engines: {node: '>=18.0.0'} - - '@smithy/node-http-handler@4.7.6': - resolution: {integrity: sha512-3fya8i7GrJilQouk4cZJKdy5k8MWQBpjfXrRNaXDedH8r779tr0jcxyH3+yoTmsluc2+vF4S343yFbnvu8ExDQ==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.4.6': - resolution: {integrity: sha512-Ojg4B6oIDlIr1R86xCDJt1zJWnYa0VINmqdjfe9qxWjdRivHalZ3iSlQgVqYbW0MdpFOC5XfHEWsnbmdnpIILQ==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.14.1': - resolution: {integrity: sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.14.3': - resolution: {integrity: sha512-YupL0ZWmFtJexUN2cHzkvvF/b9pKrtAIfT1o7/oY/Ppu8IYeZ+lDPM5vZdQJaSeA132dJCqojjGC9NhXeF71VQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} - '@snazzah/davey-android-arm-eabi@0.1.11': resolution: {integrity: sha512-T1RYbNYKN6tLOcGIDKJd8OI6FBSEemwL7DOYdTMmhqfhhMr3YVN8WOhfoxGg63OcnpTN2e2c5tdY2bAx25RmQQ==} engines: {node: '>= 10'} @@ -2477,6 +2246,9 @@ packages: openclaw: optional: true + '@stablelib/base64@1.0.1': + resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -2984,22 +2756,6 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - baileys@7.0.0-rc12: - resolution: {integrity: sha512-kttfToIBUKJb5hn57GspFbtlGaOp8wwhij7F8JRtduIL6vIODL5ze7XnsQKT73QwgFOGdJYXAT01x6rz9NNijg==} - engines: {node: '>=20.0.0'} - peerDependencies: - audio-decode: ^2.1.3 - jimp: ^1.6.1 - link-preview-js: ^3.0.0 - sharp: '*' - peerDependenciesMeta: - audio-decode: - optional: true - jimp: - optional: true - link-preview-js: - optional: true - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3092,9 +2848,6 @@ packages: bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - bowser@2.14.1: - resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -3235,6 +2988,11 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clawpdf@0.3.0: + resolution: {integrity: sha512-41+3AnKk9yek2sm+/9XvUlDTN8Wi+ag7fmxZuqw+ySn4lqaf/fCgLeamqPLiXY4gVbizKEHGoTG/JrIIFNE2rw==} + engines: {node: '>=20'} + hasBin: true + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -3482,10 +3240,6 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff@8.0.4: - resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} - engines: {node: '>=0.3.1'} - diff@9.0.0: resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} @@ -3819,6 +3573,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-sha256@1.3.0: + resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + fast-string-truncated-width@1.2.1: resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} @@ -4166,8 +3923,9 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} hono@4.12.12: resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} @@ -4179,14 +3937,14 @@ packages: hookified@2.1.0: resolution: {integrity: sha512-ootKng4eaxNxa7rx6FJv2YKef3DuhqbEj3l70oGXwddPQEEnISm50TEZQclqiLTAtilT2nu7TErtCO523hHkyg==} + hosted-git-info@10.1.1: + resolution: {integrity: sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} - hosted-git-info@9.0.3: - resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} - engines: {node: ^20.17.0 || >=22.9.0} - html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -4299,10 +4057,6 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.4.0: - resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} - engines: {node: '>= 10'} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -4477,9 +4231,6 @@ packages: keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - koffi@2.16.2: - resolution: {integrity: sha512-owU0MRwv6xkrVqCd+33uw6BaYppkTRXbO/rVdJNI2dvZG0gzyRhYwW25eWtc5pauwK8TGh3AbkFONSezdykfSA==} - kysely@0.29.2: resolution: {integrity: sha512-s6WVJyEZrbm6jhBpiKHsGHyePMrVQKJ85wZCFCr9W4QHv6WTjWIrdvTmO9hDEA3bNK0xkrE2DqrHsXMLWuZpQg==} engines: {node: '>=22.0.0'} @@ -4491,9 +4242,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libsignal@6.0.0: - resolution: {integrity: sha512-d/5V3YFtDljbFMufz4ncyUYGYhJl+vzAe+c2EFFBQ6bz1h8Q3IOMEGXYMzlibU60I+e8GagMMpji18iez3P1hA==} - libsignal@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/bcea72df9ec34d9d9140ab30619cf479c7c144c7: resolution: {gitHosted: true, tarball: https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/bcea72df9ec34d9d9140ab30619cf479c7c144c7} version: 6.0.0 @@ -4517,9 +4265,6 @@ packages: canvas: optional: true - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -4599,10 +4344,6 @@ packages: engines: {node: '>=12.0.0'} hasBin: true - markdown-it@14.1.1: - resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} - hasBin: true - markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -4678,9 +4419,6 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -5052,8 +4790,8 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - openai@6.26.0: - resolution: {integrity: sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==} + openai@6.39.1: + resolution: {integrity: sha512-z3dO9fEWOXBzlXynVb/xZ/tujzUjFWQWn3C0n0mw6Vo0zJTbEkaN4b2cLWjhJ6haJQx8LlREoafHRl+Gu/Hl+A==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -5064,20 +4802,8 @@ packages: zod: optional: true - openai@6.38.0: - resolution: {integrity: sha512-AoMplt2UalrpgUDMh3L09QWjNRlgJPipclQvA6sYAaeF6nHNBMgmikAZGmcYLn8on4d9sQY9Q8bOLfrBS7Lc8g==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - - openclaw@2026.5.20: - resolution: {integrity: sha512-cgshS76CxS3Vp9NGtJR2UGtVZxVR5/4rvok8DKGGL19DugAftNabsXfYajyAEiJ3dC8QTXNqF62MdQNzUnQe8Q==} + openclaw@2026.6.5: + resolution: {integrity: sha512-sRgF0TexfRcJX8Eg0lcL6Jj0YdZbSxUbbp8EbG+qo3v6TtVayE6tKPEs3oCKD7YfYe2C/8Qg26HUxTnycd44ZQ==} engines: {node: '>=22.19.0'} hasBin: true @@ -5427,10 +5153,6 @@ packages: pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -5465,13 +5187,17 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - quickjs-wasi@2.2.0: - resolution: {integrity: sha512-zQxXmQMrEoD3S+jQdYsloq4qAuaxKFHZj6hHqOYGwB2iQZH+q9e/lf5zQPXCKOk0WJuAjzRFbO4KwHIp2D05Iw==} + quickjs-wasi@3.0.0: + resolution: {integrity: sha512-X7ouKC4ZVf9bXQ8rsE7+L6TeBbesejAJH61x16xRaGAQGfBHHRcniWgzJZZVtHc8rS9yVsY+Tvk8/usAosg4bg==} range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + rastermill@0.3.1: + resolution: {integrity: sha512-CX4nij6+ZLHYIaojJNfLTr7W+AiH/IPJi6E9Aw1br2///1KZL2KBOHd68rkcLedc47MPvb4hhH+fzYeGFa4A/Q==} + engines: {node: '>=22'} + raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} @@ -5894,6 +5620,9 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + standardwebhooks@1.0.0: + resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + stat-mode@1.0.0: resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} engines: {node: '>= 6'} @@ -6084,11 +5813,6 @@ packages: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} - tokenjuice@0.7.1: - resolution: {integrity: sha512-eO048hm9UcGHASjYkIWEij8QN68amGp+S1nJyo685qB1/ol+VGEYjPglcVPvCbJbZyFHvI+BBAMvOfnqYCtpsQ==} - engines: {node: '>=20'} - hasBin: true - tough-cookie@6.0.1: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} @@ -6157,8 +5881,8 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - typebox@1.1.38: - resolution: {integrity: sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==} + typebox@1.1.39: + resolution: {integrity: sha512-vj0afVtOfLQvv0GR0VxVagYxsXN64btL7Z9XoaG0ZggH3mruMMkOO6hXdgMsjCY3shZgEvooAWVeznQVs5c43w==} typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} @@ -6170,9 +5894,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - uhyphen@0.2.0: resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} @@ -6435,9 +6156,6 @@ packages: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} - whatsapp-rust-bridge@0.5.4: - resolution: {integrity: sha512-yYO1qSs0Fe7tGtnxOFHomocUD6IZtoAgmA4oDFyGIRZ67D3QZk3w7swA6XXFXNQngiyrg2k7tul6IrM3eUFh7A==} - whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} @@ -6524,6 +6242,18 @@ packages: utf-8-validate: optional: true + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xlsx@0.18.5: resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} engines: {node: '>=0.8'} @@ -6668,9 +6398,10 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@anthropic-ai/sdk@0.91.1(zod@4.4.3)': + '@anthropic-ai/sdk@0.100.1(zod@4.4.3)': dependencies: json-schema-to-ts: 3.1.1 + standardwebhooks: 1.0.0 optionalDependencies: zod: 4.4.3 @@ -6692,234 +6423,6 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.8 - tslib: 2.8.1 - - '@aws-crypto/sha256-browser@5.2.0': - dependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-locate-window': 3.965.5 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-crypto/sha256-js@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.8 - tslib: 2.8.1 - - '@aws-crypto/supports-web-crypto@5.2.0': - dependencies: - tslib: 2.8.1 - - '@aws-crypto/util@5.2.0': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-sdk/client-bedrock-runtime@3.1048.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.15 - '@aws-sdk/credential-provider-node': 3.972.48 - '@aws-sdk/eventstream-handler-node': 3.972.18 - '@aws-sdk/middleware-eventstream': 3.972.14 - '@aws-sdk/middleware-websocket': 3.972.23 - '@aws-sdk/token-providers': 3.1048.0 - '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/fetch-http-handler': 5.4.2 - '@smithy/node-http-handler': 4.7.2 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/core@3.974.15': - dependencies: - '@aws-sdk/types': 3.973.9 - '@aws-sdk/xml-builder': 3.972.26 - '@aws/lambda-invoke-store': 0.2.4 - '@smithy/core': 3.24.6 - '@smithy/signature-v4': 5.4.6 - '@smithy/types': 4.14.3 - bowser: 2.14.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.972.41': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.972.43': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/fetch-http-handler': 5.4.6 - '@smithy/node-http-handler': 4.7.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.972.46': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/credential-provider-env': 3.972.41 - '@aws-sdk/credential-provider-http': 3.972.43 - '@aws-sdk/credential-provider-login': 3.972.45 - '@aws-sdk/credential-provider-process': 3.972.41 - '@aws-sdk/credential-provider-sso': 3.972.45 - '@aws-sdk/credential-provider-web-identity': 3.972.45 - '@aws-sdk/nested-clients': 3.997.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/credential-provider-imds': 4.3.7 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-login@3.972.45': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/nested-clients': 3.997.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-node@3.972.48': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.41 - '@aws-sdk/credential-provider-http': 3.972.43 - '@aws-sdk/credential-provider-ini': 3.972.46 - '@aws-sdk/credential-provider-process': 3.972.41 - '@aws-sdk/credential-provider-sso': 3.972.45 - '@aws-sdk/credential-provider-web-identity': 3.972.45 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/credential-provider-imds': 4.3.7 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-process@3.972.41': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.972.45': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/nested-clients': 3.997.13 - '@aws-sdk/token-providers': 3.1056.0 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-web-identity@3.972.45': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/nested-clients': 3.997.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/eventstream-handler-node@3.972.18': - dependencies: - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/middleware-eventstream@3.972.14': - dependencies: - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/middleware-websocket@3.972.23': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/fetch-http-handler': 5.4.6 - '@smithy/signature-v4': 5.4.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/nested-clients@3.997.13': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.15 - '@aws-sdk/signature-v4-multi-region': 3.996.30 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/fetch-http-handler': 5.4.6 - '@smithy/node-http-handler': 4.7.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/signature-v4-multi-region@3.996.30': - dependencies: - '@aws-sdk/types': 3.973.9 - '@smithy/signature-v4': 5.4.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.1048.0': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/nested-clients': 3.997.13 - '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.1056.0': - dependencies: - '@aws-sdk/core': 3.974.15 - '@aws-sdk/nested-clients': 3.997.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/types@3.973.8': - dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/types@3.973.9': - dependencies: - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@aws-sdk/util-locate-window@3.965.5': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.972.26': - dependencies: - '@smithy/types': 4.14.3 - fast-xml-parser: 5.7.3 - tslib: 2.8.1 - - '@aws/lambda-invoke-store@0.2.4': {} - '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -7152,74 +6655,10 @@ snapshots: - opusscript - utf-8-validate - '@earendil-works/pi-agent-core@0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3)': - dependencies: - '@earendil-works/pi-ai': 0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3) - ignore: 7.0.5 - typebox: 1.1.38 - yaml: 2.9.0 - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@earendil-works/pi-ai@0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3)': - dependencies: - '@anthropic-ai/sdk': 0.91.1(zod@4.4.3) - '@aws-sdk/client-bedrock-runtime': 3.1048.0 - '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) - '@mistralai/mistralai': 2.2.1 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - openai: 6.26.0(ws@8.20.1)(zod@4.4.3) - partial-json: 0.1.7 - typebox: 1.1.38 - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@earendil-works/pi-coding-agent@0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3)': - dependencies: - '@earendil-works/pi-agent-core': 0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3) - '@earendil-works/pi-ai': 0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3) - '@earendil-works/pi-tui': 0.75.4 - '@silvia-odwyer/photon-node': 0.3.4 - chalk: 5.6.2 - cross-spawn: 7.0.6 - diff: 8.0.4 - glob: 13.0.6 - highlight.js: 10.7.3 - hosted-git-info: 9.0.3 - ignore: 7.0.5 - jiti: 2.7.0 - minimatch: 10.2.5 - proper-lockfile: 4.1.2 - typebox: 1.1.38 - undici: 8.3.0 - yaml: 2.9.0 - optionalDependencies: - '@mariozechner/clipboard': 0.3.6 - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@earendil-works/pi-tui@0.75.4': + '@earendil-works/pi-tui@0.78.0': dependencies: get-east-asian-width: 1.6.0 marked: 15.0.12 - optionalDependencies: - koffi: 2.16.2 '@electron/asar@3.4.1': dependencies: @@ -7293,7 +6732,7 @@ snapshots: ora: 5.4.1 read-binary-file-arch: 1.0.6 semver: 7.7.4 - tar: 7.5.13 + tar: 7.5.15 yargs: 17.7.2 transitivePeerDependencies: - supports-color @@ -7472,25 +6911,12 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))': + '@google/genai@2.7.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))': dependencies: google-auth-library: 10.6.2 p-retry: 4.6.2 protobufjs: 7.5.8 - ws: 8.20.1 - optionalDependencies: - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@google/genai@2.5.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))': - dependencies: - google-auth-library: 10.6.2 - p-retry: 4.6.2 - protobufjs: 7.5.8 - ws: 8.20.1 + ws: 8.21.0 optionalDependencies: '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) transitivePeerDependencies: @@ -7537,7 +6963,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@homebridge/ciao@1.3.8': + '@homebridge/ciao@1.3.9': dependencies: debug: 4.4.3 fast-deep-equal: 3.1.3 @@ -7681,6 +7107,7 @@ snapshots: mime: 3.0.0 transitivePeerDependencies: - supports-color + optional: true '@jimp/diff@1.6.1': dependencies: @@ -7690,8 +7117,10 @@ snapshots: pixelmatch: 5.3.0 transitivePeerDependencies: - supports-color + optional: true - '@jimp/file-ops@1.6.1': {} + '@jimp/file-ops@1.6.1': + optional: true '@jimp/js-bmp@1.6.1': dependencies: @@ -7701,6 +7130,7 @@ snapshots: bmp-ts: 1.0.9 transitivePeerDependencies: - supports-color + optional: true '@jimp/js-gif@1.6.1': dependencies: @@ -7710,6 +7140,7 @@ snapshots: omggif: 1.0.10 transitivePeerDependencies: - supports-color + optional: true '@jimp/js-jpeg@1.6.1': dependencies: @@ -7718,6 +7149,7 @@ snapshots: jpeg-js: 0.4.4 transitivePeerDependencies: - supports-color + optional: true '@jimp/js-png@1.6.1': dependencies: @@ -7726,6 +7158,7 @@ snapshots: pngjs: 7.0.0 transitivePeerDependencies: - supports-color + optional: true '@jimp/js-tiff@1.6.1': dependencies: @@ -7734,12 +7167,14 @@ snapshots: utif2: 4.1.0 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-blit@1.6.1': dependencies: '@jimp/types': 1.6.1 '@jimp/utils': 1.6.1 zod: 3.25.76 + optional: true '@jimp/plugin-blur@1.6.1': dependencies: @@ -7747,11 +7182,13 @@ snapshots: '@jimp/utils': 1.6.1 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-circle@1.6.1': dependencies: '@jimp/types': 1.6.1 zod: 3.25.76 + optional: true '@jimp/plugin-color@1.6.1': dependencies: @@ -7762,6 +7199,7 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-contain@1.6.1': dependencies: @@ -7773,6 +7211,7 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-cover@1.6.1': dependencies: @@ -7783,6 +7222,7 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-crop@1.6.1': dependencies: @@ -7792,27 +7232,32 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-displace@1.6.1': dependencies: '@jimp/types': 1.6.1 '@jimp/utils': 1.6.1 zod: 3.25.76 + optional: true '@jimp/plugin-dither@1.6.1': dependencies: '@jimp/types': 1.6.1 + optional: true '@jimp/plugin-fisheye@1.6.1': dependencies: '@jimp/types': 1.6.1 '@jimp/utils': 1.6.1 zod: 3.25.76 + optional: true '@jimp/plugin-flip@1.6.1': dependencies: '@jimp/types': 1.6.1 zod: 3.25.76 + optional: true '@jimp/plugin-hash@1.6.1': dependencies: @@ -7828,11 +7273,13 @@ snapshots: any-base: 1.1.0 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-mask@1.6.1': dependencies: '@jimp/types': 1.6.1 zod: 3.25.76 + optional: true '@jimp/plugin-print@1.6.1': dependencies: @@ -7848,11 +7295,13 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-quantize@1.6.1': dependencies: image-q: 4.0.0 zod: 3.25.76 + optional: true '@jimp/plugin-resize@1.6.1': dependencies: @@ -7861,6 +7310,7 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-rotate@1.6.1': dependencies: @@ -7872,6 +7322,7 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color + optional: true '@jimp/plugin-threshold@1.6.1': dependencies: @@ -7883,15 +7334,18 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color + optional: true '@jimp/types@1.6.1': dependencies: zod: 3.25.76 + optional: true '@jimp/utils@1.6.1': dependencies: '@jimp/types': 1.6.1 tinycolor2: 1.6.0 + optional: true '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -7920,7 +7374,7 @@ snapshots: '@keyv/serialize@1.1.1': {} - '@larksuite/openclaw-lark@2026.5.20(openclaw@2026.5.20(encoding@0.1.13))': + '@larksuite/openclaw-lark@2026.5.20(openclaw@2026.6.5(encoding@0.1.13))': dependencies: '@larksuiteoapi/node-sdk': 1.66.1 '@sinclair/typebox': 0.34.49 @@ -7928,7 +7382,7 @@ snapshots: undici-types: 8.3.0 zod: 4.4.3 optionalDependencies: - openclaw: 2026.5.20(encoding@0.1.13) + openclaw: 2026.6.5(encoding@0.1.13) transitivePeerDependencies: - bufferutil - debug @@ -8002,53 +7456,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@mariozechner/clipboard-darwin-arm64@0.3.6': - optional: true - - '@mariozechner/clipboard-darwin-universal@0.3.6': - optional: true - - '@mariozechner/clipboard-darwin-x64@0.3.6': - optional: true - - '@mariozechner/clipboard-linux-arm64-gnu@0.3.6': - optional: true - - '@mariozechner/clipboard-linux-arm64-musl@0.3.6': - optional: true - - '@mariozechner/clipboard-linux-riscv64-gnu@0.3.6': - optional: true - - '@mariozechner/clipboard-linux-x64-gnu@0.3.6': - optional: true - - '@mariozechner/clipboard-linux-x64-musl@0.3.6': - optional: true - - '@mariozechner/clipboard-win32-arm64-msvc@0.3.6': - optional: true - - '@mariozechner/clipboard-win32-x64-msvc@0.3.6': - optional: true - - '@mariozechner/clipboard@0.3.6': - optionalDependencies: - '@mariozechner/clipboard-darwin-arm64': 0.3.6 - '@mariozechner/clipboard-darwin-universal': 0.3.6 - '@mariozechner/clipboard-darwin-x64': 0.3.6 - '@mariozechner/clipboard-linux-arm64-gnu': 0.3.6 - '@mariozechner/clipboard-linux-arm64-musl': 0.3.6 - '@mariozechner/clipboard-linux-riscv64-gnu': 0.3.6 - '@mariozechner/clipboard-linux-x64-gnu': 0.3.6 - '@mariozechner/clipboard-linux-x64-musl': 0.3.6 - '@mariozechner/clipboard-win32-arm64-msvc': 0.3.6 - '@mariozechner/clipboard-win32-x64-msvc': 0.3.6 - optional: true - - '@mistralai/mistralai@2.2.1': + '@mistralai/mistralai@2.2.5': dependencies: - ws: 8.20.1 + ws: 8.21.0 zod: 4.4.3 zod-to-json-schema: 3.25.1(zod@4.4.3) transitivePeerDependencies: @@ -8219,28 +7629,11 @@ snapshots: dependencies: semver: 7.7.4 - '@openclaw/discord@2026.5.20(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1)(openclaw@2026.5.20(encoding@0.1.13))': - dependencies: - '@discordjs/voice': 0.19.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1)(opusscript@0.1.1) - discord-api-types: 0.38.47 - https-proxy-agent: 9.0.0 - opusscript: 0.1.1 - typebox: 1.1.38 - undici: 8.3.0 - ws: 8.20.1 + '@openclaw/discord@2026.6.5(openclaw@2026.6.5(encoding@0.1.13))': optionalDependencies: - openclaw: 2026.5.20(encoding@0.1.13) - transitivePeerDependencies: - - '@discordjs/opus' - - '@emnapi/core' - - '@emnapi/runtime' - - bufferutil - - ffmpeg-static - - node-opus - - supports-color - - utf-8-validate + openclaw: 2026.6.5(encoding@0.1.13) - '@openclaw/fs-safe@0.2.7': + '@openclaw/fs-safe@0.3.0': optionalDependencies: jszip: 3.10.1 tar: 7.5.13 @@ -8249,34 +7642,13 @@ snapshots: dependencies: undici: 8.3.0 - '@openclaw/qqbot@2026.5.20(openclaw@2026.5.20(encoding@0.1.13))': - dependencies: - '@tencent-connect/qqbot-connector': 1.1.0 - mpg123-decoder: 1.0.3 - silk-wasm: 3.7.1 - ws: 8.20.1 - zod: 4.4.3 + '@openclaw/qqbot@2026.6.5(openclaw@2026.6.5(encoding@0.1.13))': optionalDependencies: - openclaw: 2026.5.20(encoding@0.1.13) - transitivePeerDependencies: - - bufferutil - - utf-8-validate + openclaw: 2026.6.5(encoding@0.1.13) - '@openclaw/whatsapp@2026.5.20(openclaw@2026.5.20(encoding@0.1.13))(sharp@0.34.5)': - dependencies: - audio-decode: 2.2.3 - baileys: 7.0.0-rc12(audio-decode@2.2.3)(jimp@1.6.1)(sharp@0.34.5) - https-proxy-agent: 9.0.0 - jimp: 1.6.1 - typebox: 1.1.38 + '@openclaw/whatsapp@2026.6.5(openclaw@2026.6.5(encoding@0.1.13))': optionalDependencies: - openclaw: 2026.5.20(encoding@0.1.13) - transitivePeerDependencies: - - bufferutil - - link-preview-js - - sharp - - supports-color - - utf-8-validate + openclaw: 2026.6.5(encoding@0.1.13) '@pinojs/redact@0.4.0': {} @@ -8852,76 +8224,6 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@smithy/core@3.24.2': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/core@3.24.6': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@smithy/credential-provider-imds@4.3.7': - dependencies: - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@smithy/fetch-http-handler@5.4.2': - dependencies: - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/fetch-http-handler@5.4.6': - dependencies: - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@smithy/is-array-buffer@2.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/node-http-handler@4.7.2': - dependencies: - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.7.6': - dependencies: - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@smithy/signature-v4@5.4.6': - dependencies: - '@smithy/core': 3.24.6 - '@smithy/types': 4.14.3 - tslib: 2.8.1 - - '@smithy/types@4.14.1': - dependencies: - tslib: 2.8.1 - - '@smithy/types@4.14.3': - dependencies: - tslib: 2.8.1 - - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-utf8@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 - '@snazzah/davey-android-arm-eabi@0.1.11': optional: true @@ -8989,7 +8291,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - '@soimy/dingtalk@3.6.4(openclaw@2026.5.20(encoding@0.1.13))': + '@soimy/dingtalk@3.6.4(openclaw@2026.6.5(encoding@0.1.13))': dependencies: axios: 1.13.6(debug@4.4.3) dingtalk-stream: 2.1.5 @@ -8998,13 +8300,15 @@ snapshots: pdf-parse: 2.4.5 zod: 4.4.3 optionalDependencies: - openclaw: 2026.5.20(encoding@0.1.13) + openclaw: 2026.6.5(encoding@0.1.13) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate + '@stablelib/base64@1.0.1': {} + '@standard-schema/spec@1.1.0': {} '@szmarczak/http-timer@4.0.6': @@ -9015,9 +8319,9 @@ snapshots: dependencies: qrcode-terminal: 0.12.0 - '@tencent-weixin/openclaw-weixin@2.4.3(openclaw@2026.5.20(encoding@0.1.13))': + '@tencent-weixin/openclaw-weixin@2.4.3(openclaw@2026.6.5(encoding@0.1.13))': dependencies: - openclaw: 2026.5.20(encoding@0.1.13) + openclaw: 2026.6.5(encoding@0.1.13) qrcode-terminal: 0.12.0 zod: 4.3.6 @@ -9054,8 +8358,10 @@ snapshots: '@thi.ng/bitstream@2.4.49': dependencies: '@thi.ng/errors': 2.6.11 + optional: true - '@thi.ng/errors@2.6.11': {} + '@thi.ng/errors@2.6.11': + optional: true '@tokenizer/inflate@0.4.1': dependencies: @@ -9153,7 +8459,8 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@16.9.1': {} + '@types/node@16.9.1': + optional: true '@types/node@24.12.0': dependencies: @@ -9361,15 +8668,18 @@ snapshots: dependencies: '@wasm-audio-decoders/common': 9.0.7 codec-parser: 2.5.0 + optional: true '@wasm-audio-decoders/ogg-vorbis@0.1.20': dependencies: '@wasm-audio-decoders/common': 9.0.7 codec-parser: 2.5.0 + optional: true '@wasm-audio-decoders/opus-ml@0.0.2': dependencies: '@wasm-audio-decoders/common': 9.0.7 + optional: true '@wecom/aibot-node-sdk@1.0.6': dependencies: @@ -9381,7 +8691,7 @@ snapshots: - debug - utf-8-validate - '@wecom/wecom-openclaw-plugin@2026.5.14(openclaw@2026.5.20(encoding@0.1.13))': + '@wecom/wecom-openclaw-plugin@2026.5.14(openclaw@2026.6.5(encoding@0.1.13))': dependencies: '@wecom/aibot-node-sdk': 1.0.6 fast-xml-parser: 5.7.3 @@ -9389,7 +8699,7 @@ snapshots: undici: 7.24.6 zod: 4.4.3 optionalDependencies: - openclaw: 2026.5.20(encoding@0.1.13) + openclaw: 2026.6.5(encoding@0.1.13) transitivePeerDependencies: - bufferutil - debug @@ -9499,7 +8809,8 @@ snapshots: ansi-styles@6.2.3: {} - any-base@1.1.0: {} + any-base@1.1.0: + optional: true any-promise@1.3.0: {} @@ -9605,7 +8916,8 @@ snapshots: stubborn-fs: 2.0.0 when-exit: 2.1.5 - audio-buffer@5.0.0: {} + audio-buffer@5.0.0: + optional: true audio-decode@2.2.3: dependencies: @@ -9617,8 +8929,10 @@ snapshots: node-wav: 0.0.2 ogg-opus-decoder: 1.7.3 qoa-format: 1.0.1 + optional: true - audio-type@2.4.1: {} + audio-type@2.4.1: + optional: true autoprefixer@10.4.27(postcss@8.5.8): dependencies: @@ -9629,7 +8943,8 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 - await-to-js@3.0.0: {} + await-to-js@3.0.0: + optional: true axios@1.13.6(debug@4.4.3): dependencies: @@ -9643,28 +8958,6 @@ snapshots: bail@2.0.2: {} - baileys@7.0.0-rc12(audio-decode@2.2.3)(jimp@1.6.1)(sharp@0.34.5): - dependencies: - '@cacheable/node-cache': 1.7.6 - '@hapi/boom': 9.1.4 - async-mutex: 0.5.0 - libsignal: 6.0.0 - lru-cache: 11.2.7 - music-metadata: 11.12.3 - p-queue: 9.1.0 - pino: 9.14.0 - protobufjs: 7.5.8 - sharp: 0.34.5 - whatsapp-rust-bridge: 0.5.4 - ws: 8.20.1 - optionalDependencies: - audio-decode: 2.2.3 - jimp: 1.6.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -9721,7 +9014,8 @@ snapshots: bluebird@3.4.7: {} - bmp-ts@1.0.9: {} + bmp-ts@1.0.9: + optional: true bn.js@4.12.3: {} @@ -9746,8 +9040,6 @@ snapshots: bottleneck@2.19.5: {} - bowser@2.14.1: {} - brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -9924,6 +9216,8 @@ snapshots: dependencies: clsx: 2.1.1 + clawpdf@0.3.0: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -9956,7 +9250,8 @@ snapshots: clsx@2.1.1: {} - codec-parser@2.5.0: {} + codec-parser@2.5.0: + optional: true codepage@1.15.0: {} @@ -10141,8 +9436,6 @@ snapshots: didyoumean@1.2.2: {} - diff@8.0.4: {} - diff@9.0.0: {} dijkstrajs@1.0.3: {} @@ -10522,7 +9815,8 @@ snapshots: dependencies: eventsource-parser: 3.0.6 - exif-parser@0.1.12: {} + exif-parser@0.1.12: + optional: true expect-type@1.3.0: {} @@ -10597,6 +9891,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-sha256@1.3.0: {} + fast-string-truncated-width@1.2.1: {} fast-string-truncated-width@3.0.3: {} @@ -10853,6 +10149,7 @@ snapshots: dependencies: image-q: 4.0.0 omggif: 1.0.10 + optional: true glob-parent@5.1.2: dependencies: @@ -11062,7 +10359,7 @@ snapshots: dependencies: hermes-estree: 0.25.1 - highlight.js@10.7.3: {} + highlight.js@11.11.1: {} hono@4.12.12: {} @@ -11070,14 +10367,14 @@ snapshots: hookified@2.1.0: {} + hosted-git-info@10.1.1: + dependencies: + lru-cache: 11.2.7 + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - hosted-git-info@9.0.3: - dependencies: - lru-cache: 11.2.7 - html-encoding-sniffer@6.0.0(@noble/hashes@2.0.1): dependencies: '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) @@ -11166,6 +10463,7 @@ snapshots: image-q@4.0.0: dependencies: '@types/node': 16.9.1 + optional: true image-size@2.0.2: {} @@ -11188,8 +10486,6 @@ snapshots: ipaddr.js@1.9.1: {} - ipaddr.js@2.4.0: {} - is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -11280,6 +10576,7 @@ snapshots: '@jimp/utils': 1.6.1 transitivePeerDependencies: - supports-color + optional: true jiti@1.21.7: {} @@ -11289,7 +10586,8 @@ snapshots: jose@6.2.2: {} - jpeg-js@0.4.4: {} + jpeg-js@0.4.4: + optional: true js-tokens@4.0.0: {} @@ -11390,9 +10688,6 @@ snapshots: dependencies: '@keyv/serialize': 1.1.1 - koffi@2.16.2: - optional: true - kysely@0.29.2: {} lazy-val@1.0.5: {} @@ -11402,11 +10697,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libsignal@6.0.0: - dependencies: - curve25519-js: 0.0.4 - protobufjs: 7.5.8 - libsignal@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/bcea72df9ec34d9d9140ab30619cf479c7c144c7: dependencies: curve25519-js: 0.0.4 @@ -11428,10 +10718,6 @@ snapshots: htmlparser2: 10.1.0 uhyphen: 0.2.0 - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -11520,15 +10806,6 @@ snapshots: underscore: 1.13.8 xmlbuilder: 10.1.1 - markdown-it@14.1.1: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - markdown-table@3.0.4: {} marked@14.0.0: {} @@ -11720,8 +10997,6 @@ snapshots: mdn-data@2.27.1: {} - mdurl@2.0.0: {} - media-typer@1.1.0: {} merge-descriptors@2.0.0: {} @@ -11955,7 +11230,8 @@ snapshots: mime@2.6.0: {} - mime@3.0.0: {} + mime@3.0.0: + optional: true mimic-fn@2.1.0: {} @@ -12100,7 +11376,7 @@ snapshots: node-edge-tts@1.2.10: dependencies: https-proxy-agent: 7.0.6 - ws: 8.20.1 + ws: 8.21.0 yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -12140,7 +11416,8 @@ snapshots: node-releases@2.0.36: {} - node-wav@0.0.2: {} + node-wav@0.0.2: + optional: true nopt@8.1.0: dependencies: @@ -12171,8 +11448,10 @@ snapshots: '@wasm-audio-decoders/opus-ml': 0.0.2 codec-parser: 2.5.0 opus-decoder: 0.7.11 + optional: true - omggif@1.0.10: {} + omggif@1.0.10: + optional: true on-exit-leak-free@2.1.2: {} @@ -12188,70 +11467,69 @@ snapshots: dependencies: mimic-fn: 2.1.0 - openai@6.26.0(ws@8.20.1)(zod@4.4.3): + openai@6.39.1(ws@8.21.0)(zod@4.4.3): optionalDependencies: - ws: 8.20.1 + ws: 8.21.0 zod: 4.4.3 - openai@6.38.0(ws@8.20.1)(zod@4.4.3): - optionalDependencies: - ws: 8.20.1 - zod: 4.4.3 - - openclaw@2026.5.20(encoding@0.1.13): + openclaw@2026.6.5(encoding@0.1.13): dependencies: '@agentclientprotocol/sdk': 0.22.1(zod@4.4.3) + '@anthropic-ai/sdk': 0.100.1(zod@4.4.3) '@clack/core': 1.3.1 '@clack/prompts': 1.4.0 - '@earendil-works/pi-agent-core': 0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3) - '@earendil-works/pi-ai': 0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3) - '@earendil-works/pi-coding-agent': 0.75.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(ws@8.20.1)(zod@4.4.3) - '@earendil-works/pi-tui': 0.75.4 - '@google/genai': 2.5.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) + '@earendil-works/pi-tui': 0.78.0 + '@google/genai': 2.7.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) '@grammyjs/runner': 2.0.3(grammy@1.43.0(encoding@0.1.13)) '@grammyjs/transformer-throttler': 1.2.1(grammy@1.43.0(encoding@0.1.13)) - '@homebridge/ciao': 1.3.8 + '@homebridge/ciao': 1.3.9 '@lydell/node-pty': 1.2.0-beta.12 + '@mistralai/mistralai': 2.2.5 '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) '@mozilla/readability': 0.6.0 - '@openclaw/fs-safe': 0.2.7 + '@openclaw/fs-safe': 0.3.0 '@openclaw/proxyline': 0.3.3(undici@8.3.0) - ajv: 8.20.0 chalk: 5.6.2 chokidar: 5.0.0 + clawpdf: 0.3.0 commander: 14.0.3 croner: 10.0.1 + cross-spawn: 7.0.6 + diff: 9.0.0 dotenv: 17.4.2 express: 5.2.1 file-type: 22.0.1 + glob: 13.0.6 grammy: 1.43.0(encoding@0.1.13) - ipaddr.js: 2.4.0 + highlight.js: 11.11.1 + hosted-git-info: 10.1.1 + ignore: 7.0.5 jiti: 2.7.0 json5: 2.2.3 jszip: 3.10.1 kysely: 0.29.2 linkedom: 0.18.12 - markdown-it: 14.1.1 + minimatch: 10.2.5 node-edge-tts: 1.2.10 - openai: 6.38.0(ws@8.20.1)(zod@4.4.3) - pdfjs-dist: 5.7.284 + openai: 6.39.1(ws@8.21.0)(zod@4.4.3) + partial-json: 0.1.7 playwright-core: 1.60.0 + proper-lockfile: 4.1.2 qrcode: 1.5.4 - quickjs-wasi: 2.2.0 + quickjs-wasi: 3.0.0 + rastermill: 0.3.1 tar: 7.5.15 - tokenjuice: 0.7.1 tree-sitter-bash: 0.25.1 tslog: 4.10.2 - typebox: 1.1.38 + typebox: 1.1.39 typescript: 6.0.3 undici: 8.3.0 web-push: 3.6.7 web-tree-sitter: 0.26.9 - ws: 8.20.1 + ws: 8.21.0 yaml: 2.9.0 zod: 4.4.3 optionalDependencies: - sharp: 0.34.5 sqlite-vec: 0.1.9 transitivePeerDependencies: - '@cfworker/json-schema' @@ -12276,6 +11554,7 @@ snapshots: opus-decoder@0.7.11: dependencies: '@wasm-audio-decoders/common': 9.0.7 + optional: true opusscript@0.1.1: {} @@ -12329,14 +11608,17 @@ snapshots: pako@1.0.11: {} - parse-bmfont-ascii@1.0.6: {} + parse-bmfont-ascii@1.0.6: + optional: true - parse-bmfont-binary@1.0.6: {} + parse-bmfont-binary@1.0.6: + optional: true parse-bmfont-xml@1.1.6: dependencies: xml-parse-from-string: 1.0.1 xml2js: 0.5.0 + optional: true parse-entities@4.0.2: dependencies: @@ -12434,6 +11716,7 @@ snapshots: pixelmatch@5.3.0: dependencies: pngjs: 6.0.0 + optional: true pkce-challenge@5.0.1: {} @@ -12459,9 +11742,11 @@ snapshots: pngjs@5.0.0: {} - pngjs@6.0.0: {} + pngjs@6.0.0: + optional: true - pngjs@7.0.0: {} + pngjs@7.0.0: + optional: true postcss-import@15.1.0(postcss@8.5.8): dependencies: @@ -12586,8 +11871,6 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 - punycode.js@2.3.1: {} - punycode@2.3.1: {} qified@0.9.0: @@ -12597,6 +11880,7 @@ snapshots: qoa-format@1.0.1: dependencies: '@thi.ng/bitstream': 2.4.49 + optional: true qrcode-terminal@0.12.0: {} @@ -12616,10 +11900,14 @@ snapshots: quick-lru@5.1.1: {} - quickjs-wasi@2.2.0: {} + quickjs-wasi@3.0.0: {} range-parser@1.2.1: {} + rastermill@0.3.1: + dependencies: + '@silvia-odwyer/photon-node': 0.3.4 + raw-body@3.0.2: dependencies: bytes: 3.1.2 @@ -13047,7 +12335,8 @@ snapshots: dependencies: semver: 7.7.4 - simple-xml-to-json@1.2.7: {} + simple-xml-to-json@1.2.7: + optional: true simple-yenc@1.0.4: {} @@ -13145,6 +12434,11 @@ snapshots: stackback@0.0.2: {} + standardwebhooks@1.0.0: + dependencies: + '@stablelib/base64': 1.0.1 + fast-sha256: 1.3.0 + stat-mode@1.0.0: {} state-local@1.0.7: {} @@ -13358,7 +12652,8 @@ snapshots: tinybench@2.9.0: {} - tinycolor2@1.6.0: {} + tinycolor2@1.6.0: + optional: true tinyexec@1.0.4: {} @@ -13393,8 +12688,6 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - tokenjuice@0.7.1: {} - tough-cookie@6.0.1: dependencies: tldts: 7.0.27 @@ -13454,14 +12747,12 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - typebox@1.1.38: {} + typebox@1.1.39: {} typescript@5.9.3: {} typescript@6.0.3: {} - uc.micro@2.1.0: {} - uhyphen@0.2.0: {} uint8array-extras@1.5.0: {} @@ -13577,6 +12868,7 @@ snapshots: utif2@4.1.0: dependencies: pako: 1.0.11 + optional: true util-deprecate@1.0.2: {} @@ -13683,8 +12975,6 @@ snapshots: webidl-conversions@8.0.1: {} - whatsapp-rust-bridge@0.5.4: {} - whatwg-mimetype@5.0.0: {} whatwg-url@16.0.1(@noble/hashes@2.0.1): @@ -13749,6 +13039,8 @@ snapshots: ws@8.20.1: {} + ws@8.21.0: {} + xlsx@0.18.5: dependencies: adler-32: 1.3.1 @@ -13763,16 +13055,19 @@ snapshots: xml-naming@0.1.0: {} - xml-parse-from-string@1.0.1: {} + xml-parse-from-string@1.0.1: + optional: true xml2js@0.5.0: dependencies: sax: 1.6.0 xmlbuilder: 11.0.1 + optional: true xmlbuilder@10.1.1: {} - xmlbuilder@11.0.1: {} + xmlbuilder@11.0.1: + optional: true xmlbuilder@15.1.1: {} @@ -13836,7 +13131,8 @@ snapshots: dependencies: zod: 4.3.6 - zod@3.25.76: {} + zod@3.25.76: + optional: true zod@4.3.6: {} diff --git a/src/stores/chat.ts b/src/stores/chat.ts index 3f064939..998abae3 100644 --- a/src/stores/chat.ts +++ b/src/stores/chat.ts @@ -135,6 +135,12 @@ const ERROR_RECOVERY_DELAY_MS = 12_000; const LLM_IDLE_HINT_MS = 120_000; /** Wait past one LLM idle window before declaring a hard no-response failure. */ const NO_RESPONSE_SAFETY_TIMEOUT_MS = 130_000; +/** Delay before the first fallback transcript poll after a send. */ +const HISTORY_POLL_START_DELAY_MS = 3_000; +/** Interval between fallback transcript poll ticks during an active send. */ +const HISTORY_POLL_INTERVAL_MS = 5_000; +/** Only issue the fallback poll RPC after this much streamed-event silence. */ +const HISTORY_POLL_EVENT_SILENCE_MS = 10_000; type PendingOptimisticUserMessage = { message: RawMessage; @@ -3659,6 +3665,24 @@ export const useChatStore = create((set, get) => ({ clearHistoryPoll(); clearErrorRecoveryTimer(); + // Fallback transcript poll: streamed runtime events are the primary + // active-run path, but when they go missing entirely (first run right + // after gateway startup, silent WS drops, event-normalization gaps) the + // safety timeout above would fire a false "No response received" error + // even though the gateway is making progress. Polling chat.history keeps + // progress detection honest in that case. The RPC is skipped while + // streamed events are fresh, so healthy runs issue no extra requests. + const pollHistoryFallback = () => { + _historyPollTimer = null; + const state = get(); + if (!state.sending || state.currentSessionKey !== currentSessionKey) return; + if (Date.now() - _lastChatEventAt >= HISTORY_POLL_EVENT_SILENCE_MS) { + void state.loadHistory(true); + } + _historyPollTimer = setTimeout(pollHistoryFallback, HISTORY_POLL_INTERVAL_MS); + }; + _historyPollTimer = setTimeout(pollHistoryFallback, HISTORY_POLL_START_DELAY_MS); + const checkStuck = () => { const state = get(); if (!state.sending) return; @@ -3912,14 +3936,13 @@ export const useChatStore = create((set, get) => ({ } } - // Only pause the history poll when we receive actual streaming data. - // The gateway sends "agent" events with { phase, startedAt } that carry - // no message — these must NOT kill the poll, since the poll is our only - // way to track progress when the gateway doesn't stream intermediate turns. + // Streaming data pauses the fallback transcript poll implicitly: each + // event refreshes _lastChatEventAt, so the poll skips its RPC while the + // stream is healthy. Do NOT clear the poll timer here — it must stay + // armed to recover progress tracking if the stream stalls mid-run. const hasUsefulData = resolvedState === 'delta' || resolvedState === 'final' || resolvedState === 'error' || resolvedState === 'aborted'; if (hasUsefulData) { - clearHistoryPoll(); // Adopt run started from another client only for user-initiated turns. // Background :main heartbeat runs must not surface "Thinking..." in the UI. const { sending } = get(); diff --git a/tests/unit/chat-store-history-retry.test.ts b/tests/unit/chat-store-history-retry.test.ts index fa6b31bb..3ff8637f 100644 --- a/tests/unit/chat-store-history-retry.test.ts +++ b/tests/unit/chat-store-history-retry.test.ts @@ -1529,6 +1529,139 @@ describe('useChatStore startup history retry', () => { await sendPromise; }); + // Regression for the "first chat after gateway start" bug: the gateway + // accepted chat.send but no streamed chat/runtime events ever reached the + // renderer. Without the fallback transcript poll the safety timers fired + // "The model did not respond within 120 seconds" and then "No response + // received from the model" even though the transcript already contained + // the assistant reply. + it('recovers via the fallback transcript poll when no streamed events arrive', async () => { + let chatHistoryCalls = 0; + let transcript: Array> = []; + gatewayRpcMock.mockImplementation(async (method: string) => { + if (method === 'config.get') return {}; + if (method === 'chat.send') { + // Seed the transcript as the gateway would, but never emit events. + const nowSec = Date.now() / 1000; + transcript = [ + { id: 'user-first', role: 'user', content: '明天呢', timestamp: nowSec }, + { + id: 'assistant-first', + role: 'assistant', + content: [{ type: 'text', text: '明天晴。' }], + stopReason: 'endTurn', + timestamp: nowSec + 1, + }, + ]; + return { runId: 'run-first-chat' }; + } + if (method === 'chat.history') { + chatHistoryCalls += 1; + return { messages: transcript }; + } + return { messages: [] }; + }); + + const { useChatStore } = await import('@/stores/chat'); + useChatStore.setState({ + currentSessionKey: 'agent:main:session-first-chat', + currentAgentId: 'main', + sessions: [{ key: 'agent:main:session-first-chat' }], + messages: [], + sessionLabels: {}, + sessionLastActivity: {}, + sending: false, + activeRunId: null, + streamingText: '', + streamingMessage: null, + streamingTools: [], + pendingFinal: false, + lastUserMessageAt: null, + pendingToolImages: [], + error: null, + runError: null, + loading: false, + thinkingLevel: null, + }); + + await useChatStore.getState().sendMessage('明天呢'); + + // While streamed events are still considered fresh the poll stays silent. + await vi.advanceTimersByTimeAsync(8_000); + expect(chatHistoryCalls).toBe(0); + + // After enough event silence the fallback poll reads the transcript, + // detects the finished reply, and closes the run without errors. + await vi.advanceTimersByTimeAsync(10_000); + expect(chatHistoryCalls).toBeGreaterThan(0); + await vi.waitFor(() => { + expect(useChatStore.getState().sending).toBe(false); + }); + expect(useChatStore.getState().messages.map((message) => message.id)).toEqual([ + 'user-first', + 'assistant-first', + ]); + + // The 120s idle hint and the 130s hard failure must never fire. + await vi.advanceTimersByTimeAsync(140_000); + expect(useChatStore.getState().error).toBeNull(); + expect(useChatStore.getState().runError).toBeNull(); + }); + + it('keeps the fallback poll silent while streamed events are fresh', async () => { + let chatHistoryCalls = 0; + gatewayRpcMock.mockImplementation(async (method: string) => { + if (method === 'config.get') return {}; + if (method === 'chat.send') { + return { runId: 'run-streamed' }; + } + if (method === 'chat.history') { + chatHistoryCalls += 1; + return { messages: [] }; + } + return { messages: [] }; + }); + + const { useChatStore } = await import('@/stores/chat'); + useChatStore.setState({ + currentSessionKey: 'agent:main:session-streamed', + currentAgentId: 'main', + sessions: [{ key: 'agent:main:session-streamed' }], + messages: [], + sessionLabels: {}, + sessionLastActivity: {}, + sending: false, + activeRunId: null, + streamingText: '', + streamingMessage: null, + streamingTools: [], + pendingFinal: false, + lastUserMessageAt: null, + pendingToolImages: [], + error: null, + runError: null, + loading: false, + thinkingLevel: null, + }); + + await useChatStore.getState().sendMessage('streamed run'); + + // Streamed deltas keep refreshing the event timestamp; the fallback poll + // must not issue any chat.history RPCs while the stream is healthy. + for (let i = 0; i < 6; i += 1) { + useChatStore.getState().handleChatEvent({ + state: 'delta', + runId: 'run-streamed', + sessionKey: 'agent:main:session-streamed', + message: { role: 'assistant', content: [{ type: 'text', text: `chunk ${i}` }] }, + }); + await vi.advanceTimersByTimeAsync(5_000); + } + + expect(chatHistoryCalls).toBe(0); + expect(useChatStore.getState().sending).toBe(true); + }); + it('does not treat prior-turn assistant history as progress for a new send', async () => { let resolveSend: ((value: { runId: string }) => void) | undefined; gatewayRpcMock.mockImplementation((method: string) => { diff --git a/tests/unit/openclaw-auth-sqlite.test.ts b/tests/unit/openclaw-auth-sqlite.test.ts new file mode 100644 index 00000000..23d80a8d --- /dev/null +++ b/tests/unit/openclaw-auth-sqlite.test.ts @@ -0,0 +1,92 @@ +import { existsSync } from 'fs'; +import { mkdir, readFile, rm, writeFile } from 'fs/promises'; +import { join } from 'path'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +const { testHome } = vi.hoisted(() => ({ + testHome: `/tmp/clawx-auth-sqlite-${Math.random().toString(36).slice(2)}`, +})); + +vi.mock('os', async () => { + const actual = await vi.importActual('os'); + const mocked = { + ...actual, + homedir: () => testHome, + }; + return { + ...mocked, + default: mocked, + }; +}); + +async function writeJsonStore(agentId: string, store: Record): Promise { + const dir = join(testHome, '.openclaw', 'agents', agentId, 'agent'); + await mkdir(dir, { recursive: true }); + await writeFile(join(dir, 'auth-profiles.json'), JSON.stringify(store, null, 2), 'utf8'); +} + +describe('openclaw-auth-sqlite', () => { + beforeEach(async () => { + vi.resetModules(); + await rm(testHome, { recursive: true, force: true }); + }); + + it('migrates auth-profiles.json into openclaw-agent.sqlite when sqlite is empty', async () => { + await writeJsonStore('main', { + version: 1, + profiles: { + 'custom-customc7:default': { + type: 'api_key', + provider: 'custom-customc7', + key: 'sk-test-key', + }, + }, + order: { 'custom-customc7': ['custom-customc7:default'] }, + lastGood: { 'custom-customc7': 'custom-customc7:default' }, + }); + + const { + migrateAuthProfilesJsonToSqliteIfNeeded, + readAuthProfilesFromSqlite, + getAuthProfilesSqlitePath, + } = await import('@electron/utils/openclaw-auth-sqlite'); + + const migrated = await migrateAuthProfilesJsonToSqliteIfNeeded('main'); + expect(migrated).toBe(true); + expect(existsSync(getAuthProfilesSqlitePath('main'))).toBe(true); + + const sqliteStore = readAuthProfilesFromSqlite('main'); + expect(sqliteStore?.profiles['custom-customc7:default']).toMatchObject({ + type: 'api_key', + provider: 'custom-customc7', + key: 'sk-test-key', + }); + expect(sqliteStore?.order?.['custom-customc7']).toEqual(['custom-customc7:default']); + expect(sqliteStore?.lastGood?.['custom-customc7']).toBe('custom-customc7:default'); + }); + + it('saveProviderKeyToOpenClaw writes credentials readable from sqlite', async () => { + const { saveProviderKeyToOpenClaw } = await import('@electron/utils/openclaw-auth'); + const { + readAuthProfilesFromSqlite, + getAuthProfilesSqlitePath, + } = await import('@electron/utils/openclaw-auth-sqlite'); + + await saveProviderKeyToOpenClaw('custom-customc7', 'sk-runtime-key', 'main'); + + expect(existsSync(getAuthProfilesSqlitePath('main'))).toBe(true); + const sqliteStore = readAuthProfilesFromSqlite('main'); + expect(sqliteStore?.profiles['custom-customc7:default']).toMatchObject({ + type: 'api_key', + provider: 'custom-customc7', + key: 'sk-runtime-key', + }); + + const json = JSON.parse( + await readFile(join(testHome, '.openclaw', 'agents', 'main', 'agent', 'auth-profiles.json'), 'utf8'), + ) as Record; + expect((json.profiles as Record)['custom-customc7:default']).toMatchObject({ + key: 'sk-runtime-key', + }); + }); +}); diff --git a/tests/unit/openclaw-auth.test.ts b/tests/unit/openclaw-auth.test.ts index 066f6475..b37958d8 100644 --- a/tests/unit/openclaw-auth.test.ts +++ b/tests/unit/openclaw-auth.test.ts @@ -1219,8 +1219,12 @@ describe('auth-backed provider discovery', () => { const { getActiveOpenClawProviders } = await import('@electron/utils/openclaw-auth'); + // Raw runtime keys (openai-codex / google-gemini-cli) are kept alongside + // their normalized UI aliases: newer OpenClaw versions no longer write + // explicit models.providers / plugins entries for OAuth CLI providers, so + // the auth profile is the only signal that the runtime provider is active. await expect(getActiveOpenClawProviders()).resolves.toEqual( - new Set(['openai', 'anthropic', 'google']), + new Set(['openai', 'openai-codex', 'anthropic', 'google', 'google-gemini-cli']), ); }); diff --git a/tests/unit/provider-service-stale-cleanup.test.ts b/tests/unit/provider-service-stale-cleanup.test.ts index 4192fdd7..4c979ffa 100644 --- a/tests/unit/provider-service-stale-cleanup.test.ts +++ b/tests/unit/provider-service-stale-cleanup.test.ts @@ -217,6 +217,44 @@ describe('ProviderService.listAccounts (openclaw.json as sole source of truth)', expect(mocks.deleteProviderAccount).toHaveBeenCalledWith('openai'); }); + it('hides the bare openai slot when openai-codex is active only via auth profile (no openclaw.json entries)', async () => { + // Regression: newer OpenClaw versions drop the explicit models.providers + // "openai-codex" entry and the "openai-codex-auth" plugin entry, leaving + // the OAuth auth profile as the only active signal. The bare "openai" + // slot must still be hidden and the stale seeded api_key account removed. + mocks.listProviderAccounts.mockResolvedValue([ + makeAccount({ + id: 'openai-oauth-1', + vendorId: 'openai' as ProviderAccount['vendorId'], + authMode: 'oauth_browser', + label: 'OpenAI Codex', + }), + makeAccount({ + id: 'openai', + vendorId: 'openai' as ProviderAccount['vendorId'], + authMode: 'api_key', + label: 'OpenAI', + }), + ]); + mocks.getApiKey.mockResolvedValue(null); + mocks.getProviderApiKeyFromOpenClaw.mockResolvedValue(null); + // Active set as produced by getActiveOpenClawProviders() when only the + // openai-codex OAuth profile exists in the auth store. + mocks.getActiveOpenClawProviders.mockResolvedValue(new Set(['openai', 'openai-codex'])); + mocks.getOpenClawProvidersConfig.mockResolvedValue({ + providers: { openai: {} }, + defaultModel: undefined, + }); + + const result = await service.listAccounts(); + + expect(result).toHaveLength(1); + expect(result[0].id).toBe('openai-oauth-1'); + expect(result[0].authMode).toBe('oauth_browser'); + expect(mocks.deleteProviderAccount).toHaveBeenCalledWith('openai'); + expect(mocks.saveProviderAccount).not.toHaveBeenCalled(); + }); + it('matches OpenAI browser OAuth accounts to the openai-codex runtime key', async () => { mocks.listProviderAccounts.mockResolvedValue([ makeAccount({