dsh-codearts 1.2.3 → 1.2.5
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/CHANGELOG.md +75 -0
- package/README.en.md +4 -0
- package/README.md +1 -0
- package/lib/bin.mjs +2 -2
- package/lib/client/index.d.cts +45 -6
- package/lib/client/index.js +645 -221
- package/lib/index.d.mts +35 -0
- package/lib/index.mjs +44 -11
- package/lib/{usage-CzJjkqOp.mjs → usage-DGIuT79_.mjs} +101 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,81 @@
|
|
|
3
3
|
本文件记录本插件的重要改动。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
|
|
4
4
|
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
5
5
|
|
|
6
|
+
## [1.2.5] - 2026-11-05
|
|
7
|
+
|
|
8
|
+
### 新增
|
|
9
|
+
|
|
10
|
+
- **设置卡片可以整页打开,并带一个可选的侧边栏图标**:DSH 的侧边栏图标列
|
|
11
|
+
(宿主槽位 `sidebar.panellist`)与中间列面板(`main`)配对使用 —— 同一个 id / key
|
|
12
|
+
才算「点了哪一行就画哪一页」。这一页就是设置里那张卡片,外面套一层「返回对话 +
|
|
13
|
+
标题 + 说明」,账号 / 模型 / 用量 / 显示四个页签一应俱全,不必每次都绕进设置。
|
|
14
|
+
**默认关闭**,在卡片「显示」页最后一个勾选框里打开:图标列是全宿主共用的资源,
|
|
15
|
+
每个插件都默认占一格很快就会挤满,所以这一格交给用户自己决定。
|
|
16
|
+
- **`showSidebarPanel` 配置项与 `/api/codearts/dock` 的第三个键**:状态接口从
|
|
17
|
+
`{ credits, queue }` 扩成 `{ credits, queue, sidebar }`,POST 同样接受 `sidebar`。
|
|
18
|
+
语义和另外两个相反 —— 那两个「缺省即显示」(老配置行为不变),这个是「缺省即关闭」
|
|
19
|
+
(没写过就是不要)。旧后端不返回 `sidebar` 时客户端按关闭处理,不报错。
|
|
20
|
+
|
|
21
|
+
### 变更
|
|
22
|
+
|
|
23
|
+
- **侧边栏入口的开关落在「注册 / 不注册」上,不是「渲染 null」**:宿主是按槽位的
|
|
24
|
+
注册条目本身去画导航行的,组件返回 null 只会留下一个空白但可点的按钮。所以客户端
|
|
25
|
+
改成一个 sync 控制器:先拆掉旧注册,再看开关决定建不建,同一个 id / key 不会注册
|
|
26
|
+
两份。关掉时如果用户正站在那一页上,先 `selectPanel(null)` 回对话,中间列不会停在
|
|
27
|
+
一个已经没了的 key 上。`layout` 服务软取(`ctx.get` 缺服务返回 undefined 而不抛),
|
|
28
|
+
没有它只是少一个返回按钮,不影响整块客户端加载。
|
|
29
|
+
|
|
30
|
+
### 修复
|
|
31
|
+
|
|
32
|
+
- **槽位注册的异常不再冒成首屏渲染错误横幅**:`ctx.slots.inject` 的回调是延后执行的
|
|
33
|
+
(槽位被宿主声明后才跑),在那里抛出的错会从 renderer 的 `changed()` 里以微任务
|
|
34
|
+
冒出来,外层的 try/catch 抓不到。现在每个 inject 回调内部各自 try/catch,注册失败
|
|
35
|
+
返回空 disposer,只留一条 console 记录 —— 老宿主 / 非桌面端没有这两个槽位时,
|
|
36
|
+
卡片其余部分照常可用。
|
|
37
|
+
|
|
38
|
+
## [1.2.4] - 2026-11-03
|
|
39
|
+
|
|
40
|
+
### 变更
|
|
41
|
+
|
|
42
|
+
- **登录回调页不再停在一行「可关闭」提示上,标签页会自己关掉**:华为授权完成后浏览器
|
|
43
|
+
必然落回 `http://127.0.0.1:<port>/oauth/callback` —— redirect_uri 由华为侧指定,登录成功
|
|
44
|
+
的标志就是这次 302,华为那边没有自己的「登录成功」页可停留;这一页也没有任何后续逻辑,
|
|
45
|
+
`code` 在响应发出的同一时刻就交给了服务端,token 交换、身份探测与卡片刷新都不依赖它。
|
|
46
|
+
现在页面先显示「正在返回 DeepSeek Harness…」,300ms 后调用 `window.close()` 自动关闭
|
|
47
|
+
标签页(卡片用 `window.open` 打开授权页,标签页可自关);只有从卡片的手动链接打开、
|
|
48
|
+
或浏览器拦截脚本关窗时,才会在 1.2s 后退化成「登录成功,本页可关闭」的提示。
|
|
49
|
+
|
|
50
|
+
### 新增
|
|
51
|
+
|
|
52
|
+
- **用量里记「缓存命中的输入 token」,弹层保持两列、不摊开**:部分上游在流末尾的
|
|
53
|
+
usage 帧里带 `prompt_tokens_details.cached_tokens`(或平铺的 `cached_tokens` /
|
|
54
|
+
`cache_tokens` / `prompt_cache_hit_tokens`),这块以前被丢掉,只留下一个合计。
|
|
55
|
+
现在解析并存进账本(缓存是输入的子集,脏数据会钳到输入以内),设置卡片的「今日」
|
|
56
|
+
与「近 30 天」显示成 `输入 x · 输出 y · 缓存 z`;缓存段**始终显示**(没有命中就是
|
|
57
|
+
`缓存 0`,命中率仅在有命中时附上)—— 隐藏 0 会让「没命中」和「上游没下发该字段」
|
|
58
|
+
看起来一样,反而分不清功能有没有生效。旧账本(没有 `cachedTokens` 字段)读取时按
|
|
59
|
+
0 补齐,不需要迁移。
|
|
60
|
+
底部积分弹层只回答「哪个号还有多少积分」,这些用量数字到设置卡片的「用量」页里看。
|
|
61
|
+
`/api/codearts/debug` 另外返回最近 5 帧 usage 的原样内容
|
|
62
|
+
(`usages`),用来判断上游到底有没有下发缓存字段。
|
|
63
|
+
- **底部的积分挪进输入框工具行、权限控制右边**:输入框下方那行还挤着宿主的 tok/s、
|
|
64
|
+
缓存命中与上下文圆环,模型名一长(`DeepSeek-V4.1-Flash-20261017`)就压不住。现在
|
|
65
|
+
积分段挂在 `conversation.input.left`(宿主契约里的「composer 工具行左侧紧凑控件」,
|
|
66
|
+
渲染在权限 + 计划之后),Provider / 模型 / 倍率 / 排队仍留在输入框下方那行 —— 同一个
|
|
67
|
+
组件的两个实例,用注入的 `zone` 区分,共用同一份数据和两个显隐开关。点开仍是逐号
|
|
68
|
+
明细:每个号一行「名字 + 余额」,下面一行 11px 灰字 `入 · 出 · 命中 · 条数`(思考
|
|
69
|
+
token 放到设置卡片里),原来那个悬停才出的原生 title 和跟着走的尾巴 `·` 一并去掉。
|
|
70
|
+
- **设置卡片的「用量」页:数字块 + 横条 + 悬停卡片**:顶部三个数字块(今日 token /
|
|
71
|
+
缓存命中 / 今日请求)替掉原来的「今日合计 / 近 30 天」两行文字;下面仍按账号、按模型
|
|
72
|
+
出横向柱状图,悬停任意一行弹出明细卡片(输入 / 输出 / 思考 / 缓存命中 / 请求 /
|
|
73
|
+
命中率,数字精确到个位带千分位),版式照 `agent-acta` 的 `.tok-tip`:名称打头、
|
|
74
|
+
分隔线分段、数字等宽右对齐。上游没下发缓存字段时写「上游未下发」,不显示成 0%。
|
|
75
|
+
- **同时记下「思考 token」**:上游在 `completion_tokens_details.reasoning_tokens`
|
|
76
|
+
(平铺的 `reasoning_tokens` 也认)里单列推理模型的思考量 —— 实测华为每帧都带,
|
|
77
|
+
以前整块丢掉,只看得到一个偏大的「输出」。现在存进账本(它是输出的子集,脏数据钳到
|
|
78
|
+
输出以内),界面统一显示成 `输出 697(思考 505)`,上游不给就只是 `输出 697`;
|
|
79
|
+
0 不单独成段,也不显示 `思考 0`。旧账本同样按 0 补齐。
|
|
80
|
+
|
|
6
81
|
## [1.2.3] - 2026-11-02
|
|
7
82
|
|
|
8
83
|
### 新增
|
package/README.en.md
CHANGED
|
@@ -27,6 +27,10 @@ Brings Huawei Cloud CodeArts into DeepSeek Harness (DSH), so the models CodeArts
|
|
|
27
27
|
which is exactly why a turn had to wait. CodeArts exposes no quota API, so these are the
|
|
28
28
|
requests this machine sent through the plugin; the card links to the official usage page.
|
|
29
29
|
- **Image input**: models with vision support accept pasted or dropped images in a chat.
|
|
30
|
+
- **Sidebar icon**: optional. Tick it on the card’s Display tab and a CodeArts icon joins
|
|
31
|
+
the DSH icon column, opening the full-page version of the settings card in the middle
|
|
32
|
+
column (config `showSidebarPanel`; off by default, since that column is shared by the
|
|
33
|
+
whole host).
|
|
30
34
|
- **Fallback path**: you can also paste a bare security token in the card, for scripts or
|
|
31
35
|
troubleshooting.
|
|
32
36
|
- **CLI**: `status` / `models` / `usage` / `identity` / `doctor` / `logout` for checking
|
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
- **模型清单自动发现**:启动后与每小时各拉一次账号真实可用的模型(内置 / 限时福利 / agent-center 三路合并),失败时退回内置种子清单。
|
|
15
15
|
- **本机用量**:卡片与 `dsh-codearts usage` 展示今日/累计的请求数与输入输出 token(按模型、按账号),以及每个账号的**会话槽位占用**(占用时正好解释了「为什么刚才要等半分钟」)。CodeArts 没有额度接口,这里只统计本机经插件发出的请求,官方额度明细见卡片上的链接。
|
|
16
16
|
- **图片输入**:支持视觉的模型可直接在对话里粘贴或拖入图片。
|
|
17
|
+
- **侧边栏图标**:可选。在卡片「显示」页勾一下,DSH 左侧图标列里会多一个 CodeArts,点开直接在中间列显示整页版的设置卡片(配置项 `showSidebarPanel`,默认关闭 —— 那一列是全宿主共用的)。
|
|
17
18
|
- **降级路径**:也可以在卡片里直接粘贴安全令牌,适用于脚本或排查场景。
|
|
18
19
|
- **命令行**:`status` / `models` / `usage` / `identity` / `doctor` / `logout` 六个子命令,便于在无图形界面时检查登录状态、发现模型与查用量。
|
|
19
20
|
|
package/lib/bin.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { R as isBenefitModel, V as CodeArtsAccountStore, W as codeartsAccountsPath, d as fetchCallerIdentity, n as codeartsUsagePath, r as discoverModels, t as CodeArtsUsageTracker } from "./usage-
|
|
2
|
+
import { R as isBenefitModel, V as CodeArtsAccountStore, W as codeartsAccountsPath, d as fetchCallerIdentity, n as codeartsUsagePath, r as discoverModels, t as CodeArtsUsageTracker } from "./usage-DGIuT79_.mjs";
|
|
3
3
|
import { existsSync, statSync } from "node:fs";
|
|
4
4
|
//#region src/version.ts
|
|
5
|
-
const CODEARTS_VERSION = "1.2.
|
|
5
|
+
const CODEARTS_VERSION = "1.2.5";
|
|
6
6
|
//#endregion
|
|
7
7
|
//#region src/bin.ts
|
|
8
8
|
/**
|
package/lib/client/index.d.cts
CHANGED
|
@@ -62,12 +62,28 @@ interface CodeArtsSettingsKey {
|
|
|
62
62
|
modelsLoading: string;
|
|
63
63
|
usageTitle: string;
|
|
64
64
|
usageToday: string;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
usageRange: string;
|
|
66
|
+
usageStatTokens: string;
|
|
67
|
+
usageStatIn: string;
|
|
68
|
+
usageStatThinking: string;
|
|
69
|
+
usageTipInput: string;
|
|
70
|
+
usageTipOutput: string;
|
|
71
|
+
usageTipReasoning: string;
|
|
72
|
+
usageTipCached: string;
|
|
73
|
+
usageTipNoCache: string;
|
|
74
|
+
usageTipRequests: string;
|
|
75
|
+
usageTipHit: string;
|
|
76
|
+
usageStatHit: string;
|
|
77
|
+
usageStatRequests: string;
|
|
68
78
|
usageRequests: string;
|
|
79
|
+
usageByAccount: string;
|
|
69
80
|
usageRequestCount: string;
|
|
70
81
|
usageTokens: string;
|
|
82
|
+
/** 带缓存命中输入的那一版(上游不给缓存字段时仍用 usageTokens)。 */
|
|
83
|
+
usageCompact: string;
|
|
84
|
+
/** 缓存命中率(`命中 76%`)。 */
|
|
85
|
+
usageCacheHit: string;
|
|
86
|
+
/** 接在输出数字后面的思考 token(`输出 697(思考 505)`);没有思考量时不拼。 */
|
|
71
87
|
usageAllTime: string;
|
|
72
88
|
usageByModel: string;
|
|
73
89
|
usageSlots: string;
|
|
@@ -94,9 +110,6 @@ interface CodeArtsSettingsKey {
|
|
|
94
110
|
creditsDockPanelTitle: string;
|
|
95
111
|
creditsDockRefresh: string;
|
|
96
112
|
creditsDockRefreshing: string;
|
|
97
|
-
creditsDockColAccount: string;
|
|
98
|
-
creditsDockColBalance: string;
|
|
99
|
-
creditsDockColTokens: string;
|
|
100
113
|
creditsDockNoTokens: string;
|
|
101
114
|
creditsDockEmpty: string;
|
|
102
115
|
creditsDockExpiring: string;
|
|
@@ -111,6 +124,9 @@ interface CodeArtsSettingsKey {
|
|
|
111
124
|
displayQueueToggle: string;
|
|
112
125
|
displayNotWritable: string;
|
|
113
126
|
displayFailed: string;
|
|
127
|
+
displaySidebarTitle: string;
|
|
128
|
+
displaySidebarHint: string;
|
|
129
|
+
displaySidebarToggle: string;
|
|
114
130
|
queueDock: string;
|
|
115
131
|
queueDockTitle: string;
|
|
116
132
|
claimButton: string;
|
|
@@ -122,6 +138,8 @@ interface CodeArtsSettingsKey {
|
|
|
122
138
|
claimAlready: string;
|
|
123
139
|
claimUnavailable: string;
|
|
124
140
|
claimFailed: string;
|
|
141
|
+
panelBack: string;
|
|
142
|
+
panelDesc: string;
|
|
125
143
|
[key: string]: string;
|
|
126
144
|
}
|
|
127
145
|
//#endregion
|
|
@@ -144,6 +162,27 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
|
144
162
|
children?: never;
|
|
145
163
|
};
|
|
146
164
|
};
|
|
165
|
+
/**
|
|
166
|
+
* 侧边栏那排图标(宿主 ui-sidebar 声明)。每个 list id 对应 main 面板里
|
|
167
|
+
* 同名的 key —— 宿主自己画按钮,只找我们要两样东西:一个显示用的
|
|
168
|
+
* label,和一个 glyph 组件(组件本身就是图标,宿主给 size / active)。
|
|
169
|
+
*/
|
|
170
|
+
'sidebar.panellist': {
|
|
171
|
+
kind: 'list';
|
|
172
|
+
scope: 'root';
|
|
173
|
+
owner: {
|
|
174
|
+
size: number;
|
|
175
|
+
active: boolean;
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
/** 中间列的面板(宿主 ui-layout 声明)。key 'conversation' 是保留给对话的。 */
|
|
179
|
+
'main': {
|
|
180
|
+
kind: 'keyed';
|
|
181
|
+
scope: 'root';
|
|
182
|
+
owner: {
|
|
183
|
+
children?: never;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
147
186
|
}
|
|
148
187
|
}
|
|
149
188
|
declare const name = "dsh-codearts-client";
|