{"_id":"@chasen-liao/pi-agent-desktop","_rev":"2-46353b56f32361dca520b8dcce41bf80","name":"@chasen-liao/pi-agent-desktop","dist-tags":{"latest":"0.7.18"},"versions":{"0.7.17":{"name":"@chasen-liao/pi-agent-desktop","version":"0.7.17","author":{"name":"Chasen"},"license":"MIT","_id":"@chasen-liao/pi-agent-desktop@0.7.17","maintainers":[{"name":"chasen-liao","email":"liaochasen@gmail.com"}],"bin":{"pi-web":"bin/pi-web.js"},"dist":{"shasum":"ec67446aa9fc32efba498f92c88928b0591ead36","tarball":"https://registry.npmjs.org/@chasen-liao/pi-agent-desktop/-/pi-agent-desktop-0.7.17.tgz","fileCount":415,"integrity":"sha512-GkjsiLGb+20FzTYXLVhEsAJ8xups8Di0fEalYeqEXSQoo1F15y6jrL32rJmdzmnRZwKj7p2ZDbX+FFcmxldv9w==","signatures":[{"sig":"MEUCIBzCPRQs5X7ONBOe18Ijwd6PEWMXXMyvauBGBREGFhQnAiEA93Puiurclr6R9GMjtc/4q0xYF5SQgDuILE3p25UPVE8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27568978},"main":"electron/dist/main.js","build":{"extends":"electron-builder.yml"},"gitHead":"f28f85d66b663899dc23a7be337b0890645f0c78","scripts":{"dev":"next dev -p 30141","dist":"npm run build:standalone && npm run build:electron && npx @electron/rebuild && npx electron-builder","lint":"eslint .","pack":"npm run build:standalone && npm run build:electron && npx @electron/rebuild && npx electron-builder --dir","test":"node --test --test-force-exit \"lib/**/*.test.ts\" \"lib/**/*.test.mjs\" \"electron/**/*.test.ts\" \"app/**/*.test.ts\" \"hooks/**/*.test.ts\" \"components/**/*.test.ts\" \"package.test.ts\"","build":"npm run build:standalone","start":"next start -p 30141","release":"npm version patch --no-git-tag-version && npm run build:standalone && npm publish --access public","dev:electron":"npm run build:electron && npx electron .","build:electron":"tsc -p electron/tsconfig.json && node -e \"const fs=require('fs'); fs.copyFileSync('electron/startup.html', 'electron/dist/startup.html'); fs.copyFileSync('electron/startup.js', 'electron/dist/startup.js')\"","build:standalone":"next build --webpack","check:electron-deps":"node lib/electron-updater-runtime-deps.mjs --check"},"_npmUser":{"name":"chasen-liao","email":"liaochasen@gmail.com"},"_npmVersion":"12.0.1","description":"Pi Agent Desktop — desktop client for the pi coding agent","directories":{},"_nodeVersion":"24.16.0","allowScripts":{"electron@36.9.5":true},"dependencies":{"electron-updater":"^6.8.3"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.1","react":"^19.2.4","eslint":"^9","postcss":"^8","electron":"^36.9.5","react-dom":"^19.2.4","remark-gfm":"^4.0.1","typescript":"^5","@types/node":"^24","tailwindcss":"^4.2.2","@types/react":"^19","@lobehub/icons":"^5.6.0","react-markdown":"^10.1.0","@types/react-dom":"^19","electron-builder":"^26.8.1","@electron/rebuild":"^4.0.4","@fontsource/inter":"^5.2.8","@electron/packager":"^20.0.0","eslint-config-next":"16.2.1","@tailwindcss/postcss":"^4.2.2","@earendil-works/pi-ai":"^0.82.1","react-syntax-highlighter":"^16.1.1","@fontsource/jetbrains-mono":"^5.2.8","@earendil-works/pi-coding-agent":"^0.82.1","@types/react-syntax-highlighter":"^15.5.13"},"_npmOperationalInternal":{"tmp":"tmp/pi-agent-desktop_0.7.17_1785203850037_0.3550427929632829","host":"s3://npm-registry-packages-npm-production"}},"0.7.18":{"name":"@chasen-liao/pi-agent-desktop","version":"0.7.18","description":"Pi Agent Desktop — desktop client for the pi coding agent","license":"MIT","author":{"name":"Chasen"},"main":"electron/dist/main.js","bin":{"pi-web":"bin/pi-web.js"},"scripts":{"dev":"next dev -p 30141","build":"npm run build:standalone","build:standalone":"next build","start":"next start -p 30141","lint":"eslint .","check:electron-deps":"node lib/electron-updater-runtime-deps.mjs --check","test":"node --test --test-force-exit \"lib/**/*.test.ts\" \"lib/**/*.test.mjs\" \"electron/**/*.test.ts\" \"app/**/*.test.ts\" \"hooks/**/*.test.ts\" \"components/**/*.test.ts\" \"package.test.ts\"","release":"npm version patch --no-git-tag-version && npm run build:standalone && npm publish --access public","build:electron":"tsc -p electron/tsconfig.json && node -e \"const fs=require('fs'); fs.copyFileSync('electron/startup.html', 'electron/dist/startup.html'); fs.copyFileSync('electron/startup.js', 'electron/dist/startup.js')\"","dev:electron":"npm run build:electron && npx electron .","pack":"npm run build:standalone && npm run build:electron && npx @electron/rebuild && npx electron-builder --dir","dist":"npm run build:standalone && npm run build:electron && npx @electron/rebuild && npx electron-builder --publish never"},"build":{"extends":"electron-builder.yml"},"dependencies":{"electron-updater":"^6.8.3"},"devDependencies":{"@earendil-works/pi-ai":"^0.82.1","@earendil-works/pi-coding-agent":"^0.82.1","@electron/packager":"^20.0.0","@electron/rebuild":"^4.0.4","@fontsource/inter":"^5.2.8","@fontsource/jetbrains-mono":"^5.2.8","@lobehub/icons":"^5.6.0","@tailwindcss/postcss":"^4.2.2","@types/node":"^24","@types/react":"^19","@types/react-dom":"^19","@types/react-syntax-highlighter":"^15.5.13","electron":"^36.9.5","electron-builder":"^26.8.1","eslint":"^9","eslint-config-next":"16.2.1","next":"16.2.1","postcss":"^8","react":"^19.2.4","react-dom":"^19.2.4","react-markdown":"^10.1.0","react-syntax-highlighter":"^16.1.1","remark-gfm":"^4.0.1","tailwindcss":"^4.2.2","typescript":"^5"},"allowScripts":{"electron@36.9.5":true},"gitHead":"8797414b4712f7ff18d82220fa1ef1ee21a0e7a0","_id":"@chasen-liao/pi-agent-desktop@0.7.18","_nodeVersion":"24.16.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-2Ascz22P/0uzvksMvQJ+dxHi1CEQY1TRTIrOLBML3uiKYmMtGoC/EzyM+tFg36xd/vjsPXkxnjeVXN3nNEDbeA==","shasum":"0161da295fec877f414d8d700986b6dc6956fa44","tarball":"https://registry.npmjs.org/@chasen-liao/pi-agent-desktop/-/pi-agent-desktop-0.7.18.tgz","fileCount":2212,"unpackedSize":83189228,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCHTHYfDf4Yfu2U8erA/BkRtRqP1w6NnTP0iif+ACSLVQIhAKFoKCiRDP6eArI+uNOjKEfEUsGGL5zKm3h8rl35Ko9v"}]},"_npmUser":{"name":"chasen-liao","email":"liaochasen@gmail.com"},"directories":{},"maintainers":[{"name":"chasen-liao","email":"liaochasen@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-agent-desktop_0.7.18_1785297392721_0.6842507232600974"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-28T01:57:29.900Z","modified":"2026-07-29T03:56:33.679Z","0.7.17":"2026-07-28T01:57:30.473Z","0.7.18":"2026-07-29T03:56:33.507Z"},"author":{"name":"Chasen"},"license":"MIT","description":"Pi Agent Desktop — desktop client for the pi coding agent","maintainers":[{"name":"chasen-liao","email":"liaochasen@gmail.com"}],"readme":"<div align=\"center\">\r\n  <a href=\"https://github.com/Chasen-Liao/pi-agent-desktop\">\r\n    <img src=\"public/logo.png\" alt=\"Pi Agent Desktop Logo\" width=\"128\" height=\"128\" style=\"border-radius: 28px; border: 1px solid rgba(0,0,0,0.08); box-shadow: 0 4px 16px rgba(0,0,0,0.08);\" />\r\n  </a>\r\n\r\n  # Pi Agent Desktop\r\n\r\n  ### **目标：做出个人极简版 Codex**\r\n\r\n  [Pi 编程智能体](https://github.com/badlogic/pi-mono) 的原生桌面客户端。基于 Electron 构建，提供比浏览器更原生的使用体验。\r\n\r\n  [![Release](https://img.shields.io/github/v/release/Chasen-Liao/pi-agent-desktop?color=orange&logo=github)](https://github.com/Chasen-Liao/pi-agent-desktop/releases)\r\n  [![License](https://img.shields.io/github/license/Chasen-Liao/pi-agent-desktop?color=blue)](LICENSE)\r\n\r\n  ---\r\n\r\n  ![Pi Agent Desktop Demo](public/pi.gif)\r\n\r\n  ---\r\n</div>\r\n\r\n> **上游项目**：本项目衍生自 [pi-web](https://github.com/agegr/pi-web)，侧重于桌面端体验的优化与功能增强。\r\n\r\n## 特性\r\n\r\n- **原生桌面体验** — 基于 Electron 的独立窗口应用，支持系统托盘、最小化到托盘\r\n- **会话浏览器** — 按工作目录分组展示所有 pi 会话\r\n- **实时对话** — 通过 SSE 流式输出与智能体实时交互\r\n- **Agent 模式** — 支持 Plan / Ask / Full 三种安全模式与 Ask 工具拦截确认\r\n- **Extension UI Bridge** — 原生弹窗支持 Extension `confirm`/`select`/`input`/`editor`/`notify` 交互\r\n- **项目信任机制** — Project Trust 409 握手与授权弹窗\r\n- **MCP 服务器管理** — 支持全局 (`~/.pi/agent/mcp.json`) 与项目 (`<cwd>/.pi/mcp.json`) MCP 配置与 UI 管理\r\n- **扩展与 Skill 管理** — 统一 UI 管理全局和项目扩展、Skill 启用与诊断\r\n- **会话分叉与克隆** — API/UI 支持从任意节点 Branch 及 Clone 会话到新目录\r\n- **会话导出** — 一键导出为 HTML / Markdown 格式\r\n- **AgentMode 持久化** — 自动写入 `.jsonl` 自定义 `desktop_agent_mode` 节点，重载恢复历史模式\r\n- **会话内分支** — 回退到任意节点继续对话，在同一文件内创建分支\r\n- **分支导航器** — 可视化切换同一会话内的各个分支\r\n- **模型切换** — 对话中途随时切换模型\r\n- **工具面板** — 控制智能体可使用的工具\r\n- **文件浏览** — 侧边栏内置文件浏览器和查看器\r\n- **快捷键** — `Ctrl+B` 切换左侧边栏，`Ctrl+Alt+B` 切换右侧面板\r\n- **自动更新** — 支持 GitHub Releases 自动检查更新\r\n\r\n## 下载安装\r\n\r\n前往 [Releases](https://github.com/Chasen-Liao/pi-agent-desktop/releases) 页面下载最新版安装程序。\r\n\r\nWindows 用户下载 `Pi-Agent-Desktop-Setup-x.x.x.exe`，运行即可安装。\r\n\r\n## 开发\r\n\r\n```bash\r\n# 安装依赖\r\nnpm install\r\n\r\n# 开发模式（浏览器）\r\nnpm run dev          # http://localhost:30141\r\n\r\n# 开发模式（Electron 桌面窗口）\r\nnpm run dev:electron\r\n\r\n# 类型检查\r\nnpx tsc --noEmit\r\n\r\n# 代码检查\r\nnpm run lint\r\n\r\n# 构建安装包\r\nnpm run dist\r\n```\r\n\r\n## 项目结构\r\n\r\n```\r\napp/\r\n  api/\r\n    sessions/      # 读取会话文件\r\n    agent/         # 发送命令、SSE 事件流\r\n    files/         # 文件内容读取\r\n    models/        # 可用模型列表与默认模型\r\n    models-config/ # 读写 models.json\r\n    skills/        # 技能搜索与安装\r\n    auth/          # 登录与 API Key 管理\r\n    health/        # 健康检查\r\ncomponents/        # UI 组件\r\nelectron/          # Electron 主进程\r\nhooks/             # React Hooks（会话管理、面板布局等）\r\nlib/\r\n  session-reader.ts  # 解析 .jsonl 会话文件\r\n  rpc-manager.ts     # 管理 AgentSession 生命周期\r\n  normalize.ts       # 规范化 toolCall 字段名\r\n  types.ts\r\n```\r\n\r\n## 技术栈\r\n\r\n- **前端**：Next.js + React + TypeScript\r\n- **桌面**：Electron\r\n- **打包**：electron-builder (NSIS)\r\n- **通信**：SSE (Server-Sent Events) 实时流式传输\r\n\r\n## 界面截图\r\n\r\n![Pi Agent Desktop Interface](image-2.png)\r\n\r\n## 致谢\r\n\r\n- [pi-mono](https://github.com/badlogic/pi-mono) — Pi 编程智能体核心\r\n- [pi-web](https://github.com/agegr/pi-web) — 上游 Web 界面项目\r\n\r\n## 许可\r\n\r\nMIT License\r\n\r\n## Star History\r\n\r\n[![Star History Chart](https://api.star-history.com/svg?repos=Chasen-Liao/pi-agent-desktop&type=Date)](https://www.star-history.com/#Chasen-Liao/pi-agent-desktop&Date)\r\n","readmeFilename":"README.md"}