{“content”:”---\nname: termux-pwa-server\ndescription: 在 Android Termux 上搭建 PWA Web App 的项目模板,用于创建独立于 Telegram 的 Hermes 控制界面\n---\n\n# Termux PWA Server 搭建\n\n在 Android Termux 上搭建 PWA Web App 的模板项目。\n\n## 背景\n- 用户 Sozo 想要建立 JakePhone PWA\n- 目标:在 Termux 上运行一个 Web App,通过更友好的 UI 来控制 Hermes Agent\n- 约束:绝不修改现有的 Hermes gateway 配置,保持 Telegram bot 独立运行\n\n## 项目结构\n\n~/jakephone-pwa/\n├── server.js # Node.js Express + WebSocket 服务器\n├── public/\n│ ├── index.html # PWA 主页面\n│ ├── style.css # 样式\n│ ├── app.js # 前端逻辑\n│ ├── manifest.json # PWA 配置\n│ └── sw.js # Service Worker\n└── package.json\n\n\n## 與 Hermes 後端對接(已實現)\n\n重要發現: Hermes Gateway(端口 8642)的 HTTP API 不是用來發送消息的。正確方式是透過 CLI:\n\njavascript\n// server.js 中調用 Hermes\nconst { spawn } = require('child_process');\nconst hermesProcess = spawn('hermes', ['chat', '-q', message.content, '-Q', '--source', 'pwa'], {\n cwd: process.env.HOME\n});\n\n\nHermes CLI 輸出格式(需解析):\n\n╭─ ⚕ Hermes ───────────────────────────────────────────────────────────────────╮\n回應內容\nsession_id: 20260417_xxxxxx\n\n\n解析函數:\njavascript\nfunction parseHermesOutput(output) {\n let text = output.replace(/\\r/g, '');\n text = text.replace(/^\\n?╭─[^\\n]*─╮\\n?/, ''); // 去除框線標題\n text = text.replace(/\\nsession_id:[^\\n]*/g, ''); // 去除 session_id\n text = text.replace(/[╭╮╰│─]/g, ''); // 去除殘留邊框\n return text.trim() || '(無回應)';\n}\n\n\n## 啟動\nbash\ncd ~/jakephone-pwa\nnode server.js\n# 查看日誌:cat ~/jakephone-pwa/server.log\n# 查看隧道:cat ~/jakephone-pwa/cloudflared.log | grep trycloudflare\n\n\n## 疑難排解\n\n### pip 安裝慢 / 超時(lxml 等)\nTermux 上 Python 3.13 aarch64 沒有預編譯 wheel,pip 會從源碼編譯 → 極慢或超時。\n\n解法: 用 Termux 原生包代替:\nbash\npkg install python-lxml -y # 快速安裝 lxml(預編譯)\npip install trafilatura # 然後正常 pip install\n\n\n常見需要這麼做的包:lxml、numpy、scipy、pandas、pillow。\n\n## 當前狀態\n- ✅ Express + WebSocket 服務器(端口 3000)\n- ✅ cloudflared 隧道(公網訪問 URL)\n- ✅ PWA UI(深色主題、聊天/儀表盤/工具/設置)\n- ✅ Service Worker + manifest(可安裝到主畫面)\n- ✅ Hermes CLI 對接(已實現)\n- 🔜 語音輸入/輸出\n- 🔜 更穩定的內網穿透方案(cloudflared URL 每次重啟會變)\n”}