{"_id":"@andy8647/pi-balance","_rev":"2-7115339daf54d4c1b705adbc7dc6a4ed","name":"@andy8647/pi-balance","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.2":{"name":"@andy8647/pi-balance","version":"1.0.2","keywords":["pi","pi-package","pi-extension","balance","status-bar","ai"],"author":{"name":"DragonYH","email":"1016633827@qq.com"},"license":"MIT","_id":"@andy8647/pi-balance@1.0.2","maintainers":[{"name":"andy8647","email":"andy8647lgc@gmail.com"}],"homepage":"https://github.com/Andy8647/pi-balance#readme","bugs":{"url":"https://github.com/Andy8647/pi-balance/issues"},"pi":{"image":"https://img.dog/file/1779542581467_mzRI9XShNB2pFCVDlx1f8.webp","extensions":["./src/index.ts"]},"dist":{"shasum":"35d0a137ff5c3ca276f97044b0932192aae233ec","tarball":"https://registry.npmjs.org/@andy8647/pi-balance/-/pi-balance-1.0.2.tgz","fileCount":19,"integrity":"sha512-8IB1GZQeecE3rp10F4K771MCvEIt3wEHxzLUGsHG0nRtrUmI6ZJCLiktjJclWti7+EvhJnGnpbfCpRzmD3ipQA==","signatures":[{"sig":"MEUCIQCWkIyBuTgVEv6HwisiD+68UA5+Dl0xonR/krn0XprlsAIgdFTq2AtRG172Od3OdmUxCNA/jXng7wLcV2FZRudlxRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":124995},"type":"module","engines":{"node":">=22"},"gitHead":"4a25e17d396753d3d5f8a2fe59ce7fff4bdb4d32","scripts":{"test":"node --test --import tsx tests/**/*.test.ts","verify":"npm run typecheck && npm run test","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","prepublishOnly":"npm run verify && npm run pack:check"},"_npmUser":{"name":"andy8647","email":"andy8647lgc@gmail.com"},"repository":{"url":"git+https://github.com/Andy8647/pi-balance.git","type":"git"},"_npmVersion":"11.17.0","description":"Pi extension that displays provider account balance in the status bar.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","typescript":"^5.9.3","@types/node":"^24.12.4","@earendil-works/pi-ai":"^0.75.5","@earendil-works/pi-coding-agent":"^0.75.5"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-balance_1.0.2_1785408102795_0.6302941536445659","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@andy8647/pi-balance","version":"1.0.3","type":"module","description":"Pi extension that displays provider account balance in the status bar.","license":"MIT","author":{"name":"DragonYH","email":"1016633827@qq.com"},"homepage":"https://github.com/Andy8647/pi-balance#readme","bugs":{"url":"https://github.com/Andy8647/pi-balance/issues"},"repository":{"type":"git","url":"git+https://github.com/Andy8647/pi-balance.git"},"keywords":["pi","pi-package","pi-extension","balance","status-bar","ai"],"scripts":{"typecheck":"tsc --noEmit","test":"node --test --import tsx tests/**/*.test.ts","verify":"npm run typecheck && npm run test","pack:check":"npm pack --dry-run","prepublishOnly":"npm run verify && npm run pack:check"},"pi":{"extensions":["./src/index.ts"],"image":"https://raw.githubusercontent.com/Andy8647/pi-balance/main/assets/preview.png"},"publishConfig":{"access":"public"},"engines":{"node":">=22"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"devDependencies":{"@earendil-works/pi-ai":"^0.75.5","@earendil-works/pi-coding-agent":"^0.75.5","@types/node":"^24.12.4","tsx":"^4.20.6","typescript":"^5.9.3"},"gitHead":"12afc587143c8bf158f6cce116b9c273c394479a","_id":"@andy8647/pi-balance@1.0.3","_nodeVersion":"24.18.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-EUqEM783lvNjFr1jata870WbRea+b6R6bEC7uVHvakmh6gcksqDhvJE4/3LZ3OSD0vGjMMrrCawtx69cS++ArQ==","shasum":"7ee7005768d80b7670eedd02e3f12af412697847","tarball":"https://registry.npmjs.org/@andy8647/pi-balance/-/pi-balance-1.0.3.tgz","fileCount":19,"unpackedSize":127054,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@andy8647%2fpi-balance@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA0wfUDJUFAgwh5vDaPKhG/eX6cukz+3+dwJNg3QulTLAiEAtFX+0OzEFoSlDTzVJothUM8hV8dVB14FILwteSMifP0="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:65957715-fc3a-443c-baee-a53be7fd7243"}},"directories":{},"maintainers":[{"name":"andy8647","email":"andy8647lgc@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-balance_1.0.3_1785409035293_0.7618921159525616"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-30T10:41:42.632Z","modified":"2026-07-30T10:57:15.810Z","1.0.2":"2026-07-30T10:41:42.935Z","1.0.3":"2026-07-30T10:57:15.457Z"},"bugs":{"url":"https://github.com/Andy8647/pi-balance/issues"},"author":{"name":"DragonYH","email":"1016633827@qq.com"},"license":"MIT","homepage":"https://github.com/Andy8647/pi-balance#readme","keywords":["pi","pi-package","pi-extension","balance","status-bar","ai"],"repository":{"type":"git","url":"git+https://github.com/Andy8647/pi-balance.git"},"description":"Pi extension that displays provider account balance in the status bar.","maintainers":[{"name":"andy8647","email":"andy8647lgc@gmail.com"}],"readme":"<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/badge/pi--balance-⚖️-6C5CE7?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDQwIDQwIj48cGF0aCBkPSJNMjAgM0wxIDM3aDM8eiIgZmlsbD0iIzZDQ0NFNyIvPjx0ZXh0IHg9IjIwIiB5PSIyNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGZpbGw9IiMxRTFDMkIiPuKZrzwvdGV4dD48L3N2Zz4=\">\n    <img src=\"https://img.shields.io/badge/pi--balance-⚖️-6C5CE7?style=for-the-badge\" alt=\"pi-balance\" height=\"48\">\n  </picture>\n</p>\n\n<p align=\"center\">\n  <strong>pi 编码助手的 AI 提供商余额实时显示扩展</strong>\n  <br>\n  <sub>在 pi 状态栏中一键查看你的 API 额度余额</sub>\n</p>\n\n<p align=\"center\">\n  <a href=\"#-功能特性\"><img src=\"https://img.shields.io/badge/功能特性-📋-6C5CE7?style=flat-square\"></a>\n  <a href=\"#-安装\"><img src=\"https://img.shields.io/badge/安装-📦-00B894?style=flat-square\"></a>\n  <a href=\"#-支持的提供商\"><img src=\"https://img.shields.io/badge/支持的提供商-🔌-FD79A8?style=flat-square\"></a>\n  <a href=\"#-使用\"><img src=\"https://img.shields.io/badge/使用-🚀-0984E3?style=flat-square\"></a>\n  <a href=\"https://www.npmjs.com/package/@andy8647/pi-balance\"><img src=\"https://img.shields.io/npm/v/@andy8647/pi-balance?style=flat-square&color=CB3837\"></a>\n  <a href=\"./README.md\"><img src=\"https://img.shields.io/badge/🇬🇧_English-6C5CE7?style=flat-square\"></a>\n</p>\n\n<p align=\"center\">\n  <img src=\"./assets/preview.png\" alt=\"pi-balance 预览\" width=\"800\">\n</p>\n\n<p align=\"center\">\n  <sub>截图中的余额段由 <a href=\"https://github.com/Andy8647/pi-starline\">pi-starline</a> 渲染 —— Starship 风格的 pi powerline 状态栏。<br>上：Kimi Code 5h/7d 配额 · 下：DeepSeek 余额</sub>\n</p>\n\n---\n\n## 📋 功能特性\n\npi-balance 是 [pi 编码代理](https://github.com/earendil-works/pi-coding-agent) 的一款**扩展**，能够自动获取并在 pi **状态栏**中实时显示你的 AI 提供商 API 额度余额。\n\n> **说明**：本仓库是 [DragonYH/pi-balance](https://github.com/DragonYH/pi-balance) 的 fork，原扩展的全部功劳归 [@DragonYH](https://github.com/DragonYH)。本 fork 以 [`@andy8647/pi-balance`](https://www.npmjs.com/package/@andy8647/pi-balance) 发布，并新增了：\n>\n> - **Kimi 编码套餐支持** —— 5 小时限速窗口与 7 天配额显示（通过 `/usages` 接口），以及 booster 钱包余额\n> - **DeepSeek 多币种余额的稳定识别**（`balance_infos`）\n> - **零构建打包** —— 直接发布 TypeScript 源码（pi 原生加载 `.ts` 扩展），安装时无需编译\n\n- ✅ **自动识别**当前使用的模型提供商\n- ✅ **事件驱动刷新** —— 每次对话结束后自动更新余额（并显示增减 ▲▼）\n- ✅ **切换即更新**—— 切换模型或提供商时立即刷新\n- ✅ **多提供商支持** —— DeepSeek、Moonshot/Kimi、OpenRouter、Sub2Api、OpenAI Codex 及兼容 API\n- ✅ **余额接口零配置** —— 支持的余额接口可复用模型 headers\n- ✅ **优雅降级** —— 无法获取余额时自动隐藏，不干扰使用\n- ✅ **国际化支持** —— 简体中文与英文，支持 `/balance lang <zh-CN|en>` 切换\n\n## 📦 安装\n\n### 方式一：从 npm 安装（推荐）\n\n```bash\npi install npm:@andy8647/pi-balance\n```\n\n### 方式二：从 GitHub 安装\n\n```bash\npi install git:github.com/Andy8647/pi-balance\n```\n\n### 方式三：本地开发安装\n\n```bash\ngit clone https://github.com/Andy8647/pi-balance.git\ncd pi-balance\nnpm install\npi install ./\n```\n\n### 验证安装\n\n重启 pi。连接到一个支持的提供商后，你将在状态栏中看到余额指示器。\n\n## 🔌 支持的提供商\n\n| 提供商 | 余额接口 | 显示内容 |\n|----------|-----------------|----------|\n| **DeepSeek** | `/user/balance` | ¥（人民币）余额 |\n| **Moonshot / Kimi** | `/v1/users/me/balance` | ¥（人民币）可用余额 |\n| **Sub2Api** | `/usage` | $（美元）剩余额度 |\n| **兼容 API** | `/usage`、`/v1/usage` | $（美元）剩余额度 |\n| **OpenAI Codex** | ChatGPT Codex usage API / `codex app-server` | 5 小时与每周用量剩余额度 |\n| **OpenRouter** | `/v1/credits` | $（美元）剩余额度 |\n\n> 扩展会根据你当前的模型配置自动检测所使用的提供商 —— 无需手动设置。\n\n\n## 🚀 使用\n\n安装完成后，pi-balance 会**完全自动地**工作：\n\n1. **会话启动时** —— 立即获取余额\n2. **切换模型时** —— 刷新新提供商的余额\n3. **每次对话后**（`agent_end`）—— 自动刷新并显示余额变化（▲▼）\n\n余额会显示在 pi 终端底部的**状态栏**中：\n\n```\nDeepSeek: ¥49.87\n```\n\n> 如果扩展无法确定你的余额（例如不支持的提供商或网络问题），状态栏条目会优雅隐藏。\n\n### `/balance` 命令\n\n使用 `/balance` 打开交互式配置菜单，可以：\n\n- 查看当前已配置 provider 的支持状态\n- 展开/折叠 provider，切换显示开关和额外选项\n- 在主菜单中直接开关 **Sub2Api** 子 provider（内联展开，带自动探测）\n- 开启或关闭 **Codex CLI 回退**模式\n- 立即刷新当前状态栏\n\n也可以直接使用命令参数：\n\n```bash\n/balance status\n/balance refresh\n/balance enable deepseek\n/balance disable moonshot\n/balance toggle codex\n/balance toggle openrouter\n/balance toggle sub2api\n/balance sub2api               # 打开 Sub2Api 子 provider 菜单\n/balance sub2api rescan         # 重新扫描 Sub2Api provider\n/balance lang zh-CN             # 切换至简体中文\n/balance lang en                # 切换至英文\n```\n\n### 配置说明\n\n- **Provider 显示开关** 会由 `/balance` 菜单保存，并在下一次刷新时生效。\n- **自定义 Sub2Api provider** 会从 pi 模型配置中自动探测，并可在主菜单或 `/balance sub2api` 中逐个开启或关闭。修改模型配置后，可使用 `/balance sub2api rescan` 重新扫描。\n- **OpenAI Codex 用量** 仅在当前模型 provider 为 `openai-codex` 时显示。扩展会优先复用 pi 的 Codex 订阅认证 headers，并可在可用时回退到 `codex app-server --listen stdio://`；CLI 回退可在 `/balance` 菜单中开关。\n- 菜单使用智能缓存：展开/折叠 provider 时不会触发任何异步计算，体验即时流畅。\n- 网络请求会快速超时；获取失败时状态栏会自动隐藏，不会打断当前会话。\n\n## 🧠 工作原理\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│  pi 编码代理                                                 │\n│  ┌───────────────────────────────────────────────────────┐  │\n│  │                                                       │  │\n│  │  [聊天界面]                                            │  │\n│  │                                                       │  │\n│  ├───────────────────────────────────────────────────────┤  │\n│  │  状态栏:  DeepSeek: ¥49.87     ◉ 已连接                │  │\n│  └───────────────────────────────────────────────────────┘  │\n│                                                             │\n│  ┌─ 扩展: pi-balance ────────────────────────────────────┐  │\n│  │  session_start  ──►  fetchBalance()  ──►  setStatus() │  │\n│  │  model_select   ──►  fetchBalance()  ──►  setStatus() │  │\n│  │  agent_end     ────►  refreshBalance(showDelta)        │  │\n│  └────────────────────────────────────────────────────────┘  │\n└─────────────────────────────────────────────────────────────┘\n```\n\n### 事件处理\n\n- **`session_start`** —— 会话开始时获取余额\n- **`model_select`** —— 切换模型/提供商时重新获取\n- **`agent_end`** —— 每次对话结束后刷新余额，显示增减（▲▼）\n- **`session_shutdown`** —— 清理并清除状态\n\n## 🏗️ 项目结构\n\n```\npi-balance/\n├── src/\n│   ├── index.ts                  # 组装入口，命令注册，生命周期\n│   ├── types.ts                   # 类型定义和常量\n│   ├── config.ts                  # 配置加载/持久化/开关\n│   ├── utils.ts                   # 工具函数（fetch、JSON 解析等）\n│   ├── menu.ts                    # 动态菜单构建与缓存\n│   └── providers/\n│       ├── types.ts               # BalanceProvider 接口定义\n│       ├── registry.ts            # Provider 单例注册表\n│       ├── deepseek.ts            # DeepSeek provider\n│       ├── moonshot.ts            # Moonshot/Kimi provider\n│       ├── openrouter.ts          # OpenRouter provider\n│       ├── sub2api.ts             # Sub2Api + 自动探测\n│       └── codex.ts               # OpenAI Codex + CLI 回退\n│   └── i18n/\n│       ├── index.ts              # t() 翻译函数与语言检测\n│       ├── zh-CN.ts              # 中文翻译\n│       └── en.ts                 # 英文翻译\n├── tests/\n│   └── index.test.ts\n├── LICENSE                       # MIT 许可证\n├── README.md                     # 英文文档\n├── README.zh-CN.md               # 中文文档\n├── package.json                  # Node.js 与 pi 包清单\n└── tsconfig.json                 # TypeScript 配置\n```\n\n## 🛠️ 开发者指南\n\n### 类型检查\n\n```bash\nnpm run typecheck\n```\n\n### 测试\n\n```bash\nnpm test\n```\n\n### 发布前检查清单\n\n本项目通过 GitHub Actions 在推送版本 tag 时发布。\n\n发布前请检查 npm 包内容：\n\n```bash\nnpm pack --dry-run\n```\n\n然后创建并推送与 `package.json` 版本一致的 tag：\n\n```bash\ngit tag vX.Y.Z\ngit push origin vX.Y.Z\n```\n\n推送 tag 前，请在 npm 为该包配置 Trusted Publishing：\n\n- Publisher：GitHub Actions\n- Owner：`Andy8647`\n- Repository：`pi-balance`\n- Workflow：`publish.yml`\n- Environment：`npm-publish`\n\n### 添加新的提供商\n\n扩展采用可插拔的 provider 架构。要为新提供商添加支持，请在 `src/providers/` 中创建一个实现 `BalanceProvider` 接口的模块，然后在 `src/index.ts` 中导入它即可触发自动注册：\n\n```typescript\n// src/providers/yourprovider.ts\nimport type { BalanceProvider } from \"./types.js\";\nimport { registry } from \"./registry.js\";\nimport type {\n  BalanceResult,\n  BalanceConfig,\n  FetchContext,\n  ProviderSupport,\n} from \"../types.js\";\nimport { getJson } from \"../utils.js\";\n\nexport const yourProvider: BalanceProvider = {\n  key: \"yourprovider\",\n  definition: {\n    key: \"yourprovider\",\n    label: \"YourProvider\",\n    color: \"#FFD700\",\n  },\n\n  shouldTry(model, baseUrl) {\n    return baseUrl.includes(\"yourprovider.com\");\n  },\n\n  async fetchBalance(\n    ctx: FetchContext,\n    signal?: AbortSignal,\n  ): Promise<BalanceResult | undefined> {\n    const data = await getJson(`${ctx.baseUrl}/your/endpoint`, ctx.headers, signal);\n    const amount = data?.credits_remaining;\n    return typeof amount === \"number\" ? { amount, unit: \"¥\" } : undefined;\n  },\n\n  async getSupport(\n    ctx: ExtensionContext,\n    config: BalanceConfig,\n  ): Promise<ProviderSupport> {\n    return {\n      provider: this.definition,\n      configured: true,\n      details: [\"已配置\"],\n    };\n  },\n};\n\nregistry.register(yourProvider);\n```\n\n然后在 `src/index.ts` 中添加一行导入：\n\n```typescript\nimport \"./providers/yourprovider.js\";\n```\n\n完成！provider 会自动注册、出现在 `/balance` 菜单中并参与余额获取。无需其他代码修改。\n\n## 📄 许可证\n\n[MIT](./LICENSE)\n\n---\n\n<p align=\"center\">\n  <sub>为 <a href=\"https://github.com/earendil-works/pi-coding-agent\">pi 编码代理</a> 生态构建</sub>\n  <br>\n  <sub>Fork 自 <a href=\"https://github.com/DragonYH/pi-balance\">DragonYH/pi-balance</a> · 原扩展作者 <a href=\"https://github.com/DragonYH\">@DragonYH</a></sub>\n  <br>\n  <a href=\"./README.md\"><img src=\"https://img.shields.io/badge/🇬🇧_Read_in_English-6C5CE7?style=for-the-badge\"></a>\n</p>\n","readmeFilename":"README.zh-CN.md"}