{"_id":"@dong-victor/dsh-opencodego-usage","_rev":"6-e6e2d4c31652c3c01d5b19056a8f7cad","name":"@dong-victor/dsh-opencodego-usage","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"@dong-victor/dsh-opencodego-usage","version":"0.1.0","keywords":["dsh","deepseek-harness","plugin","opencode","go","balance","usage","quota"],"license":"MIT","_id":"@dong-victor/dsh-opencodego-usage@0.1.0","maintainers":[{"name":"dong-victor","email":"dougzforever@gmail.com"}],"homepage":"https://github.com/dong-victor/dsh-opencodego-usage#readme","bugs":{"url":"https://github.com/dong-victor/dsh-opencodego-usage/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale"],"platform":"web"}},"dist":{"shasum":"80a1718169e2004d1e11cb0ab8afa43c46169872","tarball":"https://registry.npmjs.org/@dong-victor/dsh-opencodego-usage/-/dsh-opencodego-usage-0.1.0.tgz","fileCount":6,"integrity":"sha512-794dbAaFgVEdrevTCPIYsHB5bcQp8ncRRFLZuipS/YenDZwf2UkHLujkH0fhKxRu6kVfFt7xN3u6K0lg5mVAbA==","signatures":[{"sig":"MEQCIDJ+EIzaW7/t32PbxQ3RQTAPA5FekSDMmYwhwXxspERqAiB6LJXL/2IVRMqkyQLyOIoZ+FaPSVCxNo052TV/HKHwtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64917},"main":"lib/index.js","type":"module","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"fe7c5d098fb095451fe3646ca07e65482ce07c86","scripts":{"pack":"npm pack","test":"node test/host-boot.test.mjs && node test/client-smoke.test.mjs"},"_npmUser":{"name":"dong-victor","email":"dougzforever@gmail.com"},"repository":{"url":"git+https://github.com/dong-victor/dsh-opencodego-usage.git","type":"git"},"_npmVersion":"11.12.1","description":"opencode Go 套餐余额查看插件（DSH Web GUI）：侧边栏直接显示 rolling(5小时)/weekly(周)/monthly(余额) 三档用量进度条、百分比与重置时间，60s 自动刷新，无需点击；点击打开详情面板（倒计时、状态徽章、端点/密钥信息）；agent 工具 opencode_go_balance 可直接回答套餐用量。密钥与端点复用 DSH 已配置的 llm-deepseek 接线（credentials 服务 + settings），无需二次配置。零构建依赖、纯 JS 即装即","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@deepseek-ai/dsh-tools":"0.1.0-rc.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1"},"peerDependencies":{"@deepseek-ai/dsh-tools":"0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-opencodego-usage_0.1.0_1786683375464_0.5602302969822066","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dong-victor/dsh-opencodego-usage","version":"0.1.2","keywords":["dsh","deepseek-harness","plugin","opencode","go","balance","usage","quota"],"license":"MIT","_id":"@dong-victor/dsh-opencodego-usage@0.1.2","maintainers":[{"name":"dong-victor","email":"dougzforever@gmail.com"}],"homepage":"https://github.com/dong-victor/dsh-opencodego-usage#readme","bugs":{"url":"https://github.com/dong-victor/dsh-opencodego-usage/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale"],"platform":"web"}},"dist":{"shasum":"51e561ff876c44eaba0a7ea7112fbc4ba4755dc8","tarball":"https://registry.npmjs.org/@dong-victor/dsh-opencodego-usage/-/dsh-opencodego-usage-0.1.2.tgz","fileCount":6,"integrity":"sha512-1FB2q9fymxwFaPH6lgre96UJJEnsdHT6+usFN15u2vNl9IY1ydNtxMXJJ1LZ2wULvPhx9V3fmoc5u/OTwtmh5A==","signatures":[{"sig":"MEUCIHCbg3i3jupxR8pZ6Mh/2sW6i9LwvZxpRvcw9WP/YebrAiEA2ACBYI71HolnPdHB3tXfdy4uNZQVu9sXxqRDQMmWZaM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64934},"main":"lib/index.js","type":"module","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"4e54149b5886049fde29fb20c36378a0b9786125","scripts":{"pack":"npm pack","test":"node test/host-boot.test.mjs && node test/client-smoke.test.mjs"},"_npmUser":{"name":"dong-victor","email":"dougzforever@gmail.com"},"repository":{"url":"git+https://github.com/dong-victor/dsh-opencodego-usage.git","type":"git"},"_npmVersion":"11.12.1","description":"opencode Go 套餐余额查看插件（DSH Web GUI）：侧边栏直接显示 rolling(5小时)/weekly(周)/monthly(余额) 三档用量进度条、百分比与重置时间，60s 自动刷新，无需点击；点击打开详情面板（倒计时、状态徽章、端点/密钥信息）；agent 工具 opencode_go_balance 可直接回答套餐用量。密钥与端点复用 DSH 已配置的 llm-deepseek 接线（credentials 服务 + settings），无需二次配置。零构建依赖、纯 JS 即装即","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1"},"peerDependencies":{"@deepseek-ai/dsh-tools":"^0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-opencodego-usage_0.1.2_1786685424365_0.32332296934940796","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dong-victor/dsh-opencodego-usage","version":"0.1.3","keywords":["dsh","deepseek-harness","plugin","opencode","go","balance","usage","quota"],"license":"MIT","_id":"@dong-victor/dsh-opencodego-usage@0.1.3","maintainers":[{"name":"dong-victor","email":"dougzforever@gmail.com"}],"homepage":"https://github.com/dong-victor/dsh-opencodego-usage#readme","bugs":{"url":"https://github.com/dong-victor/dsh-opencodego-usage/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale"],"platform":"web"}},"dist":{"shasum":"8549a6947df836d7e35683c65423bdd96857de29","tarball":"https://registry.npmjs.org/@dong-victor/dsh-opencodego-usage/-/dsh-opencodego-usage-0.1.3.tgz","fileCount":6,"integrity":"sha512-rHxJQbo/PWWtXltCsy/4EHrEYKtJPp2C+tWhj9FMnES0Ljq1iMUFNt5HokyZwFY6sGB4f19w2yzDOKd6zRpA6Q==","signatures":[{"sig":"MEYCIQCXcLDu5yK8dkDoTYKoHI4jysD+E2t2+oy7oeY8DQ/3SAIhAL8JQWwuAviFFNxrwcWaKwJ1CiXuhxsZPKMC2Aqe3v0x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64934},"main":"lib/index.js","type":"module","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"8832c336daf30f58a47c9f32c31c1282e19265f3","scripts":{"pack":"npm pack","test":"node test/host-boot.test.mjs && node test/client-smoke.test.mjs"},"_npmUser":{"name":"dong-victor","email":"dougzforever@gmail.com"},"repository":{"url":"git+https://github.com/dong-victor/dsh-opencodego-usage.git","type":"git"},"_npmVersion":"11.12.1","description":"opencode Go 套餐余额查看插件（DSH Web GUI）：侧边栏直接显示 rolling(5小时)/weekly(周)/monthly(余额) 三档用量进度条、百分比与重置时间，60s 自动刷新，无需点击；点击打开详情面板（倒计时、状态徽章、端点/密钥信息）；agent 工具 opencode_go_balance 可直接回答套餐用量。密钥与端点复用 DSH 已配置的 llm-deepseek 接线（credentials 服务 + settings），无需二次配置。零构建依赖、纯 JS 即装即","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1"},"peerDependencies":{"@deepseek-ai/dsh-tools":"^0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-opencodego-usage_0.1.3_1787021923125_0.4413128595687368","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@dong-victor/dsh-opencodego-usage","version":"0.1.4","keywords":["dsh","deepseek-harness","plugin","opencode","go","balance","usage","quota"],"license":"MIT","_id":"@dong-victor/dsh-opencodego-usage@0.1.4","maintainers":[{"name":"dong-victor","email":"dougzforever@gmail.com"}],"homepage":"https://github.com/dong-victor/dsh-opencodego-usage#readme","bugs":{"url":"https://github.com/dong-victor/dsh-opencodego-usage/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale"],"platform":"web"}},"dist":{"shasum":"7c1f8ccb92099fbc5fdd148752dc016b0513bbca","tarball":"https://registry.npmjs.org/@dong-victor/dsh-opencodego-usage/-/dsh-opencodego-usage-0.1.4.tgz","fileCount":6,"integrity":"sha512-dz4BlkNV2GZ4EZfD0UOyljnVKb8p1+gE8UtaHQEd58ftkGYcTNw3pJSvE7NYl80IaOtXBLpWvDM1DIsU/0akcg==","signatures":[{"sig":"MEQCIEB5ze9ATDjQdMr/w4jCuj3+K1rHVhBooCp+taSKPgF8AiAvt2ykcR6XMFjy1SegT4wEHZbrZLV5jEvTzh8uv8GOaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64952},"main":"lib/index.js","type":"module","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"80e378d46ffe4281d7976e19806e14b9a2a978f9","scripts":{"pack":"npm pack","test":"node test/host-boot.test.mjs && node test/client-smoke.test.mjs"},"_npmUser":{"name":"dong-victor","email":"dougzforever@gmail.com"},"repository":{"url":"git+https://github.com/dong-victor/dsh-opencodego-usage.git","type":"git"},"_npmVersion":"11.12.1","description":"opencode Go 套餐余额查看插件（DSH Web GUI）：侧边栏直接显示 rolling(5小时)/weekly(周)/monthly(余额) 三档用量进度条、百分比与重置时间，60s 自动刷新，无需点击；点击打开详情面板（倒计时、状态徽章、端点/密钥信息）；agent 工具 opencode_go_balance 可直接回答套餐用量。密钥与端点复用 DSH 已配置的 llm-deepseek 接线（credentials 服务 + settings），无需二次配置。零构建依赖、纯 JS 即装即","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1"},"peerDependencies":{"@deepseek-ai/dsh-tools":"^0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-opencodego-usage_0.1.4_1787022405451_0.8287392531013378","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@dong-victor/dsh-opencodego-usage","version":"0.1.5","keywords":["dsh","deepseek-harness","plugin","opencode","go","balance","usage","quota"],"license":"MIT","_id":"@dong-victor/dsh-opencodego-usage@0.1.5","maintainers":[{"name":"dong-victor","email":"dougzforever@gmail.com"}],"homepage":"https://github.com/dong-victor/dsh-opencodego-usage#readme","bugs":{"url":"https://github.com/dong-victor/dsh-opencodego-usage/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale"],"platform":"web"}},"dist":{"shasum":"381565cce47fa62cd433a48010e1c491108c0291","tarball":"https://registry.npmjs.org/@dong-victor/dsh-opencodego-usage/-/dsh-opencodego-usage-0.1.5.tgz","fileCount":6,"integrity":"sha512-iZC04By0d99VmH2Eecr6LdLH0NQaWBfIua20NYR6WuHZofNDOGgQUv8CIfEP6pOvPYOcjBm9x3srhp2OZ/lTLw==","signatures":[{"sig":"MEUCIQDJ+6dPpwFv+WirohwSnhcwvi0usmgAypO+mVczrcXzrwIgAt2r6RDMlZ5avP6OlD+0hT021Ym4LQ50G9l340wJXfA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67066},"main":"lib/index.js","type":"module","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"ab6aa6002f2bb6bbc50f59238286c216dcca8e30","scripts":{"pack":"npm pack","test":"node test/host-boot.test.mjs && node test/client-smoke.test.mjs"},"_npmUser":{"name":"dong-victor","email":"dougzforever@gmail.com"},"repository":{"url":"git+https://github.com/dong-victor/dsh-opencodego-usage.git","type":"git"},"_npmVersion":"11.12.1","description":"opencode Go 套餐余额查看插件（DSH Web GUI）：侧边栏直接显示 rolling(5小时)/weekly(周)/monthly(余额) 三档用量进度条、百分比与重置时间，60s 自动刷新，无需点击；点击打开详情面板（倒计时、状态徽章、端点/密钥信息）；agent 工具 opencode_go_balance 可直接回答套餐用量。密钥默认取 llm-pi-ai 的 opencode-go 路由 apiKeyEnv（OPENCODE_GO_API_KEY，官方 opencode 模型专用密钥","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1"},"peerDependencies":{"@deepseek-ai/dsh-tools":"^0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-opencodego-usage_0.1.5_1787024165074_0.8420790841950021","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@dong-victor/dsh-opencodego-usage","description":"opencode Go 套餐余额查看插件（DSH Web GUI）：侧边栏直接显示 rolling(5小时)/weekly(周)/monthly(余额) 三档用量进度条、百分比与重置时间，60s 自动刷新，无需点击；点击打开详情面板（倒计时、状态徽章、端点/密钥信息）；agent 工具 opencode_go_balance 可直接回答套餐用量。密钥默认取 llm-pi-ai 的 opencode-go 路由 apiKeyEnv（OPENCODE_GO_API_KEY，官方 opencode 模型专用密钥","version":"0.1.6","type":"module","engines":{"node":"^22.19.0 || >=24.0.0"},"main":"lib/index.js","exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale"],"platform":"web"}},"peerDependencies":{"@deepseek-ai/dsh-tools":"^0.1.0-rc.6"},"devDependencies":{"jsdom":"^25.0.1"},"scripts":{"test":"node test/host-boot.test.mjs && node test/client-smoke.test.mjs","pack":"npm pack"},"keywords":["dsh","deepseek-harness","plugin","opencode","go","balance","usage","quota"],"repository":{"type":"git","url":"git+https://github.com/dong-victor/dsh-opencodego-usage.git"},"publishConfig":{"access":"public"},"license":"MIT","gitHead":"52ce4f65b87d1ffe178a8ba9a53555ec154351ef","_id":"@dong-victor/dsh-opencodego-usage@0.1.6","bugs":{"url":"https://github.com/dong-victor/dsh-opencodego-usage/issues"},"homepage":"https://github.com/dong-victor/dsh-opencodego-usage#readme","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-r2FMkfhwcJPgcUlomMpQiNcnz1ZxLzHAImOfLIlyY5bOVNi0rMOdk24UiIgcD2miVjcBfMrBbCOpTFwrFeCRbw==","shasum":"9fbb24e640525b64d38bd561edeed0bd618f5805","tarball":"https://registry.npmjs.org/@dong-victor/dsh-opencodego-usage/-/dsh-opencodego-usage-0.1.6.tgz","fileCount":6,"unpackedSize":69489,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB1zKyHuTXiAWuvSLe21jFwHQbeRBtutqY3HaHGbBucXAiEA0tWtPh9HyAnFFs4iCv7Xah9uAKpMS9m8aXS7xM/a5DU="}]},"_npmUser":{"name":"dong-victor","email":"dougzforever@gmail.com"},"directories":{},"maintainers":[{"name":"dong-victor","email":"dougzforever@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-opencodego-usage_0.1.6_1787124838393_0.47738360919109923"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-14T04:56:15.267Z","modified":"2026-08-19T07:33:58.712Z","0.1.0":"2026-08-14T04:56:15.604Z","0.1.2":"2026-08-14T05:30:24.498Z","0.1.3":"2026-08-18T02:58:43.260Z","0.1.4":"2026-08-18T03:06:45.600Z","0.1.5":"2026-08-18T03:36:05.257Z","0.1.6":"2026-08-19T07:33:58.566Z"},"bugs":{"url":"https://github.com/dong-victor/dsh-opencodego-usage/issues"},"license":"MIT","homepage":"https://github.com/dong-victor/dsh-opencodego-usage#readme","keywords":["dsh","deepseek-harness","plugin","opencode","go","balance","usage","quota"],"repository":{"type":"git","url":"git+https://github.com/dong-victor/dsh-opencodego-usage.git"},"description":"opencode Go 套餐余额查看插件（DSH Web GUI）：侧边栏直接显示 rolling(5小时)/weekly(周)/monthly(余额) 三档用量进度条、百分比与重置时间，60s 自动刷新，无需点击；点击打开详情面板（倒计时、状态徽章、端点/密钥信息）；agent 工具 opencode_go_balance 可直接回答套餐用量。密钥默认取 llm-pi-ai 的 opencode-go 路由 apiKeyEnv（OPENCODE_GO_API_KEY，官方 opencode 模型专用密钥","maintainers":[{"name":"dong-victor","email":"dougzforever@gmail.com"}],"readme":"# @dong-victor/dsh-opencodego-usage\r\n\r\n查看**链接的 opencode Go 套餐余额**的 DSH Web GUI 插件：侧边栏「Go 余额」入口 + 中央列面板，展示 `rolling / weekly / monthly` 三档用量百分比、状态徽章、重置时间与实时倒计时；同时提供 agent 工具 `opencode_go_balance` 与系统提示词声明，让助手也能直接回答「opencode Go 套餐还剩多少」。\r\n\r\n完全复用 DSH 已有的 LLM 接线（`llm-pi-ai` 的 `opencode-go` 路由设置 + credentials 服务），**无需再配一把密钥**——默认密钥引用就是官方 opencode 模型专用的 `OPENCODE_GO_API_KEY`，绝不复用 `llm-deepseek` 的 `DEEPSEEK_API_KEY`。\r\n\r\n## 数据来源\r\n\r\n官方端点（OpenAI 兼容网关的用量接口）：\r\n\r\n```\r\nGET https://opencode.ai/zen/go/v1/usage\r\nAuthorization: Bearer <key>\r\n```\r\n\r\n响应：\r\n\r\n```json\r\n{\r\n  \"usage\": {\r\n    \"rolling\": { \"status\": \"ok\", \"percent\": 1,  \"resetsAt\": \"2026-08-14T06:44:12.569Z\" },\r\n    \"weekly\":  { \"status\": \"ok\", \"percent\": 12, \"resetsAt\": \"2026-08-17T00:00:00.569Z\" },\r\n    \"monthly\": { \"status\": \"ok\", \"percent\": 35, \"resetsAt\": \"2026-08-30T02:03:31.569Z\" }\r\n  }\r\n}\r\n```\r\n\r\n- `percent` = 该窗口已使用的百分比（`100 - percent` 即剩余额度）；\r\n- `status` = `ok`（正常）或其它（如超额时提示注意）；\r\n- `resetsAt` = 该窗口重置时间（ISO），面板显示本地时间 + 每秒跳动的倒计时。\r\n\r\n> 无密钥 / 无效密钥 → HTTP 401；本插件把 401/403 转成可读错误「密钥缺失、过期或无 Go 套餐权限」。\r\n> 其它路径（`/zen/go/v1/subscription`、`/api/usage` 等）均为 404，`/zen/go/v1/usage` 是唯一可用余额端点（已实测验证）。\r\n\r\n## 架构\r\n\r\n双面插件（同 dsh-ssh 模式），零构建依赖、纯 JS、即装即用。运行时唯一的外部依赖是 `@deepseek-ai/dsh-tools`（工具注册契约，peer 依赖 `^0.1.0-rc.6`，与 dsh-ssh 等官方插件声明一致）——由 DSH 宿主按官方版本提供，插件不自带固定旧版副本、不随包维护：\r\n\r\n```\r\ndsh-opencodego-usage/\r\n├── package.json          # dsh.bundle.patch + dsh.client 声明（exports[\"./client\"]）+ dsh-tools peer 依赖\r\n├── cordis.patch.yml      # 向 web profile 行列插入 {id: opencode-go}\r\n├── lib/\r\n│   ├── index.js          # 宿主半面（ESM）：余额服务 + 路由 + 工具 + 提示词\r\n│   └── client.js         # 浏览器半面（手写 CJS bundle，零外部 require）\r\n└── test/                 # host-boot + client-smoke 两套回归测试\r\n```\r\n\r\n### 宿主半面 `lib/index.js`\r\n\r\n| 能力 | 说明 |\r\n| --- | --- |\r\n| `GET /api/dsh-opencode-go/balance` | 回环防护（仅本机/同源），`?refresh=1` 绕过缓存；返回 `{ok, fetchedAt, cached, source, usage?, error?}` |\r\n| 密钥/端点解析 | 默认取 `settings.get('llm-pi-ai')` 的 `providers.opencode-go` 路由 `baseURL`（取 origin）与 `apiKeyEnv`（即 `OPENCODE_GO_API_KEY`），回退到插件自带默认 `https://opencode.ai` / `OPENCODE_GO_API_KEY`；credentials 服务 `resolve(ref)`，`process.env` 兜底；绝不继承 `llm-deepseek.apiKeyEnv`（其 schema 默认是 `DEEPSEEK_API_KEY`）；可用插件 config 覆盖 |\r\n| 缓存 | 内存 30s TTL（可配 `cacheTtlMs`），缓存命中不触发上游请求 |\r\n| 工具 | `opencode_go_balance`（dsh-tools `defineTool`，结构化 schema + markdown render） |\r\n| 提示词 | `plugin:dsh-opencode-go` 段（order 150），声明能力与限制 |\r\n\r\n插件 config（在 patch 入口的 `config` 字段配置，均可选）：\r\n\r\n```yaml\r\n- insert:\r\n    - id: opencode-go\r\n      name: '@dong-victor/dsh-opencodego-usage'\r\n      config:\r\n        enabled: true          # 总开关\r\n        announceToAgent: true  # 是否向 agent 声明\r\n        # apiBaseUrl: 'https://opencode.ai'      # 覆盖端点（默认取 opencode-go 路由 baseURL 的 origin，再回退插件默认）\r\n        # apiKeyEnv: 'OPENCODE_GO_API_KEY'          # 覆盖凭据引用（默认同左，永不取 llm-deepseek 的 DEEPSEEK_API_KEY）\r\n        # cacheTtlMs: 30000\r\n        # timeoutMs: 15000\r\n```\r\n\r\n### 浏览器半面 `lib/client.js`\r\n\r\n- 侧边栏入口：DOM 级注入（MutationObserver 自愈，React 重渲染后同帧复位），**余额直接显示在侧边栏、无需点击**——头部（图标 + 「Go 余额」）+ 三行明细（5小时 / 周 / 余额），每行含进度条（>60% 变黄、≥90% 变红）、已用百分比、重置时间（24h 内显示 HH:mm，否则 MM/DD HH:mm），60s 自动刷新（宿主 30s 缓存兜底）；悬停 tooltip 显示完整明细；\r\n- 点击条目打开中央列面板：`[data-pane=\"conversation\"]` 内绝对定位容器（**不透明背景**，避免对话文本透底）+ `<html data-dsh-opencode-go-active>` 控制显隐，与 SSH / 任务看板面板互斥（跨插件 `dsh-panel-activate` 事件协调）；\r\n- 三张用量卡：进度条（>60% 变黄、≥90% 变红）、状态徽章、已用/剩余百分比、重置时间 + 每秒倒计时；\r\n- 刷新按钮（`?refresh=1`）、关闭按钮、错误横幅、端点/密钥元信息（密钥只显示掩码 `sk-yAE…eLEj`）；\r\n- 样式全部走 dsh `--dsw-*` 主题 token，跟随皮肤明暗；中英双语（`document.lang` 自动切换）。\r\n\r\n## 安装\r\n\r\n```powershell\r\n# 在插件目录（本包）外执行，把本地链接装进 web profile 并加入 bundle 层\r\ndsh plugin --profile web add link:C:\\Users\\dongz\\.dsh\\workspace\\dsh-opencodego-usage\r\n```\r\n\r\n- `dsh plugin` 会向 `~/.dsh/profiles/web` 跑 `pnpm add link:<绝对路径>`，然后把声明了 `dsh.bundle` 的包名写进 `dsh.profile.bundles`；\r\n- **重启 `dsh web`** 使新的 bundle 层生效（浏览器刷新不够——宿主 loader 在启动时读 bundle 层；`/plugins/<id>/client.js` 是启动后按需加载的）。\r\n- 卸载：`dsh plugin --profile web remove @dong-victor/dsh-opencodego-usage`，再重启。\r\n\r\n## 开源发布与命令行安装\r\n\r\n包已按 npm 发布标准整理（`files` 只含 `lib/`、`cordis.patch.yml`、`README.md`、`LICENSE`，无 node_modules/lockfile；`npm pack --dry-run` 已核对）。发布后任何机器都能：\r\n\r\n```powershell\r\n# 安装（会加入 dsh.profile.bundles，重启 dsh web 生效）\r\ndsh plugin --profile web add @dong-victor/dsh-opencodego-usage\r\n\r\n# 卸载\r\ndsh plugin --profile web remove @dong-victor/dsh-opencodego-usage\r\n```\r\n\r\n发布步骤（一次性）：\r\n\r\n```bash\r\n# 1) 推送到 GitHub（仓库名建议与包名一致）\r\ncd dsh-opencodego-usage\r\ngit remote add origin git@github.com:<你的账号>/dsh-opencodego-usage.git\r\ngit push -u origin main\r\n\r\n# 2) 发布到 npm 官方源（注意：scope @dong-victor 必须是你自己的 npm 用户名/org；\r\n#    本机 registry 若配了 npmmirror 镜像，发布必须显式走官方源）\r\nnpm login --registry=https://registry.npmjs.org     # 账号必须是 dong-victor\r\nnpm publish --access public --registry=https://registry.npmjs.org\r\n\r\n# 之后每次改代码：npm version patch && npm publish --registry=https://registry.npmjs.org\r\n```\r\n\r\n安装侧注意事项：\r\n\r\n- **registry**：本机 pnpm/npm 若指向 npmmirror 镜像，新包同步有延迟；想立即安装可在 `dsh plugin` 命令后追加 pnpm 参数：`dsh plugin --profile web add @dong-victor/dsh-opencodego-usage --registry=https://registry.npmjs.org`。\r\n- **依赖随宿主**：`@deepseek-ai/dsh-tools` 声明为 peer 依赖（`^0.1.0-rc.6`，同官方插件），运行时解析到 DSH 宿主安装的官方版本，插件不随包维护固定旧版；本地开发/测试时 npm 会自动装上该 peer。\r\n- **`dsh.bundle` 自动接线**：安装后 `dsh plugin` 自动把包名写入 `dsh.profile.bundles`（reconcile 机制），无需手动改 profile；`remove` 会自动移除。\r\n- **版本升级**：`dsh plugin --profile web update`（pnpm update）拉取新版本，重启生效。\r\n- 已验证（tarball 等价流程）：临时 profile 上 `add file:<tgz>` → 依赖安装 + bundles 自动加入 + `import()` 解析正常 + `remove` 干净卸载。\r\n\r\n## 前置条件\r\n\r\n- 密钥通过 `OPENCODE_GO_API_KEY` 凭据引用提供：已通过 credentials 服务保存（`~/.dsh/.credentials.yaml`，Web「模型」设置页写入），或由启动环境导出；该 key 享有 opencode Go 套餐、是官方 opencode 模型专用密钥（不是 `DEEPSEEK_API_KEY`）。\r\n- 端点默认 `https://opencode.ai`；若 `llm-pi-ai` 的 `opencode-go` 路由配置了 `baseURL`，则取其 origin。\r\n\r\n## 安全与限制\r\n\r\n- 余额查询是只读操作；路由带 loopback/same-origin 防护；\r\n- 密钥仅在本机用于请求上游，响应中只回传掩码 `keyHint`；\r\n- 依赖 opencode 官方端点可用性与套餐有效性；网络不可达/密钥失效时面板显示错误横幅，agent 工具返回 `ok:false + error`；\r\n- 上游用量数据是分档百分比，无余额数值（官方端点不提供），面板按「已用/剩余 % + 重置时间」呈现。\r\n\r\n## 开发者自测\r\n\r\n插件对 `@deepseek-ai/dsh-tools` 只声明 peer 依赖（`^0.1.0-rc.6`），npm 安装时自动带上官方版本，测试只需 jsdom：\r\n\r\n```bash\r\ncd dsh-opencodego-usage\r\nnpm install            # 首次（装 jsdom；dsh-tools peer 依赖自动带上）\r\nnpm test               # 两套测试：\r\n                       #  host-boot.test.mjs    模拟 loader 调 apply()：路由/工具/提示词注册、\r\n                       #                         工具 schema 编译、execute/render/dispose（12 项断言）\r\n                       #  client-smoke.test.mjs jsdom DOM 冒烟：注册/挂载/渲染/倒计时/刷新/错误/销毁（28 项断言）\r\n\r\n# 宿主逻辑（真实请求，需要可用密钥；密钥默认走 credentials 服务 / 环境变量）\r\nnode -e \"import('./lib/index.js').then(async m => {\r\n  const s = await m.resolveSource({ get(){return undefined} }, {});\r\n  console.log(s);\r\n  const svc = new m.BalanceService({ getSource: () => m.resolveSource({ get(){return undefined} }, {}) });\r\n  console.log(await svc.get({ refresh: true }));\r\n})\"\r\n```\r\n","readmeFilename":"README.md"}