{"_id":"@asahimoon/dsh-desktop-pet","name":"@asahimoon/dsh-desktop-pet","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"@asahimoon/dsh-desktop-pet","version":"0.2.0","description":"DSH 桌面宠物（鲸鱼娘）— 透明置顶悬浮窗 + Agent 状态联动 + 热配置 + 多角色兼容（Codex/petdex）。安装：dsh plugin --profile web add @asahimoon/dsh-desktop-pet；独立运行：npx electron main.js；打包 exe：npm run dist","main":"index.mjs","exports":{".":"./index.mjs","./package.json":"./package.json"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"scripts":{"start":"electron main.js","dev":"electron main.js --dev","check":"node --check main.js && node --check preload.js && node --check index.mjs && node --check config.mjs && node --check renderer/core.js && node --check renderer/pet.js","test":"vitest run","dist":"electron-builder --win -p never","dist:portable":"electron-builder --win portable -p never","dist:mac":"electron-builder --mac -p never","dist:linux":"electron-builder --linux -p never","smoke:menu":"node scripts/smoke/smoke-menu.cjs","smoke:pierce":"node scripts/smoke/smoke-pierce.cjs","smoke:idle":"node scripts/smoke/smoke-idle.cjs","smoke:drag":"node scripts/smoke/smoke-drag.cjs","smoke:nap":"node scripts/smoke/smoke-nap.cjs"},"keywords":["dsh","deepseek-harness","desktop-pet","electron","pet","whale-girl","codex-pet","petdex","tamagotchi"],"author":{"name":"AsahiMoon","email":"814256112@qq.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/AsahiMoon/dsh-desktop-pet.git"},"homepage":"https://github.com/AsahiMoon/dsh-desktop-pet#readme","bugs":{"url":"https://github.com/AsahiMoon/dsh-desktop-pet/issues"},"publishConfig":{"access":"public"},"engines":{"node":">=18"},"dependencies":{"koffi":"^3.1.5","schemastery":"^3.18.0"},"devDependencies":{"electron":"^33.0.0","electron-builder":"^26.15.3","vitest":"^4.1.10"},"build":{"appId":"com.dsh.desktop-pet","productName":"DSH Desktop Pet","compression":"maximum","electronLanguages":["zh-CN","en-US"],"directories":{"output":"dist"},"electronDist":"node_modules/electron/dist","files":["main.js","preload.js","renderer/**","assets/**","package.json"],"asarUnpack":["node_modules/koffi/**"],"extraMetadata":{"main":"main.js"},"win":{"target":["nsis","portable"],"icon":"build/icon.ico","signAndEditExecutable":false},"mac":{"target":["dmg","zip"],"icon":"build/icon.icns","category":"public.app-category.entertainment"},"linux":{"target":["AppImage"],"icon":"build/icons","category":"Utility","executableName":"dsh-desktop-pet"},"nsis":{"oneClick":false,"allowToChangeInstallationDirectory":true}},"_id":"@asahimoon/dsh-desktop-pet@0.2.0","gitHead":"35ea5318bbe920da4bb49b9f961cb22d0fbfc188","_nodeVersion":"22.20.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-6UHADj95eu0+wVhyJT0QsuqZsv2sT9B8cb5Ik0Q9ZmjM+o6+h/sC7aPTLHpamMeZcKbYxUaMI0yk+oTRJGa3rg==","shasum":"dd2977b4a5e6e5910d66f92bac96c59867b5e2e3","tarball":"https://registry.npmjs.org/@asahimoon/dsh-desktop-pet/-/dsh-desktop-pet-0.2.0.tgz","fileCount":30,"unpackedSize":2528927,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHC7xEPftnDCpf/F0N9Z5Qa1YXstasgOOF6jUsAIbx2/AiBR3DSlxELtdAc4fHg3gXC9RoagFUJSgz6FQXx9jukPog=="}]},"_npmUser":{"name":"asahimoon","email":"814256112@qq.com"},"directories":{},"maintainers":[{"name":"asahimoon","email":"814256112@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-desktop-pet_0.2.0_1786861572238_0.06596394091497904"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-16T06:26:12.007Z","0.2.0":"2026-08-16T06:26:12.438Z","modified":"2026-08-16T06:26:12.647Z"},"maintainers":[{"name":"asahimoon","email":"814256112@qq.com"}],"description":"DSH 桌面宠物（鲸鱼娘）— 透明置顶悬浮窗 + Agent 状态联动 + 热配置 + 多角色兼容（Codex/petdex）。安装：dsh plugin --profile web add @asahimoon/dsh-desktop-pet；独立运行：npx electron main.js；打包 exe：npm run dist","homepage":"https://github.com/AsahiMoon/dsh-desktop-pet#readme","keywords":["dsh","deepseek-harness","desktop-pet","electron","pet","whale-girl","codex-pet","petdex","tamagotchi"],"repository":{"type":"git","url":"git+https://github.com/AsahiMoon/dsh-desktop-pet.git"},"author":{"name":"AsahiMoon","email":"814256112@qq.com"},"bugs":{"url":"https://github.com/AsahiMoon/dsh-desktop-pet/issues"},"license":"MIT","readme":"# dsh-desktop-pet · 鲸鱼娘桌面宠物\n\n![npm](https://img.shields.io/npm/v/@asahimoon/dsh-desktop-pet)\n![license](https://img.shields.io/npm/l/@asahimoon/dsh-desktop-pet)\n![build](https://img.shields.io/github/actions/workflow/status/AsahiMoon/dsh-desktop-pet/build.yml?branch=main)\n\n一个住在桌面上的 **DSH 联动桌面宠物**：透明、置顶、无边框的 Electron 小窗，鲸鱼娘住在\n桌面上陪你干活。它既是 **DSH（DeepSeek Harness）bundle 插件**（`dsh plugin` 一条命令\n安装，Agent 状态实时驱动宠物反应），也能 **独立打包成 exe** 当普通桌宠用。\n\n参考 [vlln/whale-girl](https://github.com/vlln/whale-girl)（网页版鲸鱼娘桌宠插件）制作，\n角色素材与动画表来自该 MIT 项目（详见 [NOTICE.md](NOTICE.md)）。\n\n![截图](docs/screenshot.png)\n\n## ✨ 特性\n\n- 🐋 **透明置顶桌宠**：不进任务栏、可拖拽、记住位置，坐下就来，起身就走\n- 🔗 **DSH 状态联动**：任务完成 🎉 庆祝 → 💤 睡一小会儿 → 自动醒来；新任务立即起床工作；\n  思考/等待/出错都有专属动画（详见下方联动表）\n- 🎨 **多角色 / 多格式兼容**：内置鲸鱼娘，支持 Codex/petdex 生态（boba、aemeath 等），\n  角色文件夹即插即用，全部接入同一套状态机\n- ⚙️ **热配置**：尺寸/透明度/角色/游走/睡眠间隔即时生效（DSH 设置 UI 或 config.json）\n- 🖱️ **原生交互**：左键拖拽、右键功能菜单（喂食/玩耍/庆祝/设置/穿透/退出）、点击有反应\n- 🧊 **鼠标穿透 / 📌 桌面置底**：摸鱼时把宠物\"关掉\"也不碍事\n- 🎮 **成长账本**：投喂/玩耍/陪伴时长 → XP → 等级 → 称号（零负反馈）\n- 🚀 **两种分发形态**：npm 插件（DSH 联动） / 单文件 exe（独立桌宠）\n\n## 📦 安装\n\n### 形态一：DSH 插件（带 Agent 状态联动）\n\n```sh\n# 从 npm 安装（发布后）\ndsh plugin --profile web add @asahimoon/dsh-desktop-pet\n\n# 或本地路径安装（开发中）\ndsh plugin --profile web add <本包路径>\n```\n\n安装后**重启 `dsh web`**：插件随 profile 加载，自动在桌面启动宠物窗口并开始监听 Agent\n状态。卸载：`dsh plugin --profile web remove @asahimoon/dsh-desktop-pet`。\n\n> **宠物窗口怎么启动**：插件优先用本机可解析到的 electron（开发环境 / 本地安装自带），\n> 找不到时会自动复用已安装的独立版 exe（`%LOCALAPPDATA%\\Programs\\` 等位置）。\n> 两者都没有时，插件只发信号、不启动窗口——可先按「形态二」装好独立版 exe，Agent 联动\n> 照常工作。宠物意外崩溃（非主动退出）会自动重启，最多重试 5 次。\n\n### 形态二：独立 exe\n\n```sh\nnpm run dist            # Windows：dist/ 下安装器（nsis）与便携版（portable）\nnpm run dist:portable   # 只要便携版单文件 exe\nnpm run dist:mac        # macOS：dmg + zip\nnpm run dist:linux      # Linux：AppImage\n```\n\n双击即用。exe 版的 Agent 联动需要插件形态（Node half 在 DSH 进程内），其余本地行为\n（打盹/游走/喂食/玩耍/成长）完整可用。\n\n> 也可以从 GitHub Releases（CI 三平台自动构建产物）直接下载安装包。\n\n### 跨平台\n\n- **Windows**：原生优化——任务栏隐藏（WS_EX_TOOLWINDOW）、桌面置底（SetWindowPos）\n  走 Win32；DPI 漂移处理针对透明窗口做了专门适配\n- **macOS / Linux**：自动降级为 Electron 原生能力（`skipTaskbar` / `setAlwaysOnTop(false)`），\n  无需额外配置即可运行\n- 右键菜单坐标语义已按 Electron v33 三平台源码逐一验证（Windows/Linux 的\n  `MenuViews::PopupAt`、macOS 的 `MenuMac::PopupAt`），均以窗口相对坐标传入，\n  多屏/多 DPI 下位置一致\n- 图标三平台齐备（ico / icns / png 图标集），由 `scripts/make-icon.cjs` 从鲸鱼娘\n  素材自动生成\n\n## 🔗 DSH 状态联动\n\n| DSH 事件 | 宠物表现 |\n|---|---|\n| 工具调用中 | 🛠️ `working` 工作动画 + 气泡显示工具名 |\n| 回合完成（`session/event` turn/end） | 🎉 `celebrate` 欢呼 → 💤 睡 25 秒 → 自动恢复待机 |\n| 新任务到来（exec 心跳） | 立刻醒来进入工作 |\n| 任务失败 / LLM 请求出错 | 😱 `error` 惊吓 → `disappointed` 失落 |\n| 思考中（turn/start） | 💭 `think` 沉思漂浮 |\n| 等待批准 / 阻塞 | 🕐 `wait` 期待扭动 |\n| 新会话（`agent/session-start`） | 👋 `welcome` 挥手欢迎 |\n| 心跳同步（5s） | 状态对齐，重启后也能跟上 |\n\n**📋 任务进度黑框**：宠物下方一个宽扁的黑色信息框（类似原版 whale-girl 的消息框，\n窗口右侧留了透明加宽区给文字空间）。两种形态：\n\n- **悬停**：简略一瞥 —— `[23:30] 🛠️ 执行中 pwsh` + `📋 2/3 · 验收`\n- **常驻**（右键菜单「📋 常驻任务进度」或设置勾选）：\n  - 简略：与悬停同款\n  - 详细（右键「📋 详细进度」或设置勾选）：当前工具 + **具体在做什么**\n    （`📎 F:\\AI_workspace\\src\\main.js` —— 正在读/写的文件路径、grep 的目录、\n    pwsh 的命令等，取自工具调用参数）+ 已完成步骤（`📋 2/3 正在验收 ✅调研 ✅编码`），\n    空闲时显示实际执行过的工具（`🛠️ 已执行：pwsh · read_file`）\n\n`[HH:MM]` 时间戳与原版 whale-girl 记忆条目的格式一致，每 5 秒刷新；Agent 工作时\n黑框优先于气泡显示。\n\n信号经 `127.0.0.1:43991` 本地 HTTP POST 推送（仅本机回环，无网络暴露）。\n\n## ⚙️ 配置\n\n插件形态：配置注册进 DSH 设置（`dsh-desktop-pet:` 区段），改动即时热生效。\n\n```yaml\ndsh-desktop-pet:\n  size: 110              # 窗口尺寸 px（64–256）\n  opacity: 1             # 透明度（0.2–1）\n  character: whale-girl  # 角色 id\n  walk:\n    enabled: true        # 游走开关\n    intervalMs: 300000   # 游走间隔（ms）\n    durationMs: 26000    # 单次游走时长（ms）\n  sleepAfterMs: 60000    # 空闲多久打盹（ms）\n  taskBarPersistent: false  # 任务进度黑框常驻显示\n  taskBarDetailed: false    # 常驻时显示详细进度（已完成步骤 / 已执行工具）\n  hideWhenIdle: false       # 长时间空闲入睡后隐藏宠物窗口（有活动自动出现）\n```\n\nexe 独立版直接编辑 `%APPDATA%/dsh-desktop-pet/config.json`，保存即热生效。\n\n## 🎭 多角色 / 多格式兼容\n\n宠物在 **两个角色目录** 中自动发现角色：\n\n1. `%APPDATA%/dsh-desktop-pet/characters/<id>/` —— **统一管理目录**（运行时写入）：\n   内置角色（鲸鱼娘）会在**首次启动时自动复制进来**，与 petdex 导入、手动放入的角色\n   放在一起，打开文件夹就能看到、能改、能删\n2. `assets/characters/<id>/` —— 随包内置（只读，用户目录里没有时才作为兜底）\n\n> 内置角色是**复制即管理**：想改鲸鱼娘的素材，直接编辑\n> `characters/whale-girl/` 里的文件即可（用户目录优先）。删掉文件夹会在下次启动时\n> 还原（相当于\"恢复默认\"）；想彻底移除，在 `.ignore` 里写一行 `whale-girl`。\n\n添加角色的方式：\n\n```sh\nnpx petdex install <宠物名>        # ① petdex 生态：启动时自动导入\n# 或 ② 把任意 codex/native 角色文件夹放进 %APPDATA%/dsh-desktop-pet/characters/\n```\n\n支持格式（全部接入同一套状态机 + DSH 联动，缺失状态自动用 idle 兜底，不会白屏）：\n\n| 格式 | 识别文件 | 说明 |\n|---|---|---|\n| native | `manifest.json` + 各状态 PNG 条 | 本项目原生格式（whale-girl） |\n| codex | `pet.json` + spritesheet | Codex / petdex 生态，支持自定义 `animations` 与官方默认表，状态自动映射 |\n\n其他说明：\n\n- 角色名读取自 manifest / pet.json；设置面板角色下拉会标注来源（`· Codex`）\n- 不想自动导入/还原的角色：在 `characters/.ignore` 里每行写一个 id\n- 删除角色：删掉 `characters/<id>/` 文件夹（内置角色会随下次启动还原，除非写进 `.ignore`）\n- 角色素材版权归原作者，随包分发请自行确认许可（本项目内置 whale-girl 为 MIT）\n\n## 🖱️ 交互\n\n| 操作 | 行为 |\n|---|---|\n| 左键按住拖动 | 移动宠物 |\n| 左键单击 | 开心反应（蹦跳 + 随机台词；睡觉时点击会醒来） |\n| 右键 | 功能菜单：喂食 / 玩耍 / 庆祝 / 常驻任务进度开关 / 设置 / 桌面置底 / 鼠标穿透 / 退出 |\n| 托盘 | 显示/隐藏、回右下角、置底、穿透（勾选状态实时同步）、退出 |\n\n## 🛠️ 开发\n\n```sh\nnpm install        # 安装依赖（electron + electron-builder + koffi + schemastery + vitest）\nnpm start          # 运行宠物窗口（独立模式）\nnpm run dev        # 开发模式（附带 DevTools）\nnpm run check      # 语法检查\nnpm test           # 单元测试（vitest：任务信号跟踪 / 状态机 / 黑框文案）\nnpm run dist       # 打包 Windows exe（nsis + portable）；另有 dist:mac / dist:linux\n```\n\n### 冒烟测试（scripts/smoke/）\n\n冒烟测试用真实 Win32 输入 + CDP 驱动打包后的 exe，验证菜单定位 / 穿透 / 拖动 / 待机动画 /\nDSH 打盹联动。需要先用 `--remote-debugging-port=9222` 启动打包产物：\n\n```sh\nnpm run dist\n\"dist/DSH Desktop Pet 0.2.0.exe\" --remote-debugging-port=9222\nnpm run smoke:menu     # 右键菜单位置\nnpm run smoke:pierce   # 穿透开关 + 拖动\nnpm run smoke:idle     # 待机动画 + 点击反应\nnpm run smoke:drag     # 拖动位移\nnpm run smoke:nap      # 任务完成 → 打盹 → 恢复（后台运行，避免 exec 心跳干扰）\n```\n\n## 🚀 发布到 GitHub 与 npm\n\n### GitHub\n\n```sh\ngit init\ngit add .\ngit commit -m \"feat: dsh desktop pet\"\ngit branch -M main\ngit remote add origin https://github.com/<你的用户名>/dsh-desktop-pet.git\ngit push -u origin main\ngit tag v0.2.0 && git push origin v0.2.0   # 触发 CI 构建 exe 产物（Actions → Artifacts）\n```\n\nCI（`.github/workflows/build.yml`）会在 main 分支与 `v*` tag 上自动跑单测 + 语法检查，\n并在 **Windows / macOS / Linux 三平台**打包各自产物上传。\n\n### npm\n\n```sh\nnpm login\nnpm publish          # 发布前先改好 package.json 里的 author / repository 字段\n```\n\n发布后：\n\n```sh\ndsh plugin --profile web add @asahimoon/dsh-desktop-pet\n```\n\n> 发布前检查：`npm pack --dry-run` 可预览将要发布的内容（`files` 白名单已配置，\n> node_modules / dist / 冒烟脚本不会进包）。\n\n## 📁 项目结构\n\n```\nindex.mjs          # DSH bundle Node half：Agent 事件 → HTTP 信号 → 启动宠物窗口\nconfig.mjs         # 配置 schema（schemastery）+ 默认值（唯一权威）\nmain.js            # Electron 主进程：窗口/托盘/穿透/持久化/信号服务/角色扫描/热配置\npreload.js         # 安全桥（contextIsolation）\nrenderer/          # 帧播放器 + 状态机 + 交互 + DSH 信号处理 + 角色适配\nassets/characters/ # 内置角色（whale-girl，MIT）\nscripts/smoke/     # 冒烟测试（真实输入 + CDP，见「开发」）\ncordis.patch.yml   # bundle patch：挂载 Node half 行\ndocs/              # 文档截图\n```\n\n## 📄 许可与致谢\n\n- 本项目 MIT（[LICENSE](LICENSE)）\n- 鲸鱼娘角色 sprite 与动画表来自 [vlln/whale-girl](https://github.com/vlln/whale-girl)\n  （MIT，角色形象 ZipZipPipe），详见 [NOTICE.md](NOTICE.md)\n- 运行时使用 Electron（MIT）\n- 其他角色素材版权归各自作者，请自行确认许可\n","readmeFilename":"README.md","_rev":"1-0250e98129533e0d2a51d447c5a9f3cb"}