dsh-link-pulse 0.1.4 → 0.1.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 +10 -0
- package/README.md +17 -4
- package/package.json +1 -1
- package/src/client.js +33 -32
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.1.6] - 2026-08-25
|
|
4
|
+
|
|
5
|
+
### Docs
|
|
6
|
+
- 补充 README 中的 Keep-Alive 纯 1-RTT 测速原理与冷握手 vs 热长连接对比说明表。
|
|
7
|
+
|
|
8
|
+
## [0.1.5] - 2026-08-25
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- 侧边栏常驻条目排版样式优化:将延迟数值(如 `126ms`)改为与 OpenCode / CPA 规范统一的紧凑分段格式(`● CPA · Gemini 3.7 · 126ms`),去除两端强行两极分散的 `space-between`,实现视觉规格 100% 像素级对齐。
|
|
12
|
+
|
|
3
13
|
## [0.1.4] - 2026-08-25
|
|
4
14
|
|
|
5
15
|
### Changed
|
package/README.md
CHANGED
|
@@ -7,11 +7,24 @@
|
|
|
7
7
|
|
|
8
8
|
## 核心特性
|
|
9
9
|
|
|
10
|
+
- **Keep-Alive 纯 1-RTT 真实测速**:在底层 TLS 加密管道就绪后测量纯 HTTP 数据往返耗时,真实反映长连接日常对话下的网络脉搏。
|
|
10
11
|
- **100% 动态 Provider 发现**:自动从 `~/.dsh/settings.yaml` 读取已配置的所有模型网关(CPA、OpenCode GO、DeepSeek 官方直连等),绝不硬编码。
|
|
11
|
-
- **当前对话模型感知**:侧边栏常驻条目根据当前聊天选中的模型,动态显示对应供应商名称与实时延迟(如 `● CPA · Gemini 3.7
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
12
|
+
- **当前对话模型感知**:侧边栏常驻条目根据当前聊天选中的模型,动态显示对应供应商名称与实时延迟(如 `● CPA · Gemini 3.7 · 126ms`)。
|
|
13
|
+
- **原生样式像素级对齐**:紧凑点号分段排版,状态圆点尺寸(`7px`)、呼吸光环与色彩变量严格对齐 `dsh-cpa-status` 与 `dsh-opencode-status`。
|
|
14
|
+
- **悬停快速预览与去重对比**:鼠标悬停 220ms 弹出微型预览卡片;全屏看板与小卡片均在顶部重点呈现当前主力通道,下方列表聚焦对比「其它可用 Provider」测速。
|
|
15
|
+
- **零 Token 消耗**:轻量级网络心跳探针,绝不消耗任何 API 配额。
|
|
16
|
+
|
|
17
|
+
## 延迟测量原理(Keep-Alive 纯 1-RTT 测速)
|
|
18
|
+
|
|
19
|
+
在 AI 流式交互与对话场景中,客户端与上游网关之间常驻 **HTTP/2 长连接(Keep-Alive 复用)**。
|
|
20
|
+
|
|
21
|
+
| 测量维度 | 传统冷握手测速 (Cold Handshake) | LinkPulse Keep-Alive 纯 RTT 探针 (Warm) |
|
|
22
|
+
| :--- | :--- | :--- |
|
|
23
|
+
| **涵盖流程** | TCP 握手 + TLS 1.3 握手 + 数据传输 (累加 3~4 次往返) | **仅测量已就绪加密通道上的数据往返 (1 次 RTT)** |
|
|
24
|
+
| **跨国节点耗时** | 约 $400\sim 550\text{ ms}$ (受多次物理往返累加影响) | **约 $120\sim 140\text{ ms}$ (直达物理光速极限)** |
|
|
25
|
+
| **实际映射意义** | 仅代表首次冷启动建连耗时 | **精准反映每次发送 Prompt 到接收流式 Token 首包的真实物理网络时延** |
|
|
26
|
+
|
|
27
|
+
探针在建立底层 TLS 安全通道后,直接发送轻量 `HEAD` 探针并测算首字节往返时间,避免了将冷建连多次握手耗时误判为网络卡顿。
|
|
15
28
|
|
|
16
29
|
## 安装与更新
|
|
17
30
|
|
package/package.json
CHANGED
package/src/client.js
CHANGED
|
@@ -201,6 +201,12 @@ window.__ModuleLoader__.load({
|
|
|
201
201
|
|
|
202
202
|
const otherProviders = (data?.providers || []).filter((p) => p.id !== activeProviderInfo?.id)
|
|
203
203
|
|
|
204
|
+
const segments = [
|
|
205
|
+
{ text: providerDisplayName, color: T.label, bold: true },
|
|
206
|
+
{ text: modelShortName, color: T.secondary },
|
|
207
|
+
{ text: currentLatency > 0 ? `${currentLatency}ms` : '探测中', color: statusColor, bold: true },
|
|
208
|
+
]
|
|
209
|
+
|
|
204
210
|
const node = h(
|
|
205
211
|
'button',
|
|
206
212
|
{
|
|
@@ -222,44 +228,39 @@ window.__ModuleLoader__.load({
|
|
|
222
228
|
}),
|
|
223
229
|
wide &&
|
|
224
230
|
h(
|
|
225
|
-
'
|
|
231
|
+
'span',
|
|
226
232
|
{
|
|
227
233
|
style: {
|
|
228
|
-
display: 'flex',
|
|
234
|
+
display: 'inline-flex',
|
|
229
235
|
alignItems: 'center',
|
|
230
|
-
|
|
231
|
-
flex: 1,
|
|
232
|
-
overflow: 'hidden',
|
|
236
|
+
lineHeight: '18px',
|
|
233
237
|
whiteSpace: 'nowrap',
|
|
238
|
+
minWidth: 0,
|
|
239
|
+
overflow: 'hidden',
|
|
240
|
+
textOverflow: 'ellipsis',
|
|
234
241
|
},
|
|
235
242
|
},
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
color: statusColor,
|
|
258
|
-
marginLeft: 6,
|
|
259
|
-
flexShrink: 0,
|
|
260
|
-
},
|
|
261
|
-
},
|
|
262
|
-
currentLatency > 0 ? `${currentLatency}ms` : '探测中',
|
|
243
|
+
segments.flatMap((s, i) =>
|
|
244
|
+
i === 0
|
|
245
|
+
? [h('span', { key: `s${i}`, style: { color: s.color, fontWeight: 500, flexShrink: 0 } }, s.text)]
|
|
246
|
+
: [
|
|
247
|
+
h('span', { key: `sep${i}`, style: { color: T.secondary, margin: '0 5px', opacity: 0.7, flexShrink: 0 } }, '·'),
|
|
248
|
+
h(
|
|
249
|
+
'span',
|
|
250
|
+
{
|
|
251
|
+
key: `s${i}`,
|
|
252
|
+
style: {
|
|
253
|
+
color: s.color,
|
|
254
|
+
fontWeight: s.bold ? 500 : undefined,
|
|
255
|
+
fontVariantNumeric: 'tabular-nums',
|
|
256
|
+
overflow: 'hidden',
|
|
257
|
+
textOverflow: 'ellipsis',
|
|
258
|
+
flexShrink: i === segments.length - 1 ? 0 : 1,
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
s.text,
|
|
262
|
+
),
|
|
263
|
+
],
|
|
263
264
|
),
|
|
264
265
|
),
|
|
265
266
|
)
|