dsh-codearts 1.2.4 → 1.2.6

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 CHANGED
@@ -3,6 +3,78 @@
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.6] - 2026-11-05
7
+
8
+ ### 新增
9
+
10
+ - **用量页两张趋势图**:近 7 天每格一根柱子,柱高就是当天的**缓存命中率**,
11
+ 配色分三档(≥80% 正常 / 50–80% 偏黄 / <50% 偏红),没命中数据的格留灰底;
12
+ 下面再跟一排「今天按小时」的 token 量柱,轴每 6 格标一个钟点。悬停任意一格,
13
+ 底部那行会显示该格明细(输入 / 缓存 / 命中率 / 请求数),和柱子的 `title` 一致。
14
+ 看命中率下滑通常意味着系统提示词前缀变了或上下文变长,比看总量更有诊断价值。
15
+ - **账本按天再切一层小时桶**:`usage.days[date].hours` 记录最近两天各小时的用量
16
+ (两天后自动清掉,只保留按天数据),`/api/codearts/status` 的 `usage` 因此多了
17
+ `recentDays`(7 格、缺日补 0)与 `todayByHour`(固定 24 格、未来钟点补 0)。
18
+ 逐小时口径是从本次改动起才开始记的,之前的钟点不回填,所以当天还没有数据时
19
+ 画「今天还没有逐小时数据(启用前的小时不回填)」而不是一排空柱子。
20
+ - **兼容旧宿主**:客户端对 `recentDays` / `todayByHour` 缺失的情况整体跳过这两块图,
21
+ 旧后端不会让用量页报错。
22
+
23
+ ### 变更
24
+
25
+ - **侧边栏图标的 glyph 从铅笔换成 `</>`**:原先画的是一支笔,和宿主自带的「编辑」
26
+ 图标(`IconEditOutline`)几乎同形,挂在图标列里容易被读成「编辑这一页」而不是
27
+ 「CodeArts 入口」。改成一对尖括号夹一道斜杠 —— 代码编辑器里最通用的「写代码」
28
+ 符号,笔画粗细对齐宿主图标集的 1px,主题色仍走 `currentColor`,深浅色都不出错。
29
+ 图标本身没有配置项,跟着插件走。
30
+
31
+ ### 修复
32
+
33
+ - **进入插件页不再先闪一下「未登录」**:卡片原来只按 `status === null` 决定画什么,
34
+ 而 `null` 既可能是「还没读到」也可能是「读失败」,两种情况都被画成了未登录的登录框,
35
+ 等 `/status` 回来才翻成正常。现在单独记三态(`loading` / `ready` / `failed`):
36
+ 加载期间标题栏写「加载中…」、正文放两条呼吸骨架,只有服务端**明确**回
37
+ `signed-out`(或 `expired`)才显示登录框。
38
+ - **拉取失败不再被当成登出**:以前 `GET /api/codearts/status` 一失败(宿主还没起、
39
+ 路由 404、网络抖动)就直接 `setStatus({status:'signed-out'})`。现在失败只置
40
+ `failed`:标题栏「状态读取失败」,正文给错误原因 + 重试按钮;已经读到过数据的话
41
+ 保持原样,不被一次抖动清空。
42
+ - **再进这一页先用上次的快照**:`/status` 冷的时候要去上游拉积分,近一秒才回来;
43
+ 模块级留一份上次的状态,重新进设置页 / 侧边栏页时按旧值立刻画出来,后台再刷新。
44
+ 骨架只在「这个进程里第一次读」时出现。
45
+
46
+ ## [1.2.5] - 2026-11-05
47
+
48
+ ### 新增
49
+
50
+ - **设置卡片可以整页打开,并带一个可选的侧边栏图标**:DSH 的侧边栏图标列
51
+ (宿主槽位 `sidebar.panellist`)与中间列面板(`main`)配对使用 —— 同一个 id / key
52
+ 才算「点了哪一行就画哪一页」。这一页就是设置里那张卡片,外面套一层「返回对话 +
53
+ 标题 + 说明」,账号 / 模型 / 用量 / 显示四个页签一应俱全,不必每次都绕进设置。
54
+ **默认关闭**,在卡片「显示」页最后一个勾选框里打开:图标列是全宿主共用的资源,
55
+ 每个插件都默认占一格很快就会挤满,所以这一格交给用户自己决定。
56
+ - **`showSidebarPanel` 配置项与 `/api/codearts/dock` 的第三个键**:状态接口从
57
+ `{ credits, queue }` 扩成 `{ credits, queue, sidebar }`,POST 同样接受 `sidebar`。
58
+ 语义和另外两个相反 —— 那两个「缺省即显示」(老配置行为不变),这个是「缺省即关闭」
59
+ (没写过就是不要)。旧后端不返回 `sidebar` 时客户端按关闭处理,不报错。
60
+
61
+ ### 变更
62
+
63
+ - **侧边栏入口的开关落在「注册 / 不注册」上,不是「渲染 null」**:宿主是按槽位的
64
+ 注册条目本身去画导航行的,组件返回 null 只会留下一个空白但可点的按钮。所以客户端
65
+ 改成一个 sync 控制器:先拆掉旧注册,再看开关决定建不建,同一个 id / key 不会注册
66
+ 两份。关掉时如果用户正站在那一页上,先 `selectPanel(null)` 回对话,中间列不会停在
67
+ 一个已经没了的 key 上。`layout` 服务软取(`ctx.get` 缺服务返回 undefined 而不抛),
68
+ 没有它只是少一个返回按钮,不影响整块客户端加载。
69
+
70
+ ### 修复
71
+
72
+ - **槽位注册的异常不再冒成首屏渲染错误横幅**:`ctx.slots.inject` 的回调是延后执行的
73
+ (槽位被宿主声明后才跑),在那里抛出的错会从 renderer 的 `changed()` 里以微任务
74
+ 冒出来,外层的 try/catch 抓不到。现在每个 inject 回调内部各自 try/catch,注册失败
75
+ 返回空 disposer,只留一条 console 记录 —— 老宿主 / 非桌面端没有这两个槽位时,
76
+ 卡片其余部分照常可用。
77
+
6
78
  ## [1.2.4] - 2026-11-03
7
79
 
8
80
  ### 变更
package/README.en.md CHANGED
@@ -26,7 +26,16 @@ Brings Huawei Cloud CodeArts into DeepSeek Harness (DSH), so the models CodeArts
26
26
  token counts (per model, per account), plus each account’s **session-slot occupancy** —
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
+ - **Usage trends**: two charts on top of the Usage tab — a bar per day for the last seven
30
+ days showing the **cache-hit rate** (three colour bands; a dip means the system-prompt
31
+ prefix changed or the context grew), plus today’s token volume bucketed by hour. Hourly
32
+ buckets start with this version and are not backfilled; hosts that do not return the two
33
+ series simply skip the charts.
29
34
  - **Image input**: models with vision support accept pasted or dropped images in a chat.
35
+ - **Sidebar icon**: optional. Tick it on the card’s Display tab and a CodeArts icon joins
36
+ the DSH icon column, opening the full-page version of the settings card in the middle
37
+ column (config `showSidebarPanel`; off by default, since that column is shared by the
38
+ whole host).
30
39
  - **Fallback path**: you can also paste a bare security token in the card, for scripts or
31
40
  troubleshooting.
32
41
  - **CLI**: `status` / `models` / `usage` / `identity` / `doctor` / `logout` for checking
package/README.md CHANGED
@@ -13,7 +13,9 @@
13
13
  - **可选模型**:可在设置卡片里勾选要出现在模型选择器中的模型(配置项 `enabledModels`)。未勾选的模型只是不再被推荐,已经选定它的会话仍可继续使用;不勾选等同于提供全部模型。
14
14
  - **模型清单自动发现**:启动后与每小时各拉一次账号真实可用的模型(内置 / 限时福利 / agent-center 三路合并),失败时退回内置种子清单。
15
15
  - **本机用量**:卡片与 `dsh-codearts usage` 展示今日/累计的请求数与输入输出 token(按模型、按账号),以及每个账号的**会话槽位占用**(占用时正好解释了「为什么刚才要等半分钟」)。CodeArts 没有额度接口,这里只统计本机经插件发出的请求,官方额度明细见卡片上的链接。
16
+ - **用量走势**:用量页顶部两张图 —— 近 7 天的**缓存命中率**按天一根柱子(分三档配色,掉了就说明系统提示词前缀变了或上下文变长),以及今天按小时的 token 量柱。逐小时口径从本版起才开始记,之前的钟点不回填;旧宿主不返回这两个序列时整块跳过,不会报错。
16
17
  - **图片输入**:支持视觉的模型可直接在对话里粘贴或拖入图片。
18
+ - **侧边栏图标**:可选。在卡片「显示」页勾一下,DSH 左侧图标列里会多一个 CodeArts,点开直接在中间列显示整页版的设置卡片(配置项 `showSidebarPanel`,默认关闭 —— 那一列是全宿主共用的)。
17
19
  - **降级路径**:也可以在卡片里直接粘贴安全令牌,适用于脚本或排查场景。
18
20
  - **命令行**:`status` / `models` / `usage` / `identity` / `doctor` / `logout` 六个子命令,便于在无图形界面时检查登录状态、发现模型与查用量。
19
21
 
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-DGIuT79_.mjs";
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-4B0o-CQN.mjs";
3
3
  import { existsSync, statSync } from "node:fs";
4
4
  //#region src/version.ts
5
- const CODEARTS_VERSION = "1.2.4";
5
+ const CODEARTS_VERSION = "1.2.6";
6
6
  //#endregion
7
7
  //#region src/bin.ts
8
8
  /**
@@ -12,6 +12,14 @@ interface CodeArtsSettingsKey {
12
12
  statusExpired: string;
13
13
  descSignedIn: string;
14
14
  descSignedOut: string;
15
+ /** 首次读取状态期间不能说「未登录」,用一个中立词。 */
16
+ statusLoading: string;
17
+ /** 状态接口整个失败(服务没起 / 路由 404)时的标题栏文案。 */
18
+ statusUnavailable: string;
19
+ descLoading: string;
20
+ /** {message} 是底层错误(HTTP 500 / Failed to fetch 之类)。 */
21
+ loadFailed: string;
22
+ retry: string;
15
23
  storedMeta: string;
16
24
  storedMetaNoLabel: string;
17
25
  refresh: string;
@@ -75,6 +83,12 @@ interface CodeArtsSettingsKey {
75
83
  usageTipHit: string;
76
84
  usageStatHit: string;
77
85
  usageStatRequests: string;
86
+ /** 趋势两张图的标题与悬停提示(近 7 天命中率 / 今天逐小时)。 */
87
+ usageTrendWeek: string;
88
+ usageTrendHour: string;
89
+ usageTrendHint: string;
90
+ /** 逐小时是本次新增口径,启用前的小时不回填。 */
91
+ usageTrendHourEmpty: string;
78
92
  usageRequests: string;
79
93
  usageByAccount: string;
80
94
  usageRequestCount: string;
@@ -124,6 +138,9 @@ interface CodeArtsSettingsKey {
124
138
  displayQueueToggle: string;
125
139
  displayNotWritable: string;
126
140
  displayFailed: string;
141
+ displaySidebarTitle: string;
142
+ displaySidebarHint: string;
143
+ displaySidebarToggle: string;
127
144
  queueDock: string;
128
145
  queueDockTitle: string;
129
146
  claimButton: string;
@@ -135,6 +152,8 @@ interface CodeArtsSettingsKey {
135
152
  claimAlready: string;
136
153
  claimUnavailable: string;
137
154
  claimFailed: string;
155
+ panelBack: string;
156
+ panelDesc: string;
138
157
  [key: string]: string;
139
158
  }
140
159
  //#endregion
@@ -157,6 +176,27 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
157
176
  children?: never;
158
177
  };
159
178
  };
179
+ /**
180
+ * 侧边栏那排图标(宿主 ui-sidebar 声明)。每个 list id 对应 main 面板里
181
+ * 同名的 key —— 宿主自己画按钮,只找我们要两样东西:一个显示用的
182
+ * label,和一个 glyph 组件(组件本身就是图标,宿主给 size / active)。
183
+ */
184
+ 'sidebar.panellist': {
185
+ kind: 'list';
186
+ scope: 'root';
187
+ owner: {
188
+ size: number;
189
+ active: boolean;
190
+ };
191
+ };
192
+ /** 中间列的面板(宿主 ui-layout 声明)。key 'conversation' 是保留给对话的。 */
193
+ 'main': {
194
+ kind: 'keyed';
195
+ scope: 'root';
196
+ owner: {
197
+ children?: never;
198
+ };
199
+ };
160
200
  }
161
201
  }
162
202
  declare const name = "dsh-codearts-client";