dsh-key-usage 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -133
- package/client/client.js +159 -117
- package/client/client.js.map +1 -1
- package/lib/index.js +4 -1
- package/lib/routes.js +9 -3
- package/lib/session-meta.js +101 -0
- package/lib/session-usage.js +28 -1
- package/lib/sessions.js +13 -4
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,188 +1,211 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# 使用情况 · dsh-key-usage
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
5
|
+
**DeepSeek Harness 的侧边栏用量面板** —— 按通道看 Token、缓存命中率、成本,以及余额与订阅窗口。
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/dsh-key-usage)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](#兼容与运行要求)
|
|
10
|
+
[](#兼容与运行要求)
|
|
11
|
+
[](https://github.com/topics/dsh-plugin)
|
|
12
|
+
|
|
13
|
+
[安装](#安装) · [功能](#功能) · [界面预览](#界面预览) · [权限与数据来源](#权限与数据来源) · [常见问题](#常见问题) · [开发](#开发)
|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
装上之后,左侧边栏会多一项「使用情况」,点开就是整页的用量面板:**Key 清单 + 活跃热力图、使用明细、项目用量、会话用量、余额与配额**。全部数据来自你自己的机器,默认不联网。
|
|
20
|
+
|
|
21
|
+
它和同类插件的两个区别:
|
|
22
|
+
|
|
23
|
+
- **台账 × 会话事件双源合并** —— 宿主台账停更时(很常见),台账没有记录的日期会自动回退到本地会话事件折叠补齐,**按天取舍、不相加**,并在界面上标明来源;
|
|
24
|
+
- **余额与订阅窗口是真·实时** —— 直接查各通道官方接口(opencode-go 的 rolling / weekly / monthly、DeepSeek 的 `/user/balance`),查不到才回落本机快照,并把失败原因写在卡片上。
|
|
8
25
|
|
|
9
26
|
## 安装
|
|
10
27
|
|
|
11
28
|
```bash
|
|
12
|
-
|
|
29
|
+
dsh plugin --profile web add dsh-key-usage
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
装完三步:
|
|
33
|
+
|
|
34
|
+
1. **退出并重新打开 DSH** —— 插件树在宿主启动时组合,服务端代码没有热重载;
|
|
35
|
+
2. 刷新页面(客户端改动只需刷新);
|
|
36
|
+
3. 左侧边栏出现「使用情况」图标(在「上下文洞察」下方)。
|
|
37
|
+
|
|
38
|
+
> **桌面端**:`--profile desktop` 由 Electron 应用独占,CLI 会拒绝,请在应用内的 **Plugin Hub → 安装插件** 里填 `dsh-key-usage`。
|
|
39
|
+
|
|
40
|
+
<details>
|
|
41
|
+
<summary>其他安装方式</summary>
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 从 GitHub 装(等价,包内含构建产物,不需要本地编译)
|
|
13
45
|
dsh plugin --profile web add github:xyl886/dsh-key-usage
|
|
14
46
|
|
|
15
|
-
#
|
|
16
|
-
dsh plugin --profile
|
|
47
|
+
# 本地开发:软链到本仓库,改文件即时生效
|
|
48
|
+
dsh plugin --profile web add link:/path/to/dsh-key-usage
|
|
49
|
+
|
|
50
|
+
# 卸载
|
|
51
|
+
dsh plugin --profile web remove dsh-key-usage
|
|
17
52
|
```
|
|
18
53
|
|
|
19
|
-
|
|
54
|
+
</details>
|
|
20
55
|
|
|
21
|
-
|
|
56
|
+
### 验证安装
|
|
22
57
|
|
|
23
|
-
|
|
58
|
+
```bash
|
|
59
|
+
curl -s http://127.0.0.1:19387/dsh-key-usage/channels # 返回 { channels: [...] } 即已挂载
|
|
60
|
+
```
|
|
24
61
|
|
|
25
|
-
|
|
26
|
-
| --- | --- |
|
|
27
|
-
| 总览 | Key 清单(通道 / 类型 / 今日 / 近 30 天 / 余额或窗口 / 30 天成本)+ 年度活跃热力图(按日 Tokens,悬停看当日各模型占比) |
|
|
28
|
-
| 使用明细 | 范围切换(今日 / 周 / 月 / 总计 / 自定义)+ 调用次数·Tokens·成本三卡 + 通道占比条 + 按天(单日按小时)堆叠图 + 每日细目(可展开到模型) |
|
|
29
|
-
| 项目用量 | 按工作目录聚合:调用 / Tokens / 占比 / 成本 / 最近活跃,可搜索、筛选通道、排序 |
|
|
30
|
-
| 会话用量 | 按会话列出时间 / 时长 / Tokens / 命中率 / 成本,按日分组,可搜索、筛选、排序 |
|
|
31
|
-
| 余额与配额 | 各通道余额与订阅窗口占用(实时查询官方接口,失败回落快照并标明来源) |
|
|
62
|
+
7 个端点全部只读 GET,且只接受 `127.0.0.1` / `::1` 回环请求,非回环一律 403。
|
|
32
63
|
|
|
33
|
-
##
|
|
64
|
+
## 功能
|
|
34
65
|
|
|
35
|
-
|
|
66
|
+
**总览**
|
|
36
67
|
|
|
37
|
-
|
|
68
|
+
- **Key 清单** —— 每个通道一行:类型(按量计费 / 免费额度 / 本地端点 / 订阅制)、今日与近 30 天的调用量、余额或订阅窗口占用、30 天成本;
|
|
69
|
+
- **活跃热力图** —— 近 9 个月的按日 Tokens 热力图,格子按可见区间的**活跃日三分位**分档(少 / 中 / 高),悬停看当日各模型的 Token 与占比。
|
|
38
70
|
|
|
39
|
-
|
|
71
|
+
**使用明细**
|
|
40
72
|
|
|
41
|
-
|
|
73
|
+
- **范围与筛选** —— 今日 / 周 / 月 / 总计 / 自定义,按通道筛选,全页联动;
|
|
74
|
+
- **三张统计卡** —— 调用次数、Tokens(含缓存命中率)、成本;
|
|
75
|
+
- **通道占比条** —— 一个横条看各通道占比,悬停出明细;
|
|
76
|
+
- **按天 / 按小时图表** —— 堆叠柱状图,横轴铺满所选范围;单日范围自动切成 24 小时视图;
|
|
77
|
+
- **每日细目** —— 每天一行,可展开到模型级别(调用 / 输入 / 输出 / 缓存读 / 命中率 / 成本)。
|
|
42
78
|
|
|
43
|
-
|
|
79
|
+
**项目用量**
|
|
44
80
|
|
|
45
|
-
|
|
81
|
+
- 按工作目录聚合的调用数、Tokens、占比、成本与最近活跃时间,支持搜索、按通道筛选、按列排序。
|
|
82
|
+
|
|
83
|
+
**会话用量**
|
|
84
|
+
|
|
85
|
+
- 按会话列出时间、时长、Tokens、命中率与成本,按日期分组,同样支持搜索 / 筛选 / 排序。
|
|
86
|
+
|
|
87
|
+
**余额与配额**
|
|
88
|
+
|
|
89
|
+
- 每个通道一张卡片:官方余额(DeepSeek 的总余额 / 赠送 / 充值)或订阅窗口占用(opencode-go 的 5 小时 / 本周 / 本月窗口 + 重置时间);
|
|
90
|
+
- 实时查询成功的卡片带绿色「实时」标签与查询时间;失败的写明原因(未配置 Key / 网络不可达 / 401 / 超时)并回落快照。
|
|
91
|
+
|
|
92
|
+
## 界面预览
|
|
46
93
|
|
|
47
|
-
|
|
94
|
+
> 演示数据,由设计稿原型渲染([`docs/prototype/`](./docs/prototype/))。
|
|
48
95
|
|
|
49
|
-
|
|
96
|
+
<p align="center">
|
|
97
|
+
<img src="./docs/images/usage-overview.png" alt="总览:Key 清单与活跃热力图" width="820" />
|
|
98
|
+
</p>
|
|
99
|
+
|
|
100
|
+
<p align="center">
|
|
101
|
+
<img src="./docs/images/usage-daily.png" alt="使用明细:统计卡、通道占比、按天图表与每日细目" width="820" />
|
|
102
|
+
</p>
|
|
103
|
+
|
|
104
|
+
<p align="center">
|
|
105
|
+
<img src="./docs/images/usage-quota.png" alt="余额与配额:官方余额与订阅窗口" width="820" />
|
|
106
|
+
</p>
|
|
107
|
+
|
|
108
|
+
## 权限与数据来源
|
|
50
109
|
|
|
51
110
|
| 读取对象 | 用途 | 说明 |
|
|
52
111
|
| --- | --- | --- |
|
|
53
|
-
| `$DSH_HOME/dsh-usage/usage-ledger.json` | 用量台账 | 按天 × 通道 ×
|
|
54
|
-
| `$DSH_HOME/dsh-usage/provider-snapshots.json` | 余额 /
|
|
55
|
-
| `$DSH_HOME/profiles/<profile>/cordis.yml
|
|
56
|
-
| 宿主 `sessionPersistence` 服务 | 项目 / 会话 / 按小时 |
|
|
57
|
-
| 宿主 `credentials` 服务 / 进程环境变量 | 查余额时的 API Key |
|
|
112
|
+
| `$DSH_HOME/dsh-usage/usage-ledger.json` | 用量台账 | 按天 × 通道 × 模型,含官方成本 |
|
|
113
|
+
| `$DSH_HOME/dsh-usage/provider-snapshots.json` | 余额 / 窗口**回落值** | 仅在实时查询失败时使用 |
|
|
114
|
+
| `$DSH_HOME/profiles/<profile>/cordis.yml` | 通道清单 | 只做文本提取,**不执行**其中的 `!!js` 表达式;取不到时回退 `cordis.patch.yml` |
|
|
115
|
+
| 宿主 `sessionPersistence` 服务 | 项目 / 会话 / 按小时 | 只开只读句柄(`open("read") → read(0) → close`),不自行解压会话文件 |
|
|
116
|
+
| 宿主 `credentials` 服务 / 进程环境变量 | 查余额时的 API Key | 只用于拼 `Authorization` 请求头 |
|
|
58
117
|
|
|
59
|
-
|
|
118
|
+
**会联网的唯一路径**:打开「余额与配额」时按通道请求官方接口,结果缓存 60 秒(点「刷新」强制重查):
|
|
60
119
|
|
|
61
|
-
| 通道 | 接口 |
|
|
62
|
-
| --- | --- |
|
|
63
|
-
| `opencode-go` | `GET https://opencode.ai/zen/go/v1/usage
|
|
64
|
-
| `deepseek-official` | `GET {baseURL}/user/balance` |
|
|
65
|
-
| `openrouter` / `moonshotai` / `zai` | 各自的官方余额接口 |
|
|
120
|
+
| 通道 | 接口 |
|
|
121
|
+
| --- | --- |
|
|
122
|
+
| `opencode-go` | `GET https://opencode.ai/zen/go/v1/usage`(rolling / weekly / monthly) |
|
|
123
|
+
| `deepseek-official` | `GET {baseURL}/user/balance` |
|
|
124
|
+
| `openrouter` / `moonshotai` / `zai` | 各自的官方余额接口 |
|
|
66
125
|
|
|
67
|
-
请求 6 秒超时、响应上限 64 KiB、只发 `Authorization` 与 `Accept`
|
|
126
|
+
请求 6 秒超时、响应上限 64 KiB、只发 `Authorization` 与 `Accept` 两个头;任何失败都回落本机快照并在卡片上说明原因。
|
|
68
127
|
|
|
69
|
-
-
|
|
70
|
-
-
|
|
71
|
-
-
|
|
128
|
+
- **不读凭据文件**:从不打开 `.credentials.yaml`;密钥不落盘、不进日志、不返回给前端;界面只显示 `apiKeyEnv` 这类**变量名**。
|
|
129
|
+
- **不写文件**:不改宿主配置,不写任何数据文件。
|
|
130
|
+
- **仅回环**:所有端点只监听本机回环,非回环 403。
|
|
72
131
|
|
|
73
132
|
## 兼容与运行要求
|
|
74
133
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
-
|
|
134
|
+
| 项 | 要求 |
|
|
135
|
+
| --- | --- |
|
|
136
|
+
| DeepSeek Harness | 桌面端 0.2.x(客户端 slot:`sidebar.panellist` + `main`);web profile 同样支持 |
|
|
137
|
+
| Node.js | ≥ 22(宿主内置) |
|
|
138
|
+
| 运行时依赖 | 无。`react` / `react/jsx-runtime` 由宿主注入,服务端只用 Node 内置模块 |
|
|
139
|
+
| 必需服务 | 无 |
|
|
140
|
+
| 可选服务 | `sessionPersistence`(缺失时项目 / 会话 / 按小时降级为空态)、`credentials`(缺失时余额只能读快照) |
|
|
80
141
|
|
|
81
|
-
|
|
142
|
+
## 常见问题
|
|
82
143
|
|
|
83
|
-
|
|
144
|
+
<details>
|
|
145
|
+
<summary><b>「今日」列是空的 / 数据比官方少</b></summary>
|
|
84
146
|
|
|
85
|
-
|
|
147
|
+
数据优先取宿主用量台账;台账长期不更新时,没有记录的日期会回退到本地会话事件折叠补齐(页脚口径说明会显示当前有多少天是会话补位的)。两套来源**按天取舍、不相加**,所以不会重复计数,但会话补位的那几天没有官方成本。
|
|
148
|
+
</details>
|
|
86
149
|
|
|
87
|
-
|
|
150
|
+
<details>
|
|
151
|
+
<summary><b>余额卡片显示「该通道未配置 API Key」</b></summary>
|
|
88
152
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
node node_modules/tsdown/dist/run.mjs && node scripts/normalize-client-banner.mjs # 构建客户端 → client/client.js
|
|
92
|
-
node node_modules/typescript/bin/tsc -p tsconfig.server.json # 构建服务端 → lib/
|
|
93
|
-
node node_modules/typescript/bin/tsc -p tsconfig.json --noEmit # 类型检查
|
|
94
|
-
node test/ledger.test.mjs # 其余:collect / channels / session-usage / sessions / merge / live-quota / routes
|
|
95
|
-
```
|
|
153
|
+
需要宿主 `credentials` 能解析该通道的 `apiKeyEnv`(如 `OPENCODE_GO_API_KEY`),或该变量存在于宿主进程环境里。解析不到时插件不会去读凭据文件,而是直接回落快照。
|
|
154
|
+
</details>
|
|
96
155
|
|
|
97
|
-
|
|
156
|
+
<details>
|
|
157
|
+
<summary><b>热力图的颜色深浅怎么定</b></summary>
|
|
98
158
|
|
|
99
|
-
|
|
100
|
-
>
|
|
159
|
+
按可见区间内**活跃日的三分位**分档(p33 / p67),不是固定阈值 —— 这样低用量和高用量都能看出层次。
|
|
160
|
+
</details>
|
|
101
161
|
|
|
102
|
-
|
|
162
|
+
<details>
|
|
163
|
+
<summary><b>成本显示为 0 / 「无计费」</b></summary>
|
|
103
164
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
├── src/
|
|
107
|
-
│ ├── client/ # 客户端 bundle 源码(entry: index.tsx)
|
|
108
|
-
│ │ ├── index.tsx # cordis 接线:注册 sidebar.panellist + main
|
|
109
|
-
│ │ ├── UsagePage.tsx # 主区域整页容器(含滚动)
|
|
110
|
-
│ │ ├── UsageIcon.tsx # 侧边栏导航图标(currentColor)
|
|
111
|
-
│ │ ├── KeyUsageSection.tsx # 页面内容:Tab 路由 + 取数 + 范围/筛选状态
|
|
112
|
-
│ │ ├── api.ts # 端点取数封装
|
|
113
|
-
│ │ ├── format.ts # 数字 / 时间 / 时长格式化
|
|
114
|
-
│ │ ├── channels.ts # 通道颜色、状态、计费模式文案
|
|
115
|
-
│ │ ├── tooltip.tsx # 共享浮层
|
|
116
|
-
│ │ ├── types.ts # 宿主 slot 契约 + 端点响应类型
|
|
117
|
-
│ │ ├── tabs/ # 每个 Tab 一个组件(Overview / Detail / Projects / Sessions / Quota)
|
|
118
|
-
│ │ ├── components/ # StatCard / ShareBar / Heatmap / TokenBars / DailyDetailTable
|
|
119
|
-
│ │ └── styles/ # shared / overview / detail / lists / quota / page(basename 全局唯一)
|
|
120
|
-
│ └── server/ # 服务端源码(编译到 lib/)
|
|
121
|
-
│ ├── index.ts # cordis apply:注入 webServer / 会话数据源 / 实时余额
|
|
122
|
-
│ ├── routes.ts # 7 个只读 GET 端点 + loopback 校验
|
|
123
|
-
│ ├── ledger.ts # 台账解析、范围聚合、均价表、成本估算
|
|
124
|
-
│ ├── collect.ts # cordis.yml 提取 + 快照归一化 + 状态/计费模式判定
|
|
125
|
-
│ ├── merge.ts # 台账 × 会话事件的按天合并
|
|
126
|
-
│ ├── live-quota.ts # 官方余额 / 订阅窗口实时查询(含缓存与错误分档)
|
|
127
|
-
│ ├── session-usage.ts # 会话事件 → 按天/小时/模型折叠(纯函数)
|
|
128
|
-
│ └── sessions.ts # sessionPersistence 适配 + revision 缓存 + 项目/会话聚合
|
|
129
|
-
├── lib/ # 服务端构建产物(package.json main,需提交)
|
|
130
|
-
├── client/client.js # 客户端构建产物(单文件,需提交)
|
|
131
|
-
├── test/ # 8 个离线测试(直接 import lib/*.js)
|
|
132
|
-
├── docs/ # 架构契约 / 差异清单 / 重构方案 / 设计稿原型
|
|
133
|
-
├── tsdown.config.ts # 客户端打包 + CSS Modules 内联插件
|
|
134
|
-
└── tsconfig*.json # 类型检查与服务端编译
|
|
135
|
-
```
|
|
165
|
+
免费额度、本地端点没有成本概念;由会话事件补位的日期也没有官方成本。项目 / 会话 / 按小时视图统一不计成本(页脚口径里有说明)。
|
|
166
|
+
</details>
|
|
136
167
|
|
|
137
|
-
|
|
168
|
+
<details>
|
|
169
|
+
<summary><b>卸载后侧边栏还有图标</b></summary>
|
|
138
170
|
|
|
139
|
-
|
|
171
|
+
客户端资源需要刷新页面,服务端需要退出重开 DSH。桌面端的卸载同样在 Plugin Hub 里操作。
|
|
172
|
+
</details>
|
|
140
173
|
|
|
141
|
-
|
|
142
|
-
const PANEL_ID = 'dsh-key-usage'
|
|
143
|
-
ctx.slots.inject('main', () => ctx.slots.register({ name: 'main', key: PANEL_ID }, UsagePage))
|
|
144
|
-
ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({
|
|
145
|
-
name: 'sidebar.panellist', id: PANEL_ID, order: 30, label: () => '使用情况',
|
|
146
|
-
}, (props) => h(UsageIcon, { size: props.size })))
|
|
147
|
-
```
|
|
174
|
+
## 开发
|
|
148
175
|
|
|
149
|
-
|
|
150
|
-
-
|
|
151
|
-
-
|
|
176
|
+
```bash
|
|
177
|
+
node node_modules/tsdown/dist/run.mjs && node scripts/normalize-client-banner.mjs # 构建客户端 → client/client.js
|
|
178
|
+
node node_modules/typescript/bin/tsc -p tsconfig.server.json # 构建服务端 → lib/
|
|
179
|
+
node node_modules/typescript/bin/tsc -p tsconfig.json --noEmit # 类型检查
|
|
180
|
+
node test/ledger.test.mjs # 其余:collect / channels / session-usage / sessions / merge / live-quota / routes
|
|
181
|
+
```
|
|
152
182
|
|
|
153
|
-
|
|
183
|
+
**改动生效条件**(最容易踩的坑):
|
|
154
184
|
|
|
155
|
-
|
|
|
185
|
+
| 改动 | 生效方式 |
|
|
156
186
|
| --- | --- |
|
|
157
|
-
| `src/client/**` | 重新构建 →
|
|
158
|
-
| `src/server/**` | 重新编译
|
|
187
|
+
| `src/client/**` | 重新构建 → **刷新页面** |
|
|
188
|
+
| `src/server/**` | 重新编译 `lib/` → **退出重开 DSH**(无热重载) |
|
|
189
|
+
|
|
190
|
+
另外两个坑:`tsc --noEmit` **不会**更新 `lib/`,而测试读的是 `lib/*.js`;`cordis.yml` 是应用重写的组合产物,插件集变化期间会短暂变成空模板,因此通道提取会回退到 `cordis.patch.yml`。
|
|
159
191
|
|
|
160
|
-
|
|
161
|
-
2. **服务端没有热重载**:插件代码在挂载时进入 Node 的 ESM 缓存,重新安装不会重新导入;Hub 的 `/restart` 在桌面端返回 `{ok:false, desktop:true}`。
|
|
162
|
-
3. **`cordis.yml` 是应用重写的组合产物**:插件集变化期间会被短暂重写成空模板,因此通道提取先读它、取不到再回退 `cordis.patch.yml`;其中 `local` 通道不写 `apiKeyEnv`,判定顺序必须**先判本地端点、再判未配置**。
|
|
192
|
+
**目录结构**
|
|
163
193
|
|
|
164
|
-
|
|
194
|
+
```
|
|
195
|
+
src/client/ index.tsx(slot 注册)· UsagePage / UsageIcon · KeyUsageSection(Tab 外壳)
|
|
196
|
+
tabs/(5 个页面)· components/ · styles/(CSS Module,basename 全局唯一)
|
|
197
|
+
src/server/ index.ts(cordis apply)· routes.ts(7 个只读端点)
|
|
198
|
+
ledger.ts(台账)· collect.ts(通道判定)· merge.ts(台账 × 会话按天合并)
|
|
199
|
+
live-quota.ts(官方余额实时查询 + 缓存)· sessions.ts / session-usage.ts(会话折叠)
|
|
200
|
+
lib/ client/ 构建产物(发布必须带,git 与 npm 都提交)
|
|
201
|
+
```
|
|
165
202
|
|
|
166
|
-
|
|
203
|
+
客户端注册的是 `sidebar.panellist`(导航项)+ `main`(主区域整页),与官方 `dsh-context`「上下文洞察」同一套写法。
|
|
167
204
|
|
|
168
|
-
|
|
169
|
-
| --- | --- | --- |
|
|
170
|
-
| `/dsh-key-usage/channels` | — | `{ channels: Channel[] }`,含 `status` / `costMode` / `costLabel` / `quota*` / `balanceText` |
|
|
171
|
-
| `/dsh-key-usage/usage` | `from`、`to`、`provider` | `{ totals, days, sessionDates, availableFrom, availableTo, hours }`,`hours` 仅在单日范围非空 |
|
|
172
|
-
| `/dsh-key-usage/heatmap` | — | `{ days: [{ date, totalTokens, models[] }], sessionDates }` |
|
|
173
|
-
| `/dsh-key-usage/quota` | `fresh=1` 强制重查 | `{ providers: [{ provider, source, fetchedAt, error, balance, plan }] }` |
|
|
174
|
-
| `/dsh-key-usage/summary` | — | `{ channels, range, todaySource, sessionDates }`(总览「今日 / 近 30 天」) |
|
|
175
|
-
| `/dsh-key-usage/sessions` | `limit` | `{ rows, coverage, priced }` |
|
|
176
|
-
| `/dsh-key-usage/projects` | `limit` | `{ rows, coverage, priced }` |
|
|
205
|
+
**延伸文档**:[架构与数据契约](./docs/01-架构与数据契约.md) · [原型差异清单](./docs/02-原型差异与优化清单.md) · [按 Tab 重构方案](./docs/03-按Tab拆分重构方案.md) · [会话归档的影响](./docs/04-归档会话的影响与对策.md) · [AGENTS.md](./AGENTS.md)
|
|
177
206
|
|
|
178
|
-
|
|
207
|
+
## 许可证
|
|
179
208
|
|
|
180
|
-
|
|
209
|
+
[MIT](./LICENSE) © 2026 xyl886
|
|
181
210
|
|
|
182
|
-
|
|
183
|
-
| --- | --- |
|
|
184
|
-
| [`docs/01-架构与数据契约.md`](./docs/01-架构与数据契约.md) | 模块职责、端点字段级契约、会话服务契约、统计口径、判定规则 |
|
|
185
|
-
| [`docs/02-原型差异与优化清单.md`](./docs/02-原型差异与优化清单.md) | 截图 × 原型 × 源码差异对比与逐条落实情况 |
|
|
186
|
-
| [`docs/03-按Tab拆分重构方案.md`](./docs/03-按Tab拆分重构方案.md) | 拆分方案与实施记录 |
|
|
187
|
-
| [`docs/prototype/`](./docs/prototype/) | 设计稿原型(演示数据,界面预览图由它渲染) |
|
|
188
|
-
| [`AGENTS.md`](./AGENTS.md) | 接手本仓库的 agent 的必读清单、硬约束与汇报要求 |
|
|
211
|
+
非官方社区插件,与 DeepSeek 无隶属关系。
|