diff --git a/electron/gateway/runtime-deps.ts b/electron/gateway/runtime-deps.ts index 00b2b20..1ece9aa 100644 --- a/electron/gateway/runtime-deps.ts +++ b/electron/gateway/runtime-deps.ts @@ -50,11 +50,17 @@ const OPENCLAW_AGENTS_SKILLS_PATCH_REPLACE = `\tconst openClawAgentsSkillsDisabl \t\tdir: path.resolve(workspaceDir, ".agents", "skills"), \t\tsource: "agents-skills-project" \t});`; -const OPENCLAW_MAIN_SESSION_RECOVERY_MARK_SEARCH = `\t\t\tif (!interruptedSessionIds.has(entry.sessionId)) continue; +const OPENCLAW_MAIN_SESSION_RECOVERY_MARK_SEARCH = `\t\t\tif (!resolveEntryTranscriptLockPaths({ +\t\t\t\tentry, +\t\t\t\tsessionsDir +\t\t\t}).some((lockPath) => interruptedLockPaths.has(lockPath))) continue; \t\t\tentry.abortedLastRun = true; \t\t\tstore[sessionKey] = entry; \t\t\tresult.marked++;`; -const OPENCLAW_MAIN_SESSION_RECOVERY_MARK_REPLACE = `\t\t\tif (!interruptedSessionIds.has(entry.sessionId)) continue; +const OPENCLAW_MAIN_SESSION_RECOVERY_MARK_REPLACE = `\t\t\tif (!resolveEntryTranscriptLockPaths({ +\t\t\t\tentry, +\t\t\t\tsessionsDir +\t\t\t}).some((lockPath) => interruptedLockPaths.has(lockPath))) continue; \t\t\tentry.abortedLastRun = true; \t\t\tif (process.env.OPENCLAW_DISABLE_MAIN_SESSION_RESTART_RECOVERY === "1") { \t\t\t\tentry.status = "failed"; @@ -73,13 +79,13 @@ const OPENCLAW_MAIN_SESSION_RECOVERY_SCHEDULE_REPLACE = `function scheduleRestar \t\treturn; \t} \tconst initialDelay = params.delayMs ?? DEFAULT_RECOVERY_DELAY_MS;`; -const OPENCLAW_STUCK_ACTIVE_ABORT_SEARCH = `\t\t\t\t(opts?.recoverStuckSession ?? recoverStuckSession)({ +const OPENCLAW_STUCK_ACTIVE_ABORT_SEARCH = `\t\t\t\tif (classification?.recoveryEligible) (opts?.recoverStuckSession ?? recoverStuckSession)({ \t\t\t\t\tsessionId: state.sessionId, \t\t\t\t\tsessionKey: state.sessionKey, \t\t\t\t\tageMs, \t\t\t\t\tqueueDepth: state.queueDepth \t\t\t\t});`; -const OPENCLAW_STUCK_ACTIVE_ABORT_REPLACE = `\t\t\t\t(opts?.recoverStuckSession ?? recoverStuckSession)({ +const OPENCLAW_STUCK_ACTIVE_ABORT_REPLACE = `\t\t\t\tif (classification?.recoveryEligible) (opts?.recoverStuckSession ?? recoverStuckSession)({ \t\t\t\t\tsessionId: state.sessionId, \t\t\t\t\tsessionKey: state.sessionKey, \t\t\t\t\tageMs, @@ -194,6 +200,7 @@ const OPENCLAW_BUNDLED_RUNTIME_DEPENDENCY_NAMES = [ 'semver', 'sharp', 'silk-wasm', + 'socks-proxy-agent', 'sqlite-vec', 'tar', 'tokenjuice', diff --git a/electron/utils/whatsapp-login.ts b/electron/utils/whatsapp-login.ts index 9fdc010..a535a83 100644 --- a/electron/utils/whatsapp-login.ts +++ b/electron/utils/whatsapp-login.ts @@ -5,6 +5,12 @@ import { EventEmitter } from 'events'; import { existsSync, mkdirSync, rmSync, readdirSync } from 'fs'; import { deflateSync } from 'zlib'; import { getOpenClawDir, getOpenClawResolvedDir } from './paths'; +import { getAllSettings } from './store'; +import { + isSocksProxyUrl, + redactProxyUrlForLog, + resolveWhatsAppProxyUrl, +} from './whatsapp-proxy'; const require = createRequire(import.meta.url); @@ -76,6 +82,32 @@ type ConnectionState = { const QRCode = QRCodeModule; const QRErrorCorrectLevel = QRErrorCorrectLevelModule; +function loadProxyAgentConstructor(proxyUrl: string) { + const moduleName = isSocksProxyUrl(proxyUrl) ? 'socks-proxy-agent' : 'https-proxy-agent'; + const agentModule = require(resolveOpenClawModule(moduleName)); + return agentModule.SocksProxyAgent + || agentModule.HttpsProxyAgent + || agentModule.default + || agentModule; +} + +async function createWhatsAppSocketAgent(): Promise { + let settings: Awaited>; + try { + settings = await getAllSettings(); + } catch (error) { + console.warn('[WhatsAppLogin] Failed to read proxy settings; connecting directly', error); + return undefined; + } + + const proxyUrl = resolveWhatsAppProxyUrl(settings); + if (!proxyUrl) return undefined; + + const AgentCtor = loadProxyAgentConstructor(proxyUrl); + console.log(`[WhatsAppLogin] Using proxy for WhatsApp WebSocket: ${redactProxyUrlForLog(proxyUrl)}`); + return new AgentCtor(proxyUrl); +} + function createQrMatrix(input: string) { const qr = new QRCode(-1, QRErrorCorrectLevel.L); qr.addData(input); @@ -201,6 +233,7 @@ export class WhatsAppLoginManager extends EventEmitter { private loginSucceeded: boolean = false; private retryCount: number = 0; private maxRetries: number = 5; + private lastConnectionError: string | null = null; constructor() { super(); @@ -242,10 +275,16 @@ export class WhatsAppLoginManager extends EventEmitter { this.loginSucceeded = false; this.qr = null; this.retryCount = 0; + this.lastConnectionError = null; await this.connectToWhatsApp(accountId); } + private buildConnectionFailureMessage(fallback: string): string { + const details = this.lastConnectionError ? ` Last error: ${this.lastConnectionError}` : ''; + return `${fallback}. Check network connectivity or enable a proxy in Advanced Settings.${details}`; + } + private async connectToWhatsApp(accountId: string): Promise { if (!this.active) return; @@ -292,6 +331,7 @@ export class WhatsAppLoginManager extends EventEmitter { const { version } = await fetchLatestBaileysVersion(); console.log(`[WhatsAppLogin] Starting login for ${accountId}, version: ${version}`); + const socketAgent = await createWhatsAppSocketAgent(); this.socket = makeWASocket({ version, @@ -299,6 +339,7 @@ export class WhatsAppLoginManager extends EventEmitter { printQRInTerminal: false, logger: pino({ level: 'silent' }), // Silent logger connectTimeoutMs: 60000, + ...(socketAgent ? { agent: socketAgent } : {}), // mobile: false, // browser: ['ClawX', 'Chrome', '1.0.0'], }); @@ -333,6 +374,8 @@ export class WhatsAppLoginManager extends EventEmitter { if (connection === 'close') { const error = lastDisconnect?.error as BaileysError | undefined; const statusCode = error?.output?.statusCode; + this.lastConnectionError = error?.message + || (statusCode ? `statusCode=${statusCode}` : this.lastConnectionError); const isLoggedOut = statusCode === DisconnectReason.loggedOut; // Treat 401 as transient if we haven't exhausted retries (max 2 attempts) // This handles the case where WhatsApp's session hasn't fully released @@ -351,7 +394,7 @@ export class WhatsAppLoginManager extends EventEmitter { } else { console.log('[WhatsAppLogin] Max retries reached, stopping.'); this.active = false; - this.emit('error', 'Connection failed after multiple retries'); + this.emit('error', this.buildConnectionFailureMessage('Connection failed after multiple retries')); } } else { // Logged out or explicitly stopped @@ -384,6 +427,12 @@ export class WhatsAppLoginManager extends EventEmitter { } } catch (innerErr) { console.error('[WhatsAppLogin] Error in connection update:', innerErr); + const msg = innerErr instanceof Error ? innerErr.message : String(innerErr); + this.lastConnectionError = msg; + if (this.active) { + this.active = false; + this.emit('error', this.buildConnectionFailureMessage('Failed to generate WhatsApp QR code')); + } } }); @@ -395,7 +444,8 @@ export class WhatsAppLoginManager extends EventEmitter { } else { this.active = false; const msg = error instanceof Error ? error.message : String(error); - this.emit('error', msg); + this.lastConnectionError = msg; + this.emit('error', this.buildConnectionFailureMessage('Failed to start WhatsApp login')); } } } @@ -408,6 +458,7 @@ export class WhatsAppLoginManager extends EventEmitter { const cleanupAccountId = this.accountId; this.active = false; this.qr = null; + this.lastConnectionError = null; if (this.socket) { try { // Remove listeners to prevent handling closure as error diff --git a/electron/utils/whatsapp-proxy.ts b/electron/utils/whatsapp-proxy.ts new file mode 100644 index 0000000..c01b8ac --- /dev/null +++ b/electron/utils/whatsapp-proxy.ts @@ -0,0 +1,59 @@ +import type { ProxySettings } from './proxy'; +import { resolveProxySettings } from './proxy'; + +const WHATSAPP_WEB_HOST = 'web.whatsapp.com'; + +function splitBypassRules(rules: string): string[] { + return rules + .split(/[,\n;]/) + .map((rule) => rule.trim()) + .filter(Boolean); +} + +function matchesBypassRule(host: string, rule: string): boolean { + const normalizedHost = host.toLowerCase(); + const normalizedRule = rule.toLowerCase(); + if (normalizedRule === '*') return true; + if (normalizedRule === '') { + return normalizedHost === 'localhost' + || normalizedHost === '127.0.0.1' + || normalizedHost === '::1' + || !normalizedHost.includes('.'); + } + if (normalizedRule.startsWith('*.')) { + const suffix = normalizedRule.slice(1); + return normalizedHost.endsWith(suffix); + } + if (normalizedRule.startsWith('.')) { + return normalizedHost.endsWith(normalizedRule); + } + return normalizedHost === normalizedRule; +} + +export function shouldBypassWhatsAppProxy(bypassRules: string): boolean { + return splitBypassRules(bypassRules).some((rule) => matchesBypassRule(WHATSAPP_WEB_HOST, rule)); +} + +export function resolveWhatsAppProxyUrl(settings: ProxySettings): string { + if (!settings.proxyEnabled) return ''; + + const resolved = resolveProxySettings(settings); + if (shouldBypassWhatsAppProxy(resolved.bypassRules)) return ''; + + return resolved.allProxy || resolved.httpsProxy || resolved.httpProxy; +} + +export function isSocksProxyUrl(proxyUrl: string): boolean { + return /^socks[45]h?:\/\//i.test(proxyUrl.trim()); +} + +export function redactProxyUrlForLog(proxyUrl: string): string { + try { + const parsed = new URL(proxyUrl); + if (parsed.username) parsed.username = 'redacted'; + if (parsed.password) parsed.password = 'redacted'; + return parsed.toString(); + } catch { + return proxyUrl.replace(/\/\/([^/@:]+):([^/@]+)@/, '//redacted:redacted@'); + } +} diff --git a/package.json b/package.json index 2e17aac..c28f17a 100644 --- a/package.json +++ b/package.json @@ -216,7 +216,7 @@ "node-edge-tts": "^1.2.10", "nostr-tools": "^2.23.3", "openai": "^6.34.0", - "openclaw": "2026.4.29", + "openclaw": "2026.5.7", "openshell": "0.1.0", "opusscript": "^0.1.1", "pdfjs-dist": "^5.7.284", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5e4195..0acd05e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -409,8 +409,8 @@ importers: specifier: ^6.34.0 version: 6.34.0(ws@8.20.0)(zod@4.3.6) openclaw: - specifier: 2026.4.29 - version: 2026.4.29 + specifier: 2026.5.7 + version: 2026.5.7(@types/express@5.0.6)(encoding@0.1.13) openshell: specifier: 0.1.0 version: 0.1.0(encoding@0.1.13) @@ -665,6 +665,15 @@ packages: zod: optional: true + '@anthropic-ai/sdk@0.93.0': + resolution: {integrity: sha512-q9vaSZQVFx6B/gPxetGYfLXSJD5v0sOmh0OpZDq7yCrTSA+Rscvrtyol7JJTW40wEpQB4U1B4JXzxQitbQ3CAA==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + '@anthropic-ai/vertex-sdk@0.16.0': resolution: {integrity: sha512-ntxemtRkwPsjVzGQJsmBPRW38tfas6VuVlD1v6pHffDJKLPtCdaiN9KUQeraJ/F34tjxEWlsaCnl3t/orJm1Xw==} @@ -711,10 +720,18 @@ packages: resolution: {integrity: sha512-oGiqs9v9WzPOdv7PDdm9iPibHgrbDvCDyNg43wFZn2PiiEUisFM+xUP2CRMsj41SmwZPhohmZkXiUu1+MghbAQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/client-bedrock-runtime@3.1042.0': + resolution: {integrity: sha512-uYJ/HDSQvorlgYqZSwRFGolEx5wygqyuBRfemXJ3Bla2yiRj9maSVOvWP88i/hDC2BKoH6NQw8GPB9Z4RYAnwQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/client-bedrock@3.1038.0': resolution: {integrity: sha512-WY99Vodg7V4hxLQn7HOLawXHeVYv8Ys16Xx3CPpu8L7+1spvO/i4uykzTXH6GkojdAqNO2CSclhk31lb85nSWg==} engines: {node: '>=20.0.0'} + '@aws-sdk/client-bedrock@3.1042.0': + resolution: {integrity: sha512-oEVjGU8wgW+eTF7ApdRU4jTs/iMVl4OdfpLmiNLuB082UVxxN/fQ5GIX2Ktbyt+x0mPlI3fug36XnOyf7oCo+Q==} + engines: {node: '>=20.0.0'} + '@aws-sdk/client-cognito-identity@3.1043.0': resolution: {integrity: sha512-ALRMiZ1UO6Vs4stAv0xkuUTxGJGHbSQ/T/m62sKDWu9fyTiz4Xo5UHUyeD7l5xgfRWVCbpzSJzfoEtzlBrc6TQ==} engines: {node: '>=20.0.0'} @@ -899,6 +916,10 @@ packages: resolution: {integrity: sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw==} engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.1042.0': + resolution: {integrity: sha512-rOEGTVOrceb/1CfIWK0zl1v2WS70f/i5bDirLl5xdFAbVQ5znub6Ezf2ugmJEg+rionO0IkwbKX3Dh3T/oZjbA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/types@3.973.8': resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==} engines: {node: '>=20.0.0'} @@ -1118,12 +1139,20 @@ packages: '@clack/core@1.2.0': resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==} + '@clack/core@1.3.1': + resolution: {integrity: sha512-fT1qHVGAag4IEkrupZ6lRRbNCs1vS9P01KB/sG8zKgvUztbYtFBtQpjSITNwooDZ83tpsPzP0mRNs1/KVszCRA==} + engines: {node: '>= 20.12.0'} + '@clack/prompts@0.11.0': resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} '@clack/prompts@1.2.0': resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==} + '@clack/prompts@1.4.0': + resolution: {integrity: sha512-S0My7XPGIgpRWMDG8uRqalbgT+a6FmCUdOW+HaIOVVpUPHOb7RrpvjTjiODadKp06fsrVDJZlIzc6yCTp4AnxA==} + engines: {node: '>= 20.12.0'} + '@clawdbot/lobster@2026.4.6': resolution: {integrity: sha512-v8QQHAykISyiSIVBtdBKDSQtfigZ4mUoPkUFYVZjvn2LRQGvtnX6uDvhgXu3QaxLF3MDSGMphgzDpkLrh1xnbw==} engines: {node: '>=20'} @@ -1945,23 +1974,47 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} + '@mariozechner/clipboard-darwin-arm64@0.3.2': + resolution: {integrity: sha512-uBf6K7Je1ihsgvmWxA8UCGCeI+nbRVRXoarZdLjl6slz94Zs1tNKFZqx7aCI5O1i3e0B6ja82zZ06BWrl0MCVw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@mariozechner/clipboard-darwin-arm64@0.3.3': resolution: {integrity: sha512-+zhuZGXqVrdkbIRdnwiZNbTJ7V3elq/A+C5d5laJoyhJgWs41eO5NUMkBkj6f23F2L4PRXEhdn5/ktlPx+bG3Q==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@mariozechner/clipboard-darwin-universal@0.3.2': + resolution: {integrity: sha512-mxSheKTW2U9LsBdXy0SdmdCAE5HqNS9QUmpNHLnfJ+SsbFKALjEZc5oRrVMXxGQSirDvYf5bjmRyT0QYYonnlg==} + engines: {node: '>= 10'} + os: [darwin] + '@mariozechner/clipboard-darwin-universal@0.3.3': resolution: {integrity: sha512-x9aRfTyndVqpEQ44LNNCK/EXZd9y8rWkLQgNhmWpby9PXrjPhNxfjUc2Db4mt4nJjU/4zzO8F5v/XyzlUGSdhQ==} engines: {node: '>= 10'} os: [darwin] + '@mariozechner/clipboard-darwin-x64@0.3.2': + resolution: {integrity: sha512-U1BcVEoidvwIp95+HJswSW+xr28EQiHR7rZjH6pn8Sja5yO4Yoe3yCN0Zm8Lo72BbSOK/fTSq0je7CJpaPCspg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@mariozechner/clipboard-darwin-x64@0.3.3': resolution: {integrity: sha512-6ut/NawB0KiYPCwrirgNp6Br62LntL978q7G6d/Rs2pmPvQb53bP96eUMYl+Y3a7Qk13bGZ4w9rVPFxRE9m9ag==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@mariozechner/clipboard-linux-arm64-gnu@0.3.2': + resolution: {integrity: sha512-BsinwG3yWTIjdgNCxsFlip7LkfwPk+ruw/aFCXHUg/fb5XC/Ksp+YMQ7u0LUtiKzIv/7LMXgZInJQH6gxbAaqQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@mariozechner/clipboard-linux-arm64-gnu@0.3.3': resolution: {integrity: sha512-gf3dH4kBddU1AOyHVB53mjLUFfJAKlTmxTMw51jdeg7eE7IjfEBXVvM4bifMtBxbWkT0eA0FUZ1C0KQ6Z5l6pw==} engines: {node: '>= 10'} @@ -1969,6 +2022,13 @@ packages: os: [linux] libc: [glibc] + '@mariozechner/clipboard-linux-arm64-musl@0.3.2': + resolution: {integrity: sha512-0/Gi5Xq2V6goXBop19ePoHvXsmJD9SzFlO3S+d6+T2b+BlPcpOu3Oa0wTjl+cZrLAAEzA86aPNBI+VVAFDFPKw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@mariozechner/clipboard-linux-arm64-musl@0.3.3': resolution: {integrity: sha512-o1paj2+zmAQ/LaPS85XJCxhNowNQpxYM2cGY6pWvB5Kqmz6hZjl6CzDg5tbf1hZkn/Em6jpOaE2UtMxKdELBDA==} engines: {node: '>= 10'} @@ -1976,6 +2036,13 @@ packages: os: [linux] libc: [musl] + '@mariozechner/clipboard-linux-riscv64-gnu@0.3.2': + resolution: {integrity: sha512-2AFFiXB24qf0zOZsxI1GJGb9wQGlOJyN6UwoXqmKS3dpQi/l6ix30IzDDA4c4ZcCcx4D+9HLYXhC1w7Sov8pXA==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@mariozechner/clipboard-linux-riscv64-gnu@0.3.3': resolution: {integrity: sha512-dkEhE4ekePJwMbBq9HP1//CFMNmDzA/iV9AXqBfvL5CWmmDIRXqh4A3YZt3tWO/HdMerX+xNCEiR7WiOsIG+UA==} engines: {node: '>= 10'} @@ -1983,6 +2050,13 @@ packages: os: [linux] libc: [glibc] + '@mariozechner/clipboard-linux-x64-gnu@0.3.2': + resolution: {integrity: sha512-v6fVnsn7WMGg73Dab8QMwyFce7tzGfgEixKgzLP8f1GJqkJZi5zO4k4FOHzSgUufgLil63gnxvMpjWkgfeQN7A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@mariozechner/clipboard-linux-x64-gnu@0.3.3': resolution: {integrity: sha512-lT2yANtTLlEtFBIH3uGoRa/CQas/eBoLNi3qr9axQFoRgF4RGPSJ66yHOSnMECBneTIb1Iqv3UxokTfX27CdoQ==} engines: {node: '>= 10'} @@ -1990,6 +2064,13 @@ packages: os: [linux] libc: [glibc] + '@mariozechner/clipboard-linux-x64-musl@0.3.2': + resolution: {integrity: sha512-xVUtnoMQ8v2JVyfJLKKXACA6avdnchdbBkTsZs8BgJQo29qwCp5NIHAUO8gbJ40iaEGToW5RlmVk2M9V0HsHEw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + '@mariozechner/clipboard-linux-x64-musl@0.3.3': resolution: {integrity: sha512-saq/MCB0QHK/7ZZLjAZ0QkbY944dyjOsur8gneGCfMitt+GOiE1CU4OUipHC4b6x8UDY9bRLsR4aBaxu22OFPA==} engines: {node: '>= 10'} @@ -1997,12 +2078,24 @@ packages: os: [linux] libc: [musl] + '@mariozechner/clipboard-win32-arm64-msvc@0.3.2': + resolution: {integrity: sha512-AEgg95TNi8TGgak2wSXZkXKCvAUTjWoU1Pqb0ON7JHrX78p616XUFNTJohtIon3e0w6k0pYPZeCuqRCza/Tqeg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@mariozechner/clipboard-win32-arm64-msvc@0.3.3': resolution: {integrity: sha512-cGuvSj0/2X2w983yEcKw+i+r1EBej6ZZIN+fXG3eY2G/HaIQpbXpLvMxKyZ9LKtbZx+Z6q/gELEoSBMLML6BaQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@mariozechner/clipboard-win32-x64-msvc@0.3.2': + resolution: {integrity: sha512-tGRuYpZwDOD7HBrCpyRuhGnHHSCknELvqwKKUG4JSfSB7JIU7LKRh6zx6fMUOQd8uISK35TjFg5UcNih+vJhFA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@mariozechner/clipboard-win32-x64-msvc@0.3.3': resolution: {integrity: sha512-5hvaEq/bgYovTIGx43O/S7loIHYV3ue90WcV1dz0wdMXroVKZKeU/yfwM0PALQA1OcrEHiGXGySFReXr72lGtA==} engines: {node: '>= 10'} @@ -2013,6 +2106,10 @@ packages: resolution: {integrity: sha512-e7jASirzfm+ROiOGFh843+cFZTy3DfzP+jldCvh8RnEk0C3QihDTn7dd7Yh7KAJydwIJ18FJSZ2swHvCJhk18g==} engines: {node: '>= 10'} + '@mariozechner/clipboard@0.3.5': + resolution: {integrity: sha512-D3F+UrU9CR7roJt0zDLp6Oc+4/KlLDIrN4frH+6V90SJNW2KKUec1oCQIPaaDjCqeOsQyX9dyqYbImIQIM45PA==} + engines: {node: '>= 10'} + '@mariozechner/jiti@2.6.5': resolution: {integrity: sha512-faGUlTcXka5l7rv0lP3K3vGW/ejRuOS24RR2aSFWREUQqzjgdsuWNo/IiPqL3kWRGt6Ahl2+qcDAwtdeWeuGUw==} hasBin: true @@ -2021,20 +2118,39 @@ packages: resolution: {integrity: sha512-PovJZJqhY4ajgTJRUcLzfWKnlQuJHxHW3T030CafR9LYeLmOHi/HGS8DbCdRgSJNbnoIG+kl67/7++9DKZ2+sg==} engines: {node: '>=20.0.0'} + '@mariozechner/pi-agent-core@0.73.0': + resolution: {integrity: sha512-ugcpvq0X9fr9fTSK29/3S4+KU/eeVMrBb7ZU3HqiF3xD7I1GlgumLj4FYmDrYSEA6+rzgNWlJUKwjKh9o0Z6AA==} + engines: {node: '>=20.0.0'} + '@mariozechner/pi-ai@0.70.6': resolution: {integrity: sha512-LVAadu0Y+hb7Bj7EDiLsx6AuGxHlxDq0euLzyqX698i9qt0BW6a+oQSUIZQz4rJwExF18OvyL7ygJ5781ojrIQ==} engines: {node: '>=20.0.0'} hasBin: true + '@mariozechner/pi-ai@0.73.0': + resolution: {integrity: sha512-phKOpcde/ssz6UYszkmaGJ9LF9mgt/AP8LrtSwsfap+kMSeFfSQ2/mCSBT1mLJ2BqVuff9uXs1/+op1aQeaafQ==} + engines: {node: '>=20.0.0'} + hasBin: true + '@mariozechner/pi-coding-agent@0.70.6': resolution: {integrity: sha512-S4hUZghBeHPqsL6+DNg/TbGLziSh5+/mEHPVlYq5y6ImirWXhISLdLCnyZUW83OblKWihmG7unhJXiHQTH82mQ==} engines: {node: '>=20.6.0'} hasBin: true + '@mariozechner/pi-coding-agent@0.73.0': + resolution: {integrity: sha512-Fs2dRIgtjDT8X5VDGNGzxj251B0FvkRsgX03YJv1FK4wg5Maj+jkf8/5A6tbPnPcXsCgs41xxJRf3tF5vJRccA==} + engines: {node: '>=20.6.0'} + deprecated: please use @earendil-works/pi-coding-agent instead going forward + hasBin: true + '@mariozechner/pi-tui@0.70.6': resolution: {integrity: sha512-orBJEwMdpBC38AXfdVBKT5ZvqNTcKg6g3NdoF5a9aNQzDI/dOTu1UNYFYyEOTFRiTxSR1nw8eovbCcaSyekWfw==} engines: {node: '>=20.0.0'} + '@mariozechner/pi-tui@0.73.0': + resolution: {integrity: sha512-St1W+tMPKHatfK+lblsKfL+SsFyFVMK2tW6xHpBfCiMuevbOCRo/CMatso7mu1642UO04ncmfCrrpUK5L9aoog==} + engines: {node: '>=20.0.0'} + '@matrix-org/matrix-sdk-crypto-nodejs@0.5.1': resolution: {integrity: sha512-m1nTFhUJv8AZCvuVmZ0wgYsFaseVNMhl3Jqu18KoHs7TQa+mmAW4q3xY6MuVApd75Zu9E0ooQeA5obUZdQ24OA==} engines: {node: '>= 24'} @@ -2467,6 +2583,9 @@ packages: '@protobufjs/codegen@2.0.4': resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + '@protobufjs/eventemitter@1.1.0': resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} @@ -2479,6 +2598,9 @@ packages: '@protobufjs/inquire@1.1.0': resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + '@protobufjs/inquire@1.1.1': + resolution: {integrity: sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==} + '@protobufjs/path@1.1.2': resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} @@ -2488,6 +2610,9 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@protobufjs/utf8@1.1.1': + resolution: {integrity: sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -3618,9 +3743,6 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/long@4.0.2': - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -3630,9 +3752,6 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@10.17.60': - resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} - '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} @@ -3819,10 +3938,6 @@ packages: link-preview-js: optional: true - '@whiskeysockets/libsignal-node@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67': - resolution: {tarball: https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67} - version: 2.0.1 - '@xmldom/xmldom@0.8.11': resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} @@ -4986,15 +5101,24 @@ packages: fast-string-truncated-width@1.2.1: resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + fast-string-width@1.1.0: resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==} + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-wrap-ansi@0.1.6: resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==} + fast-wrap-ansi@0.2.0: + resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + fast-xml-builder@1.1.5: resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} @@ -5506,8 +5630,8 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.3.0: - resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} + ipaddr.js@2.4.0: + resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} engines: {node: '>= 10'} ircv3@0.33.1: @@ -5753,6 +5877,10 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libsignal@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/bcea72df9ec34d9d9140ab30619cf479c7c144c7: + resolution: {tarball: https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/bcea72df9ec34d9d9140ab30619cf479c7c144c7} + version: 6.0.0 + lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -5844,9 +5972,6 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} - long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -6157,6 +6282,10 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -6261,6 +6390,10 @@ packages: node-addon-api@1.7.2: resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + node-addon-api@8.7.0: + resolution: {integrity: sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==} + engines: {node: ^18 || ^20 || >= 21} + node-api-version@0.2.1: resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} @@ -6291,6 +6424,10 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-gyp@11.5.0: resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -6408,8 +6545,20 @@ packages: zod: optional: true - openclaw@2026.4.29: - resolution: {integrity: sha512-IRhX38ow4Hj783YxChK10rHwNg6OCupzGvVxG7EE24GaXHBumrESDpWUsgX0FiwTa0LYQBxuAcDncbyFiGVaOg==} + openai@6.37.0: + resolution: {integrity: sha512-0H5dEGFmmLv6KSd0W1w2nyL8WsLkX6yoLeQpU+dZAOuGcany5qkYQMmj35ZrKgb6yiyYqpUzFOpR8mZQkgqeEQ==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openclaw@2026.5.7: + resolution: {integrity: sha512-hjvpgconK20YltQPrzDY6cehjM8ijQyZnLKhqLBTngiFEPum9gmXwCDsrisPEXVRFtzuMhap+w6zSEmSQ1047Q==} engines: {node: '>=22.14.0'} hasBin: true @@ -6790,14 +6939,14 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - protobufjs@6.8.8: - resolution: {integrity: sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==} - hasBin: true - protobufjs@7.5.4: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} + protobufjs@7.5.8: + resolution: {integrity: sha512-dvpCIeLPbXZS/Ete7yLaO7RenOdken2NHKykBXbsaGxZT0UTltcarBciw+A78SRQs9iMAAVpsYA+l8b1hTePIA==} + engines: {node: '>=12.0.0'} + protobufjs@8.0.3: resolution: {integrity: sha512-LBYnMWkKLB8fE/ljROPDbCl7mgLSlI+oBe1fAAr5MTqFg4TIi0tYrVVurJvQggOjnUYMQtEZBjrej59ojMNTHQ==} engines: {node: '>=12.0.0'} @@ -7564,6 +7713,14 @@ packages: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} + tree-sitter-bash@0.25.1: + resolution: {integrity: sha512-7hMytuYIMoXOq24yRulgIxthE9YmggZIOHCyPTTuJcu6EU54tYD+4G39cUb28kxC6jMf/AbPfWGLQtgPTdh3xw==} + peerDependencies: + tree-sitter: ^0.25.0 + peerDependenciesMeta: + tree-sitter: + optional: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -7624,6 +7781,9 @@ packages: typebox@1.1.34: resolution: {integrity: sha512-V0fM5W5DTXlEMDxqtX1dQ25HR1RQ11DPUVrIup4sJi1yQtIyI30SHfxBy/HjXKL1CtUqc5or2igA/wa/v4hMKQ==} + typebox@1.1.37: + resolution: {integrity: sha512-jb7jp6KvOvvy5sd+11AfJ0/e0F0AS9RcOXd55oGi2ZnRHIGmFvrTaNF+ZidRmGBmmNTkM5KKl0Z37KzxJ+owEQ==} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -7670,6 +7830,10 @@ packages: resolution: {integrity: sha512-E9MkTS4xXLnRPYqxH2e6Hr2/49e7WFDKczKcCaFH4VaZs2iNvHMqeIkyUAD9vM8kujy9TjVrRlQ5KkdEJxB2pw==} engines: {node: '>=22.19.0'} + undici@8.2.0: + resolution: {integrity: sha512-Z+4Hx9GE26Lh9Upwfnc8C7SsrpBPGaM/Gm6kMFtiG7c+5IvQKlXi/t+9x9DrrCh29cww5TSP9YdVaBcnLDs5fQ==} + engines: {node: '>=22.19.0'} + unhomoglyph@1.0.6: resolution: {integrity: sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==} @@ -7909,6 +8073,9 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + web-tree-sitter@0.26.8: + resolution: {integrity: sha512-4sUwi7ZyOrIk5KLgYLkc2A/F0LFMQnBhfb+2Cdl7ik4ePJ6JD+fk4ofI2sA5eGawBKBaK4Vntt7Ww5KcEsay4A==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -8045,6 +8212,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -8101,6 +8273,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zustand@5.0.12: resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==} engines: {node: '>=12.20.0'} @@ -8152,6 +8327,10 @@ snapshots: dependencies: zod: 4.3.6 + '@agentclientprotocol/sdk@0.21.0(zod@4.4.3)': + dependencies: + zod: 4.4.3 + '@alloc/quick-lru@5.2.0': {} '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.2.119': @@ -8214,6 +8393,18 @@ snapshots: optionalDependencies: zod: 4.3.6 + '@anthropic-ai/sdk@0.91.1(zod@4.4.3)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.4.3 + + '@anthropic-ai/sdk@0.93.0(zod@4.4.3)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.4.3 + '@anthropic-ai/vertex-sdk@0.16.0(encoding@0.1.13)(zod@4.3.6)': dependencies: '@anthropic-ai/sdk': 0.91.1(zod@4.3.6) @@ -8223,6 +8414,15 @@ snapshots: - supports-color - zod + '@anthropic-ai/vertex-sdk@0.16.0(encoding@0.1.13)(zod@4.4.3)': + dependencies: + '@anthropic-ai/sdk': 0.91.1(zod@4.4.3) + google-auth-library: 9.15.1(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + - zod + '@ark/schema@0.56.0': dependencies: '@ark/util': 0.56.0 @@ -8346,6 +8546,58 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-bedrock-runtime@3.1042.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.8 + '@aws-sdk/credential-provider-node': 3.972.39 + '@aws-sdk/eventstream-handler-node': 3.972.14 + '@aws-sdk/middleware-eventstream': 3.972.10 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.38 + '@aws-sdk/middleware-websocket': 3.972.16 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/token-providers': 3.1042.0 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.24 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.17 + '@smithy/eventstream-serde-browser': 4.2.14 + '@smithy/eventstream-serde-config-resolver': 4.3.14 + '@smithy/eventstream-serde-node': 4.2.14 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.32 + '@smithy/middleware-retry': 4.5.7 + '@smithy/middleware-serde': 4.2.20 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.1 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.13 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.49 + '@smithy/util-defaults-mode-node': 4.2.54 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.8 + '@smithy/util-stream': 4.5.25 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-bedrock@3.1038.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -8391,6 +8643,51 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-bedrock@3.1042.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.8 + '@aws-sdk/credential-provider-node': 3.972.39 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.38 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/token-providers': 3.1042.0 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.24 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.17 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.32 + '@smithy/middleware-retry': 4.5.7 + '@smithy/middleware-serde': 4.2.20 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.1 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.13 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.49 + '@smithy/util-defaults-mode-node': 4.2.54 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.8 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-cognito-identity@3.1043.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -9078,6 +9375,18 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/token-providers@3.1042.0': + dependencies: + '@aws-sdk/core': 3.974.8 + '@aws-sdk/nested-clients': 3.997.6 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/types@3.973.8': dependencies: '@smithy/types': 4.14.1 @@ -9399,6 +9708,11 @@ snapshots: fast-wrap-ansi: 0.1.6 sisteransi: 1.0.5 + '@clack/core@1.3.1': + dependencies: + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + '@clack/prompts@0.11.0': dependencies: '@clack/core': 0.5.0 @@ -9412,6 +9726,13 @@ snapshots: fast-wrap-ansi: 0.1.6 sisteransi: 1.0.5 + '@clack/prompts@1.4.0': + dependencies: + '@clack/core': 1.3.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + '@clawdbot/lobster@2026.4.6': dependencies: ajv: 8.20.0 @@ -10284,33 +10605,63 @@ snapshots: transitivePeerDependencies: - supports-color + '@mariozechner/clipboard-darwin-arm64@0.3.2': + optional: true + '@mariozechner/clipboard-darwin-arm64@0.3.3': optional: true + '@mariozechner/clipboard-darwin-universal@0.3.2': + optional: true + '@mariozechner/clipboard-darwin-universal@0.3.3': optional: true + '@mariozechner/clipboard-darwin-x64@0.3.2': + optional: true + '@mariozechner/clipboard-darwin-x64@0.3.3': optional: true + '@mariozechner/clipboard-linux-arm64-gnu@0.3.2': + optional: true + '@mariozechner/clipboard-linux-arm64-gnu@0.3.3': optional: true + '@mariozechner/clipboard-linux-arm64-musl@0.3.2': + optional: true + '@mariozechner/clipboard-linux-arm64-musl@0.3.3': optional: true + '@mariozechner/clipboard-linux-riscv64-gnu@0.3.2': + optional: true + '@mariozechner/clipboard-linux-riscv64-gnu@0.3.3': optional: true + '@mariozechner/clipboard-linux-x64-gnu@0.3.2': + optional: true + '@mariozechner/clipboard-linux-x64-gnu@0.3.3': optional: true + '@mariozechner/clipboard-linux-x64-musl@0.3.2': + optional: true + '@mariozechner/clipboard-linux-x64-musl@0.3.3': optional: true + '@mariozechner/clipboard-win32-arm64-msvc@0.3.2': + optional: true + '@mariozechner/clipboard-win32-arm64-msvc@0.3.3': optional: true + '@mariozechner/clipboard-win32-x64-msvc@0.3.2': + optional: true + '@mariozechner/clipboard-win32-x64-msvc@0.3.3': optional: true @@ -10328,6 +10679,20 @@ snapshots: '@mariozechner/clipboard-win32-x64-msvc': 0.3.3 optional: true + '@mariozechner/clipboard@0.3.5': + optionalDependencies: + '@mariozechner/clipboard-darwin-arm64': 0.3.2 + '@mariozechner/clipboard-darwin-universal': 0.3.2 + '@mariozechner/clipboard-darwin-x64': 0.3.2 + '@mariozechner/clipboard-linux-arm64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-arm64-musl': 0.3.2 + '@mariozechner/clipboard-linux-riscv64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-x64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-x64-musl': 0.3.2 + '@mariozechner/clipboard-win32-arm64-msvc': 0.3.2 + '@mariozechner/clipboard-win32-x64-msvc': 0.3.2 + optional: true + '@mariozechner/jiti@2.6.5': dependencies: std-env: 3.10.0 @@ -10346,6 +10711,19 @@ snapshots: - ws - zod + '@mariozechner/pi-agent-core@0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3)': + dependencies: + '@mariozechner/pi-ai': 0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3) + typebox: 1.1.34 + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + '@mariozechner/pi-ai@0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': dependencies: '@anthropic-ai/sdk': 0.90.0(zod@4.3.6) @@ -10368,6 +10746,28 @@ snapshots: - ws - zod + '@mariozechner/pi-ai@0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3)': + dependencies: + '@anthropic-ai/sdk': 0.91.1(zod@4.4.3) + '@aws-sdk/client-bedrock-runtime': 3.1038.0 + '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) + '@mistralai/mistralai': 2.2.1 + chalk: 5.6.2 + openai: 6.26.0(ws@8.20.0)(zod@4.4.3) + partial-json: 0.1.7 + proxy-agent: 6.5.0 + typebox: 1.1.34 + undici: 7.24.6 + zod-to-json-schema: 3.25.1(zod@4.4.3) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + '@mariozechner/pi-coding-agent@0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': dependencies: '@mariozechner/jiti': 2.6.5 @@ -10402,6 +10802,40 @@ snapshots: - ws - zod + '@mariozechner/pi-coding-agent@0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3)': + dependencies: + '@mariozechner/jiti': 2.6.5 + '@mariozechner/pi-agent-core': 0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3) + '@mariozechner/pi-ai': 0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3) + '@mariozechner/pi-tui': 0.73.0 + '@silvia-odwyer/photon-node': 0.3.4 + chalk: 5.6.2 + cli-highlight: 2.1.11 + diff: 8.0.4 + extract-zip: 2.0.1 + file-type: 21.3.4 + glob: 13.0.6 + hosted-git-info: 9.0.2 + ignore: 7.0.5 + marked: 15.0.12 + minimatch: 10.2.4 + proper-lockfile: 4.1.2 + strip-ansi: 7.2.0 + typebox: 1.1.34 + undici: 7.24.6 + uuid: 14.0.0 + yaml: 2.9.0 + optionalDependencies: + '@mariozechner/clipboard': 0.3.5 + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + '@mariozechner/pi-tui@0.70.6': dependencies: '@types/mime-types': 2.1.4 @@ -10412,6 +10846,16 @@ snapshots: optionalDependencies: koffi: 2.15.2 + '@mariozechner/pi-tui@0.73.0': + dependencies: + '@types/mime-types': 2.1.4 + chalk: 5.6.2 + get-east-asian-width: 1.5.0 + marked: 15.0.12 + mime-types: 3.0.2 + optionalDependencies: + koffi: 2.15.2 + '@matrix-org/matrix-sdk-crypto-nodejs@0.5.1': dependencies: https-proxy-agent: 7.0.6 @@ -10492,6 +10936,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)': + dependencies: + '@hono/node-server': 1.19.13(hono@4.12.12) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 8.3.1(express@5.2.1) + hono: 4.12.12 + jose: 6.2.2 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.4.3 + zod-to-json-schema: 3.25.1(zod@4.4.3) + transitivePeerDependencies: + - supports-color + '@mozilla/readability@0.6.0': {} '@napi-rs/canvas-android-arm64@0.1.100': @@ -10908,6 +11374,8 @@ snapshots: '@protobufjs/codegen@2.0.4': {} + '@protobufjs/codegen@2.0.5': {} + '@protobufjs/eventemitter@1.1.0': {} '@protobufjs/fetch@1.1.0': @@ -10919,12 +11387,16 @@ snapshots: '@protobufjs/inquire@1.1.0': {} + '@protobufjs/inquire@1.1.1': {} + '@protobufjs/path@1.1.2': {} '@protobufjs/pool@1.1.0': {} '@protobufjs/utf8@1.1.0': {} + '@protobufjs/utf8@1.1.1': {} + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -12210,8 +12682,6 @@ snapshots: dependencies: '@types/node': 25.6.0 - '@types/long@4.0.2': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -12220,8 +12690,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@10.17.60': {} - '@types/node@16.9.1': {} '@types/node@20.19.39': @@ -12459,7 +12927,7 @@ snapshots: '@cacheable/node-cache': 1.7.6 '@hapi/boom': 9.1.4 async-mutex: 0.5.0 - libsignal: '@whiskeysockets/libsignal-node@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67' + libsignal: https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/bcea72df9ec34d9d9140ab30619cf479c7c144c7 lru-cache: 11.2.7 music-metadata: 11.12.3 p-queue: 9.1.0 @@ -12474,11 +12942,6 @@ snapshots: - supports-color - utf-8-validate - '@whiskeysockets/libsignal-node@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67': - dependencies: - curve25519-js: 0.0.4 - protobufjs: 6.8.8 - '@xmldom/xmldom@0.8.11': {} '@zed-industries/codex-acp-darwin-arm64@0.12.0': @@ -13775,16 +14238,26 @@ snapshots: fast-string-truncated-width@1.2.1: {} + fast-string-truncated-width@3.0.3: {} + fast-string-width@1.1.0: dependencies: fast-string-truncated-width: 1.2.1 + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.1.0: {} fast-wrap-ansi@0.1.6: dependencies: fast-string-width: 1.1.0 + fast-wrap-ansi@0.2.0: + dependencies: + fast-string-width: 3.0.2 + fast-xml-builder@1.1.5: dependencies: path-expression-matcher: 1.5.0 @@ -14441,7 +14914,7 @@ snapshots: ipaddr.js@1.9.1: {} - ipaddr.js@2.3.0: {} + ipaddr.js@2.4.0: {} ircv3@0.33.1: dependencies: @@ -14725,6 +15198,11 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + libsignal@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/bcea72df9ec34d9d9140ab30619cf479c7c144c7: + dependencies: + curve25519-js: 0.0.4 + protobufjs: 7.5.8 + lie@3.3.0: dependencies: immediate: 3.0.6 @@ -14797,8 +15275,6 @@ snapshots: loglevel@1.9.2: {} - long@4.0.0: {} - long@5.3.2: {} longest-streak@3.1.0: {} @@ -15339,6 +15815,10 @@ snapshots: dependencies: brace-expansion: 5.0.5 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + minimatch@3.1.5: dependencies: brace-expansion: 1.1.12 @@ -15445,6 +15925,8 @@ snapshots: node-addon-api@1.7.2: optional: true + node-addon-api@8.7.0: {} + node-api-version@0.2.1: dependencies: semver: 7.7.4 @@ -15475,6 +15957,8 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: {} + node-gyp@11.5.0: dependencies: env-paths: 2.2.1 @@ -15574,53 +16058,93 @@ snapshots: ws: 8.20.0 zod: 4.3.6 + openai@6.26.0(ws@8.20.0)(zod@4.4.3): + optionalDependencies: + ws: 8.20.0 + zod: 4.4.3 + openai@6.34.0(ws@8.20.0)(zod@4.3.6): optionalDependencies: ws: 8.20.0 zod: 4.3.6 - openclaw@2026.4.29: + openai@6.37.0(ws@8.20.0)(zod@4.4.3): + optionalDependencies: + ws: 8.20.0 + zod: 4.4.3 + + openclaw@2026.5.7(@types/express@5.0.6)(encoding@0.1.13): dependencies: - '@agentclientprotocol/sdk': 0.21.0(zod@4.3.6) - '@clack/prompts': 1.2.0 + '@agentclientprotocol/sdk': 0.21.0(zod@4.4.3) + '@anthropic-ai/sdk': 0.93.0(zod@4.4.3) + '@anthropic-ai/vertex-sdk': 0.16.0(encoding@0.1.13)(zod@4.4.3) + '@aws-sdk/client-bedrock': 3.1042.0 + '@aws-sdk/client-bedrock-runtime': 3.1042.0 + '@aws-sdk/credential-provider-node': 3.972.39 + '@aws/bedrock-token-generator': 1.1.0 + '@clack/prompts': 1.4.0 + '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) + '@grammyjs/runner': 2.0.3(grammy@1.42.0(encoding@0.1.13)) + '@grammyjs/transformer-throttler': 1.2.1(grammy@1.42.0(encoding@0.1.13)) + '@homebridge/ciao': 1.3.8 '@lydell/node-pty': 1.2.0-beta.12 - '@mariozechner/pi-agent-core': 0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-ai': 0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-coding-agent': 0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-tui': 0.70.6 - '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) + '@mariozechner/pi-agent-core': 0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3) + '@mariozechner/pi-ai': 0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3) + '@mariozechner/pi-coding-agent': 0.73.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.4.3) + '@mariozechner/pi-tui': 0.73.0 + '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) + '@mozilla/readability': 0.6.0 + '@slack/bolt': 4.7.2(@types/express@5.0.6) + '@slack/types': 2.21.0 + '@slack/web-api': 7.15.2 ajv: 8.20.0 chalk: 5.6.2 chokidar: 5.0.0 commander: 14.0.3 croner: 10.0.1 dotenv: 17.4.2 + express: 5.2.1 file-type: 22.0.1 global-agent: 4.1.3 + grammy: 1.42.0(encoding@0.1.13) https-proxy-agent: 9.0.0 - ipaddr.js: 2.3.0 + ipaddr.js: 2.4.0 jiti: 2.6.1 json5: 2.2.3 jszip: 3.10.1 + linkedom: 0.18.12 markdown-it: 14.1.1 - openai: 6.34.0(ws@8.20.0)(zod@4.3.6) + minimatch: 10.2.5 + node-edge-tts: 1.2.10 + openai: 6.37.0(ws@8.20.0)(zod@4.4.3) + openshell: 0.1.0(encoding@0.1.13) + pdfjs-dist: 5.7.284 + playwright-core: 1.59.1 proxy-agent: 8.0.1 qrcode: 1.5.4 - semver: 7.7.4 - sqlite-vec: 0.1.9 tar: 7.5.13 + tokenjuice: 0.7.0 + tree-sitter-bash: 0.25.1 tslog: 4.10.2 - typebox: 1.1.34 - undici: 8.1.0 + typebox: 1.1.37 + undici: 8.2.0 web-push: 3.6.7 + web-tree-sitter: 0.26.8 ws: 8.20.0 - yaml: 2.8.3 - zod: 4.3.6 + yaml: 2.9.0 + zod: 4.4.3 + optionalDependencies: + sqlite-vec: 0.1.9 transitivePeerDependencies: - '@cfworker/json-schema' + - '@types/express' - aws-crt - bufferutil + - canvas + - debug + - encoding - supports-color + - tree-sitter - utf-8-validate openshell@0.1.0(encoding@0.1.13): @@ -15984,22 +16508,6 @@ snapshots: property-information@7.1.0: {} - protobufjs@6.8.8: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/long': 4.0.2 - '@types/node': 10.17.60 - long: 4.0.0 - protobufjs@7.5.4: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -16015,6 +16523,21 @@ snapshots: '@types/node': 25.6.0 long: 5.3.2 + protobufjs@7.5.8: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.1 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.1 + '@types/node': 25.6.0 + long: 5.3.2 + protobufjs@8.0.3: dependencies: '@types/node': 25.6.0 @@ -16947,6 +17470,11 @@ snapshots: dependencies: punycode: 2.3.1 + tree-sitter-bash@0.25.1: + dependencies: + node-addon-api: 8.7.0 + node-gyp-build: 4.8.4 + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -16997,6 +17525,8 @@ snapshots: typebox@1.1.34: {} + typebox@1.1.37: {} + typescript@5.9.3: {} typical@4.0.0: {} @@ -17023,6 +17553,8 @@ snapshots: undici@8.1.0: {} + undici@8.2.0: {} + unhomoglyph@1.0.6: {} unified@11.0.5: @@ -17229,6 +17761,8 @@ snapshots: web-streams-polyfill@3.3.3: {} + web-tree-sitter@0.26.8: {} + webidl-conversions@3.0.1: {} webidl-conversions@8.0.1: {} @@ -17332,6 +17866,8 @@ snapshots: yaml@2.8.3: {} + yaml@2.9.0: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -17402,6 +17938,10 @@ snapshots: dependencies: zod: 4.3.6 + zod-to-json-schema@3.25.1(zod@4.4.3): + dependencies: + zod: 4.4.3 + zod-validation-error@4.0.2(zod@4.3.6): dependencies: zod: 4.3.6 @@ -17410,6 +17950,8 @@ snapshots: zod@4.3.6: {} + zod@4.4.3: {} + zustand@5.0.12(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): optionalDependencies: '@types/react': 19.2.14 diff --git a/scripts/bundle-openclaw.mjs b/scripts/bundle-openclaw.mjs index 77fc40b..9677380 100644 --- a/scripts/bundle-openclaw.mjs +++ b/scripts/bundle-openclaw.mjs @@ -306,6 +306,7 @@ const OPENCLAW_RUNTIME_DEPS_PACKAGES = [ 'semver', 'sharp', 'silk-wasm', + 'socks-proxy-agent', 'sqlite-vec', 'tar', 'tokenjuice', @@ -904,6 +905,17 @@ function findFilesByName(rootDir, matcher) { return matches; } +function findFirstFileByNameContaining(rootDir, matcher, needle) { + for (const filePath of findFilesByName(rootDir, matcher)) { + try { + if (fs.readFileSync(filePath, 'utf8').includes(needle)) return filePath; + } catch { + continue; + } + } + return null; +} + function patchBundledRuntime(outputDir) { const replacePatches = [ { @@ -957,11 +969,17 @@ function patchBundledRuntime(outputDir) { { label: 'main session restart recovery mark boundary', target: () => findFirstFileByName(path.join(outputDir, 'dist'), /^main-session-restart-recovery-.*\.js$/), - search: `\t\t\tif (!interruptedSessionIds.has(entry.sessionId)) continue; + search: `\t\t\tif (!resolveEntryTranscriptLockPaths({ +\t\t\t\tentry, +\t\t\t\tsessionsDir +\t\t\t}).some((lockPath) => interruptedLockPaths.has(lockPath))) continue; \t\t\tentry.abortedLastRun = true; \t\t\tstore[sessionKey] = entry; \t\t\tresult.marked++;`, - replace: `\t\t\tif (!interruptedSessionIds.has(entry.sessionId)) continue; + replace: `\t\t\tif (!resolveEntryTranscriptLockPaths({ +\t\t\t\tentry, +\t\t\t\tsessionsDir +\t\t\t}).some((lockPath) => interruptedLockPaths.has(lockPath))) continue; \t\t\tentry.abortedLastRun = true; \t\t\tif (process.env.OPENCLAW_DISABLE_MAIN_SESSION_RESTART_RECOVERY === "1") { \t\t\t\tentry.status = "failed"; @@ -987,14 +1005,18 @@ function patchBundledRuntime(outputDir) { }, { label: 'stuck session active-run recovery boundary', - target: () => findFirstFileByName(path.join(outputDir, 'dist'), /^diagnostic-.*\.js$/), - search: `\t\t\t\t(opts?.recoverStuckSession ?? recoverStuckSession)({ + target: () => findFirstFileByNameContaining( + path.join(outputDir, 'dist'), + /^diagnostic-.*\.js$/, + 'classification?.recoveryEligible', + ), + search: `\t\t\t\tif (classification?.recoveryEligible) (opts?.recoverStuckSession ?? recoverStuckSession)({ \t\t\t\t\tsessionId: state.sessionId, \t\t\t\t\tsessionKey: state.sessionKey, \t\t\t\t\tageMs, \t\t\t\t\tqueueDepth: state.queueDepth \t\t\t\t});`, - replace: `\t\t\t\t(opts?.recoverStuckSession ?? recoverStuckSession)({ + replace: `\t\t\t\tif (classification?.recoveryEligible) (opts?.recoverStuckSession ?? recoverStuckSession)({ \t\t\t\t\tsessionId: state.sessionId, \t\t\t\t\tsessionKey: state.sessionKey, \t\t\t\t\tageMs, @@ -1019,6 +1041,9 @@ function patchBundledRuntime(outputDir) { } const current = fs.readFileSync(target, 'utf8'); + if (current.includes(patch.replace)) { + continue; + } if (!current.includes(patch.search)) { echo` ⚠️ Skipped patch for ${patch.label}: expected source snippet not found`; continue; @@ -1075,6 +1100,10 @@ function patchBundledRuntime(outputDir) { let matchedAny = false; for (const target of ptyTargets) { const current = fs.readFileSync(target, 'utf8'); + if (current.includes(patch.replace)) { + matchedAny = true; + continue; + } if (!current.includes(patch.search)) continue; matchedAny = true; const next = current.replaceAll(patch.search, patch.replace); @@ -1173,6 +1202,10 @@ function patchBundledRuntime(outputDir) { if (!file.endsWith('.js')) continue; const filePath = path.join(distDir, file); const content = fs.readFileSync(filePath, 'utf8'); + if (content.includes(patch.replace)) { + matchedAny = true; + continue; + } if (!content.includes(patch.search)) continue; matchedAny = true; const next = content.replace(patch.search, patch.replace); diff --git a/src/components/channels/ChannelConfigModal.tsx b/src/components/channels/ChannelConfigModal.tsx index 9f844a3..bdd2bbe 100644 --- a/src/components/channels/ChannelConfigModal.tsx +++ b/src/components/channels/ChannelConfigModal.tsx @@ -273,7 +273,10 @@ export function ChannelConfigModal({ const err = typeof args[0] === 'string' ? args[0] : String((args[0] as { message?: string } | undefined)?.message || args[0]); - toast.error(translateRef.current('toast.qrFailed', { name: CHANNEL_NAMES[channelType], error: err })); + const errorText = channelType === 'whatsapp' && /websocket|network|proxy/i.test(err) + ? translateRef.current('toast.whatsappNetworkHint', { error: err }) + : translateRef.current('toast.qrFailed', { name: CHANNEL_NAMES[channelType], error: err }); + toast.error(errorText); setQrCode(null); setConnecting(false); }; @@ -370,10 +373,13 @@ export function ChannelConfigModal({ } if (meta.connectionType === 'qr') { - await hostApiFetch(`/api/channels/${encodeURIComponent(selectedType)}/start`, { + const startResult = await hostApiFetch<{ success?: boolean; error?: string }>(`/api/channels/${encodeURIComponent(selectedType)}/start`, { method: 'POST', body: JSON.stringify(resolvedAccountId ? { accountId: resolvedAccountId } : {}), }); + if (!startResult?.success) { + throw new Error(startResult?.error || 'Failed to start QR login'); + } return; } diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index 9445aee..1cffaf5 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -39,6 +39,7 @@ import type { CronJob } from '@/types/cron'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { ConfirmDialog } from '@/components/ui/confirm-dialog'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { hostApiFetch } from '@/lib/host-api'; import { useTranslation } from 'react-i18next'; import logoSvg from '@/assets/logo.svg'; @@ -123,8 +124,22 @@ const sidebarItemActive = [ 'dark:border-white/10 dark:bg-white/10 dark:text-blue-100 dark:ring-white/10', ].join(' '); -function NavItem({ to, icon, label, badge, collapsed, onClick, testId, inset }: NavItemProps) { +function SidebarTooltip({ label, children, enabled = true }: { label: string; children: React.ReactElement; enabled?: boolean }) { + if (!enabled) return children; return ( + + + {children} + + + {label} + + + ); +} + +function NavItem({ to, icon, label, badge, collapsed, onClick, testId, inset }: NavItemProps) { + const link = ( ); + + return ( + + {link} + + ); } function getSessionBucket(activityMs: number, nowMs: number): SessionBucketKey { @@ -634,6 +655,7 @@ export function Sidebar() { }; return ( + <> )} + ); } diff --git a/src/i18n/locales/en/channels.json b/src/i18n/locales/en/channels.json index 6f603e6..2b97c19 100644 --- a/src/i18n/locales/en/channels.json +++ b/src/i18n/locales/en/channels.json @@ -24,6 +24,7 @@ "whatsappFailed": "WhatsApp connection failed: {{error}}", "qrConnected": "{{name}} connected successfully", "qrFailed": "{{name}} connection failed: {{error}}", + "whatsappNetworkHint": "Could not connect to WhatsApp WebSocket. Check network connectivity or enable a proxy in Advanced Settings. {{error}}", "channelSaved": "Channel {{name}} saved", "channelConnecting": "Connecting to {{name}}...", "savedButRefreshFailed": "Configuration was saved, but refreshing page data failed. Please refresh manually.", diff --git a/src/i18n/locales/ja/channels.json b/src/i18n/locales/ja/channels.json index 3cb80ca..7ea8fbb 100644 --- a/src/i18n/locales/ja/channels.json +++ b/src/i18n/locales/ja/channels.json @@ -24,6 +24,7 @@ "whatsappFailed": "WhatsApp 接続に失敗しました: {{error}}", "qrConnected": "{{name}} が正常に接続されました", "qrFailed": "{{name}} の接続に失敗しました: {{error}}", + "whatsappNetworkHint": "WhatsApp WebSocket に接続できません。ネットワークを確認するか、詳細設定でプロキシを有効にしてください。{{error}}", "channelSaved": "チャンネル {{name}} が保存されました", "channelConnecting": "{{name}} に接続中...", "savedButRefreshFailed": "設定は保存されましたが、画面データの更新に失敗しました。手動で再読み込みしてください。", diff --git a/src/i18n/locales/ru/channels.json b/src/i18n/locales/ru/channels.json index a8bd7e9..e63a082 100644 --- a/src/i18n/locales/ru/channels.json +++ b/src/i18n/locales/ru/channels.json @@ -24,6 +24,7 @@ "whatsappFailed": "Не удалось подключить WhatsApp: {{error}}", "qrConnected": "{{name}} успешно подключён", "qrFailed": "Не удалось подключить {{name}}: {{error}}", + "whatsappNetworkHint": "Не удалось подключиться к WhatsApp WebSocket. Проверьте сеть или включите прокси в расширенных настройках. {{error}}", "channelSaved": "Канал {{name}} сохранён", "channelConnecting": "Подключение к {{name}}...", "savedButRefreshFailed": "Конфигурация сохранена, но обновление данных страницы не удалось. Пожалуйста, обновите вручную.", diff --git a/src/i18n/locales/zh/channels.json b/src/i18n/locales/zh/channels.json index f9e4d5d..ac7cc48 100644 --- a/src/i18n/locales/zh/channels.json +++ b/src/i18n/locales/zh/channels.json @@ -24,6 +24,7 @@ "whatsappFailed": "WhatsApp 连接失败: {{error}}", "qrConnected": "{{name}} 连接成功", "qrFailed": "{{name}} 连接失败: {{error}}", + "whatsappNetworkHint": "无法连接 WhatsApp WebSocket。请检查网络,或在高级设置中开启代理。{{error}}", "channelSaved": "频道 {{name}} 已保存", "channelConnecting": "正在连接 {{name}}...", "savedButRefreshFailed": "配置已保存,但刷新页面数据失败,请手动刷新查看最新状态", diff --git a/src/lib/host-api.ts b/src/lib/host-api.ts index 1ffd788..de98efe 100644 --- a/src/lib/host-api.ts +++ b/src/lib/host-api.ts @@ -89,6 +89,14 @@ function parseUnifiedProxyResponse( } const data: HostApiProxyData = response.data ?? {}; + if (data.ok === false) { + const message = data.text + || (typeof data.json === 'object' && data.json != null && 'error' in (data.json as Record) + ? String((data.json as Record).error) + : `HTTP ${data.status ?? 'unknown'}`); + throw new Error(message); + } + trackUiEvent('hostapi.fetch', { path, method, diff --git a/src/pages/AppCenter/index.tsx b/src/pages/AppCenter/index.tsx index 36c46b0..b87ab46 100644 --- a/src/pages/AppCenter/index.tsx +++ b/src/pages/AppCenter/index.tsx @@ -32,9 +32,7 @@ export function AppCenter() { const init = useAppCenterStore((state) => state.init); const items = useAppCenterStore((state) => state.items); const selectedTagKey = useAppCenterStore((state) => state.selectedTagKey); - const selectedItemId = useAppCenterStore((state) => state.selectedItemId); const selectTag = useAppCenterStore((state) => state.selectTag); - const selectItem = useAppCenterStore((state) => state.selectItem); useEffect(() => { init(); @@ -127,13 +125,12 @@ export function AppCenter() {
{filteredItems.map((item) => { const Icon = getAppIcon(item.icon); - const isSelected = selectedItemId === item.id; return (