From 0abc48189c319d0c7d0dbc5f42bf839792eb1d86 Mon Sep 17 00:00:00 2001 From: inman Date: Thu, 7 May 2026 21:49:20 +0800 Subject: [PATCH] feat: prepare Zhinian desktop pilot --- electron-builder.yml | 3 + electron/api/routes/apps.ts | 26 + electron/api/routes/channels.ts | 28 +- electron/api/routes/diagnostics.ts | 13 + electron/api/routes/gateway.ts | 2 +- electron/api/routes/knowledge.ts | 39 +- electron/api/server.ts | 2 + electron/gateway/config-sync.ts | 48 +- electron/gateway/manager.ts | 8 +- electron/gateway/runtime-deps.ts | 659 +++ electron/gateway/supervisor.ts | 8 + electron/main/index.ts | 2 + electron/main/ipc-handlers.ts | 60 +- electron/utils/channel-config.ts | 9 + electron/utils/config.ts | 2 +- electron/utils/model-diagnostics.ts | 492 ++ electron/utils/nianxx-play-service.ts | 431 ++ electron/utils/openclaw-auth.ts | 167 +- electron/utils/openclaw-cli.ts | 11 +- electron/utils/optional-native-cleanup.ts | 74 + electron/utils/paths.ts | 51 +- electron/utils/plugin-install.ts | 39 +- electron/utils/yinian-initializer.ts | 33 + lefthook.yml | 42 + package.json | 125 +- pnpm-lock.yaml | 4993 +++++++++++++++-- resources/skills/preinstalled-manifest.json | 8 - scripts/after-pack.cjs | 61 +- scripts/bundle-openclaw-plugins.mjs | 13 +- scripts/bundle-openclaw.mjs | 331 +- scripts/download-bundled-node.mjs | 88 +- scripts/download-bundled-uv.mjs | 64 +- scripts/patch-browser-hint.mjs | 91 +- scripts/prepare-nianxx-play-bundle.mjs | 299 + shared/yinian.ts | 20 + src/App.tsx | 150 +- .../channels/ChannelConfigModal.tsx | 18 +- src/components/layout/MainLayout.tsx | 4 +- src/components/layout/Sidebar.tsx | 694 ++- src/components/layout/TitleBar.tsx | 4 +- src/components/ui/button.tsx | 14 +- src/components/ui/input.tsx | 2 +- src/components/ui/tabs.tsx | 4 +- src/components/ui/textarea.tsx | 2 +- src/components/yinian/ui.tsx | 12 +- src/i18n/index.ts | 6 +- src/i18n/locales/en/app-center.json | 72 + src/i18n/locales/en/chat.json | 16 +- src/i18n/locales/en/common.json | 16 +- src/i18n/locales/en/dashboard.json | 66 +- src/i18n/locales/en/settings.json | 18 + src/i18n/locales/en/setup.json | 6 +- src/i18n/locales/en/skills.json | 119 +- src/i18n/locales/ja/chat.json | 8 +- src/i18n/locales/ja/common.json | 15 +- src/i18n/locales/ru/chat.json | 8 +- src/i18n/locales/ru/common.json | 13 + src/i18n/locales/zh/app-center.json | 72 + src/i18n/locales/zh/chat.json | 16 +- src/i18n/locales/zh/common.json | 16 +- src/i18n/locales/zh/dashboard.json | 66 +- src/i18n/locales/zh/settings.json | 18 + src/i18n/locales/zh/setup.json | 6 +- src/i18n/locales/zh/skills.json | 119 +- src/pages/AppCenter/index.tsx | 163 + src/pages/Channels/index.tsx | 24 +- src/pages/Chat/ChatInput.tsx | 188 +- src/pages/Chat/ChatMessage.tsx | 10 +- src/pages/Chat/index.tsx | 20 +- src/pages/Chat/task-visualization.ts | 23 +- src/pages/Cron/index.tsx | 36 +- src/pages/Knowledge/index.tsx | 51 +- src/pages/NianxxPlay/index.tsx | 243 + src/pages/Settings/index.tsx | 256 +- src/pages/Setup/index.tsx | 22 +- src/pages/Skills/index.tsx | 2 +- src/pages/Today/index.tsx | 817 ++- src/pages/YinianLogin/index.tsx | 6 +- src/pages/YinianSkills/index.tsx | 192 +- src/stores/app-center.ts | 43 + src/stores/chat.ts | 58 +- src/stores/chat/helpers.ts | 11 +- src/stores/chat/runtime-event-handlers.ts | 9 +- src/stores/chat/runtime-send-actions.ts | 47 +- src/stores/chat/session-actions.ts | 7 +- src/stores/chat/types.ts | 13 +- src/stores/gateway.ts | 54 +- src/stores/quick-tasks.ts | 113 + src/styles/globals.css | 71 +- src/types/app-center.ts | 23 + src/vite-env.d.ts | 11 + .../unit/chat-internal-message-filter.test.ts | 12 + tests/unit/chat-session-actions.test.ts | 7 +- tests/unit/gateway-events.test.ts | 89 + tests/unit/gateway-manager-heartbeat.test.ts | 16 +- tests/unit/language-detection.test.ts | 2 +- tests/unit/model-diagnostics.test.ts | 129 + tests/unit/openclaw-auth.test.ts | 72 +- tests/unit/optional-native-cleanup.test.ts | 36 + tests/unit/task-visualization.test.ts | 36 +- tests/unit/today-page.test.tsx | 113 +- tests/unit/yinian-skills-page.test.tsx | 71 +- vite.config.ts | 6 +- 103 files changed, 10975 insertions(+), 2049 deletions(-) create mode 100644 electron/api/routes/apps.ts create mode 100644 electron/gateway/runtime-deps.ts create mode 100644 electron/utils/model-diagnostics.ts create mode 100644 electron/utils/nianxx-play-service.ts create mode 100644 electron/utils/optional-native-cleanup.ts create mode 100644 lefthook.yml create mode 100644 scripts/prepare-nianxx-play-bundle.mjs create mode 100644 src/i18n/locales/en/app-center.json create mode 100644 src/i18n/locales/zh/app-center.json create mode 100644 src/pages/AppCenter/index.tsx create mode 100644 src/pages/NianxxPlay/index.tsx create mode 100644 src/stores/app-center.ts create mode 100644 src/stores/quick-tasks.ts create mode 100644 src/types/app-center.ts create mode 100644 tests/unit/model-diagnostics.test.ts create mode 100644 tests/unit/optional-native-cleanup.test.ts diff --git a/electron-builder.yml b/electron-builder.yml index 77664f3..7b7afa5 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -29,6 +29,9 @@ extraResources: # Pre-bundled third-party skills (full directories, not only SKILL.md) - from: build/preinstalled-skills/ to: resources/preinstalled-skills/ + # Built-in application center apps. + - from: build/apps/nianxx-play/ + to: resources/nianxx-play/ # NOTE: OpenClaw plugin mirrors (dingtalk, etc.) are bundled by the # afterPack hook (after-pack.cjs) directly from node_modules, so they # don't need an extraResources entry here. diff --git a/electron/api/routes/apps.ts b/electron/api/routes/apps.ts new file mode 100644 index 0000000..1769847 --- /dev/null +++ b/electron/api/routes/apps.ts @@ -0,0 +1,26 @@ +import type { IncomingMessage, ServerResponse } from 'http'; +import type { HostApiContext } from '../context'; +import { sendJson } from '../route-utils'; +import { + ensureNianxxPlayServiceStarted, + getNianxxPlayServiceStatus, +} from '../../utils/nianxx-play-service'; + +export async function handleAppIntegrationRoutes( + req: IncomingMessage, + res: ServerResponse, + url: URL, + _ctx: HostApiContext, +): Promise { + if (url.pathname === '/api/apps/nianxx-play/status' && req.method === 'GET') { + sendJson(res, 200, await getNianxxPlayServiceStatus()); + return true; + } + + if (url.pathname === '/api/apps/nianxx-play/start' && req.method === 'POST') { + sendJson(res, 200, await ensureNianxxPlayServiceStarted()); + return true; + } + + return false; +} diff --git a/electron/api/routes/channels.ts b/electron/api/routes/channels.ts index b0ab645..e930fda 100644 --- a/electron/api/routes/channels.ts +++ b/electron/api/routes/channels.ts @@ -27,10 +27,7 @@ import { listAgentsSnapshotFromConfig, } from '../../utils/agent-config'; import { - ensureDingTalkPluginInstalled, - ensureFeishuPluginInstalled, ensureWeChatPluginInstalled, - ensureWeComPluginInstalled, } from '../../utils/plugin-install'; import { computeChannelRuntimeStatus, @@ -83,6 +80,7 @@ import type { HostApiContext } from '../context'; import { parseJsonBody, sendJson } from '../route-utils'; const WECHAT_QR_TIMEOUT_MS = 8 * 60 * 1000; +const DISABLED_PLUGIN_CHANNEL_TYPES = new Set(['dingtalk', 'wecom', 'feishu']); const activeQrLogins = new Map(); interface WebLoginStartResult { @@ -1559,27 +1557,9 @@ export async function handleChannelRoutes( return true; } const storedChannelType = resolveStoredChannelType(body.channelType); - if (storedChannelType === 'dingtalk') { - const installResult = await ensureDingTalkPluginInstalled(); - if (!installResult.installed) { - sendJson(res, 500, { success: false, error: installResult.warning || 'DingTalk plugin install failed' }); - return true; - } - } - if (storedChannelType === 'wecom') { - const installResult = await ensureWeComPluginInstalled(); - if (!installResult.installed) { - sendJson(res, 500, { success: false, error: installResult.warning || 'WeCom plugin install failed' }); - return true; - } - } - // QQBot is a built-in channel since OpenClaw 3.31 — no plugin install needed - if (storedChannelType === 'feishu') { - const installResult = await ensureFeishuPluginInstalled(); - if (!installResult.installed) { - sendJson(res, 500, { success: false, error: installResult.warning || 'Feishu plugin install failed' }); - return true; - } + if (DISABLED_PLUGIN_CHANNEL_TYPES.has(storedChannelType)) { + sendJson(res, 400, { success: false, error: '当前内测版本未启用该渠道' }); + return true; } if (storedChannelType === OPENCLAW_WECHAT_CHANNEL_TYPE) { const installResult = await ensureWeChatPluginInstalled(); diff --git a/electron/api/routes/diagnostics.ts b/electron/api/routes/diagnostics.ts index 268e4ec..ae90f3f 100644 --- a/electron/api/routes/diagnostics.ts +++ b/electron/api/routes/diagnostics.ts @@ -4,6 +4,7 @@ import type { IncomingMessage, ServerResponse } from 'http'; import { logger } from '../../utils/logger'; import { getOpenClawConfigDir } from '../../utils/paths'; import { buildGatewayHealthSummary } from '../../utils/gateway-health'; +import { buildYinianModelConfigDiagnostics, ensureYinianModelRuntimeConfigured } from '../../utils/model-diagnostics'; import type { HostApiContext } from '../context'; import { sendJson } from '../route-utils'; import { buildChannelAccountsView, getChannelStatusDiagnostics } from './channels'; @@ -82,5 +83,17 @@ export async function handleDiagnosticsRoutes( return true; } + if (url.pathname === '/api/diagnostics/model-config' && req.method === 'GET') { + try { + if (url.searchParams.get('repair') === '1') { + await ensureYinianModelRuntimeConfigured(); + } + sendJson(res, 200, await buildYinianModelConfigDiagnostics()); + } catch (error) { + sendJson(res, 500, { success: false, error: String(error) }); + } + return true; + } + return false; } diff --git a/electron/api/routes/gateway.ts b/electron/api/routes/gateway.ts index 4f00dbc..1c5468f 100644 --- a/electron/api/routes/gateway.ts +++ b/electron/api/routes/gateway.ts @@ -118,7 +118,7 @@ export async function handleGatewayRoutes( if (imageAttachments.length > 0) { rpcParams.attachments = imageAttachments; } - const result = await ctx.gatewayManager.rpc('chat.send', rpcParams, 120000); + const result = await ctx.gatewayManager.rpc('chat.send', rpcParams, 330000); sendJson(res, 200, { success: true, result }); } catch (error) { sendJson(res, 500, { success: false, error: String(error) }); diff --git a/electron/api/routes/knowledge.ts b/electron/api/routes/knowledge.ts index f2a0193..85f78e9 100644 --- a/electron/api/routes/knowledge.ts +++ b/electron/api/routes/knowledge.ts @@ -1,7 +1,7 @@ import type { IncomingMessage, ServerResponse } from 'node:http'; import crypto from 'node:crypto'; import { basename, extname, join } from 'node:path'; -import { mkdir, readFile, stat, writeFile, copyFile } from 'node:fs/promises'; +import { mkdir, readFile, stat, writeFile, copyFile, rm } from 'node:fs/promises'; import type { HostApiContext } from '../context'; import { parseJsonBody, sendJson } from '../route-utils'; import { getDataDir } from '../../utils/paths'; @@ -225,6 +225,27 @@ export async function buildKnowledgeContext(params: { }; } +async function deleteKnowledgeDocument(params: { + workspaceId?: string; + documentId: string; +}): Promise<{ deleted: KnowledgeDocument | null }> { + const workspaceId = sanitizeWorkspaceId(params.workspaceId); + const documentId = params.documentId.trim(); + if (!documentId) return { deleted: null }; + + const registry = await readRegistry(workspaceId); + const target = registry.find((doc) => doc.id === documentId); + if (!target) return { deleted: null }; + + await Promise.all([ + target.storedPath ? rm(target.storedPath, { force: true }).catch(() => undefined) : Promise.resolve(), + target.textPath ? rm(target.textPath, { force: true }).catch(() => undefined) : Promise.resolve(), + ]); + await writeRegistry(workspaceId, registry.filter((doc) => doc.id !== documentId)); + + return { deleted: target }; +} + export async function handleKnowledgeRoutes( req: IncomingMessage, res: ServerResponse, @@ -238,6 +259,22 @@ export async function handleKnowledgeRoutes( return true; } + if (url.pathname.startsWith('/api/knowledge/files/') && req.method === 'DELETE') { + try { + const documentId = decodeURIComponent(url.pathname.slice('/api/knowledge/files/'.length)); + const workspaceId = sanitizeWorkspaceId(url.searchParams.get('workspaceId') ?? undefined); + const result = await deleteKnowledgeDocument({ workspaceId, documentId }); + if (!result.deleted) { + sendJson(res, 404, { success: false, error: 'Knowledge document not found' }); + return true; + } + sendJson(res, 200, { success: true, document: result.deleted }); + } catch (error) { + sendJson(res, 500, { success: false, error: String(error) }); + } + return true; + } + if (url.pathname === '/api/knowledge/import-paths' && req.method === 'POST') { try { const body = await parseJsonBody<{ workspaceId?: string; filePaths?: string[] }>(req); diff --git a/electron/api/server.ts b/electron/api/server.ts index f1901ef..213de4a 100644 --- a/electron/api/server.ts +++ b/electron/api/server.ts @@ -5,6 +5,7 @@ import { logger } from '../utils/logger'; import { extensionRegistry } from '../extensions/registry'; import type { HostApiContext } from './context'; import { handleAppRoutes } from './routes/app'; +import { handleAppIntegrationRoutes } from './routes/apps'; import { handleGatewayRoutes } from './routes/gateway'; import { handleSettingsRoutes } from './routes/settings'; import { handleProviderRoutes } from './routes/providers'; @@ -29,6 +30,7 @@ type RouteHandler = ( const coreRouteHandlers: RouteHandler[] = [ handleAppRoutes, + handleAppIntegrationRoutes, handleGatewayRoutes, handleSettingsRoutes, handleProviderRoutes, diff --git a/electron/gateway/config-sync.ts b/electron/gateway/config-sync.ts index 1caf7ff..dc41b55 100644 --- a/electron/gateway/config-sync.ts +++ b/electron/gateway/config-sync.ts @@ -18,7 +18,7 @@ function fsPath(filePath: string): string { import { getAllSettings } from '../utils/store'; import { getApiKey, getDefaultProvider, getProvider } from '../utils/secure-storage'; import { getProviderEnvVar, getKeyableProviderTypes } from '../utils/provider-registry'; -import { getOpenClawDir, getOpenClawEntryPath, isOpenClawPresent } from '../utils/paths'; +import { getOpenClawResolvedDir, isOpenClawPresent } from '../utils/paths'; import { getUvMirrorEnv } from '../utils/uv-env'; import { cleanupDanglingWeChatPluginState, listConfiguredChannelsFromConfig, readOpenClawConfig, writeOpenClawConfig, type ChannelConfigData } from '../utils/channel-config'; import { sanitizeOpenClawConfig, batchSyncConfigFields } from '../utils/openclaw-auth'; @@ -28,6 +28,8 @@ import { logger } from '../utils/logger'; import { prependPathEntry } from '../utils/env-path'; import { copyPluginFromNodeModules, ensureCloudSyncPluginInstalled, fixupPluginManifest, cpSyncSafe } from '../utils/plugin-install'; import { stripSystemdSupervisorEnv } from './config-sync-env'; +import { ensureYinianModelRuntimeConfigured } from '../utils/model-diagnostics'; +import { cleanupOpenClawUserNativeClipboard } from '../utils/optional-native-cleanup'; export interface GatewayLaunchContext { @@ -46,12 +48,9 @@ export interface GatewayLaunchContext { // ── Auto-upgrade bundled plugins on startup ────────────────────── const CHANNEL_PLUGIN_MAP: Record = { - dingtalk: { dirName: 'dingtalk', npmName: '@soimy/dingtalk' }, - wecom: { dirName: 'wecom', npmName: '@wecom/wecom-openclaw-plugin' }, - feishu: { dirName: 'feishu-openclaw-plugin', npmName: '@larksuite/openclaw-lark' }, - 'openclaw-weixin': { dirName: 'openclaw-weixin', npmName: '@tencent-weixin/openclaw-weixin' }, }; +const REMOVED_CHANNEL_PLUGIN_DIRS = ['dingtalk', 'wecom', 'feishu-openclaw-plugin']; /** * OpenClaw 3.22+ ships Discord, Telegram, and other channels as built-in @@ -239,6 +238,17 @@ function ensureConfiguredPluginsUpgraded(configuredChannels: string[]): void { function cleanupUnconfiguredChannelPlugins(configuredChannels: string[]): void { const configuredSet = new Set(configuredChannels); + for (const dirName of REMOVED_CHANNEL_PLUGIN_DIRS) { + const targetDir = join(homedir(), '.openclaw', 'extensions', dirName); + if (!existsSync(fsPath(targetDir))) continue; + logger.info(`[plugin] Removing disabled channel plugin: ${dirName}`); + try { + rmSync(fsPath(targetDir), { recursive: true, force: true }); + } catch (err) { + logger.warn(`[plugin] Failed to remove disabled channel plugin ${dirName}:`, err); + } + } + for (const [channelType, pluginInfo] of Object.entries(CHANNEL_PLUGIN_MAP)) { if (configuredSet.has(channelType)) continue; @@ -347,6 +357,15 @@ export async function syncGatewayConfigBeforeLaunch( // node_modules linked on the next Gateway spawn. resetExtensionDepsLinked(); + try { + const removedClipboardPackages = cleanupOpenClawUserNativeClipboard(); + if (removedClipboardPackages > 0) { + logger.info(`[plugin] Removed optional native clipboard packages from user OpenClaw directories (${removedClipboardPackages})`); + } + } catch (err) { + logger.warn('Failed to clean optional native clipboard packages:', err); + } + await syncProxyConfigToOpenClaw(appSettings, { preserveExistingWhenDisabled: true }); try { @@ -395,6 +414,12 @@ export async function syncGatewayConfigBeforeLaunch( } catch (err) { logger.warn('Failed to batch-sync config fields to openclaw.json:', err); } + + try { + await ensureYinianModelRuntimeConfigured(); + } catch (err) { + logger.warn('Failed to configure Yinian model runtime defaults before launch:', err); + } } async function loadProviderEnv(): Promise<{ providerEnv: Record; loadedProviderKeyCount: number }> { @@ -466,8 +491,8 @@ async function resolveChannelStartupPolicy(): Promise<{ } export async function prepareGatewayLaunchContext(port: number): Promise { - const openclawDir = getOpenClawDir(); - const entryScript = getOpenClawEntryPath(); + const openclawDir = getOpenClawResolvedDir(); + const entryScript = join(openclawDir, 'openclaw.mjs'); if (!isOpenClawPresent()) { throw new Error(`OpenClaw package not found at: ${openclawDir}`); @@ -490,6 +515,14 @@ export async function prepareGatewayLaunchContext(port: number): Promise { const launchContext = await prepareGatewayLaunchContext(this.status.port); + await ensureOpenClawRuntimeDepsReady(launchContext); await unloadLaunchctlGatewayService(); this.processExitCode = null; diff --git a/electron/gateway/runtime-deps.ts b/electron/gateway/runtime-deps.ts new file mode 100644 index 0000000..c7df3ed --- /dev/null +++ b/electron/gateway/runtime-deps.ts @@ -0,0 +1,659 @@ +import { spawn } from 'node:child_process'; +import { + existsSync, + mkdirSync, + readFileSync, + readdirSync, + renameSync, + rmSync, + symlinkSync, + writeFileSync, +} from 'node:fs'; +import { createRequire } from 'node:module'; +import path from 'node:path'; +import type { GatewayLaunchContext } from './config-sync'; +import { logger } from '../utils/logger'; + +const DEFAULT_RUNTIME_DEPS_PREFLIGHT_TIMEOUT_MS = 10 * 60_000; +const MAX_CAPTURED_OUTPUT_LENGTH = 16_000; +const OPENCLAW_BUNDLED_RUNTIME_DEPENDENCY_NAMES = [ + '@agentclientprotocol/claude-agent-acp', + '@agentclientprotocol/sdk', + '@anthropic-ai/sdk', + '@anthropic-ai/vertex-sdk', + '@aws-sdk/client-bedrock', + '@aws-sdk/client-bedrock-runtime', + '@aws-sdk/client-s3', + '@aws-sdk/credential-provider-node', + '@aws-sdk/s3-request-presigner', + '@aws/bedrock-token-generator', + '@azure/identity', + '@clack/prompts', + '@clawdbot/lobster', + '@discordjs/voice', + '@google/genai', + '@grammyjs/runner', + '@grammyjs/transformer-throttler', + '@homebridge/ciao', + '@lancedb/lancedb', + '@larksuiteoapi/node-sdk', + '@line/bot-sdk', + '@lydell/node-pty', + '@mariozechner/pi-agent-core', + '@mariozechner/pi-ai', + '@mariozechner/pi-coding-agent', + '@matrix-org/matrix-sdk-crypto-nodejs', + '@matrix-org/matrix-sdk-crypto-wasm', + '@microsoft/teams.api', + '@microsoft/teams.apps', + '@modelcontextprotocol/sdk', + '@mozilla/readability', + '@openai/codex', + '@opentelemetry/api', + '@opentelemetry/api-logs', + '@opentelemetry/exporter-logs-otlp-proto', + '@opentelemetry/exporter-metrics-otlp-proto', + '@opentelemetry/exporter-trace-otlp-proto', + '@opentelemetry/resources', + '@opentelemetry/sdk-logs', + '@opentelemetry/sdk-metrics', + '@opentelemetry/sdk-node', + '@opentelemetry/sdk-trace-base', + '@opentelemetry/semantic-conventions', + '@pierre/diffs', + '@pierre/theme', + '@slack/bolt', + '@slack/web-api', + '@tencent-connect/qqbot-connector', + '@tloncorp/tlon-skill', + '@twurple/api', + '@twurple/auth', + '@twurple/chat', + '@urbit/aura', + '@whiskeysockets/baileys', + '@zed-industries/codex-acp', + 'acpx', + 'ajv', + 'chokidar', + 'commander', + 'croner', + 'discord-api-types', + 'dotenv', + 'express', + 'fake-indexeddb', + 'gaxios', + 'global-agent', + 'google-auth-library', + 'grammy', + 'https-proxy-agent', + 'jimp', + 'jiti', + 'json5', + 'jsonwebtoken', + 'jszip', + 'jwks-rsa', + 'linkedom', + 'markdown-it', + 'matrix-js-sdk', + 'minimatch', + 'mpg123-decoder', + 'music-metadata', + 'node-edge-tts', + 'nostr-tools', + 'openai', + 'openshell', + 'opusscript', + 'pdfjs-dist', + 'playwright-core', + 'semver', + 'sharp', + 'silk-wasm', + 'sqlite-vec', + 'tar', + 'tokenjuice', + 'tslog', + 'typebox', + 'undici', + 'web-push', + 'ws', + 'yaml', + 'zca-js', + 'zod', +] as const; + +const preflightPromises = new Map>(); + +interface OpenClawRuntimeDepsReport { + installRoot?: string; + deps?: Array<{ name?: unknown; version?: unknown }>; + missing?: unknown[]; + repairedSpecs?: unknown[]; +} + +function appendOutput(current: string, chunk: Buffer): string { + const next = current + chunk.toString('utf8'); + if (next.length <= MAX_CAPTURED_OUTPUT_LENGTH) return next; + return next.slice(next.length - MAX_CAPTURED_OUTPUT_LENGTH); +} + +function resolveNodeRunner(launchContext: GatewayLaunchContext): { + command: string; + env: Record; +} { + const bundledNodePath = launchContext.forkEnv.YINIAN_NODE_EXEC_PATH; + if (bundledNodePath && existsSync(bundledNodePath)) { + return { + command: bundledNodePath, + env: { ...launchContext.forkEnv }, + }; + } + + return { + command: process.execPath, + env: { + ...launchContext.forkEnv, + ELECTRON_RUN_AS_NODE: '1', + }, + }; +} + +async function runRuntimeDepsRepair( + launchContext: GatewayLaunchContext, + timeoutMs = DEFAULT_RUNTIME_DEPS_PREFLIGHT_TIMEOUT_MS, +): Promise { + const inspected = await runPluginsDepsCommand(launchContext, [ + 'plugins', + 'deps', + '--json', + '--package-root', + launchContext.openclawDir, + ], timeoutMs); + + const removedStaleRoot = maybeRemoveStaleInstallRoot(launchContext, inspected.report); + const missingBefore = Array.isArray(inspected.report.missing) ? inspected.report.missing.length : 0; + const shouldRepair = removedStaleRoot || missingBefore > 0; + + let finalReport = inspected.report; + let localMaterialized = false; + if (shouldRepair) { + localMaterialized = tryMaterializeRuntimeDepsFromLocalPackages(launchContext, inspected.report); + finalReport = (await runPluginsDepsCommand(launchContext, [ + 'plugins', + 'deps', + '--json', + '--package-root', + launchContext.openclawDir, + ], timeoutMs)).report; + + const missingAfterLocal = Array.isArray(finalReport.missing) ? finalReport.missing.length : 0; + if (missingAfterLocal > 0 || !localMaterialized) { + finalReport = (await runPluginsDepsCommand(launchContext, [ + 'plugins', + 'deps', + '--repair', + '--json', + '--package-root', + launchContext.openclawDir, + ], timeoutMs)).report; + } + } + + const missingAfter = Array.isArray(finalReport.missing) ? finalReport.missing.length : 0; + const repairedCount = Array.isArray(finalReport.repairedSpecs) ? finalReport.repairedSpecs.length : 0; + if (missingAfter > 0) { + throw new Error(`OpenClaw runtime dependency preflight still has ${missingAfter} missing dependency/dependencies after repair`); + } + + logger.info(`[plugins] OpenClaw runtime dependency preflight complete (missing=${missingAfter}, repaired=${repairedCount}, reset=${removedStaleRoot ? 'yes' : 'no'}, local=${localMaterialized ? 'yes' : 'no'})`); +} + +function runPluginsDepsCommand( + launchContext: GatewayLaunchContext, + args: string[], + timeoutMs: number, +): Promise<{ report: OpenClawRuntimeDepsReport; stdout: string; stderr: string }> { + const runner = resolveNodeRunner(launchContext); + const commandArgs = [launchContext.entryScript, ...args]; + + logger.info(`[plugins] Checking OpenClaw runtime dependencies before Gateway start (packageRoot=${launchContext.openclawDir})`); + + return new Promise((resolve, reject) => { + const child = spawn(runner.command, commandArgs, { + cwd: launchContext.openclawDir, + env: { + ...runner.env, + OPENCLAW_NO_RESPAWN: '1', + }, + stdio: ['ignore', 'pipe', 'pipe'], + windowsHide: true, + }); + + let stdout = ''; + let stderr = ''; + let settled = false; + + const timeout = setTimeout(() => { + if (settled) return; + settled = true; + child.kill('SIGTERM'); + reject(new Error(`OpenClaw runtime dependency preflight timed out after ${timeoutMs}ms`)); + }, timeoutMs); + timeout.unref?.(); + + child.stdout?.on('data', (chunk: Buffer) => { + stdout = appendOutput(stdout, chunk); + }); + child.stderr?.on('data', (chunk: Buffer) => { + stderr = appendOutput(stderr, chunk); + }); + + child.on('error', (error) => { + if (settled) return; + settled = true; + clearTimeout(timeout); + reject(error); + }); + + child.on('close', (code, signal) => { + if (settled) return; + settled = true; + clearTimeout(timeout); + + if (code === 0 && !signal) { + try { + const parsed = JSON.parse(stdout) as OpenClawRuntimeDepsReport; + resolve({ report: parsed, stdout, stderr }); + } catch (error) { + reject(new Error([ + 'OpenClaw runtime dependency preflight returned invalid JSON', + error instanceof Error ? error.message : String(error), + stderr.trim(), + stdout.trim(), + ].filter(Boolean).join('\n'))); + } + return; + } + + reject(new Error([ + `OpenClaw runtime dependency preflight failed (code=${code ?? 'null'}, signal=${signal ?? 'none'})`, + stderr.trim(), + stdout.trim(), + ].filter(Boolean).join('\n'))); + }); + }); +} + +function maybeRemoveStaleInstallRoot( + launchContext: GatewayLaunchContext, + report: OpenClawRuntimeDepsReport, +): boolean { + const installRoot = typeof report.installRoot === 'string' ? report.installRoot : ''; + if (!installRoot) return false; + + const resolvedInstallRoot = path.resolve(installRoot); + const resolvedOpenClawDir = path.resolve(launchContext.openclawDir); + if (resolvedInstallRoot === resolvedOpenClawDir) return false; + + const desiredDeps = createDesiredDependencyMap(report, launchContext); + if (desiredDeps.size === 0) return false; + + const manifestPath = path.join(installRoot, 'package.json'); + if (!existsSync(manifestPath)) return false; + + let currentDeps: Record; + try { + const parsed = JSON.parse(readFileSync(manifestPath, 'utf8')) as { + name?: unknown; + dependencies?: unknown; + }; + if (parsed.name !== 'openclaw-runtime-deps-install') { + logger.warn(`[plugins] Removing stale OpenClaw runtime dependency root with unexpected manifest: ${installRoot}`); + rmSync(installRoot, { recursive: true, force: true }); + return true; + } + currentDeps = isPlainStringRecord(parsed.dependencies) ? parsed.dependencies : {}; + } catch (error) { + logger.warn(`[plugins] Removing unreadable OpenClaw runtime dependency root: ${installRoot}`, error); + rmSync(installRoot, { recursive: true, force: true }); + return true; + } + + if (dependencyMapContainsAll(currentDeps, desiredDeps)) return false; + + logger.warn(`[plugins] Resetting stale OpenClaw runtime dependency root (expected=${desiredDeps.size}, current=${Object.keys(currentDeps).length}): ${installRoot}`); + rmSync(installRoot, { recursive: true, force: true }); + return true; +} + +function tryMaterializeRuntimeDepsFromLocalPackages( + launchContext: GatewayLaunchContext, + report: OpenClawRuntimeDepsReport, +): boolean { + const installRoot = typeof report.installRoot === 'string' ? report.installRoot : ''; + if (!installRoot) return false; + + const resolvedInstallRoot = path.resolve(installRoot); + const resolvedOpenClawDir = path.resolve(launchContext.openclawDir); + if (resolvedInstallRoot === resolvedOpenClawDir) return false; + + const desiredDeps = createDesiredDependencyMap(report, launchContext); + if (desiredDeps.size === 0) return false; + + const tempRoot = `${installRoot}.tmp-${process.pid}-${Date.now()}`; + try { + rmSync(tempRoot, { recursive: true, force: true }); + mkdirSync(path.join(tempRoot, 'node_modules'), { recursive: true }); + + const localPackages = collectLocalRuntimePackageDirs( + launchContext, + Array.from(desiredDeps.keys()), + [ + ...readLocalPackageDependencyNames(launchContext.openclawDir).map((name) => ({ + name, + parentDir: launchContext.openclawDir, + })), + ...readLocalPackageDependencyNames(process.cwd()).map((name) => ({ + name, + parentDir: process.cwd(), + })), + ...listNodeModulesPackageNames(path.join(launchContext.openclawDir, 'node_modules')).map((name) => ({ + name, + })), + ], + ); + if (localPackages.missingRootName) { + logger.warn(`[plugins] Local OpenClaw runtime dependency not found, falling back to npm repair: ${localPackages.missingRootName}`); + rmSync(tempRoot, { recursive: true, force: true }); + return false; + } + + for (const [depName, packageDir] of localPackages.packageDirs) { + const destination = path.join(tempRoot, 'node_modules', ...depName.split('/')); + mkdirSync(path.dirname(destination), { recursive: true }); + symlinkSync(packageDir, destination, process.platform === 'win32' ? 'junction' : 'dir'); + } + + writeFileSync( + path.join(tempRoot, 'package.json'), + `${JSON.stringify({ + name: 'openclaw-runtime-deps-install', + private: true, + dependencies: Object.fromEntries( + Array.from(desiredDeps.entries()).sort(([left], [right]) => left.localeCompare(right)), + ), + }, null, 2)}\n`, + 'utf8', + ); + + rmSync(installRoot, { recursive: true, force: true }); + mkdirSync(path.dirname(installRoot), { recursive: true }); + renameSync(tempRoot, installRoot); + logger.info(`[plugins] Materialized OpenClaw runtime dependencies from bundled/local packages (${desiredDeps.size} direct deps, ${localPackages.packageDirs.size} packages): ${installRoot}`); + return true; + } catch (error) { + rmSync(tempRoot, { recursive: true, force: true }); + logger.warn('[plugins] Failed to materialize OpenClaw runtime dependencies from local packages; falling back to npm repair:', error); + return false; + } +} + +function collectLocalRuntimePackageDirs( + launchContext: GatewayLaunchContext, + rootNames: string[], + preferredItems: Array<{ name: string; parentDir?: string }> = [], +): { + packageDirs: Map; + missingRootName: string | null; +} { + const packageDirs = new Map(); + const seen = new Set(); + const rootSet = new Set(rootNames); + const queue: Array<{ name: string; parentDir?: string }> = [ + ...rootNames.map((name) => ({ name })), + ...preferredItems.filter((item) => !rootSet.has(item.name)), + ]; + + for (let index = 0; index < queue.length; index += 1) { + const item = queue[index]; + if (seen.has(item.name) || isOptionalNativeClipboardPackage(item.name)) continue; + + const packageDir = item.parentDir + ? resolvePackageDirFromPackage(item.parentDir, item.name) ?? resolveLocalPackageDir(launchContext, item.name) + : resolveLocalPackageDir(launchContext, item.name); + + if (!packageDir) { + if (rootSet.has(item.name)) return { packageDirs, missingRootName: item.name }; + continue; + } + + seen.add(item.name); + packageDirs.set(item.name, packageDir); + + for (const depName of readLocalPackageDependencyNames(packageDir)) { + if (!seen.has(depName) && !isOptionalNativeClipboardPackage(depName)) { + queue.push({ name: depName, parentDir: packageDir }); + } + } + } + + return { packageDirs, missingRootName: null }; +} + +function listNodeModulesPackageNames(nodeModulesDir: string): string[] { + if (!existsSync(nodeModulesDir)) return []; + + const names: string[] = []; + try { + for (const entry of readdirSafe(nodeModulesDir)) { + if (entry === '.bin') continue; + const entryPath = path.join(nodeModulesDir, entry); + if (entry.startsWith('@')) { + for (const scopedEntry of readdirSafe(entryPath)) { + names.push(`${entry}/${scopedEntry}`); + } + } else { + names.push(entry); + } + } + } catch { + return []; + } + return Array.from(new Set(names)).sort((left, right) => left.localeCompare(right)); +} + +function readdirSafe(dir: string): string[] { + try { + return existsSync(dir) ? readdirSync(dir) : []; + } catch { + return []; + } +} + +function isOptionalNativeClipboardPackage(name: string): boolean { + return name === '@mariozechner/clipboard' || name.startsWith('@mariozechner/clipboard-'); +} + +function readLocalPackageDependencyNames(packageDir: string): string[] { + try { + const parsed = JSON.parse(readFileSync(path.join(packageDir, 'package.json'), 'utf8')) as { + dependencies?: unknown; + optionalDependencies?: unknown; + }; + return Array.from(new Set([ + ...Object.keys(isPlainStringRecord(parsed.dependencies) ? parsed.dependencies : {}), + ...Object.keys(isPlainStringRecord(parsed.optionalDependencies) ? parsed.optionalDependencies : {}), + ])).sort((left, right) => left.localeCompare(right)); + } catch { + return []; + } +} + +function resolvePackageDirFromPackage(parentPackageDir: string, packageName: string): string | null { + try { + const req = createRequire(path.join(parentPackageDir, 'package.json')); + try { + return path.dirname(req.resolve(`${packageName}/package.json`)); + } catch { + const entryPath = req.resolve(packageName); + return findPackageRootForEntry(entryPath, packageName); + } + } catch { + return null; + } +} + +function resolveLocalPackageDir( + launchContext: GatewayLaunchContext, + packageName: string, +): string | null { + const directCandidates = [ + path.join(launchContext.openclawDir, 'node_modules', ...packageName.split('/')), + path.join(process.cwd(), 'node_modules', ...packageName.split('/')), + ]; + for (const candidate of directCandidates) { + if (existsSync(path.join(candidate, 'package.json'))) return candidate; + } + + const requireRoots = [ + path.join(launchContext.openclawDir, 'package.json'), + path.join(process.cwd(), 'package.json'), + ]; + + for (const root of requireRoots) { + try { + const req = createRequire(root); + try { + return path.dirname(req.resolve(`${packageName}/package.json`)); + } catch { + const entryPath = req.resolve(packageName); + const packageDir = findPackageRootForEntry(entryPath, packageName); + if (packageDir) return packageDir; + } + } catch { + // Try the next require root. + } + } + + return null; +} + +function findPackageRootForEntry(entryPath: string, packageName: string): string | null { + let current = path.dirname(entryPath); + while (current && current !== path.dirname(current)) { + const manifestPath = path.join(current, 'package.json'); + if (existsSync(manifestPath)) { + try { + const parsed = JSON.parse(readFileSync(manifestPath, 'utf8')) as { name?: unknown }; + if (parsed.name === packageName) return current; + } catch { + // Keep walking. + } + } + current = path.dirname(current); + } + return null; +} + +function createDesiredDependencyMap( + report: OpenClawRuntimeDepsReport, + launchContext: GatewayLaunchContext, +): Map { + const desired = new Map(); + + if (Array.isArray(report.deps)) { + for (const dep of report.deps) { + if (!dep || typeof dep.name !== 'string' || typeof dep.version !== 'string') continue; + desired.set(dep.name, dep.version); + } + } + + for (const depName of OPENCLAW_BUNDLED_RUNTIME_DEPENDENCY_NAMES) { + if (desired.has(depName)) continue; + const spec = readLocalDependencySpec(launchContext, depName) ?? readLocalPackageVersionSpec(launchContext, depName); + if (spec) { + desired.set(depName, spec); + } + } + return desired; +} + +function readLocalDependencySpec( + launchContext: GatewayLaunchContext, + packageName: string, +): string | null { + const roots = [process.cwd(), launchContext.openclawDir]; + for (const root of roots) { + try { + const parsed = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf8')) as { + dependencies?: unknown; + devDependencies?: unknown; + optionalDependencies?: unknown; + }; + for (const entries of [parsed.dependencies, parsed.devDependencies, parsed.optionalDependencies]) { + if (isPlainStringRecord(entries) && entries[packageName]) { + return entries[packageName]; + } + } + } catch { + // Try the next manifest. + } + } + return null; +} + +function readLocalPackageVersionSpec( + launchContext: GatewayLaunchContext, + packageName: string, +): string | null { + const packageDir = resolveLocalPackageDir(launchContext, packageName); + if (!packageDir) return null; + try { + const parsed = JSON.parse(readFileSync(path.join(packageDir, 'package.json'), 'utf8')) as { + version?: unknown; + }; + return typeof parsed.version === 'string' && parsed.version.trim() ? parsed.version.trim() : null; + } catch { + return null; + } +} + +function isPlainStringRecord(value: unknown): value is Record { + if (!value || typeof value !== 'object' || Array.isArray(value)) return false; + return Object.values(value).every((entry) => typeof entry === 'string'); +} + +function dependencyMapContainsAll(current: Record, desired: Map): boolean { + for (const [key, version] of desired) { + if (current[key] !== version) { + return false; + } + } + return true; +} + +export async function ensureOpenClawRuntimeDepsReady( + launchContext: GatewayLaunchContext, +): Promise { + if (process.env.YINIAN_SKIP_OPENCLAW_RUNTIME_DEPS_PREFLIGHT === '1') { + logger.warn('[plugins] Skipping OpenClaw runtime dependency preflight via YINIAN_SKIP_OPENCLAW_RUNTIME_DEPS_PREFLIGHT=1'); + return; + } + + const key = `${launchContext.entryScript}::${launchContext.openclawDir}`; + const existing = preflightPromises.get(key); + if (existing) { + await existing; + return; + } + + const promise = runRuntimeDepsRepair(launchContext); + preflightPromises.set(key, promise); + try { + await promise; + } catch (error) { + preflightPromises.delete(key); + throw error; + } finally { + preflightPromises.delete(key); + } +} diff --git a/electron/gateway/supervisor.ts b/electron/gateway/supervisor.ts index 3417357..9866520 100644 --- a/electron/gateway/supervisor.ts +++ b/electron/gateway/supervisor.ts @@ -277,6 +277,8 @@ export async function runOpenClawDoctorRepair(): Promise { ? path.join(process.resourcesPath, 'bin') : path.join(process.cwd(), 'resources', 'bin', target); const binPathExists = existsSync(binPath); + const bundledNodePath = path.join(binPath, process.platform === 'win32' ? 'node.exe' : 'node'); + const bundledNpmCliPath = path.join(binPath, 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js'); const baseProcessEnv = process.env as Record; const baseEnvPatched = binPathExists ? prependPathEntry(baseProcessEnv, binPath).env @@ -292,6 +294,12 @@ export async function runOpenClawDoctorRepair(): Promise { const forkEnv: Record = { ...baseEnvPatched, ...uvEnv, + ...(binPathExists && existsSync(bundledNodePath) && existsSync(bundledNpmCliPath) + ? { + YINIAN_NODE_EXEC_PATH: bundledNodePath, + YINIAN_NPM_CLI_PATH: bundledNpmCliPath, + } + : {}), OPENCLAW_NO_RESPAWN: '1', }; diff --git a/electron/main/index.ts b/electron/main/index.ts index 225cfbe..6671720 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -40,6 +40,7 @@ import { createSignalQuitHandler } from './signal-quit'; import { acquireProcessInstanceFileLock } from './process-instance-lock'; import { getSetting } from '../utils/store'; import { ensureBuiltinSkillsInstalled, ensurePreinstalledSkillsInstalled } from '../utils/skill-config'; +import { stopNianxxPlayService } from '../utils/nianxx-play-service'; import { startHostApiServer } from '../api/server'; import { HostEventBus } from '../api/event-bus'; @@ -622,6 +623,7 @@ if (gotTheLock) { hostEventBus.closeAll(); hostApiServer?.close(); + stopNianxxPlayService(); void extensionRegistry.teardownAll(); const stopPromise = gatewayManager.stop().catch((err) => { diff --git a/electron/main/ipc-handlers.ts b/electron/main/ipc-handlers.ts index 880f8c5..4e1e562 100644 --- a/electron/main/ipc-handlers.ts +++ b/electron/main/ipc-handlers.ts @@ -36,11 +36,6 @@ import { } from '../utils/channel-config'; import { toOpenClawChannelType, toUiChannelType } from '../utils/channel-alias'; import { checkUvInstalled, installUv, setupManagedPython } from '../utils/uv-setup'; -import { - ensureDingTalkPluginInstalled, - ensureFeishuPluginInstalled, - ensureWeComPluginInstalled, -} from '../utils/plugin-install'; import { updateSkillConfig, getSkillConfig, getAllSkillConfigs } from '../utils/skill-config'; import { whatsAppLoginManager } from '../utils/whatsapp-login'; import { getProviderConfig } from '../utils/provider-registry'; @@ -1374,8 +1369,8 @@ function registerGatewayHandlers( logger.info(`[chat:sendWithMedia] Sending: message="${message.substring(0, 100)}", attachments=${imageAttachments.length}, fileRefs=${fileReferences.length}`); - // Longer timeout for chat sends to tolerate high-latency networks (avoids connect error) - const timeoutMs = 120000; + // Longer timeout for chat sends to tolerate complex agent tasks and high-latency model responses. + const timeoutMs = 330000; const result = await gatewayManager.rpc('chat.send', rpcParams, timeoutMs); logger.info(`[chat:sendWithMedia] RPC result: ${JSON.stringify(result)}`); return { success: true, result }; @@ -1461,6 +1456,7 @@ function registerOpenClawHandlers(gatewayManager: GatewayManager): void { // initialize / tear-down plugin connections. SIGUSR1 in-process reload is // not sufficient for channel plugins (see restartGatewayForAgentDeletion). const forceRestartChannels = new Set(['dingtalk', 'wecom', 'whatsapp', 'feishu', 'qqbot']); + const disabledPluginChannels = new Set(['dingtalk', 'wecom', 'feishu']); const scheduleGatewayChannelRestart = (reason: string): void => { if (gatewayManager.getStatus().state !== 'stopped') { @@ -1538,54 +1534,8 @@ function registerOpenClawHandlers(gatewayManager: GatewayManager): void { ipcMain.handle('channel:saveConfig', async (_, channelType: string, config: Record) => { try { logger.info('channel:saveConfig', { channelType, keys: Object.keys(config || {}) }); - if (channelType === 'dingtalk') { - const installResult = await ensureDingTalkPluginInstalled(); - if (!installResult.installed) { - return { - success: false, - error: installResult.warning || 'DingTalk plugin install failed', - }; - } - await saveChannelConfig(channelType, config); - scheduleGatewayChannelSaveRefresh(channelType, `channel:saveConfig (${channelType})`); - return { - success: true, - pluginInstalled: installResult.installed, - warning: installResult.warning, - }; - } - if (channelType === 'wecom') { - const installResult = await ensureWeComPluginInstalled(); - if (!installResult.installed) { - return { - success: false, - error: installResult.warning || 'WeCom plugin install failed', - }; - } - await saveChannelConfig(channelType, config); - scheduleGatewayChannelSaveRefresh(channelType, `channel:saveConfig (${channelType})`); - return { - success: true, - pluginInstalled: installResult.installed, - warning: installResult.warning, - }; - } - // QQBot is a built-in channel since OpenClaw 3.31 — no plugin install needed - if (channelType === 'feishu') { - const installResult = await ensureFeishuPluginInstalled(); - if (!installResult.installed) { - return { - success: false, - error: installResult.warning || 'Feishu plugin install failed', - }; - } - await saveChannelConfig(channelType, config); - scheduleGatewayChannelSaveRefresh(channelType, `channel:saveConfig (${channelType})`); - return { - success: true, - pluginInstalled: installResult.installed, - warning: installResult.warning, - }; + if (disabledPluginChannels.has(channelType)) { + return { success: false, error: '当前内测版本未启用该渠道' }; } await saveChannelConfig(channelType, config); scheduleGatewayChannelSaveRefresh(channelType, `channel:saveConfig (${channelType})`); diff --git a/electron/utils/channel-config.ts b/electron/utils/channel-config.ts index 85f42aa..42c7fa2 100644 --- a/electron/utils/channel-config.ts +++ b/electron/utils/channel-config.ts @@ -22,6 +22,8 @@ import { const OPENCLAW_DIR = join(homedir(), '.openclaw'); const CONFIG_FILE = join(OPENCLAW_DIR, 'openclaw.json'); const WECOM_PLUGIN_ID = 'wecom'; +const DISABLED_PLUGIN_CHANNEL_TYPES = new Set(['dingtalk', 'wecom', 'feishu']); +const DISABLED_PLUGIN_IDS = ['dingtalk', 'wecom', 'feishu', 'openclaw-lark', 'feishu-openclaw-plugin']; // Note: QQBot is a built-in channel since OpenClaw 3.31 — no plugin ID needed. const WECHAT_PLUGIN_ID = OPENCLAW_WECHAT_CHANNEL_TYPE; const FEISHU_PLUGIN_ID_CANDIDATES = ['openclaw-lark', 'feishu-openclaw-plugin'] as const; @@ -417,6 +419,13 @@ export async function writeOpenClawConfig(config: OpenClawConfig): Promise // ── Channel operations ─────────────────────────────────────────── async function ensurePluginAllowlist(currentConfig: OpenClawConfig, channelType: string): Promise { + if (DISABLED_PLUGIN_CHANNEL_TYPES.has(channelType)) { + for (const pluginId of DISABLED_PLUGIN_IDS) { + removePluginRegistration(currentConfig, pluginId); + } + return; + } + if (PLUGIN_CHANNELS.includes(channelType)) { ensurePluginRegistration(currentConfig, channelType); } diff --git a/electron/utils/config.ts b/electron/utils/config.ts index cd78172..bdc0211 100644 --- a/electron/utils/config.ts +++ b/electron/utils/config.ts @@ -8,7 +8,7 @@ */ export const PORTS = { /** ClawX GUI development server port */ - CLAWX_DEV: 5173, + CLAWX_DEV: 5188, /** ClawX GUI production port (for reference) */ CLAWX_GUI: 23333, diff --git a/electron/utils/model-diagnostics.ts b/electron/utils/model-diagnostics.ts new file mode 100644 index 0000000..e1898bd --- /dev/null +++ b/electron/utils/model-diagnostics.ts @@ -0,0 +1,492 @@ +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { existsSync } from 'node:fs'; +import { homedir } from 'node:os'; +import { dirname, join } from 'node:path'; +import { getOpenClawConfigDir } from './paths'; +import { readOpenClawConfig, writeOpenClawConfig } from './channel-config'; +import { logger } from './logger'; + +const YINIAN_MODEL_TIMEOUT_SECONDS = 300; +const YINIAN_MODEL_PROVIDER_KEY = 'minimax'; +const YINIAN_MODEL_ID = 'MiniMax-M2.7'; +const YINIAN_MODEL_REF = `${YINIAN_MODEL_PROVIDER_KEY}/${YINIAN_MODEL_ID}`; +const YINIAN_INTERNAL_PROVIDER_KEYS = ['minimax', 'minimax-portal']; +const YINIAN_MODEL_AUTH_ALIAS_PROFILE_IDS = [ + 'minimax:cn', + 'minimax-cn:default', + 'minimax-portal-cn:default', + 'minimax-portal:default', +]; +const YINIAN_MODEL_AUTH_TARGET_PROFILE_ID = 'minimax:default'; +const YINIAN_MODEL_AUTH_TARGET_PROVIDER = 'minimax'; + +type JsonObject = Record; + +type AuthProfileEntry = { + type?: unknown; + provider?: unknown; + [key: string]: unknown; +}; + +type AuthProfilesStore = { + version?: unknown; + profiles?: Record; + order?: Record; + lastGood?: Record; + [key: string]: unknown; +}; + +export type ModelDiagnosticStatus = 'ok' | 'warning' | 'error'; + +export interface YinianModelConfigCheck { + id: string; + label: string; + status: ModelDiagnosticStatus; + detail: string; +} + +export interface YinianModelConfigDiagnostics { + capturedAt: number; + ok: boolean; + model: { + primary: string | null; + fallbacks: string[]; + providerKey: string | null; + modelId: string | null; + }; + runtime: { + pricingEnabled: boolean | null; + pricingCatalogFetchDisabled: boolean; + }; + providers: Array<{ + key: string; + configured: boolean; + baseUrl: string | null; + api: string | null; + timeoutSeconds: number | null; + authHeader: boolean | null; + modelCount: number; + }>; + authProfiles: { + path: string; + exists: boolean; + providers: Array<{ + provider: string; + profileCount: number; + profileIds: string[]; + types: string[]; + hasDefaultProfile: boolean; + lastGoodProfileId: string | null; + }>; + }; + checks: YinianModelConfigCheck[]; + paths: { + openclawConfig: string; + authProfiles: string; + }; +} + +function isPlainRecord(value: unknown): value is JsonObject { + return Boolean(value) && typeof value === 'object' && !Array.isArray(value); +} + +function getAuthProfilesPath(agentId = 'main'): string { + return join(homedir(), '.openclaw', 'agents', agentId, 'agent', 'auth-profiles.json'); +} + +async function readJsonFile(filePath: string): Promise { + try { + const raw = await readFile(filePath, 'utf8'); + return JSON.parse(raw) as T; + } catch { + return null; + } +} + +async function writeJsonFile(filePath: string, data: unknown): Promise { + await mkdir(dirname(filePath), { recursive: true }); + await writeFile(filePath, `${JSON.stringify(data, null, 2)}\n`, 'utf8'); +} + +function readAuthProfilesStore(filePath: string): Promise { + return readJsonFile(filePath).then((store) => { + if (store && isPlainRecord(store.profiles)) return store; + return { version: 1, profiles: {} }; + }); +} + +function getPrimaryModel(config: JsonObject): string | null { + const agents = isPlainRecord(config.agents) ? config.agents : {}; + const defaults = isPlainRecord(agents.defaults) ? agents.defaults : {}; + const model = isPlainRecord(defaults.model) ? defaults.model : {}; + return typeof model.primary === 'string' && model.primary.trim() ? model.primary : null; +} + +function getFallbackModels(config: JsonObject): string[] { + const agents = isPlainRecord(config.agents) ? config.agents : {}; + const defaults = isPlainRecord(agents.defaults) ? agents.defaults : {}; + const model = isPlainRecord(defaults.model) ? defaults.model : {}; + return Array.isArray(model.fallbacks) + ? model.fallbacks.filter((item): item is string => typeof item === 'string' && item.trim().length > 0) + : []; +} + +function splitModelRef(modelRef: string | null): { providerKey: string | null; modelId: string | null } { + if (!modelRef) return { providerKey: null, modelId: null }; + const slashIndex = modelRef.indexOf('/'); + if (slashIndex <= 0 || slashIndex >= modelRef.length - 1) { + return { providerKey: null, modelId: modelRef }; + } + return { + providerKey: modelRef.slice(0, slashIndex), + modelId: modelRef.slice(slashIndex + 1), + }; +} + +function groupAuthProfiles(store: AuthProfilesStore): YinianModelConfigDiagnostics['authProfiles']['providers'] { + const profiles = isPlainRecord(store.profiles) ? store.profiles : {}; + const groups = new Map }>(); + + for (const [profileId, profile] of Object.entries(profiles)) { + if (!isPlainRecord(profile)) continue; + const provider = typeof profile.provider === 'string' && profile.provider.trim() + ? profile.provider + : profileId.split(':')[0] || 'unknown'; + const type = typeof profile.type === 'string' && profile.type.trim() ? profile.type : 'unknown'; + const group = groups.get(provider) ?? { ids: [], types: new Set() }; + group.ids.push(profileId); + group.types.add(type); + groups.set(provider, group); + } + + const lastGood = isPlainRecord(store.lastGood) ? store.lastGood as Record : {}; + return Array.from(groups.entries()) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([provider, group]) => ({ + provider, + profileCount: group.ids.length, + profileIds: group.ids.sort(), + types: Array.from(group.types).sort(), + hasDefaultProfile: group.ids.includes(`${provider}:default`), + lastGoodProfileId: typeof lastGood[provider] === 'string' ? lastGood[provider] as string : null, + })); +} + +function hasMatchingAuthProfile(store: AuthProfilesStore, providerKey: string | null): boolean { + if (!providerKey || !isPlainRecord(store.profiles)) return false; + return Object.values(store.profiles).some((profile) => ( + isPlainRecord(profile) && profile.provider === providerKey + )); +} + +function hasConfiguredProvider(config: JsonObject, providerKey: string | null): boolean { + if (!providerKey) return false; + const models = isPlainRecord(config.models) ? config.models : {}; + const providers = isPlainRecord(models.providers) ? models.providers : {}; + return isPlainRecord(providers[providerKey]); +} + +function buildProviderDiagnostics(config: JsonObject, primaryProviderKey: string | null): YinianModelConfigDiagnostics['providers'] { + const models = isPlainRecord(config.models) ? config.models : {}; + const providers = isPlainRecord(models.providers) ? models.providers : {}; + const providerKeys = Array.from(new Set([ + ...(primaryProviderKey ? [primaryProviderKey] : []), + ...YINIAN_INTERNAL_PROVIDER_KEYS, + ])); + + return providerKeys.map((key) => { + const entry = isPlainRecord(providers[key]) ? providers[key] : {}; + const modelsList = Array.isArray(entry.models) ? entry.models : []; + return { + key, + configured: isPlainRecord(providers[key]), + baseUrl: typeof entry.baseUrl === 'string' ? entry.baseUrl : null, + api: typeof entry.api === 'string' ? entry.api : null, + timeoutSeconds: typeof entry.timeoutSeconds === 'number' ? entry.timeoutSeconds : null, + authHeader: typeof entry.authHeader === 'boolean' ? entry.authHeader : null, + modelCount: modelsList.length, + }; + }); +} + +function getPricingEnabled(config: JsonObject): boolean | null { + const models = isPlainRecord(config.models) ? config.models : {}; + const pricing = isPlainRecord(models.pricing) ? models.pricing : null; + return typeof pricing?.enabled === 'boolean' ? pricing.enabled : null; +} + +export async function ensureYinianModelRuntimeConfigured(): Promise { + const config = await readOpenClawConfig() as JsonObject; + const models = isPlainRecord(config.models) ? { ...config.models } : {}; + const providers = isPlainRecord(models.providers) ? { ...models.providers } : {}; + const pricing = isPlainRecord(models.pricing) ? { ...models.pricing } : {}; + let changed = false; + + const currentYinianProvider = isPlainRecord(providers[YINIAN_MODEL_PROVIDER_KEY]) + ? { ...providers[YINIAN_MODEL_PROVIDER_KEY] } + : {}; + const currentModels = Array.isArray(currentYinianProvider.models) + ? currentYinianProvider.models.filter(isPlainRecord) + : []; + const hasYinianModel = currentModels.some((item) => item.id === YINIAN_MODEL_ID); + const nextYinianProvider = { + ...currentYinianProvider, + baseUrl: typeof currentYinianProvider.baseUrl === 'string' && currentYinianProvider.baseUrl.trim() + ? currentYinianProvider.baseUrl + : 'https://api.minimaxi.com/anthropic', + api: typeof currentYinianProvider.api === 'string' && currentYinianProvider.api.trim() + ? currentYinianProvider.api + : 'anthropic-messages', + authHeader: typeof currentYinianProvider.authHeader === 'boolean' + ? currentYinianProvider.authHeader + : true, + timeoutSeconds: YINIAN_MODEL_TIMEOUT_SECONDS, + models: hasYinianModel + ? currentModels + : [ + ...currentModels, + { + id: YINIAN_MODEL_ID, + name: 'MiniMax M2.7', + reasoning: true, + input: ['text', 'image'], + contextWindow: 204800, + maxTokens: 131072, + }, + ], + }; + if (JSON.stringify(providers[YINIAN_MODEL_PROVIDER_KEY]) !== JSON.stringify(nextYinianProvider)) { + providers[YINIAN_MODEL_PROVIDER_KEY] = nextYinianProvider; + changed = true; + } + + for (const providerKey of YINIAN_INTERNAL_PROVIDER_KEYS) { + const currentProvider = providers[providerKey]; + if (!isPlainRecord(currentProvider)) continue; + + if (currentProvider.timeoutSeconds !== YINIAN_MODEL_TIMEOUT_SECONDS) { + providers[providerKey] = { + ...currentProvider, + timeoutSeconds: YINIAN_MODEL_TIMEOUT_SECONDS, + }; + changed = true; + } + } + + if (pricing.enabled !== false) { + pricing.enabled = false; + changed = true; + } + + if (models.mode !== 'merge') { + models.mode = 'merge'; + changed = true; + } + + const agents = isPlainRecord(config.agents) ? { ...config.agents } : {}; + const defaults = isPlainRecord(agents.defaults) ? { ...agents.defaults } : {}; + const defaultModel = isPlainRecord(defaults.model) ? { ...defaults.model } : {}; + if (defaultModel.primary !== YINIAN_MODEL_REF) { + defaultModel.primary = YINIAN_MODEL_REF; + changed = true; + } + if (!Array.isArray(defaultModel.fallbacks)) { + defaultModel.fallbacks = ['minimax/MiniMax-M2.5']; + changed = true; + } + defaults.model = defaultModel; + if (!Array.isArray(defaults.skills)) { + defaults.skills = []; + changed = true; + } + const heartbeat = isPlainRecord(defaults.heartbeat) ? { ...defaults.heartbeat } : {}; + if (heartbeat.every !== '0m') { + heartbeat.every = '0m'; + defaults.heartbeat = heartbeat; + changed = true; + } + defaults.workspace = typeof defaults.workspace === 'string' && defaults.workspace.trim() + ? defaults.workspace + : join(homedir(), '.openclaw', 'workspace'); + agents.defaults = defaults; + + const list = Array.isArray(agents.list) ? agents.list : []; + const normalizedList = list.map((item) => { + if (!isPlainRecord(item) || item.id !== 'main') return item; + const tools = isPlainRecord(item.tools) ? item.tools : {}; + return { + ...item, + tools: { + ...tools, + profile: 'coding', + }, + }; + }); + if (JSON.stringify(normalizedList) !== JSON.stringify(list)) { + agents.list = normalizedList; + changed = true; + } + const activeList = Array.isArray(agents.list) ? agents.list : list; + const hasMainAgent = activeList.some((item) => isPlainRecord(item) && item.id === 'main'); + if (!hasMainAgent) { + agents.list = [ + ...activeList, + { + id: 'main', + name: '智念助手', + default: true, + workspace: join(homedir(), '.openclaw', 'workspace'), + agentDir: '~/.openclaw/agents/main/agent', + skills: [], + tools: { profile: 'coding' }, + }, + ]; + changed = true; + } + if (JSON.stringify(config.agents) !== JSON.stringify(agents)) { + config.agents = agents; + changed = true; + } + + if (changed) { + models.providers = providers; + models.pricing = pricing; + config.models = models; + await writeOpenClawConfig(config); + logger.info('[provider-sync] Applied Yinian model runtime defaults'); + } + + await ensureYinianModelAuthProfileAliases(); +} + +export async function ensureYinianModelAuthProfileAliases(agentId = 'main'): Promise { + const authPath = getAuthProfilesPath(agentId); + const store = await readAuthProfilesStore(authPath); + store.version = typeof store.version === 'number' ? store.version : 1; + store.profiles = isPlainRecord(store.profiles) ? store.profiles : {}; + + const target = store.profiles[YINIAN_MODEL_AUTH_TARGET_PROFILE_ID]; + const sourceId = YINIAN_MODEL_AUTH_ALIAS_PROFILE_IDS.find((profileId) => isPlainRecord(store.profiles?.[profileId])); + const source = sourceId ? store.profiles[sourceId] : null; + let changed = false; + + if (!isPlainRecord(target) && isPlainRecord(source)) { + store.profiles[YINIAN_MODEL_AUTH_TARGET_PROFILE_ID] = { + ...source, + provider: YINIAN_MODEL_AUTH_TARGET_PROVIDER, + }; + changed = true; + } else if (isPlainRecord(target) && target.provider !== YINIAN_MODEL_AUTH_TARGET_PROVIDER) { + store.profiles[YINIAN_MODEL_AUTH_TARGET_PROFILE_ID] = { + ...target, + provider: YINIAN_MODEL_AUTH_TARGET_PROVIDER, + }; + changed = true; + } + + if (isPlainRecord(store.profiles[YINIAN_MODEL_AUTH_TARGET_PROFILE_ID])) { + const order = isPlainRecord(store.order) ? { ...store.order } as Record : {}; + const currentOrder = Array.isArray(order[YINIAN_MODEL_AUTH_TARGET_PROVIDER]) + ? order[YINIAN_MODEL_AUTH_TARGET_PROVIDER] + : []; + if (!currentOrder.includes(YINIAN_MODEL_AUTH_TARGET_PROFILE_ID)) { + order[YINIAN_MODEL_AUTH_TARGET_PROVIDER] = [ + YINIAN_MODEL_AUTH_TARGET_PROFILE_ID, + ...currentOrder.filter((item) => item !== YINIAN_MODEL_AUTH_TARGET_PROFILE_ID), + ]; + store.order = order; + changed = true; + } + + const lastGood = isPlainRecord(store.lastGood) ? { ...store.lastGood } as Record : {}; + if (!lastGood[YINIAN_MODEL_AUTH_TARGET_PROVIDER]) { + lastGood[YINIAN_MODEL_AUTH_TARGET_PROVIDER] = YINIAN_MODEL_AUTH_TARGET_PROFILE_ID; + store.lastGood = lastGood; + changed = true; + } + } + + if (changed) { + await writeJsonFile(authPath, store); + logger.info('[provider-sync] Normalized Yinian model auth profile aliases'); + } +} + +export async function buildYinianModelConfigDiagnostics(): Promise { + const openclawConfigPath = join(getOpenClawConfigDir(), 'openclaw.json'); + const authProfilesPath = getAuthProfilesPath('main'); + const config = await readOpenClawConfig() as JsonObject; + const authStore = await readAuthProfilesStore(authProfilesPath); + const primary = getPrimaryModel(config); + const fallbacks = getFallbackModels(config); + const { providerKey, modelId } = splitModelRef(primary); + const pricingEnabled = getPricingEnabled(config); + const providerConfigured = hasConfiguredProvider(config, providerKey); + const authProfileConfigured = hasMatchingAuthProfile(authStore, providerKey); + const providers = buildProviderDiagnostics(config, providerKey); + const primaryProvider = providers.find((provider) => provider.key === providerKey); + const checks: YinianModelConfigCheck[] = [ + { + id: 'primary-model', + label: '默认模型', + status: primary ? 'ok' : 'error', + detail: primary ?? '未配置默认模型', + }, + { + id: 'provider-entry', + label: '模型服务', + status: providerConfigured ? 'ok' : 'error', + detail: providerKey + ? (providerConfigured ? `已配置 ${providerKey}` : `缺少 ${providerKey} 服务配置`) + : '无法从默认模型识别服务', + }, + { + id: 'auth-profile', + label: '调用凭据', + status: authProfileConfigured ? 'ok' : 'error', + detail: providerKey + ? (authProfileConfigured ? `已找到 ${providerKey} 的本地凭据` : `未找到 ${providerKey} 的本地凭据`) + : '无法检查调用凭据', + }, + { + id: 'timeout', + label: '长任务等待', + status: (primaryProvider?.timeoutSeconds ?? 0) >= YINIAN_MODEL_TIMEOUT_SECONDS ? 'ok' : 'warning', + detail: primaryProvider?.timeoutSeconds + ? `${primaryProvider.timeoutSeconds} 秒` + : '未显式配置等待时长', + }, + { + id: 'pricing-catalog', + label: '外部价格目录', + status: pricingEnabled === false ? 'ok' : 'warning', + detail: pricingEnabled === false ? '已关闭启动时外部目录拉取' : '未关闭,弱网环境可能拖慢后台启动', + }, + ]; + + return { + capturedAt: Date.now(), + ok: checks.every((check) => check.status !== 'error'), + model: { + primary, + fallbacks, + providerKey, + modelId, + }, + runtime: { + pricingEnabled, + pricingCatalogFetchDisabled: pricingEnabled === false, + }, + providers, + authProfiles: { + path: authProfilesPath, + exists: existsSync(authProfilesPath), + providers: groupAuthProfiles(authStore), + }, + checks, + paths: { + openclawConfig: openclawConfigPath, + authProfiles: authProfilesPath, + }, + }; +} diff --git a/electron/utils/nianxx-play-service.ts b/electron/utils/nianxx-play-service.ts new file mode 100644 index 0000000..bbbdea5 --- /dev/null +++ b/electron/utils/nianxx-play-service.ts @@ -0,0 +1,431 @@ +import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'; +import { app } from 'electron'; +import { createServer } from 'node:net'; +import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { setTimeout as delay } from 'node:timers/promises'; +import { logger } from './logger'; + +const DEFAULT_NIANXX_PLAY_PORT = 3000; +const STARTUP_TIMEOUT_MS = 20_000; +const STARTUP_POLL_INTERVAL_MS = 500; +const HEALTH_PATH = '/api/desktop/health'; +const RUNTIME_ENV_FILE_NAME = '.env.runtime'; + +type ProcessWithResourcesPath = NodeJS.Process & { resourcesPath?: string }; +type NianxxPlayRuntimeKind = 'source' | 'standalone'; + +interface NianxxPlayRuntime { + kind: NianxxPlayRuntimeKind; + dir: string; + serverPath?: string; +} + +interface NianxxPlayHealthPayload { + appId?: unknown; + ok?: unknown; + desktopManaged?: unknown; +} + +export interface NianxxPlayServiceStatus { + success: boolean; + running: boolean; + starting: boolean; + managed: boolean; + baseUrl: string; + port: number; + projectDir?: string; + runtimeKind?: NianxxPlayRuntimeKind; + pid?: number; + error?: string; +} + +let nianxxPlayProcess: ChildProcessWithoutNullStreams | null = null; +let lastServiceError: string | null = null; +let activePort: number | null = null; + +function getConfiguredPort(): number { + const raw = process.env.NIANXX_PLAY_PORT?.trim(); + if (!raw) return DEFAULT_NIANXX_PLAY_PORT; + const parsed = Number(raw); + return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_NIANXX_PLAY_PORT; +} + +function getBaseUrl(): string { + const explicitUrl = process.env.NIANXX_PLAY_URL?.trim(); + if (explicitUrl) return explicitUrl.replace(/\/$/, ''); + return `http://127.0.0.1:${activePort ?? getConfiguredPort()}`; +} + +function allowExternalNianxxPlayRuntime(): boolean { + return Boolean(process.env.NIANXX_PLAY_URL?.trim()); +} + +function getNpmCommand(): string { + return process.platform === 'win32' ? 'npm.cmd' : 'npm'; +} + +function getScriptName(): string { + return process.env.NIANXX_PLAY_SCRIPT?.trim() || (process.env.NODE_ENV === 'production' ? 'start' : 'dev'); +} + +function getResourcePathCandidates(): string[] { + const resourcesPath = (process as ProcessWithResourcesPath).resourcesPath; + return [ + process.env.NIANXX_PLAY_DIR?.trim() || '', + join(process.cwd(), '..', 'NianxxPlay'), + join(process.cwd(), 'NianxxPlay'), + join(process.cwd(), 'build', 'apps', 'nianxx-play'), + resourcesPath ? join(resourcesPath, 'nianxx-play') : '', + resourcesPath ? join(resourcesPath, 'resources', 'nianxx-play') : '', + ].filter(Boolean); +} + +function createRuntimeCandidate(candidate: string): NianxxPlayRuntime | undefined { + const dir = resolve(candidate); + const directStandaloneServer = join(dir, 'server.js'); + const nestedStandaloneServer = join(dir, 'standalone', 'server.js'); + if (existsSync(directStandaloneServer)) { + return { kind: 'standalone', dir, serverPath: directStandaloneServer }; + } + if (existsSync(nestedStandaloneServer)) { + return { kind: 'standalone', dir: join(dir, 'standalone'), serverPath: nestedStandaloneServer }; + } + if (existsSync(join(dir, 'package.json'))) { + return { kind: 'source', dir }; + } + return undefined; +} + +function resolveNianxxPlayRuntime(): NianxxPlayRuntime | undefined { + for (const candidate of getResourcePathCandidates()) { + const runtime = createRuntimeCandidate(candidate); + if (runtime) return runtime; + } + return undefined; +} + +async function canReachNianxxPlay(baseUrl = getBaseUrl()): Promise { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 1_500); + try { + const response = await fetch(`${baseUrl}${HEALTH_PATH}`, { + method: 'GET', + signal: controller.signal, + }); + if (!response.ok) return false; + const payload = (await response.json().catch(() => undefined)) as NianxxPlayHealthPayload | undefined; + const isNianxxPlay = Boolean(payload && payload.appId === 'nianxx-play' && payload.ok); + if (!isNianxxPlay) return false; + return payload?.desktopManaged === true || allowExternalNianxxPlayRuntime(); + } catch { + return false; + } finally { + clearTimeout(timeout); + } +} + +function createStatus(overrides: Partial = {}): NianxxPlayServiceStatus { + const runtime = resolveNianxxPlayRuntime(); + const baseUrl = getBaseUrl(); + return { + success: true, + running: false, + starting: Boolean(nianxxPlayProcess && !nianxxPlayProcess.killed), + managed: Boolean(nianxxPlayProcess && !nianxxPlayProcess.killed), + baseUrl, + port: activePort ?? getConfiguredPort(), + projectDir: runtime?.dir, + runtimeKind: runtime?.kind, + pid: nianxxPlayProcess?.pid, + error: lastServiceError ?? undefined, + ...overrides, + }; +} + +function attachProcessLogger(stream: NodeJS.ReadableStream, level: 'info' | 'warn'): void { + let buffer = ''; + stream.on('data', (chunk) => { + buffer += Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk); + const lines = buffer.split(/\r?\n/); + buffer = lines.pop() ?? ''; + for (const line of lines) { + const trimmed = line.trim(); + if (!trimmed) continue; + if (level === 'warn') { + logger.warn(`[nianxx-play] ${trimmed}`); + } else { + logger.info(`[nianxx-play] ${trimmed}`); + } + } + }); +} + +async function waitUntilReachable(baseUrl: string): Promise { + const startedAt = Date.now(); + while (Date.now() - startedAt < STARTUP_TIMEOUT_MS) { + if (await canReachNianxxPlay(baseUrl)) { + return true; + } + await delay(STARTUP_POLL_INTERVAL_MS); + } + return false; +} + +async function isPortAvailable(port: number): Promise { + return new Promise((resolveAvailable) => { + const server = createServer(); + server.once('error', () => resolveAvailable(false)); + server.once('listening', () => { + server.close(() => resolveAvailable(true)); + }); + server.listen(port, '127.0.0.1'); + }); +} + +async function findAvailablePort(preferredPort: number): Promise { + if (await isPortAvailable(preferredPort)) return preferredPort; + return new Promise((resolvePort, reject) => { + const server = createServer(); + server.once('error', reject); + server.once('listening', () => { + const address = server.address(); + const port = typeof address === 'object' && address ? address.port : preferredPort; + server.close(() => resolvePort(port)); + }); + server.listen(0, '127.0.0.1'); + }); +} + +function getRuntimeDataDirs() { + const userData = app.getPath('userData'); + const runtimeRoot = join(userData, 'apps', 'nianxx-play'); + const dataDir = join(runtimeRoot, 'data'); + const uploadDir = join(runtimeRoot, 'uploads'); + const resultDir = join(runtimeRoot, 'generated-results'); + mkdirSync(dataDir, { recursive: true }); + mkdirSync(uploadDir, { recursive: true }); + mkdirSync(resultDir, { recursive: true }); + return { runtimeRoot, dataDir, uploadDir, resultDir }; +} + +function hasDirectoryEntries(dir: string): boolean { + try { + return readdirSync(dir).length > 0; + } catch { + return false; + } +} + +function copyFileIfMissing(sourcePath: string, targetPath: string): void { + if (!existsSync(sourcePath) || existsSync(targetPath)) return; + mkdirSync(dirname(targetPath), { recursive: true }); + cpSync(sourcePath, targetPath, { dereference: true }); +} + +function readJsonFile(filePath: string): T | null { + try { + return JSON.parse(readFileSync(filePath, 'utf8')) as T; + } catch { + return null; + } +} + +function getArrayLength(record: Record | null, key: string): number { + const value = record?.[key]; + return Array.isArray(value) ? value.length : 0; +} + +function migrateStateFile(sourcePath: string, targetPath: string): void { + if (!existsSync(sourcePath)) return; + mkdirSync(dirname(targetPath), { recursive: true }); + if (!existsSync(targetPath)) { + cpSync(sourcePath, targetPath, { dereference: true }); + return; + } + + const sourceState = readJsonFile>(sourcePath); + const targetState = readJsonFile>(targetPath); + if (!sourceState || !targetState) return; + + const targetProjects = getArrayLength(targetState, 'projects'); + const sourceProjects = getArrayLength(sourceState, 'projects'); + if (targetProjects === 0 && sourceProjects > 0) { + writeFileSync(targetPath, JSON.stringify(sourceState, null, 2), 'utf8'); + logger.info(`[nianxx-play] Migrated ${sourceProjects} project record(s) from bundled/source runtime data`); + } +} + +function copyDirectoryIfEmpty(sourceDir: string, targetDir: string): void { + if (!existsSync(sourceDir) || !statSync(sourceDir).isDirectory()) return; + if (hasDirectoryEntries(targetDir)) return; + mkdirSync(targetDir, { recursive: true }); + cpSync(sourceDir, targetDir, { recursive: true, dereference: true }); +} + +function migrateExistingRuntimeData(runtime: NianxxPlayRuntime, dirs: ReturnType): void { + try { + migrateStateFile(join(runtime.dir, '.data', 'app-state.json'), join(dirs.dataDir, 'app-state.json')); + copyDirectoryIfEmpty(join(runtime.dir, 'public', 'uploads'), dirs.uploadDir); + copyDirectoryIfEmpty(join(runtime.dir, 'public', 'generated-results'), dirs.resultDir); + } catch (error) { + logger.warn('[nianxx-play] Failed to migrate existing local runtime data:', error); + } +} + +function parseRuntimeEnvValue(raw: string): string { + const value = raw.trim(); + if ( + (value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'")) + ) { + try { + return JSON.parse(value); + } catch { + return value.slice(1, -1); + } + } + return value; +} + +function loadBundledRuntimeEnv(runtime: NianxxPlayRuntime): Record { + const runtimeEnvPath = join(runtime.dir, RUNTIME_ENV_FILE_NAME); + if (!existsSync(runtimeEnvPath)) return {}; + try { + const values: Record = {}; + const raw = readFileSync(runtimeEnvPath, 'utf8'); + for (const line of raw.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const match = trimmed.match(/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/); + if (!match) continue; + values[match[1]] = parseRuntimeEnvValue(match[2]); + } + logger.info(`[nianxx-play] Loaded bundled runtime env (${Object.keys(values).length} values)`); + return values; + } catch (error) { + logger.warn('[nianxx-play] Failed to load bundled runtime env:', error); + return {}; + } +} + +function createRuntimeEnv(port: number, runtime: NianxxPlayRuntime) { + const dirs = getRuntimeDataDirs(); + migrateExistingRuntimeData(runtime, dirs); + const bundledRuntimeEnv = loadBundledRuntimeEnv(runtime); + return { + ...process.env, + ...bundledRuntimeEnv, + PORT: String(port), + HOSTNAME: '127.0.0.1', + NEXT_TELEMETRY_DISABLED: '1', + NIANXXPLAY_RUNTIME_DIR: dirs.runtimeRoot, + NIANXXPLAY_DATA_DIR: dirs.dataDir, + NIANXXPLAY_UPLOAD_DIR: dirs.uploadDir, + NIANXXPLAY_RESULT_DIR: dirs.resultDir, + NIANXXPLAY_PUBLIC_BASE_URL: `http://127.0.0.1:${port}`, + NIANXXPLAY_DESKTOP_MANAGED: '1', + }; +} + +function spawnSourceRuntime(runtime: NianxxPlayRuntime, port: number): ChildProcessWithoutNullStreams { + const scriptName = getScriptName(); + logger.info(`[nianxx-play] Starting source service: npm run ${scriptName} (cwd=${runtime.dir}, port=${port})`); + return spawn(getNpmCommand(), ['run', scriptName], { + cwd: runtime.dir, + env: createRuntimeEnv(port, runtime), + stdio: ['ignore', 'pipe', 'pipe'], + shell: false, + }); +} + +function spawnStandaloneRuntime(runtime: NianxxPlayRuntime, port: number): ChildProcessWithoutNullStreams { + if (!runtime.serverPath) { + throw new Error('NianxxPlay standalone server path is missing.'); + } + logger.info(`[nianxx-play] Starting bundled service: ${runtime.serverPath} (port=${port})`); + return spawn(process.execPath, [runtime.serverPath], { + cwd: runtime.dir, + env: { + ...createRuntimeEnv(port, runtime), + ELECTRON_RUN_AS_NODE: '1', + NODE_ENV: 'production', + }, + stdio: ['ignore', 'pipe', 'pipe'], + shell: false, + }); +} + +function attachLifecycleHandlers(): void { + if (!nianxxPlayProcess) return; + attachProcessLogger(nianxxPlayProcess.stdout, 'info'); + attachProcessLogger(nianxxPlayProcess.stderr, 'warn'); + nianxxPlayProcess.once('exit', (code, signal) => { + const reason = signal ? `signal ${signal}` : `code ${code ?? 'unknown'}`; + logger.warn(`[nianxx-play] Service exited with ${reason}`); + if (code && code !== 0) { + lastServiceError = `NianxxPlay exited with ${reason}`; + } + nianxxPlayProcess = null; + activePort = null; + }); + nianxxPlayProcess.once('error', (error) => { + lastServiceError = error.message; + logger.warn('[nianxx-play] Failed to start service:', error); + nianxxPlayProcess = null; + activePort = null; + }); +} + +export async function getNianxxPlayServiceStatus(): Promise { + const running = await canReachNianxxPlay(); + return createStatus({ + running, + error: running ? undefined : (lastServiceError ?? undefined), + }); +} + +export async function ensureNianxxPlayServiceStarted(): Promise { + const baseUrl = getBaseUrl(); + if (await canReachNianxxPlay(baseUrl)) { + lastServiceError = null; + return createStatus({ running: true, starting: false, managed: Boolean(nianxxPlayProcess), error: undefined }); + } + + const runtime = resolveNianxxPlayRuntime(); + if (!runtime) { + lastServiceError = 'NianxxPlay runtime was not found.'; + return createStatus({ success: false, running: false, starting: false, error: lastServiceError }); + } + + if (!nianxxPlayProcess || nianxxPlayProcess.killed) { + const port = await findAvailablePort(getConfiguredPort()); + activePort = port; + nianxxPlayProcess = runtime.kind === 'standalone' + ? spawnStandaloneRuntime(runtime, port) + : spawnSourceRuntime(runtime, port); + attachLifecycleHandlers(); + } + + const running = await waitUntilReachable(getBaseUrl()); + if (!running) { + lastServiceError = `NianxxPlay did not become ready within ${Math.round(STARTUP_TIMEOUT_MS / 1000)}s.`; + } else { + lastServiceError = null; + } + + return createStatus({ + running, + starting: !running && Boolean(nianxxPlayProcess && !nianxxPlayProcess.killed), + managed: Boolean(nianxxPlayProcess && !nianxxPlayProcess.killed), + error: running ? undefined : (lastServiceError ?? undefined), + }); +} + +export function stopNianxxPlayService(): void { + if (!nianxxPlayProcess || nianxxPlayProcess.killed) return; + logger.info('[nianxx-play] Stopping service'); + nianxxPlayProcess.kill(); + nianxxPlayProcess = null; + activePort = null; +} diff --git a/electron/utils/openclaw-auth.ts b/electron/utils/openclaw-auth.ts index 3133132..a315bf3 100644 --- a/electron/utils/openclaw-auth.ts +++ b/electron/utils/openclaw-auth.ts @@ -32,6 +32,17 @@ const AUTH_STORE_VERSION = 1; const AUTH_PROFILE_FILENAME = 'auth-profiles.json'; const LEGACY_MINIMAX_OAUTH_PLUGIN_ID = 'minimax-portal-auth'; const MERGED_MINIMAX_PLUGIN_ID = 'minimax'; +const YINIAN_DESKTOP_TOOLS_PROFILE = 'coding'; +const YINIAN_INTERNAL_MODEL_REF = 'minimax/MiniMax-M2.7'; +const YINIAN_CORE_PLUGIN_IDS = new Set([ + 'minimax', + 'cloud-sync', + 'openclaw-weixin', + 'agentbus', +]); +const YINIAN_BASE_PLUGIN_IDS = new Set(['minimax', 'cloud-sync']); +const YINIAN_CORE_CHANNEL_IDS = new Set(['openclaw-weixin', 'agentbus']); +const YINIAN_DISABLED_CHANNEL_IDS = new Set(['feishu', 'dingtalk', 'wecom']); interface BundledPluginManifest { id: string; @@ -1031,6 +1042,87 @@ function isPlainRecord(value: unknown): value is Record { return typeof value === 'object' && value !== null && !Array.isArray(value); } +function isYinianManagedConfig(config: Record): boolean { + const models = isPlainRecord(config.models) ? config.models : null; + const providers = models && isPlainRecord(models.providers) ? models.providers : null; + if (providers && isPlainRecord(providers[OPENCLAW_PROVIDER_KEY_MINIMAX])) return true; + + const agents = isPlainRecord(config.agents) ? config.agents : null; + const defaults = agents && isPlainRecord(agents.defaults) ? agents.defaults : null; + const model = defaults && isPlainRecord(defaults.model) ? defaults.model : null; + return model?.primary === YINIAN_INTERNAL_MODEL_REF; +} + +function trimYinianPluginSurface(config: Record): boolean { + if (!isYinianManagedConfig(config)) return false; + const plugins = isPlainRecord(config.plugins) ? config.plugins : null; + let modified = false; + + if (plugins) { + if (Array.isArray(plugins.allow)) { + const channels = isPlainRecord(config.channels) ? config.channels : null; + const nextAllow = (plugins.allow as unknown[]) + .filter((pluginId): pluginId is string => { + if (typeof pluginId !== 'string') return false; + if (YINIAN_BASE_PLUGIN_IDS.has(pluginId)) return true; + return YINIAN_CORE_CHANNEL_IDS.has(pluginId) && Boolean(channels?.[pluginId]); + }); + for (const pluginId of YINIAN_BASE_PLUGIN_IDS) { + if (!nextAllow.includes(pluginId)) nextAllow.push(pluginId); + } + for (const pluginId of YINIAN_CORE_CHANNEL_IDS) { + if (channels?.[pluginId] && !nextAllow.includes(pluginId)) nextAllow.push(pluginId); + } + if (JSON.stringify(nextAllow) !== JSON.stringify(plugins.allow)) { + plugins.allow = nextAllow; + modified = true; + console.log(`[sanitize] Trimmed plugins.allow to Yinian core plugins: ${nextAllow.join(', ')}`); + } + } + + if (isPlainRecord(plugins.entries)) { + for (const pluginId of Object.keys(plugins.entries)) { + if (YINIAN_CORE_PLUGIN_IDS.has(pluginId)) continue; + delete plugins.entries[pluginId]; + modified = true; + console.log(`[sanitize] Removed non-core plugin entry "${pluginId}" from Yinian OpenClaw config`); + } + } + } + + const channels = isPlainRecord(config.channels) ? config.channels : null; + if (channels) { + for (const channelId of Object.keys(channels)) { + if (YINIAN_CORE_CHANNEL_IDS.has(channelId)) continue; + delete channels[channelId]; + modified = true; + console.log(`[sanitize] Removed disabled channel "${channelId}" from Yinian OpenClaw config`); + } + } + + const agents = isPlainRecord(config.agents) ? config.agents : null; + if (Array.isArray(agents?.list)) { + const nextAgents = agents.list.filter((entry) => { + if (!isPlainRecord(entry)) return true; + const id = typeof entry.id === 'string' ? entry.id : ''; + const channelType = typeof entry.channelType === 'string' + ? entry.channelType + : typeof entry.channel === 'string' + ? entry.channel + : ''; + if (YINIAN_DISABLED_CHANNEL_IDS.has(channelType)) return false; + return !Array.from(YINIAN_DISABLED_CHANNEL_IDS).some((disabledId) => id.startsWith(`channel-${disabledId}-`)); + }); + if (nextAgents.length !== agents.list.length) { + agents.list = nextAgents; + modified = true; + console.log('[sanitize] Removed disabled channel agents from Yinian OpenClaw config'); + } + } + + return modified; +} + function removeLegacyMoonshotKimiSearchConfig(config: Record): boolean { const tools = isPlainRecord(config.tools) ? config.tools : null; const web = tools && isPlainRecord(tools.web) ? tools.web : null; @@ -1687,6 +1779,15 @@ export async function sanitizeOpenClawConfig(): Promise { if (modified) config.plugins = validPlugins; } else if (typeof plugins === 'object') { const pluginsObj = plugins as Record; + const KNOWN_INVALID_PLUGINS_ROOT_KEYS = ['bundledDiscovery']; + for (const key of KNOWN_INVALID_PLUGINS_ROOT_KEYS) { + if (key in pluginsObj) { + console.log(`[sanitize] Removing deprecated key "plugins.${key}" from openclaw.json`); + delete pluginsObj[key]; + modified = true; + } + } + if (Array.isArray(pluginsObj.load)) { const validLoad: unknown[] = []; for (const p of pluginsObj.load) { @@ -1784,14 +1885,16 @@ export async function sanitizeOpenClawConfig(): Promise { } // ── tools.profile & sessions.visibility ─────────────────────── - // OpenClaw 3.8+ requires tools.profile = 'full' and tools.sessions.visibility = 'all' - // for ClawX to properly integrate with its updated tool system. - const toolsConfig = (config.tools as Record | undefined) || {}; + // 智念助手需要保留多轮上下文、文件生成与能力包调用。 + // OpenClaw 的 messaging/minimal 档会进入 raw model run,导致每轮不 replay 历史。 + // 因此桌面端使用 coding 档,UI 层再隐藏普通用户不需要理解的开发者概念。 + const toolsConfig = isPlainRecord(config.tools) ? config.tools : {}; let toolsModified = false; - if (toolsConfig.profile !== 'full') { - toolsConfig.profile = 'full'; + if (toolsConfig.profile !== YINIAN_DESKTOP_TOOLS_PROFILE) { + toolsConfig.profile = YINIAN_DESKTOP_TOOLS_PROFILE; toolsModified = true; + console.log(`[sanitize] Set tools.profile="${YINIAN_DESKTOP_TOOLS_PROFILE}" for Yinian desktop chat latency`); } const sessions = (toolsConfig.sessions as Record | undefined) || {}; @@ -1821,6 +1924,56 @@ export async function sanitizeOpenClawConfig(): Promise { modified = true; } + // ── agents.defaults desktop defaults ────────────────────────── + // OpenClaw 会把可见 skills 汇总进系统上下文。对智念助手的普通对话, + // 默认不展开全量 skill 目录;后续由“快捷任务/能力包”按需注入。 + // OpenClaw 默认每 30 分钟在 main session 跑一次 heartbeat。桌面端不 + // 使用这类后台心跳任务,避免它变成普通用户可见的历史会话。 + if (isYinianManagedConfig(config)) { + const agentsConfig = isPlainRecord(config.agents) ? config.agents : {}; + const defaults = isPlainRecord(agentsConfig.defaults) ? agentsConfig.defaults : {}; + if (!Array.isArray(defaults.skills)) { + defaults.skills = []; + agentsConfig.defaults = defaults; + config.agents = agentsConfig; + modified = true; + console.log('[sanitize] Set agents.defaults.skills=[] for Yinian desktop lightweight chat'); + } + const heartbeat = isPlainRecord(defaults.heartbeat) ? defaults.heartbeat : {}; + if (heartbeat.every !== '0m') { + heartbeat.every = '0m'; + defaults.heartbeat = heartbeat; + agentsConfig.defaults = defaults; + config.agents = agentsConfig; + modified = true; + console.log('[sanitize] Disabled OpenClaw agent heartbeat for Yinian desktop'); + } + if (Array.isArray(agentsConfig.list)) { + const nextList = agentsConfig.list.map((entry) => { + if (!isPlainRecord(entry) || entry.id !== 'main') return entry; + const tools = isPlainRecord(entry.tools) ? entry.tools : {}; + if (tools.profile === YINIAN_DESKTOP_TOOLS_PROFILE) return entry; + return { + ...entry, + tools: { + ...tools, + profile: YINIAN_DESKTOP_TOOLS_PROFILE, + }, + }; + }); + if (JSON.stringify(nextList) !== JSON.stringify(agentsConfig.list)) { + agentsConfig.list = nextList; + config.agents = agentsConfig; + modified = true; + console.log(`[sanitize] Set main agent tools.profile="${YINIAN_DESKTOP_TOOLS_PROFILE}" for Yinian desktop context replay`); + } + } + } + + if (trimYinianPluginSurface(config)) { + modified = true; + } + // ── plugins.entries.feishu cleanup ────────────────────────────── // Normalize feishu plugin ids dynamically based on installed manifest. // Different environments may report either "openclaw-lark" or @@ -2224,6 +2377,10 @@ export async function sanitizeOpenClawConfig(): Promise { } } + if (trimYinianPluginSurface(config)) { + modified = true; + } + if (modified) { await writeOpenClawJson(config); console.log('[sanitize] openclaw.json sanitized successfully'); diff --git a/electron/utils/openclaw-cli.ts b/electron/utils/openclaw-cli.ts index 50a471c..31c80a6 100644 --- a/electron/utils/openclaw-cli.ts +++ b/electron/utils/openclaw-cli.ts @@ -8,8 +8,8 @@ import { existsSync, mkdirSync, readFileSync, + rmSync, symlinkSync, - unlinkSync, } from 'node:fs'; import { spawn } from 'node:child_process'; import { homedir } from 'node:os'; @@ -150,10 +150,9 @@ export async function installOpenClawCli(): Promise<{ try { mkdirSync(targetDir, { recursive: true }); - // Remove existing file/symlink to avoid EEXIST - if (existsSync(target)) { - unlinkSync(target); - } + // Remove existing file/symlink to avoid EEXIST. `existsSync` is false for + // broken symlinks, so use rmSync directly with force. + rmSync(target, { force: true }); symlinkSync(wrapperSrc, target); chmodSync(wrapperSrc, 0o755); @@ -304,7 +303,7 @@ export async function autoInstallCliIfNeeded( if (isCliInstalled()) { if (target && wrapperSrc && existsSync(target)) { try { - unlinkSync(target); + rmSync(target, { force: true }); symlinkSync(wrapperSrc, target); logger.debug(`Refreshed CLI symlink: ${target} -> ${wrapperSrc}`); } catch { diff --git a/electron/utils/optional-native-cleanup.ts b/electron/utils/optional-native-cleanup.ts new file mode 100644 index 0000000..f3253e6 --- /dev/null +++ b/electron/utils/optional-native-cleanup.ts @@ -0,0 +1,74 @@ +import { existsSync, readdirSync, rmSync } from 'node:fs'; +import { homedir } from 'node:os'; +import { join } from 'node:path'; + +function fsPath(filePath: string): string { + if (process.platform !== 'win32') return filePath; + if (!filePath) return filePath; + if (filePath.startsWith('\\\\?\\')) return filePath; + return `\\\\?\\${filePath.replace(/\//g, '\\')}`; +} + +function removeClipboardPackagesFromScope(scopeDir: string): number { + if (!existsSync(fsPath(scopeDir))) return 0; + + let removed = 0; + let entries: string[] = []; + try { + entries = readdirSync(fsPath(scopeDir)); + } catch { + return 0; + } + + for (const entry of entries) { + if (entry !== 'clipboard' && !entry.startsWith('clipboard-')) continue; + try { + rmSync(fsPath(join(scopeDir, entry)), { recursive: true, force: true }); + removed += 1; + } catch { + // Best-effort cleanup only. + } + } + + return removed; +} + +function cleanupNodeModules(nodeModulesDir: string): number { + return removeClipboardPackagesFromScope(join(nodeModulesDir, '@mariozechner')); +} + +function cleanupNodeModulesChildren(rootDir: string): number { + if (!existsSync(fsPath(rootDir))) return 0; + + let removed = 0; + let entries: Array<{ name: string; isDirectory: () => boolean }> = []; + try { + entries = readdirSync(fsPath(rootDir), { withFileTypes: true }) as typeof entries; + } catch { + return 0; + } + + for (const entry of entries) { + if (!entry.isDirectory()) continue; + removed += cleanupNodeModules(join(rootDir, entry.name, 'node_modules')); + } + + return removed; +} + +export function cleanupOpenClawRuntimeNativeClipboard(openclawDir: string): number { + return cleanupNodeModules(join(openclawDir, 'node_modules')); +} + +export function cleanupOpenClawUserNativeClipboard(): number { + const openclawHome = join(homedir(), '.openclaw'); + let removed = 0; + + removed += cleanupNodeModules(join(openclawHome, 'runtime', 'openclaw', 'node_modules')); + removed += cleanupNodeModules(join(openclawHome, 'npm', 'node_modules')); + removed += cleanupNodeModules(join(openclawHome, 'node_modules')); + removed += cleanupNodeModulesChildren(join(openclawHome, 'extensions')); + removed += cleanupNodeModulesChildren(join(openclawHome, 'plugin-runtime-deps')); + + return removed; +} diff --git a/electron/utils/paths.ts b/electron/utils/paths.ts index 8fbd167..1843c5a 100644 --- a/electron/utils/paths.ts +++ b/electron/utils/paths.ts @@ -6,6 +6,7 @@ import { createRequire } from 'node:module'; import { dirname, isAbsolute, join, normalize } from 'path'; import { homedir } from 'os'; import { cpSync, existsSync, mkdirSync, readFileSync, realpathSync, rmSync } from 'fs'; +import { cleanupOpenClawRuntimeNativeClipboard } from './optional-native-cleanup'; const require = createRequire(import.meta.url); @@ -33,6 +34,8 @@ const REQUIRED_OPENCLAW_CONTEXT_MODULES = [ 'qrcode-terminal/vendor/QRCode/index.js', 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js', ] as const; +const YINIAN_OPENCLAW_RUNTIME_PATCH_MARKER = '.yinian-runtime-patch.json'; +const YINIAN_OPENCLAW_RUNTIME_PATCH_VERSION = '2026-05-07-desktop-fast-chat-v1'; export { quoteForCmd, @@ -172,6 +175,25 @@ function hasRequiredOpenClawContextModules(dir: string): boolean { } } +function readYinianOpenClawRuntimePatchVersion(dir: string): string | undefined { + try { + const markerPath = join(dir, YINIAN_OPENCLAW_RUNTIME_PATCH_MARKER); + if (!existsSync(fsPath(markerPath))) return undefined; + const marker = JSON.parse(readFileSync(fsPath(markerPath), 'utf-8')) as { version?: string }; + return marker.version; + } catch { + return undefined; + } +} + +function hasYinianOpenClawRuntimePatch(dir: string): boolean { + return readYinianOpenClawRuntimePatchVersion(dir) === YINIAN_OPENCLAW_RUNTIME_PATCH_VERSION; +} + +function hasPackagedOpenClawRuntimeRequirements(dir: string): boolean { + return hasRequiredOpenClawContextModules(dir) && hasYinianOpenClawRuntimePatch(dir); +} + function samePath(left: string, right: string): boolean { try { return realpathSync(fsPath(left)) === realpathSync(fsPath(right)); @@ -253,10 +275,12 @@ function findExternalOpenClawDir(excludedDirs: string[]): string | null { seen.add(candidate); if (excludedDirs.some((excluded) => samePath(candidate, excluded))) continue; if (!isValidOpenClawPackageDir(candidate)) continue; - if (hasRequiredOpenClawContextModules(candidate)) return candidate; - logOpenClawRuntime('[openclaw-runtime] Ignoring external OpenClaw installation because required app dependencies are missing', { + if (hasPackagedOpenClawRuntimeRequirements(candidate)) return candidate; + logOpenClawRuntime('[openclaw-runtime] Ignoring external OpenClaw installation because it is not a patched Yinian runtime', { candidate, requiredModules: REQUIRED_OPENCLAW_CONTEXT_MODULES, + runtimePatchVersion: readYinianOpenClawRuntimePatchVersion(candidate) ?? null, + expectedRuntimePatchVersion: YINIAN_OPENCLAW_RUNTIME_PATCH_VERSION, }); } @@ -271,7 +295,7 @@ function installBundledOpenClawToManagedRuntime(bundledDir: string, managedDir: ? readOpenClawVersion(managedDir) : undefined; - if (managedVersion && bundledVersion && managedVersion === bundledVersion && hasRequiredOpenClawContextModules(managedDir)) { + if (managedVersion && bundledVersion && managedVersion === bundledVersion && hasPackagedOpenClawRuntimeRequirements(managedDir)) { return false; } @@ -279,6 +303,12 @@ function installBundledOpenClawToManagedRuntime(bundledDir: string, managedDir: rmSync(fsPath(tempDir), { recursive: true, force: true }); mkdirSync(fsPath(dirname(tempDir)), { recursive: true }); cpSync(fsPath(bundledDir), fsPath(tempDir), { recursive: true, dereference: true }); + const removedClipboardPackages = cleanupOpenClawRuntimeNativeClipboard(tempDir); + if (removedClipboardPackages > 0) { + logOpenClawRuntime('[openclaw-runtime] Removed optional native clipboard packages from managed runtime', { + removedClipboardPackages, + }); + } rmSync(fsPath(managedDir), { recursive: true, force: true }); cpSync(fsPath(tempDir), fsPath(managedDir), { recursive: true, dereference: true }); rmSync(fsPath(tempDir), { recursive: true, force: true }); @@ -303,7 +333,7 @@ function resolveOpenClawRuntime(): OpenClawRuntimeResolution { return cachedOpenClawRuntime; } - if (hasRequiredOpenClawContextModules(managedDir)) { + if (hasPackagedOpenClawRuntimeRequirements(managedDir)) { cachedOpenClawRuntime = { dir: managedDir, source: 'managed', @@ -337,7 +367,7 @@ function resolveOpenClawRuntime(): OpenClawRuntimeResolution { } } - if (hasRequiredOpenClawContextModules(managedDir)) { + if (hasPackagedOpenClawRuntimeRequirements(managedDir)) { cachedOpenClawRuntime = { dir: managedDir, source: 'managed', @@ -356,9 +386,11 @@ function resolveOpenClawRuntime(): OpenClawRuntimeResolution { } if (isValidOpenClawPackageDir(managedDir)) { - logOpenClawRuntime('[openclaw-runtime] Ignoring managed OpenClaw runtime because required app dependencies are missing', { + logOpenClawRuntime('[openclaw-runtime] Ignoring managed OpenClaw runtime because it is not a patched Yinian runtime', { managedDir, requiredModules: REQUIRED_OPENCLAW_CONTEXT_MODULES, + runtimePatchVersion: readYinianOpenClawRuntimePatchVersion(managedDir) ?? null, + expectedRuntimePatchVersion: YINIAN_OPENCLAW_RUNTIME_PATCH_VERSION, }); } @@ -415,10 +447,11 @@ export function reinstallManagedOpenClawRuntime(): OpenClawRuntimeResolution { installedFromBundled = installBundledOpenClawToManagedRuntime(bundledDir, managedDir); } + const managedReady = hasPackagedOpenClawRuntimeRequirements(managedDir); cachedOpenClawRuntime = { - dir: hasRequiredOpenClawContextModules(managedDir) ? managedDir : bundledDir, - source: hasRequiredOpenClawContextModules(managedDir) ? 'managed' : isValidOpenClawPackageDir(bundledDir) ? 'bundled' : 'missing', - version: readOpenClawVersion(hasRequiredOpenClawContextModules(managedDir) ? managedDir : bundledDir), + dir: managedReady ? managedDir : bundledDir, + source: managedReady ? 'managed' : isValidOpenClawPackageDir(bundledDir) ? 'bundled' : 'missing', + version: readOpenClawVersion(managedReady ? managedDir : bundledDir), bundledDir, managedDir, installedFromBundled, diff --git a/electron/utils/plugin-install.ts b/electron/utils/plugin-install.ts index 0e84842..10e6240 100644 --- a/electron/utils/plugin-install.ts +++ b/electron/utils/plugin-install.ts @@ -1,9 +1,8 @@ /** * Shared OpenClaw Plugin Install Utilities * - * Provides version-aware install/upgrade logic for bundled OpenClaw plugins - * (DingTalk, WeCom, Feishu, WeChat). Used both at app startup (to auto-upgrade - * stale plugins) and when a user configures a channel. + * Provides version-aware install/upgrade logic for bundled OpenClaw plugins. + * 智念助手内测包只主动管理核心插件,避免无用渠道插件被重新拉回。 * * Note: QQBot was moved to a built-in channel in OpenClaw 3.31 and is no longer * managed as a plugin. @@ -115,11 +114,9 @@ function toErrorDiagnostic(error: unknown): { code?: string; name?: string; mess // ── Known plugin-ID corrections ───────────────────────────────────────────── // Some npm packages ship with an openclaw.plugin.json whose "id" field -// doesn't match the ID the plugin code actually exports. After copying we -// patch both the manifest AND the compiled JS so the Gateway accepts them. -const MANIFEST_ID_FIXES: Record = { - 'wecom-openclaw-plugin': 'wecom', -}; +// doesn't match the ID the plugin code actually exports. Keep this hook for +// future bundled plugins that may need it. +const MANIFEST_ID_FIXES: Record = {}; /** * After a plugin has been copied to ~/.openclaw/extensions/, fix any @@ -231,10 +228,6 @@ function patchPluginEntryIds(targetDir: string): void { // ── Plugin npm name mapping ────────────────────────────────────────────────── const PLUGIN_NPM_NAMES: Record = { - dingtalk: '@soimy/dingtalk', - wecom: '@wecom/wecom-openclaw-plugin', - 'feishu-openclaw-plugin': '@larksuite/openclaw-lark', - 'openclaw-weixin': '@tencent-weixin/openclaw-weixin', }; @@ -498,24 +491,6 @@ export function buildCandidateSources(pluginDirName: string): string[] { // ── Per-channel plugin helpers ─────────────────────────────────────────────── -export function ensureDingTalkPluginInstalled(): { installed: boolean; warning?: string } { - return ensurePluginInstalled('dingtalk', buildCandidateSources('dingtalk'), 'DingTalk'); -} - -export function ensureWeComPluginInstalled(): { installed: boolean; warning?: string } { - return ensurePluginInstalled('wecom', buildCandidateSources('wecom'), 'WeCom'); -} - -export function ensureFeishuPluginInstalled(): { installed: boolean; warning?: string } { - return ensurePluginInstalled( - 'feishu-openclaw-plugin', - buildCandidateSources('feishu-openclaw-plugin'), - 'Feishu', - ); -} - - - export function ensureWeChatPluginInstalled(): { installed: boolean; warning?: string } { return ensurePluginInstalled('openclaw-weixin', buildCandidateSources('openclaw-weixin'), 'WeChat'); } @@ -530,10 +505,6 @@ export function ensureCloudSyncPluginInstalled(): { installed: boolean; warning? * All bundled plugins, in the same order as after-pack.cjs BUNDLED_PLUGINS. */ const ALL_BUNDLED_PLUGINS = [ - { fn: ensureDingTalkPluginInstalled, label: 'DingTalk' }, - { fn: ensureWeComPluginInstalled, label: 'WeCom' }, - - { fn: ensureFeishuPluginInstalled, label: 'Feishu' }, { fn: ensureWeChatPluginInstalled, label: 'WeChat' }, { fn: ensureCloudSyncPluginInstalled, label: 'Cloud Sync' }, ] as const; diff --git a/electron/utils/yinian-initializer.ts b/electron/utils/yinian-initializer.ts index 0902a9a..244f18e 100644 --- a/electron/utils/yinian-initializer.ts +++ b/electron/utils/yinian-initializer.ts @@ -28,6 +28,8 @@ export interface YinianInitializationStatus { const INTERNAL_PROVIDER_KEY = 'minimax'; const INTERNAL_MODEL_ID = 'MiniMax-M2.7'; const INTERNAL_MODEL_REF = `${INTERNAL_PROVIDER_KEY}/${INTERNAL_MODEL_ID}`; +const INTERNAL_MODEL_TIMEOUT_SECONDS = 300; +const DESKTOP_TOOLS_PROFILE = 'coding'; let initializationInFlight: Promise | null = null; const DEFAULT_STEPS: YinianInitializationStep[] = [ @@ -143,10 +145,12 @@ async function seedInternalModelConfig(): Promise { const config = await readJsonFile(configPath); const models = asObject(config.models); const providers = asObject(models.providers); + const pricing = asObject(models.pricing); providers[INTERNAL_PROVIDER_KEY] = { baseUrl: 'https://api.minimaxi.com/anthropic', api: 'anthropic-messages', authHeader: true, + timeoutSeconds: INTERNAL_MODEL_TIMEOUT_SECONDS, models: [ { id: INTERNAL_MODEL_ID, @@ -158,10 +162,19 @@ async function seedInternalModelConfig(): Promise { }, ], }; + pricing.enabled = false; models.mode = 'merge'; models.providers = providers; + models.pricing = pricing; config.models = models; + const tools = asObject(config.tools); + tools.profile = DESKTOP_TOOLS_PROFILE; + const sessions = asObject(tools.sessions); + sessions.visibility = 'all'; + tools.sessions = sessions; + config.tools = tools; + const agents = asObject(config.agents); const defaults = asObject(agents.defaults); defaults.model = { @@ -169,6 +182,11 @@ async function seedInternalModelConfig(): Promise { fallbacks: ['minimax/MiniMax-M2.5'], }; defaults.workspace = join(homedir(), '.openclaw', 'workspace'); + defaults.skills = []; + defaults.heartbeat = { + ...asObject(defaults.heartbeat), + every: '0m', + }; agents.defaults = defaults; if (!Array.isArray(agents.list)) { agents.list = [ @@ -178,8 +196,23 @@ async function seedInternalModelConfig(): Promise { default: true, workspace: join(homedir(), '.openclaw', 'workspace'), agentDir: '~/.openclaw/agents/main/agent', + skills: [], + tools: { profile: DESKTOP_TOOLS_PROFILE }, }, ]; + } else { + agents.list = agents.list.map((entry) => { + const agent = asObject(entry); + if (agent.id !== 'main') return entry; + return { + ...agent, + skills: Array.isArray(agent.skills) ? agent.skills : [], + tools: { + ...asObject(agent.tools), + profile: DESKTOP_TOOLS_PROFILE, + }, + }; + }); } config.agents = agents; diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 0000000..f6f019e --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,42 @@ +# EXAMPLE USAGE: +# +# Refer for explanation to following link: +# https://lefthook.dev/configuration/ +# +# pre-push: +# jobs: +# - name: packages audit +# tags: +# - frontend +# - security +# run: yarn audit +# +# - name: gems audit +# tags: +# - backend +# - security +# run: bundle audit +# +# pre-commit: +# parallel: true +# jobs: +# - run: yarn eslint {staged_files} +# glob: "*.{js,ts,jsx,tsx}" +# +# - name: rubocop +# glob: "*.rb" +# exclude: +# - config/application.rb +# - config/routes.rb +# run: bundle exec rubocop --force-exclusion -- {all_files} +# +# - name: govet +# files: git ls-files -m +# glob: "*.go" +# run: go vet -- {files} +# +# - script: "hello.js" +# runner: node +# +# - script: "hello.go" +# runner: go run diff --git a/package.json b/package.json index a930ce6..4bfb3ef 100644 --- a/package.json +++ b/package.json @@ -37,10 +37,12 @@ "predev": "node scripts/generate-ext-bridge.mjs && zx scripts/prepare-preinstalled-skills-dev.mjs", "dev": "vite", "ext:bridge": "node scripts/generate-ext-bridge.mjs", - "build": "node scripts/generate-ext-bridge.mjs && vite build && zx scripts/bundle-openclaw.mjs && zx scripts/bundle-openclaw-plugins.mjs && zx scripts/bundle-preinstalled-skills.mjs && electron-builder", + "build": "node scripts/generate-ext-bridge.mjs && vite build && zx scripts/bundle-openclaw.mjs && zx scripts/bundle-openclaw-plugins.mjs && zx scripts/bundle-preinstalled-skills.mjs && node scripts/prepare-nianxx-play-bundle.mjs && electron-builder", "build:vite": "vite build", "bundle:openclaw-plugins": "zx scripts/bundle-openclaw-plugins.mjs", "bundle:preinstalled-skills": "zx scripts/bundle-preinstalled-skills.mjs", + "prepare:nianxx-play": "node scripts/prepare-nianxx-play-bundle.mjs", + "prepare:nianxx-play:pilot": "NIANXX_PLAY_BUNDLE_ENV=1 node scripts/prepare-nianxx-play-bundle.mjs", "lint": "eslint . --fix", "typecheck": "tsc --noEmit", "test": "vitest run", @@ -50,16 +52,24 @@ "comms:baseline": "node scripts/comms/baseline.mjs", "comms:compare": "node scripts/comms/compare.mjs", "uv:download": "zx scripts/download-bundled-uv.mjs", + "uv:download:mac:arm64": "zx scripts/download-bundled-uv.mjs --target=darwin-arm64", "uv:download:mac": "zx scripts/download-bundled-uv.mjs --platform=mac", "uv:download:win": "zx scripts/download-bundled-uv.mjs --platform=win", "uv:download:linux": "zx scripts/download-bundled-uv.mjs --platform=linux", "uv:download:all": "zx scripts/download-bundled-uv.mjs --all", + "node:download:mac:arm64": "zx scripts/download-bundled-node.mjs --target=darwin-arm64", + "node:download:mac": "zx scripts/download-bundled-node.mjs --platform=mac", "node:download:win": "zx scripts/download-bundled-node.mjs --platform=win", + "prep:mac-binaries": "pnpm run uv:download:mac && pnpm run node:download:mac", + "prep:mac-binaries:arm64": "pnpm run uv:download:mac:arm64 && pnpm run node:download:mac:arm64", "prep:win-binaries": "pnpm run uv:download:win && pnpm run node:download:win", "icons": "zx scripts/generate-icons.mjs", - "package": "node scripts/generate-ext-bridge.mjs && vite build && zx scripts/bundle-openclaw.mjs && zx scripts/bundle-openclaw-plugins.mjs && zx scripts/bundle-preinstalled-skills.mjs", - "package:mac": "pnpm run package && electron-builder --mac --publish never", - "package:mac:local": "SKIP_PREINSTALLED_SKILLS=1 pnpm run package && electron-builder --mac --publish never", + "package": "node scripts/generate-ext-bridge.mjs && vite build && zx scripts/bundle-openclaw.mjs && zx scripts/bundle-openclaw-plugins.mjs && zx scripts/bundle-preinstalled-skills.mjs && node scripts/prepare-nianxx-play-bundle.mjs", + "package:pilot": "node scripts/generate-ext-bridge.mjs && vite build && zx scripts/bundle-openclaw.mjs && zx scripts/bundle-openclaw-plugins.mjs && zx scripts/bundle-preinstalled-skills.mjs && NIANXX_PLAY_BUNDLE_ENV=1 node scripts/prepare-nianxx-play-bundle.mjs", + "package:mac": "pnpm run prep:mac-binaries && pnpm run package && electron-builder --mac --publish never", + "package:mac:pilot": "pnpm run prep:mac-binaries && pnpm run package:pilot && electron-builder --mac --publish never", + "package:mac:pilot:arm64": "pnpm run prep:mac-binaries:arm64 && pnpm run package:pilot && electron-builder --mac --arm64 --publish never", + "package:mac:local": "pnpm run prep:mac-binaries && SKIP_PREINSTALLED_SKILLS=1 pnpm run package && electron-builder --mac --publish never", "package:win": "pnpm run prep:win-binaries && pnpm run package && electron-builder --win --publish never", "package:linux": "pnpm run package && electron-builder --linux --publish never", "release": "pnpm run uv:download && pnpm run package && electron-builder --publish always", @@ -72,24 +82,121 @@ "postversion": "git push && git push --tags" }, "dependencies": { + "@agentclientprotocol/claude-agent-acp": "0.31.1", + "@agentclientprotocol/sdk": "0.21.0", + "@anthropic-ai/sdk": "0.91.1", + "@anthropic-ai/vertex-sdk": "^0.16.0", + "@aws-sdk/client-bedrock": "3.1038.0", + "@aws-sdk/client-bedrock-runtime": "3.1038.0", + "@aws-sdk/client-s3": "3.1038.0", + "@aws-sdk/credential-provider-node": "3.972.37", + "@aws-sdk/s3-request-presigner": "3.1038.0", + "@aws/bedrock-token-generator": "^1.1.0", + "@azure/identity": "4.13.1", + "@clack/prompts": "^1.2.0", + "@clawdbot/lobster": "2026.4.6", + "@discordjs/voice": "^0.19.2", + "@google/genai": "^1.52.0", + "@grammyjs/runner": "^2.0.3", + "@grammyjs/transformer-throttler": "^1.2.1", + "@homebridge/ciao": "^1.3.8", + "@lancedb/lancedb": "^0.27.2", + "@larksuiteoapi/node-sdk": "^1.62.1", + "@line/bot-sdk": "^11.0.0", + "@lydell/node-pty": "1.2.0-beta.12", + "@mariozechner/pi-agent-core": "0.70.6", + "@mariozechner/pi-ai": "0.70.6", + "@mariozechner/pi-coding-agent": "0.70.6", + "@matrix-org/matrix-sdk-crypto-nodejs": "^0.5.1", + "@matrix-org/matrix-sdk-crypto-wasm": "18.2.0", + "@microsoft/teams.api": "2.0.8", + "@microsoft/teams.apps": "2.0.8", + "@modelcontextprotocol/sdk": "1.29.0", + "@mozilla/readability": "^0.6.0", + "@openai/codex": "0.125.0", + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/api-logs": "^0.215.0", + "@opentelemetry/exporter-logs-otlp-proto": "^0.215.0", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.215.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.215.0", + "@opentelemetry/resources": "^2.7.1", + "@opentelemetry/sdk-logs": "^0.215.0", + "@opentelemetry/sdk-metrics": "^2.7.1", + "@opentelemetry/sdk-node": "^0.215.0", + "@opentelemetry/sdk-trace-base": "^2.7.1", + "@opentelemetry/semantic-conventions": "^1.40.0", + "@pierre/diffs": "1.1.19", + "@pierre/theme": "0.0.29", "@sinclair/typebox": "^0.34.48", + "@slack/bolt": "^4.7.2", + "@slack/web-api": "^7.15.2", + "@tencent-connect/qqbot-connector": "^1.1.0", + "@tloncorp/tlon-skill": "0.3.5", + "@twurple/api": "^8.1.3", + "@twurple/auth": "^8.1.3", + "@twurple/chat": "^8.1.3", + "@urbit/aura": "^3.0.0", + "@zed-industries/codex-acp": "0.12.0", + "acpx": "0.6.1", + "ajv": "^8.20.0", + "chokidar": "^5.0.0", "clawhub": "^0.5.0", + "commander": "^14.0.3", + "croner": "^10.0.1", + "discord-api-types": "^0.38.47", + "dotenv": "^17.4.2", "electron-store": "^11.0.2", "electron-updater": "^6.8.3", + "express": "5.2.1", + "fake-indexeddb": "^6.2.5", + "gaxios": "7.1.4", + "global-agent": "^4.1.3", + "google-auth-library": "10.6.2", + "grammy": "^1.42.0", + "https-proxy-agent": "9.0.0", + "jimp": "^1.6.1", + "jiti": "^2.6.1", + "json5": "^2.2.3", + "jsonwebtoken": "9.0.3", + "jszip": "^3.10.1", + "jwks-rsa": "4.0.1", "katex": "^0.16.45", + "linkedom": "^0.18.12", "lru-cache": "^11.2.6", "mammoth": "1.12.0", + "markdown-it": "14.1.1", + "matrix-js-sdk": "41.4.0-rc.0", + "minimatch": "10.2.4", + "mpg123-decoder": "^1.0.3", "ms": "^2.1.3", + "music-metadata": "^11.12.3", + "node-edge-tts": "^1.2.10", "node-machine-id": "^1.1.12", + "nostr-tools": "^2.23.3", + "openai": "^6.34.0", + "openshell": "0.1.0", + "opusscript": "^0.1.1", + "pdfjs-dist": "^5.7.284", + "playwright-core": "1.59.1", "posthog-node": "^5.28.0", "rehype-katex": "^7.0.1", "remark-math": "^6.0.0", - "tar": "^6.2.1", - "ws": "^8.19.0" + "semver": "7.7.4", + "silk-wasm": "^3.7.1", + "sqlite-vec": "0.1.9", + "tar": "^7.5.13", + "tokenjuice": "0.7.0", + "tslog": "^4.10.2", + "typebox": "1.1.34", + "undici": "8.1.0", + "web-push": "^3.6.7", + "ws": "^8.19.0", + "yaml": "^2.8.3", + "zca-js": "2.1.2", + "zod": "^4.3.6" }, "devDependencies": { "@eslint/js": "^10.0.1", - "@larksuite/openclaw-lark": "2026.4.8", "@playwright/test": "^1.56.1", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", @@ -103,7 +210,6 @@ "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-toast": "^1.2.15", "@radix-ui/react-tooltip": "^1.2.8", - "@soimy/dingtalk": "^3.5.3", "@tencent-weixin/openclaw-weixin": "^2.1.10", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", @@ -114,7 +220,6 @@ "@typescript-eslint/eslint-plugin": "^8.56.0", "@typescript-eslint/parser": "^8.56.0", "@vitejs/plugin-react": "^5.1.4", - "@wecom/wecom-openclaw-plugin": "^2026.4.27", "@whiskeysockets/baileys": "7.0.0-rc.9", "autoprefixer": "^10.4.24", "class-variance-authority": "^0.7.1", @@ -129,7 +234,7 @@ "i18next": "^25.8.11", "jsdom": "^28.1.0", "lucide-react": "^0.563.0", - "openclaw": "2026.4.26", + "openclaw": "2026.4.29", "png2icons": "^2.0.1", "postcss": "^8.5.6", "react": "^19.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a800f1f..6e7d035 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,33 +12,294 @@ importers: .: dependencies: + '@agentclientprotocol/claude-agent-acp': + specifier: 0.31.1 + version: 0.31.1 + '@agentclientprotocol/sdk': + specifier: 0.21.0 + version: 0.21.0(zod@4.3.6) + '@anthropic-ai/sdk': + specifier: 0.91.1 + version: 0.91.1(zod@4.3.6) + '@anthropic-ai/vertex-sdk': + specifier: ^0.16.0 + version: 0.16.0(encoding@0.1.13)(zod@4.3.6) + '@aws-sdk/client-bedrock': + specifier: 3.1038.0 + version: 3.1038.0 + '@aws-sdk/client-bedrock-runtime': + specifier: 3.1038.0 + version: 3.1038.0 + '@aws-sdk/client-s3': + specifier: 3.1038.0 + version: 3.1038.0 + '@aws-sdk/credential-provider-node': + specifier: 3.972.37 + version: 3.972.37 + '@aws-sdk/s3-request-presigner': + specifier: 3.1038.0 + version: 3.1038.0 + '@aws/bedrock-token-generator': + specifier: ^1.1.0 + version: 1.1.0 + '@azure/identity': + specifier: 4.13.1 + version: 4.13.1 + '@clack/prompts': + specifier: ^1.2.0 + version: 1.2.0 + '@clawdbot/lobster': + specifier: 2026.4.6 + version: 2026.4.6 + '@discordjs/voice': + specifier: ^0.19.2 + version: 0.19.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1)(opusscript@0.1.1) + '@google/genai': + specifier: ^1.52.0 + version: 1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) + '@grammyjs/runner': + specifier: ^2.0.3 + version: 2.0.3(grammy@1.42.0(encoding@0.1.13)) + '@grammyjs/transformer-throttler': + specifier: ^1.2.1 + version: 1.2.1(grammy@1.42.0(encoding@0.1.13)) + '@homebridge/ciao': + specifier: ^1.3.8 + version: 1.3.8 + '@lancedb/lancedb': + specifier: ^0.27.2 + version: 0.27.2(apache-arrow@18.1.0) + '@larksuiteoapi/node-sdk': + specifier: ^1.62.1 + version: 1.62.1 + '@line/bot-sdk': + specifier: ^11.0.0 + version: 11.0.0 + '@lydell/node-pty': + specifier: 1.2.0-beta.12 + version: 1.2.0-beta.12 + '@mariozechner/pi-agent-core': + specifier: 0.70.6 + version: 0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + '@mariozechner/pi-ai': + specifier: 0.70.6 + version: 0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + '@mariozechner/pi-coding-agent': + specifier: 0.70.6 + version: 0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + '@matrix-org/matrix-sdk-crypto-nodejs': + specifier: ^0.5.1 + version: 0.5.1 + '@matrix-org/matrix-sdk-crypto-wasm': + specifier: 18.2.0 + version: 18.2.0 + '@microsoft/teams.api': + specifier: 2.0.8 + version: 2.0.8 + '@microsoft/teams.apps': + specifier: 2.0.8 + version: 2.0.8 + '@modelcontextprotocol/sdk': + specifier: 1.29.0 + version: 1.29.0(zod@4.3.6) + '@mozilla/readability': + specifier: ^0.6.0 + version: 0.6.0 + '@openai/codex': + specifier: 0.125.0 + version: 0.125.0 + '@opentelemetry/api': + specifier: ^1.9.1 + version: 1.9.1 + '@opentelemetry/api-logs': + specifier: ^0.215.0 + version: 0.215.0 + '@opentelemetry/exporter-logs-otlp-proto': + specifier: ^0.215.0 + version: 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-proto': + specifier: ^0.215.0 + version: 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': + specifier: ^0.215.0 + version: 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': + specifier: ^2.7.1 + version: 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': + specifier: ^0.215.0 + version: 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': + specifier: ^2.7.1 + version: 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-node': + specifier: ^0.215.0 + version: 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': + specifier: ^2.7.1 + version: 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': + specifier: ^1.40.0 + version: 1.40.0 + '@pierre/diffs': + specifier: 1.1.19 + version: 1.1.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@pierre/theme': + specifier: 0.0.29 + version: 0.0.29 '@sinclair/typebox': specifier: ^0.34.48 version: 0.34.48 + '@slack/bolt': + specifier: ^4.7.2 + version: 4.7.2(@types/express@5.0.6) + '@slack/web-api': + specifier: ^7.15.2 + version: 7.15.2 + '@tencent-connect/qqbot-connector': + specifier: ^1.1.0 + version: 1.1.0 + '@tloncorp/tlon-skill': + specifier: 0.3.5 + version: 0.3.5 + '@twurple/api': + specifier: ^8.1.3 + version: 8.1.3(@twurple/auth@8.1.3) + '@twurple/auth': + specifier: ^8.1.3 + version: 8.1.3 + '@twurple/chat': + specifier: ^8.1.3 + version: 8.1.3(@twurple/auth@8.1.3) + '@urbit/aura': + specifier: ^3.0.0 + version: 3.0.0 + '@zed-industries/codex-acp': + specifier: 0.12.0 + version: 0.12.0 + acpx: + specifier: 0.6.1 + version: 0.6.1 + ajv: + specifier: ^8.20.0 + version: 8.20.0 + chokidar: + specifier: ^5.0.0 + version: 5.0.0 clawhub: specifier: ^0.5.0 version: 0.5.0 + commander: + specifier: ^14.0.3 + version: 14.0.3 + croner: + specifier: ^10.0.1 + version: 10.0.1 + discord-api-types: + specifier: ^0.38.47 + version: 0.38.47 + dotenv: + specifier: ^17.4.2 + version: 17.4.2 electron-store: specifier: ^11.0.2 version: 11.0.2 electron-updater: specifier: ^6.8.3 version: 6.8.3 + express: + specifier: 5.2.1 + version: 5.2.1 + fake-indexeddb: + specifier: ^6.2.5 + version: 6.2.5 + gaxios: + specifier: 7.1.4 + version: 7.1.4 + global-agent: + specifier: ^4.1.3 + version: 4.1.3 + google-auth-library: + specifier: 10.6.2 + version: 10.6.2 + grammy: + specifier: ^1.42.0 + version: 1.42.0(encoding@0.1.13) + https-proxy-agent: + specifier: 7.0.6 + version: 7.0.6 + jimp: + specifier: ^1.6.1 + version: 1.6.1 + jiti: + specifier: ^2.6.1 + version: 2.6.1 + json5: + specifier: ^2.2.3 + version: 2.2.3 + jsonwebtoken: + specifier: 9.0.3 + version: 9.0.3 + jszip: + specifier: ^3.10.1 + version: 3.10.1 + jwks-rsa: + specifier: 4.0.1 + version: 4.0.1 katex: specifier: ^0.16.45 version: 0.16.45 + linkedom: + specifier: ^0.18.12 + version: 0.18.12 lru-cache: specifier: ^11.2.6 version: 11.2.7 mammoth: specifier: 1.12.0 version: 1.12.0 + markdown-it: + specifier: 14.1.1 + version: 14.1.1 + matrix-js-sdk: + specifier: 41.4.0-rc.0 + version: 41.4.0-rc.0 + minimatch: + specifier: 10.2.4 + version: 10.2.4 + mpg123-decoder: + specifier: ^1.0.3 + version: 1.0.3 ms: specifier: ^2.1.3 version: 2.1.3 + music-metadata: + specifier: ^11.12.3 + version: 11.12.3 + node-edge-tts: + specifier: ^1.2.10 + version: 1.2.10 node-machine-id: specifier: ^1.1.12 version: 1.1.12 + nostr-tools: + specifier: ^2.23.3 + version: 2.23.3(typescript@5.9.3) + openai: + specifier: ^6.34.0 + version: 6.34.0(ws@8.20.0)(zod@4.3.6) + openshell: + specifier: 0.1.0 + version: 0.1.0(encoding@0.1.13) + opusscript: + specifier: ^0.1.1 + version: 0.1.1 + pdfjs-dist: + specifier: ^5.7.284 + version: 5.7.284 + playwright-core: + specifier: 1.59.1 + version: 1.59.1 posthog-node: specifier: ^5.28.0 version: 5.28.5 @@ -48,19 +309,49 @@ importers: remark-math: specifier: ^6.0.0 version: 6.0.0 + semver: + specifier: 7.7.4 + version: 7.7.4 + silk-wasm: + specifier: ^3.7.1 + version: 3.7.1 + sqlite-vec: + specifier: 0.1.9 + version: 0.1.9 tar: - specifier: ^6.2.1 - version: 6.2.1 + specifier: ^7.5.13 + version: 7.5.13 + tokenjuice: + specifier: 0.7.0 + version: 0.7.0 + tslog: + specifier: ^4.10.2 + version: 4.10.2 + typebox: + specifier: 1.1.34 + version: 1.1.34 + undici: + specifier: 8.1.0 + version: 8.1.0 + web-push: + specifier: ^3.6.7 + version: 3.6.7 ws: specifier: ^8.19.0 version: 8.20.0 + yaml: + specifier: ^2.8.3 + version: 2.8.3 + zca-js: + specifier: 2.1.2 + version: 2.1.2 + zod: + specifier: ^4.3.6 + version: 4.3.6 devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.1.0(jiti@1.21.7)) - '@larksuite/openclaw-lark': - specifier: 2026.4.8 - version: 2026.4.8(openclaw@2026.4.26) + version: 10.0.1(eslint@10.1.0(jiti@2.6.1)) '@playwright/test': specifier: ^1.56.1 version: 1.59.0 @@ -100,9 +391,6 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.2.8 version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@soimy/dingtalk': - specifier: ^3.5.3 - version: 3.5.3(openclaw@2026.4.26) '@tencent-weixin/openclaw-weixin': specifier: ^2.1.10 version: 2.1.10 @@ -126,16 +414,13 @@ importers: version: 8.18.1 '@typescript-eslint/eslint-plugin': specifier: ^8.56.0 - version: 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3))(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3) + version: 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.56.0 - version: 8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3) + version: 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.1.4 - version: 5.2.0(vite@7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3)) - '@wecom/wecom-openclaw-plugin': - specifier: ^2026.4.27 - version: 2026.4.27 + version: 5.2.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) '@whiskeysockets/baileys': specifier: 7.0.0-rc.9 version: 7.0.0-rc.9(jimp@1.6.1)(sharp@0.34.5) @@ -156,13 +441,13 @@ importers: version: 26.8.1(electron-builder-squirrel-windows@26.8.1) eslint: specifier: ^10.0.0 - version: 10.1.0(jiti@1.21.7) + version: 10.1.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^7.0.1 - version: 7.0.1(eslint@10.1.0(jiti@1.21.7)) + version: 7.0.1(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.5.0 - version: 0.5.2(eslint@10.1.0(jiti@1.21.7)) + version: 0.5.2(eslint@10.1.0(jiti@2.6.1)) framer-motion: specifier: ^12.34.2 version: 12.38.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -179,8 +464,8 @@ importers: specifier: ^0.563.0 version: 0.563.0(react@19.2.4) openclaw: - specifier: 2026.4.26 - version: 2026.4.26 + specifier: 2026.4.29 + version: 2026.4.29 png2icons: specifier: ^2.0.1 version: 2.0.1 @@ -216,10 +501,10 @@ importers: version: 3.5.0 tailwindcss: specifier: ^3.4.19 - version: 3.4.19(yaml@2.8.3) + version: 3.4.19(tsx@4.21.0)(yaml@2.8.3) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.19(yaml@2.8.3)) + version: 1.0.7(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.3)) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -228,7 +513,7 @@ importers: version: 1.1.3(react@19.2.4) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3) + version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) vite-plugin-electron: specifier: ^0.29.0 version: 0.29.1(vite-plugin-electron-renderer@0.14.6) @@ -237,7 +522,7 @@ importers: version: 0.14.6 vitest: specifier: ^4.0.18 - version: 4.1.1(@types/node@25.5.0)(jsdom@28.1.0(@noble/hashes@2.0.1))(vite@7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3)) + version: 4.1.1(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@28.1.0(@noble/hashes@2.0.1))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) zustand: specifier: ^5.0.11 version: 5.0.12(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) @@ -280,15 +565,83 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@agentclientprotocol/claude-agent-acp@0.31.1': + resolution: {integrity: sha512-FDW2dBfzS0KTapC3muh8yTh6TrAFP0+nIJ+O7FWrnmIijX0qZqr6GP661+WskmBCqAbKabXgXWO757GUk7RYLA==} + hasBin: true + '@agentclientprotocol/sdk@0.20.0': resolution: {integrity: sha512-BxEHyE4MvwyOsdyVPub1vEtyrq8E0JSdjC+ckXWimY1VabFCTXdPyXv2y2Omz1j+iod7Z8oBJDXFCJptM0GBqQ==} peerDependencies: zod: ^3.25.0 || ^4.0.0 + '@agentclientprotocol/sdk@0.21.0': + resolution: {integrity: sha512-ONj+Q8qOdNQp5XbH5jnMwzT9IKZJsSN0p0lkceS4GtUtNOPVLpNzSS8gqQdGMKfBvA0ESbkL8BTaSN1Rc9miEw==} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.2.119': + resolution: {integrity: sha512-kxnG37SZqUata2Jcp/YQ0n9Y7o/sinE/8LdG4ltM1gePh+z+0Mfa4vBUUTEBMBFth9PTovKoesIuVuyFpvO/Cw==} + cpu: [arm64] + os: [darwin] + + '@anthropic-ai/claude-agent-sdk-darwin-x64@0.2.119': + resolution: {integrity: sha512-9Aj8g3ELsmZuOFg17TCkikeg/Wt2ucVT8hOOPQUatzLd7BKhydrHLA0RP42nBpWECO1B/n/mPdQ4iS/LS3s2Fg==} + cpu: [x64] + os: [darwin] + + '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.2.119': + resolution: {integrity: sha512-IPGWgtz+gGnD7fxKAvSf913EUT/lYBTBE8EZ7lh3+x5ZP2859LWLmrCm053Lf3nMWo/CWikZsVPwkDVwpz6tIQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@anthropic-ai/claude-agent-sdk-linux-arm64@0.2.119': + resolution: {integrity: sha512-v3o464XkiYehp/OKidQQirxdVb+aGSvdJvHF2zH9p33W8M/NC21zwwh4dhwDnKsyrtBIgkt2CcMwzIl30r0OtA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.2.119': + resolution: {integrity: sha512-QYxFNAe4FFridPkKhGlNcNBJ0TaIygWYyvfI9g4kX0i+RVbresUWuZVkWY06ioJ0fXoixFJ+HNQBMB7dLrIp8Q==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@anthropic-ai/claude-agent-sdk-linux-x64@0.2.119': + resolution: {integrity: sha512-9ePt4ZN+hsqDw4AgS4KtcWIGKfL9Oq28kwkrTER/QAcSrVKxiLonp81cCLzg7Ok/IUJu4Cfd71GZbFv/WE54zw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@anthropic-ai/claude-agent-sdk-win32-arm64@0.2.119': + resolution: {integrity: sha512-p/TjcKQvkCYtXGPlR+mdyNwqCmvRcQL34Wtq0yUZ+iqmI/eyCe59IJ3AZrE0EZoqmiAevEYzatPIt9sncC9uxw==} + cpu: [arm64] + os: [win32] + + '@anthropic-ai/claude-agent-sdk-win32-x64@0.2.119': + resolution: {integrity: sha512-k98Ju0wtktm6FhqTE/cXlVr6K4kGqBolVjEGzeKkW6ZILc7124euwNapAvkQCwMAavAxS/ZnO3jdKMtHtwTVTA==} + cpu: [x64] + os: [win32] + + '@anthropic-ai/claude-agent-sdk@0.2.119': + resolution: {integrity: sha512-6AvthpsaOTlkn514brSGOcCSLHDXODnU+ExN1O3CJCjxr5RBcmzR057C9EIM0G7IchnXsRfMZgRO1QKsjTXdbA==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^4.0.0 + + '@anthropic-ai/sdk@0.81.0': + resolution: {integrity: sha512-D4K5PvEV6wPiRtVlVsJHIUhHAmOZ6IT/I9rKlTf84gR7GyyAurPJK7z9BOf/AZqC5d1DhYQGJNKRmV+q8dGhgw==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + '@anthropic-ai/sdk@0.90.0': resolution: {integrity: sha512-MzZtPabJF1b0FTDl6Z6H5ljphPwACLGP13lu8MTiB8jXaW/YXlpOp+Po2cVou3MPM5+f5toyLnul9whKCy7fBg==} hasBin: true @@ -298,6 +651,18 @@ packages: zod: optional: true + '@anthropic-ai/sdk@0.91.1': + resolution: {integrity: sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==} + 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==} + '@ark/schema@0.56.0': resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} @@ -318,6 +683,12 @@ packages: resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} @@ -335,54 +706,130 @@ packages: resolution: {integrity: sha512-oGiqs9v9WzPOdv7PDdm9iPibHgrbDvCDyNg43wFZn2PiiEUisFM+xUP2CRMsj41SmwZPhohmZkXiUu1+MghbAQ==} 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-cognito-identity@3.1043.0': + resolution: {integrity: sha512-ALRMiZ1UO6Vs4stAv0xkuUTxGJGHbSQ/T/m62sKDWu9fyTiz4Xo5UHUyeD7l5xgfRWVCbpzSJzfoEtzlBrc6TQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-s3@3.1038.0': + resolution: {integrity: sha512-k60qm50bWkaqNfCJe1z28WaqgpztE0wbWVMZw6ZJcTOGfrWFhsJeLCEqtkH8w00iEozKx9GQwdQXz4G0sMGdKA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/core@3.974.6': resolution: {integrity: sha512-8Vu7zGxu+39ChR/s5J7nXBw3a2kMHAi0OfKT8ohgTVjX0qYed/8mIfdBb638oBmKrWCwwKjYAM5J/4gMJ8nAJA==} engines: {node: '>=20.0.0'} + '@aws-sdk/core@3.974.8': + resolution: {integrity: sha512-njR2qoG6ZuB0kvAS2FyICsFZJ6gmCcf2X/7JcD14sUvGDm26wiZ5BrA6LOiUxKFEF+IVe7kdroxyE00YlkiYsw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/crc64-nvme@3.972.7': + resolution: {integrity: sha512-QUagVVBbC8gODCF6e1aV0mE2TXWB9Opz4k8EJFdNrujUVQm5R4AjJa1mpOqzwOuROBzqJU9zawzig7M96L8Ejg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.972.31': + resolution: {integrity: sha512-W5JtzDp3ejzhOOknXlnt+vJsNN2GZdAcBK+hR7HQ1DCacXqS0UpmnIyihIU7CK0IB+XYWeBaN3bBv4pXavp7Vg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-env@3.972.32': resolution: {integrity: sha512-7vA4GHg8NSmQxquJHSBcSM3RgB4ZaaRi6u4+zGFKOmOH6aqlgr2Sda46clkZDYzlirgfY96w15Zj0jh6PT48ng==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-env@3.972.34': + resolution: {integrity: sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.972.34': resolution: {integrity: sha512-vBrhWujFCLp1u8ptJRWYlipMutzPptb8pDQ00rKVH9q67T7rGd3VTWIj63aKrlLuY6qSsw1Rt5F/D/7wnNgryA==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.972.36': + resolution: {integrity: sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.972.36': resolution: {integrity: sha512-FBHyCmV8EB0gUvh1d+CZm87zt2PrdC7OyWexLRoH3I5zWSOUGa+9t58Y5jbxRfwUp3AWpHAFvKY6YzgR845sVA==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.972.38': + resolution: {integrity: sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.972.36': resolution: {integrity: sha512-IFap01lJKxQc0C/OHmZwZQr/cKq0DhrcmKedRrdnnl42D+P0SImnnnWQjv07uIPqpEdtqmkPXb9TiPYTU+prxQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.972.38': + resolution: {integrity: sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-node@3.972.37': resolution: {integrity: sha512-/WFixFAAiw8WpmjZcI0l4t3DerXLmVinOIfuotmRZnu2qmsFPoqqmstASz0z8bi1pGdFXzeLzf6bwucM3mZcUQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-node@3.972.39': + resolution: {integrity: sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.972.32': resolution: {integrity: sha512-uZp4tlGbpczV8QxmtIwOpSkcyGtBRR8/T4BAumRKfAt1nwCig3FSCZvrKl6ARDIDVRYn5p2oRcAsfFR01EgMGA==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.972.34': + resolution: {integrity: sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.972.36': resolution: {integrity: sha512-DsLr0UHMyKzRJKe2bjlwU8q1cfoXg8TIJKV/xwvnalAemiZLOZunFzj/whGnFDZIBVLdnbLiwv5SvRf1+CSwkg==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.972.38': + resolution: {integrity: sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.36': resolution: {integrity: sha512-uzrURO7frJhHQVVNR5zBJcCYeMYflmXcWBK1+MiBym2Dfjh6nXATrMixrmGZi+97Q7ETZ+y/4lUwAy0Nfnznjw==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.38': + resolution: {integrity: sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-providers@3.1043.0': + resolution: {integrity: sha512-pOM9CG72ecjZwlMnmihwDbZYjgTHz28G+W5yUTlL9a9CpR6FxIEyzejKer/69RRN5ePUAyEnsmwuxn4EdBKzDw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/eventstream-handler-node@3.972.14': resolution: {integrity: sha512-m4X56gxG76/CKfxNVbOFuYwnAZcHgS6HOH8lgp15HoGHIAVTcZfZrXvcYzJFOMLEJgVn+JHBu6EiNV+xSNXXFg==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.972.10': + resolution: {integrity: sha512-Vbc2frZH7wXlMNd+ZZSXUEs/l1Sv8Jj4zUnIfwrYF5lwaLdXHZ9xx4U3rjUcaye3HRhFVc+E5DbBxpRAbB16BA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-eventstream@3.972.10': resolution: {integrity: sha512-QUqLs7Af1II9X4fCRAu+EGHG3KHyOp4RkuLhRKoA3NuFlh6TL8i+zXBl8w2LUxqm44B/Kom45hgSlwA1SpTsXQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-expect-continue@3.972.10': + resolution: {integrity: sha512-2Yn0f1Qiq/DjxYR3wfI3LokXnjOhFM7Ssn4LTdFDIxRMCE6I32MAsVnhPX1cUZsuVA9tiZtwwhlSLAtFGxAZlQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.974.16': + resolution: {integrity: sha512-6ru8doI0/XzszqLIPXf0E/V7HhAw1Pu94010XCKYtBUfD0LxF0BuOzrUf8OQGR6j2o6wgKTHUniOmndQycHwCA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-host-header@3.972.10': resolution: {integrity: sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-location-constraint@3.972.10': + resolution: {integrity: sha512-rI3NZvJcEvjoD0+0PI0iUAwlPw2IlSlhyvgBK/3WkKJQE/YiKFedd9dMN2lVacdNxPNhxL/jzQaKQdrGtQagjQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-logger@3.972.10': resolution: {integrity: sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==} engines: {node: '>=20.0.0'} @@ -395,10 +842,22 @@ packages: resolution: {integrity: sha512-lLppaNTAz+wNgLdi4FtHzrlwrGF0ODTnBWHBaFg85SKs0eJ+M+tP5ifrA8f/0lNd+Ak3MC1NGC6RavV3ny4HTg==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-sdk-s3@3.972.37': + resolution: {integrity: sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-ssec@3.972.10': + resolution: {integrity: sha512-Gli9A0u8EVVb+5bFDGS/QbSVg28w/wpEidg1ggVcSj65BDTdGR6punsOcVjqdiu1i42WHWo51MCvARPIIz9juw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-user-agent@3.972.36': resolution: {integrity: sha512-O2beToxguBvrZFFZ+fFgPbbae8MvyIBjQ6lImee4APHEXXNAD5ZJ2ayLF1mb7rsKw86TM81y5czg82bZncjSjg==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-user-agent@3.972.38': + resolution: {integrity: sha512-iz+B29TXcAZsJpwB+AwG/TTGA5l/VnmMZ2UxtiySOZjI6gCdmviXPwdgzcmuazMy16rXoPY4mYCGe7zdNKfx5A==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-websocket@3.972.16': resolution: {integrity: sha512-86+S9oCyRVGzoMRpQhxkArp7kD2K75GPmaNevd9B6EyNhWoNvnCZZ3WbgN4j7ZT+jvtvBCGZvI2XHsWZJ+BRIg==} engines: {node: '>= 14.0.0'} @@ -407,18 +866,34 @@ packages: resolution: {integrity: sha512-4Sf+WY1lMJzXlw5MiyCMe/UzdILCwvuaHThbqMXS6dfh9gZy3No360I42RXquOI/ULUOhWy2HCyU0Fp20fQGPQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/nested-clients@3.997.6': + resolution: {integrity: sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w==} + engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.972.13': resolution: {integrity: sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==} engines: {node: '>=20.0.0'} + '@aws-sdk/s3-request-presigner@3.1038.0': + resolution: {integrity: sha512-2PNCm+2Mx8v2GKRREKMS3PavahzRhmMMJjuJxUpLneQV4w3oMs2bpme62oU6l+hip1pyeyPimWHeabjhaURocw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/signature-v4-multi-region@3.996.23': resolution: {integrity: sha512-wBbys3Y53Ikly556vyADurKpYQHXS7Jjaskbz+Ga9PZCz7PB/9f3VdKbDlz7dqIzn+xwz7L/a6TR4iXcOi8IRw==} engines: {node: '>=20.0.0'} + '@aws-sdk/signature-v4-multi-region@3.996.25': + resolution: {integrity: sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.1038.0': resolution: {integrity: sha512-Qniru+9oGGb/HNK/gGZWbV3jsD0k71ngE7qMQ/x6gYNYLd2EOwHCS6E2E6jfkaqO4i0d+nNKmfRy8bNcshKdGQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.1041.0': + resolution: {integrity: sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/types@3.973.8': resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==} engines: {node: '>=20.0.0'} @@ -451,14 +926,83 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.973.24': + resolution: {integrity: sha512-ZWwlkjcIp7cEL8ZfTpTAPNkwx25p7xol0xlKoWVVf22+nsjwmLcHYtTPjIV1cSpmB/b6DaK4cb1fSkvCXHgRdw==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/xml-builder@3.972.21': resolution: {integrity: sha512-qxNiHUtlrsjTeSlrPWiFkWps7uD6YB4eKzg7eLAFH8jbiHTlt0ePNlo2Xu+WlftP38JIcMaIX4jTUjOlE2ySWw==} engines: {node: '>=20.0.0'} + '@aws-sdk/xml-builder@3.972.22': + resolution: {integrity: sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA==} + engines: {node: '>=20.0.0'} + + '@aws/bedrock-token-generator@1.1.0': + resolution: {integrity: sha512-i+DkWnfdA4j4sffy9dI4k3OGoOWqN8CTGdtO4IZ3c0kpKYFr6KyqzqLQmoRNrF3ACFcWj6u+J6cbBQ97j9wx5w==} + engines: {node: '>=16.0.0'} + '@aws/lambda-invoke-store@0.2.4': resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} engines: {node: '>=18.0.0'} + '@azure/abort-controller@2.1.2': + resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} + engines: {node: '>=18.0.0'} + + '@azure/core-auth@1.10.1': + resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} + engines: {node: '>=20.0.0'} + + '@azure/core-client@1.10.1': + resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==} + engines: {node: '>=20.0.0'} + + '@azure/core-rest-pipeline@1.23.0': + resolution: {integrity: sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==} + engines: {node: '>=20.0.0'} + + '@azure/core-tracing@1.3.1': + resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} + engines: {node: '>=20.0.0'} + + '@azure/core-util@1.13.1': + resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} + engines: {node: '>=20.0.0'} + + '@azure/identity@4.13.1': + resolution: {integrity: sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==} + engines: {node: '>=20.0.0'} + + '@azure/logger@1.3.0': + resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} + engines: {node: '>=20.0.0'} + + '@azure/msal-browser@5.9.0': + resolution: {integrity: sha512-CzE+4PefDSJWj26zU7G1bKchlGRRHMBFreG4tAlGuzyI8hAPiYGobaJvZBgZBf6L63iphX7VH+ityL8VgEQz9Q==} + engines: {node: '>=0.8.0'} + + '@azure/msal-common@15.17.0': + resolution: {integrity: sha512-VQ5/gTLFADkwue+FohVuCqlzFPUq4xSrX8jeZe+iwZuY6moliNC8xt86qPVNYdtbQfELDf2Nu6LI+demFPHGgw==} + engines: {node: '>=0.8.0'} + + '@azure/msal-common@16.5.2': + resolution: {integrity: sha512-GkDEL6TYo3HgT3UuqakdgE9PZfc1hMki6+Hwgy1uddb/EauvAKfu85vVhuofRSo22D1xTnWt8Ucwfg4vSCVwvA==} + engines: {node: '>=0.8.0'} + + '@azure/msal-node@3.8.10': + resolution: {integrity: sha512-0Hz7Kx4hs70KZWep/Rd7aw/qOLUF92wUOhn7ZsOuB5xNR/06NL1E2RAI9+UKH1FtvN8nD6mFjH7UKSjv6vOWvQ==} + engines: {node: '>=16'} + + '@azure/msal-node@5.1.5': + resolution: {integrity: sha512-ObTeMoNPmq19X3z40et9Xvs4ZoWVeJg43PZMRLG5iwVL+2nCtAerG3YTDItqPp1CfXNwmCXBbg8jn1DOx65c3g==} + engines: {node: '>=20'} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -575,6 +1119,11 @@ packages: '@clack/prompts@1.2.0': resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==} + '@clawdbot/lobster@2026.4.6': + resolution: {integrity: sha512-v8QQHAykISyiSIVBtdBKDSQtfigZ4mUoPkUFYVZjvn2LRQGvtnX6uDvhgXu3QaxLF3MDSGMphgzDpkLrh1xnbw==} + engines: {node: '>=20'} + hasBin: true + '@csstools/color-helpers@6.0.2': resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} @@ -611,10 +1160,47 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} + '@d-fischer/cache-decorators@4.0.1': + resolution: {integrity: sha512-HNYLBLWs/t28GFZZeqdIBqq8f37mqDIFO6xNPof94VjpKvuP6ROqCZGafx88dk5zZUlBfViV9jD8iNNlXfc4CA==} + + '@d-fischer/connection@10.0.1': + resolution: {integrity: sha512-CRP/azUPxwWpR4yT8wOQoM9XFliTVWVAJ8h1SlFnVRAgMlPNyg88/vbDEqZ+udtSB5m8uS10XafZxMUcegMBlQ==} + + '@d-fischer/deprecate@2.0.2': + resolution: {integrity: sha512-wlw3HwEanJFJKctwLzhfOM6LKwR70FPfGZGoKOhWBKyOPXk+3a9Cc6S9zhm6tka7xKtpmfxVIReGUwPnMbIaZg==} + + '@d-fischer/detect-node@3.0.1': + resolution: {integrity: sha512-0Rf3XwTzuTh8+oPZW9SfxTIiL+26RRJ0BRPwj5oVjZFyFKmsj9RGfN2zuTRjOuA3FCK/jYm06HOhwNK+8Pfv8w==} + + '@d-fischer/escape-string-regexp@5.0.0': + resolution: {integrity: sha512-7eoxnxcto5eVPW5h1T+ePnVFukmI9f/ZR9nlBLh1t3kyzJDUNor2C+YW9H/Terw3YnbZSDgDYrpCJCHtOtAQHw==} + engines: {node: '>=10'} + + '@d-fischer/isomorphic-ws@7.0.2': + resolution: {integrity: sha512-xK+qIJUF0ne3dsjq5Y3BviQ4M+gx9dzkN+dPP7abBMje4YRfow+X9jBgeEoTe5e+Q6+8hI9R0b37Okkk8Vf0hQ==} + peerDependencies: + ws: ^8.2.0 + + '@d-fischer/logger@4.2.4': + resolution: {integrity: sha512-TFMZ/SVW8xyQtyJw9Rcuci4betSKy0qbQn2B5+1+72vVXeO8Qb1pYvuwF5qr0vDGundmSWq7W8r19nVPnXXSvA==} + + '@d-fischer/rate-limiter@1.1.0': + resolution: {integrity: sha512-O5HgACwApyCZhp4JTEBEtbv/W3eAwEkrARFvgWnEsDmXgCMWjIHwohWoHre5BW6IYXFSHBGsuZB/EvNL3942kQ==} + + '@d-fischer/shared-utils@3.6.4': + resolution: {integrity: sha512-BPkVLHfn2Lbyo/ENDBwtEB8JVQ+9OzkjJhUunLaxkw4k59YFlQxUUwlDBejVSFcpQT0t+D3CQlX+ySZnQj0wxw==} + + '@d-fischer/typed-event-emitter@3.3.3': + resolution: {integrity: sha512-OvSEOa8icfdWDqcRtjSEZtgJTFOFNgTjje7zaL0+nAtu2/kZtRCSK5wUMrI/aXtCH8o0Qz2vA8UqkhWUTARFQQ==} + '@develar/schema-utils@2.6.5': resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} engines: {node: '>= 8.9.0'} + '@discordjs/voice@0.19.2': + resolution: {integrity: sha512-3yJ255e4ag3wfZu/DSxeOZK1UtnqNxnspmLaQetGT0pDkThNZoHs+Zg6dgZZ19JEVomXygvfHn9lNpICZuYtEA==} + engines: {node: '>=22.12.0'} + '@electron/asar@3.4.1': resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} engines: {node: '>=10.12.0'} @@ -655,9 +1241,15 @@ packages: engines: {node: '>=14.14'} hasBin: true + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/runtime@1.9.1': resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.27.4': resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} engines: {node: '>=18'} @@ -814,6 +1406,9 @@ packages: cpu: [x64] os: [win32] + '@eshaz/web-worker@1.2.2': + resolution: {integrity: sha512-WxXiHFmD9u/owrzempiDlBB1ZYqiLnm9s6aPc8AlFQalq2tKmqdmMr9GXOupDgzXtqnBipj8Un0gkIm7Sjf8mw==} + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -877,8 +1472,8 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@google/genai@1.49.0': - resolution: {integrity: sha512-hO69Zl0H3x+L0KL4stl1pLYgnqnwHoLqtKy6MRlNnW8TAxjqMdOUVafomKd4z1BePkzoxJWbYILny9a2Zk43VQ==} + '@google/genai@1.52.0': + resolution: {integrity: sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.25.2 @@ -886,12 +1481,40 @@ packages: '@modelcontextprotocol/sdk': optional: true + '@grammyjs/runner@2.0.3': + resolution: {integrity: sha512-nckmTs1dPWfVQteK9cxqxzE+0m1VRvluLWB8UgFzsjg62w3qthPJt0TYtJBEdG7OedvfQq4vnFAyE6iaMkR42A==} + engines: {node: '>=12.20.0 || >=14.13.1'} + peerDependencies: + grammy: ^1.13.1 + + '@grammyjs/transformer-throttler@1.2.1': + resolution: {integrity: sha512-CpWB0F3rJdUiKsq7826QhQsxbZi4wqfz1ccKX+fr+AOC+o8K7ZvS+wqX0suSu1QCsyUq2MDpNiKhyL2ZOJUS4w==} + engines: {node: ^12.20.0 || >=14.13.1} + peerDependencies: + grammy: ^1.0.0 + + '@grammyjs/types@3.26.0': + resolution: {integrity: sha512-jlnyfxfev/2o68HlvAGRocAXgdPPX5QabG7jZlbqC2r9DZyWBfzTlg+nu3O3Fy4EhgLWu28hZ/8wr7DsNamP9A==} + + '@grpc/grpc-js@1.14.3': + resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + '@hapi/boom@9.1.4': resolution: {integrity: sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==} '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + '@homebridge/ciao@1.3.8': + resolution: {integrity: sha512-lNhpCsZVbdbjz2trFjQdzQ3cUIMZQMIMksi7wd3ntTIYgdaGLqT1Ms97DfVIJYHzRuduf56ISvgU8RRLTpK/ng==} + hasBin: true + '@hono/node-server@1.19.13': resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} engines: {node: '>=18.14.1'} @@ -1203,6 +1826,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@keyv/bigmap@1.3.1': resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} engines: {node: '>= 18'} @@ -1212,18 +1838,66 @@ packages: '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@larksuite/openclaw-lark@2026.4.8': - resolution: {integrity: sha512-HHIwDBQPtEZSLHHCnV52ip5WL8mag/qBUucIyH+pbyMHAAXyKtPHTfXFGTm1/HVMC0ZH2km5f11QvNyy85SDGw==} - engines: {node: '>=22'} - hasBin: true - peerDependencies: - openclaw: '>=2026.3.22' - peerDependenciesMeta: - openclaw: - optional: true + '@lancedb/lancedb-darwin-arm64@0.27.2': + resolution: {integrity: sha512-+XM68V/Rou8kKWDnUeKvg9ChKS0zGeQC2sKAop+06Ty4LwIjEGkeYBYrK0vMhZkBN5EFaOjTOp8E8hGQxdFwXA==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [darwin] - '@larksuiteoapi/node-sdk@1.60.0': - resolution: {integrity: sha512-MS1eXx7K6HHIyIcCBkJLb21okoa8ZatUGQWZaCCUePm6a37RWFmT6ZKlKvHxAanSX26wNuNlwP0RhgscsE+T6g==} + '@lancedb/lancedb-linux-arm64-gnu@0.27.2': + resolution: {integrity: sha512-laiTTDeMUTzm7t+t6ME5nNQMDoERjmkeuWAFWekbXiFdmp62Dqu34Lvf2BvpWnKwxLMZ5JcBJFIw32WS8/8Jnw==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@lancedb/lancedb-linux-arm64-musl@0.27.2': + resolution: {integrity: sha512-bK5Mc50EvwGZaaiym5CoPu8Y4GNSyEEvTQ0dTC2AUIm83qdQu1rGw6kkYtc/rTH/hbvAvPQot4agHDZfMVxfYw==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@lancedb/lancedb-linux-x64-gnu@0.27.2': + resolution: {integrity: sha512-qe+ML0YmPru0o84f33RBHqoNk6zsHBjiXTLKsEBDiiFYKks/XMsrkKy9NQYcTxShBrg/nx/MLzCzd7dihqgNYw==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@lancedb/lancedb-linux-x64-musl@0.27.2': + resolution: {integrity: sha512-ZpX6Oxn06qvzAdm+D/gNb3SRp/A9lgRAPvPg6nnMmSQk5XamC/hbGO07uK1wwop7nlqXUH/thk4is2y2ieWdTw==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@lancedb/lancedb-win32-arm64-msvc@0.27.2': + resolution: {integrity: sha512-4ffpFvh49MiUtkdFJOmBytXEbgUPXORphTOuExnJAgT1VAKwQcu4ZzdsgNoK6mumKBaU+pYQU/MedNkgTzx/Lw==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [win32] + + '@lancedb/lancedb-win32-x64-msvc@0.27.2': + resolution: {integrity: sha512-XlwiI6CK2Gkqq+FFVAStHojao/XjIJpDPTm7Tb9SpLL64IlwGw3yaT2hnWKTm90W4KlSrpfSldPly+s+y4U7JQ==} + engines: {node: '>= 18'} + cpu: [x64] + os: [win32] + + '@lancedb/lancedb@0.27.2': + resolution: {integrity: sha512-JQpZHV5KzUzDI3flYCjtZcfHlEbL8lM54E0NT+jrRYe29aKYegfavvPsAsuZp0VdcMwFMZcpMkaBhjQMo/fwvg==} + engines: {node: '>= 18'} + cpu: [x64, arm64] + os: [darwin, linux, win32] + peerDependencies: + apache-arrow: '>=15.0.0 <=18.1.0' + + '@larksuiteoapi/node-sdk@1.62.1': + resolution: {integrity: sha512-o9oAjv5Ffnp/6iXIJLHrO6N0US/r2ZZy3xmO6ylGegjuVSC05cx0fADA38Dc1h0FV8T9BDK+ariWk84TNMGbKg==} + + '@line/bot-sdk@11.0.0': + resolution: {integrity: sha512-3NZJjeFm2BikwVRgA8osIVbgKhuL0CzphQOdrB8okXIC40qMRE4RRfHFN3G8/qTb/34RtB95mD4J/KW5MD+b8g==} + engines: {node: '>=20'} '@lydell/node-pty-darwin-arm64@1.2.0-beta.12': resolution: {integrity: sha512-tqaifcY9Cr41SblO1+FLzh8oxxtkNhuW9Dhl22lKme9BreYvKvxEZcdPIXTuqkJc5tagOEC4QHShKmJjLyLXLQ==} @@ -1338,24 +2012,52 @@ packages: resolution: {integrity: sha512-faGUlTcXka5l7rv0lP3K3vGW/ejRuOS24RR2aSFWREUQqzjgdsuWNo/IiPqL3kWRGt6Ahl2+qcDAwtdeWeuGUw==} hasBin: true - '@mariozechner/pi-agent-core@0.70.2': - resolution: {integrity: sha512-g1hIdKyDwmQOoBGO0R4OhpemKeMENeK0vE5FJtuQKqEcsdCAkVBgZAK6aZUARYZVxMA718JS6WPLFWoddzjD7g==} + '@mariozechner/pi-agent-core@0.70.6': + resolution: {integrity: sha512-PovJZJqhY4ajgTJRUcLzfWKnlQuJHxHW3T030CafR9LYeLmOHi/HGS8DbCdRgSJNbnoIG+kl67/7++9DKZ2+sg==} engines: {node: '>=20.0.0'} - '@mariozechner/pi-ai@0.70.2': - resolution: {integrity: sha512-+30LRPjXsXF+oI96DvGWMbdPGeqoLJvadh6UPev7wx2DzhC9FEqXkQcoMZ0usbCm7E9pl8ua8a9s/pQ5ikaUbg==} + '@mariozechner/pi-ai@0.70.6': + resolution: {integrity: sha512-LVAadu0Y+hb7Bj7EDiLsx6AuGxHlxDq0euLzyqX698i9qt0BW6a+oQSUIZQz4rJwExF18OvyL7ygJ5781ojrIQ==} engines: {node: '>=20.0.0'} hasBin: true - '@mariozechner/pi-coding-agent@0.70.2': - resolution: {integrity: sha512-asfNqV89HKAmKvJ1wENBY/UQMIf77kLtkzBrvXnMQV4YbH7D/6KT+VeVzPG6zm5PAZP2UtdLY9B9Cge7IxH37w==} + '@mariozechner/pi-coding-agent@0.70.6': + resolution: {integrity: sha512-S4hUZghBeHPqsL6+DNg/TbGLziSh5+/mEHPVlYq5y6ImirWXhISLdLCnyZUW83OblKWihmG7unhJXiHQTH82mQ==} engines: {node: '>=20.6.0'} hasBin: true - '@mariozechner/pi-tui@0.70.2': - resolution: {integrity: sha512-PtKC0NepnrYcqMx6MXkWTrBzC9tI62KeC6w940oT46lCbfvgmfqXciR15+9BZpxxc1H4jd3CMrKsmOPVeUqZ0A==} + '@mariozechner/pi-tui@0.70.6': + resolution: {integrity: sha512-orBJEwMdpBC38AXfdVBKT5ZvqNTcKg6g3NdoF5a9aNQzDI/dOTu1UNYFYyEOTFRiTxSR1nw8eovbCcaSyekWfw==} engines: {node: '>=20.0.0'} + '@matrix-org/matrix-sdk-crypto-nodejs@0.5.1': + resolution: {integrity: sha512-m1nTFhUJv8AZCvuVmZ0wgYsFaseVNMhl3Jqu18KoHs7TQa+mmAW4q3xY6MuVApd75Zu9E0ooQeA5obUZdQ24OA==} + engines: {node: '>= 24'} + + '@matrix-org/matrix-sdk-crypto-wasm@18.2.0': + resolution: {integrity: sha512-puyZefvq6sHfqlmkri8umhA44724H2JL0YtX8wlvhGuNl8awX/Q1tZyW2Iekm9ZJP7BtuOqlNdg9oQd6iaGbNw==} + engines: {node: '>= 18'} + + '@microsoft/teams.api@2.0.8': + resolution: {integrity: sha512-N13idaRZNnfL7aefzsn2rhPtujqke1QVM81bNWq1XeK+5yeXod3aLTmBY701DEKkZUXiSG0AogvzkNwVnBw4+g==} + engines: {node: '>=20'} + + '@microsoft/teams.apps@2.0.8': + resolution: {integrity: sha512-6YBOxnQSoEPu841zMa1SDBdwH3gsuzrz0LCONuaGOHJ3Kmv2S+7ih1DqEx4Ak3iAYHeCvxnWGqjcYSBhgeiuMQ==} + engines: {node: '>=20'} + + '@microsoft/teams.cards@2.0.8': + resolution: {integrity: sha512-WrGAgkDKqhvFhnsKPwFeKTkhAXu/fbySxq5+uIOqY1ffdgiEdEoj6c0cjyQJy0HJ9B5u/0SQ4hO2KUc6jlZSZw==} + engines: {node: '>=20'} + + '@microsoft/teams.common@2.0.8': + resolution: {integrity: sha512-nkolOYX9qCpfK2uitiuAYm3EvMleHer5P3OCx3IBOp2gxkkFvNNOcOIDXuPZ6BtiENt47FPn4fYMMgJrawCHcA==} + engines: {node: '>=20'} + + '@microsoft/teams.graph@2.0.8': + resolution: {integrity: sha512-M/skUNJFD+lIVNa+ng0iy8t3sFmki6NOiWpGwnWOBAKFgTYBTJVtPfWm6SNdGFTCUsV9rjep4s9S5zTKUg2HJg==} + engines: {node: '>=20'} + '@mistralai/mistralai@2.2.1': resolution: {integrity: sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==} @@ -1369,149 +2071,98 @@ packages: '@cfworker/json-schema': optional: true - '@napi-rs/canvas-android-arm64@0.1.80': - resolution: {integrity: sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==} + '@mozilla/readability@0.6.0': + resolution: {integrity: sha512-juG5VWh4qAivzTAeMzvY9xs9HY5rAcr2E4I7tiSSCokRFi7XIZCAu92ZkSTsIj1OPceCifL3cpfteP3pDT9/QQ==} + engines: {node: '>=14.0.0'} + + '@napi-rs/canvas-android-arm64@0.1.100': + resolution: {integrity: sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/canvas-android-arm64@0.1.97': - resolution: {integrity: sha512-V1c/WVw+NzH8vk7ZK/O8/nyBSCQimU8sfMsB/9qeSvdkGKNU7+mxy/bIF0gTgeBFmHpj30S4E9WHMSrxXGQuVQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/canvas-darwin-arm64@0.1.80': - resolution: {integrity: sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==} + '@napi-rs/canvas-darwin-arm64@0.1.100': + resolution: {integrity: sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/canvas-darwin-arm64@0.1.97': - resolution: {integrity: sha512-ok+SCEF4YejcxuJ9Rm+WWunHHpf2HmiPxfz6z1a/NFQECGXtsY7A4B8XocK1LmT1D7P174MzwPF9Wy3AUAwEPw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/canvas-darwin-x64@0.1.80': - resolution: {integrity: sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==} + '@napi-rs/canvas-darwin-x64@0.1.100': + resolution: {integrity: sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/canvas-darwin-x64@0.1.97': - resolution: {integrity: sha512-PUP6e6/UGlclUvAQNnuXCcnkpdUou6VYZfQOQxExLp86epOylmiwLkqXIvpFmjoTEDmPmXrI+coL/9EFU1gKPA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.80': - resolution: {integrity: sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==} + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': + resolution: {integrity: sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.97': - resolution: {integrity: sha512-XyXH2L/cic8eTNtbrXCcvqHtMX/nEOxN18+7rMrAM2XtLYC/EB5s0wnO1FsLMWmK+04ZSLN9FBGipo7kpIkcOw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/canvas-linux-arm64-gnu@0.1.80': - resolution: {integrity: sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==} + '@napi-rs/canvas-linux-arm64-gnu@0.1.100': + resolution: {integrity: sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-arm64-gnu@0.1.97': - resolution: {integrity: sha512-Kuq/M3djq0K8ktgz6nPlK7Ne5d4uWeDxPpyKWOjWDK2RIOhHVtLtyLiJw2fuldw7Vn4mhw05EZXCEr4Q76rs9w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@napi-rs/canvas-linux-arm64-musl@0.1.80': - resolution: {integrity: sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==} + '@napi-rs/canvas-linux-arm64-musl@0.1.100': + resolution: {integrity: sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@napi-rs/canvas-linux-arm64-musl@0.1.97': - resolution: {integrity: sha512-kKmSkQVnWeqg7qdsiXvYxKhAFuHz3tkBjW/zyQv5YKUPhotpaVhpBGv5LqCngzyuRV85SXoe+OFj+Tv0a0QXkQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.80': - resolution: {integrity: sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==} + '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': + resolution: {integrity: sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-riscv64-gnu@0.1.97': - resolution: {integrity: sha512-Jc7I3A51jnEOIAXeLsN/M/+Z28LUeakcsXs07FLq9prXc0eYOtVwsDEv913Gr+06IRo34gJJVgT0TXvmz+N2VA==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@napi-rs/canvas-linux-x64-gnu@0.1.80': - resolution: {integrity: sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==} + '@napi-rs/canvas-linux-x64-gnu@0.1.100': + resolution: {integrity: sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-x64-gnu@0.1.97': - resolution: {integrity: sha512-iDUBe7AilfuBSRbSa8/IGX38Mf+iCSBqoVKLSQ5XaY2JLOaqz1TVyPFEyIck7wT6mRQhQt5sN6ogfjIDfi74tg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@napi-rs/canvas-linux-x64-musl@0.1.80': - resolution: {integrity: sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==} + '@napi-rs/canvas-linux-x64-musl@0.1.100': + resolution: {integrity: sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@napi-rs/canvas-linux-x64-musl@0.1.97': - resolution: {integrity: sha512-AKLFd/v0Z5fvgqBDqhvqtAdx+fHMJ5t9JcUNKq4FIZ5WH+iegGm8HPdj00NFlCSnm83Fp3Ln8I2f7uq1aIiWaA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@napi-rs/canvas-win32-arm64-msvc@0.1.97': - resolution: {integrity: sha512-u883Yr6A6fO7Vpsy9YE4FVCIxzzo5sO+7pIUjjoDLjS3vQaNMkVzx5bdIpEL+ob+gU88WDK4VcxYMZ6nmnoX9A==} + '@napi-rs/canvas-win32-arm64-msvc@0.1.100': + resolution: {integrity: sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/canvas-win32-x64-msvc@0.1.80': - resolution: {integrity: sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==} + '@napi-rs/canvas-win32-x64-msvc@0.1.100': + resolution: {integrity: sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/canvas-win32-x64-msvc@0.1.97': - resolution: {integrity: sha512-sWtD2EE3fV0IzN+iiQUqr/Q1SwqWhs2O1FKItFlxtdDkikpEj5g7DKQpY3x55H/MAOnL8iomnlk3mcEeGiUMoQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/canvas@0.1.80': - resolution: {integrity: sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==} + '@napi-rs/canvas@0.1.100': + resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==} engines: {node: '>= 10'} - '@napi-rs/canvas@0.1.97': - resolution: {integrity: sha512-8cFniXvrIEnVwuNSRCW9wirRZbHvrD3JVujdS2P5n5xiJZNZMOZcfOvJ1pb66c7jXMKHHglJEDVJGbm8XWFcXQ==} - engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@noble/ciphers@2.1.1': + resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==} + engines: {node: '>= 20.19.0'} + + '@noble/curves@2.0.1': + resolution: {integrity: sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==} + engines: {node: '>= 20.19.0'} '@noble/hashes@2.0.1': resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} @@ -1540,6 +2191,253 @@ packages: resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} engines: {node: ^18.17.0 || >=20.5.0} + '@openai/codex@0.125.0': + resolution: {integrity: sha512-GiE9wlgL95u/5BRirY5d3EaRLU1tu7Y1R09R8lCHHVmcQdSmhS809FdPDWH3gIYHS7ZriAPqXwJ3aLA0WKl40Q==} + engines: {node: '>=16'} + hasBin: true + + '@openai/codex@0.125.0-darwin-arm64': + resolution: {integrity: sha512-Gn2fHiSO0XgyHp1OSd5DWUTm66Bv9UEuipW5pVEj1E+hWZCOrdqnYttllKFWtRGj5yiKefNX3JIxONgh/ZwlOQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@openai/codex@0.125.0-darwin-x64': + resolution: {integrity: sha512-TZ5Lek2X/UXTI9LXFxzarvQaJeuTrqVh4POc7soO/8RclVnCxADnCf15sivxLd5eiFW4t0myGoeVoM4lciRiRg==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@openai/codex@0.125.0-linux-arm64': + resolution: {integrity: sha512-pPnJoJD6rZ2Iin0zNt/up36bO2/EOp2B+1/rPHu/lSq3PJbT3Fmnfut2kJy5LylXb7bGA2XQbtqOogZzIbnlkA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@openai/codex@0.125.0-linux-x64': + resolution: {integrity: sha512-K2NTTEeBpz/G+N2x17UGWfauRt3So+ir4f+U/60l5PPnYEJB/w3YZrlXo2G9og8Dm9BqtoBAjoPV74sRv9tWWQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@openai/codex@0.125.0-win32-arm64': + resolution: {integrity: sha512-zxoUakw9oIHIFrAyk400XkkLBJFA6nOym0NDq6sQ/jhdcYraKqNSRCII2nsBwZHk+/4zgUvuk52iuutgysY/rQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [win32] + + '@openai/codex@0.125.0-win32-x64': + resolution: {integrity: sha512-ofpOK+OWH5QFuUZ9pTM0d/PcXUXiIP5z5DpRcE9MlucJoyOl4Zy4Nu3NcuHF4YzCkZMQb6x3j0tjDEPHKqNQzw==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@opentelemetry/api-logs@0.215.0': + resolution: {integrity: sha512-xrFlqhdhUyO8wSRn6DjE0145/HPWSJ5Nm0C7vWua6TdL/FSEAZvEyvdsa9CRXuxo9ebb7j/NEPhEcO62IJ0qUA==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/configuration@0.215.0': + resolution: {integrity: sha512-FSWvDryxjinHROfzEVbJGBw10FqGzLEm2C1LPX6Lot6hvxq3lFJzNLlue8vm64C5yIbqSQVjWsPhYu56ThQS4Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + + '@opentelemetry/context-async-hooks@2.7.0': + resolution: {integrity: sha512-MWXggArM+Y11mPS8VOrqxOj+YMGQSRuvhM91eSBX4xFpJa05mpkeVvM8pPux5ElkEjV5RMgrkisrlP/R83SpBQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.7.0': + resolution: {integrity: sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.7.1': + resolution: {integrity: sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-logs-otlp-grpc@0.215.0': + resolution: {integrity: sha512-MVq+9ma/63XRXc0AcnS+XyWSD6VBYn39OucsvpzjqxTpzTOiGXNxTwsbV3zbnvgUexb5hc2ZjJlZUK2W/19UUw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-http@0.215.0': + resolution: {integrity: sha512-U7Qb+TVX2GZH5RSC+Gx9aE5zChKP1kPg87X3PlI/41lWVPJdBIzmgMmuE28MmQlrK84nLHCIqUOOben8YkSzBw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-proto@0.215.0': + resolution: {integrity: sha512-vs2xKKTdt/vKWMuBzw+LZYYCKqulodCRoonWWiyToIQfa6JgbyWjTu/iy6qpBLhLi+t6fNc1bwJGwu3vkot2Jg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-grpc@0.215.0': + resolution: {integrity: sha512-1TAMliHQvzc+v1OtnLMHSk5sU8BSkJbxIKrWzuCWcQjajWrvem/r5ugLK6agI0PjPz/ADfZju5AVYedlNyeO9g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.215.0': + resolution: {integrity: sha512-FRydO5j7MWnXK9ghfykKxiSM8I5UeiicK/UNl3/mv86xoEKkb+LKz1I3WXgkuYVOQf22VNqbPO58s2W1mVWtEQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-proto@0.215.0': + resolution: {integrity: sha512-d8/Sys9MtxLbn0S+RE1pUNcuoI9ZyI4SPfOO+yskSEQiPFoKCTMwwthB8MTY4S8qxCBAWyM+P7QMX+vEIT7PZw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-prometheus@0.215.0': + resolution: {integrity: sha512-7ghCl1G84jccmxG3B8UwUMZ1OlequBzB1jt5tZ4DDiAyVKeA4Roz5D6VK8SQ0ZyBQffVyX/rtXrpVXKVzRCGfg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.215.0': + resolution: {integrity: sha512-+SuWfPFVjPTvHJhlzTCBetLsPVu86xSFPR3fv8TN+H7lpe5aZzF96TUsfMHDR0lwpIwlJpG57CJnGalIfrpXkg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-http@0.215.0': + resolution: {integrity: sha512-k4J9ISeGpb0Bm/wCrlcrbroMFTkiWMrdhNxQGrlktxLy127Yzd4/7nrTawn5d/ApktYTknvdixsE6++34Qfi1w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.215.0': + resolution: {integrity: sha512-+QclHuJmlp/I3Z2fNn+j1dAajMjJqJ4Sgo8ajwiK6Tzmg5SNwBGmBX66AZvTLe/3/bc3L7bo90m9gsaJBrzEsA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-zipkin@2.7.0': + resolution: {integrity: sha512-tbzcYDmZWtX4hgJn15qP7/iYFVd1yzbUloBuSYsQtn0XQTxJsG7vgwkPKEBellriH0XJmlZJxYtWkHpwzHBhaQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation@0.215.0': + resolution: {integrity: sha512-SyJONuqypQ2xWdYMy99vF7JhZ2kDTGx4oRmM/jZV+kRtZ96JTnJmEINbIJgHz7Gnhtw0bimHwbPy/pguA5wpPQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.215.0': + resolution: {integrity: sha512-lHrfbmeLSmesGSkkHiqDwOzfaEMSWXdc7q6UoLfbW8byONCb+bE/zkAr0kapN4US1baT/2nbpNT7Cn9XoB96Vg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.215.0': + resolution: {integrity: sha512-WkuHkUrhwNxTKrm7Xuf6S+HmLNbk2T8S2YiZhN606RfgetSQb9xLp4NizWLwXvw63uxGsBaK262dirFO2yht2g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.215.0': + resolution: {integrity: sha512-cWwBvaV+vkXHkSoTYR8hGw+AW03UlgTr6xtrUKOMeum3T+8vffYXIfXu6KY5MLu8O9QtoBKqaKWw9I5xoOepng==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagator-b3@2.7.0': + resolution: {integrity: sha512-HNm+tdXY5i8dzAo4YankchNWdZ4Z1Boop7lhbb3wltWT0MwEMo0QADRJwrF83pXEeDT+5Bmq4J8sStFaUywE3g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@2.7.0': + resolution: {integrity: sha512-lKMAjekRkFYWrjmPTaxUJt+V8Mr1iB94sP3HDZZCmdZ/LUV/wtqAGqXhgnkIbdlnWxxvEs9MGEIMdJC+xObMFg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@2.7.0': + resolution: {integrity: sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/resources@2.7.1': + resolution: {integrity: sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.215.0': + resolution: {integrity: sha512-y3ucOmphzc4vgBTyIGchs+N/1rkACmoka8QalT2z1LBNM232Z17zMYayHcMl+dgMoOadZ0b72UZv7mDtqy1cFA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.7.0': + resolution: {integrity: sha512-Vd7h95av/LYRsAVN7wbprvvJnHkq7swMXAo7Uad0Uxf9jl6NSReLa0JNivrcc5BVIx/vl2t+cgdVQQbnVhsR9w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.7.1': + resolution: {integrity: sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-node@0.215.0': + resolution: {integrity: sha512-YunKvZOMhYNMBJ66YRjbGShuoV/w1y21U7MGPRx0iPJenPszOddtYEQFJv8piAEOn94BUFIfJHtHjptrHsGiIA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.7.0': + resolution: {integrity: sha512-Yg9zEXJB50DLVLpsKPk7NmNqlPlS+OvqhJGh0A8oawIOTPOwlm4eXs9BMJV7L79lvEwI+dWtAj+YjTyddV336A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.7.1': + resolution: {integrity: sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.7.0': + resolution: {integrity: sha512-RrFHOXw0IYp/OThew6QORdybnnLitUAUMCJKcQNBYS0hDkCYarO2vTkVxfrGxCIqd5XHSMvbCpBd/T8ZMw8oSg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.40.0': + resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} + engines: {node: '>=14'} + + '@pierre/diffs@1.1.19': + resolution: {integrity: sha512-eYyDW69heXd7i9zdkWogGYosHzoYF2dstV6uDcmnQAf72uRChs3hrpf/7ym/ayTiwD8a+TQ7oZ5vNNb0tstJvA==} + peerDependencies: + react: ^18.3.1 || ^19.0.0 + react-dom: ^18.3.1 || ^19.0.0 + + '@pierre/theme@0.0.28': + resolution: {integrity: sha512-1j/H/fECBuc9dEvntdWI+l435HZapw+RCJTlqCA6BboQ5TjlnE005j/ROWutXIs8aq5OAc82JI2Kwk4A1WWBgw==} + engines: {vscode: ^1.0.0} + + '@pierre/theme@0.0.29': + resolution: {integrity: sha512-ZXce2GikoXHNThHdkaxA2X4ISnzSTL/LmKDYaTwqP1bQqENs+l7B+PheF9RsUWgx4GbphW5GU1i1vO4ttAzCUA==} + engines: {vscode: ^1.0.0} + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -2178,6 +3076,39 @@ packages: cpu: [x64] os: [win32] + '@scure/base@2.0.0': + resolution: {integrity: sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==} + + '@scure/bip32@2.0.1': + resolution: {integrity: sha512-4Md1NI5BzoVP+bhyJaY3K6yMesEFzNS1sE/cP+9nuvE7p/b0kx9XbpDHHFl8dHtufcbdHRUUQdRqLIPHN/s7yA==} + + '@scure/bip39@2.0.1': + resolution: {integrity: sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg==} + + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/transformers@3.23.0': + resolution: {integrity: sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@silvia-odwyer/photon-node@0.3.4': resolution: {integrity: sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==} @@ -2188,6 +3119,40 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@slack/bolt@4.7.2': + resolution: {integrity: sha512-ALHtaS2iaP2WAWgX08yXsoCxEDitC6AqZs26ot6smXJQzBFMM4slVP+w3blLwzUV551xZ/+9RlBmWHsZDJJ5HA==} + engines: {node: '>=18', npm: '>=8.6.0'} + peerDependencies: + '@types/express': ^5.0.0 + + '@slack/logger@4.0.1': + resolution: {integrity: sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + + '@slack/oauth@3.0.5': + resolution: {integrity: sha512-exqFQySKhNDptWYSWhvRUJ4/+ndu2gayIy7vg/JfmJq3wGtGdHk531P96fAZyBm5c1Le3yaPYqv92rL4COlU3A==} + engines: {node: '>=18', npm: '>=8.6.0'} + + '@slack/socket-mode@2.0.7': + resolution: {integrity: sha512-qYy07je71WnEHgRwmw12DlAnZLi5HXmdlI2WUzUK2LH/rYXQpP6uEg462S5CwfE8FoCKUdIigHtYnOOfzZH1lQ==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + + '@slack/types@2.21.0': + resolution: {integrity: sha512-ZLMsKnD5KLRPmhFEoGoBQUD5Pc2bH3xFc5ygHlioEc0WmLGyZGoGCtMff4rpejrFnptrhfxcKpWxW4r3g39R0A==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + + '@slack/web-api@7.15.2': + resolution: {integrity: sha512-/m9qVFkiq85Oa/FSQwYIRDa/AO4qNYkDh4sRBK1WqEc2+RyG7w4tbU6rBIwUOcc/TmWOIr24Nraquxg7um5mYw==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + + '@smithy/chunked-blob-reader-native@4.2.3': + resolution: {integrity: sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.2.2': + resolution: {integrity: sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==} + engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.4.17': resolution: {integrity: sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==} engines: {node: '>=18.0.0'} @@ -2224,10 +3189,18 @@ packages: resolution: {integrity: sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==} engines: {node: '>=18.0.0'} + '@smithy/hash-blob-browser@4.2.15': + resolution: {integrity: sha512-0PJ4Al3fg2nM4qKrAIxyNcApgqHAXcBkN8FeizOz69z0rb26uZ6lMESYtxegaTlXB5Hj84JfwMPavMrwDMjucA==} + engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.2.14': resolution: {integrity: sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==} engines: {node: '>=18.0.0'} + '@smithy/hash-stream-node@4.2.14': + resolution: {integrity: sha512-tw4GANWkZPb6+BdD4Fgucqzey2+r73Z/GRo9zklsCdwrnxxumUV83ZIaBDdudV4Ylazw3EPTiJZhpX42105ruQ==} + engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.2.14': resolution: {integrity: sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==} engines: {node: '>=18.0.0'} @@ -2240,6 +3213,10 @@ packages: resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} engines: {node: '>=18.0.0'} + '@smithy/md5-js@4.2.14': + resolution: {integrity: sha512-V2v0vx+h0iUSNG1Alt+GNBMSLGCrl9iVsdd+Ap67HPM9PN479x12V8LkuMoKImNZxn3MXeuyUjls+/7ZACZghA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.2.14': resolution: {integrity: sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==} engines: {node: '>=18.0.0'} @@ -2252,6 +3229,10 @@ packages: resolution: {integrity: sha512-5zhmo2AkstmM/RMKYP0NHfmuYWBR+/umlmSuALgajLxf0X0rLE6d17MfzTxpzkILWVhwvCJkCyPH0AfMlbaucQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.5.7': + resolution: {integrity: sha512-bRt6ZImqVSeTk39Nm81K20ObIiAZ3WefY7G6+iz/0tZjs4dgRRjvRX2sgsH+zi6iDCRR/aQvQofLKxxz4rPBZg==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.20': resolution: {integrity: sha512-Lx9JMO9vArPtiChE3wbEZ5akMIDQpWQtlu90lhACQmNOXcGXRbaDywMHDzuDZ2OkZzP+9wQfZi3YJT9F67zTQQ==} engines: {node: '>=18.0.0'} @@ -2356,6 +3337,10 @@ packages: resolution: {integrity: sha512-h1IJsbgMDA+jaTjrco/JsyfWOgHRJBv8myB1y4AEI2fjIzD6ktZ7pFAyTw+gwN9GKIAygvC6db0mq0j8N2rFOg==} engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.3.8': + resolution: {integrity: sha512-LUIxbTBi+OpvXpg91poGA6BdyoleMDLnfXjVDqyi2RvZmTveY5loE/FgYUBCR5LU2BThW2SoZRh8dTIIy38IPw==} + engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.5.25': resolution: {integrity: sha512-/PFpG4k8Ze8Ei+mMKj3oiPICYekthuzePZMgZbCqMiXIHHf4n2aZ4Ps0aSRShycFTGuj/J6XldmC0x0DwednIA==} engines: {node: '>=18.0.0'} @@ -2372,25 +3357,122 @@ packages: resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} + '@smithy/util-waiter@4.3.0': + resolution: {integrity: sha512-JyjYmLAfS+pdxF92o4yLgEoy0zhayKTw73FU1aofLWwLcJw7iSqIY2exGmMTrl/lmZugP5p/zxdFSippJDfKWA==} + engines: {node: '>=18.0.0'} + '@smithy/uuid@1.1.2': resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} engines: {node: '>=18.0.0'} - '@soimy/dingtalk@3.5.3': - resolution: {integrity: sha512-I8y57KVic6Gjg/BmaZBcoV+ktW/riM/TFW/XzqhqL4beNicYcy8nxuyxqpLuFQNw0f4KU363aZl0BkmW07Wmjg==} - peerDependencies: - openclaw: '>=2026.3.28' - peerDependenciesMeta: - openclaw: - optional: true + '@snazzah/davey-android-arm-eabi@0.1.11': + resolution: {integrity: sha512-T1RYbNYKN6tLOcGIDKJd8OI6FBSEemwL7DOYdTMmhqfhhMr3YVN8WOhfoxGg63OcnpTN2e2c5tdY2bAx25RmQQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@snazzah/davey-android-arm64@0.1.11': + resolution: {integrity: sha512-ksJn/x2VU8h6w9eku1HT96ugSRZ7lKVkKNKbFleaFN+U99DJaPM+gMu2YvnFU4V54HR06ZBnRihnVG6VLXQpDw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@snazzah/davey-darwin-arm64@0.1.11': + resolution: {integrity: sha512-E1d7PbaaVMO3Lj9EiAPqOVbuV0xg5+PsHzHH097DDXiD1+zUDXvJaTnUWsnm5z50pJniHpi4GtaYmk+ieB/guA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@snazzah/davey-darwin-x64@0.1.11': + resolution: {integrity: sha512-Tl4TI/LTmgJZepgbgVMYDi8RqlAkPtPg1OEBPl7a9Tn3AwR36Vs6lyIT1cs/lGy/ds/+B+mKI4rPObN1cyILTw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@snazzah/davey-freebsd-x64@0.1.11': + resolution: {integrity: sha512-T8Iw9FXkuI1T+YBAFzh9v/TXf9IOTOSqnd/BFpTRTrlW72PR2lhIidzSmg027VxO7r5pX47iFwiOkb9I/NU/EA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@snazzah/davey-linux-arm-gnueabihf@0.1.11': + resolution: {integrity: sha512-1Txj+8pqA8uq/OGtaUaBFWAPnNMQzFgIywj0iA7EI4xZl+mab48/pv+YZ1pNb/suC6ynsW44oB9efiXSdcUAgA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@snazzah/davey-linux-arm64-gnu@0.1.11': + resolution: {integrity: sha512-ERzF5nM/IYW1BcN3wLXpEwBCGLFf0kGJUVhaV6yfiInz0tkU8UmvrrgpaMaACfMjIhfWdq5CcX+aTkXo/saNcg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@snazzah/davey-linux-arm64-musl@0.1.11': + resolution: {integrity: sha512-e6pX6Hiabtz99q+H/YHNkm9JVlpqN8HGh0qPib8G2+UY4/SSH8WvqWipk3v581dMy2oyCHt7MOoY1aU1P1N/xA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@snazzah/davey-linux-x64-gnu@0.1.11': + resolution: {integrity: sha512-TW5bSoqChOJMbvsDb4wAATYrxmAXuNnse7wFNVSAJUaZKSeRfZbu3UAiPWSNn7GwLwSfU6hg322KZUn8IWCuvg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@snazzah/davey-linux-x64-musl@0.1.11': + resolution: {integrity: sha512-5j6Pmc+Wzv5lSxVP6quA7teYRJXibkZqQyYGfTDnTsUOO5dPpcojpqlXlkhyvsA1OAQTj4uxbOCciN3cVWwzug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@snazzah/davey-wasm32-wasi@0.1.11': + resolution: {integrity: sha512-rKOwZ/0J8lp+4VEyOdMDBRP9KR+PksZpa9V1Qn0veMzy4FqTVKthkxwGqewheFe0SFg9fdvt798l/PBFrfDeZw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@snazzah/davey-win32-arm64-msvc@0.1.11': + resolution: {integrity: sha512-5fptJU4tX901m3mj0SHiBljMrPT4ZEsynbBhR7bK1yn9TY1jjyhN8EFi7QF5IWtUEni+0mia2BCMHZ5ZkmFZqQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@snazzah/davey-win32-ia32-msvc@0.1.11': + resolution: {integrity: sha512-ualexn8SeLsiMHhWfzVrzRcjHgcBapg++FPaVgJJxoh2S/jCRiklXOu3luqIZdJdNKvhe2V9SwO/cImPeIIBKw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@snazzah/davey-win32-x64-msvc@0.1.11': + resolution: {integrity: sha512-muNhc8UKXtknzsH/w4AIkbPR2I8BuvApn0pDXar0IEvY8PCjqU/M8MPbOOEYwQVvQRMwVTgExtxzrkBPSXB4nA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@snazzah/davey@0.1.11': + resolution: {integrity: sha512-oBN+msHzPnm1M5DDx3wVD7iBwpNXFUtkh2MrAbUJu0OhKjliLChi28hq++mu1+qdMpAVQO5JKAvQQxYVbyneiw==} + engines: {node: '>= 10'} '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} + '@telegraf/types@7.1.0': + resolution: {integrity: sha512-kGevOIbpMcIlCDeorKGpwZmdH7kHbqlk/Yj6dEpJMKEQw5lk0KVQY0OLXaCswy8GqlIVLd5625OB+rAntP9xVw==} + + '@tencent-connect/qqbot-connector@1.1.0': + resolution: {integrity: sha512-3nQ2mdyzPRKpBHjd3QiKZDwNzw1F7fBN+rSq8Xms2gg+JWZR4SY2Zdf+doqTyXdyVjG4Y0QM7IA4U42zT9xxzw==} + engines: {node: '>=18.0.0'} + '@tencent-weixin/openclaw-weixin@2.1.10': resolution: {integrity: sha512-cEG6Iw5g2qqlA+8/TcmV+E8aFUEX0ruxF0+a5LgVy5wv56/qP07KoapfRa7YTRPzhRW5UDaz6zsZQArt/4ZNnA==} engines: {node: '>=22'} @@ -2418,6 +3500,34 @@ packages: '@types/react-dom': optional: true + '@tloncorp/tlon-skill-darwin-arm64@0.3.5': + resolution: {integrity: sha512-GZQyV0KswArmGU/XLbDTPEXKvs7w3iLXMzxSlh19LXUbQVDViJs35gSPh/ZTmDkBXGGf6hPrBLXRKvc20NuWNg==} + cpu: [arm64] + os: [darwin] + hasBin: true + + '@tloncorp/tlon-skill-darwin-x64@0.3.5': + resolution: {integrity: sha512-9+2kcX16TEXCwIyl9yp7uCo1ehF3ErlmRf1mbG7X7B1RH0sZYdIsOGtaTfwTunkeJ7MD4ujdfQR9+8QxYUO0AQ==} + cpu: [x64] + os: [darwin] + hasBin: true + + '@tloncorp/tlon-skill-linux-arm64@0.3.5': + resolution: {integrity: sha512-gKsiFgzw370LqKTZQqU30aQHKz6UwZdBwUXT2rvvjzLswFlXxrNdhIUJ3+6Qc0ufKFdqLC5rTYfb/jDV9IZsHQ==} + cpu: [arm64] + os: [linux] + hasBin: true + + '@tloncorp/tlon-skill-linux-x64@0.3.5': + resolution: {integrity: sha512-bz6KV/qqdjCxIfxKBoltmk5ufjb0x8TCvfBJqyzcZBBIOwHN+/KvJYiBttIyrYxUoPcGTMl8/z29Q/O4OeaoSA==} + cpu: [x64] + os: [linux] + hasBin: true + + '@tloncorp/tlon-skill@0.3.5': + resolution: {integrity: sha512-H/k+gEzdCdrGEAjUCRMtXJ5xE5USZm3hBv4OAYtefHuzqizeLphITMWX2Jp49Ro+6zp5whsM0xJfVsNxm2XMCg==} + hasBin: true + '@tokenizer/inflate@0.4.1': resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} engines: {node: '>=18'} @@ -2428,6 +3538,28 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@twurple/api-call@8.1.3': + resolution: {integrity: sha512-eKIoIRHyPsyJwCOpofE+/J+C5O+bPnxtq3bPUzMsS4EzZOF268WocbkaKLW1Fh3tepyxj3TvTNxEvKA6jbJr0A==} + + '@twurple/api@8.1.3': + resolution: {integrity: sha512-DTa/VX+h7kciDz3ZBQmrpVy1nPIepRMv4BtldaXKfDERlXRQBt4V2d6KfNn/hdUkRkxJ2Xi8x4PfBFE79VSrBw==} + peerDependencies: + '@twurple/auth': 8.1.3 + + '@twurple/auth@8.1.3': + resolution: {integrity: sha512-UklOtXzQUnZskFsvt3h3kmkjXsILqNXe4NCMR1SYPicsYVnVMElS1uMiVI/H5mzJhVR5MFx5wQQyI15b5YtBxw==} + + '@twurple/chat@8.1.3': + resolution: {integrity: sha512-BTamweCTlv8Bdkx1um0dSn0sDXBm3CX4js0GbatWPsX6mrMWljny2pQgIj+PSkTtHfsR4fmGEIayAticEydxnQ==} + peerDependencies: + '@twurple/auth': 8.1.3 + + '@twurple/common@8.1.3': + resolution: {integrity: sha512-B2BT42fJAEYqSPGjTd6qyZoUv6kgFzIvUJuTIrOUcBiJxcvZh8tD+WLRd5xfMKhtLbUFgesYlHxdPhmdar8/zw==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -2443,12 +3575,24 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/command-line-args@5.2.3': + resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} + + '@types/command-line-usage@5.0.4': + resolution: {integrity: sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} @@ -2464,6 +3608,15 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/events@3.0.3': + resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} + + '@types/express-serve-static-core@5.1.1': + resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} @@ -2473,9 +3626,15 @@ packages: '@types/http-cache-semantics@4.2.0': resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + '@types/katex@0.16.8': resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} @@ -2500,6 +3659,9 @@ packages: '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} + '@types/node@20.19.39': + resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==} + '@types/node@24.12.0': resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} @@ -2512,6 +3674,12 @@ packages: '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + '@types/qs@6.15.0': + resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -2526,6 +3694,12 @@ packages: '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -2600,13 +3774,16 @@ packages: resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typespec/ts-http-runtime@0.3.5': + resolution: {integrity: sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==} + engines: {node: '>=20.0.0'} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vincentkoc/qrcode-tui@0.2.1': - resolution: {integrity: sha512-F2XVHMfasJ0q8G93gtcyU9Px0wMH6o6nIZLrZYSHc6dm9Pq3oCbHuVYYG/UQvJD0rhrGH3P9B6qgpCAqSDUw5w==} - engines: {node: '>=20'} - hasBin: true + '@urbit/aura@3.0.0': + resolution: {integrity: sha512-N8/FHc/lmlMDCumMuTXyRHCxlov5KZY6unmJ9QR2GOw+OpROZMBsXYGwE+ZMtvN21ql9+Xb8KhGNBj08IrG3Wg==} + engines: {node: '>=16', npm: '>=8'} '@vitejs/plugin-react@5.2.0': resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==} @@ -2643,11 +3820,8 @@ packages: '@vitest/utils@4.1.1': resolution: {integrity: sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==} - '@wecom/aibot-node-sdk@1.0.6': - resolution: {integrity: sha512-WZJN3Q+s+94Qjc0VW8d5W1cVkA3emYxiqf+mNRO9UEHoF40puHvizreNMtudjFhm7mmkYiK5ue/QzNiCk+xwLA==} - - '@wecom/wecom-openclaw-plugin@2026.4.27': - resolution: {integrity: sha512-jCK9VDS3kmxyGdqPMNX78vI58iPwypW92eKNZI6T5RLyv9iBUkBMC6RcJmq6LLaq2/bCA3wBcmkjH44W42X2aw==} + '@wasm-audio-decoders/common@9.0.7': + resolution: {integrity: sha512-WRaUuWSKV7pkttBygml/a6dIEpatq2nnZGFIoPTc5yPLkxL6Wk4YaslPM98OPQvWacvNZ+Py9xROGDtrFBDzag==} '@whiskeysockets/baileys@7.0.0-rc.9': resolution: {integrity: sha512-YFm5gKXfDP9byCXCW3OPHKXLzrAKzolzgVUlRosHHgwbnf2YOO3XknkMm6J7+F0ns8OA0uuSBhgkRHTDtqkacw==} @@ -2673,14 +3847,63 @@ packages: resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} + '@zed-industries/codex-acp-darwin-arm64@0.12.0': + resolution: {integrity: sha512-RvTXH21sLpswEo8xLeQXcA/uWZauyNP1y+WI6b355+/o7sQ5wrvBkxt+NyhaJXJIQvbfdpl04LND4cmM+DTcNg==} + cpu: [arm64] + os: [darwin] + hasBin: true + + '@zed-industries/codex-acp-darwin-x64@0.12.0': + resolution: {integrity: sha512-N7EhrUTioix3L21qnm6kZzAESc+B7Mac+/uW3khn/UQe7fJJ7u1ojbgMPDdGo/8Xm6HBBXgak2NOj7mJ+NNXSw==} + cpu: [x64] + os: [darwin] + hasBin: true + + '@zed-industries/codex-acp-linux-arm64@0.12.0': + resolution: {integrity: sha512-Kq35FclgZiSMBKyf80PnCvvJ3xfMjZIkPJXpci35U/VqXVQelhHCwYWwA3waTxvW07tNHxsehv1eQICz7wZdVQ==} + cpu: [arm64] + os: [linux] + hasBin: true + + '@zed-industries/codex-acp-linux-x64@0.12.0': + resolution: {integrity: sha512-twmX9noSqfgWgVkGG1dd9u20Pxp8vNRXggvJ61RQSrNYITGuqHil2F3ViYICZoXyr9w1gok28bWG5DU2d9adPg==} + cpu: [x64] + os: [linux] + hasBin: true + + '@zed-industries/codex-acp-win32-arm64@0.12.0': + resolution: {integrity: sha512-VoFsTIrQopO917x2EpxYXm3jTIoSknCbzP76FwX9uOThlRms+M+fHWJ4kJttOPpeofz1ulAS3vPVMQ3WNlvnhw==} + cpu: [arm64] + os: [win32] + hasBin: true + + '@zed-industries/codex-acp-win32-x64@0.12.0': + resolution: {integrity: sha512-HImgXGIYgW6Wxr3rylrHS7Dzs35zvcQQB7eqAEWZ2Lj+3AxP/7TViW9KkjS+PTPnVWqpTkz0hYDQhk63Ruw3JA==} + cpu: [x64] + os: [win32] + hasBin: true + + '@zed-industries/codex-acp@0.12.0': + resolution: {integrity: sha512-0d7gRzOiYTgDmIyh783mCcq50h3mdOg/TtKdLfBIghOLushpQRwhuLjKK8Q9hxZfNlPL0Ua56DoPjnsW8amf8g==} + hasBin: true + abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2691,6 +3914,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acpx@0.6.1: + resolution: {integrity: sha512-qxZPbm3SKq0UqQ0sOJ0M4iTLkF9AR7+I+JE/L/UeMUU1vW5N4nUVkZHytoHTBAu7nrej6THNzCPgrIZfv9T3AA==} + engines: {node: '>=22.12.0'} + hasBin: true + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -2715,8 +3943,11 @@ packages: ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + another-json@0.2.0: + resolution: {integrity: sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -2748,6 +3979,10 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + apache-arrow@18.1.0: + resolution: {integrity: sha512-v/ShMp57iBnBp4lDgV8Jx3d3Q5/Hac25FWmQ98eMahUiHPXcvwIMKJD0hBIgclm/FCG+LwPkAKtkRO1O/W0YGg==} + hasBin: true + app-builder-bin@5.0.0-alpha.12: resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} @@ -2784,6 +4019,14 @@ packages: arktype@2.2.0: resolution: {integrity: sha512-t54MZ7ti5BhOEvzEkgKnWvqj+UbDfWig+DHr5I34xatymPusKLS0lQpNJd8M6DzmIto2QGszHfNKoFIT8tMCZQ==} + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@6.2.3: + resolution: {integrity: sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==} + engines: {node: '>=12.17'} + asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} @@ -2841,6 +4084,17 @@ packages: axios@1.13.6: resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} + axios@1.16.0: + resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} + + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2851,6 +4105,50 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.1: + resolution: {integrity: sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.9.1: + resolution: {integrity: sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.13.1: + resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.3: + resolution: {integrity: sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2890,10 +4188,16 @@ packages: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} @@ -2916,12 +4220,24 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -2935,6 +4251,10 @@ packages: builder-util@26.8.1: resolution: {integrity: sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -2980,6 +4300,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk-template@0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -3008,10 +4332,6 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -3027,6 +4347,9 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -3095,6 +4418,14 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@7.0.4: + resolution: {integrity: sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==} + engines: {node: '>=12.20.0'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -3173,10 +4504,20 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -3185,6 +4526,9 @@ packages: engines: {node: '>=4'} hasBin: true + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + cssstyle@6.2.0: resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} engines: {node: '>=20'} @@ -3241,6 +4585,14 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -3252,6 +4604,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -3294,6 +4650,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + diff@8.0.4: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} @@ -3304,12 +4664,12 @@ packages: dingbat-to-unicode@1.0.1: resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==} - dingtalk-stream@2.1.5: - resolution: {integrity: sha512-6H3tSc/mE6hMj4RBB5ntkI4ycC498RobmtMxfLS8eBTRPjBZlhUdDYEHA0asOoTLSzC2PHqupr4D4HVoaU7bRQ==} - dir-compare@4.2.0: resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} + discord-api-types@0.38.47: + resolution: {integrity: sha512-XgXQodHQBAE6kfD7kMvVo30863iHX1LHSqNq6MGUTDwIFCCvHva13+rwxyxVXDqudyApMNAd32PGjgVETi5rjA==} + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -3328,6 +4688,19 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@10.1.0: resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} engines: {node: '>=20'} @@ -3419,6 +4792,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -3545,9 +4922,23 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + eventsource-parser@3.0.6: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} @@ -3588,9 +4979,16 @@ packages: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} engines: {'0': node >=0.6.0} + fake-indexeddb@6.2.5: + resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} + engines: {node: '>=18'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -3613,16 +5011,9 @@ packages: fast-wrap-ansi@0.1.6: resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==} - fast-xml-builder@1.1.4: - resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} - fast-xml-builder@1.1.5: resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} - fast-xml-parser@5.5.10: - resolution: {integrity: sha512-go2J2xODMc32hT+4Xr/bBGXMaIoiCwrwp2mMtAvKyvEFW6S/v5Gn2pBmE4nvbwNjGhpcAiOwEv7R6/GZ6XRa9w==} - hasBin: true - fast-xml-parser@5.7.2: resolution: {integrity: sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==} hasBin: true @@ -3672,6 +5063,10 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3684,6 +5079,9 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} + flatbuffers@24.12.23: + resolution: {integrity: sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==} + flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} @@ -3696,6 +5094,15 @@ packages: debug: optional: true + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -3753,10 +5160,6 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs-minipass@3.0.3: resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3777,10 +5180,18 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + gaxios@7.1.4: resolution: {integrity: sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==} engines: {node: '>=18'} + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + gcp-metadata@8.1.2: resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} engines: {node: '>=18'} @@ -3813,6 +5224,9 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} @@ -3849,6 +5263,10 @@ packages: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} + global-agent@4.1.3: + resolution: {integrity: sha512-KUJEViiuFT3I97t+GYMikLPJS2Lfo/S2F+DQuBWzuzaMPnvt5yyZePzArx36fBzpGTxZjIpDbXLeySLgh+k76g==} + engines: {node: '>=10.0'} + globals@17.4.0: resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} engines: {node: '>=18'} @@ -3861,6 +5279,14 @@ packages: resolution: {integrity: sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==} engines: {node: '>=18'} + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} + engines: {node: '>=14'} + + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + google-logging-utils@1.1.3: resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} engines: {node: '>=14'} @@ -3876,6 +5302,14 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + grammy@1.42.0: + resolution: {integrity: sha512-1AdCge+AkjSdp2FwfICSFnVbl8Mq3KVHJDy+DgTI9+D6keJ0zWALPRKas5jv/8psiCzL4N2cEOcGW7O45Kn39g==} + engines: {node: ^12.20.0 || >=14.13.1} + + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3917,6 +5351,9 @@ packages: hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} @@ -3960,12 +5397,21 @@ packages: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -4028,14 +5474,13 @@ packages: image-q@4.0.0: resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==} - image-size@2.0.2: - resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} - engines: {node: '>=16.x'} - hasBin: true - immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + import-in-the-middle@3.0.1: + resolution: {integrity: sha512-pYkiyXVL2Mf3pozdlDGV6NAObxQx13Ae8knZk1UJRJ6uRW/ZRmTGHlQYtrsSl7ubuE5F8CD1z+s1n4RHNuTtuA==} + engines: {node: '>=18'} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -4066,6 +5511,9 @@ packages: resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} + ircv3@0.33.1: + resolution: {integrity: sha512-FPUj/q6zsLgIX6QDdLMjPRBObw0xK+k6eiI62dcTRwdl5aezYV0nuMhpmafyHOD6ZDqfw8DW4ayrvDfmYO65JQ==} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -4083,6 +5531,14 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -4098,6 +5554,11 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -4124,6 +5585,10 @@ packages: is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -4132,6 +5597,10 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -4166,6 +5635,9 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + jose@6.2.2: resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} @@ -4196,6 +5668,10 @@ packages: json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-bignum@0.0.3: + resolution: {integrity: sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==} + engines: {node: '>=0.8'} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -4229,15 +5705,31 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} jwa@2.0.1: resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + jwks-rsa@3.2.2: + resolution: {integrity: sha512-BqTyEDV+lS8F2trk3A+qJnxV5Q9EqKCBJOPti3W97r7qTympCZjb7h2X6f2kc+0K3rsSTY1/6YG2eaXKoj497w==} + engines: {node: '>=14'} + + jwks-rsa@4.0.1: + resolution: {integrity: sha512-poXwUA8S4cP9P5N8tZS3xnUDJH8WmwSGfKK9gIaRPdjLHyJtd9iX/cngX9CUIe0Caof5JhK2EbN7N5lnnaf9NA==} + engines: {node: ^20.19.0 || ^22.12.0 || >= 23.0.0} + jws@4.0.1: resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + katex@0.16.45: resolution: {integrity: sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==} hasBin: true @@ -4248,6 +5740,10 @@ packages: keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + koffi@2.15.2: resolution: {integrity: sha512-r9tjJLVRSOhCRWdVyQlF3/Ugzeg13jlzS4czS82MAgLff4W+BcYOW7g8Y62t9O5JYjYOLAjAovAZDNlDfZNu+g==} @@ -4265,9 +5761,21 @@ packages: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} + limiter@1.1.5: + resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkedom@0.18.12: + resolution: {integrity: sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q==} + engines: {node: '>=16'} + peerDependencies: + canvas: '>= 2' + peerDependenciesMeta: + canvas: + optional: true + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -4279,19 +5787,46 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} lodash.identity@3.0.0: resolution: {integrity: sha512-AupTIzdLQxJS5wIYUQlgGyk2XRTfGXA+MCghDHqZk0pzUNYvd3EESS6dkChNauNYVIutcb0dfHw1ri9Q1yPV8Q==} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.pickby@4.6.0: resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} @@ -4306,6 +5841,10 @@ packages: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} @@ -4340,6 +5879,15 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + lru-memoizer@2.3.0: + resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} + + lru-memoizer@3.0.0: + resolution: {integrity: sha512-m83w/cYXLdUIboKSPxzPAGfYnk+vqeDYXuoSrQRw1q+yVEd8IXhvMufN8Q5TIPe7e2jyX4SRNrDJI2Skw1yznQ==} + + lru_map@0.4.1: + resolution: {integrity: sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==} + lucide-react@0.563.0: resolution: {integrity: sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==} peerDependencies: @@ -4377,10 +5925,24 @@ packages: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} + matcher@4.0.0: + resolution: {integrity: sha512-S6x5wmcDmsDRRU/c2dkccDwQPXoFczc5+HpQ2lON8pnvHlnvHAHj5WlLVvw6n6vNyHuVugYrFohYxbS+pvFpKQ==} + engines: {node: '>=10'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + matrix-events-sdk@0.0.1: + resolution: {integrity: sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==} + + matrix-js-sdk@41.4.0-rc.0: + resolution: {integrity: sha512-LhxRnqDhrI7qmZZ2N8EFnyxLBZqc4npqOXNPpxzVwlb/McL98sNjOXCcbR4KL0L/76j5nK43V536/+evP+rSwA==} + engines: {node: '>=22.0.0'} + + matrix-widget-api@1.17.0: + resolution: {integrity: sha512-5FHoo3iEP3Bdlv5jsYPWOqj+pGdFQNLWnJLiB0V7Ygne7bb+Gsj3ibyFyHWC6BVw+Z+tSW4ljHpO17I9TwStwQ==} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -4634,18 +6196,10 @@ packages: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - minizlib@3.1.0: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} @@ -4654,10 +6208,8 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} motion-dom@12.38.0: resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} @@ -4665,6 +6217,13 @@ packages: motion-utils@12.36.0: resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} + mpg123-decoder@1.0.3: + resolution: {integrity: sha512-+fjxnWigodWJm3+4pndi+KUg9TBojgn31DPk85zEsim7C6s0X5Ztc/hQYdytXkwuGXH+aB0/aEkG40Emukv6oQ==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4706,6 +6265,24 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead + node-downloader-helper@2.1.11: + resolution: {integrity: sha512-882fH2C9AWdiPCwz/2beq5t8FGMZK9Dx8TJUOIxzMCbvG7XUKM5BuJwN5f0NKo4SCQK6jR4p2TPm54mYGdGchQ==} + engines: {node: '>=14.18'} + hasBin: true + + node-edge-tts@1.2.10: + resolution: {integrity: sha512-bV2i4XU54D45+US0Zm1HcJRkifuB3W438dWyuJEHLQdKxnuqlI1kim2MOvR6Q3XUQZvfF9PoDyR1Rt7aeXhPdQ==} + hasBin: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4734,6 +6311,20 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + nostr-tools@2.23.3: + resolution: {integrity: sha512-AALyt9k8xPdF4UV2mlLJ2mgCn4kpTB0DZ8t2r6wjdUh6anfx2cTVBsHUlo9U0EY/cKC5wcNyiMAmRJV5OVEalA==} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + + nostr-wasm@0.1.0: + resolution: {integrity: sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4753,6 +6344,10 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + oidc-client-ts@3.5.0: + resolution: {integrity: sha512-l2q8l9CTCTOlbX+AnK4p3M+4CEpKpyQhle6blQkdFhm0IsBqsxm15bYaSa11G7pWdsYr6epdsRZxJpCyCRbT8A==} + engines: {node: '>=18'} + omggif@1.0.10: resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} @@ -4775,6 +6370,16 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + openai@6.26.0: resolution: {integrity: sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==} hasBin: true @@ -4799,11 +6404,16 @@ packages: zod: optional: true - openclaw@2026.4.26: - resolution: {integrity: sha512-KBKI7gu9d/6NxBfqnojTFcHNJvrOyyYGJ6oczaBKF7zUHVKdm78zZNQOBmwiaHQMrvhjNRo0ry9xXtaAJwhV3A==} + openclaw@2026.4.29: + resolution: {integrity: sha512-IRhX38ow4Hj783YxChK10rHwNg6OCupzGvVxG7EE24GaXHBumrESDpWUsgX0FiwTa0LYQBxuAcDncbyFiGVaOg==} engines: {node: '>=22.14.0'} hasBin: true + openshell@0.1.0: + resolution: {integrity: sha512-B7jLewH+d73hraWcrSFgNOjvd+frW5JPejkTpqgj2EJBjX/Yk1Y4blgP5pDl4FwrBxfmwsTKR08Uwgrdo+xpSg==} + engines: {node: '>=18'} + hasBin: true + option@0.2.4: resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} @@ -4811,6 +6421,9 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + opusscript@0.1.1: + resolution: {integrity: sha512-mL0fZZOUnXdZ78woRXp18lApwpp0lF5tozJOD1Wut0dgrA9WuQTgSels/CSmFleaAZrJi/nci5KOVtbuxeWoQA==} + ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -4819,14 +6432,14 @@ packages: resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} engines: {node: '>=20'} - osc-progress@0.3.0: - resolution: {integrity: sha512-4/8JfsetakdeEa4vAYV45FW20aY+B/+K8NEXp5Eiar3wR8726whgHrbSg5Ar/ZY1FLJ/AGtUqV7W2IVF+Gvp9A==} - engines: {node: '>=20'} - p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4847,6 +6460,10 @@ packages: resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + p-queue@9.1.0: resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==} engines: {node: '>=20'} @@ -4859,6 +6476,18 @@ packages: resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} engines: {node: '>=20'} + p-retry@8.0.0: + resolution: {integrity: sha512-kFVqH1HxOHp8LupNsOys7bSV09VYTRLxarH/mokO4Rqhk6wGi70E0jh4VzvVGXfEVNggHoHLAMWsQqHyU1Ey9A==} + engines: {node: '>=22'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-timeout@4.1.0: + resolution: {integrity: sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==} + engines: {node: '>=10'} + p-timeout@7.0.1: resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} engines: {node: '>=20'} @@ -4891,6 +6520,9 @@ packages: pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parse-bmfont-ascii@1.0.6: resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} @@ -4929,10 +6561,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-expression-matcher@1.2.1: - resolution: {integrity: sha512-d7gQQmLvAKXKXE2GeP9apIGbMYKz88zWdsn/BN2HRWVQsDFdUY36WSLTY0Jvd4HWi7Fb30gQ62oAOzdgJA6fZw==} - engines: {node: '>=14.0.0'} - path-expression-matcher@1.5.0: resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} engines: {node: '>=14.0.0'} @@ -4962,14 +6590,9 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pdf-parse@2.4.5: - resolution: {integrity: sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg==} - engines: {node: '>=20.16.0 <21 || >=22.3.0'} - hasBin: true - - pdfjs-dist@5.4.296: - resolution: {integrity: sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==} - engines: {node: '>=20.16.0 || >=22.3.0'} + pdfjs-dist@5.7.284: + resolution: {integrity: sha512-h4EdYQczmGhbOlqc3PPZwxevn7ApdWPbovAuWXOB/DjIyigSnwfy2oze7c6mRcSr9XgLp3eN3EeL4DyySTPMFw==} + engines: {node: '>=22.13.0 || >=24'} pe-library@0.4.1: resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} @@ -5020,6 +6643,11 @@ packages: engines: {node: '>=18'} hasBin: true + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + engines: {node: '>=18'} + hasBin: true + playwright@1.59.0: resolution: {integrity: sha512-wihGScriusvATUxmhfENxg0tj1vHEFeIwxlnPFKQTOQVd7aG08mUfvvniRP/PtQOC+2Bs52kBOC/Up1jTXeIbw==} engines: {node: '>=18'} @@ -5114,6 +6742,23 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + prism-media@1.3.5: + resolution: {integrity: sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==} + peerDependencies: + '@discordjs/opus': '>=0.8.0 <1.0.0' + ffmpeg-static: ^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0 + node-opus: ^0.3.3 + opusscript: ^0.0.8 + peerDependenciesMeta: + '@discordjs/opus': + optional: true + ffmpeg-static: + optional: true + node-opus: + optional: true + opusscript: + optional: true + proc-log@5.0.0: resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -5146,6 +6791,10 @@ packages: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} + protobufjs@8.0.3: + resolution: {integrity: sha512-LBYnMWkKLB8fE/ljROPDbCl7mgLSlI+oBe1fAAr5MTqFg4TIi0tYrVVurJvQggOjnUYMQtEZBjrej59ojMNTHQ==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -5329,6 +6978,18 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + rehype-katex@7.0.1: resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} @@ -5355,6 +7016,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -5365,6 +7030,9 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -5411,6 +7079,10 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -5420,6 +7092,9 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-compare@1.1.4: + resolution: {integrity: sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==} + safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -5427,6 +7102,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sandwich-stream@2.0.2: + resolution: {integrity: sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==} + engines: {node: '>= 0.10'} + sanitize-filename@1.6.4: resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} @@ -5441,6 +7120,10 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + sdp-transform@3.0.0: + resolution: {integrity: sha512-gfYVRGxjHkGF2NPeUWHw5u6T/KGFtS5/drPms73gaSuMaVHKCY3lpLnGDfswVQO0kddeePoti09AwhYP4zA8dQ==} + hasBin: true + semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -5465,6 +7148,10 @@ packages: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} + serialize-error@8.1.0: + resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} + engines: {node: '>=10'} + serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} @@ -5493,6 +7180,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -5519,6 +7209,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + silk-wasm@3.7.1: + resolution: {integrity: sha512-mXPwLRtZxrYV3TZx41jMAeKc80wvmyrcXIcs8HctFxK15Ahz2OJQENYhNgEPeCEOdI6Mbx1NxQsqxzwc3DKerw==} + engines: {node: '>=16.11.0'} + simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} @@ -5527,9 +7221,17 @@ packages: resolution: {integrity: sha512-mz9VXphOxQWX3eQ/uXCtm6upltoN0DLx8Zb5T4TFC4FHB7S9FDPGre8CfLWqPWQQH/GrQYd2AXhhVM5LDpYx6Q==} engines: {node: '>=20.12.2'} + simple-yenc@1.0.4: + resolution: {integrity: sha512-5gvxpSd79e9a3V4QDYUqnqxeD4HGlhCakVpb6gMnDD7lexJggSBJRBO5h52y/iJrdXRilX9UCuDaIJhSWm5OWw==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + skillflag@0.1.4: + resolution: {integrity: sha512-egFg+XCF5sloOWdtzxZivTX7n4UDj5pxQoY33wbT8h+YSDjMQJ76MZUg2rXQIBXmIDtlZhLgirS1g/3R5/qaHA==} + engines: {node: '>=18'} + hasBin: true + slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -5573,6 +7275,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -5636,6 +7341,9 @@ packages: resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} engines: {node: '>=18'} + streamx@2.25.0: + resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5669,9 +7377,6 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strnum@2.2.2: - resolution: {integrity: sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==} - strnum@2.2.3: resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} @@ -5711,6 +7416,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + table-layout@4.1.1: + resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} + engines: {node: '>=12.17'} + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -5728,14 +7437,21 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} tar@7.5.13: resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + telegraf@4.16.3: + resolution: {integrity: sha512-yjEu2NwkHlXu0OARWoNhJlIjX09dRktiMQFsM678BAH/PEPVwctzL67+tvXqLCRQQvm3SDtki2saGO9hLlz68w==} + engines: {node: ^12.20.0 || >=14.13.1} + hasBin: true + temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} @@ -5743,6 +7459,9 @@ packages: resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} engines: {node: '>=6.0.0'} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -5777,9 +7496,16 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + tldts-core@7.0.27: resolution: {integrity: sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==} + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + tldts@7.0.27: resolution: {integrity: sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==} hasBin: true @@ -5803,10 +7529,22 @@ packages: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} + tokenjuice@0.7.0: + resolution: {integrity: sha512-RZIyFmzztf/8V4q1cUS5L+q8UISMSfsjzh4UoWVxQbE7/zX91SfNmHpNqopqyB4oc5hwH4XqC9O/yakVzJCu8g==} + engines: {node: '>=20'} + hasBin: true + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + tough-cookie@6.0.1: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -5839,6 +7577,15 @@ packages: resolution: {integrity: sha512-XuELoRpMR+sq8fuWwX7P0bcj+PRNiicOKDEb3fGNURhxWVyykCi9BNq7c4uVz7h7P0sj8qgBsr5SWS6yBClq3g==} engines: {node: '>=16'} + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -5847,6 +7594,10 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + type-fest@5.5.0: resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} engines: {node: '>=20'} @@ -5855,17 +7606,28 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - typebox@1.1.33: - resolution: {integrity: sha512-+/MWwlQ1q2GSVwoxi/+u5JsHkgLQKcCN2Nsjree9c+K7GJu40qbaHrFETmfV1i9Fs1TcOVfynW+jJvIWcXtvjw==} + typebox@1.1.34: + resolution: {integrity: sha512-V0fM5W5DTXlEMDxqtX1dQ25HR1RQ11DPUVrIup4sJi1yQtIyI30SHfxBy/HjXKL1CtUqc5or2igA/wa/v4hMKQ==} typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@7.3.0: + resolution: {integrity: sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==} + engines: {node: '>=12.17'} + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + uhyphen@0.2.0: + resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} + uint8array-extras@1.5.0: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} @@ -5873,6 +7635,9 @@ packages: underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -5890,6 +7655,9 @@ packages: resolution: {integrity: sha512-E9MkTS4xXLnRPYqxH2e6Hr2/49e7WFDKczKcCaFH4VaZs2iNvHMqeIkyUAD9vM8kujy9TjVrRlQ5KkdEJxB2pw==} engines: {node: '>=22.19.0'} + unhomoglyph@1.0.6: + resolution: {integrity: sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -5982,10 +7750,24 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@13.0.2: + resolution: {integrity: sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==} + hasBin: true + uuid@14.0.0: resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -6112,6 +7894,9 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -6124,6 +7909,9 @@ packages: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + when-exit@2.1.5: resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} @@ -6152,6 +7940,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrapjs@5.1.1: + resolution: {integrity: sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==} + engines: {node: '>=12.17'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -6179,6 +7971,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -6262,6 +8058,10 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} + zca-js@2.1.2: + resolution: {integrity: sha512-82+zCqoIXnXEF6C9YuN3Kf7WKlyyujY/6Ejl2n8PkwazYkBK0k7kiPd8S7nHvC5Wl7vjwGRhDYeAM8zTHyoRxQ==} + engines: {node: '>=18.0.0'} + zod-to-json-schema@3.25.1: resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: @@ -6313,18 +8113,94 @@ snapshots: '@adobe/css-tools@4.4.4': {} + '@agentclientprotocol/claude-agent-acp@0.31.1': + dependencies: + '@agentclientprotocol/sdk': 0.20.0(zod@4.3.6) + '@anthropic-ai/claude-agent-sdk': 0.2.119(zod@4.3.6) + zod: 4.3.6 + transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color + '@agentclientprotocol/sdk@0.20.0(zod@4.3.6)': dependencies: zod: 4.3.6 + '@agentclientprotocol/sdk@0.21.0(zod@4.3.6)': + dependencies: + zod: 4.3.6 + '@alloc/quick-lru@5.2.0': {} + '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.2.119': + optional: true + + '@anthropic-ai/claude-agent-sdk-darwin-x64@0.2.119': + optional: true + + '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.2.119': + optional: true + + '@anthropic-ai/claude-agent-sdk-linux-arm64@0.2.119': + optional: true + + '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.2.119': + optional: true + + '@anthropic-ai/claude-agent-sdk-linux-x64@0.2.119': + optional: true + + '@anthropic-ai/claude-agent-sdk-win32-arm64@0.2.119': + optional: true + + '@anthropic-ai/claude-agent-sdk-win32-x64@0.2.119': + optional: true + + '@anthropic-ai/claude-agent-sdk@0.2.119(zod@4.3.6)': + dependencies: + '@anthropic-ai/sdk': 0.81.0(zod@4.3.6) + '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) + zod: 4.3.6 + optionalDependencies: + '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.2.119 + '@anthropic-ai/claude-agent-sdk-darwin-x64': 0.2.119 + '@anthropic-ai/claude-agent-sdk-linux-arm64': 0.2.119 + '@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.2.119 + '@anthropic-ai/claude-agent-sdk-linux-x64': 0.2.119 + '@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.2.119 + '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.2.119 + '@anthropic-ai/claude-agent-sdk-win32-x64': 0.2.119 + transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color + + '@anthropic-ai/sdk@0.81.0(zod@4.3.6)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.3.6 + '@anthropic-ai/sdk@0.90.0(zod@4.3.6)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: zod: 4.3.6 + '@anthropic-ai/sdk@0.91.1(zod@4.3.6)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.3.6 + + '@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) + 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 @@ -6355,6 +8231,21 @@ snapshots: '@aws-sdk/types': 3.973.8 tslib: 2.8.1 + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.8 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@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-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 @@ -6433,6 +8324,155 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-bedrock@3.1038.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.6 + '@aws-sdk/credential-provider-node': 3.972.37 + '@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.36 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/token-providers': 3.1038.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.22 + '@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.6 + '@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.5 + '@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 + '@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/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-s3@3.1038.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.6 + '@aws-sdk/credential-provider-node': 3.972.37 + '@aws-sdk/middleware-bucket-endpoint': 3.972.10 + '@aws-sdk/middleware-expect-continue': 3.972.10 + '@aws-sdk/middleware-flexible-checksums': 3.974.16 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-location-constraint': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-sdk-s3': 3.972.35 + '@aws-sdk/middleware-ssec': 3.972.10 + '@aws-sdk/middleware-user-agent': 3.972.36 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/signature-v4-multi-region': 3.996.23 + '@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.22 + '@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-blob-browser': 4.2.15 + '@smithy/hash-node': 4.2.14 + '@smithy/hash-stream-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/md5-js': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.32 + '@smithy/middleware-retry': 4.5.6 + '@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.5 + '@smithy/util-stream': 4.5.25 + '@smithy/util-utf8': 4.2.2 + '@smithy/util-waiter': 4.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/core@3.974.6': dependencies: '@aws-sdk/types': 3.973.8 @@ -6450,6 +8490,38 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@aws-sdk/core@3.974.8': + dependencies: + '@aws-sdk/types': 3.973.8 + '@aws-sdk/xml-builder': 3.972.22 + '@smithy/core': 3.23.17 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/smithy-client': 4.12.13 + '@smithy/types': 4.14.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.8 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/crc64-nvme@3.972.7': + dependencies: + '@smithy/types': 4.14.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-cognito-identity@3.972.31': + dependencies: + '@aws-sdk/nested-clients': 3.997.6 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-env@3.972.32': dependencies: '@aws-sdk/core': 3.974.6 @@ -6458,6 +8530,14 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.972.34': + dependencies: + '@aws-sdk/core': 3.974.8 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.972.34': dependencies: '@aws-sdk/core': 3.974.6 @@ -6471,6 +8551,19 @@ snapshots: '@smithy/util-stream': 4.5.25 tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.972.36': + dependencies: + '@aws-sdk/core': 3.974.8 + '@aws-sdk/types': 3.973.8 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/node-http-handler': 4.6.1 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.13 + '@smithy/types': 4.14.1 + '@smithy/util-stream': 4.5.25 + tslib: 2.8.1 + '@aws-sdk/credential-provider-ini@3.972.36': dependencies: '@aws-sdk/core': 3.974.6 @@ -6490,6 +8583,25 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-ini@3.972.38': + dependencies: + '@aws-sdk/core': 3.974.8 + '@aws-sdk/credential-provider-env': 3.972.34 + '@aws-sdk/credential-provider-http': 3.972.36 + '@aws-sdk/credential-provider-login': 3.972.38 + '@aws-sdk/credential-provider-process': 3.972.34 + '@aws-sdk/credential-provider-sso': 3.972.38 + '@aws-sdk/credential-provider-web-identity': 3.972.38 + '@aws-sdk/nested-clients': 3.997.6 + '@aws-sdk/types': 3.973.8 + '@smithy/credential-provider-imds': 4.2.14 + '@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/credential-provider-login@3.972.36': dependencies: '@aws-sdk/core': 3.974.6 @@ -6503,6 +8615,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-login@3.972.38': + 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/protocol-http': 5.3.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-node@3.972.37': dependencies: '@aws-sdk/credential-provider-env': 3.972.32 @@ -6520,6 +8645,23 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.972.39': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.34 + '@aws-sdk/credential-provider-http': 3.972.36 + '@aws-sdk/credential-provider-ini': 3.972.38 + '@aws-sdk/credential-provider-process': 3.972.34 + '@aws-sdk/credential-provider-sso': 3.972.38 + '@aws-sdk/credential-provider-web-identity': 3.972.38 + '@aws-sdk/types': 3.973.8 + '@smithy/credential-provider-imds': 4.2.14 + '@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/credential-provider-process@3.972.32': dependencies: '@aws-sdk/core': 3.974.6 @@ -6529,6 +8671,15 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/credential-provider-process@3.972.34': + dependencies: + '@aws-sdk/core': 3.974.8 + '@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 + '@aws-sdk/credential-provider-sso@3.972.36': dependencies: '@aws-sdk/core': 3.974.6 @@ -6542,6 +8693,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-sso@3.972.38': + dependencies: + '@aws-sdk/core': 3.974.8 + '@aws-sdk/nested-clients': 3.997.6 + '@aws-sdk/token-providers': 3.1041.0 + '@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/credential-provider-web-identity@3.972.36': dependencies: '@aws-sdk/core': 3.974.6 @@ -6554,6 +8718,43 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-web-identity@3.972.38': + 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/credential-providers@3.1043.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.1043.0 + '@aws-sdk/core': 3.974.8 + '@aws-sdk/credential-provider-cognito-identity': 3.972.31 + '@aws-sdk/credential-provider-env': 3.972.34 + '@aws-sdk/credential-provider-http': 3.972.36 + '@aws-sdk/credential-provider-ini': 3.972.38 + '@aws-sdk/credential-provider-login': 3.972.38 + '@aws-sdk/credential-provider-node': 3.972.39 + '@aws-sdk/credential-provider-process': 3.972.34 + '@aws-sdk/credential-provider-sso': 3.972.38 + '@aws-sdk/credential-provider-web-identity': 3.972.38 + '@aws-sdk/nested-clients': 3.997.6 + '@aws-sdk/types': 3.973.8 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.17 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/eventstream-handler-node@3.972.14': dependencies: '@aws-sdk/types': 3.973.8 @@ -6561,6 +8762,16 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/middleware-bucket-endpoint@3.972.10': + dependencies: + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-arn-parser': 3.972.3 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-config-provider': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/middleware-eventstream@3.972.10': dependencies: '@aws-sdk/types': 3.973.8 @@ -6568,6 +8779,30 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/middleware-expect-continue@3.972.10': + dependencies: + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.974.16': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.974.8 + '@aws-sdk/crc64-nvme': 3.972.7 + '@aws-sdk/types': 3.973.8 + '@smithy/is-array-buffer': 4.2.2 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-stream': 4.5.25 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.972.10': dependencies: '@aws-sdk/types': 3.973.8 @@ -6575,6 +8810,12 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/middleware-location-constraint@3.972.10': + dependencies: + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.972.10': dependencies: '@aws-sdk/types': 3.973.8 @@ -6606,6 +8847,29 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@aws-sdk/middleware-sdk-s3@3.972.37': + dependencies: + '@aws-sdk/core': 3.974.8 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-arn-parser': 3.972.3 + '@smithy/core': 3.23.17 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/smithy-client': 4.12.13 + '@smithy/types': 4.14.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-stream': 4.5.25 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.972.10': + dependencies: + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.972.36': dependencies: '@aws-sdk/core': 3.974.6 @@ -6617,6 +8881,17 @@ snapshots: '@smithy/util-retry': 4.3.5 tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.972.38': + dependencies: + '@aws-sdk/core': 3.974.8 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@smithy/core': 3.23.17 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-retry': 4.3.8 + tslib: 2.8.1 + '@aws-sdk/middleware-websocket@3.972.16': dependencies: '@aws-sdk/types': 3.973.8 @@ -6676,6 +8951,50 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/nested-clients@3.997.6': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.8 + '@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/signature-v4-multi-region': 3.996.25 + '@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/region-config-resolver@3.972.13': dependencies: '@aws-sdk/types': 3.973.8 @@ -6684,6 +9003,17 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/s3-request-presigner@3.1038.0': + dependencies: + '@aws-sdk/signature-v4-multi-region': 3.996.23 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-format-url': 3.972.10 + '@smithy/middleware-endpoint': 4.4.32 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.13 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@aws-sdk/signature-v4-multi-region@3.996.23': dependencies: '@aws-sdk/middleware-sdk-s3': 3.972.35 @@ -6693,6 +9023,15 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/signature-v4-multi-region@3.996.25': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.972.37 + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@aws-sdk/token-providers@3.1038.0': dependencies: '@aws-sdk/core': 3.974.6 @@ -6705,6 +9044,18 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/token-providers@3.1041.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 @@ -6749,6 +9100,15 @@ snapshots: '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.973.24': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.38 + '@aws-sdk/types': 3.973.8 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-config-provider': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/xml-builder@3.972.21': dependencies: '@nodable/entities': 2.1.0 @@ -6756,8 +9116,119 @@ snapshots: fast-xml-parser: 5.7.2 tslib: 2.8.1 + '@aws-sdk/xml-builder@3.972.22': + dependencies: + '@nodable/entities': 2.1.0 + '@smithy/types': 4.14.1 + fast-xml-parser: 5.7.2 + tslib: 2.8.1 + + '@aws/bedrock-token-generator@1.1.0': + dependencies: + '@aws-sdk/credential-providers': 3.1043.0 + '@aws-sdk/util-format-url': 3.972.10 + '@smithy/config-resolver': 4.4.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/types': 4.14.1 + transitivePeerDependencies: + - aws-crt + '@aws/lambda-invoke-store@0.2.4': {} + '@azure/abort-controller@2.1.2': + dependencies: + tslib: 2.8.1 + + '@azure/core-auth@1.10.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.13.1 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-client@1.10.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-rest-pipeline@1.23.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + '@typespec/ts-http-runtime': 0.3.5 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-tracing@1.3.1': + dependencies: + tslib: 2.8.1 + + '@azure/core-util@1.13.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@typespec/ts-http-runtime': 0.3.5 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/identity@4.13.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + '@azure/msal-browser': 5.9.0 + '@azure/msal-node': 5.1.5 + open: 10.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/logger@1.3.0': + dependencies: + '@typespec/ts-http-runtime': 0.3.5 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/msal-browser@5.9.0': + dependencies: + '@azure/msal-common': 16.5.2 + + '@azure/msal-common@15.17.0': {} + + '@azure/msal-common@16.5.2': {} + + '@azure/msal-node@3.8.10': + dependencies: + '@azure/msal-common': 15.17.0 + jsonwebtoken: 9.0.3 + uuid: 8.3.2 + + '@azure/msal-node@5.1.5': + dependencies: + '@azure/msal-common': 16.5.2 + jsonwebtoken: 9.0.3 + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -6919,6 +9390,11 @@ snapshots: fast-wrap-ansi: 0.1.6 sisteransi: 1.0.5 + '@clawdbot/lobster@2026.4.6': + dependencies: + ajv: 8.20.0 + yaml: 2.8.3 + '@csstools/color-helpers@6.0.2': {} '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': @@ -6943,11 +9419,78 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} + '@d-fischer/cache-decorators@4.0.1': + dependencies: + '@d-fischer/shared-utils': 3.6.4 + tslib: 2.8.1 + + '@d-fischer/connection@10.0.1': + dependencies: + '@d-fischer/isomorphic-ws': 7.0.2(ws@8.20.0) + '@d-fischer/logger': 4.2.4 + '@d-fischer/shared-utils': 3.6.4 + '@d-fischer/typed-event-emitter': 3.3.3 + '@types/node': 20.19.39 + '@types/ws': 8.18.1 + tslib: 2.8.1 + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@d-fischer/deprecate@2.0.2': {} + + '@d-fischer/detect-node@3.0.1': {} + + '@d-fischer/escape-string-regexp@5.0.0': {} + + '@d-fischer/isomorphic-ws@7.0.2(ws@8.20.0)': + dependencies: + ws: 8.20.0 + + '@d-fischer/logger@4.2.4': + dependencies: + '@d-fischer/detect-node': 3.0.1 + '@d-fischer/shared-utils': 3.6.4 + tslib: 2.8.1 + + '@d-fischer/rate-limiter@1.1.0': + dependencies: + '@d-fischer/logger': 4.2.4 + '@d-fischer/shared-utils': 3.6.4 + tslib: 2.8.1 + + '@d-fischer/shared-utils@3.6.4': + dependencies: + tslib: 2.8.1 + + '@d-fischer/typed-event-emitter@3.3.3': + dependencies: + tslib: 2.8.1 + '@develar/schema-utils@2.6.5': dependencies: ajv: 6.14.0 ajv-keywords: 3.5.2(ajv@6.14.0) + '@discordjs/voice@0.19.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1)(opusscript@0.1.1)': + dependencies: + '@snazzah/davey': 0.1.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1) + '@types/ws': 8.18.1 + discord-api-types: 0.38.47 + prism-media: 1.3.5(opusscript@0.1.1) + tslib: 2.8.1 + ws: 8.20.0 + transitivePeerDependencies: + - '@discordjs/opus' + - '@emnapi/core' + - '@emnapi/runtime' + - bufferutil + - ffmpeg-static + - node-opus + - opusscript + - utf-8-validate + '@electron/asar@3.4.1': dependencies: commander: 5.1.0 @@ -7048,11 +9591,22 @@ snapshots: - supports-color optional: true + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.4': optional: true @@ -7131,9 +9685,11 @@ snapshots: '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@1.21.7))': + '@eshaz/web-worker@1.2.2': {} + + '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': dependencies: - eslint: 10.1.0(jiti@1.21.7) + eslint: 10.1.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -7154,9 +9710,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.1.0(jiti@1.21.7))': + '@eslint/js@10.0.1(eslint@10.1.0(jiti@2.6.1))': optionalDependencies: - eslint: 10.1.0(jiti@1.21.7) + eslint: 10.1.0(jiti@2.6.1) '@eslint/object-schema@3.0.3': {} @@ -7186,7 +9742,7 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@google/genai@1.49.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))': + '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))': dependencies: google-auth-library: 10.6.2 p-retry: 4.6.2 @@ -7199,12 +9755,45 @@ snapshots: - supports-color - utf-8-validate + '@grammyjs/runner@2.0.3(grammy@1.42.0(encoding@0.1.13))': + dependencies: + abort-controller: 3.0.0 + grammy: 1.42.0(encoding@0.1.13) + + '@grammyjs/transformer-throttler@1.2.1(grammy@1.42.0(encoding@0.1.13))': + dependencies: + bottleneck: 2.19.5 + grammy: 1.42.0(encoding@0.1.13) + + '@grammyjs/types@3.26.0': {} + + '@grpc/grpc-js@1.14.3': + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + '@hapi/boom@9.1.4': dependencies: '@hapi/hoek': 9.3.0 '@hapi/hoek@9.3.0': {} + '@homebridge/ciao@1.3.8': + dependencies: + debug: 4.4.3 + fast-deep-equal: 3.1.3 + source-map-support: 0.5.21 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@hono/node-server@1.19.13(hono@4.12.12)': dependencies: hono: 4.12.12 @@ -7340,7 +9929,6 @@ snapshots: mime: 3.0.0 transitivePeerDependencies: - supports-color - optional: true '@jimp/diff@1.6.1': dependencies: @@ -7350,10 +9938,8 @@ snapshots: pixelmatch: 5.3.0 transitivePeerDependencies: - supports-color - optional: true - '@jimp/file-ops@1.6.1': - optional: true + '@jimp/file-ops@1.6.1': {} '@jimp/js-bmp@1.6.1': dependencies: @@ -7363,7 +9949,6 @@ snapshots: bmp-ts: 1.0.9 transitivePeerDependencies: - supports-color - optional: true '@jimp/js-gif@1.6.1': dependencies: @@ -7373,7 +9958,6 @@ snapshots: omggif: 1.0.10 transitivePeerDependencies: - supports-color - optional: true '@jimp/js-jpeg@1.6.1': dependencies: @@ -7382,7 +9966,6 @@ snapshots: jpeg-js: 0.4.4 transitivePeerDependencies: - supports-color - optional: true '@jimp/js-png@1.6.1': dependencies: @@ -7391,7 +9974,6 @@ snapshots: pngjs: 7.0.0 transitivePeerDependencies: - supports-color - optional: true '@jimp/js-tiff@1.6.1': dependencies: @@ -7400,14 +9982,12 @@ 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: @@ -7415,13 +9995,11 @@ 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: @@ -7432,7 +10010,6 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color - optional: true '@jimp/plugin-contain@1.6.1': dependencies: @@ -7444,7 +10021,6 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color - optional: true '@jimp/plugin-cover@1.6.1': dependencies: @@ -7455,7 +10031,6 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color - optional: true '@jimp/plugin-crop@1.6.1': dependencies: @@ -7465,32 +10040,27 @@ 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: @@ -7506,13 +10076,11 @@ 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: @@ -7528,13 +10096,11 @@ 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: @@ -7543,7 +10109,6 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color - optional: true '@jimp/plugin-rotate@1.6.1': dependencies: @@ -7555,7 +10120,6 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - supports-color - optional: true '@jimp/plugin-threshold@1.6.1': dependencies: @@ -7567,18 +10131,15 @@ 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: @@ -7599,6 +10160,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@js-sdsl/ordered-map@4.4.2': {} + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: hashery: 1.5.1 @@ -7607,22 +10170,43 @@ snapshots: '@keyv/serialize@1.1.1': {} - '@larksuite/openclaw-lark@2026.4.8(openclaw@2026.4.26)': - dependencies: - '@larksuiteoapi/node-sdk': 1.60.0 - '@sinclair/typebox': 0.34.48 - image-size: 2.0.2 - zod: 4.3.6 - optionalDependencies: - openclaw: 2026.4.26 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate + '@lancedb/lancedb-darwin-arm64@0.27.2': + optional: true - '@larksuiteoapi/node-sdk@1.60.0': + '@lancedb/lancedb-linux-arm64-gnu@0.27.2': + optional: true + + '@lancedb/lancedb-linux-arm64-musl@0.27.2': + optional: true + + '@lancedb/lancedb-linux-x64-gnu@0.27.2': + optional: true + + '@lancedb/lancedb-linux-x64-musl@0.27.2': + optional: true + + '@lancedb/lancedb-win32-arm64-msvc@0.27.2': + optional: true + + '@lancedb/lancedb-win32-x64-msvc@0.27.2': + optional: true + + '@lancedb/lancedb@0.27.2(apache-arrow@18.1.0)': dependencies: - axios: 1.13.6(debug@4.4.3) + apache-arrow: 18.1.0 + reflect-metadata: 0.2.2 + optionalDependencies: + '@lancedb/lancedb-darwin-arm64': 0.27.2 + '@lancedb/lancedb-linux-arm64-gnu': 0.27.2 + '@lancedb/lancedb-linux-arm64-musl': 0.27.2 + '@lancedb/lancedb-linux-x64-gnu': 0.27.2 + '@lancedb/lancedb-linux-x64-musl': 0.27.2 + '@lancedb/lancedb-win32-arm64-msvc': 0.27.2 + '@lancedb/lancedb-win32-x64-msvc': 0.27.2 + + '@larksuiteoapi/node-sdk@1.62.1': + dependencies: + axios: 1.13.6 lodash.identity: 3.0.0 lodash.merge: 4.6.2 lodash.pickby: 4.6.0 @@ -7634,6 +10218,10 @@ snapshots: - debug - utf-8-validate + '@line/bot-sdk@11.0.0': + dependencies: + '@types/node': 24.12.0 + '@lydell/node-pty-darwin-arm64@1.2.0-beta.12': optional: true @@ -7723,10 +10311,10 @@ snapshots: std-env: 3.10.0 yoctocolors: 2.1.2 - '@mariozechner/pi-agent-core@0.70.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': + '@mariozechner/pi-agent-core@0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': dependencies: - '@mariozechner/pi-ai': 0.70.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - typebox: 1.1.33 + '@mariozechner/pi-ai': 0.70.6(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + typebox: 1.1.34 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - aws-crt @@ -7736,17 +10324,17 @@ snapshots: - ws - zod - '@mariozechner/pi-ai@0.70.2(@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)': dependencies: '@anthropic-ai/sdk': 0.90.0(zod@4.3.6) '@aws-sdk/client-bedrock-runtime': 3.1038.0 - '@google/genai': 1.49.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) + '@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.3.6) partial-json: 0.1.7 proxy-agent: 6.5.0 - typebox: 1.1.33 + typebox: 1.1.34 undici: 7.24.6 zod-to-json-schema: 3.25.1(zod@4.3.6) transitivePeerDependencies: @@ -7758,12 +10346,12 @@ snapshots: - ws - zod - '@mariozechner/pi-coding-agent@0.70.2(@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)': dependencies: '@mariozechner/jiti': 2.6.5 - '@mariozechner/pi-agent-core': 0.70.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-ai': 0.70.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-tui': 0.70.2 + '@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-tui': 0.70.6 '@silvia-odwyer/photon-node': 0.3.4 chalk: 5.6.2 cli-highlight: 2.1.11 @@ -7777,7 +10365,7 @@ snapshots: minimatch: 10.2.4 proper-lockfile: 4.1.2 strip-ansi: 7.2.0 - typebox: 1.1.33 + typebox: 1.1.34 undici: 7.24.6 uuid: 14.0.0 yaml: 2.8.3 @@ -7792,7 +10380,7 @@ snapshots: - ws - zod - '@mariozechner/pi-tui@0.70.2': + '@mariozechner/pi-tui@0.70.6': dependencies: '@types/mime-types': 2.1.4 chalk: 5.6.2 @@ -7802,6 +10390,55 @@ snapshots: optionalDependencies: koffi: 2.15.2 + '@matrix-org/matrix-sdk-crypto-nodejs@0.5.1': + dependencies: + https-proxy-agent: 7.0.6 + node-downloader-helper: 2.1.11 + transitivePeerDependencies: + - supports-color + + '@matrix-org/matrix-sdk-crypto-wasm@18.2.0': {} + + '@microsoft/teams.api@2.0.8': + dependencies: + '@microsoft/teams.cards': 2.0.8 + '@microsoft/teams.common': 2.0.8 + jwt-decode: 4.0.0 + qs: 6.15.0 + transitivePeerDependencies: + - debug + + '@microsoft/teams.apps@2.0.8': + dependencies: + '@azure/msal-node': 3.8.10 + '@microsoft/teams.api': 2.0.8 + '@microsoft/teams.common': 2.0.8 + '@microsoft/teams.graph': 2.0.8 + axios: 1.16.0 + cors: 2.8.6 + express: 5.2.1 + jsonwebtoken: 9.0.3 + jwks-rsa: 3.2.2 + reflect-metadata: 0.2.2 + transitivePeerDependencies: + - debug + - supports-color + + '@microsoft/teams.cards@2.0.8': {} + + '@microsoft/teams.common@2.0.8': + dependencies: + axios: 1.16.0 + transitivePeerDependencies: + - debug + + '@microsoft/teams.graph@2.0.8': + dependencies: + '@microsoft/teams.common': 2.0.8 + qs: 6.15.0 + transitivePeerDependencies: + - debug + '@mistralai/mistralai@2.2.1': dependencies: ws: 8.20.0 @@ -7814,8 +10451,8 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': dependencies: '@hono/node-server': 1.19.13(hono@4.12.12) - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) + 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 @@ -7833,100 +10470,71 @@ snapshots: transitivePeerDependencies: - supports-color - '@napi-rs/canvas-android-arm64@0.1.80': + '@mozilla/readability@0.6.0': {} + + '@napi-rs/canvas-android-arm64@0.1.100': optional: true - '@napi-rs/canvas-android-arm64@0.1.97': + '@napi-rs/canvas-darwin-arm64@0.1.100': optional: true - '@napi-rs/canvas-darwin-arm64@0.1.80': + '@napi-rs/canvas-darwin-x64@0.1.100': optional: true - '@napi-rs/canvas-darwin-arm64@0.1.97': + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': optional: true - '@napi-rs/canvas-darwin-x64@0.1.80': + '@napi-rs/canvas-linux-arm64-gnu@0.1.100': optional: true - '@napi-rs/canvas-darwin-x64@0.1.97': + '@napi-rs/canvas-linux-arm64-musl@0.1.100': optional: true - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.80': + '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': optional: true - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.97': + '@napi-rs/canvas-linux-x64-gnu@0.1.100': optional: true - '@napi-rs/canvas-linux-arm64-gnu@0.1.80': + '@napi-rs/canvas-linux-x64-musl@0.1.100': optional: true - '@napi-rs/canvas-linux-arm64-gnu@0.1.97': + '@napi-rs/canvas-win32-arm64-msvc@0.1.100': optional: true - '@napi-rs/canvas-linux-arm64-musl@0.1.80': + '@napi-rs/canvas-win32-x64-msvc@0.1.100': optional: true - '@napi-rs/canvas-linux-arm64-musl@0.1.97': - optional: true - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.80': - optional: true - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.97': - optional: true - - '@napi-rs/canvas-linux-x64-gnu@0.1.80': - optional: true - - '@napi-rs/canvas-linux-x64-gnu@0.1.97': - optional: true - - '@napi-rs/canvas-linux-x64-musl@0.1.80': - optional: true - - '@napi-rs/canvas-linux-x64-musl@0.1.97': - optional: true - - '@napi-rs/canvas-win32-arm64-msvc@0.1.97': - optional: true - - '@napi-rs/canvas-win32-x64-msvc@0.1.80': - optional: true - - '@napi-rs/canvas-win32-x64-msvc@0.1.97': - optional: true - - '@napi-rs/canvas@0.1.80': + '@napi-rs/canvas@0.1.100': optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.80 - '@napi-rs/canvas-darwin-arm64': 0.1.80 - '@napi-rs/canvas-darwin-x64': 0.1.80 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.80 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.80 - '@napi-rs/canvas-linux-arm64-musl': 0.1.80 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.80 - '@napi-rs/canvas-linux-x64-gnu': 0.1.80 - '@napi-rs/canvas-linux-x64-musl': 0.1.80 - '@napi-rs/canvas-win32-x64-msvc': 0.1.80 - - '@napi-rs/canvas@0.1.97': - optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.97 - '@napi-rs/canvas-darwin-arm64': 0.1.97 - '@napi-rs/canvas-darwin-x64': 0.1.97 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.97 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.97 - '@napi-rs/canvas-linux-arm64-musl': 0.1.97 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.97 - '@napi-rs/canvas-linux-x64-gnu': 0.1.97 - '@napi-rs/canvas-linux-x64-musl': 0.1.97 - '@napi-rs/canvas-win32-arm64-msvc': 0.1.97 - '@napi-rs/canvas-win32-x64-msvc': 0.1.97 + '@napi-rs/canvas-android-arm64': 0.1.100 + '@napi-rs/canvas-darwin-arm64': 0.1.100 + '@napi-rs/canvas-darwin-x64': 0.1.100 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.100 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.100 + '@napi-rs/canvas-linux-arm64-musl': 0.1.100 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.100 + '@napi-rs/canvas-linux-x64-gnu': 0.1.100 + '@napi-rs/canvas-linux-x64-musl': 0.1.100 + '@napi-rs/canvas-win32-arm64-msvc': 0.1.100 + '@napi-rs/canvas-win32-x64-msvc': 0.1.100 optional: true - '@noble/hashes@2.0.1': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.2 optional: true + '@noble/ciphers@2.1.1': {} + + '@noble/curves@2.0.1': + dependencies: + '@noble/hashes': 2.0.1 + + '@noble/hashes@2.0.1': {} + '@nodable/entities@2.1.0': {} '@nodelib/fs.scandir@2.1.5': @@ -7955,6 +10563,310 @@ snapshots: dependencies: semver: 7.7.4 + '@openai/codex@0.125.0': + optionalDependencies: + '@openai/codex-darwin-arm64': '@openai/codex@0.125.0-darwin-arm64' + '@openai/codex-darwin-x64': '@openai/codex@0.125.0-darwin-x64' + '@openai/codex-linux-arm64': '@openai/codex@0.125.0-linux-arm64' + '@openai/codex-linux-x64': '@openai/codex@0.125.0-linux-x64' + '@openai/codex-win32-arm64': '@openai/codex@0.125.0-win32-arm64' + '@openai/codex-win32-x64': '@openai/codex@0.125.0-win32-x64' + + '@openai/codex@0.125.0-darwin-arm64': + optional: true + + '@openai/codex@0.125.0-darwin-x64': + optional: true + + '@openai/codex@0.125.0-linux-arm64': + optional: true + + '@openai/codex@0.125.0-linux-x64': + optional: true + + '@openai/codex@0.125.0-win32-arm64': + optional: true + + '@openai/codex@0.125.0-win32-x64': + optional: true + + '@opentelemetry/api-logs@0.215.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/configuration@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + yaml: 2.8.3 + + '@opentelemetry/context-async-hooks@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/core@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/exporter-logs-otlp-grpc@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.215.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-logs-otlp-http@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.215.0 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.215.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-logs-otlp-proto@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.215.0 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-grpc@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-http@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-proto@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-prometheus@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-http@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-proto@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-zipkin@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/instrumentation@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.215.0 + import-in-the-middle: 3.0.1 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-grpc-exporter-base@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-transformer@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.215.0 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + protobufjs: 8.0.3 + + '@opentelemetry/propagator-b3@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/propagator-jaeger@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/resources@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/resources@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/sdk-logs@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.215.0 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/sdk-metrics@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-metrics@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-node@0.215.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.215.0 + '@opentelemetry/configuration': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/context-async-hooks': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-grpc': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-http': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-proto': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-proto': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-prometheus': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-grpc': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-zipkin': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-b3': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-jaeger': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/sdk-trace-node@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/semantic-conventions@1.40.0': {} + + '@pierre/diffs@1.1.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@pierre/theme': 0.0.28 + '@shikijs/transformers': 3.23.0 + diff: 8.0.3 + hast-util-to-html: 9.0.5 + lru_map: 0.4.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + shiki: 3.23.0 + + '@pierre/theme@0.0.28': {} + + '@pierre/theme@0.0.29': {} + '@pinojs/redact@0.4.0': {} '@pkgjs/parseargs@0.11.0': @@ -8515,12 +11427,137 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.0': optional: true + '@scure/base@2.0.0': {} + + '@scure/bip32@2.0.1': + dependencies: + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + + '@scure/bip39@2.0.1': + dependencies: + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + + '@shikijs/core@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/transformers@3.23.0': + dependencies: + '@shikijs/core': 3.23.0 + '@shikijs/types': 3.23.0 + + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + '@silvia-odwyer/photon-node@0.3.4': {} '@sinclair/typebox@0.34.48': {} '@sindresorhus/is@4.6.0': {} + '@slack/bolt@4.7.2(@types/express@5.0.6)': + dependencies: + '@slack/logger': 4.0.1 + '@slack/oauth': 3.0.5 + '@slack/socket-mode': 2.0.7 + '@slack/types': 2.21.0 + '@slack/web-api': 7.15.2 + '@types/express': 5.0.6 + axios: 1.13.6 + express: 5.2.1 + path-to-regexp: 8.3.0 + raw-body: 3.0.2 + tsscmp: 1.0.6 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + '@slack/logger@4.0.1': + dependencies: + '@types/node': 25.6.0 + + '@slack/oauth@3.0.5': + dependencies: + '@slack/logger': 4.0.1 + '@slack/web-api': 7.15.2 + '@types/jsonwebtoken': 9.0.10 + '@types/node': 25.6.0 + jsonwebtoken: 9.0.3 + transitivePeerDependencies: + - debug + + '@slack/socket-mode@2.0.7': + dependencies: + '@slack/logger': 4.0.1 + '@slack/web-api': 7.15.2 + '@types/node': 25.6.0 + '@types/ws': 8.18.1 + eventemitter3: 5.0.4 + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + '@slack/types@2.21.0': {} + + '@slack/web-api@7.15.2': + dependencies: + '@slack/logger': 4.0.1 + '@slack/types': 2.21.0 + '@types/node': 25.6.0 + '@types/retry': 0.12.0 + axios: 1.16.0 + eventemitter3: 5.0.4 + form-data: 4.0.5 + is-electron: 2.2.2 + is-stream: 2.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + retry: 0.13.1 + transitivePeerDependencies: + - debug + + '@smithy/chunked-blob-reader-native@4.2.3': + dependencies: + '@smithy/util-base64': 4.3.2 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/config-resolver@4.4.17': dependencies: '@smithy/node-config-provider': 4.3.14 @@ -8589,6 +11626,13 @@ snapshots: '@smithy/util-base64': 4.3.2 tslib: 2.8.1 + '@smithy/hash-blob-browser@4.2.15': + dependencies: + '@smithy/chunked-blob-reader': 5.2.2 + '@smithy/chunked-blob-reader-native': 4.2.3 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@smithy/hash-node@4.2.14': dependencies: '@smithy/types': 4.14.1 @@ -8596,6 +11640,12 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@smithy/hash-stream-node@4.2.14': + dependencies: + '@smithy/types': 4.14.1 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@smithy/invalid-dependency@4.2.14': dependencies: '@smithy/types': 4.14.1 @@ -8609,6 +11659,12 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/md5-js@4.2.14': + dependencies: + '@smithy/types': 4.14.1 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@smithy/middleware-content-length@4.2.14': dependencies: '@smithy/protocol-http': 5.3.14 @@ -8639,6 +11695,19 @@ snapshots: '@smithy/uuid': 1.1.2 tslib: 2.8.1 + '@smithy/middleware-retry@4.5.7': + dependencies: + '@smithy/core': 3.23.17 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/service-error-classification': 4.3.1 + '@smithy/smithy-client': 4.12.13 + '@smithy/types': 4.14.1 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.8 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 + '@smithy/middleware-serde@4.2.20': dependencies: '@smithy/core': 3.23.17 @@ -8792,6 +11861,12 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/util-retry@4.3.8': + dependencies: + '@smithy/service-error-classification': 4.3.1 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@smithy/util-stream@4.5.25': dependencies: '@smithy/fetch-http-handler': 5.3.17 @@ -8817,32 +11892,98 @@ snapshots: '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 + '@smithy/util-waiter@4.3.0': + dependencies: + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@smithy/uuid@1.1.2': dependencies: tslib: 2.8.1 - '@soimy/dingtalk@3.5.3(openclaw@2026.4.26)': + '@snazzah/davey-android-arm-eabi@0.1.11': + optional: true + + '@snazzah/davey-android-arm64@0.1.11': + optional: true + + '@snazzah/davey-darwin-arm64@0.1.11': + optional: true + + '@snazzah/davey-darwin-x64@0.1.11': + optional: true + + '@snazzah/davey-freebsd-x64@0.1.11': + optional: true + + '@snazzah/davey-linux-arm-gnueabihf@0.1.11': + optional: true + + '@snazzah/davey-linux-arm64-gnu@0.1.11': + optional: true + + '@snazzah/davey-linux-arm64-musl@0.1.11': + optional: true + + '@snazzah/davey-linux-x64-gnu@0.1.11': + optional: true + + '@snazzah/davey-linux-x64-musl@0.1.11': + optional: true + + '@snazzah/davey-wasm32-wasi@0.1.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1)': dependencies: - axios: 1.13.6(debug@4.4.3) - dingtalk-stream: 2.1.5 - form-data: 4.0.5 - mammoth: 1.12.0 - pdf-parse: 2.4.5 - zod: 4.3.6 - optionalDependencies: - openclaw: 2026.4.26 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1) transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@snazzah/davey-win32-arm64-msvc@0.1.11': + optional: true + + '@snazzah/davey-win32-ia32-msvc@0.1.11': + optional: true + + '@snazzah/davey-win32-x64-msvc@0.1.11': + optional: true + + '@snazzah/davey@0.1.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1)': + optionalDependencies: + '@snazzah/davey-android-arm-eabi': 0.1.11 + '@snazzah/davey-android-arm64': 0.1.11 + '@snazzah/davey-darwin-arm64': 0.1.11 + '@snazzah/davey-darwin-x64': 0.1.11 + '@snazzah/davey-freebsd-x64': 0.1.11 + '@snazzah/davey-linux-arm-gnueabihf': 0.1.11 + '@snazzah/davey-linux-arm64-gnu': 0.1.11 + '@snazzah/davey-linux-arm64-musl': 0.1.11 + '@snazzah/davey-linux-x64-gnu': 0.1.11 + '@snazzah/davey-linux-x64-musl': 0.1.11 + '@snazzah/davey-wasm32-wasi': 0.1.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.9.1) + '@snazzah/davey-win32-arm64-msvc': 0.1.11 + '@snazzah/davey-win32-ia32-msvc': 0.1.11 + '@snazzah/davey-win32-x64-msvc': 0.1.11 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' '@standard-schema/spec@1.1.0': {} + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 + '@telegraf/types@7.1.0': {} + + '@tencent-connect/qqbot-connector@1.1.0': + dependencies: + qrcode-terminal: 0.12.0 + '@tencent-weixin/openclaw-weixin@2.1.10': dependencies: qrcode-terminal: 0.12.0 @@ -8878,6 +12019,25 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@tloncorp/tlon-skill-darwin-arm64@0.3.5': + optional: true + + '@tloncorp/tlon-skill-darwin-x64@0.3.5': + optional: true + + '@tloncorp/tlon-skill-linux-arm64@0.3.5': + optional: true + + '@tloncorp/tlon-skill-linux-x64@0.3.5': + optional: true + + '@tloncorp/tlon-skill@0.3.5': + optionalDependencies: + '@tloncorp/tlon-skill-darwin-arm64': 0.3.5 + '@tloncorp/tlon-skill-darwin-x64': 0.3.5 + '@tloncorp/tlon-skill-linux-arm64': 0.3.5 + '@tloncorp/tlon-skill-linux-x64': 0.3.5 + '@tokenizer/inflate@0.4.1': dependencies: debug: 4.4.3 @@ -8889,6 +12049,62 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} + '@twurple/api-call@8.1.3': + dependencies: + '@d-fischer/shared-utils': 3.6.4 + '@twurple/common': 8.1.3 + tslib: 2.8.1 + + '@twurple/api@8.1.3(@twurple/auth@8.1.3)': + dependencies: + '@d-fischer/cache-decorators': 4.0.1 + '@d-fischer/detect-node': 3.0.1 + '@d-fischer/logger': 4.2.4 + '@d-fischer/rate-limiter': 1.1.0 + '@d-fischer/shared-utils': 3.6.4 + '@d-fischer/typed-event-emitter': 3.3.3 + '@twurple/api-call': 8.1.3 + '@twurple/auth': 8.1.3 + '@twurple/common': 8.1.3 + retry: 0.13.1 + tslib: 2.8.1 + + '@twurple/auth@8.1.3': + dependencies: + '@d-fischer/logger': 4.2.4 + '@d-fischer/shared-utils': 3.6.4 + '@d-fischer/typed-event-emitter': 3.3.3 + '@twurple/api-call': 8.1.3 + '@twurple/common': 8.1.3 + tslib: 2.8.1 + + '@twurple/chat@8.1.3(@twurple/auth@8.1.3)': + dependencies: + '@d-fischer/cache-decorators': 4.0.1 + '@d-fischer/deprecate': 2.0.2 + '@d-fischer/logger': 4.2.4 + '@d-fischer/rate-limiter': 1.1.0 + '@d-fischer/shared-utils': 3.6.4 + '@d-fischer/typed-event-emitter': 3.3.3 + '@twurple/auth': 8.1.3 + '@twurple/common': 8.1.3 + ircv3: 0.33.1 + tslib: 2.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@twurple/common@8.1.3': + dependencies: + '@d-fischer/shared-utils': 3.6.4 + klona: 2.0.6 + tslib: 2.8.1 + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -8912,6 +12128,11 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 25.6.0 + '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.2.0 @@ -8924,6 +12145,14 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/command-line-args@5.2.3': {} + + '@types/command-line-usage@5.0.4': {} + + '@types/connect@3.4.38': + dependencies: + '@types/node': 25.6.0 + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 @@ -8938,6 +12167,21 @@ snapshots: '@types/estree@1.0.8': {} + '@types/events@3.0.3': {} + + '@types/express-serve-static-core@5.1.1': + dependencies: + '@types/node': 25.6.0 + '@types/qs': 6.15.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.1 + '@types/serve-static': 2.2.0 + '@types/fs-extra@9.0.13': dependencies: '@types/node': 25.6.0 @@ -8948,8 +12192,15 @@ snapshots: '@types/http-cache-semantics@4.2.0': {} + '@types/http-errors@2.0.5': {} + '@types/json-schema@7.0.15': {} + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 25.6.0 + '@types/katex@0.16.8': {} '@types/keyv@3.1.4': @@ -8968,8 +12219,11 @@ snapshots: '@types/node@10.17.60': {} - '@types/node@16.9.1': - optional: true + '@types/node@16.9.1': {} + + '@types/node@20.19.39': + dependencies: + undici-types: 6.21.0 '@types/node@24.12.0': dependencies: @@ -8985,10 +12239,14 @@ snapshots: '@types/plist@3.0.5': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 xmlbuilder: 15.1.1 optional: true + '@types/qs@6.15.0': {} + + '@types/range-parser@1.2.7': {} + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: '@types/react': 19.2.14 @@ -9003,6 +12261,15 @@ snapshots: '@types/retry@0.12.0': {} + '@types/send@1.2.1': + dependencies: + '@types/node': 25.6.0 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 25.6.0 + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -9016,18 +12283,18 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 optional: true - '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3))(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.57.2 - '@typescript-eslint/type-utils': 8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.57.2 - eslint: 10.1.0(jiti@1.21.7) + eslint: 10.1.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -9035,14 +12302,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.57.2 '@typescript-eslint/types': 8.57.2 '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3 - eslint: 10.1.0(jiti@1.21.7) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -9065,13 +12332,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.57.2 '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 10.1.0(jiti@1.21.7) + eslint: 10.1.0(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -9094,13 +12361,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.57.2 '@typescript-eslint/types': 8.57.2 '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) - eslint: 10.1.0(jiti@1.21.7) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -9110,13 +12377,19 @@ snapshots: '@typescript-eslint/types': 8.57.2 eslint-visitor-keys: 5.0.1 + '@typespec/ts-http-runtime@0.3.5': + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@ungap/structured-clone@1.3.0': {} - '@vincentkoc/qrcode-tui@0.2.1': - dependencies: - qrcode: 1.5.4 + '@urbit/aura@3.0.0': {} - '@vitejs/plugin-react@5.2.0(vite@7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3))': + '@vitejs/plugin-react@5.2.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -9124,7 +12397,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color @@ -9137,13 +12410,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.1(vite@7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3))': + '@vitest/mocker@4.1.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.1 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) '@vitest/pretty-format@4.1.1': dependencies: @@ -9169,28 +12442,10 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@wecom/aibot-node-sdk@1.0.6': + '@wasm-audio-decoders/common@9.0.7': dependencies: - axios: 1.13.6(debug@4.4.3) - eventemitter3: 5.0.4 - ws: 8.20.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - - '@wecom/wecom-openclaw-plugin@2026.4.27': - dependencies: - '@wecom/aibot-node-sdk': 1.0.6 - fast-xml-parser: 5.5.10 - file-type: 21.3.4 - undici: 7.24.6 - zod: 4.3.6 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate + '@eshaz/web-worker': 1.2.2 + simple-yenc: 1.0.4 '@whiskeysockets/baileys@7.0.0-rc.9(jimp@1.6.1)(sharp@0.34.5)': dependencies: @@ -9219,26 +12474,73 @@ snapshots: '@xmldom/xmldom@0.8.11': {} + '@zed-industries/codex-acp-darwin-arm64@0.12.0': + optional: true + + '@zed-industries/codex-acp-darwin-x64@0.12.0': + optional: true + + '@zed-industries/codex-acp-linux-arm64@0.12.0': + optional: true + + '@zed-industries/codex-acp-linux-x64@0.12.0': + optional: true + + '@zed-industries/codex-acp-win32-arm64@0.12.0': + optional: true + + '@zed-industries/codex-acp-win32-x64@0.12.0': + optional: true + + '@zed-industries/codex-acp@0.12.0': + optionalDependencies: + '@zed-industries/codex-acp-darwin-arm64': 0.12.0 + '@zed-industries/codex-acp-darwin-x64': 0.12.0 + '@zed-industries/codex-acp-linux-arm64': 0.12.0 + '@zed-industries/codex-acp-linux-x64': 0.12.0 + '@zed-industries/codex-acp-win32-arm64': 0.12.0 + '@zed-industries/codex-acp-win32-x64': 0.12.0 + abbrev@3.0.1: {} + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + accepts@2.0.0: dependencies: mime-types: 3.0.2 negotiator: 1.0.0 + acorn-import-attributes@1.9.5(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 acorn@8.16.0: {} + acpx@0.6.1: + dependencies: + '@agentclientprotocol/sdk': 0.20.0(zod@4.3.6) + commander: 14.0.3 + skillflag: 0.1.4 + tsx: 4.21.0 + zod: 4.3.6 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + agent-base@7.1.4: {} agent-base@9.0.0: {} - ajv-formats@3.0.1(ajv@8.18.0): + ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: - ajv: 8.18.0 + ajv: 8.20.0 ajv-keywords@3.5.2(ajv@6.14.0): dependencies: @@ -9251,13 +12553,15 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.18.0: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + another-json@0.2.0: {} + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -9270,8 +12574,7 @@ snapshots: ansi-styles@6.2.3: {} - any-base@1.1.0: - optional: true + any-base@1.1.0: {} any-promise@1.3.0: {} @@ -9280,6 +12583,18 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 + apache-arrow@18.1.0: + dependencies: + '@swc/helpers': 0.5.21 + '@types/command-line-args': 5.2.3 + '@types/command-line-usage': 5.0.4 + '@types/node': 20.19.39 + command-line-args: 5.2.1 + command-line-usage: 7.0.4 + flatbuffers: 24.12.23 + json-bignum: 0.0.3 + tslib: 2.8.1 + app-builder-bin@5.0.0-alpha.12: {} app-builder-lib@26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1): @@ -9353,6 +12668,10 @@ snapshots: '@ark/util': 0.56.0 arkregex: 0.0.5 + array-back@3.1.0: {} + + array-back@6.2.3: {} + asn1.js@5.4.1: dependencies: bn.js: 4.12.3 @@ -9400,23 +12719,66 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 - await-to-js@3.0.0: - optional: true + await-to-js@3.0.0: {} - axios@1.13.6(debug@4.4.3): + axios@1.13.6: dependencies: - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.15.11 form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug + axios@1.16.0: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + + b4a@1.8.1: {} + bail@2.0.2: {} balanced-match@1.0.2: {} balanced-match@4.0.4: {} + bare-events@2.8.2: {} + + bare-fs@4.7.1: + dependencies: + bare-events: 2.8.2 + bare-path: 3.0.0 + bare-stream: 2.13.1(bare-events@2.8.2) + bare-url: 2.4.3 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-os@3.9.1: {} + + bare-path@3.0.0: + dependencies: + bare-os: 3.9.1 + + bare-stream@2.13.1(bare-events@2.8.2): + dependencies: + streamx: 2.25.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.3: + dependencies: + bare-path: 3.0.0 + + base-x@5.0.1: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.10.10: {} @@ -9439,8 +12801,7 @@ snapshots: bluebird@3.4.7: {} - bmp-ts@1.0.9: - optional: true + bmp-ts@1.0.9: {} bn.js@4.12.3: {} @@ -9458,9 +12819,13 @@ snapshots: transitivePeerDependencies: - supports-color + boolbase@1.0.0: {} + boolean@3.2.0: optional: true + bottleneck@2.19.5: {} + bowser@2.14.1: {} brace-expansion@1.1.12: @@ -9488,10 +12853,23 @@ snapshots: node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + buffer-crc32@0.2.13: {} buffer-equal-constant-time@1.0.1: {} + buffer-fill@1.0.0: {} + buffer-from@1.1.2: {} buffer@5.7.1: @@ -9527,6 +12905,10 @@ snapshots: transitivePeerDependencies: - supports-color + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + bytes@3.1.2: {} cacache@19.0.1: @@ -9584,6 +12966,10 @@ snapshots: chai@6.2.2: {} + chalk-template@0.4.0: + dependencies: + chalk: 4.1.2 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -9615,8 +13001,6 @@ snapshots: dependencies: readdirp: 5.0.0 - chownr@2.0.0: {} - chownr@3.0.0: {} chromium-pickle-js@0.2.0: {} @@ -9625,6 +13009,8 @@ snapshots: ci-info@4.4.0: {} + cjs-module-lexer@2.2.0: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -9708,6 +13094,20 @@ snapshots: comma-separated-tokens@2.0.3: {} + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@7.0.4: + dependencies: + array-back: 6.2.3 + chalk-template: 0.4.0 + table-layout: 4.1.1 + typical: 7.3.0 + commander@14.0.3: {} commander@4.1.1: {} @@ -9725,8 +13125,8 @@ snapshots: conf@15.1.0: dependencies: - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) atomically: 2.1.1 debounce-fn: 6.0.0 dot-prop: 10.1.0 @@ -9773,15 +13173,29 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-js@4.2.0: {} + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + css-tree@3.2.1: dependencies: mdn-data: 2.27.1 source-map-js: 1.2.1 + css-what@6.2.2: {} + css.escape@1.5.1: {} cssesc@3.0.0: {} + cssom@0.5.0: {} + cssstyle@6.2.0: dependencies: '@asamuzakjp/css-color': 5.0.1 @@ -9828,6 +13242,13 @@ snapshots: deep-is@0.1.4: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -9839,14 +13260,14 @@ snapshots: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 - optional: true + + define-lazy-prop@3.0.0: {} define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - optional: true degenerator@5.0.1: dependencies: @@ -9880,27 +13301,21 @@ snapshots: didyoumean@1.2.2: {} + diff@8.0.3: {} + diff@8.0.4: {} dijkstrajs@1.0.3: {} dingbat-to-unicode@1.0.1: {} - dingtalk-stream@2.1.5: - dependencies: - axios: 1.13.6(debug@4.4.3) - debug: 4.4.3 - ws: 8.20.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dir-compare@4.2.0: dependencies: minimatch: 3.1.5 p-limit: 3.1.0 + discord-api-types@0.38.47: {} + dlv@1.1.3: {} dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1): @@ -9932,6 +13347,24 @@ snapshots: dom-accessibility-api@0.6.3: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-prop@10.1.0: dependencies: type-fest: 5.5.0 @@ -10063,6 +13496,8 @@ snapshots: entities@6.0.1: {} + entities@7.0.1: {} + env-paths@2.2.1: {} env-paths@3.0.0: {} @@ -10134,20 +13569,20 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-plugin-react-hooks@7.0.1(eslint@10.1.0(jiti@1.21.7)): + eslint-plugin-react-hooks@7.0.1(eslint@10.1.0(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 - eslint: 10.1.0(jiti@1.21.7) + eslint: 10.1.0(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.5.2(eslint@10.1.0(jiti@1.21.7)): + eslint-plugin-react-refresh@0.5.2(eslint@10.1.0(jiti@2.6.1)): dependencies: - eslint: 10.1.0(jiti@1.21.7) + eslint: 10.1.0(jiti@2.6.1) eslint-scope@9.1.2: dependencies: @@ -10160,9 +13595,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.1.0(jiti@1.21.7): + eslint@10.1.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.3 '@eslint/config-helpers': 0.5.3 @@ -10193,7 +13628,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.7 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -10225,16 +13660,27 @@ snapshots: etag@1.8.1: {} + event-target-shim@5.0.1: {} + + eventemitter3@4.0.7: {} + eventemitter3@5.0.4: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + + events@3.3.0: {} + eventsource-parser@3.0.6: {} eventsource@3.0.7: dependencies: eventsource-parser: 3.0.6 - exif-parser@0.1.12: - optional: true + exif-parser@0.1.12: {} expect-type@1.3.0: {} @@ -10293,8 +13739,12 @@ snapshots: extsprintf@1.4.1: optional: true + fake-indexeddb@6.2.5: {} + fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10319,20 +13769,10 @@ snapshots: dependencies: fast-string-width: 1.1.0 - fast-xml-builder@1.1.4: - dependencies: - path-expression-matcher: 1.2.1 - fast-xml-builder@1.1.5: dependencies: path-expression-matcher: 1.5.0 - fast-xml-parser@5.5.10: - dependencies: - fast-xml-builder: 1.1.4 - path-expression-matcher: 1.2.1 - strnum: 2.2.2 - fast-xml-parser@5.7.2: dependencies: '@nodable/entities': 2.1.0 @@ -10400,6 +13840,10 @@ snapshots: transitivePeerDependencies: - supports-color + find-replace@3.0.0: + dependencies: + array-back: 3.1.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -10415,11 +13859,13 @@ snapshots: flatted: 3.4.2 keyv: 4.5.4 + flatbuffers@24.12.23: {} + flatted@3.4.2: {} - follow-redirects@1.15.11(debug@4.4.3): - optionalDependencies: - debug: 4.4.3 + follow-redirects@1.15.11: {} + + follow-redirects@1.16.0: {} foreground-child@3.3.1: dependencies: @@ -10484,10 +13930,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs-minipass@3.0.3: dependencies: minipass: 7.1.3 @@ -10502,6 +13944,17 @@ snapshots: function-bind@1.1.2: {} + gaxios@6.7.1(encoding@0.1.13): + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0(encoding@0.1.13) + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + gaxios@7.1.4: dependencies: extend: 3.0.2 @@ -10510,6 +13963,15 @@ snapshots: transitivePeerDependencies: - supports-color + gcp-metadata@6.1.1(encoding@0.1.13): + dependencies: + gaxios: 6.7.1(encoding@0.1.13) + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + gcp-metadata@8.1.2: dependencies: gaxios: 7.1.4 @@ -10548,6 +14010,10 @@ snapshots: dependencies: pump: 3.0.4 + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: dependencies: basic-ftp: 5.2.0 @@ -10568,7 +14034,6 @@ snapshots: dependencies: image-q: 4.0.0 omggif: 1.0.10 - optional: true glob-parent@5.1.2: dependencies: @@ -10612,13 +14077,19 @@ snapshots: serialize-error: 7.0.1 optional: true + global-agent@4.1.3: + dependencies: + globalthis: 1.0.4 + matcher: 4.0.0 + semver: 7.7.4 + serialize-error: 8.1.0 + globals@17.4.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 - optional: true google-auth-library@10.6.2: dependencies: @@ -10631,6 +14102,20 @@ snapshots: transitivePeerDependencies: - supports-color + google-auth-library@9.15.1(encoding@0.1.13): + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.1(encoding@0.1.13) + gcp-metadata: 6.1.1(encoding@0.1.13) + gtoken: 7.1.0(encoding@0.1.13) + jws: 4.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + google-logging-utils@0.0.2: {} + google-logging-utils@1.1.3: {} gopd@1.2.0: {} @@ -10651,12 +14136,29 @@ snapshots: graceful-fs@4.2.11: {} + grammy@1.42.0(encoding@0.1.13): + dependencies: + '@grammyjs/types': 3.26.0 + abort-controller: 3.0.0 + debug: 4.4.3 + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + gtoken@7.1.0(encoding@0.1.13): + dependencies: + gaxios: 6.7.1(encoding@0.1.13) + jws: 4.0.1 + transitivePeerDependencies: + - encoding + - supports-color + has-flag@4.0.0: {} has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 - optional: true has-symbols@1.1.0: {} @@ -10713,6 +14215,20 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.6: dependencies: '@types/estree': 1.0.8 @@ -10780,12 +14296,23 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + html-escaper@3.0.3: {} + html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 html-url-attributes@3.0.1: {} + html-void-elements@3.0.0: {} + + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + http-cache-semantics@4.2.0: {} http-errors@2.0.1: @@ -10853,12 +14380,16 @@ snapshots: image-q@4.0.0: dependencies: '@types/node': 16.9.1 - optional: true - - image-size@2.0.2: {} immediate@3.0.6: {} + import-in-the-middle@3.0.1: + dependencies: + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) + cjs-module-lexer: 2.2.0 + module-details-from-path: 1.0.4 + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -10878,6 +14409,19 @@ snapshots: ipaddr.js@2.3.0: {} + ircv3@0.33.1: + dependencies: + '@d-fischer/connection': 10.0.1 + '@d-fischer/escape-string-regexp': 5.0.0 + '@d-fischer/logger': 4.2.4 + '@d-fischer/shared-utils': 3.6.4 + '@d-fischer/typed-event-emitter': 3.3.3 + klona: 2.0.6 + tslib: 2.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -10895,6 +14439,10 @@ snapshots: is-decimal@2.0.1: {} + is-docker@3.0.0: {} + + is-electron@2.2.2: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -10905,6 +14453,10 @@ snapshots: is-hexadecimal@2.0.1: {} + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-interactive@1.0.0: {} is-interactive@2.0.0: {} @@ -10919,10 +14471,16 @@ snapshots: is-promise@4.0.0: {} + is-stream@2.0.1: {} + is-unicode-supported@0.1.0: {} is-unicode-supported@2.1.0: {} + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + isarray@1.0.0: {} isbinaryfile@5.0.7: {} @@ -10974,16 +14532,16 @@ snapshots: '@jimp/utils': 1.6.1 transitivePeerDependencies: - supports-color - optional: true jiti@1.21.7: {} jiti@2.6.1: {} + jose@4.15.9: {} + jose@6.2.2: {} - jpeg-js@0.4.4: - optional: true + jpeg-js@0.4.4: {} js-tokens@4.0.0: {} @@ -11024,6 +14582,8 @@ snapshots: dependencies: bignumber.js: 9.3.1 + json-bignum@0.0.3: {} + json-buffer@3.0.1: {} json-schema-to-ts@3.1.1: @@ -11054,6 +14614,19 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.4 + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -11067,11 +14640,33 @@ snapshots: ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 + jwks-rsa@3.2.2: + dependencies: + '@types/jsonwebtoken': 9.0.10 + debug: 4.4.3 + jose: 4.15.9 + limiter: 1.1.5 + lru-memoizer: 2.3.0 + transitivePeerDependencies: + - supports-color + + jwks-rsa@4.0.1: + dependencies: + '@types/jsonwebtoken': 9.0.10 + debug: 4.4.3 + jose: 6.2.2 + limiter: 1.1.5 + lru-memoizer: 3.0.0 + transitivePeerDependencies: + - supports-color + jws@4.0.1: dependencies: jwa: 2.0.1 safe-buffer: 5.2.1 + jwt-decode@4.0.0: {} + katex@0.16.45: dependencies: commander: 8.3.0 @@ -11084,6 +14679,8 @@ snapshots: dependencies: '@keyv/serialize': 1.1.1 + klona@2.0.6: {} + koffi@2.15.2: optional: true @@ -11100,8 +14697,18 @@ snapshots: lilconfig@3.1.3: {} + limiter@1.1.5: {} + lines-and-columns@1.2.4: {} + linkedom@0.18.12: + dependencies: + css-select: 5.2.2 + cssom: 0.5.0 + html-escaper: 3.0.3 + htmlparser2: 10.1.0 + uhyphen: 0.2.0 + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 @@ -11114,14 +14721,32 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + lodash.escaperegexp@4.1.2: {} lodash.identity@3.0.0: {} + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + lodash.isequal@4.5.0: {} + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.merge@4.6.2: {} + lodash.once@4.1.1: {} + lodash.pickby@4.6.0: {} lodash@4.17.23: {} @@ -11136,6 +14761,8 @@ snapshots: is-unicode-supported: 2.1.0 yoctocolors: 2.1.2 + loglevel@1.9.2: {} + long@4.0.0: {} long@5.3.2: {} @@ -11164,6 +14791,18 @@ snapshots: lru-cache@7.18.3: {} + lru-memoizer@2.3.0: + dependencies: + lodash.clonedeep: 4.5.0 + lru-cache: 6.0.0 + + lru-memoizer@3.0.0: + dependencies: + lodash.clonedeep: 4.5.0 + lru-cache: 11.2.7 + + lru_map@0.4.1: {} + lucide-react@0.563.0(react@19.2.4): dependencies: react: 19.2.4 @@ -11221,8 +14860,36 @@ snapshots: escape-string-regexp: 4.0.0 optional: true + matcher@4.0.0: + dependencies: + escape-string-regexp: 4.0.0 + math-intrinsics@1.1.0: {} + matrix-events-sdk@0.0.1: {} + + matrix-js-sdk@41.4.0-rc.0: + dependencies: + '@babel/runtime': 7.29.2 + '@matrix-org/matrix-sdk-crypto-wasm': 18.2.0 + another-json: 0.2.0 + bs58: 6.0.0 + content-type: 1.0.5 + jwt-decode: 4.0.0 + loglevel: 1.9.2 + matrix-events-sdk: 0.0.1 + matrix-widget-api: 1.17.0 + oidc-client-ts: 3.5.0 + p-retry: 8.0.0 + sdp-transform: 3.0.0 + unhomoglyph: 1.0.6 + uuid: 13.0.2 + + matrix-widget-api@1.17.0: + dependencies: + '@types/events': 3.0.3 + events: 3.3.0 + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -11618,8 +15285,7 @@ snapshots: mime@2.6.0: {} - mime@3.0.0: - optional: true + mime@3.0.0: {} mime@4.1.0: {} @@ -11681,15 +15347,8 @@ snapshots: dependencies: yallist: 4.0.0 - minipass@5.0.0: {} - minipass@7.1.3: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - minizlib@3.1.0: dependencies: minipass: 7.1.3 @@ -11698,7 +15357,7 @@ snapshots: dependencies: minimist: 1.2.8 - mkdirp@1.0.4: {} + module-details-from-path@1.0.4: {} motion-dom@12.38.0: dependencies: @@ -11706,6 +15365,12 @@ snapshots: motion-utils@12.36.0: {} + mpg123-decoder@1.0.3: + dependencies: + '@wasm-audio-decoders/common': 9.0.7 + + mri@1.2.0: {} + ms@2.1.3: {} music-metadata@11.12.3: @@ -11750,6 +15415,24 @@ snapshots: node-domexception@1.0.0: {} + node-downloader-helper@2.1.11: {} + + node-edge-tts@1.2.10: + dependencies: + https-proxy-agent: 7.0.6 + ws: 8.20.0 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 @@ -11783,19 +15466,39 @@ snapshots: normalize-url@6.1.0: {} + nostr-tools@2.23.3(typescript@5.9.3): + dependencies: + '@noble/ciphers': 2.1.1 + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + '@scure/bip32': 2.0.1 + '@scure/bip39': 2.0.1 + nostr-wasm: 0.1.0 + optionalDependencies: + typescript: 5.9.3 + + nostr-wasm@0.1.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + object-assign@4.1.1: {} object-hash@3.0.0: {} object-inspect@1.13.4: {} - object-keys@1.1.1: - optional: true + object-keys@1.1.1: {} obug@2.1.1: {} - omggif@1.0.10: - optional: true + oidc-client-ts@3.5.0: + dependencies: + jwt-decode: 4.0.0 + + omggif@1.0.10: {} on-exit-leak-free@2.1.2: {} @@ -11815,6 +15518,21 @@ snapshots: dependencies: mimic-function: 5.0.1 + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + openai@6.26.0(ws@8.20.0)(zod@4.3.6): optionalDependencies: ws: 8.20.0 @@ -11825,24 +15543,24 @@ snapshots: ws: 8.20.0 zod: 4.3.6 - openclaw@2026.4.26: + openclaw@2026.4.29: dependencies: - '@agentclientprotocol/sdk': 0.20.0(zod@4.3.6) + '@agentclientprotocol/sdk': 0.21.0(zod@4.3.6) '@clack/prompts': 1.2.0 '@lydell/node-pty': 1.2.0-beta.12 - '@mariozechner/pi-agent-core': 0.70.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-ai': 0.70.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-coding-agent': 0.70.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-tui': 0.70.2 + '@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) - '@vincentkoc/qrcode-tui': 0.2.1 - ajv: 8.18.0 + ajv: 8.20.0 chalk: 5.6.2 chokidar: 5.0.0 commander: 14.0.3 croner: 10.0.1 dotenv: 17.4.2 file-type: 22.0.1 + global-agent: 4.1.3 https-proxy-agent: 7.0.6 ipaddr.js: 2.3.0 jiti: 2.6.1 @@ -11850,13 +15568,13 @@ snapshots: jszip: 3.10.1 markdown-it: 14.1.1 openai: 6.34.0(ws@8.20.0)(zod@4.3.6) - osc-progress: 0.3.0 proxy-agent: 8.0.1 + qrcode: 1.5.4 semver: 7.7.4 sqlite-vec: 0.1.9 tar: 7.5.13 tslog: 4.10.2 - typebox: 1.1.33 + typebox: 1.1.34 undici: 8.1.0 web-push: 3.6.7 ws: 8.20.0 @@ -11869,6 +15587,14 @@ snapshots: - supports-color - utf-8-validate + openshell@0.1.0(encoding@0.1.13): + dependencies: + dotenv: 16.6.1 + telegraf: 4.16.3(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + option@0.2.4: {} optionator@0.9.4: @@ -11880,6 +15606,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + opusscript@0.1.1: {} + ora@5.4.1: dependencies: bl: 4.1.0 @@ -11903,10 +15631,10 @@ snapshots: stdin-discarder: 0.3.1 string-width: 8.2.0 - osc-progress@0.3.0: {} - p-cancelable@2.1.1: {} + p-finally@1.0.0: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -11925,6 +15653,11 @@ snapshots: p-map@7.0.4: {} + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + p-queue@9.1.0: dependencies: eventemitter3: 5.0.4 @@ -11939,6 +15672,16 @@ snapshots: dependencies: is-network-error: 1.3.1 + p-retry@8.0.0: + dependencies: + is-network-error: 1.3.1 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-timeout@4.1.0: {} + p-timeout@7.0.1: {} p-try@2.2.0: {} @@ -11984,17 +15727,16 @@ snapshots: pako@1.0.11: {} - parse-bmfont-ascii@1.0.6: - optional: true + pako@2.1.0: {} - parse-bmfont-binary@1.0.6: - optional: true + parse-bmfont-ascii@1.0.6: {} + + parse-bmfont-binary@1.0.6: {} 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: @@ -12028,8 +15770,6 @@ snapshots: path-exists@4.0.0: {} - path-expression-matcher@1.2.1: {} - path-expression-matcher@1.5.0: {} path-is-absolute@1.0.1: {} @@ -12052,14 +15792,9 @@ snapshots: pathe@2.0.3: {} - pdf-parse@2.4.5: - dependencies: - '@napi-rs/canvas': 0.1.80 - pdfjs-dist: 5.4.296 - - pdfjs-dist@5.4.296: + pdfjs-dist@5.7.284: optionalDependencies: - '@napi-rs/canvas': 0.1.97 + '@napi-rs/canvas': 0.1.100 pe-library@0.4.1: {} @@ -12098,12 +15833,13 @@ snapshots: pixelmatch@5.3.0: dependencies: pngjs: 6.0.0 - optional: true pkce-challenge@5.0.1: {} playwright-core@1.59.0: {} + playwright-core@1.59.1: {} + playwright@1.59.0: dependencies: playwright-core: 1.59.0 @@ -12120,11 +15856,9 @@ snapshots: pngjs@5.0.0: {} - pngjs@6.0.0: - optional: true + pngjs@6.0.0: {} - pngjs@7.0.0: - optional: true + pngjs@7.0.0: {} postcss-import@15.1.0(postcss@8.5.8): dependencies: @@ -12138,12 +15872,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.8 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.8.3): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.3): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.8 + tsx: 4.21.0 yaml: 2.8.3 postcss-nested@6.2.0(postcss@8.5.8): @@ -12181,6 +15916,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + prism-media@1.3.5(opusscript@0.1.1): + optionalDependencies: + opusscript: 0.1.1 + proc-log@5.0.0: {} process-nextick-args@2.0.1: {} @@ -12233,6 +15972,11 @@ snapshots: '@types/node': 25.6.0 long: 5.3.2 + protobufjs@8.0.3: + dependencies: + '@types/node': 25.6.0 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -12430,6 +16174,18 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + reflect-metadata@0.2.2: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + rehype-katex@7.0.1: dependencies: '@types/hast': 3.0.4 @@ -12487,6 +16243,13 @@ snapshots: require-from-string@2.0.2: {} + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + require-main-filename@2.0.0: {} resedit@1.7.2: @@ -12495,6 +16258,8 @@ snapshots: resolve-alpn@1.2.1: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.11: dependencies: is-core-module: 2.16.1 @@ -12576,6 +16341,8 @@ snapshots: transitivePeerDependencies: - supports-color + run-applescript@7.1.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -12584,10 +16351,16 @@ snapshots: safe-buffer@5.2.1: {} + safe-compare@1.1.4: + dependencies: + buffer-alloc: 1.2.0 + safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} + sandwich-stream@2.0.2: {} + sanitize-filename@1.6.4: dependencies: truncate-utf8-bytes: 1.0.2 @@ -12600,6 +16373,8 @@ snapshots: scheduler@0.27.0: {} + sdp-transform@3.0.0: {} + semver-compare@1.0.0: optional: true @@ -12630,6 +16405,10 @@ snapshots: type-fest: 0.13.1 optional: true + serialize-error@8.1.0: + dependencies: + type-fest: 0.20.2 + serve-static@2.2.1: dependencies: encodeurl: 2.0.0 @@ -12684,6 +16463,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@3.23.0: + dependencies: + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -12718,15 +16508,27 @@ snapshots: signal-exit@4.1.0: {} + silk-wasm@3.7.1: {} + simple-update-notifier@2.0.0: dependencies: semver: 7.7.4 - simple-xml-to-json@1.2.7: - optional: true + simple-xml-to-json@1.2.7: {} + + simple-yenc@1.0.4: {} sisteransi@1.0.5: {} + skillflag@0.1.4: + dependencies: + '@clack/prompts': 1.2.0 + tar-stream: 3.2.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -12777,6 +16579,8 @@ snapshots: space-separated-tokens@2.0.2: {} + spark-md5@3.0.2: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -12823,6 +16627,15 @@ snapshots: stdin-discarder@0.3.1: {} + streamx@2.25.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -12865,8 +16678,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strnum@2.2.2: {} - strnum@2.2.3: {} strtok3@10.3.5: @@ -12911,15 +16722,20 @@ snapshots: symbol-tree@3.2.4: {} + table-layout@4.1.1: + dependencies: + array-back: 6.2.3 + wordwrapjs: 5.1.1 + tagged-tag@1.0.0: {} tailwind-merge@3.5.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.19(yaml@2.8.3)): + tailwindcss-animate@1.0.7(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.3)): dependencies: - tailwindcss: 3.4.19(yaml@2.8.3) + tailwindcss: 3.4.19(tsx@4.21.0)(yaml@2.8.3) - tailwindcss@3.4.19(yaml@2.8.3): + tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.3): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -12938,7 +16754,7 @@ snapshots: postcss: 8.5.8 postcss-import: 15.1.0(postcss@8.5.8) postcss-js: 4.1.0(postcss@8.5.8) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.8.3) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.3) postcss-nested: 6.2.0(postcss@8.5.8) postcss-selector-parser: 6.1.2 resolve: 1.22.11 @@ -12947,14 +16763,16 @@ snapshots: - tsx - yaml - tar@6.2.1: + tar-stream@3.2.0: dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 + b4a: 1.8.1 + bare-fs: 4.7.1 + fast-fifo: 1.3.2 + streamx: 2.25.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a tar@7.5.13: dependencies: @@ -12964,6 +16782,27 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 + teex@1.0.1: + dependencies: + streamx: 2.25.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + telegraf@4.16.3(encoding@0.1.13): + dependencies: + '@telegraf/types': 7.1.0 + abort-controller: 3.0.0 + debug: 4.4.3 + mri: 1.2.0 + node-fetch: 2.7.0(encoding@0.1.13) + p-timeout: 4.1.0 + safe-compare: 1.1.4 + sandwich-stream: 2.0.2 + transitivePeerDependencies: + - encoding + - supports-color + temp-file@3.4.0: dependencies: async-exit-hook: 2.0.1 @@ -12974,6 +16813,12 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.6.3 + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -12994,8 +16839,7 @@ snapshots: tinybench@2.9.0: {} - tinycolor2@1.6.0: - optional: true + tinycolor2@1.6.0: {} tinyexec@1.0.4: {} @@ -13006,8 +16850,14 @@ snapshots: tinyrainbow@3.1.0: {} + tldts-core@6.1.86: {} + tldts-core@7.0.27: {} + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + tldts@7.0.27: dependencies: tldts-core: 7.0.27 @@ -13030,10 +16880,18 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + tokenjuice@0.7.0: {} + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + tough-cookie@6.0.1: dependencies: tldts: 7.0.27 + tr46@0.0.3: {} + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -13058,6 +16916,15 @@ snapshots: tslog@4.10.2: {} + tsscmp@1.0.6: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.4 + get-tsconfig: 4.14.0 + optionalDependencies: + fsevents: 2.3.3 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -13065,6 +16932,8 @@ snapshots: type-fest@0.13.1: optional: true + type-fest@0.20.2: {} + type-fest@5.5.0: dependencies: tagged-tag: 1.0.0 @@ -13075,16 +16944,24 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - typebox@1.1.33: {} + typebox@1.1.34: {} typescript@5.9.3: {} + typical@4.0.0: {} + + typical@7.3.0: {} + uc.micro@2.1.0: {} + uhyphen@0.2.0: {} + uint8array-extras@1.5.0: {} underscore@1.13.8: {} + undici-types@6.21.0: {} + undici-types@7.16.0: {} undici-types@7.18.2: {} @@ -13095,6 +16972,8 @@ snapshots: undici@8.1.0: {} + unhomoglyph@1.0.6: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -13190,12 +17069,17 @@ snapshots: utif2@4.1.0: dependencies: pako: 1.0.11 - optional: true util-deprecate@1.0.2: {} + uuid@13.0.2: {} + uuid@14.0.0: {} + uuid@8.3.2: {} + + uuid@9.0.1: {} + vary@1.1.2: {} verror@1.10.1: @@ -13226,7 +17110,7 @@ snapshots: optionalDependencies: vite-plugin-electron-renderer: 0.14.6 - vite@7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3): + vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.27.4 fdir: 6.5.0(picomatch@4.0.4) @@ -13237,13 +17121,14 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.6.1 + tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.1(@types/node@25.5.0)(jsdom@28.1.0(@noble/hashes@2.0.1))(vite@7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3)): + vitest@4.1.1(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@28.1.0(@noble/hashes@2.0.1))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.1 - '@vitest/mocker': 4.1.1(vite@7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3)) + '@vitest/mocker': 4.1.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.1 '@vitest/runner': 4.1.1 '@vitest/snapshot': 4.1.1 @@ -13260,9 +17145,10 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@25.5.0)(jiti@1.21.7)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.1 '@types/node': 25.5.0 jsdom: 28.1.0(@noble/hashes@2.0.1) transitivePeerDependencies: @@ -13292,6 +17178,8 @@ snapshots: web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} + webidl-conversions@8.0.1: {} whatwg-mimetype@5.0.0: {} @@ -13304,6 +17192,11 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + when-exit@2.1.5: {} which-module@2.0.1: {} @@ -13325,6 +17218,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrapjs@5.1.1: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -13347,21 +17242,22 @@ snapshots: ws@8.20.0: {} + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + xml-name-validator@5.0.0: {} - xml-parse-from-string@1.0.1: - optional: true + xml-parse-from-string@1.0.1: {} xml2js@0.5.0: dependencies: sax: 1.6.0 xmlbuilder: 11.0.1 - optional: true xmlbuilder@10.1.1: {} - xmlbuilder@11.0.1: - optional: true + xmlbuilder@11.0.1: {} xmlbuilder@15.1.1: {} @@ -13431,6 +17327,20 @@ snapshots: yoctocolors@2.1.2: {} + zca-js@2.1.2: + dependencies: + crypto-js: 4.2.0 + form-data: 4.0.5 + json-bigint: 1.0.0 + pako: 2.1.0 + semver: 7.7.4 + spark-md5: 3.0.2 + tough-cookie: 5.1.2 + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + zod-to-json-schema@3.25.1(zod@4.3.6): dependencies: zod: 4.3.6 @@ -13439,8 +17349,7 @@ snapshots: dependencies: zod: 4.3.6 - zod@3.25.76: - optional: true + zod@3.25.76: {} zod@4.3.6: {} diff --git a/resources/skills/preinstalled-manifest.json b/resources/skills/preinstalled-manifest.json index 99e837c..8b40437 100644 --- a/resources/skills/preinstalled-manifest.json +++ b/resources/skills/preinstalled-manifest.json @@ -47,14 +47,6 @@ "ref": "master", "version": "main", "autoEnable": true - }, - { - "slug": "tavily-search", - "repo": "tavily-ai/skills", - "repoPath": "skills/tavily-search", - "ref": "main", - "version": "main", - "autoEnable": true } ] } diff --git a/scripts/after-pack.cjs b/scripts/after-pack.cjs index d6421de..8980105 100644 --- a/scripts/after-pack.cjs +++ b/scripts/after-pack.cjs @@ -199,6 +199,46 @@ function cleanupNativePlatformPackages(nodeModulesDir, platform, arch) { return removed; } +function removeOptionalNativeClipboard(nodeModulesDir) { + const scopeDir = join(nodeModulesDir, '@mariozechner'); + if (!existsSync(scopeDir)) return 0; + + let removed = 0; + for (const entry of readdirSync(scopeDir)) { + if (entry === 'clipboard' || entry.startsWith('clipboard-')) { + try { + rmSync(join(scopeDir, entry), { recursive: true, force: true }); + removed++; + } catch { /* */ } + } + } + return removed; +} + +function copyNianxxPlayNodeModules(resourcesDir, platform, arch) { + const src = join(__dirname, '..', 'build', 'apps', 'nianxx-play', 'node_modules'); + const nianxxPlayRoot = join(resourcesDir, 'resources', 'nianxx-play'); + const dest = join(nianxxPlayRoot, 'node_modules'); + + if (!existsSync(nianxxPlayRoot)) return; + if (!existsSync(src)) { + console.warn('[after-pack] ⚠️ build/apps/nianxx-play/node_modules not found. Run prepare:nianxx-play first.'); + return; + } + + const depCount = readdirSync(src, { withFileTypes: true }) + .filter(d => d.isDirectory() && d.name !== '.bin') + .length; + + console.log(`[after-pack] Copying ${depCount} NianxxPlay dependencies to ${dest} ...`); + rmSync(dest, { recursive: true, force: true }); + cpSync(src, dest, { recursive: true, dereference: true }); + cleanupUnnecessaryFiles(dest); + cleanupKoffi(dest, platform, arch); + cleanupNativePlatformPackages(dest, platform, arch); + console.log('[after-pack] ✅ NianxxPlay node_modules copied.'); +} + // ── Broken module patcher ───────────────────────────────────────────────────── // Some bundled packages have transpiled CJS that sets `module.exports = exports.default` // without ever assigning `exports.default`, leaving module.exports === undefined. @@ -371,13 +411,10 @@ function patchBrokenModules(nodeModulesDir) { } // ── Plugin ID mismatch patcher ─────────────────────────────────────────────── -// Some plugins (e.g. wecom) have a compiled JS entry that hardcodes a different -// ID than what openclaw.plugin.json declares. The Gateway rejects mismatches, -// so we fix them after copying. +// Some plugins have a compiled JS entry that hardcodes a different ID than what +// openclaw.plugin.json declares. Keep this hook for future bundled plugins. -const PLUGIN_ID_FIXES = { - 'wecom-openclaw-plugin': 'wecom', -}; +const PLUGIN_ID_FIXES = {}; function patchPluginIds(pluginDir, expectedId) { const { readFileSync, writeFileSync } = require('fs'); @@ -563,6 +600,15 @@ exports.default = async function afterPack(context) { cpSync(src, dest, { recursive: true }); console.log('[after-pack] ✅ openclaw node_modules copied.'); + const clipboardRemoved = removeOptionalNativeClipboard(dest); + if (clipboardRemoved > 0) { + console.log(`[after-pack] ✅ Removed optional native clipboard packages (${clipboardRemoved}) to avoid macOS Gatekeeper prompts.`); + } + + // 1.0 Copy bundled large-app runtime deps that electron-builder skips because + // node_modules/ is ignored globally. + copyNianxxPlayNodeModules(resourcesDir, platform, arch); + // Patch broken modules whose CJS transpiled output sets module.exports = undefined, // causing TypeError in Node.js 22+ ESM interop. patchBrokenModules(dest); @@ -573,9 +619,6 @@ exports.default = async function afterPack(context) { // directory doesn't exist (build/openclaw-plugins/ may not be pre-generated) // - node_modules/ is excluded by .gitignore so the deps copy must be manual const BUNDLED_PLUGINS = [ - { npmName: '@soimy/dingtalk', pluginId: 'dingtalk' }, - { npmName: '@wecom/wecom-openclaw-plugin', pluginId: 'wecom' }, - { npmName: '@larksuite/openclaw-lark', pluginId: 'feishu-openclaw-plugin' }, { npmName: '@tencent-weixin/openclaw-weixin', pluginId: 'openclaw-weixin' }, ]; diff --git a/scripts/bundle-openclaw-plugins.mjs b/scripts/bundle-openclaw-plugins.mjs index cd58e2d..5badbc5 100644 --- a/scripts/bundle-openclaw-plugins.mjs +++ b/scripts/bundle-openclaw-plugins.mjs @@ -5,8 +5,6 @@ * * Build a self-contained mirror of OpenClaw third-party plugins for packaging. * Current plugins: - * - @soimy/dingtalk -> build/openclaw-plugins/dingtalk - * - @wecom/wecom-openclaw-plugin -> build/openclaw-plugins/wecom * - @tencent-weixin/openclaw-weixin -> build/openclaw-plugins/openclaw-weixin * * The output plugin directory contains: @@ -37,9 +35,6 @@ function normWin(p) { } const PLUGINS = [ - { npmName: '@soimy/dingtalk', pluginId: 'dingtalk' }, - { npmName: '@wecom/wecom-openclaw-plugin', pluginId: 'wecom' }, - { npmName: '@larksuite/openclaw-lark', pluginId: 'feishu-openclaw-plugin' }, { npmName: '@tencent-weixin/openclaw-weixin', pluginId: 'openclaw-weixin' }, ]; @@ -183,8 +178,7 @@ function bundleOnePlugin({ npmName, pluginId }) { /** * Patch plugin entry JS files so the exported `id` matches openclaw.plugin.json. - * Some plugins (e.g. wecom) ship with a hardcoded ID in their compiled output - * that differs from the manifest, causing a Gateway "plugin id mismatch" error. + * Kept as a safety hook for future bundled plugins that may ship mismatched IDs. */ function patchPluginId(pluginDir, expectedId) { const manifestPath = path.join(pluginDir, 'openclaw.plugin.json'); @@ -206,9 +200,7 @@ function patchPluginId(pluginDir, expectedId) { // Known ID mismatches to patch. Keys are the wrong ID found in compiled JS, // values are the correct ID (must match openclaw.plugin.json). - const ID_FIXES = { - 'wecom-openclaw-plugin': 'wecom', - }; + const ID_FIXES = {}; for (const entry of entryFiles) { const entryPath = path.join(pluginDir, entry); @@ -219,7 +211,6 @@ function patchPluginId(pluginDir, expectedId) { for (const [wrongId, correctId] of Object.entries(ID_FIXES)) { if (correctId !== expectedId) continue; - // Replace id: "wecom-openclaw-plugin" or id: 'wecom-openclaw-plugin' const pattern = new RegExp(`(\\bid\\s*:\\s*)(["'])${wrongId.replace(/-/g, '\\-')}\\2`, 'g'); const replaced = content.replace(pattern, `$1$2${correctId}$2`); if (replaced !== content) { diff --git a/scripts/bundle-openclaw.mjs b/scripts/bundle-openclaw.mjs index 26a626c..b3ac8eb 100644 --- a/scripts/bundle-openclaw.mjs +++ b/scripts/bundle-openclaw.mjs @@ -21,6 +21,16 @@ import 'zx/globals'; const ROOT = path.resolve(__dirname, '..'); const OUTPUT = path.join(ROOT, 'build', 'openclaw'); const NODE_MODULES = path.join(ROOT, 'node_modules'); +const YINIAN_RUNTIME_PATCH_MARKER_FILE = '.yinian-runtime-patch.json'; +const YINIAN_RUNTIME_PATCH_MARKER = { + id: 'yinian-openclaw-runtime', + version: '2026-05-07-desktop-fast-chat-v1', + patches: [ + 'bundled-npm-runner-env', + 'optional-native-clipboard-removed', + 'desktop-fast-chat-lightweight-tools', + ], +}; // On Windows, pnpm virtual store paths can exceed MAX_PATH (260 chars). function normWin(p) { @@ -142,6 +152,12 @@ const SKIP_PACKAGES = new Set([ ]); const SKIP_SCOPES = ['@cloudflare/', '@types/']; let skippedDevCount = 0; +let skippedOptionalNativeCount = 0; + +function isOptionalNativeClipboardPackage(name) { + return name === '@mariozechner/clipboard' + || name.startsWith('@mariozechner/clipboard-'); +} while (queue.length > 0) { const { nodeModulesDir, skipPkg } = queue.shift(); @@ -151,6 +167,11 @@ while (queue.length > 0) { // Skip the package that owns this virtual store entry (it's the package itself, not a dep) if (name === skipPkg) continue; + if (isOptionalNativeClipboardPackage(name)) { + skippedOptionalNativeCount++; + continue; + } + if (SKIP_PACKAGES.has(name) || SKIP_SCOPES.some(s => name.startsWith(s))) { skippedDevCount++; continue; @@ -178,6 +199,9 @@ while (queue.length > 0) { echo` Found ${collected.size} total packages (direct + transitive)`; echo` Skipped ${skippedDevCount} dev-only package references`; +if (skippedOptionalNativeCount > 0) { + echo` Skipped ${skippedOptionalNativeCount} optional native clipboard package references`; +} // 4b. Collect extra packages required by ClawX's Electron main process that are // NOT deps of openclaw. These are resolved from openclaw's context at runtime @@ -186,8 +210,113 @@ echo` Skipped ${skippedDevCount} dev-only package references`; // // For each package we resolve it from the workspace's own node_modules, // then BFS its transitive deps exactly like we did for openclaw above. +const OPENCLAW_RUNTIME_DEPS_PACKAGES = [ + '@agentclientprotocol/claude-agent-acp', + '@agentclientprotocol/sdk', + '@anthropic-ai/sdk', + '@anthropic-ai/vertex-sdk', + '@aws-sdk/client-bedrock', + '@aws-sdk/client-bedrock-runtime', + '@aws-sdk/client-s3', + '@aws-sdk/credential-provider-node', + '@aws-sdk/s3-request-presigner', + '@aws/bedrock-token-generator', + '@azure/identity', + '@clack/prompts', + '@clawdbot/lobster', + '@discordjs/voice', + '@google/genai', + '@grammyjs/runner', + '@grammyjs/transformer-throttler', + '@homebridge/ciao', + '@lancedb/lancedb', + '@larksuiteoapi/node-sdk', + '@line/bot-sdk', + '@lydell/node-pty', + '@mariozechner/pi-agent-core', + '@mariozechner/pi-ai', + '@mariozechner/pi-coding-agent', + '@matrix-org/matrix-sdk-crypto-nodejs', + '@matrix-org/matrix-sdk-crypto-wasm', + '@microsoft/teams.api', + '@microsoft/teams.apps', + '@modelcontextprotocol/sdk', + '@mozilla/readability', + '@openai/codex', + '@opentelemetry/api', + '@opentelemetry/api-logs', + '@opentelemetry/exporter-logs-otlp-proto', + '@opentelemetry/exporter-metrics-otlp-proto', + '@opentelemetry/exporter-trace-otlp-proto', + '@opentelemetry/resources', + '@opentelemetry/sdk-logs', + '@opentelemetry/sdk-metrics', + '@opentelemetry/sdk-node', + '@opentelemetry/sdk-trace-base', + '@opentelemetry/semantic-conventions', + '@pierre/diffs', + '@pierre/theme', + '@slack/bolt', + '@slack/web-api', + '@tencent-connect/qqbot-connector', + '@tloncorp/tlon-skill', + '@twurple/api', + '@twurple/auth', + '@twurple/chat', + '@urbit/aura', + '@whiskeysockets/baileys', + '@zed-industries/codex-acp', + 'acpx', + 'ajv', + 'chokidar', + 'commander', + 'croner', + 'discord-api-types', + 'dotenv', + 'express', + 'fake-indexeddb', + 'gaxios', + 'global-agent', + 'google-auth-library', + 'grammy', + 'https-proxy-agent', + 'jiti', + 'jimp', + 'json5', + 'jsonwebtoken', + 'jszip', + 'jwks-rsa', + 'linkedom', + 'markdown-it', + 'matrix-js-sdk', + 'minimatch', + 'mpg123-decoder', + 'music-metadata', + 'node-edge-tts', + 'nostr-tools', + 'openai', + 'openshell', + 'opusscript', + 'pdfjs-dist', + 'playwright-core', + 'semver', + 'sharp', + 'silk-wasm', + 'sqlite-vec', + 'tar', + 'tokenjuice', + 'tslog', + 'typebox', + 'undici', + 'web-push', + 'ws', + 'yaml', + 'zca-js', + 'zod', +]; + const EXTRA_BUNDLED_PACKAGES = [ - '@whiskeysockets/baileys', // WhatsApp channel (was a dep of old clawdbot, not openclaw) + ...OPENCLAW_RUNTIME_DEPS_PACKAGES, 'qrcode-terminal', // QR rendering is loaded from OpenClaw context by channel login flows ]; @@ -215,6 +344,10 @@ for (const pkgName of EXTRA_BUNDLED_PACKAGES) { const packages = listPackages(nodeModulesDir); for (const { name, fullPath } of packages) { if (name === skipPkg) continue; + if (isOptionalNativeClipboardPackage(name)) { + skippedOptionalNativeCount++; + continue; + } if (SKIP_PACKAGES.has(name) || SKIP_SCOPES.some(s => name.startsWith(s))) continue; let realPath; try { realPath = fs.realpathSync(fullPath); } catch { continue; } @@ -250,6 +383,11 @@ let copiedCount = 0; let skippedDupes = 0; for (const [realPath, pkgName] of collected) { + if (isOptionalNativeClipboardPackage(pkgName)) { + skippedOptionalNativeCount++; + continue; + } + if (copiedNames.has(pkgName)) { skippedDupes++; continue; // Keep the first version (closer to openclaw in dep tree) @@ -299,6 +437,10 @@ if (fs.existsSync(extensionsDir)) { for (const scopeEntry of scopeEntries) { if (!scopeEntry.isDirectory()) continue; const scopedName = `${pkgEntry.name}/${scopeEntry.name}`; + if (isOptionalNativeClipboardPackage(scopedName)) { + skippedOptionalNativeCount++; + continue; + } if (copiedNames.has(scopedName)) continue; const srcScoped = path.join(srcPkg, scopeEntry.name); const destScoped = path.join(outputNodeModules, pkgEntry.name, scopeEntry.name); @@ -310,6 +452,10 @@ if (fs.existsSync(extensionsDir)) { } catch { /* skip on copy error */ } } } else { + if (isOptionalNativeClipboardPackage(pkgEntry.name)) { + skippedOptionalNativeCount++; + continue; + } if (copiedNames.has(pkgEntry.name)) continue; const destPkg = path.join(outputNodeModules, pkgEntry.name); try { @@ -326,6 +472,31 @@ if (mergedExtCount > 0) { echo` Merged ${mergedExtCount} extension packages into top-level node_modules`; } +let forcedRuntimeDepCount = 0; +for (const pkgName of OPENCLAW_RUNTIME_DEPS_PACKAGES) { + if (isOptionalNativeClipboardPackage(pkgName)) continue; + const pkgLink = path.join(NODE_MODULES, ...pkgName.split('/')); + if (!fs.existsSync(pkgLink)) continue; + + let pkgReal; + try { pkgReal = fs.realpathSync(pkgLink); } catch { continue; } + + const dest = path.join(outputNodeModules, pkgName); + try { + fs.rmSync(normWin(dest), { recursive: true, force: true }); + fs.mkdirSync(normWin(path.dirname(dest)), { recursive: true }); + fs.cpSync(normWin(pkgReal), normWin(dest), { recursive: true, dereference: true }); + copiedNames.add(pkgName); + forcedRuntimeDepCount++; + } catch (err) { + echo` ⚠️ Failed to force-copy runtime dependency ${pkgName}: ${err.message}`; + } +} + +if (forcedRuntimeDepCount > 0) { + echo` Forced ${forcedRuntimeDepCount} runtime dependency package(s) to workspace-resolved versions`; +} + // 6. Clean up the bundle to reduce package size // // This removes platform-agnostic waste: dev artifacts, docs, source maps, @@ -480,12 +651,38 @@ function cleanupBundle(outputDir) { return removedCount; } +function removeOptionalNativeClipboard(nodeModulesDir) { + const scopeDir = path.join(nodeModulesDir, '@mariozechner'); + let removedCount = 0; + let entries = []; + try { + entries = fs.readdirSync(scopeDir, { withFileTypes: true }); + } catch { + return 0; + } + + for (const entry of entries) { + if (!entry.isDirectory()) continue; + const packageName = `@mariozechner/${entry.name}`; + if (!isOptionalNativeClipboardPackage(packageName)) continue; + if (rmSafe(path.join(scopeDir, entry.name))) { + removedCount++; + } + } + + return removedCount; +} + echo``; echo`🧹 Cleaning up bundle (removing dev artifacts, docs, source maps, type defs)...`; const sizeBefore = getDirSize(OUTPUT); const cleanedCount = cleanupBundle(OUTPUT); +const removedClipboardCount = removeOptionalNativeClipboard(outputNodeModules); const sizeAfter = getDirSize(OUTPUT); echo` Removed ${cleanedCount} files/directories`; +if (removedClipboardCount > 0) { + echo` Removed ${removedClipboardCount} optional native clipboard package(s)`; +} echo` Size: ${formatSize(sizeBefore)} → ${formatSize(sizeAfter)} (saved ${formatSize(sizeBefore - sizeAfter)})`; // 7. Patch known broken packages @@ -826,11 +1023,142 @@ function patchBundledRuntime(outputDir) { if (hintCount > 0) { echo` 🩹 Patched ${hintCount} browser tool hint(s) to allow transient error retry`; } + + const desktopFastChatPatches = [ + { + label: 'desktop chat raw prompt mode', + search: 'const contextInjectionMode = resolveContextInjectionMode(params.config);\n\t\tconst isRawModelRun = params.modelRun === true || params.promptMode === "none";', + replace: 'const contextInjectionMode = resolveContextInjectionMode(params.config);\n\t\tconst yinianDesktopFastModelRun = (!params.messageChannel && !params.messageProvider || params.messageChannel === "webchat" || params.messageProvider === "webchat") && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");\n\t\tconst isRawModelRun = params.modelRun === true || params.promptMode === "none" || yinianDesktopFastModelRun;', + }, + { + label: 'desktop chat skip raw system prompt build', + search: 'const builtAppendPrompt = resolveSystemPromptOverride({', + replace: 'const builtAppendPrompt = isRawModelRun ? "" : resolveSystemPromptOverride({', + }, + { + label: 'desktop chat disable tools', + search: 'const toolsRaw = params.disableTools || isRawModelRun ? [] : applyEmbeddedAttemptToolsAllow(createOpenClawCodingTools({', + replace: 'const yinianDesktopFastModelRun = (!params.messageChannel && !params.messageProvider || params.messageChannel === "webchat" || params.messageProvider === "webchat") && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");\n\t\tconst toolsRaw = params.disableTools || isRawModelRun || yinianDesktopFastModelRun ? [] : applyEmbeddedAttemptToolsAllow(createOpenClawCodingTools({', + }, + { + label: 'desktop chat remove duplicate fast path flag', + search: 'const yinianDesktopFastModelRun = (!params.messageChannel && !params.messageProvider || params.messageChannel === "webchat" || params.messageProvider === "webchat") && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");\n\t\tconst toolsRaw = params.disableTools || isRawModelRun || yinianDesktopFastModelRun ? [] : applyEmbeddedAttemptToolsAllow(createOpenClawCodingTools({', + replace: 'const toolsRaw = params.disableTools || isRawModelRun || yinianDesktopFastModelRun ? [] : applyEmbeddedAttemptToolsAllow(createOpenClawCodingTools({', + }, + { + label: 'desktop chat webchat fast path', + search: 'const yinianDesktopFastModelRun = !params.messageChannel && !params.messageProvider && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");', + replace: 'const yinianDesktopFastModelRun = (!params.messageChannel && !params.messageProvider || params.messageChannel === "webchat" || params.messageProvider === "webchat") && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");', + }, + { + label: 'skip channel agent tools for lightweight profiles', + search: '...listChannelAgentTools({ cfg: options?.config }),', + replace: '...(profile === "messaging" || profile === "minimal" ? [] : listChannelAgentTools({ cfg: options?.config })),', + }, + { + label: 'skip plugin tools for lightweight profiles', + search: 'allowGatewaySubagentBinding: options?.allowGatewaySubagentBinding\n\t\t})', + replace: 'allowGatewaySubagentBinding: options?.allowGatewaySubagentBinding,\n\t\t\tdisablePluginTools: options?.disablePluginTools ?? (profile === "messaging" || profile === "minimal")\n\t\t})', + }, + ]; + let desktopFastChatCount = 0; + for (const patch of desktopFastChatPatches) { + let matchedAny = false; + if (fs.existsSync(distDir)) { + for (const file of fs.readdirSync(distDir)) { + if (!file.endsWith('.js')) continue; + const filePath = path.join(distDir, file); + const content = fs.readFileSync(filePath, 'utf8'); + if (!content.includes(patch.search)) continue; + matchedAny = true; + const next = content.replace(patch.search, patch.replace); + if (next !== content) { + fs.writeFileSync(filePath, next, 'utf8'); + desktopFastChatCount++; + } + } + } + if (!matchedAny) { + echo` ⚠️ Skipped patch for ${patch.label}: expected source snippet not found`; + } + } + if (desktopFastChatCount > 0) { + echo` 🩹 Patched ${desktopFastChatCount} desktop fast chat runtime site(s)`; + } + + const runtimeDepsTargets = findFilesByName( + path.join(outputDir, 'dist'), + /^bundled-runtime-deps-.*\.js$/, + ); + const npmRunnerSearch = `\tconst execPath = params.execPath ?? process.execPath; +\tconst existsSync = params.existsSync ?? fs.existsSync; +\tconst platform = params.platform ?? process.platform; +\tconst pathImpl = platform === "win32" ? path.win32 : path.posix;`; + const npmRunnerReplace = `\tconst execPath = params.execPath ?? process.execPath; +\tconst existsSync = params.existsSync ?? fs.existsSync; +\tconst platform = params.platform ?? process.platform; +\tconst pathImpl = platform === "win32" ? path.win32 : path.posix; +\tconst env = params.env ?? process.env; +\tconst explicitNodePath = env.YINIAN_NODE_EXEC_PATH; +\tconst explicitNpmCliPath = env.YINIAN_NPM_CLI_PATH; +\tif (explicitNodePath && explicitNpmCliPath && pathImpl.isAbsolute(explicitNodePath) && pathImpl.isAbsolute(explicitNpmCliPath) && existsSync(explicitNodePath) && existsSync(explicitNpmCliPath)) return { +\t\tcommand: explicitNodePath, +\t\targs: [explicitNpmCliPath, ...params.npmArgs] +\t};`; + + let npmRunnerCount = 0; + let materializedCheckCount = 0; + for (const target of runtimeDepsTargets) { + const current = fs.readFileSync(target, 'utf8'); + let next = current; + if (next.includes(npmRunnerSearch)) { + next = next.replace(npmRunnerSearch, npmRunnerReplace); + npmRunnerCount++; + } + + const materializedSearch = `function isRuntimeDepsPlanMaterialized(installRoot, installSpecs) { +\tconst generatedManifestSpecs = readGeneratedInstallManifestSpecs(installRoot); +\tconst packageManifestSpecs = generatedManifestSpecs !== null ? null : readPackageRuntimeDepSpecs(installRoot); +\treturn (generatedManifestSpecs !== null && sameRuntimeDepSpecs(generatedManifestSpecs, installSpecs) || packageManifestSpecs !== null && sameRuntimeDepSpecs(packageManifestSpecs, installSpecs)) && hasSatisfiedInstallSpecPackages(installRoot, installSpecs); +}`; + const materializedReplace = `function isRuntimeDepsPlanMaterialized(installRoot, installSpecs) { +\tconst generatedManifestSpecs = readGeneratedInstallManifestSpecs(installRoot); +\tconst packageManifestSpecs = generatedManifestSpecs !== null ? null : readPackageRuntimeDepSpecs(installRoot); +\treturn (generatedManifestSpecs !== null || packageManifestSpecs !== null) && hasSatisfiedInstallSpecPackages(installRoot, installSpecs); +}`; + if (next.includes(materializedSearch)) { + next = next.replace(materializedSearch, materializedReplace); + materializedCheckCount++; + } else if (next.includes(materializedReplace)) { + materializedCheckCount++; + } + + if (next !== current) { + fs.writeFileSync(target, next, 'utf8'); + } + } + if (npmRunnerCount > 0) { + echo` 🩹 Patched ${npmRunnerCount} bundled npm runner resolver(s)`; + } else { + echo` ⚠️ Skipped patch for bundled npm runner resolver: expected source snippet not found`; + } + if (materializedCheckCount > 0) { + echo` 🩹 Patched ${materializedCheckCount} bundled runtime dependency materialization check(s)`; + } else { + echo` ⚠️ Skipped patch for bundled runtime dependency materialization check: expected source snippet not found`; + } } patchBrokenModules(outputNodeModules); patchBundledRuntime(OUTPUT); +fs.writeFileSync( + path.join(OUTPUT, YINIAN_RUNTIME_PATCH_MARKER_FILE), + JSON.stringify(YINIAN_RUNTIME_PATCH_MARKER, null, 2) + '\n', + 'utf8', +); +echo` 🧭 Wrote Yinian runtime patch marker ${YINIAN_RUNTIME_PATCH_MARKER.version}`; + // 8. Verify the bundle const entryExists = fs.existsSync(path.join(OUTPUT, 'openclaw.mjs')); const distExists = fs.existsSync(path.join(OUTPUT, 'dist', 'entry.js')); @@ -839,6 +1167,7 @@ echo``; echo`✅ Bundle complete: ${OUTPUT}`; echo` Unique packages copied: ${copiedCount}`; echo` Dev-only packages skipped: ${skippedDevCount}`; +echo` Optional native packages skipped: ${skippedOptionalNativeCount}`; echo` Duplicate versions skipped: ${skippedDupes}`; echo` Total discovered: ${collected.size}`; echo` openclaw.mjs: ${entryExists ? '✓' : '✗'}`; diff --git a/scripts/download-bundled-node.mjs b/scripts/download-bundled-node.mjs index 025ec2b..a5dff0e 100644 --- a/scripts/download-bundled-node.mjs +++ b/scripts/download-bundled-node.mjs @@ -8,6 +8,14 @@ const BASE_URL = `https://nodejs.org/dist/v${NODE_VERSION}`; const OUTPUT_BASE = path.join(ROOT_DIR, 'resources', 'bin'); const TARGETS = { + 'darwin-x64': { + filename: `node-v${NODE_VERSION}-darwin-x64.tar.gz`, + sourceDir: `node-v${NODE_VERSION}-darwin-x64`, + }, + 'darwin-arm64': { + filename: `node-v${NODE_VERSION}-darwin-arm64.tar.gz`, + sourceDir: `node-v${NODE_VERSION}-darwin-arm64`, + }, 'win32-x64': { filename: `node-v${NODE_VERSION}-win-x64.zip`, sourceDir: `node-v${NODE_VERSION}-win-x64`, @@ -19,6 +27,7 @@ const TARGETS = { }; const PLATFORM_GROUPS = { + mac: ['darwin-x64', 'darwin-arm64'], win: ['win32-x64', 'win32-arm64'], }; @@ -36,11 +45,14 @@ async function setupTarget(id) { echo(chalk.blue`\n📦 Setting up Node.js for ${id}...`); - // Only remove the target binary, not the entire directory, - // to avoid deleting uv.exe or other binaries placed by other download scripts. - const outputNode = path.join(targetDir, 'node.exe'); - if (await fs.pathExists(outputNode)) { - await fs.remove(outputNode); + const outputNode = path.join(targetDir, id.startsWith('win32-') ? 'node.exe' : 'node'); + const outputNpmDir = path.join(targetDir, 'lib', 'node_modules', 'npm'); + const outputNpmCli = path.join(outputNpmDir, 'bin', 'npm-cli.js'); + if (process.env.FORCE_BUNDLED_NODE_REFRESH !== '1' + && await fs.pathExists(outputNode) + && await fs.pathExists(outputNpmCli)) { + echo(chalk.green`✅ Already prepared: ${outputNode}`); + return; } await fs.remove(tempDir); await fs.ensureDir(targetDir); @@ -48,33 +60,52 @@ async function setupTarget(id) { try { echo`⬇️ Downloading: ${downloadUrl}`; - const response = await fetch(downloadUrl); - if (!response.ok) throw new Error(`Failed to download: ${response.statusText}`); + const response = await fetchWithRetry(downloadUrl); const buffer = await response.arrayBuffer(); await fs.writeFile(archivePath, Buffer.from(buffer)); echo`📂 Extracting...`; - if (os.platform() === 'win32') { + if (target.filename.endsWith('.zip')) { const { execFileSync } = await import('child_process'); - const psCommand = `Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::ExtractToDirectory('${archivePath.replace(/'/g, "''")}', '${tempDir.replace(/'/g, "''")}')`; - execFileSync('powershell.exe', ['-NoProfile', '-Command', psCommand], { stdio: 'inherit' }); + if (os.platform() === 'win32') { + const psCommand = `Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::ExtractToDirectory('${archivePath.replace(/'/g, "''")}', '${tempDir.replace(/'/g, "''")}')`; + execFileSync('powershell.exe', ['-NoProfile', '-Command', psCommand], { stdio: 'inherit' }); + } else { + await $`unzip -q -o ${archivePath} -d ${tempDir}`; + } } else { - await $`unzip -q -o ${archivePath} -d ${tempDir}`; + await $`tar -xzf ${archivePath} -C ${tempDir}`; } - const expectedNode = path.join(tempDir, target.sourceDir, 'node.exe'); + const nodeFileName = id.startsWith('win32-') ? 'node.exe' : 'node'; + const expectedNode = path.join(tempDir, target.sourceDir, 'bin', nodeFileName); + const legacyExpectedNode = path.join(tempDir, target.sourceDir, nodeFileName); if (await fs.pathExists(expectedNode)) { await fs.move(expectedNode, outputNode, { overwrite: true }); + } else if (await fs.pathExists(legacyExpectedNode)) { + await fs.move(legacyExpectedNode, outputNode, { overwrite: true }); } else { - echo(chalk.yellow`🔍 node.exe not found in expected directory, searching...`); - const files = await glob('**/node.exe', { cwd: tempDir, absolute: true }); + echo(chalk.yellow`🔍 ${nodeFileName} not found in expected directory, searching...`); + const files = await glob(`**/${nodeFileName}`, { cwd: tempDir, absolute: true }); if (files.length > 0) { await fs.move(files[0], outputNode, { overwrite: true }); } else { - throw new Error('Could not find node.exe in extracted files.'); + throw new Error(`Could not find ${nodeFileName} in extracted files.`); } } + if (!id.startsWith('win32-')) { + await fs.chmod(outputNode, 0o755); + } + + const sourceNpmDir = path.join(tempDir, target.sourceDir, 'lib', 'node_modules', 'npm'); + if (await fs.pathExists(sourceNpmDir)) { + await fs.ensureDir(path.dirname(outputNpmDir)); + await fs.copy(sourceNpmDir, outputNpmDir, { overwrite: true }); + } else { + echo(chalk.yellow`⚠️ npm package not found in Node archive for ${id}; only node binary was copied.`); + } + echo(chalk.green`✅ Success: ${outputNode}`); } finally { await fs.remove(archivePath); @@ -82,11 +113,32 @@ async function setupTarget(id) { } } +async function fetchWithRetry(url, attempts = 3) { + let lastError; + for (let attempt = 1; attempt <= attempts; attempt += 1) { + try { + const response = await fetch(url); + if (!response.ok) throw new Error(`Failed to download: ${response.status} ${response.statusText}`); + return response; + } catch (error) { + lastError = error; + if (attempt < attempts) { + echo(chalk.yellow`⚠️ Download failed (attempt ${attempt}/${attempts}), retrying...`); + await new Promise((resolve) => setTimeout(resolve, 1500 * attempt)); + } + } + } + throw lastError; +} + const downloadAll = argv.all; const platform = argv.platform; +const target = argv.target; -if (downloadAll) { - echo(chalk.cyan`🌐 Downloading Node.js binaries for all Windows targets...`); +if (target) { + await setupTarget(String(target)); +} else if (downloadAll) { + echo(chalk.cyan`🌐 Downloading Node.js binaries for all bundled targets...`); for (const id of Object.keys(TARGETS)) { await setupTarget(id); } @@ -104,7 +156,7 @@ if (downloadAll) { } else { const currentId = `${os.platform()}-${os.arch()}`; if (TARGETS[currentId]) { - echo(chalk.cyan`💻 Detected Windows system: ${currentId}`); + echo(chalk.cyan`💻 Detected system: ${currentId}`); await setupTarget(currentId); } else { echo(chalk.cyan`🎯 Defaulting to Windows multi-arch Node.js download`); diff --git a/scripts/download-bundled-uv.mjs b/scripts/download-bundled-uv.mjs index 8ab90ae..b601ae7 100644 --- a/scripts/download-bundled-uv.mjs +++ b/scripts/download-bundled-uv.mjs @@ -53,11 +53,16 @@ async function setupTarget(id) { const tempDir = path.join(ROOT_DIR, 'temp_uv_extract'); const archivePath = path.join(ROOT_DIR, target.filename); const downloadUrl = `${BASE_URL}/${target.filename}`; + const destBin = path.join(targetDir, target.binName); echo(chalk.blue`\n📦 Setting up uv for ${id}...`); - // Cleanup & Prep - await fs.remove(targetDir); + // Cleanup temporary files only. Do not remove targetDir: it may also contain + // the bundled Node/npm runtime used by the packaged app. + if (process.env.FORCE_BUNDLED_UV_REFRESH !== '1' && await fs.pathExists(destBin)) { + echo(chalk.green`✅ Already prepared: ${destBin}`); + return; + } await fs.remove(tempDir); await fs.ensureDir(targetDir); await fs.ensureDir(tempDir); @@ -65,8 +70,13 @@ async function setupTarget(id) { try { // Download echo`⬇️ Downloading: ${downloadUrl}`; - const response = await fetch(downloadUrl); - if (!response.ok) throw new Error(`Failed to download: ${response.statusText}`); + let response; + try { + response = await fetchWithRetry(downloadUrl); + } catch (error) { + if (await copyLocalUvFallback(id, destBin)) return; + throw error; + } const buffer = await response.arrayBuffer(); await fs.writeFile(archivePath, Buffer.from(buffer)); @@ -88,7 +98,6 @@ async function setupTarget(id) { // uv archives usually contain a folder named after the target const folderName = target.filename.replace('.tar.gz', '').replace('.zip', ''); const sourceBin = path.join(tempDir, folderName, target.binName); - const destBin = path.join(targetDir, target.binName); if (await fs.pathExists(sourceBin)) { await fs.move(sourceBin, destBin, { overwrite: true }); @@ -115,11 +124,54 @@ async function setupTarget(id) { } } +async function copyLocalUvFallback(id, destBin) { + const currentId = `${os.platform()}-${os.arch()}`; + if (id !== currentId) return false; + + try { + const { execFileSync } = await import('node:child_process'); + const command = os.platform() === 'win32' ? 'where.exe' : 'which'; + const output = execFileSync(command, ['uv'], { encoding: 'utf8' }); + const localUv = output.split(/\r?\n/).map((line) => line.trim()).find(Boolean); + if (!localUv) return false; + echo(chalk.yellow`⚠️ Download failed; using local uv fallback: ${localUv}`); + await fs.copy(localUv, destBin, { overwrite: true, dereference: true }); + if (os.platform() !== 'win32') { + await fs.chmod(destBin, 0o755); + } + echo(chalk.green`✅ Success: ${destBin}`); + return true; + } catch { + return false; + } +} + +async function fetchWithRetry(url, attempts = 3) { + let lastError; + for (let attempt = 1; attempt <= attempts; attempt += 1) { + try { + const response = await fetch(url); + if (!response.ok) throw new Error(`Failed to download: ${response.status} ${response.statusText}`); + return response; + } catch (error) { + lastError = error; + if (attempt < attempts) { + echo(chalk.yellow`⚠️ Download failed (attempt ${attempt}/${attempts}), retrying...`); + await new Promise((resolve) => setTimeout(resolve, 1500 * attempt)); + } + } + } + throw lastError; +} + // Main logic const downloadAll = argv.all; const platform = argv.platform; +const target = argv.target; -if (downloadAll) { +if (target) { + await setupTarget(String(target)); +} else if (downloadAll) { // Download for all platforms echo(chalk.cyan`🌐 Downloading uv binaries for ALL supported platforms...`); for (const id of Object.keys(TARGETS)) { diff --git a/scripts/patch-browser-hint.mjs b/scripts/patch-browser-hint.mjs index 1fed871..6035acc 100644 --- a/scripts/patch-browser-hint.mjs +++ b/scripts/patch-browser-hint.mjs @@ -1,12 +1,15 @@ #!/usr/bin/env node /** - * Patch OpenClaw's BROWSER_TOOL_MODEL_HINT to allow retries on transient errors. + * Patch OpenClaw's dev-time runtime files. + * + * 1. BROWSER_TOOL_MODEL_HINT: allow retries on transient errors. + * 2. Bundled runtime deps materialization: accept already-satisfied local + * runtime packages even when OpenClaw expands its generated manifest after + * Gateway boot. Production builds are separately patched in + * bundle-openclaw.mjs. * * The original hint ("Do NOT retry the browser tool — it will keep failing") * causes models to permanently refuse browser usage after a single transient error. - * - * This runs as postinstall to patch node_modules for dev mode. - * Production builds are separately patched in bundle-openclaw.mjs. */ import { readFileSync, writeFileSync, readdirSync } from 'fs'; @@ -26,6 +29,8 @@ const REPLACEMENTS = [ const distDir = join(process.cwd(), 'node_modules', 'openclaw', 'dist'); let patchedCount = 0; +let runtimeDepsPatchedCount = 0; +let desktopFastChatPatchedCount = 0; try { for (const file of readdirSync(distDir)) { if (!file.endsWith('.js')) continue; @@ -48,6 +53,84 @@ try { // openclaw not installed yet or dist not found — skip silently } +try { + for (const file of readdirSync(distDir)) { + if (!file.endsWith('.js')) continue; + const filePath = join(distDir, file); + let content = readFileSync(filePath, 'utf-8'); + const before = content; + + content = content.replace( + 'const contextInjectionMode = resolveContextInjectionMode(params.config);\n\t\tconst isRawModelRun = params.modelRun === true || params.promptMode === "none";', + 'const contextInjectionMode = resolveContextInjectionMode(params.config);\n\t\tconst yinianDesktopFastModelRun = (!params.messageChannel && !params.messageProvider || params.messageChannel === "webchat" || params.messageProvider === "webchat") && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");\n\t\tconst isRawModelRun = params.modelRun === true || params.promptMode === "none" || yinianDesktopFastModelRun;', + ); + content = content.replace( + 'const builtAppendPrompt = resolveSystemPromptOverride({', + 'const builtAppendPrompt = isRawModelRun ? "" : resolveSystemPromptOverride({', + ); + content = content.replace( + 'const toolsRaw = params.disableTools || isRawModelRun ? [] : applyEmbeddedAttemptToolsAllow(createOpenClawCodingTools({', + 'const yinianDesktopFastModelRun = (!params.messageChannel && !params.messageProvider || params.messageChannel === "webchat" || params.messageProvider === "webchat") && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");\n\t\tconst toolsRaw = params.disableTools || isRawModelRun || yinianDesktopFastModelRun ? [] : applyEmbeddedAttemptToolsAllow(createOpenClawCodingTools({', + ); + content = content.replace( + 'const yinianDesktopFastModelRun = (!params.messageChannel && !params.messageProvider || params.messageChannel === "webchat" || params.messageProvider === "webchat") && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");\n\t\tconst toolsRaw = params.disableTools || isRawModelRun || yinianDesktopFastModelRun ? [] : applyEmbeddedAttemptToolsAllow(createOpenClawCodingTools({', + 'const toolsRaw = params.disableTools || isRawModelRun || yinianDesktopFastModelRun ? [] : applyEmbeddedAttemptToolsAllow(createOpenClawCodingTools({', + ); + content = content.replace( + 'const yinianDesktopFastModelRun = !params.messageChannel && !params.messageProvider && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");', + 'const yinianDesktopFastModelRun = (!params.messageChannel && !params.messageProvider || params.messageChannel === "webchat" || params.messageProvider === "webchat") && (params.config?.tools?.profile === "messaging" || params.config?.tools?.profile === "minimal");', + ); + content = content.replace( + '...listChannelAgentTools({ cfg: options?.config }),', + '...(profile === "messaging" || profile === "minimal" ? [] : listChannelAgentTools({ cfg: options?.config })),', + ); + content = content.replace( + 'allowGatewaySubagentBinding: options?.allowGatewaySubagentBinding\n\t\t})', + 'allowGatewaySubagentBinding: options?.allowGatewaySubagentBinding,\n\t\t\tdisablePluginTools: options?.disablePluginTools ?? (profile === "messaging" || profile === "minimal")\n\t\t})', + ); + + if (content !== before) { + writeFileSync(filePath, content, 'utf-8'); + console.log(`[patch-browser-hint] Patched desktop fast chat runtime: ${file}`); + desktopFastChatPatchedCount++; + } + } +} catch { + // openclaw not installed yet or dist not found — skip silently +} + +try { + for (const file of readdirSync(distDir)) { + if (!/^bundled-runtime-deps-.*\.js$/.test(file)) continue; + const filePath = join(distDir, file); + let content = readFileSync(filePath, 'utf-8'); + const search = `function isRuntimeDepsPlanMaterialized(installRoot, installSpecs) { +\tconst generatedManifestSpecs = readGeneratedInstallManifestSpecs(installRoot); +\tconst packageManifestSpecs = generatedManifestSpecs !== null ? null : readPackageRuntimeDepSpecs(installRoot); +\treturn (generatedManifestSpecs !== null && sameRuntimeDepSpecs(generatedManifestSpecs, installSpecs) || packageManifestSpecs !== null && sameRuntimeDepSpecs(packageManifestSpecs, installSpecs)) && hasSatisfiedInstallSpecPackages(installRoot, installSpecs); +}`; + const replace = `function isRuntimeDepsPlanMaterialized(installRoot, installSpecs) { +\tconst generatedManifestSpecs = readGeneratedInstallManifestSpecs(installRoot); +\tconst packageManifestSpecs = generatedManifestSpecs !== null ? null : readPackageRuntimeDepSpecs(installRoot); +\treturn (generatedManifestSpecs !== null || packageManifestSpecs !== null) && hasSatisfiedInstallSpecPackages(installRoot, installSpecs); +}`; + if (content.includes(search)) { + content = content.replace(search, replace); + writeFileSync(filePath, content, 'utf-8'); + console.log(`[patch-browser-hint] Patched runtime deps materialization: ${file}`); + runtimeDepsPatchedCount++; + } + } +} catch { + // openclaw not installed yet or dist not found — skip silently +} + if (patchedCount > 0) { console.log(`[patch-browser-hint] Done. Patched ${patchedCount} file(s).`); } +if (runtimeDepsPatchedCount > 0) { + console.log(`[patch-browser-hint] Done. Patched ${runtimeDepsPatchedCount} runtime deps file(s).`); +} +if (desktopFastChatPatchedCount > 0) { + console.log(`[patch-browser-hint] Done. Patched ${desktopFastChatPatchedCount} desktop fast chat file(s).`); +} diff --git a/scripts/prepare-nianxx-play-bundle.mjs b/scripts/prepare-nianxx-play-bundle.mjs new file mode 100644 index 0000000..e8c7b4f --- /dev/null +++ b/scripts/prepare-nianxx-play-bundle.mjs @@ -0,0 +1,299 @@ +#!/usr/bin/env node + +import { spawnSync } from 'node:child_process'; +import { + cpSync, + existsSync, + mkdirSync, + readdirSync, + readFileSync, + rmSync, + statSync, + writeFileSync, +} from 'node:fs'; +import { basename, dirname, join, resolve, relative } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = resolve(__dirname, '..'); +const DEFAULT_SOURCE = resolve(ROOT, '..', '..', 'NianxxPlay'); +const SOURCE_DIR = resolve(process.env.NIANXX_PLAY_DIR || DEFAULT_SOURCE); +const OUTPUT_DIR = resolve(ROOT, 'build', 'apps', 'nianxx-play'); +const BUNDLE_RUNTIME_ENV = process.env.NIANXX_PLAY_BUNDLE_ENV === '1'; +const RUNTIME_ENV_FILE_NAME = '.env.runtime'; + +function log(message) { + console.log(`[nianxx-play-bundle] ${message}`); +} + +function fail(message) { + console.error(`[nianxx-play-bundle] ${message}`); + process.exit(1); +} + +function run(command, args, cwd) { + const result = spawnSync(command, args, { + cwd, + env: { + ...process.env, + NEXT_TELEMETRY_DISABLED: '1', + }, + stdio: 'inherit', + shell: process.platform === 'win32', + }); + if (result.status !== 0) { + fail(`${command} ${args.join(' ')} failed with exit code ${result.status ?? 'unknown'}`); + } +} + +function readPackageVersion(packageJsonPath) { + try { + const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8')); + return typeof pkg.version === 'string' ? pkg.version : '0.0.0'; + } catch { + return '0.0.0'; + } +} + +function parseEnvFile(envPath) { + if (!existsSync(envPath)) return []; + const entries = []; + const raw = readFileSync(envPath, 'utf8'); + for (const line of raw.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const match = trimmed.match(/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/); + if (!match) continue; + const key = match[1]; + let value = match[2].trim(); + if ( + (value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'")) + ) { + value = value.slice(1, -1); + } + entries.push({ key, value }); + } + return entries; +} + +function selectRuntimeEnvFile(sourceDir) { + const explicit = process.env.NIANXX_PLAY_ENV_FILE?.trim(); + if (explicit) { + const resolved = resolve(explicit); + return existsSync(resolved) ? resolved : undefined; + } + for (const fileName of ['.env.local', '.env.production.local', '.env.production', '.env']) { + const candidate = join(sourceDir, fileName); + if (existsSync(candidate)) return candidate; + } + return undefined; +} + +function encodeEnvValue(value) { + return JSON.stringify(value); +} + +function writeRuntimeEnvFile(sourceDir, outputDir) { + if (!BUNDLE_RUNTIME_ENV) return { bundled: false, values: 0 }; + const envFile = selectRuntimeEnvFile(sourceDir); + if (!envFile) { + fail('NIANXX_PLAY_BUNDLE_ENV=1 set, but no NianxxPlay env file was found.'); + } + const entries = parseEnvFile(envFile); + if (!entries.length) { + fail(`NIANXX_PLAY_BUNDLE_ENV=1 set, but env file has no usable entries: ${envFile}`); + } + const runtimeEnvPath = join(outputDir, RUNTIME_ENV_FILE_NAME); + const text = [ + '# Bundled only for internal testing. Do not use in production builds.', + ...entries.map((entry) => `${entry.key}=${encodeEnvValue(entry.value)}`), + '', + ].join('\n'); + writeFileSync(runtimeEnvPath, text, 'utf8'); + return { bundled: true, values: entries.length }; +} + +function collectSecretLikeEnvValues(sourceDir) { + const envFileNames = [ + '.env', + '.env.local', + '.env.production', + '.env.production.local', + ]; + const sensitiveKeyPattern = /(SECRET|TOKEN|PASSWORD|PRIVATE|AUTH|API_KEY|ACCESS_KEY|KEY_ID|KEY_SECRET|SERVICE_ROLE)/i; + const ignoredValues = new Set(['true', 'false', 'null', 'undefined', 'development', 'production']); + const values = []; + for (const fileName of envFileNames) { + for (const entry of parseEnvFile(join(sourceDir, fileName))) { + if (!sensitiveKeyPattern.test(entry.key)) continue; + if (!entry.value || entry.value.length < 8) continue; + if (ignoredValues.has(entry.value.toLowerCase())) continue; + values.push(entry); + } + } + return values; +} + +function shouldCopyPublic(src) { + const name = basename(src); + if (name === 'uploads' || name === 'generated-results') return false; + if (name.startsWith('.env')) return false; + return true; +} + +function shouldCopyRuntime(src) { + const name = basename(src); + if (name.startsWith('.env')) return false; + if (name === '.data' || name === '.git' || name === '.next-cache') return false; + if (name === 'uploads' || name === 'generated-results') return false; + return true; +} + +function copyDir(from, to, filter = () => true) { + if (!existsSync(from)) return false; + mkdirSync(dirname(to), { recursive: true }); + cpSync(from, to, { + recursive: true, + dereference: true, + filter, + }); + return true; +} + +function dirSizeBytes(dir) { + if (!existsSync(dir)) return 0; + const stats = statSync(dir); + if (stats.isFile()) return stats.size; + let size = 0; + for (const entry of readdirSync(dir)) { + size += dirSizeBytes(join(dir, entry)); + } + return size; +} + +function assertNoEnvFiles(dir) { + const allowedRuntimeEnvPath = BUNDLE_RUNTIME_ENV + ? join(OUTPUT_DIR, RUNTIME_ENV_FILE_NAME) + : undefined; + const stack = [dir]; + while (stack.length) { + const current = stack.pop(); + for (const entry of readdirSync(current)) { + const fullPath = join(current, entry); + if (allowedRuntimeEnvPath && fullPath === allowedRuntimeEnvPath) { + continue; + } + if (basename(entry).startsWith('.env')) { + fail(`Refusing to ship env file: ${relative(ROOT, fullPath)}`); + } + if (statSync(fullPath).isDirectory()) stack.push(fullPath); + } + } +} + +function shouldScanForSecrets(filePath) { + const stats = statSync(filePath); + if (!stats.isFile()) return false; + if (stats.size > 5 * 1024 * 1024) return false; + return /\.(?:js|json|html|css|txt|mjs|cjs|map)$/i.test(filePath); +} + +function assertNoSecretValues(dir, secretEntries) { + if (!secretEntries.length) return; + const stack = [dir]; + while (stack.length) { + const current = stack.pop(); + for (const entry of readdirSync(current)) { + const fullPath = join(current, entry); + const stats = statSync(fullPath); + if (stats.isDirectory()) { + stack.push(fullPath); + continue; + } + if (BUNDLE_RUNTIME_ENV && fullPath === join(OUTPUT_DIR, RUNTIME_ENV_FILE_NAME)) continue; + if (!shouldScanForSecrets(fullPath)) continue; + const content = readFileSync(fullPath, 'utf8'); + for (const secret of secretEntries) { + if (content.includes(secret.value)) { + fail(`Refusing to ship bundle: secret-like env value "${secret.key}" appears in ${relative(ROOT, fullPath)}`); + } + } + } + } +} + +if (process.env.SKIP_NIANXX_PLAY_BUNDLE === '1') { + log('SKIP_NIANXX_PLAY_BUNDLE=1 set, skipping.'); + process.exit(0); +} + +if (!existsSync(join(SOURCE_DIR, 'package.json'))) { + fail(`NianxxPlay source not found: ${SOURCE_DIR}`); +} + +const sourceVersion = readPackageVersion(join(SOURCE_DIR, 'package.json')); +const secretLikeEnvValues = collectSecretLikeEnvValues(SOURCE_DIR); +log(`source: ${SOURCE_DIR}`); +log(`version: ${sourceVersion}`); + +if (process.env.NIANXX_PLAY_SKIP_BUILD !== '1') { + log('building Next.js standalone runtime...'); + run(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['run', 'build'], SOURCE_DIR); +} else { + log('NIANXX_PLAY_SKIP_BUILD=1 set, reusing existing .next output.'); +} + +const standaloneDir = join(SOURCE_DIR, '.next', 'standalone'); +const staticDir = join(SOURCE_DIR, '.next', 'static'); +const publicDir = join(SOURCE_DIR, 'public'); +const contentDir = join(SOURCE_DIR, 'content'); + +if (!existsSync(join(standaloneDir, 'server.js'))) { + fail(`Missing Next.js standalone server: ${join(standaloneDir, 'server.js')}`); +} +if (!existsSync(staticDir)) { + fail(`Missing Next.js static output: ${staticDir}`); +} + +rmSync(OUTPUT_DIR, { recursive: true, force: true }); +mkdirSync(OUTPUT_DIR, { recursive: true }); + +log(`copying standalone runtime -> ${OUTPUT_DIR}`); +copyDir(standaloneDir, OUTPUT_DIR, shouldCopyRuntime); +copyDir(staticDir, join(OUTPUT_DIR, '.next', 'static'), shouldCopyRuntime); +copyDir(publicDir, join(OUTPUT_DIR, 'public'), shouldCopyPublic); +copyDir(contentDir, join(OUTPUT_DIR, 'content'), shouldCopyRuntime); +const runtimeEnv = writeRuntimeEnvFile(SOURCE_DIR, OUTPUT_DIR); + +assertNoEnvFiles(OUTPUT_DIR); +assertNoSecretValues(OUTPUT_DIR, secretLikeEnvValues); + +const manifest = { + appId: 'nianxx-play', + name: 'NianxxPlay', + version: sourceVersion, + bundledAt: new Date().toISOString(), + runtime: 'next-standalone', + entry: 'server.js', + excludes: ['.env*', '.data', 'public/uploads', 'public/generated-results'], + secretScan: { + checked: true, + sourceEnvValues: secretLikeEnvValues.length, + }, + runtimeEnv: runtimeEnv.bundled + ? { + bundled: true, + file: RUNTIME_ENV_FILE_NAME, + values: runtimeEnv.values, + purpose: 'internal-testing-only', + } + : { + bundled: false, + }, + sizeBytes: dirSizeBytes(OUTPUT_DIR), +}; + +writeFileSync(join(OUTPUT_DIR, 'bundle-manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8'); +log(`ready: ${OUTPUT_DIR}`); +log(`size: ${(manifest.sizeBytes / 1024 / 1024).toFixed(1)} MB`); diff --git a/shared/yinian.ts b/shared/yinian.ts index dfb5686..b1a0588 100644 --- a/shared/yinian.ts +++ b/shared/yinian.ts @@ -122,6 +122,26 @@ export type YinianSkillRegistryByHotel = Record; export type YinianWorkspace = YinianHotel; export type YinianSkillRegistryByWorkspace = YinianSkillRegistryByHotel; +export type YinianAppCenterItemType = 'native' | 'webview' | 'external'; + +export type YinianAppCenterItemSource = 'built-in' | 'server' | 'local'; + +export interface YinianAppCenterItem { + id: string; + name: string; + description?: string; + category?: string; + tags?: string[]; + icon?: string; + type: YinianAppCenterItemType; + route?: string; + url?: string; + pinned?: boolean; + source: YinianAppCenterItemSource; + createdAt?: string; + updatedAt?: string; +} + export interface YinianNotificationChannel { id: string; kind: string; diff --git a/src/App.tsx b/src/App.tsx index 23ff9c8..c9edb5b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,10 +2,12 @@ * Root Application Component * Handles routing and global providers */ -import { Routes, Route, useNavigate, useLocation } from 'react-router-dom'; -import { Component, useEffect } from 'react'; +import { Navigate, Routes, Route, useNavigate, useLocation } from 'react-router-dom'; +import { Component, useEffect, useRef, useState } from 'react'; import type { ErrorInfo, ReactNode } from 'react'; -import { Toaster } from 'sonner'; +import { Toaster, toast } from 'sonner'; +import { AlertTriangle, RefreshCw, X } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; import i18n from './i18n'; import { MainLayout } from './components/layout/MainLayout'; import { TooltipProvider } from '@/components/ui/tooltip'; @@ -13,12 +15,13 @@ import { Models } from './pages/Models'; import { Chat } from './pages/Chat'; import { Agents } from './pages/Agents'; import { Channels } from './pages/Channels'; -import { YinianSkills } from './pages/YinianSkills'; import { Cron } from './pages/Cron'; import { Settings } from './pages/Settings'; import { Setup } from './pages/Setup'; import { Today } from './pages/Today'; import { Knowledge } from './pages/Knowledge'; +import { AppCenter } from './pages/AppCenter'; +import { NianxxPlay } from './pages/NianxxPlay'; import { YinianLogin } from './pages/YinianLogin'; import { useSettingsStore } from './stores/settings'; import { useGatewayStore } from './stores/gateway'; @@ -27,6 +30,8 @@ import { useYinianStore } from './stores/yinian'; import { applyGatewayTransportPreference } from './lib/api-client'; import { rendererExtensionRegistry } from './extensions/registry'; import { loadExternalRendererExtensions } from './extensions/_ext-bridge.generated'; +import { cn } from './lib/utils'; +import type { GatewayStatus } from './types/gateway'; /** @@ -93,6 +98,137 @@ class ErrorBoundary extends Component< } } +function getGatewayIssue(status: GatewayStatus, lastError: string | null) { + if (status.state === 'error') { + return { + tone: 'error' as const, + titleKey: 'gatewayFeedback.errorTitle', + descKey: 'gatewayFeedback.errorDesc', + actionKey: 'gatewayFeedback.restart', + detail: status.error || lastError, + }; + } + + if (status.state === 'reconnecting') { + return { + tone: 'warning' as const, + titleKey: 'gatewayFeedback.reconnectingTitle', + descKey: 'gatewayFeedback.reconnectingDesc', + actionKey: 'gatewayFeedback.restart', + detail: lastError, + }; + } + + if (status.state === 'stopped') { + return { + tone: 'warning' as const, + titleKey: 'gatewayFeedback.stoppedTitle', + descKey: 'gatewayFeedback.stoppedDesc', + actionKey: 'gatewayFeedback.start', + detail: lastError, + }; + } + + return null; +} + +function GlobalGatewayFeedback({ enabled }: { enabled: boolean }) { + const { t } = useTranslation('common'); + const status = useGatewayStore((state) => state.status); + const lastError = useGatewayStore((state) => state.lastError); + const startGateway = useGatewayStore((state) => state.start); + const restartGateway = useGatewayStore((state) => state.restart); + const previousStateRef = useRef(null); + const [dismissedForState, setDismissedForState] = useState(null); + + const issue = enabled ? getGatewayIssue(status, lastError) : null; + const issueKey = issue ? `${status.state}:${issue.detail || ''}` : null; + const visibleIssue = issue && dismissedForState !== issueKey ? issue : null; + + useEffect(() => { + if (!enabled) return; + + const previous = previousStateRef.current; + previousStateRef.current = status.state; + + if (status.state === 'running') { + setDismissedForState(null); + } + + if (!previous || previous === status.state) return; + + const currentIssue = getGatewayIssue(status, lastError); + if (currentIssue) { + const notify = currentIssue.tone === 'error' ? toast.error : toast.warning; + notify(t(currentIssue.titleKey), { + id: 'gateway-status', + description: t(currentIssue.descKey), + }); + return; + } + + if (status.state === 'running' && previous !== 'starting') { + toast.success(t('gatewayFeedback.recoveredTitle'), { + id: 'gateway-status', + description: t('gatewayFeedback.recoveredDesc'), + }); + } + }, [enabled, lastError, status, t]); + + if (!enabled || !visibleIssue || !issueKey) return null; + + const isError = visibleIssue.tone === 'error'; + const handleAction = () => { + if (status.state === 'stopped') { + void startGateway(); + } else { + void restartGateway(); + } + }; + + return ( +
+
+
+ +
+
+
{t(visibleIssue.titleKey)}
+
+ {visibleIssue.detail ? t('gatewayFeedback.detail', { message: visibleIssue.detail }) : t(visibleIssue.descKey)} +
+
+ + +
+
+ ); +} + function App() { const navigate = useNavigate(); const location = useLocation(); @@ -258,7 +394,9 @@ function App() { } /> } /> } /> - } /> + } /> + } /> + } /> } /> } /> } /> @@ -268,6 +406,8 @@ function App() { + + {/* Global toast notifications */} void | Promise; } -const inputClasses = 'h-[44px] rounded-xl font-mono text-[13px] bg-[#eeece3] dark:bg-muted border-black/10 dark:border-white/10 focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:border-blue-500 shadow-sm transition-all text-foreground placeholder:text-foreground/40'; +const inputClasses = 'h-[44px] rounded-lg font-mono text-[13px] bg-white/70 dark:bg-muted border-slate-200/80 dark:border-white/10 focus-visible:ring-2 focus-visible:ring-[#0369A1]/25 focus-visible:border-[#0369A1] shadow-sm transition-all text-foreground placeholder:text-foreground/40'; const labelClasses = 'text-[14px] text-foreground/80 font-bold'; -const outlineButtonClasses = 'h-9 text-[13px] font-medium rounded-full px-4 border-black/10 dark:border-white/10 bg-transparent hover:bg-black/5 dark:hover:bg-white/5 shadow-none text-foreground/80 hover:text-foreground'; +const outlineButtonClasses = 'h-9 rounded-lg px-4 text-[13px] font-medium border-slate-200/80 dark:border-white/10 bg-white/60 hover:bg-white dark:bg-white/5 dark:hover:bg-white/10 shadow-none text-foreground/80 hover:text-foreground'; const primaryButtonClasses = 'h-9 text-[13px] font-medium rounded-full px-4 shadow-none'; export function ChannelConfigModal({ @@ -486,7 +486,7 @@ export function ChannelConfigModal({ }} > event.stopPropagation()} onClick={(event) => event.stopPropagation()} > @@ -525,13 +525,13 @@ export function ChannelConfigModal({ key={type} onClick={() => setSelectedType(type)} className={cn( - 'group flex items-start gap-4 p-4 rounded-2xl transition-all text-left border relative overflow-hidden bg-[#eeece3] dark:bg-muted shadow-sm', + 'group relative flex items-start gap-4 overflow-hidden rounded-lg border bg-white/60 p-4 text-left shadow-sm transition-all dark:bg-muted', isConfigured ? 'border-green-500/40 bg-green-500/5 dark:bg-green-500/10' : 'border-black/5 dark:border-white/10 hover:bg-black/5 dark:hover:bg-white/5' )} > -
+
@@ -564,7 +564,7 @@ export function ChannelConfigModal({
) : qrCode ? (
-
+
{qrCode.startsWith('data:image') || qrCode.startsWith('http://') || qrCode.startsWith('https://') ? ( Scan QR Code ) : ( @@ -590,7 +590,7 @@ export function ChannelConfigModal({
) : loadingConfig ? ( -
+
{t('dialog.loadingConfig')}
@@ -603,7 +603,7 @@ export function ChannelConfigModal({
)} -
+

{t('dialog.howToConnect')}

@@ -837,7 +837,7 @@ function ConfigField({ field, value, onChange, showSecret, onToggleSecret }: Con variant="outline" size="icon" onClick={onToggleSecret} - className="h-[44px] w-[44px] rounded-xl bg-[#eeece3] dark:bg-muted border-black/10 dark:border-white/10 text-muted-foreground hover:text-foreground shrink-0 shadow-sm" + className="h-[44px] w-[44px] shrink-0 rounded-lg border-slate-200/80 bg-white/70 text-muted-foreground shadow-sm hover:text-foreground dark:border-white/10 dark:bg-muted" > {showSecret ? : } diff --git a/src/components/layout/MainLayout.tsx b/src/components/layout/MainLayout.tsx index ab1639f..82544c1 100644 --- a/src/components/layout/MainLayout.tsx +++ b/src/components/layout/MainLayout.tsx @@ -8,14 +8,14 @@ import { TitleBar } from './TitleBar'; export function MainLayout() { return ( -
+
{/* Title bar: drag region on macOS, icon + controls on Windows */} {/* Below the title bar: sidebar + content */}
-
+
diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index bc72b9c..3de20e9 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -3,12 +3,11 @@ * Navigation sidebar with menu items. * No longer fixed - sits inside the flex layout below the title bar. */ -import { useEffect, useMemo, useRef, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { NavLink, useLocation, useNavigate } from 'react-router-dom'; import { Network, Bot, - Puzzle, Clock, LibraryBig, Settings as SettingsIcon, @@ -22,6 +21,9 @@ import { ExternalLink, History as HistoryIcon, MessageCircle, + Blocks, + Search, + X, } from 'lucide-react'; import { cn } from '@/lib/utils'; import { rendererExtensionRegistry } from '@/extensions/registry'; @@ -55,22 +57,20 @@ type HistorySessionSource = { accountLabel: string; }; -type HistoryAccountGroup = { - key: string; - channelKey: string; - channelLabel: string; - accountKey: string; - accountLabel: string; - sessions: ChatSession[]; - latestAt: number; -}; +type HistoryFilterKey = string; -type HistoryChannelGroup = { - key: string; +const HISTORY_FILTER_ALL = 'all'; +const HISTORY_FILTER_CHAT = 'chat'; +const HISTORY_FILTER_CRON = 'cron'; +const HISTORY_FILTER_CHANNELS = 'channels'; +const INTERNAL_OPENCLAW_MAIN_SESSION_KEY = 'agent:main:main'; + +type HistoryListItem = { + session: ChatSession; + source: HistorySessionSource; label: string; - accounts: HistoryAccountGroup[]; - sessions: ChatSession[]; - latestAt: number; + activityMs: number; + searchText: string; }; interface NavItemProps { @@ -91,10 +91,10 @@ function NavItem({ to, icon, label, badge, collapsed, onClick, testId }: NavItem data-testid={testId} className={({ isActive }) => cn( - 'flex items-center gap-2.5 rounded-lg px-2.5 py-2 text-[14px] font-medium transition-colors', - 'hover:bg-slate-100 dark:hover:bg-white/5 text-foreground/80', + 'flex items-center gap-2.5 rounded-lg px-2.5 py-2 text-[14px] font-medium transition-all duration-200', + 'hover:bg-white/70 dark:hover:bg-white/10 text-foreground/80', isActive - ? 'bg-[#1E3A8A]/10 text-[#1E3A8A] dark:bg-[#1E3A8A]/30 dark:text-blue-100' + ? 'bg-white text-[#075985] shadow-sm ring-1 ring-[#D5E8F3] dark:bg-white/10 dark:text-blue-100 dark:ring-white/10' : '', collapsed && 'justify-center px-0' ) @@ -270,6 +270,16 @@ function cleanHistorySessionLabel(label: string): string { .trim(); } +function hasMeaningfulHistoryLabel(label: string, sessionKey: string): boolean { + return Boolean( + label + && label !== sessionKey + && label !== 'main' + && !label.startsWith('agent:') + && !/^session-\d+$/i.test(label), + ); +} + function NavGroupLabel({ children, collapsed }: { children: React.ReactNode; collapsed?: boolean }) { if (collapsed) return
; return ( @@ -347,38 +357,17 @@ export function Sidebar() { const [sessionToDelete, setSessionToDelete] = useState<{ key: string; label: string } | null>(null); const [nowMs, setNowMs] = useState(INITIAL_NOW_MS); const [historyOpen, setHistoryOpen] = useState(false); - const [activeHistoryAccount, setActiveHistoryAccount] = useState(''); + const [historySearch, setHistorySearch] = useState(''); + const [historyFilter, setHistoryFilter] = useState(HISTORY_FILTER_ALL); const [localPrefsVersion, setLocalPrefsVersion] = useState(0); - const historyCloseTimerRef = useRef(null); const formatRelativeHistoryTime = (activityMs: number) => formatHistoryTime(activityMs, nowMs, t, i18n.language); - const openHistoryPopover = () => { - if (historyCloseTimerRef.current) { - window.clearTimeout(historyCloseTimerRef.current); - historyCloseTimerRef.current = null; - } - setHistoryOpen(true); - }; - - const scheduleHistoryPopoverClose = () => { - if (historyCloseTimerRef.current) { - window.clearTimeout(historyCloseTimerRef.current); - } - historyCloseTimerRef.current = window.setTimeout(() => { - setHistoryOpen(false); - historyCloseTimerRef.current = null; - }, 180); - }; - useEffect(() => { const timer = window.setInterval(() => { setNowMs(Date.now()); }, 60 * 1000); return () => { window.clearInterval(timer); - if (historyCloseTimerRef.current) { - window.clearTimeout(historyCloseTimerRef.current); - } }; }, []); @@ -392,10 +381,8 @@ export function Sidebar() { return left - right; }), [sessionLastActivity, sessions]); - const historyChannels = useMemo(() => { - const groups = new Map(); - - for (const session of sortedSessions) { + const historyItems = useMemo(() => ( + sortedSessions.flatMap((session) => { const source = getSessionSource(session); const channelLabel = t(`chat:historyChannels.${source.channelKey}`, { defaultValue: source.channelLabel }); const accountLabel = source.channelKey === 'chat' @@ -405,107 +392,129 @@ export function Sidebar() { : source.accountKey === 'default' ? t('chat:historyAccounts.default') : source.accountLabel; - const channel = groups.get(source.channelKey) ?? { - key: source.channelKey, - label: channelLabel, - accounts: [], - sessions: [], - latestAt: 0, - }; const latestAt = sessionLastActivity[session.key] ?? session.updatedAt ?? 0; - const accountGroupKey = `${source.channelKey}:${source.accountKey}`; - let account = channel.accounts.find((item) => item.key === accountGroupKey); - if (!account) { - account = { - key: accountGroupKey, - channelKey: source.channelKey, - channelLabel, - accountKey: source.accountKey, - accountLabel, - sessions: [], - latestAt: 0, - }; - channel.accounts.push(account); + const label = getSessionLabel(session.key, session.displayName, session.label); + if ( + session.key === INTERNAL_OPENCLAW_MAIN_SESSION_KEY + && !hasMeaningfulHistoryLabel(label, session.key) + ) { + return []; } - account.sessions.push(session); - account.latestAt = Math.max(account.latestAt, latestAt); - channel.sessions.push(session); - channel.latestAt = Math.max(channel.latestAt, latestAt); - groups.set(source.channelKey, channel); - } + const translatedSource: HistorySessionSource = { + ...source, + channelLabel, + accountLabel, + }; + return [{ + session, + source: translatedSource, + label, + activityMs: latestAt, + searchText: [ + label, + session.key, + channelLabel, + accountLabel, + source.accountKey, + source.channelKey, + ].join(' ').toLowerCase(), + }]; + }) + ), [getSessionLabel, localPrefsVersion, sessionLastActivity, sortedSessions, t]); - const channelGroups = [...groups.values()].sort((a, b) => { - if (a.key === 'chat') return -1; - if (b.key === 'chat') return 1; - return b.latestAt - a.latestAt; - }); - channelGroups.forEach((channel) => { - channel.accounts.sort((a, b) => { - if (a.accountKey === 'desktop' || a.accountKey === 'default') return -1; - if (b.accountKey === 'desktop' || b.accountKey === 'default') return 1; - return b.latestAt - a.latestAt; + const historySearchQuery = historySearch.trim().toLowerCase(); + const visibleHistoryItems = useMemo(() => historyItems.filter((item) => { + const channelKey = item.source.channelKey; + const matchesFilter = historyFilter === HISTORY_FILTER_ALL + ? true + : historyFilter === HISTORY_FILTER_CHAT + ? channelKey === 'chat' + : historyFilter === HISTORY_FILTER_CRON + ? channelKey === 'cron' + : historyFilter === HISTORY_FILTER_CHANNELS + ? channelKey !== 'chat' && channelKey !== 'cron' + : false; + if (!matchesFilter) return false; + if (!historySearchQuery) return true; + return item.searchText.includes(historySearchQuery); + }), [historyFilter, historyItems, historySearchQuery]); + + const historyFilterOptions = useMemo>(() => { + const chatItems = historyItems.filter((item) => item.source.channelKey === 'chat'); + const cronItems = historyItems.filter((item) => item.source.channelKey === 'cron'); + const channelItems = historyItems.filter((item) => item.source.channelKey !== 'chat' && item.source.channelKey !== 'cron'); + + const latestAll = historyItems.reduce((latest, item) => Math.max(latest, item.activityMs), 0); + const options: Array<{ key: HistoryFilterKey; label: string; count: number; latestAt: number }> = [{ + key: HISTORY_FILTER_ALL, + label: t('chat:history.filters.all'), + count: historyItems.length, + latestAt: latestAll, + }]; + if (chatItems.length > 0) { + options.push({ + key: HISTORY_FILTER_CHAT, + label: t('chat:history.filters.desktop'), + count: chatItems.length, + latestAt: Math.max(...chatItems.map((item) => item.activityMs)), }); - }); - return channelGroups; - }, [localPrefsVersion, sessionLastActivity, sortedSessions, t]); - - const historyAccountGroups = useMemo( - () => historyChannels.flatMap((channel) => channel.accounts), - [historyChannels], - ); + } + if (channelItems.length > 0) { + options.push({ + key: HISTORY_FILTER_CHANNELS, + label: t('chat:history.filters.channels'), + count: channelItems.length, + latestAt: Math.max(...channelItems.map((item) => item.activityMs)), + }); + } + if (cronItems.length > 0) { + options.push({ + key: HISTORY_FILTER_CRON, + label: t('chat:history.filters.cron'), + count: cronItems.length, + latestAt: Math.max(...cronItems.map((item) => item.activityMs)), + }); + } + return options; + }, [historyItems, t]); useEffect(() => { - if (!historyAccountGroups.length) { - if (activeHistoryAccount) setActiveHistoryAccount(''); - return; + if (historyFilterOptions.length === 0) return; + if (!historyFilterOptions.some((option) => option.key === historyFilter)) { + setHistoryFilter(historyFilterOptions[0].key); } - if (!historyAccountGroups.some((account) => account.key === activeHistoryAccount)) { - setActiveHistoryAccount(historyAccountGroups[0].key); - } - }, [activeHistoryAccount, historyAccountGroups]); + }, [historyFilter, historyFilterOptions]); - const activeHistoryGroup = historyAccountGroups.find((account) => account.key === activeHistoryAccount) - ?? historyAccountGroups[0]; - const activeHistorySessions = activeHistoryGroup?.sessions - ?? []; const sessionBuckets = useMemo(() => { - const buckets: Array<{ key: SessionBucketKey; label: string; sessions: ChatSession[] }> = [ - { key: 'today', label: t('chat:historyBuckets.today'), sessions: [] }, - { key: 'yesterday', label: t('chat:historyBuckets.yesterday'), sessions: [] }, - { key: 'withinWeek', label: t('chat:historyBuckets.withinWeek'), sessions: [] }, - { key: 'withinTwoWeeks', label: t('chat:historyBuckets.withinTwoWeeks'), sessions: [] }, - { key: 'withinMonth', label: t('chat:historyBuckets.withinMonth'), sessions: [] }, - { key: 'older', label: t('chat:historyBuckets.older'), sessions: [] }, + const buckets: Array<{ key: SessionBucketKey; label: string; items: HistoryListItem[] }> = [ + { key: 'today', label: t('chat:historyBuckets.today'), items: [] }, + { key: 'yesterday', label: t('chat:historyBuckets.yesterday'), items: [] }, + { key: 'withinWeek', label: t('chat:historyBuckets.withinWeek'), items: [] }, + { key: 'withinTwoWeeks', label: t('chat:historyBuckets.withinTwoWeeks'), items: [] }, + { key: 'withinMonth', label: t('chat:historyBuckets.withinMonth'), items: [] }, + { key: 'older', label: t('chat:historyBuckets.older'), items: [] }, ]; const bucketMap = Object.fromEntries(buckets.map((bucket) => [bucket.key, bucket])) as Record< SessionBucketKey, (typeof buckets)[number] >; - for (const session of activeHistorySessions) { - const bucketKey = getSessionBucket(sessionLastActivity[session.key] ?? session.updatedAt ?? 0, nowMs); - bucketMap[bucketKey].sessions.push(session); + for (const item of visibleHistoryItems) { + const bucketKey = getSessionBucket(item.activityMs, nowMs); + bucketMap[bucketKey].items.push(item); } return buckets; - }, [activeHistorySessions, nowMs, sessionLastActivity, t]); + }, [nowMs, t, visibleHistoryItems]); const hiddenRoutes = rendererExtensionRegistry.getHiddenRoutes(); const extraNavItems = rendererExtensionRegistry.getExtraNavItems(); - const openLatestSession = () => { - const latestSession = activeHistorySessions[0] ?? sortedSessions[0]; - if (latestSession) { - switchSession(latestSession.key); - } - navigate('/chat'); - }; - const navGroups = [ { label: t('common:sidebar.quickUse'), items: [ - { to: '/skills', icon: , label: t('common:sidebar.skills'), testId: 'sidebar-nav-skills' }, + { to: '/app-center', icon: , label: t('common:sidebar.appCenter'), testId: 'sidebar-nav-app-center' }, { to: '/cron', icon: , label: t('common:sidebar.cronTasks'), testId: 'sidebar-nav-cron' }, { to: '/knowledge', icon: , label: t('common:sidebar.knowledge'), testId: 'sidebar-nav-knowledge' }, ], @@ -528,10 +537,11 @@ export function Sidebar() { })).filter((item) => !hiddenRoutes.has(item.to)); return ( + <>
)} @@ -698,22 +705,23 @@ export function Sidebar() {
)} - {historyOpen && ( -
-
-
- -
-
-
{t('chat:history.title')}
-
{t('chat:history.subtitle')}
-
-
- -
-
- {historyChannels.length === 0 ? ( -
- {t('chat:history.noChannels')} -
- ) : ( -
- {historyChannels.map((channel) => ( -
account.key === activeHistoryAccount) - ? 'border-[#1E3A8A]/25' - : 'border-slate-200 dark:border-white/10', - )} - > - -
- {channel.accounts.map((account) => ( - - ))} -
-
- ))} -
- )} -
- -
-
-
- {activeHistoryGroup ? ( -
- - {activeHistoryGroup.channelLabel} - - / - - {activeHistoryGroup.accountLabel} - -
- ) : ( -
{t('chat:history.title')}
- )} -
- {t('chat:history.sessionCount', { count: activeHistorySessions.length })} - {activeHistoryGroup?.latestAt ? ` · ${t('chat:history.recentPrefix')} ${formatRelativeHistoryTime(activeHistoryGroup.latestAt)}` : ''} -
-
-
- - {sessions.length === 0 ? ( -
- {t('chat:history.noSessions')} -
- ) : activeHistorySessions.length === 0 ? ( -
- {t('chat:history.noAccountSessions')} -
- ) : ( -
- {sessionBuckets.map((bucket) => ( - bucket.sessions.length > 0 ? ( -
-
- {bucket.label} -
-
- {bucket.sessions.map((s) => { - const sessionSource = getSessionSource(s); - return ( -
- - -
- ); - })} -
-
- ) : null - ))} -
- )} -
-
-
- )} {/* Footer */}
@@ -937,9 +737,9 @@ export function Sidebar() { data-testid="sidebar-nav-settings" className={({ isActive }) => cn( - 'flex items-center gap-2.5 rounded-lg px-2.5 py-2 text-[14px] font-medium transition-colors', - 'hover:bg-slate-100 dark:hover:bg-white/5 text-foreground/80', - isActive && 'bg-[#1E3A8A]/10 text-[#1E3A8A] dark:bg-[#1E3A8A]/30 dark:text-blue-100', + 'flex items-center gap-2.5 rounded-lg px-2.5 py-2 text-[14px] font-medium transition-all duration-200', + 'hover:bg-white/70 dark:hover:bg-white/5 text-foreground/80', + isActive && 'bg-white text-[#075985] shadow-sm ring-1 ring-[#D5E8F3] dark:bg-[#1E3A8A]/30 dark:text-blue-100 dark:ring-white/10', sidebarCollapsed ? 'justify-center px-0' : '' ) } @@ -994,5 +794,151 @@ export function Sidebar() { onCancel={() => setSessionToDelete(null)} /> + + {historyOpen && ( + + )} + ); } diff --git a/src/components/layout/TitleBar.tsx b/src/components/layout/TitleBar.tsx index 2308b0d..f87ea83 100644 --- a/src/components/layout/TitleBar.tsx +++ b/src/components/layout/TitleBar.tsx @@ -14,7 +14,7 @@ export function TitleBar() { if (platform === 'darwin') { // macOS: just a drag region, traffic lights are native - return
; + return
; } // Linux keeps the native frame/title bar for better IME compatibility. @@ -52,7 +52,7 @@ function WindowsTitleBar() { }; return ( -
+
智念助手
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index 1f976c5..30e49b5 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -9,24 +9,24 @@ import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '@/lib/utils'; const buttonVariants = cva( - 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + 'inline-flex cursor-pointer items-center justify-center whitespace-nowrap rounded-lg text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#0369A1]/25 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', { variants: { variant: { - default: 'bg-primary text-primary-foreground hover:bg-primary/90', + default: 'bg-[#0369A1] text-white shadow-[0_10px_22px_rgba(3,105,161,0.16)] hover:bg-[#075985]', destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90', outline: - 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', + 'border border-slate-200/80 bg-white/70 shadow-none hover:bg-white hover:text-accent-foreground dark:border-white/10 dark:bg-white/5 dark:hover:bg-white/10', secondary: - 'bg-secondary text-secondary-foreground hover:bg-secondary/80', - ghost: 'hover:bg-accent hover:text-accent-foreground', + 'bg-[#EAF5FA] text-[#075985] hover:bg-[#DDF0F8] dark:bg-white/10 dark:text-blue-100 dark:hover:bg-white/20', + ghost: 'hover:bg-slate-900/[0.05] hover:text-accent-foreground dark:hover:bg-white/10', link: 'text-primary underline-offset-4 hover:underline', }, size: { default: 'h-10 px-4 py-2', - sm: 'h-9 rounded-md px-3', - lg: 'h-11 rounded-md px-8', + sm: 'h-9 rounded-lg px-3', + lg: 'h-11 rounded-lg px-8', icon: 'h-10 w-10', }, }, diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index 64cefd9..7ca50c9 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -13,7 +13,7 @@ const Input = React.forwardRef( +
{Icon && } {label} @@ -136,7 +136,7 @@ export function YinianListItem({ return (
state.init); + const items = useAppCenterStore((state) => state.items); + const selectedTagKey = useAppCenterStore((state) => state.selectedTagKey); + const selectTag = useAppCenterStore((state) => state.selectTag); + + useEffect(() => { + init(); + }, [init]); + + const categoryCounts = useMemo(() => { + const counts = new Map(); + for (const item of items) { + counts.set(item.categoryKey, (counts.get(item.categoryKey) ?? 0) + 1); + } + return [...counts.entries()]; + }, [items]); + const filteredItems = useMemo(() => ( + selectedTagKey === 'all' + ? items + : items.filter((item) => item.tagKeys.includes(selectedTagKey)) + ), [items, selectedTagKey]); + + const openItem = (item: AppCenterItem) => { + if (item.type === 'external' && item.url) { + void window.electron.openExternal(item.url); + return; + } + if (item.type === 'native' && item.route) { + navigate(item.route); + return; + } + if (item.type === 'webview' && item.url) { + void window.electron.openExternal(item.url); + } + }; + + return ( + + +
+

+ {t('title')} +

+

+ {t('subtitle')} +

+
+
+ +
+ +
+
+
+ + {categoryCounts.map(([categoryKey, count]) => { + const tagKey = categoryKey.replace('categories.', 'tags.'); + return ( + + ); + })} +
+
+ +
+
+ {filteredItems.map((item) => { + const Icon = getAppIcon(item.icon); + return ( + + ); + })} +
+
+
+
+
+
+ ); +} + +export default AppCenter; diff --git a/src/pages/Channels/index.tsx b/src/pages/Channels/index.tsx index ce1a6d7..7e8c873 100644 --- a/src/pages/Channels/index.tsx +++ b/src/pages/Channels/index.tsx @@ -568,11 +568,11 @@ export function Channels({ embedded = false }: ChannelsProps) {

{t('refresh')} @@ -685,7 +685,7 @@ export function Channels({ embedded = false }: ChannelsProps) { {showDiagnostics && diagnosticsText && (

{t('health.diagnosticsTitle')}

-
+                  
                     {diagnosticsText}
                   
@@ -709,10 +709,10 @@ export function Channels({ embedded = false }: ChannelsProps) {

{configuredGroups.map((group) => ( -
+
-
+
@@ -789,7 +789,7 @@ export function Channels({ embedded = false }: ChannelsProps) { ); const hasRemark = effectiveDisplayName !== displayName; return ( -
+
@@ -907,10 +907,10 @@ export function Channels({ embedded = false }: ChannelsProps) { setShowConfigModal(true); }} className={cn( - 'group flex items-start gap-4 p-4 rounded-2xl transition-all text-left border relative overflow-hidden bg-transparent border-transparent hover:bg-black/5 dark:hover:bg-white/5' + 'group relative flex items-start gap-4 overflow-hidden rounded-lg border border-slate-200/70 bg-white/60 p-4 text-left transition-all hover:-translate-y-0.5 hover:border-[#7DBADB] hover:bg-white hover:shadow-[0_16px_36px_rgba(15,23,42,0.07)] dark:border-white/10 dark:bg-white/5 dark:hover:bg-white/10' )} > -
+
@@ -968,8 +968,8 @@ export function Channels({ embedded = false }: ChannelsProps) { )} {remarkTarget && ( -
-
+
+

编辑账户备注

diff --git a/src/pages/Chat/ChatInput.tsx b/src/pages/Chat/ChatInput.tsx index ae5791b..f662ac5 100644 --- a/src/pages/Chat/ChatInput.tsx +++ b/src/pages/Chat/ChatInput.tsx @@ -6,7 +6,7 @@ * Files are staged to disk via IPC — only lightweight path references * are sent with the message (no base64 over WebSocket). */ -import { useState, useRef, useEffect, useCallback } from 'react'; +import { useState, useRef, useEffect, useCallback, useMemo } from 'react'; import { Check, ChevronDown, SendHorizontal, Square, X, Paperclip, FileText, Film, Music, FileArchive, File, Loader2, BookOpen } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; @@ -14,6 +14,7 @@ import { hostApiFetch } from '@/lib/host-api'; import { invokeIpc } from '@/lib/api-client'; import { cn } from '@/lib/utils'; import { useGatewayStore } from '@/stores/gateway'; +import { useQuickTasksStore, type QuickTaskConfig } from '@/stores/quick-tasks'; import { useTranslation } from 'react-i18next'; // ── Types ──────────────────────────────────────────────────────── @@ -44,7 +45,12 @@ interface ChatInputProps { text: string, attachments?: FileAttachment[], targetAgentId?: string | null, - options?: { useKnowledgeBase?: boolean; workspaceId?: string; selectedKnowledgeDocumentIds?: string[] }, + options?: { + useKnowledgeBase?: boolean; + workspaceId?: string; + selectedKnowledgeDocumentIds?: string[]; + quickTaskContext?: { taskNames: string[]; skillIds: string[]; prompt: string }; + }, ) => void; onStop?: () => void; disabled?: boolean; @@ -96,6 +102,21 @@ function readFileAsBase64(file: globalThis.File): Promise { }); } +function buildQuickTaskPrompt(tasks: QuickTaskConfig[]): string { + return tasks + .map((task) => { + const skillNames = task.skills + .map((skill) => skill.name.trim()) + .filter(Boolean); + const triggerNames = skillNames.length > 0 ? skillNames : [task.name.trim()].filter(Boolean); + return triggerNames + .map((skillName) => `使用${skillName} skill`) + .join(' '); + }) + .filter(Boolean) + .join(' '); +} + // ── Component ──────────────────────────────────────────────────── export function ChatInput({ @@ -112,11 +133,26 @@ export function ChatInput({ const [attachments, setAttachments] = useState([]); const [knowledgePickerOpen, setKnowledgePickerOpen] = useState(false); const [selectedKnowledgeIds, setSelectedKnowledgeIds] = useState([]); + const [selectedQuickTaskIds, setSelectedQuickTaskIds] = useState([]); const textareaRef = useRef(null); const knowledgePickerRef = useRef(null); const isComposingRef = useRef(false); + const quickTaskPromptRef = useRef(''); const gatewayStatus = useGatewayStore((s) => s.status); + const quickTasks = useQuickTasksStore((state) => state.tasks); const knowledgeBaseAvailable = knowledgeDocuments.length > 0; + const composerQuickTasks = useMemo( + () => quickTasks.filter((task) => task.enabled && task.showInComposer), + [quickTasks], + ); + const selectedQuickTasks = useMemo( + () => composerQuickTasks.filter((task) => selectedQuickTaskIds.includes(task.id)), + [composerQuickTasks, selectedQuickTaskIds], + ); + const selectedQuickTaskPrompt = useMemo( + () => buildQuickTaskPrompt(selectedQuickTasks), + [selectedQuickTasks], + ); const selectedKnowledgeDocuments = knowledgeDocuments.filter((doc) => selectedKnowledgeIds.includes(doc.id)); // Auto-resize textarea @@ -141,6 +177,34 @@ export function ChatInput({ }); }, [knowledgeDocuments]); + useEffect(() => { + setSelectedQuickTaskIds((current) => { + const next = current.filter((id) => composerQuickTasks.some((task) => task.id === id)); + return next.length === current.length ? current : next; + }); + }, [composerQuickTasks]); + + useEffect(() => { + const previousPrompt = quickTaskPromptRef.current; + const nextPrompt = selectedQuickTaskPrompt.trim(); + if (previousPrompt === nextPrompt) return; + + setInput((current) => { + let body = current; + if (previousPrompt) { + if (body === previousPrompt) { + body = ''; + } else if (body.startsWith(`${previousPrompt} `)) { + body = body.slice(previousPrompt.length + 1); + } else if (body.startsWith(`${previousPrompt}\n\n`)) { + body = body.slice(previousPrompt.length + 2); + } + } + return body.trimStart(); + }); + quickTaskPromptRef.current = nextPrompt; + }, [selectedQuickTaskPrompt]); + useEffect(() => { if (!knowledgePickerOpen) return; const handlePointerDown = (event: MouseEvent) => { @@ -288,7 +352,7 @@ export function ChatInput({ const allReady = attachments.length === 0 || attachments.every(a => a.status === 'ready'); const hasFailedAttachments = attachments.some((a) => a.status === 'error'); - const canSend = (input.trim() || attachments.length > 0) && allReady && !disabled && !sending; + const canSend = (input.trim() || attachments.length > 0 || selectedQuickTasks.length > 0) && allReady && !disabled && !sending; const canStop = sending && !disabled && !!onStop; const handleSend = useCallback(() => { @@ -296,7 +360,7 @@ export function ChatInput({ const readyAttachments = attachments.filter(a => a.status === 'ready'); // Capture values before clearing — clear input immediately for snappy UX, // but keep attachments available for the async send - const textToSend = input.trim(); + const textToSend = [selectedQuickTaskPrompt, input.trim()].filter(Boolean).join(' '); const attachmentsToSend = readyAttachments.length > 0 ? readyAttachments : undefined; console.log(`[handleSend] text="${textToSend.substring(0, 50)}", attachments=${attachments.length}, ready=${readyAttachments.length}, sending=${!!attachmentsToSend}`); if (attachmentsToSend) { @@ -305,6 +369,9 @@ export function ChatInput({ stagedPath: a.stagedPath, status: a.status, hasPreview: !!a.preview, }))); } + if (selectedQuickTasks.length > 0) { + console.log('[handleSend] Quick task prompt:', selectedQuickTaskPrompt); + } setInput(''); setAttachments([]); if (textareaRef.current) { @@ -316,7 +383,9 @@ export function ChatInput({ selectedKnowledgeDocumentIds: selectedKnowledgeIds, }); setKnowledgePickerOpen(false); - }, [input, attachments, canSend, onSend, selectedKnowledgeIds, workspaceId]); + setSelectedQuickTaskIds([]); + quickTaskPromptRef.current = ''; + }, [input, attachments, canSend, onSend, selectedKnowledgeIds, workspaceId, selectedQuickTasks, selectedQuickTaskPrompt]); const handleStop = useCallback(() => { if (!canStop) return; @@ -345,6 +414,14 @@ export function ChatInput({ )); }, []); + const toggleQuickTask = useCallback((id: string) => { + setSelectedQuickTaskIds((current) => ( + current.includes(id) + ? [] + : [id] + )); + }, []); + // Handle paste (Ctrl/Cmd+V with files) const handlePaste = useCallback( (e: React.ClipboardEvent) => { @@ -417,8 +494,45 @@ export function ChatInput({

)} + {composerQuickTasks.length > 0 && ( +
+ {composerQuickTasks.map((task) => { + const selected = selectedQuickTaskIds.includes(task.id); + const skillNames = task.skills.map((skill) => skill.name).filter(Boolean).join('、') || task.name; + return ( +
+ +
+
{task.name}
+
+ {task.description || t('composer.quickTaskHelp')} +
+ {skillNames && ( +
+ {skillNames} +
+ )} +
+
+ ); + })} +
+ )} + {/* Input Container */} -
+
{selectedKnowledgeDocuments.length > 0 && (
{selectedKnowledgeDocuments.map((doc) => ( @@ -426,7 +540,7 @@ export function ChatInput({ key={doc.id} type="button" onClick={() => toggleKnowledgeDocument(doc.id)} - className="inline-flex max-w-[220px] items-center gap-1.5 rounded-lg border border-[#1E3A8A]/20 bg-[#1E3A8A]/5 px-2.5 py-1 text-[13px] font-medium text-foreground transition-colors hover:bg-[#1E3A8A]/10" + className="inline-flex max-w-[220px] items-center gap-1.5 rounded-lg border border-[#7DBADB]/70 bg-[#EAF5FA] px-2.5 py-1 text-[13px] font-medium text-foreground transition-colors hover:bg-[#DDF0F8]" title={doc.name} > @@ -438,24 +552,34 @@ export function ChatInput({ )} {/* Text Row — flush-left */} -