{"id":"9daf0800-bbe3-46ce-9388-9960b5e56584","entityType":"agent","slug":"clawhub-jincocodev-jarvis-ui","name":"JARVIS UI","canonicalUrl":"https://www.xpersona.co/agent/clawhub-jincocodev-jarvis-ui","canonicalPath":"/agent/clawhub-jincocodev-jarvis-ui","generatedAt":"2026-10-10T23:46:14.390Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T19:57:34.064Z","emptyReason":null},"description":"JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spec... Skill: JARVIS UI Owner: jincocodev Summary: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spec... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-02-22T09:15:58.198Z | user Add gateway device identity support v1.0.2 | 2026-02-22T09:12:23.098Z | user Add gateway device identity support v1.0.1 | 2026-02-16T16:56","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17er8w7gmbe11hqhrd45e1abs885r1f:jarvis-ui","sourceUrl":"https://clawhub.ai/jincocodev/jarvis-ui","homepage":"https://clawhub.ai/jincocodev/skills/jarvis-ui","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/jincocodev/jarvis-ui","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/jincocodev/skills/jarvis-ui","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spec..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T19:57:34.064Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T19:57:34.064Z","emptyReason":null},"stars":null,"forks":null,"downloads":1274,"packageName":null,"latestVersion":"1.0.3","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T19:57:33.988Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T19:57:34.064Z","lastCrawledAt":"2026-10-10T19:57:33.988Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T19:57:33.988Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.3","createdAt":"2026-02-22T09:15:58.198Z","changelog":"Add gateway device identity support","fileCount":56,"zipByteSize":147427},{"version":"1.0.2","createdAt":"2026-02-22T09:12:23.098Z","changelog":"Add gateway device identity support","fileCount":56,"zipByteSize":147425},{"version":"1.0.1","createdAt":"2026-02-16T16:56:37.106Z","changelog":"Include demo audio tracks","fileCount":56,"zipByteSize":145055},{"version":"1.0.0","createdAt":"2026-02-16T16:46:59.995Z","changelog":"Initial release of JARVIS UI for OpenClaw agents. - Interactive Three.js orb visualizes agent state (thinking, speaking, idle) - Real-time chat with Gateway WebSocket integration - Audio spectrum analyzer with multiple visualization modes - System monitor and live model usage stats - Edge TTS (free, cross-platform) and macOS speech synthesis support - Mobile responsive layout and PWA support - Easy config and production-ready deployment instructions","fileCount":59,"zipByteSize":178508}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17er8w7gmbe11hqhrd45e1abs885r1f:jarvis-ui","setupComplexity":"low","setupSteps":["Node.js workspace detected. Install dependencies securely: run `npm ci --ignore-scripts` to prevent post-install lifecycle triggers from running arbitrary code, then selectively audit the dependency tree.","Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T23:46:14.387Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jincocodev-jarvis-ui/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T19:57:34.064Z","emptyReason":null},"readme":"Skill: JARVIS UI\n\nOwner: jincocodev\n\nSummary: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spec...\n\nTags: latest:1.0.3\n\nVersion history:\n\nv1.0.3 | 2026-02-22T09:15:58.198Z | user\n\nAdd gateway device identity support\n\nv1.0.2 | 2026-02-22T09:12:23.098Z | user\n\nAdd gateway device identity support\n\nv1.0.1 | 2026-02-16T16:56:37.106Z | user\n\nInclude demo audio tracks\n\nv1.0.0 | 2026-02-16T16:46:59.995Z | auto\n\nInitial release of JARVIS UI for OpenClaw agents.\n\n- Interactive Three.js orb visualizes agent state (thinking, speaking, idle)\n- Real-time chat with Gateway WebSocket integration\n- Audio spectrum analyzer with multiple visualization modes\n- System monitor and live model usage stats\n- Edge TTS (free, cross-platform) and macOS speech synthesis support\n- Mobile responsive layout and PWA support\n- Easy config and production-ready deployment instructions\n\nArchive index:\n\nArchive v1.0.3: 56 files, 147427 bytes\n\nFiles: assets/fonts/thegoodmonolith.css (180b), config.json (464b), index.html (17178b), package.json (1314b), public/humans.txt (472b), public/manifest.json (450b), public/sw.js (770b), public/vendor/gsap/Draggable.min.js (35497b), public/vendor/gsap/gsap.min.js (72435b), public/vendor/gsap/InertiaPlugin.min.js (7288b), public/vendor/gsap/Physics2DPlugin.min.js (2243b), README.md (7051b), server/gateway.js (12482b), server/index.js (2928b), server/routes/chat.js (3502b), server/routes/memory.js (2470b), server/routes/schedule.js (2739b), server/routes/skills.js (3137b), server/routes/status.js (2033b), server/routes/tasks.js (2512b), server/routes/tts-routes.js (700b), server/routes/voice.js (5024b), server/sse.js (1693b), server/system-monitor.js (2149b), server/tts.js (4437b), setup.sh (2600b), SKILL.md (2108b), src/components/chat.js (24207b), src/components/controls.js (7584b), src/components/draggable.js (4144b), src/components/markdown.js (4403b), src/components/memory.js (3323b), src/components/mobile-toolbar.js (2460b), src/components/notifications.js (310b), src/components/orb-messages.js (5658b), src/components/powersave.js (1550b), src/components/preloader.js (2109b), src/components/schedule.js (8608b), src/components/skills.js (4456b), src/components/spectrum.js (7516b), src/components/system-monitor.js (3164b), src/components/tabs.js (645b), src/components/tasks.js (11494b), src/components/thought-stream.js (3989b), src/components/timestamp.js (493b), src/components/voice.js (6212b), src/config/agent.json (2051b), src/config/config-loader.js (776b), src/config/theme.js (3578b), src/core/audio.js (12121b), src/core/particles.js (3099b), src/core/scene.js (21387b), src/main.js (7745b), style.css (52711b), vite.config.js (316b), _meta.json (128b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: jarvis-ui\ndescription: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spectrum analyzer, system monitor, and TTS. Use when you want a visual dashboard for your OpenClaw agent.\nmetadata: {\"openclaw\":{\"emoji\":\"🦾\",\"version\":\"1.0.3\",\"requires\":{\"bins\":[\"node\",\"npm\"]},\"homepage\":\"https://github.com/jincocodev/openclaw-jarvis-ui\"}}\n---\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD interface for your OpenClaw agent.\n\n## Install\n\n```bash\n./setup.sh\n```\n\nGateway token is auto-detected from `~/.openclaw/openclaw.json`.\n\n> **⚠️ Remote/non-localhost access:** If JARVIS server is accessed from a different machine (not localhost), add this to your `~/.openclaw/openclaw.json`:\n> ```json\n> { \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n> ```\n> Then restart OpenClaw Gateway.\n\nThen start:\n\n```bash\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n## Customize\n\nCopy and edit `config.local.json`:\n\n```bash\ncp config.json config.local.json\n```\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `name` | Page title | JARVIS |\n| `agent.name` | Agent display name | JARVIS |\n| `agent.emoji` | Agent emoji | 🤖 |\n| `agent.sessionKey` | OpenClaw session key | agent:main:main |\n| `server.port` | Server port | 9999 |\n| `tts.voice` | macOS TTS voice | Samantha |\n\n## Production\n\n```bash\nnpm i -g pm2\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Features\n\n- 🔮 Three.js orb — reacts to agent state (thinking/speaking/idle)\n- 💬 Real-time chat — Gateway WebSocket relay\n- 🎵 Audio visualizer — spectrum, ring, waveform\n- 📊 Model status — live token usage, model info\n- 🖥️ System monitor — CPU, memory, uptime\n- 🗣️ TTS — Edge TTS (free, cross-platform) + macOS `say` (offline)\n- 📱 Mobile responsive + PWA\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (`pip install edge-tts`) for TTS\n- ffmpeg (optional, macOS `say` engine only)\n\nFile v1.0.3:README.md\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD dashboard for [OpenClaw](https://github.com/openclaw/openclaw) agents.\n\nInteractive 3D orb that visualizes your agent's state in real-time — thinking, responding, idle — with live chat, system monitoring, and audio visualization.\n\n![JARVIS UI Preview](assets/images/desktop-red.png)\n\n### Theme Variants\n\n| Cyan | Green |\n|------|-------|\n| ![Cyan Theme](assets/images/theme-cyan.png) | ![Green Theme](assets/images/theme-green.png) |\n\n### Mobile\n\n<img src=\"assets/images/mobile.png\" alt=\"Mobile UI\" width=\"300\">\n\n## Features\n\n### 🔮 3D Orb\nInteractive Three.js orb with real-time agent state visualization. Shows **IDLE**, **THINKING**, or **RESPONDING** status with color-coded text. Draggable, audio-reactive, with orbiting particle system.\n\n### 💬 Live Chat\nReal-time streaming chat via OpenClaw Gateway WebSocket.\n- Markdown rendering (code blocks, links, lists)\n- Chat history — loads previous conversations on page load (configurable: 20/50/100/200 messages)\n- File upload — drag & drop, paperclip button, or Ctrl+V paste for images\n- Bubble-style UI with timestamps and sender labels\n\n### 📊 System Monitor\nLive system metrics pushed via SSE.\n- CPU usage, memory, uptime\n- Current model name and token count\n- Auto-updating, no polling\n\n### 🎵 Audio Visualizer\nThree-layer audio visualization that reacts to TTS playback:\n- **Spectrum** — frequency bar graph\n- **Ring** — concentric circles that pulse with audio\n- **Waveform** — oscilloscope-style wave display\n\n### 📋 Task Manager\nFull CRUD task board with real-time sync.\n- Priority levels, progress tracking, tags\n- Persistent storage (server-side JSON)\n- SSE push — updates appear instantly across tabs\n\n### 🧠 Memory Timeline\nDisplays daily topics extracted from your agent's `memory/*.md` files.\n- Shows `##` headings as topic entries per day\n- Collapsible days, TODAY/YESTERDAY labels\n- \"More\" button to load older entries (7 days at a time)\n\n### ⏰ Schedule\nView and control your agent's scheduled tasks.\n- **Heartbeat** — shows system heartbeat status and interval\n- **Cron Jobs** — toggle enable/disable directly from the UI\n\n### 🔧 Skills Browser\nScans and displays all installed skills (workspace + global).\n\n### 🗣️ TTS (Text-to-Speech)\nDual engine support:\n- **Edge TTS** (default) — free, 300+ voices, multilingual\n- **macOS `say`** — offline fallback, requires ffmpeg\n- Switchable from the Controls panel\n\n### 🎨 Theme System\nOne-click color scheme switching via HSL hue rotation.\n- 6-color palette in Controls panel (red, orange, green, cyan, blue, purple)\n- Affects entire UI: panels, orb, particles, spectrum, background\n- Persisted in localStorage\n\n### ⚡ Power Save Mode\nReduce resource usage for background monitoring.\n- Throttles render from 60fps to 15fps\n- Disables background animations, particles, scan lines\n- Toggle from Controls panel, persisted in localStorage\n\n### 📱 Mobile Ready\nResponsive UI with touch gestures.\n- Swipe up/down on chat header for fullscreen/collapse\n- Floating toolbar for quick panel access\n- PWA — installable as a home screen app\n\n## Quick Start\n\n### From ClawHub\n```bash\nnpx clawhub install jarvis-ui\ncd skills/jarvis-ui\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js\n```\n\n### From GitHub\n```bash\ngit clone https://github.com/jincocodev/openclaw-jarvis-ui.git\ncd openclaw-jarvis-ui\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n### ⚠️ Remote Access (non-localhost)\n\nIf running JARVIS on a remote server (not localhost), OpenClaw Gateway requires a secure context. Add this to `~/.openclaw/openclaw.json`:\n\n```json\n{ \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n```\n\nThen restart the Gateway: `openclaw gateway restart`\n\n## Get Your Gateway Token\n\n`setup.sh` auto-detects your token from `~/.openclaw/openclaw.json`. If auto-detection fails, set it manually:\n\n```bash\necho \"GATEWAY_TOKEN=your_token\" > .env\n```\n\nFind your token: run `openclaw status` or check `~/.openclaw/openclaw.json` → `gateway.token`.\n\n## Customize\n\n```bash\ncp config.json config.local.json\n# Edit config.local.json — it overrides config.json\n```\n\n```json\n{\n  \"name\": \"My Agent HUD\",\n  \"agent\": {\n    \"name\": \"Friday\",\n    \"emoji\": \"💎\",\n    \"sessionKey\": \"agent:main:main\"\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\",\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500\n  }\n}\n```\n\n| Key | Description | Default |\n|-----|-------------|---------|\n| `name` | Dashboard title | `\"JARVIS\"` |\n| `agent.name` | Agent display name | `\"JARVIS\"` |\n| `agent.emoji` | Agent emoji | `\"🤖\"` |\n| `agent.sessionKey` | OpenClaw session to connect | `\"agent:main:main\"` |\n| `server.port` | Server port | `9999` |\n| `server.gatewayUrl` | Gateway WebSocket URL | `\"ws://127.0.0.1:18789\"` |\n| `tts.engine` | TTS engine (`edge` or `say`) | `\"edge\"` |\n| `tts.edgeVoice` | Primary Edge TTS voice | `\"en-US-AriaNeural\"` |\n| `tts.edgeVoiceAlt` | Fallback Edge TTS voice | — |\n| `tts.voice` | macOS `say` voice name | `\"Samantha\"` |\n| `tts.maxChars` | Max characters per TTS request | `500` |\n\n**Popular Edge TTS voices:**\n\n| Language | Voice |\n|----------|-------|\n| English (US) | `en-US-AriaNeural`, `en-US-GuyNeural` |\n| 中文 (台灣) | `zh-TW-HsiaoChenNeural`, `zh-TW-YunJheNeural` |\n| 中文 (大陸) | `zh-CN-XiaoxiaoNeural`, `zh-CN-YunxiNeural` |\n| 日本語 | `ja-JP-NanamiNeural` |\n\nFull list: `python3 -m edge_tts --list-voices`\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `npm run dev` | Development (Vite HMR + backend) |\n| `npm run build` | Build static files to `dist/` |\n| `npm start` | Production server (serves `dist/`) |\n\n## Production (pm2)\n\n```bash\nnpm i -g pm2\nnpm run build\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (default TTS engine: `pip install edge-tts`)\n- ffmpeg (optional, only needed for macOS `say` engine)\n\n## Architecture\n\n```\nBrowser (Vite SPA)\n  └→ src/main.js\n       ├→ core/ (scene, audio, particles)\n       └→ components/ (chat, tasks, skills, memory, schedule, ...)\n\nServer (Express + WebSocket)\n  └→ server/\n       ├→ index.js       — entry point + middleware\n       ├→ gateway.js     — Gateway WS relay\n       ├→ sse.js         — SSE broadcast\n       ├→ tts.js         — TTS engine (Edge + macOS)\n       ├→ system-monitor.js\n       └→ routes/        — REST API endpoints\n```\n\n## Credits\n\nBased on the [Three.js Orb Visualizer](https://codepen.io/filipz/pen/yyyRgry) by [Filip Zrnzevic](https://codepen.io/filipz) — original concept, 3D orb design, and audio visualization. Adapted into an OpenClaw agent dashboard by [Jincoco](mailto:jincoco88912@gmail.com).\n\n## License\n\nISC\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn7frkd6pxy98974psgx9gp3md81881m\",\n  \"slug\": \"jarvis-ui\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1771751758198\n}\n\nFile v1.0.3:config.json\n\n{\n  \"name\": \"JARVIS\",\n  \"agent\": {\n    \"name\": \"JARVIS\",\n    \"emoji\": \"🤖\",\n    \"sessionKey\": \"agent:main:main\",\n    \"skills\": []\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500,\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\"\n  },\n  \"theme\": {\n    \"accentPrimary\": \"#ff4e42\",\n    \"accentSecondary\": \"#c0392b\"\n  }\n}\n\nFile v1.0.3:package.json\n\n{\n  \"name\": \"openclaw-jarvis-ui\",\n  \"version\": \"1.0.3\",\n  \"description\": \"這是 OpenClaw 的互動介面原型（JARVIS 風格 HUD）。 以 CodePen yyyRgry 為基礎，已**完整本地化離線**，可作為後續互動 UI 的雛形。\",\n  \"main\": \"server/index.js\",\n  \"scripts\": {\n    \"dev\": \"concurrently \\\"node --env-file=.env server/index.js\\\" \\\"npx vite --port 8001 --host\\\"\",\n    \"build\": \"vite build\",\n    \"start\": \"node --env-file=.env server/index.js\",\n    \"server\": \"node --env-file=.env server/index.js\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jincocodev/openclaw-jarvis-ui-ui.git\"\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"jarvis\",\n    \"dashboard\",\n    \"hud\",\n    \"threejs\",\n    \"agent\"\n  ],\n  \"author\": \"Jincoco <jincoco88912@gmail.com>\",\n  \"license\": \"ISC\",\n  \"type\": \"module\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui/issues\"\n  },\n  \"homepage\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui#readme\",\n  \"devDependencies\": {\n    \"concurrently\": \"^9.2.1\",\n    \"vite\": \"^7.3.1\"\n  },\n  \"dependencies\": {\n    \"@ricky0123/vad-web\": \"^0.0.30\",\n    \"express\": \"^5.2.1\",\n    \"gsap\": \"^3.14.2\",\n    \"multer\": \"^2.0.2\",\n    \"three\": \"^0.175.0\",\n    \"ws\": \"^8.19.0\"\n  }\n}\n\nFile v1.0.3:public/manifest.json\n\n{\n  \"name\": \"JARVIS\",\n  \"short_name\": \"JARVIS\",\n  \"description\": \"OpenClaw JARVIS HUD Interface\",\n  \"start_url\": \"/\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#0a0a0a\",\n  \"theme_color\": \"#ff4e42\",\n  \"orientation\": \"any\",\n  \"icons\": [\n    {\n      \"src\": \"/icons/icon-192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/icons/icon-512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ]\n}\n\nFile v1.0.3:src/config/agent.json\n\n{\n  \"name\": \"JARVIS\",\n  \"nameEn\": \"JARVIS\",\n  \"title\": \"OPENCLAW.JARVIS\",\n  \"status\": \"ONLINE\",\n  \"model\": \"GITHUB-COPILOT / CLAUDE-OPUS-4.6\",\n  \"provider\": \"GITHUB-COPILOT\",\n  \"contextSize\": 200000,\n  \"colors\": {\n    \"primary\": \"#ff4e42\",\n    \"secondary\": \"#c2362f\",\n    \"tertiary\": \"#ffb3ab\",\n    \"success\": \"#4ade80\",\n    \"warning\": \"#fbbf24\",\n    \"danger\": \"#ff4e42\"\n  },\n  \"skills\": [\n    { \"icon\": \"🎤\", \"name\": \"WHISPER\", \"status\": \"on\" },\n    { \"icon\": \"🐦\", \"name\": \"X-API\", \"status\": \"on\" },\n    { \"icon\": \"📧\", \"name\": \"GMAIL\", \"status\": \"on\" },\n    { \"icon\": \"📅\", \"name\": \"CALENDAR\", \"status\": \"on\" },\n    { \"icon\": \"🌤️\", \"name\": \"WEATHER\", \"status\": \"on\" },\n    { \"icon\": \"🔐\", \"name\": \"NORDVPN\", \"status\": \"off\" }\n  ],\n  \"tasks\": [\n    { \"text\": \"聊天視窗改造\", \"status\": \"done\" },\n    { \"text\": \"系統監控面板\", \"status\": \"done\" },\n    { \"text\": \"MODEL STATUS 面板\", \"status\": \"done\" },\n    { \"text\": \"動態背景動畫\", \"status\": \"done\" },\n    { \"text\": \"Tab 切換面板\", \"status\": \"done\" },\n    { \"text\": \"重構模組化\", \"status\": \"active\" },\n    { \"text\": \"Header 品牌化\", \"status\": \"pending\" },\n    { \"text\": \"Config 檔案架構\", \"status\": \"pending\" },\n    { \"text\": \"接入 OpenClaw API\", \"status\": \"pending\" }\n  ],\n  \"schedule\": [\n    { \"time\": \"*/30 *\", \"name\": \"HEARTBEAT\", \"status\": \"on\" },\n    { \"time\": \"09:00\", \"name\": \"早安問候\", \"status\": \"on\" },\n    { \"time\": \"12:00\", \"name\": \"信箱檢查\", \"status\": \"on\" },\n    { \"time\": \"18:00\", \"name\": \"天氣預報\", \"status\": \"off\" }\n  ],\n  \"memories\": [\n    \"📋 JARVIS UI Tab 切換面板\",\n    \"🎨 動態背景呼吸動畫\",\n    \"📊 Model Status 面板完成\",\n    \"💻 System Monitor 上線\",\n    \"💬 聊天視窗改造完成\"\n  ],\n  \"demoTracks\": [\n    { \"label\": \"MERKABA\", \"url\": \"./assets/audio/Merkaba.mp3\" },\n    { \"label\": \"DHAMIKA\", \"url\": \"./assets/audio/Dhamika.mp3\" },\n    { \"label\": \"VACANT\", \"url\": \"./assets/audio/Vacant.mp3\" },\n    { \"label\": \"LXSTNGHT\", \"url\": \"./assets/audio/lxstnght-back_1.mp3\" }\n  ]\n}\n\nFile v1.0.3:public/humans.txt\n\n/* humanstxt.org */\n\n/* TEAM */\nDeveloper: Jincoco\nContact: jincoco88912@gmail.com\nDescription: Adapted the original CodePen demo into an OpenClaw agent dashboard.\n\n/* THANKS */\nOriginal Design: Filip Zrnzevic (@filipz)\nSite: https://codepen.io/filipz\nPen: https://codepen.io/filipz/pen/yyyRgry\nNote: Three.js orb + audio visualizer concept. Beautiful work.\n\n/* SITE */\nBuilt with: Three.js, GSAP, Vite, Express\nPowered by: OpenClaw (https://github.com/openclaw/openclaw)\n\nArchive v1.0.2: 56 files, 147425 bytes\n\nFiles: assets/fonts/thegoodmonolith.css (180b), config.json (464b), index.html (17178b), package.json (1314b), public/humans.txt (472b), public/manifest.json (450b), public/sw.js (770b), public/vendor/gsap/Draggable.min.js (35497b), public/vendor/gsap/gsap.min.js (72435b), public/vendor/gsap/InertiaPlugin.min.js (7288b), public/vendor/gsap/Physics2DPlugin.min.js (2243b), README.md (7051b), server/gateway.js (12482b), server/index.js (2928b), server/routes/chat.js (3502b), server/routes/memory.js (2470b), server/routes/schedule.js (2739b), server/routes/skills.js (3137b), server/routes/status.js (2033b), server/routes/tasks.js (2512b), server/routes/tts-routes.js (700b), server/routes/voice.js (5024b), server/sse.js (1693b), server/system-monitor.js (2149b), server/tts.js (4437b), setup.sh (2600b), SKILL.md (2108b), src/components/chat.js (24207b), src/components/controls.js (7584b), src/components/draggable.js (4144b), src/components/markdown.js (4403b), src/components/memory.js (3323b), src/components/mobile-toolbar.js (2460b), src/components/notifications.js (310b), src/components/orb-messages.js (5658b), src/components/powersave.js (1550b), src/components/preloader.js (2109b), src/components/schedule.js (8608b), src/components/skills.js (4456b), src/components/spectrum.js (7516b), src/components/system-monitor.js (3164b), src/components/tabs.js (645b), src/components/tasks.js (11494b), src/components/thought-stream.js (3989b), src/components/timestamp.js (493b), src/components/voice.js (6212b), src/config/agent.json (2051b), src/config/config-loader.js (776b), src/config/theme.js (3578b), src/core/audio.js (12121b), src/core/particles.js (3099b), src/core/scene.js (21387b), src/main.js (7745b), style.css (52711b), vite.config.js (316b), _meta.json (128b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: jarvis-ui\ndescription: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spectrum analyzer, system monitor, and TTS. Use when you want a visual dashboard for your OpenClaw agent.\nmetadata: {\"openclaw\":{\"emoji\":\"🦾\",\"version\":\"1.0.2\",\"requires\":{\"bins\":[\"node\",\"npm\"]},\"homepage\":\"https://github.com/jincocodev/openclaw-jarvis-ui\"}}\n---\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD interface for your OpenClaw agent.\n\n## Install\n\n```bash\n./setup.sh\n```\n\nGateway token is auto-detected from `~/.openclaw/openclaw.json`.\n\n> **⚠️ Remote/non-localhost access:** If JARVIS server is accessed from a different machine (not localhost), add this to your `~/.openclaw/openclaw.json`:\n> ```json\n> { \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n> ```\n> Then restart OpenClaw Gateway.\n\nThen start:\n\n```bash\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n## Customize\n\nCopy and edit `config.local.json`:\n\n```bash\ncp config.json config.local.json\n```\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `name` | Page title | JARVIS |\n| `agent.name` | Agent display name | JARVIS |\n| `agent.emoji` | Agent emoji | 🤖 |\n| `agent.sessionKey` | OpenClaw session key | agent:main:main |\n| `server.port` | Server port | 9999 |\n| `tts.voice` | macOS TTS voice | Samantha |\n\n## Production\n\n```bash\nnpm i -g pm2\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Features\n\n- 🔮 Three.js orb — reacts to agent state (thinking/speaking/idle)\n- 💬 Real-time chat — Gateway WebSocket relay\n- 🎵 Audio visualizer — spectrum, ring, waveform\n- 📊 Model status — live token usage, model info\n- 🖥️ System monitor — CPU, memory, uptime\n- 🗣️ TTS — Edge TTS (free, cross-platform) + macOS `say` (offline)\n- 📱 Mobile responsive + PWA\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (`pip install edge-tts`) for TTS\n- ffmpeg (optional, macOS `say` engine only)\n\nFile v1.0.2:README.md\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD dashboard for [OpenClaw](https://github.com/openclaw/openclaw) agents.\n\nInteractive 3D orb that visualizes your agent's state in real-time — thinking, responding, idle — with live chat, system monitoring, and audio visualization.\n\n![JARVIS UI Preview](assets/images/desktop-red.png)\n\n### Theme Variants\n\n| Cyan | Green |\n|------|-------|\n| ![Cyan Theme](assets/images/theme-cyan.png) | ![Green Theme](assets/images/theme-green.png) |\n\n### Mobile\n\n<img src=\"assets/images/mobile.png\" alt=\"Mobile UI\" width=\"300\">\n\n## Features\n\n### 🔮 3D Orb\nInteractive Three.js orb with real-time agent state visualization. Shows **IDLE**, **THINKING**, or **RESPONDING** status with color-coded text. Draggable, audio-reactive, with orbiting particle system.\n\n### 💬 Live Chat\nReal-time streaming chat via OpenClaw Gateway WebSocket.\n- Markdown rendering (code blocks, links, lists)\n- Chat history — loads previous conversations on page load (configurable: 20/50/100/200 messages)\n- File upload — drag & drop, paperclip button, or Ctrl+V paste for images\n- Bubble-style UI with timestamps and sender labels\n\n### 📊 System Monitor\nLive system metrics pushed via SSE.\n- CPU usage, memory, uptime\n- Current model name and token count\n- Auto-updating, no polling\n\n### 🎵 Audio Visualizer\nThree-layer audio visualization that reacts to TTS playback:\n- **Spectrum** — frequency bar graph\n- **Ring** — concentric circles that pulse with audio\n- **Waveform** — oscilloscope-style wave display\n\n### 📋 Task Manager\nFull CRUD task board with real-time sync.\n- Priority levels, progress tracking, tags\n- Persistent storage (server-side JSON)\n- SSE push — updates appear instantly across tabs\n\n### 🧠 Memory Timeline\nDisplays daily topics extracted from your agent's `memory/*.md` files.\n- Shows `##` headings as topic entries per day\n- Collapsible days, TODAY/YESTERDAY labels\n- \"More\" button to load older entries (7 days at a time)\n\n### ⏰ Schedule\nView and control your agent's scheduled tasks.\n- **Heartbeat** — shows system heartbeat status and interval\n- **Cron Jobs** — toggle enable/disable directly from the UI\n\n### 🔧 Skills Browser\nScans and displays all installed skills (workspace + global).\n\n### 🗣️ TTS (Text-to-Speech)\nDual engine support:\n- **Edge TTS** (default) — free, 300+ voices, multilingual\n- **macOS `say`** — offline fallback, requires ffmpeg\n- Switchable from the Controls panel\n\n### 🎨 Theme System\nOne-click color scheme switching via HSL hue rotation.\n- 6-color palette in Controls panel (red, orange, green, cyan, blue, purple)\n- Affects entire UI: panels, orb, particles, spectrum, background\n- Persisted in localStorage\n\n### ⚡ Power Save Mode\nReduce resource usage for background monitoring.\n- Throttles render from 60fps to 15fps\n- Disables background animations, particles, scan lines\n- Toggle from Controls panel, persisted in localStorage\n\n### 📱 Mobile Ready\nResponsive UI with touch gestures.\n- Swipe up/down on chat header for fullscreen/collapse\n- Floating toolbar for quick panel access\n- PWA — installable as a home screen app\n\n## Quick Start\n\n### From ClawHub\n```bash\nnpx clawhub install jarvis-ui\ncd skills/jarvis-ui\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js\n```\n\n### From GitHub\n```bash\ngit clone https://github.com/jincocodev/openclaw-jarvis-ui.git\ncd openclaw-jarvis-ui\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n### ⚠️ Remote Access (non-localhost)\n\nIf running JARVIS on a remote server (not localhost), OpenClaw Gateway requires a secure context. Add this to `~/.openclaw/openclaw.json`:\n\n```json\n{ \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n```\n\nThen restart the Gateway: `openclaw gateway restart`\n\n## Get Your Gateway Token\n\n`setup.sh` auto-detects your token from `~/.openclaw/openclaw.json`. If auto-detection fails, set it manually:\n\n```bash\necho \"GATEWAY_TOKEN=your_token\" > .env\n```\n\nFind your token: run `openclaw status` or check `~/.openclaw/openclaw.json` → `gateway.token`.\n\n## Customize\n\n```bash\ncp config.json config.local.json\n# Edit config.local.json — it overrides config.json\n```\n\n```json\n{\n  \"name\": \"My Agent HUD\",\n  \"agent\": {\n    \"name\": \"Friday\",\n    \"emoji\": \"💎\",\n    \"sessionKey\": \"agent:main:main\"\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\",\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500\n  }\n}\n```\n\n| Key | Description | Default |\n|-----|-------------|---------|\n| `name` | Dashboard title | `\"JARVIS\"` |\n| `agent.name` | Agent display name | `\"JARVIS\"` |\n| `agent.emoji` | Agent emoji | `\"🤖\"` |\n| `agent.sessionKey` | OpenClaw session to connect | `\"agent:main:main\"` |\n| `server.port` | Server port | `9999` |\n| `server.gatewayUrl` | Gateway WebSocket URL | `\"ws://127.0.0.1:18789\"` |\n| `tts.engine` | TTS engine (`edge` or `say`) | `\"edge\"` |\n| `tts.edgeVoice` | Primary Edge TTS voice | `\"en-US-AriaNeural\"` |\n| `tts.edgeVoiceAlt` | Fallback Edge TTS voice | — |\n| `tts.voice` | macOS `say` voice name | `\"Samantha\"` |\n| `tts.maxChars` | Max characters per TTS request | `500` |\n\n**Popular Edge TTS voices:**\n\n| Language | Voice |\n|----------|-------|\n| English (US) | `en-US-AriaNeural`, `en-US-GuyNeural` |\n| 中文 (台灣) | `zh-TW-HsiaoChenNeural`, `zh-TW-YunJheNeural` |\n| 中文 (大陸) | `zh-CN-XiaoxiaoNeural`, `zh-CN-YunxiNeural` |\n| 日本語 | `ja-JP-NanamiNeural` |\n\nFull list: `python3 -m edge_tts --list-voices`\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `npm run dev` | Development (Vite HMR + backend) |\n| `npm run build` | Build static files to `dist/` |\n| `npm start` | Production server (serves `dist/`) |\n\n## Production (pm2)\n\n```bash\nnpm i -g pm2\nnpm run build\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (default TTS engine: `pip install edge-tts`)\n- ffmpeg (optional, only needed for macOS `say` engine)\n\n## Architecture\n\n```\nBrowser (Vite SPA)\n  └→ src/main.js\n       ├→ core/ (scene, audio, particles)\n       └→ components/ (chat, tasks, skills, memory, schedule, ...)\n\nServer (Express + WebSocket)\n  └→ server/\n       ├→ index.js       — entry point + middleware\n       ├→ gateway.js     — Gateway WS relay\n       ├→ sse.js         — SSE broadcast\n       ├→ tts.js         — TTS engine (Edge + macOS)\n       ├→ system-monitor.js\n       └→ routes/        — REST API endpoints\n```\n\n## Credits\n\nBased on the [Three.js Orb Visualizer](https://codepen.io/filipz/pen/yyyRgry) by [Filip Zrnzevic](https://codepen.io/filipz) — original concept, 3D orb design, and audio visualization. Adapted into an OpenClaw agent dashboard by [Jincoco](mailto:jincoco88912@gmail.com).\n\n## License\n\nISC\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7frkd6pxy98974psgx9gp3md81881m\",\n  \"slug\": \"jarvis-ui\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1771751543098\n}\n\nFile v1.0.2:config.json\n\n{\n  \"name\": \"JARVIS\",\n  \"agent\": {\n    \"name\": \"JARVIS\",\n    \"emoji\": \"🤖\",\n    \"sessionKey\": \"agent:main:main\",\n    \"skills\": []\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500,\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\"\n  },\n  \"theme\": {\n    \"accentPrimary\": \"#ff4e42\",\n    \"accentSecondary\": \"#c0392b\"\n  }\n}\n\nFile v1.0.2:package.json\n\n{\n  \"name\": \"openclaw-jarvis-ui\",\n  \"version\": \"1.0.2\",\n  \"description\": \"這是 OpenClaw 的互動介面原型（JARVIS 風格 HUD）。 以 CodePen yyyRgry 為基礎，已**完整本地化離線**，可作為後續互動 UI 的雛形。\",\n  \"main\": \"server/index.js\",\n  \"scripts\": {\n    \"dev\": \"concurrently \\\"node --env-file=.env server/index.js\\\" \\\"npx vite --port 8001 --host\\\"\",\n    \"build\": \"vite build\",\n    \"start\": \"node --env-file=.env server/index.js\",\n    \"server\": \"node --env-file=.env server/index.js\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jincocodev/openclaw-jarvis-ui-ui.git\"\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"jarvis\",\n    \"dashboard\",\n    \"hud\",\n    \"threejs\",\n    \"agent\"\n  ],\n  \"author\": \"Jincoco <jincoco88912@gmail.com>\",\n  \"license\": \"ISC\",\n  \"type\": \"module\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui/issues\"\n  },\n  \"homepage\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui#readme\",\n  \"devDependencies\": {\n    \"concurrently\": \"^9.2.1\",\n    \"vite\": \"^7.3.1\"\n  },\n  \"dependencies\": {\n    \"@ricky0123/vad-web\": \"^0.0.30\",\n    \"express\": \"^5.2.1\",\n    \"gsap\": \"^3.14.2\",\n    \"multer\": \"^2.0.2\",\n    \"three\": \"^0.175.0\",\n    \"ws\": \"^8.19.0\"\n  }\n}\n\nFile v1.0.2:public/manifest.json\n\n{\n  \"name\": \"JARVIS\",\n  \"short_name\": \"JARVIS\",\n  \"description\": \"OpenClaw JARVIS HUD Interface\",\n  \"start_url\": \"/\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#0a0a0a\",\n  \"theme_color\": \"#ff4e42\",\n  \"orientation\": \"any\",\n  \"icons\": [\n    {\n      \"src\": \"/icons/icon-192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/icons/icon-512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ]\n}\n\nFile v1.0.2:src/config/agent.json\n\n{\n  \"name\": \"JARVIS\",\n  \"nameEn\": \"JARVIS\",\n  \"title\": \"OPENCLAW.JARVIS\",\n  \"status\": \"ONLINE\",\n  \"model\": \"GITHUB-COPILOT / CLAUDE-OPUS-4.6\",\n  \"provider\": \"GITHUB-COPILOT\",\n  \"contextSize\": 200000,\n  \"colors\": {\n    \"primary\": \"#ff4e42\",\n    \"secondary\": \"#c2362f\",\n    \"tertiary\": \"#ffb3ab\",\n    \"success\": \"#4ade80\",\n    \"warning\": \"#fbbf24\",\n    \"danger\": \"#ff4e42\"\n  },\n  \"skills\": [\n    { \"icon\": \"🎤\", \"name\": \"WHISPER\", \"status\": \"on\" },\n    { \"icon\": \"🐦\", \"name\": \"X-API\", \"status\": \"on\" },\n    { \"icon\": \"📧\", \"name\": \"GMAIL\", \"status\": \"on\" },\n    { \"icon\": \"📅\", \"name\": \"CALENDAR\", \"status\": \"on\" },\n    { \"icon\": \"🌤️\", \"name\": \"WEATHER\", \"status\": \"on\" },\n    { \"icon\": \"🔐\", \"name\": \"NORDVPN\", \"status\": \"off\" }\n  ],\n  \"tasks\": [\n    { \"text\": \"聊天視窗改造\", \"status\": \"done\" },\n    { \"text\": \"系統監控面板\", \"status\": \"done\" },\n    { \"text\": \"MODEL STATUS 面板\", \"status\": \"done\" },\n    { \"text\": \"動態背景動畫\", \"status\": \"done\" },\n    { \"text\": \"Tab 切換面板\", \"status\": \"done\" },\n    { \"text\": \"重構模組化\", \"status\": \"active\" },\n    { \"text\": \"Header 品牌化\", \"status\": \"pending\" },\n    { \"text\": \"Config 檔案架構\", \"status\": \"pending\" },\n    { \"text\": \"接入 OpenClaw API\", \"status\": \"pending\" }\n  ],\n  \"schedule\": [\n    { \"time\": \"*/30 *\", \"name\": \"HEARTBEAT\", \"status\": \"on\" },\n    { \"time\": \"09:00\", \"name\": \"早安問候\", \"status\": \"on\" },\n    { \"time\": \"12:00\", \"name\": \"信箱檢查\", \"status\": \"on\" },\n    { \"time\": \"18:00\", \"name\": \"天氣預報\", \"status\": \"off\" }\n  ],\n  \"memories\": [\n    \"📋 JARVIS UI Tab 切換面板\",\n    \"🎨 動態背景呼吸動畫\",\n    \"📊 Model Status 面板完成\",\n    \"💻 System Monitor 上線\",\n    \"💬 聊天視窗改造完成\"\n  ],\n  \"demoTracks\": [\n    { \"label\": \"MERKABA\", \"url\": \"./assets/audio/Merkaba.mp3\" },\n    { \"label\": \"DHAMIKA\", \"url\": \"./assets/audio/Dhamika.mp3\" },\n    { \"label\": \"VACANT\", \"url\": \"./assets/audio/Vacant.mp3\" },\n    { \"label\": \"LXSTNGHT\", \"url\": \"./assets/audio/lxstnght-back_1.mp3\" }\n  ]\n}\n\nFile v1.0.2:public/humans.txt\n\n/* humanstxt.org */\n\n/* TEAM */\nDeveloper: Jincoco\nContact: jincoco88912@gmail.com\nDescription: Adapted the original CodePen demo into an OpenClaw agent dashboard.\n\n/* THANKS */\nOriginal Design: Filip Zrnzevic (@filipz)\nSite: https://codepen.io/filipz\nPen: https://codepen.io/filipz/pen/yyyRgry\nNote: Three.js orb + audio visualizer concept. Beautiful work.\n\n/* SITE */\nBuilt with: Three.js, GSAP, Vite, Express\nPowered by: OpenClaw (https://github.com/openclaw/openclaw)\n\nArchive v1.0.1: 56 files, 145055 bytes\n\nFiles: assets/fonts/thegoodmonolith.css (180b), config.json (464b), index.html (17178b), package.json (1314b), public/humans.txt (472b), public/manifest.json (450b), public/sw.js (770b), public/vendor/gsap/Draggable.min.js (35497b), public/vendor/gsap/gsap.min.js (72435b), public/vendor/gsap/InertiaPlugin.min.js (7288b), public/vendor/gsap/Physics2DPlugin.min.js (2243b), README.md (7051b), server/gateway.js (3513b), server/index.js (2928b), server/routes/chat.js (3502b), server/routes/memory.js (2470b), server/routes/schedule.js (2739b), server/routes/skills.js (3137b), server/routes/status.js (2033b), server/routes/tasks.js (2512b), server/routes/tts-routes.js (700b), server/routes/voice.js (5024b), server/sse.js (1693b), server/system-monitor.js (2149b), server/tts.js (4437b), setup.sh (2600b), SKILL.md (2108b), src/components/chat.js (24207b), src/components/controls.js (7584b), src/components/draggable.js (4144b), src/components/markdown.js (4403b), src/components/memory.js (3323b), src/components/mobile-toolbar.js (2460b), src/components/notifications.js (310b), src/components/orb-messages.js (5658b), src/components/powersave.js (1550b), src/components/preloader.js (2109b), src/components/schedule.js (8608b), src/components/skills.js (4456b), src/components/spectrum.js (7516b), src/components/system-monitor.js (3164b), src/components/tabs.js (645b), src/components/tasks.js (11494b), src/components/thought-stream.js (3989b), src/components/timestamp.js (493b), src/components/voice.js (6212b), src/config/agent.json (2051b), src/config/config-loader.js (776b), src/config/theme.js (3578b), src/core/audio.js (12121b), src/core/particles.js (3099b), src/core/scene.js (21387b), src/main.js (7745b), style.css (52711b), vite.config.js (316b), _meta.json (128b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: jarvis-ui\ndescription: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spectrum analyzer, system monitor, and TTS. Use when you want a visual dashboard for your OpenClaw agent.\nmetadata: {\"openclaw\":{\"emoji\":\"🦾\",\"version\":\"1.0.0\",\"requires\":{\"bins\":[\"node\",\"npm\"]},\"homepage\":\"https://github.com/jincocodev/openclaw-jarvis-ui\"}}\n---\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD interface for your OpenClaw agent.\n\n## Install\n\n```bash\n./setup.sh\n```\n\nGateway token is auto-detected from `~/.openclaw/openclaw.json`.\n\n> **⚠️ Remote/non-localhost access:** If JARVIS server is accessed from a different machine (not localhost), add this to your `~/.openclaw/openclaw.json`:\n> ```json\n> { \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n> ```\n> Then restart OpenClaw Gateway.\n\nThen start:\n\n```bash\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n## Customize\n\nCopy and edit `config.local.json`:\n\n```bash\ncp config.json config.local.json\n```\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `name` | Page title | JARVIS |\n| `agent.name` | Agent display name | JARVIS |\n| `agent.emoji` | Agent emoji | 🤖 |\n| `agent.sessionKey` | OpenClaw session key | agent:main:main |\n| `server.port` | Server port | 9999 |\n| `tts.voice` | macOS TTS voice | Samantha |\n\n## Production\n\n```bash\nnpm i -g pm2\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Features\n\n- 🔮 Three.js orb — reacts to agent state (thinking/speaking/idle)\n- 💬 Real-time chat — Gateway WebSocket relay\n- 🎵 Audio visualizer — spectrum, ring, waveform\n- 📊 Model status — live token usage, model info\n- 🖥️ System monitor — CPU, memory, uptime\n- 🗣️ TTS — Edge TTS (free, cross-platform) + macOS `say` (offline)\n- 📱 Mobile responsive + PWA\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (`pip install edge-tts`) for TTS\n- ffmpeg (optional, macOS `say` engine only)\n\nFile v1.0.1:README.md\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD dashboard for [OpenClaw](https://github.com/openclaw/openclaw) agents.\n\nInteractive 3D orb that visualizes your agent's state in real-time — thinking, responding, idle — with live chat, system monitoring, and audio visualization.\n\n![JARVIS UI Preview](assets/images/desktop-red.png)\n\n### Theme Variants\n\n| Cyan | Green |\n|------|-------|\n| ![Cyan Theme](assets/images/theme-cyan.png) | ![Green Theme](assets/images/theme-green.png) |\n\n### Mobile\n\n<img src=\"assets/images/mobile.png\" alt=\"Mobile UI\" width=\"300\">\n\n## Features\n\n### 🔮 3D Orb\nInteractive Three.js orb with real-time agent state visualization. Shows **IDLE**, **THINKING**, or **RESPONDING** status with color-coded text. Draggable, audio-reactive, with orbiting particle system.\n\n### 💬 Live Chat\nReal-time streaming chat via OpenClaw Gateway WebSocket.\n- Markdown rendering (code blocks, links, lists)\n- Chat history — loads previous conversations on page load (configurable: 20/50/100/200 messages)\n- File upload — drag & drop, paperclip button, or Ctrl+V paste for images\n- Bubble-style UI with timestamps and sender labels\n\n### 📊 System Monitor\nLive system metrics pushed via SSE.\n- CPU usage, memory, uptime\n- Current model name and token count\n- Auto-updating, no polling\n\n### 🎵 Audio Visualizer\nThree-layer audio visualization that reacts to TTS playback:\n- **Spectrum** — frequency bar graph\n- **Ring** — concentric circles that pulse with audio\n- **Waveform** — oscilloscope-style wave display\n\n### 📋 Task Manager\nFull CRUD task board with real-time sync.\n- Priority levels, progress tracking, tags\n- Persistent storage (server-side JSON)\n- SSE push — updates appear instantly across tabs\n\n### 🧠 Memory Timeline\nDisplays daily topics extracted from your agent's `memory/*.md` files.\n- Shows `##` headings as topic entries per day\n- Collapsible days, TODAY/YESTERDAY labels\n- \"More\" button to load older entries (7 days at a time)\n\n### ⏰ Schedule\nView and control your agent's scheduled tasks.\n- **Heartbeat** — shows system heartbeat status and interval\n- **Cron Jobs** — toggle enable/disable directly from the UI\n\n### 🔧 Skills Browser\nScans and displays all installed skills (workspace + global).\n\n### 🗣️ TTS (Text-to-Speech)\nDual engine support:\n- **Edge TTS** (default) — free, 300+ voices, multilingual\n- **macOS `say`** — offline fallback, requires ffmpeg\n- Switchable from the Controls panel\n\n### 🎨 Theme System\nOne-click color scheme switching via HSL hue rotation.\n- 6-color palette in Controls panel (red, orange, green, cyan, blue, purple)\n- Affects entire UI: panels, orb, particles, spectrum, background\n- Persisted in localStorage\n\n### ⚡ Power Save Mode\nReduce resource usage for background monitoring.\n- Throttles render from 60fps to 15fps\n- Disables background animations, particles, scan lines\n- Toggle from Controls panel, persisted in localStorage\n\n### 📱 Mobile Ready\nResponsive UI with touch gestures.\n- Swipe up/down on chat header for fullscreen/collapse\n- Floating toolbar for quick panel access\n- PWA — installable as a home screen app\n\n## Quick Start\n\n### From ClawHub\n```bash\nnpx clawhub install jarvis-ui\ncd skills/jarvis-ui\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js\n```\n\n### From GitHub\n```bash\ngit clone https://github.com/jincocodev/openclaw-jarvis-ui-ui.git\ncd openclaw-jarvis\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n### ⚠️ Remote Access (non-localhost)\n\nIf running JARVIS on a remote server (not localhost), OpenClaw Gateway requires a secure context. Add this to `~/.openclaw/openclaw.json`:\n\n```json\n{ \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n```\n\nThen restart the Gateway: `openclaw gateway restart`\n\n## Get Your Gateway Token\n\n`setup.sh` auto-detects your token from `~/.openclaw/openclaw.json`. If auto-detection fails, set it manually:\n\n```bash\necho \"GATEWAY_TOKEN=your_token\" > .env\n```\n\nFind your token: run `openclaw status` or check `~/.openclaw/openclaw.json` → `gateway.token`.\n\n## Customize\n\n```bash\ncp config.json config.local.json\n# Edit config.local.json — it overrides config.json\n```\n\n```json\n{\n  \"name\": \"My Agent HUD\",\n  \"agent\": {\n    \"name\": \"Friday\",\n    \"emoji\": \"💎\",\n    \"sessionKey\": \"agent:main:main\"\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\",\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500\n  }\n}\n```\n\n| Key | Description | Default |\n|-----|-------------|---------|\n| `name` | Dashboard title | `\"JARVIS\"` |\n| `agent.name` | Agent display name | `\"JARVIS\"` |\n| `agent.emoji` | Agent emoji | `\"🤖\"` |\n| `agent.sessionKey` | OpenClaw session to connect | `\"agent:main:main\"` |\n| `server.port` | Server port | `9999` |\n| `server.gatewayUrl` | Gateway WebSocket URL | `\"ws://127.0.0.1:18789\"` |\n| `tts.engine` | TTS engine (`edge` or `say`) | `\"edge\"` |\n| `tts.edgeVoice` | Primary Edge TTS voice | `\"en-US-AriaNeural\"` |\n| `tts.edgeVoiceAlt` | Fallback Edge TTS voice | — |\n| `tts.voice` | macOS `say` voice name | `\"Samantha\"` |\n| `tts.maxChars` | Max characters per TTS request | `500` |\n\n**Popular Edge TTS voices:**\n\n| Language | Voice |\n|----------|-------|\n| English (US) | `en-US-AriaNeural`, `en-US-GuyNeural` |\n| 中文 (台灣) | `zh-TW-HsiaoChenNeural`, `zh-TW-YunJheNeural` |\n| 中文 (大陸) | `zh-CN-XiaoxiaoNeural`, `zh-CN-YunxiNeural` |\n| 日本語 | `ja-JP-NanamiNeural` |\n\nFull list: `python3 -m edge_tts --list-voices`\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `npm run dev` | Development (Vite HMR + backend) |\n| `npm run build` | Build static files to `dist/` |\n| `npm start` | Production server (serves `dist/`) |\n\n## Production (pm2)\n\n```bash\nnpm i -g pm2\nnpm run build\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (default TTS engine: `pip install edge-tts`)\n- ffmpeg (optional, only needed for macOS `say` engine)\n\n## Architecture\n\n```\nBrowser (Vite SPA)\n  └→ src/main.js\n       ├→ core/ (scene, audio, particles)\n       └→ components/ (chat, tasks, skills, memory, schedule, ...)\n\nServer (Express + WebSocket)\n  └→ server/\n       ├→ index.js       — entry point + middleware\n       ├→ gateway.js     — Gateway WS relay\n       ├→ sse.js         — SSE broadcast\n       ├→ tts.js         — TTS engine (Edge + macOS)\n       ├→ system-monitor.js\n       └→ routes/        — REST API endpoints\n```\n\n## Credits\n\nBased on the [Three.js Orb Visualizer](https://codepen.io/filipz/pen/yyyRgry) by [Filip Zrnzevic](https://codepen.io/filipz) — original concept, 3D orb design, and audio visualization. Adapted into an OpenClaw agent dashboard by [Jincoco](mailto:jincoco88912@gmail.com).\n\n## License\n\nISC\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7frkd6pxy98974psgx9gp3md81881m\",\n  \"slug\": \"jarvis-ui\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1771260997106\n}\n\nFile v1.0.1:config.json\n\n{\n  \"name\": \"JARVIS\",\n  \"agent\": {\n    \"name\": \"JARVIS\",\n    \"emoji\": \"🤖\",\n    \"sessionKey\": \"agent:main:main\",\n    \"skills\": []\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500,\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\"\n  },\n  \"theme\": {\n    \"accentPrimary\": \"#ff4e42\",\n    \"accentSecondary\": \"#c0392b\"\n  }\n}\n\nFile v1.0.1:package.json\n\n{\n  \"name\": \"openclaw-jarvis-ui\",\n  \"version\": \"1.0.0\",\n  \"description\": \"這是 OpenClaw 的互動介面原型（JARVIS 風格 HUD）。 以 CodePen yyyRgry 為基礎，已**完整本地化離線**，可作為後續互動 UI 的雛形。\",\n  \"main\": \"server/index.js\",\n  \"scripts\": {\n    \"dev\": \"concurrently \\\"node --env-file=.env server/index.js\\\" \\\"npx vite --port 8001 --host\\\"\",\n    \"build\": \"vite build\",\n    \"start\": \"node --env-file=.env server/index.js\",\n    \"server\": \"node --env-file=.env server/index.js\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jincocodev/openclaw-jarvis-ui-ui.git\"\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"jarvis\",\n    \"dashboard\",\n    \"hud\",\n    \"threejs\",\n    \"agent\"\n  ],\n  \"author\": \"Jincoco <jincoco88912@gmail.com>\",\n  \"license\": \"ISC\",\n  \"type\": \"module\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui/issues\"\n  },\n  \"homepage\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui#readme\",\n  \"devDependencies\": {\n    \"concurrently\": \"^9.2.1\",\n    \"vite\": \"^7.3.1\"\n  },\n  \"dependencies\": {\n    \"@ricky0123/vad-web\": \"^0.0.30\",\n    \"express\": \"^5.2.1\",\n    \"gsap\": \"^3.14.2\",\n    \"multer\": \"^2.0.2\",\n    \"three\": \"^0.175.0\",\n    \"ws\": \"^8.19.0\"\n  }\n}\n\nFile v1.0.1:public/manifest.json\n\n{\n  \"name\": \"JARVIS\",\n  \"short_name\": \"JARVIS\",\n  \"description\": \"OpenClaw JARVIS HUD Interface\",\n  \"start_url\": \"/\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#0a0a0a\",\n  \"theme_color\": \"#ff4e42\",\n  \"orientation\": \"any\",\n  \"icons\": [\n    {\n      \"src\": \"/icons/icon-192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/icons/icon-512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ]\n}\n\nFile v1.0.1:src/config/agent.json\n\n{\n  \"name\": \"JARVIS\",\n  \"nameEn\": \"JARVIS\",\n  \"title\": \"OPENCLAW.JARVIS\",\n  \"status\": \"ONLINE\",\n  \"model\": \"GITHUB-COPILOT / CLAUDE-OPUS-4.6\",\n  \"provider\": \"GITHUB-COPILOT\",\n  \"contextSize\": 200000,\n  \"colors\": {\n    \"primary\": \"#ff4e42\",\n    \"secondary\": \"#c2362f\",\n    \"tertiary\": \"#ffb3ab\",\n    \"success\": \"#4ade80\",\n    \"warning\": \"#fbbf24\",\n    \"danger\": \"#ff4e42\"\n  },\n  \"skills\": [\n    { \"icon\": \"🎤\", \"name\": \"WHISPER\", \"status\": \"on\" },\n    { \"icon\": \"🐦\", \"name\": \"X-API\", \"status\": \"on\" },\n    { \"icon\": \"📧\", \"name\": \"GMAIL\", \"status\": \"on\" },\n    { \"icon\": \"📅\", \"name\": \"CALENDAR\", \"status\": \"on\" },\n    { \"icon\": \"🌤️\", \"name\": \"WEATHER\", \"status\": \"on\" },\n    { \"icon\": \"🔐\", \"name\": \"NORDVPN\", \"status\": \"off\" }\n  ],\n  \"tasks\": [\n    { \"text\": \"聊天視窗改造\", \"status\": \"done\" },\n    { \"text\": \"系統監控面板\", \"status\": \"done\" },\n    { \"text\": \"MODEL STATUS 面板\", \"status\": \"done\" },\n    { \"text\": \"動態背景動畫\", \"status\": \"done\" },\n    { \"text\": \"Tab 切換面板\", \"status\": \"done\" },\n    { \"text\": \"重構模組化\", \"status\": \"active\" },\n    { \"text\": \"Header 品牌化\", \"status\": \"pending\" },\n    { \"text\": \"Config 檔案架構\", \"status\": \"pending\" },\n    { \"text\": \"接入 OpenClaw API\", \"status\": \"pending\" }\n  ],\n  \"schedule\": [\n    { \"time\": \"*/30 *\", \"name\": \"HEARTBEAT\", \"status\": \"on\" },\n    { \"time\": \"09:00\", \"name\": \"早安問候\", \"status\": \"on\" },\n    { \"time\": \"12:00\", \"name\": \"信箱檢查\", \"status\": \"on\" },\n    { \"time\": \"18:00\", \"name\": \"天氣預報\", \"status\": \"off\" }\n  ],\n  \"memories\": [\n    \"📋 JARVIS UI Tab 切換面板\",\n    \"🎨 動態背景呼吸動畫\",\n    \"📊 Model Status 面板完成\",\n    \"💻 System Monitor 上線\",\n    \"💬 聊天視窗改造完成\"\n  ],\n  \"demoTracks\": [\n    { \"label\": \"MERKABA\", \"url\": \"./assets/audio/Merkaba.mp3\" },\n    { \"label\": \"DHAMIKA\", \"url\": \"./assets/audio/Dhamika.mp3\" },\n    { \"label\": \"VACANT\", \"url\": \"./assets/audio/Vacant.mp3\" },\n    { \"label\": \"LXSTNGHT\", \"url\": \"./assets/audio/lxstnght-back_1.mp3\" }\n  ]\n}\n\nFile v1.0.1:public/humans.txt\n\n/* humanstxt.org */\n\n/* TEAM */\nDeveloper: Jincoco\nContact: jincoco88912@gmail.com\nDescription: Adapted the original CodePen demo into an OpenClaw agent dashboard.\n\n/* THANKS */\nOriginal Design: Filip Zrnzevic (@filipz)\nSite: https://codepen.io/filipz\nPen: https://codepen.io/filipz/pen/yyyRgry\nNote: Three.js orb + audio visualizer concept. Beautiful work.\n\n/* SITE */\nBuilt with: Three.js, GSAP, Vite, Express\nPowered by: OpenClaw (https://github.com/openclaw/openclaw)\n\nArchive v1.0.0: 59 files, 178508 bytes\n\nFiles: assets/fonts/thegoodmonolith.css (180b), config.json (464b), index.html (17178b), package-lock.json (89836b), package.json (1314b), public/humans.txt (472b), public/manifest.json (450b), public/sw.js (770b), public/vad/ort-wasm-simd-threaded.mjs (24274b), public/vad/vad.worklet.bundle.min.js (2480b), public/vendor/gsap/Draggable.min.js (35497b), public/vendor/gsap/gsap.min.js (72435b), public/vendor/gsap/InertiaPlugin.min.js (7288b), public/vendor/gsap/Physics2DPlugin.min.js (2243b), README.md (7051b), server/gateway.js (3513b), server/index.js (2928b), server/routes/chat.js (3502b), server/routes/memory.js (2470b), server/routes/schedule.js (2739b), server/routes/skills.js (3137b), server/routes/status.js (2033b), server/routes/tasks.js (2512b), server/routes/tts-routes.js (700b), server/routes/voice.js (5024b), server/sse.js (1693b), server/system-monitor.js (2149b), server/tts.js (4437b), setup.sh (2600b), SKILL.md (2108b), src/components/chat.js (24207b), src/components/controls.js (7584b), src/components/draggable.js (4144b), src/components/markdown.js (4403b), src/components/memory.js (3323b), src/components/mobile-toolbar.js (2460b), src/components/notifications.js (310b), src/components/orb-messages.js (5658b), src/components/powersave.js (1550b), src/components/preloader.js (2109b), src/components/schedule.js (8608b), src/components/skills.js (4456b), src/components/spectrum.js (7516b), src/components/system-monitor.js (3164b), src/components/tabs.js (645b), src/components/tasks.js (11494b), src/components/thought-stream.js (3989b), src/components/timestamp.js (493b), src/components/voice.js (6212b), src/config/agent.json (2051b), src/config/config-loader.js (776b), src/config/theme.js (3578b), src/core/audio.js (12121b), src/core/particles.js (3099b), src/core/scene.js (21387b), src/main.js (7745b), style.css (52711b), vite.config.js (316b), _meta.json (128b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: jarvis-ui\ndescription: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spectrum analyzer, system monitor, and TTS. Use when you want a visual dashboard for your OpenClaw agent.\nmetadata: {\"openclaw\":{\"emoji\":\"🦾\",\"version\":\"1.0.0\",\"requires\":{\"bins\":[\"node\",\"npm\"]},\"homepage\":\"https://github.com/jincocodev/openclaw-jarvis-ui\"}}\n---\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD interface for your OpenClaw agent.\n\n## Install\n\n```bash\n./setup.sh\n```\n\nGateway token is auto-detected from `~/.openclaw/openclaw.json`.\n\n> **⚠️ Remote/non-localhost access:** If JARVIS server is accessed from a different machine (not localhost), add this to your `~/.openclaw/openclaw.json`:\n> ```json\n> { \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n> ```\n> Then restart OpenClaw Gateway.\n\nThen start:\n\n```bash\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n## Customize\n\nCopy and edit `config.local.json`:\n\n```bash\ncp config.json config.local.json\n```\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `name` | Page title | JARVIS |\n| `agent.name` | Agent display name | JARVIS |\n| `agent.emoji` | Agent emoji | 🤖 |\n| `agent.sessionKey` | OpenClaw session key | agent:main:main |\n| `server.port` | Server port | 9999 |\n| `tts.voice` | macOS TTS voice | Samantha |\n\n## Production\n\n```bash\nnpm i -g pm2\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Features\n\n- 🔮 Three.js orb — reacts to agent state (thinking/speaking/idle)\n- 💬 Real-time chat — Gateway WebSocket relay\n- 🎵 Audio visualizer — spectrum, ring, waveform\n- 📊 Model status — live token usage, model info\n- 🖥️ System monitor — CPU, memory, uptime\n- 🗣️ TTS — Edge TTS (free, cross-platform) + macOS `say` (offline)\n- 📱 Mobile responsive + PWA\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (`pip install edge-tts`) for TTS\n- ffmpeg (optional, macOS `say` engine only)\n\nFile v1.0.0:README.md\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD dashboard for [OpenClaw](https://github.com/openclaw/openclaw) agents.\n\nInteractive 3D orb that visualizes your agent's state in real-time — thinking, responding, idle — with live chat, system monitoring, and audio visualization.\n\n![JARVIS UI Preview](assets/images/desktop-red.png)\n\n### Theme Variants\n\n| Cyan | Green |\n|------|-------|\n| ![Cyan Theme](assets/images/theme-cyan.png) | ![Green Theme](assets/images/theme-green.png) |\n\n### Mobile\n\n<img src=\"assets/images/mobile.png\" alt=\"Mobile UI\" width=\"300\">\n\n## Features\n\n### 🔮 3D Orb\nInteractive Three.js orb with real-time agent state visualization. Shows **IDLE**, **THINKING**, or **RESPONDING** status with color-coded text. Draggable, audio-reactive, with orbiting particle system.\n\n### 💬 Live Chat\nReal-time streaming chat via OpenClaw Gateway WebSocket.\n- Markdown rendering (code blocks, links, lists)\n- Chat history — loads previous conversations on page load (configurable: 20/50/100/200 messages)\n- File upload — drag & drop, paperclip button, or Ctrl+V paste for images\n- Bubble-style UI with timestamps and sender labels\n\n### 📊 System Monitor\nLive system metrics pushed via SSE.\n- CPU usage, memory, uptime\n- Current model name and token count\n- Auto-updating, no polling\n\n### 🎵 Audio Visualizer\nThree-layer audio visualization that reacts to TTS playback:\n- **Spectrum** — frequency bar graph\n- **Ring** — concentric circles that pulse with audio\n- **Waveform** — oscilloscope-style wave display\n\n### 📋 Task Manager\nFull CRUD task board with real-time sync.\n- Priority levels, progress tracking, tags\n- Persistent storage (server-side JSON)\n- SSE push — updates appear instantly across tabs\n\n### 🧠 Memory Timeline\nDisplays daily topics extracted from your agent's `memory/*.md` files.\n- Shows `##` headings as topic entries per day\n- Collapsible days, TODAY/YESTERDAY labels\n- \"More\" button to load older entries (7 days at a time)\n\n### ⏰ Schedule\nView and control your agent's scheduled tasks.\n- **Heartbeat** — shows system heartbeat status and interval\n- **Cron Jobs** — toggle enable/disable directly from the UI\n\n### 🔧 Skills Browser\nScans and displays all installed skills (workspace + global).\n\n### 🗣️ TTS (Text-to-Speech)\nDual engine support:\n- **Edge TTS** (default) — free, 300+ voices, multilingual\n- **macOS `say`** — offline fallback, requires ffmpeg\n- Switchable from the Controls panel\n\n### 🎨 Theme System\nOne-click color scheme switching via HSL hue rotation.\n- 6-color palette in Controls panel (red, orange, green, cyan, blue, purple)\n- Affects entire UI: panels, orb, particles, spectrum, background\n- Persisted in localStorage\n\n### ⚡ Power Save Mode\nReduce resource usage for background monitoring.\n- Throttles render from 60fps to 15fps\n- Disables background animations, particles, scan lines\n- Toggle from Controls panel, persisted in localStorage\n\n### 📱 Mobile Ready\nResponsive UI with touch gestures.\n- Swipe up/down on chat header for fullscreen/collapse\n- Floating toolbar for quick panel access\n- PWA — installable as a home screen app\n\n## Quick Start\n\n### From ClawHub\n```bash\nnpx clawhub install jarvis-ui\ncd skills/jarvis-ui\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js\n```\n\n### From GitHub\n```bash\ngit clone https://github.com/jincocodev/openclaw-jarvis-ui-ui.git\ncd openclaw-jarvis\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n### ⚠️ Remote Access (non-localhost)\n\nIf running JARVIS on a remote server (not localhost), OpenClaw Gateway requires a secure context. Add this to `~/.openclaw/openclaw.json`:\n\n```json\n{ \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n```\n\nThen restart the Gateway: `openclaw gateway restart`\n\n## Get Your Gateway Token\n\n`setup.sh` auto-detects your token from `~/.openclaw/openclaw.json`. If auto-detection fails, set it manually:\n\n```bash\necho \"GATEWAY_TOKEN=your_token\" > .env\n```\n\nFind your token: run `openclaw status` or check `~/.openclaw/openclaw.json` → `gateway.token`.\n\n## Customize\n\n```bash\ncp config.json config.local.json\n# Edit config.local.json — it overrides config.json\n```\n\n```json\n{\n  \"name\": \"My Agent HUD\",\n  \"agent\": {\n    \"name\": \"Friday\",\n    \"emoji\": \"💎\",\n    \"sessionKey\": \"agent:main:main\"\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\",\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500\n  }\n}\n```\n\n| Key | Description | Default |\n|-----|-------------|---------|\n| `name` | Dashboard title | `\"JARVIS\"` |\n| `agent.name` | Agent display name | `\"JARVIS\"` |\n| `agent.emoji` | Agent emoji | `\"🤖\"` |\n| `agent.sessionKey` | OpenClaw session to connect | `\"agent:main:main\"` |\n| `server.port` | Server port | `9999` |\n| `server.gatewayUrl` | Gateway WebSocket URL | `\"ws://127.0.0.1:18789\"` |\n| `tts.engine` | TTS engine (`edge` or `say`) | `\"edge\"` |\n| `tts.edgeVoice` | Primary Edge TTS voice | `\"en-US-AriaNeural\"` |\n| `tts.edgeVoiceAlt` | Fallback Edge TTS voice | — |\n| `tts.voice` | macOS `say` voice name | `\"Samantha\"` |\n| `tts.maxChars` | Max characters per TTS request | `500` |\n\n**Popular Edge TTS voices:**\n\n| Language | Voice |\n|----------|-------|\n| English (US) | `en-US-AriaNeural`, `en-US-GuyNeural` |\n| 中文 (台灣) | `zh-TW-HsiaoChenNeural`, `zh-TW-YunJheNeural` |\n| 中文 (大陸) | `zh-CN-XiaoxiaoNeural`, `zh-CN-YunxiNeural` |\n| 日本語 | `ja-JP-NanamiNeural` |\n\nFull list: `python3 -m edge_tts --list-voices`\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `npm run dev` | Development (Vite HMR + backend) |\n| `npm run build` | Build static files to `dist/` |\n| `npm start` | Production server (serves `dist/`) |\n\n## Production (pm2)\n\n```bash\nnpm i -g pm2\nnpm run build\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (default TTS engine: `pip install edge-tts`)\n- ffmpeg (optional, only needed for macOS `say` engine)\n\n## Architecture\n\n```\nBrowser (Vite SPA)\n  └→ src/main.js\n       ├→ core/ (scene, audio, particles)\n       └→ components/ (chat, tasks, skills, memory, schedule, ...)\n\nServer (Express + WebSocket)\n  └→ server/\n       ├→ index.js       — entry point + middleware\n       ├→ gateway.js     — Gateway WS relay\n       ├→ sse.js         — SSE broadcast\n       ├→ tts.js         — TTS engine (Edge + macOS)\n       ├→ system-monitor.js\n       └→ routes/        — REST API endpoints\n```\n\n## Credits\n\nBased on the [Three.js Orb Visualizer](https://codepen.io/filipz/pen/yyyRgry) by [Filip Zrnzevic](https://codepen.io/filipz) — original concept, 3D orb design, and audio visualization. Adapted into an OpenClaw agent dashboard by [Jincoco](mailto:jincoco88912@gmail.com).\n\n## License\n\nISC\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7frkd6pxy98974psgx9gp3md81881m\",\n  \"slug\": \"jarvis-ui\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1771260419995\n}\n\nFile v1.0.0:config.json\n\n{\n  \"name\": \"JARVIS\",\n  \"agent\": {\n    \"name\": \"JARVIS\",\n    \"emoji\": \"🤖\",\n    \"sessionKey\": \"agent:main:main\",\n    \"skills\": []\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500,\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\"\n  },\n  \"theme\": {\n    \"accentPrimary\": \"#ff4e42\",\n    \"accentSecondary\": \"#c0392b\"\n  }\n}\n\nFile v1.0.0:package-lock.json\n\n{\n  \"name\": \"openclaw-jarvis-ui\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"openclaw-jarvis-ui\",\n      \"version\": \"1.0.0\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"@ricky0123/vad-web\": \"^0.0.30\",\n        \"express\": \"^5.2.1\",\n        \"gsap\": \"^3.14.2\",\n        \"multer\": \"^2.0.2\",\n        \"three\": \"^0.175.0\",\n        \"ws\": \"^8.19.0\"\n      },\n      \"devDependencies\": {\n        \"concurrently\": \"^9.2.1\",\n        \"vite\": \"^7.3.1\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz\",\n      \"integrity\": \"sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz\",\n      \"integrity\": \"sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz\",\n      \"integrity\": \"sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz\",\n      \"integrity\": \"sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz\",\n      \"integrity\": \"sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz\",\n      \"integrity\": \"sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz\",\n      \"integrity\": \"sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz\",\n      \"integrity\": \"sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz\",\n      \"integrity\": \"sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz\",\n      \"integrity\": \"sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz\",\n      \"integrity\": \"sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz\",\n      \"integrity\": \"sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz\",\n      \"integrity\": \"sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz\",\n      \"integrity\": \"sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz\",\n      \"integrity\": \"sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz\",\n      \"integrity\": \"sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz\",\n      \"integrity\": \"sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz\",\n      \"integrity\": \"sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz\",\n      \"integrity\": \"sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz\",\n      \"integrity\": \"sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz\",\n      \"integrity\": \"sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz\",\n      \"integrity\": \"sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz\",\n      \"integrity\": \"sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz\",\n      \"integrity\": \"sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz\",\n      \"integrity\": \"sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz\",\n      \"integrity\": \"sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@protobufjs/aspromise\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz\",\n      \"integrity\": \"sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/base64\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz\",\n      \"integrity\": \"sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/codegen\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz\",\n      \"integrity\": \"sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/eventemitter\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz\",\n      \"integrity\": \"sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/fetch\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz\",\n      \"integrity\": \"sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"@protobufjs/aspromise\": \"^1.1.1\",\n        \"@protobufjs/inquire\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/@protobufjs/float\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz\",\n      \"integrity\": \"sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/inquire\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz\",\n      \"integrity\": \"sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/path\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz\",\n      \"integrity\": \"sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/pool\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz\",\n      \"integrity\": \"sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/utf8\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz\",\n      \"integrity\": \"sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@ricky0123/vad-web\": {\n      \"version\": \"0.0.30\",\n      \"resolved\": \"https://registry.npmjs.org/@ricky0123/vad-web/-/vad-web-0.0.30.tgz\",\n      \"integrity\": \"sha512-cJyYrh4YeeUBJcbR9Bic/bFDyB9qBkAepvpuWM3vLxnAi7bC3VHzf51UeNdT+OtY4D7MLAgV8iJMc4z41ZnaWg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"onnxruntime-web\": \"^1.17.0\"\n      }\n    },\n    \"node_modules/@rollup/rollup-android-arm-eabi\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz\",\n      \"integrity\": \"sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-android-arm64\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz\",\n      \"integrity\": \"sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-arm64\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz\",\n      \"integrity\": \"sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-x64\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz\",\n      \"integrity\": \"sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-arm64\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz\",\n      \"integrity\": \"sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-x64\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz\",\n      \"integrity\": \"sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz\",\n      \"integrity\": \"sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz\",\n      \"integrity\": \"sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz\",\n      \"integrity\": \"sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz\",\n      \"integrity\": \"sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-gnu\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz\",\n      \"integrity\": \"sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-musl\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz\",\n      \"integrity\": \"sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-gnu\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz\",\n      \"integrity\": \"sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-musl\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz\",\n      \"integrity\": \"sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz\",\n      \"integrity\": \"sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz\",\n      \"integrity\": \"sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz\",\n      \"integrity\": \"sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz\",\n      \"integrity\": \"sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-musl\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz\",\n      \"integrity\": \"sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openbsd-x64\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz\",\n      \"integrity\": \"sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openharmony-arm64\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz\",\n      \"integrity\": \"sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz\",\n      \"integrity\": \"sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz\",\n      \"integrity\": \"sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-gnu\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz\",\n      \"integrity\": \"sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n      \"version\": \"4.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz\",\n      \"integrity\": \"sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n      \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"25.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz\",\n      \"integrity\": \"sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~7.16.0\"\n      }\n    },\n    \"node_modules/accepts\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz\",\n      \"integrity\": \"sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-types\": \"^3.0.0\",\n        \"negotiator\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/append-field\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz\",\n      \"integrity\": \"sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/body-parser\": {\n      \"version\": \"2.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz\",\n      \"integrity\": \"sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bytes\": \"^3.1.2\",\n        \"content-type\": \"^1.0.5\",\n        \"debug\": \"^4.4.3\",\n        \"http-errors\": \"^2.0.0\",\n        \"iconv-lite\": \"^0.7.0\",\n        \"on-finished\": \"^2.4.1\",\n        \"qs\": \"^6.14.1\",\n        \"raw-body\": \"^3.0.1\",\n        \"type-is\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/buffer-from\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n      \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/busboy\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz\",\n      \"integrity\": \"sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==\",\n      \"dependencies\": {\n        \"streamsearch\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.16.0\"\n      }\n    },\n    \"node_modules/bytes\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz\",\n      \"integrity\": \"sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/chalk\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n      \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.1.0\",\n        \"supports-color\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/chalk/node_modules/supports-color\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n      \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"has-flag\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/cliui\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n      \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"wrap-ansi\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/concat-stream\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz\",\n      \"integrity\": \"sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==\",\n      \"engines\": [\n        \"node >= 6.0\"\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffer-from\": \"^1.0.0\",\n        \"inherits\": \"^2.0.3\",\n        \"readable-stream\": \"^3.0.2\",\n        \"typedarray\": \"^0.0.6\"\n      }\n    },\n    \"node_modules/concurrently\": {\n      \"version\": \"9.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz\",\n      \"integrity\": \"sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"chalk\": \"4.1.2\",\n        \"rxjs\": \"7.8.2\",\n        \"shell-quote\": \"1.8.3\",\n        \"supports-color\": \"8.1.1\",\n        \"tree-kill\": \"1.2.2\",\n        \"yargs\": \"17.7.2\"\n      },\n      \"bin\": {\n        \"conc\": \"dist/bin/concurrently.js\",\n        \"concurrently\": \"dist/bin/concurrently.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n      }\n    },\n    \"node_modules/content-disposition\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz\",\n      \"integrity\": \"sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/content-type\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz\",\n      \"integrity\": \"sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/cookie\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz\",\n      \"integrity\": \"sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/cookie-signature\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz\",\n      \"integrity\": \"sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.6.0\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/depd\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/depd/-/depd-2.0.0.tgz\",\n      \"integrity\": \"sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/ee-first\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz\",\n      \"integrity\": \"sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/encodeurl\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz\",\n      \"integrity\": \"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/esbuild\": {\n      \"version\": \"0.27.3\",\n      \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz\",\n      \"integrity\": \"sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"esbuild\": \"bin/esbuild\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"@esbuild/aix-ppc64\": \"0.27.3\",\n        \"@esbuild/android-arm\": \"0.27.3\",\n        \"@esbuild/android-arm64\": \"0.27.3\",\n        \"@esbuild/android-x64\": \"0.27.3\",\n        \"@esbuild/darwin-arm64\": \"0.27.3\",\n        \"@esbuild/darwin-x64\": \"0.27.3\",\n        \"@esbuild/freebsd-arm64\": \"0.27.3\",\n        \"@esbuild/freebsd-x64\": \"0.27.3\",\n        \"@esbuild/linux-arm\": \"0.27.3\",\n        \"@esbuild/linux-arm64\": \"0.27.3\",\n        \"@esbuild/linux-ia32\": \"0.27.3\",\n        \"@esbuild/linux-loong64\": \"0.27.3\",\n        \"@esbuild/linux-mips64el\": \"0.27.3\",\n        \"@esbuild/linux-ppc64\": \"0.27.3\",\n        \"@esbuild/linux-riscv64\": \"0.27.3\",\n        \"@esbuild/linux-s390x\": \"0.27.3\",\n        \"@esbuild/linux-x64\": \"0.27.3\",\n        \"@esbuild/netbsd-arm64\": \"0.27.3\",\n        \"@esbuild/netbsd-x64\": \"0.27.3\",\n        \"@esbuild/openbsd-arm64\": \"0.27.3\",\n        \"@esbuild/openbsd-x64\": \"0.27.3\",\n        \"@esbuild/openharmony-arm64\": \"0.27.3\",\n        \"@esbuild/sunos-x64\": \"0.27.3\",\n        \"@esbuild/win32-arm64\": \"0.27.3\",\n        \"@esbuild/win32-ia32\": \"0.27.3\",\n        \"@esbuild/win32-x64\": \"0.27.3\"\n      }\n    },\n    \"node_modules/escalade\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n      \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/escape-html\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz\",\n      \"integrity\": \"sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/etag\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/etag/-/etag-1.8.1.tgz\",\n      \"integrity\": \"sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/express\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/express/-/express-5.2.1.tgz\",\n      \"integrity\": \"sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"accepts\": \"^2.0.0\",\n        \"body-parser\": \"^2.2.1\",\n        \"content-disposition\": \"^1.0.0\",\n        \"content-type\": \"^1.0.5\",\n        \"cookie\": \"^0.7.1\",\n        \"cookie-signature\": \"^1.2.1\",\n        \"debug\": \"^4.4.0\",\n        \"depd\": \"^2.0.0\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"etag\": \"^1.8.1\",\n        \"finalhandler\": \"^2.1.0\",\n        \"fresh\": \"^2.0.0\",\n        \"http-errors\": \"^2.0.0\",\n        \"merge-descriptors\": \"^2.0.0\",\n        \"mime-types\": \"^3.0.0\",\n        \"on-finished\": \"^2.4.1\",\n        \"once\": \"^1.4.0\",\n        \"parseurl\": \"^1.3.3\",\n        \"proxy-addr\": \"^2.0.7\",\n        \"qs\": \"^6.14.0\",\n        \"range-parser\": \"^1.2.1\",\n        \"router\": \"^2.2.0\",\n        \"send\": \"^1.1.0\",\n        \"serve-static\": \"^2.2.0\",\n        \"statuses\": \"^2.0.1\",\n        \"type-is\": \"^2.0.1\",\n        \"vary\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/fdir\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz\",\n      \"integrity\": \"sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"picomatch\": \"^3 || ^4\"\n      },\n      \"peerDependenciesMeta\": {\n        \"picomatch\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/finalhandler\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz\",\n      \"integrity\": \"sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.0\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"on-finished\": \"^2.4.1\",\n        \"parseurl\": \"^1.3.3\",\n        \"statuses\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 18.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/flatbuffers\": {\n      \"version\": \"25.9.23\",\n      \"resolved\": \"https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz\",\n      \"integrity\": \"sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==\",\n      \"license\": \"Apache-2.0\"\n    },\n    \"node_modules/forwarded\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz\",\n      \"integrity\": \"sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/fresh\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz\",\n      \"integrity\": \"sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n      \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-caller-file\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"6.* || 8.* || >= 10.*\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.\n\nFile v1.0.0:package.json\n\n{\n  \"name\": \"openclaw-jarvis-ui\",\n  \"version\": \"1.0.0\",\n  \"description\": \"這是 OpenClaw 的互動介面原型（JARVIS 風格 HUD）。 以 CodePen yyyRgry 為基礎，已**完整本地化離線**，可作為後續互動 UI 的雛形。\",\n  \"main\": \"server/index.js\",\n  \"scripts\": {\n    \"dev\": \"concurrently \\\"node --env-file=.env server/index.js\\\" \\\"npx vite --port 8001 --host\\\"\",\n    \"build\": \"vite build\",\n    \"start\": \"node --env-file=.env server/index.js\",\n    \"server\": \"node --env-file=.env server/index.js\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jincocodev/openclaw-jarvis-ui-ui.git\"\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"jarvis\",\n    \"dashboard\",\n    \"hud\",\n    \"threejs\",\n    \"agent\"\n  ],\n  \"author\": \"Jincoco <jincoco88912@gmail.com>\",\n  \"license\": \"ISC\",\n  \"type\": \"module\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui/issues\"\n  },\n  \"homepage\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui#readme\",\n  \"devDependencies\": {\n    \"concurrently\": \"^9.2.1\",\n    \"vite\": \"^7.3.1\"\n  },\n  \"dependencies\": {\n    \"@ricky0123/vad-web\": \"^0.0.30\",\n    \"express\": \"^5.2.1\",\n    \"gsap\": \"^3.14.2\",\n    \"multer\": \"^2.0.2\",\n    \"three\": \"^0.175.0\",\n    \"ws\": \"^8.19.0\"\n  }\n}\n\nFile v1.0.0:public/manifest.json\n\n{\n  \"name\": \"JARVIS\",\n  \"short_name\": \"JARVIS\",\n  \"description\": \"OpenClaw JARVIS HUD Interface\",\n  \"start_url\": \"/\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#0a0a0a\",\n  \"theme_color\": \"#ff4e42\",\n  \"orientation\": \"any\",\n  \"icons\": [\n    {\n      \"src\": \"/icons/icon-192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/icons/icon-512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ]\n}\n\nFile v1.0.0:src/config/agent.json\n\n{\n  \"name\": \"JARVIS\",\n  \"nameEn\": \"JARVIS\",\n  \"title\": \"OPENCLAW.JARVIS\",\n  \"status\": \"ONLINE\",\n  \"model\": \"GITHUB-COPILOT / CLAUDE-OPUS-4.6\",\n  \"provider\": \"GITHUB-COPILOT\",\n  \"contextSize\": 200000,\n  \"colors\": {\n    \"primary\": \"#ff4e42\",\n    \"secondary\": \"#c2362f\",\n    \"tertiary\": \"#ffb3ab\",\n    \"success\": \"#4ade80\",\n    \"warning\": \"#fbbf24\",\n    \"danger\": \"#ff4e42\"\n  },\n  \"skills\": [\n    { \"icon\": \"🎤\", \"name\": \"WHISPER\", \"status\": \"on\" },\n    { \"icon\": \"🐦\", \"name\": \"X-API\", \"status\": \"on\" },\n    { \"icon\": \"📧\", \"name\": \"GMAIL\", \"status\": \"on\" },\n    { \"icon\": \"📅\", \"name\": \"CALENDAR\", \"status\": \"on\" },\n    { \"icon\": \"🌤️\", \"name\": \"WEATHER\", \"status\": \"on\" },\n    { \"icon\": \"🔐\", \"name\": \"NORDVPN\", \"status\": \"off\" }\n  ],\n  \"tasks\": [\n    { \"text\": \"聊天視窗改造\", \"status\": \"done\" },\n    { \"text\": \"系統監控面板\", \"status\": \"done\" },\n    { \"text\": \"MODEL STATUS 面板\", \"status\": \"done\" },\n    { \"text\": \"動態背景動畫\", \"status\": \"done\" },\n    { \"text\": \"Tab 切換面板\", \"status\": \"done\" },\n    { \"text\": \"重構模組化\", \"status\": \"active\" },\n    { \"text\": \"Header 品牌化\", \"status\": \"pending\" },\n    { \"text\": \"Config 檔案架構\", \"status\": \"pending\" },\n    { \"text\": \"接入 OpenClaw API\", \"status\": \"pending\" }\n  ],\n  \"schedule\": [\n    { \"time\": \"*/30 *\", \"name\": \"HEARTBEAT\", \"status\": \"on\" },\n    { \"time\": \"09:00\", \"name\": \"早安問候\", \"status\": \"on\" },\n    { \"time\": \"12:00\", \"name\": \"信箱檢查\", \"status\": \"on\" },\n    { \"time\": \"18:00\", \"name\": \"天氣預報\", \"status\": \"off\" }\n  ],\n  \"memories\": [\n    \"📋 JARVIS UI Tab 切換面板\",\n    \"🎨 動態背景呼吸動畫\",\n    \"📊 Model Status 面板完成\",\n    \"💻 System Monitor 上線\",\n    \"💬 聊天視窗改造完成\"\n  ],\n  \"demoTracks\": [\n    { \"label\": \"MERKABA\", \"url\": \"./assets/audio/Merkaba.mp3\" },\n    { \"label\": \"DHAMIKA\", \"url\": \"./assets/audio/Dhamika.mp3\" },\n    { \"label\": \"VACANT\", \"url\": \"./assets/audio/Vacant.mp3\" },\n    { \"label\": \"LXSTNGHT\", \"url\": \"./assets/audio/lxstnght-back_1.mp3\" }\n  ]\n}\n\nFile v1.0.0:public/humans.txt\n\n/* humanstxt.org */\n\n/* TEAM */\nDeveloper: Jincoco\nContact: jincoco88912@gmail.com\nDescription: Adapted the original CodePen demo into an OpenClaw agent dashboard.\n\n/* THANKS */\nOriginal Design: Filip Zrnzevic (@filipz)\nSite: https://codepen.io/filipz\nPen: https://codepen.io/filipz/pen/yyyRgry\nNote: Three.js orb + audio visualizer concept. Beautiful work.\n\n/* SITE */\nBuilt with: Three.js, GSAP, Vite, Express\nPowered by: OpenClaw (https://github.com/openclaw/openclaw)","readmeExcerpt":"Skill: JARVIS UI Owner: jincocodev Summary: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spec... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-02-22T09:15:58.198Z | user Add gateway device identity support v1.0.2 | 2026-02-22T09:12:23.098Z | user Add gateway device identity support v1.0.1 | 2026-02-16T16:56","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"./setup.sh"},{"language":"json","snippet":"> { \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n>"},{"language":"bash","snippet":"node --env-file=.env server/index.js"},{"language":"bash","snippet":"cp config.json config.local.json"},{"language":"bash","snippet":"npm i -g pm2\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save"},{"language":"bash","snippet":"npx clawhub install jarvis-ui\ncd skills/jarvis-ui\n./setup.sh   # auto-detects Gateway token\nnode --env-file=.env server/index.js"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: jarvis-ui\ndescription: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spectrum analyzer, system monitor, and TTS. Use when you want a visual dashboard for your OpenClaw agent.\nmetadata: {\"openclaw\":{\"emoji\":\"🦾\",\"version\":\"1.0.3\",\"requires\":{\"bins\":[\"node\",\"npm\"]},\"homepage\":\"https://github.com/jincocodev/openclaw-jarvis-ui\"}}\n---\n\n# 🦾 JARVIS UI\n\nA JARVIS-style HUD interface for your OpenClaw agent.\n\n## Install\n\n```bash\n./setup.sh\n```\n\nGateway token is auto-detected from `~/.openclaw/openclaw.json`.\n\n> **⚠️ Remote/non-localhost access:** If JARVIS server is accessed from a different machine (not localhost), add this to your `~/.openclaw/openclaw.json`:\n> ```json\n> { \"gateway\": { \"controlUi\": { \"allowInsecureAuth\": true } } }\n> ```\n> Then restart OpenClaw Gateway.\n\nThen start:\n\n```bash\nnode --env-file=.env server/index.js\n```\n\nOpen `http://localhost:9999`\n\n## Customize\n\nCopy and edit `config.local.json`:\n\n```bash\ncp config.json config.local.json\n```\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `name` | Page title | JARVIS |\n| `agent.name` | Agent display name | JARVIS |\n| `agent.emoji` | Agent emoji | 🤖 |\n| `agent.sessionKey` | OpenClaw session key | agent:main:main |\n| `server.port` | Server port | 9999 |\n| `tts.voice` | macOS TTS voice | Samantha |\n\n## Production\n\n```bash\nnpm i -g pm2\npm2 start server/index.js --name jarvis --node-args=\"--env-file=.env\"\npm2 save\n```\n\n## Features\n\n- 🔮 Three.js orb — reacts to agent state (thinking/speaking/idle)\n- 💬 Real-time chat — Gateway WebSocket relay\n- 🎵 Audio visualizer — spectrum, ring, waveform\n- 📊 Model status — live token usage, model info\n- 🖥️ System monitor — CPU, memory, uptime\n- 🗣️ TTS — Edge TTS (free, cross-platform) + macOS `say` (offline)\n- 📱 Mobile responsive + PWA\n\n## Requirements\n\n- Node.js 20+\n- OpenClaw Gateway running locally\n- Python 3 + `edge-tts` (`pip install edge-tts`) for TTS\n- ffmpeg (optional, macOS `say` engine only)"},{"path":"README.md","content":"# 🦾 JARVIS UI\n\nA JARVIS-style HUD dashboard for [OpenClaw](https://github.com/openclaw/openclaw) agents.\n\nInteractive 3D orb that visualizes your agent's state in real-time — thinking, responding, idle — with live chat, system monitoring, and audio visualization.\n\n![JARVIS UI Preview](assets/images/desktop-red.png)\n\n### Theme Variants\n\n| Cyan | Green |\n|------|-------|\n| ![Cyan Theme](assets/images/theme-cyan.png) | ![Green Theme](assets/images/theme-green.png) |\n\n### Mobile\n\n<img src=\"assets/images/mobile.png\" alt=\"Mobile UI\" width=\"300\">\n\n## Features\n\n### 🔮 3D Orb\nInteractive Three.js orb with real-time agent state visualization. Shows **IDLE**, **THINKING**, or **RESPONDING** status with color-coded text. Draggable, audio-reactive, with orbiting particle system.\n\n### 💬 Live Chat\nReal-time streaming chat via OpenClaw Gateway WebSocket.\n- Markdown rendering (code blocks, links, lists)\n- Chat history — loads previous conversations on page load (configurable: 20/50/100/200 messages)\n- File upload — drag & drop, paperclip button, or Ctrl+V paste for images\n- Bubble-style UI with timestamps and sender labels\n\n### 📊 System Monitor\nLive system metrics pushed via SSE.\n- CPU usage, memory, uptime\n- Current model name and token count\n- Auto-updating, no polling\n\n### 🎵 Audio Visualizer\nThree-layer audio visualization that reacts to TTS playback:\n- **Spectrum** — frequency bar graph\n- **Ring** — concentric circles that pulse with audio\n- **Waveform** — oscilloscope-style wave display\n\n### 📋 Task Manager\nFull CRUD task board with real-time sync.\n- Priority levels, progress tracking, tags\n- Persistent storage (server-side JSON)\n- SSE push — updates appear instantly across tabs\n\n### 🧠 Memory Timeline\nDisplays daily topics extracted from your agent's `memory/*.md` files.\n- Shows `##` headings as topic entries per day\n- Collapsible days, TODAY/YESTERDAY labels\n- \"More\" button to load older entries (7 days at a time)\n\n### ⏰ Schedule\nView and control your agent's scheduled tasks.\n- **Heartbeat** — shows system heartbeat status and interval\n- **Cron Jobs** — toggle enable/disable directly from the UI\n\n### 🔧 Skills Browser\nScans and displays all installed skills (workspace + global).\n\n### 🗣️ TTS (Text-to-Speech)\nDual engine support:\n- **Edge TTS** (default) — free, 300+ voices, multilingual\n- **macOS `say`** — offline fallback, requires ffmpeg\n- Switchable from the Controls panel\n\n### 🎨 Theme System\nOne-click color scheme switching via HSL hue rotation.\n- 6-color palette in Controls panel (red, orange, green, cyan, blue, purple)\n- Affects entire UI: panels, orb, particles, spectrum, background\n- Persisted in localStorage\n\n### ⚡ Power Save Mode\nReduce resource usage for background monitoring.\n- Throttles render from 60fps to 15fps\n- Disables background animations, particles, scan lines\n- Toggle from Controls panel, persisted in localStorage\n\n### 📱 Mobile Ready\nResponsive UI with touch gestures.\n- Swipe up/down on chat header for fullscreen/collapse\n- Floa"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7frkd6pxy98974psgx9gp3md81881m\",\n  \"slug\": \"jarvis-ui\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1771751758198\n}"},{"path":"config.json","content":"{\n  \"name\": \"JARVIS\",\n  \"agent\": {\n    \"name\": \"JARVIS\",\n    \"emoji\": \"🤖\",\n    \"sessionKey\": \"agent:main:main\",\n    \"skills\": []\n  },\n  \"server\": {\n    \"port\": 9999,\n    \"gatewayUrl\": \"ws://127.0.0.1:18789\"\n  },\n  \"tts\": {\n    \"voice\": \"Samantha\",\n    \"maxChars\": 500,\n    \"engine\": \"edge\",\n    \"edgeVoice\": \"en-US-AriaNeural\",\n    \"edgeVoiceAlt\": \"zh-TW-HsiaoChenNeural\"\n  },\n  \"theme\": {\n    \"accentPrimary\": \"#ff4e42\",\n    \"accentSecondary\": \"#c0392b\"\n  }\n}"},{"path":"package.json","content":"{\n  \"name\": \"openclaw-jarvis-ui\",\n  \"version\": \"1.0.3\",\n  \"description\": \"這是 OpenClaw 的互動介面原型（JARVIS 風格 HUD）。 以 CodePen yyyRgry 為基礎，已**完整本地化離線**，可作為後續互動 UI 的雛形。\",\n  \"main\": \"server/index.js\",\n  \"scripts\": {\n    \"dev\": \"concurrently \\\"node --env-file=.env server/index.js\\\" \\\"npx vite --port 8001 --host\\\"\",\n    \"build\": \"vite build\",\n    \"start\": \"node --env-file=.env server/index.js\",\n    \"server\": \"node --env-file=.env server/index.js\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jincocodev/openclaw-jarvis-ui-ui.git\"\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"jarvis\",\n    \"dashboard\",\n    \"hud\",\n    \"threejs\",\n    \"agent\"\n  ],\n  \"author\": \"Jincoco <jincoco88912@gmail.com>\",\n  \"license\": \"ISC\",\n  \"type\": \"module\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui/issues\"\n  },\n  \"homepage\": \"https://github.com/jincocodev/openclaw-jarvis-ui-ui#readme\",\n  \"devDependencies\": {\n    \"concurrently\": \"^9.2.1\",\n    \"vite\": \"^7.3.1\"\n  },\n  \"dependencies\": {\n    \"@ricky0123/vad-web\": \"^0.0.30\",\n    \"express\": \"^5.2.1\",\n    \"gsap\": \"^3.14.2\",\n    \"multer\": \"^2.0.2\",\n    \"three\": \"^0.175.0\",\n    \"ws\": \"^8.19.0\"\n  }\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spec... Skill: JARVIS UI Owner: jincocodev Summary: JARVIS-style HUD web interface for OpenClaw agents. Interactive Three.js orb with agent state visualization, real-time chat via Gateway WebSocket, audio spec... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-02-22T09:15:58.198Z | user Add gateway device identity support v1.0.2 | 2026-02-22T09:12:23.098Z | user Add gateway device identity support v1.0.1 | 2026-02-16T16:56","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1262,"uniquenessScore":54,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T19:57:34.064Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T19:57:34.064Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T23:46:14.390Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}