@eddyskywalker/dsh-chatgpt-subscription 0.49.0 → 0.50.0
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 +21 -0
- package/README.md +2 -1
- package/lib/client.js +45 -43
- package/lib/client.js.map +1 -1
- package/lib/index.js +1424 -211
- package/lib/types/client/subagent/SubagentCard.d.ts.map +1 -1
- package/lib/types/client/subagent/styles.d.ts +1 -1
- package/lib/types/client/subagent/styles.d.ts.map +1 -1
- package/lib/types/compat.d.ts +1 -1
- package/lib/types/host/cache-warmup/install.d.ts.map +1 -1
- package/lib/types/host/cache-warmup/projection.d.ts.map +1 -1
- package/lib/types/host/kimi-code/adapter.d.ts +15 -0
- package/lib/types/host/kimi-code/adapter.d.ts.map +1 -1
- package/lib/types/host/kimi-code/cache-wait.d.ts +125 -0
- package/lib/types/host/kimi-code/cache-wait.d.ts.map +1 -0
- package/lib/types/host/kimi-code/mapper.d.ts +71 -4
- package/lib/types/host/kimi-code/mapper.d.ts.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/presets/dispatch/agent.cordis.yml +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.50.0 - 2026-11-01
|
|
6
|
+
|
|
7
|
+
- **[subagent] 优化子代理卡片的布局、间距与状态呈现**
|
|
8
|
+
- 调整 `SubagentCard` 的结构和样式,使子代理运行状态与结果信息在有限空间内更易读取。
|
|
9
|
+
|
|
10
|
+
- **[kimi-code] 扩展缓存投影、标题请求隔离与冷启动单飞**
|
|
11
|
+
- 扩大可结构化提取的工具结果投影覆盖,支持复合 JSON 信封、spill 全文恢复和带引用的精确补读,减少大结果反复进入上下文。
|
|
12
|
+
- 标题请求不再发送主会话 cache key,也不写入主会话用量、活动时间、漂移归因或 warmup 状态。
|
|
13
|
+
- 新增按 region/model/system/tools 分组的冷启动单飞:leader 到响应头即释放 follower,2xx 才记 warm;跟随请求有界等待,失败立即放行。
|
|
14
|
+
|
|
15
|
+
- **[kimi-code] 修复缓存投影与并发恢复边界**
|
|
16
|
+
- 复合信封中的源码、契约和混合证据恢复逐字保留;spill 解析支持图片省略段和未知字节数。
|
|
17
|
+
- 工具结果包含标题提示词时不再误判为标题请求;标题请求也不会清除主会话的图片 offload 归因。
|
|
18
|
+
- 悬挂 leader 超过等待预算后允许重选,旧 leader 的身份守卫避免误删新槽位。
|
|
19
|
+
|
|
20
|
+
- **[kimi-code] 新增主代理缓存等待策略:工作优先、空闲计时、自然续热、冷恢复兜底**
|
|
21
|
+
- 新增宿主侧 `KimiCacheWaitController`,通过持久会话事件识别主代理回合与子代理目录,仅在主代理 idle 且仍有未完成任务时启动等待;从主代理最后一次成功模型活动计算约 25 分钟缓存窗口,不把工具运行或子代理启动时间误当作续热。
|
|
22
|
+
- 自然阶段报告和完成通知沿用现有宿主消息通道,由正常主代理模型回合完成续热;没有检查点时不催促、不打断子代理,也不要求周期报告。主代理可继续审查结果或推进不重叠的并行模块。
|
|
23
|
+
- 默认不发送主动保活请求。大上下文部署可通过 `DSH_KIMI_CODE_CACHE_WAIT_WARMUP=1` 选择启用每个委托批次最多一次轻量预热;预热消息经 `createUserMessage` 构建,失败不重试,缓存已过期时直接走普通冷恢复。
|
|
24
|
+
- `test/kimi-code-cache-wait.test.ts` 以假时钟覆盖工作/等待转换、活动时间重置、默认冷路径、单次预热、重复目录事件、完成取消、失败降级和 DSH 持久消息边界。
|
|
25
|
+
|
|
5
26
|
## 0.49.0 - 2026-10-31
|
|
6
27
|
|
|
7
28
|
- **[kimi-code] 图片预算对齐原生 `kimi-cli`(20 MiB 高水位 / 10 MiB 低水位)并实现会话级粘性淘汰(Closes #79)**
|
package/README.md
CHANGED
|
@@ -149,7 +149,8 @@
|
|
|
149
149
|
- 真正决定命中率的是**内容稳定性**:同一会话内 `system` 或工具列表一旦变化会使整个前缀缓存失效(实测归零)。因此应保持工具集合稳定、把新增内容追加在末尾;
|
|
150
150
|
- 卡片会显示滚动命中率,方便验证效果;
|
|
151
151
|
- **本线路不发送任何缓存时长字段**,缓存写入与存活完全由服务端决定。这不是省略,而是唯一有依据的选择:5m / 1h 两档只写在 **Moonshot 开放平台**文档里,Kimi Code 订阅端点没有任何缓存 TTL 的文档,官方 CLI 2.0.0 的代码路径里也不存在 `prompt_cache_options`(只有 `prompt_cache_key`);[MoonshotAI/kimi-code#3942](https://github.com/MoonshotAI/kimi-code/issues/3942) 专门请求暴露该档位并附带问了一句「如果 coding 端点不认这个字段,请明确写出来」,至今 open、零回应。此前设置页提供的 5m / 1h 选择因此已**撤除**;
|
|
152
|
-
- **缓存过期提示按
|
|
152
|
+
- **缓存过期提示按 25 分钟判定**(`cache-hint.ts` 的 `CACHE_TTL_MS`)。此前该阈值取的是 `5m` 档位的**名字**(5 分钟),在实测能热 25 分钟的端点上,从第 6 分钟起就开始误报、误报窗口长达 19 分钟 —— 恰好违反本模块自己写下的「宁漏报不误报,误报会训练用户忽略提示」。现在取全部副本仍保持命中的最后一个实测年龄,尽早提示而不声称服务端保证该 TTL;
|
|
153
|
+
- **主代理缓存等待策略与子代理工作解耦**:主代理有独立工作或并行模块可推进时正常工作,只有回合结束且仍有未完成的子代理时才进入 `IDLE_WAIT`,并从主代理最后一次成功模型活动起计算等待(而不是从子代理启动起算)。自然报告和完成通知通过正常主代理回合续热;没有现成检查点时不催促、不打断子代理,默认接受之后的一次冷恢复。连续约 20 分钟没有模型活动后,大上下文部署可用 `DSH_KIMI_CODE_CACHE_WAIT_WARMUP=1` 显式允许**每个委托批次最多一次**轻量预热;小上下文、非 Kimi 会话、预热失败和 TTL 已过期都不尝试,避免形成周期性保活。子代理结果始终经宿主消息通道返回,不依赖主代理缓存是否有效;
|
|
153
154
|
- 设置卡的缓存区块把**写入**单独列成一行(总量 + 5 分钟档 + 1 小时档):写入是独立计费项,折进「新处理 tokens」会让命中率说错话;某个分档是 0 时照实显示 0——响应头缺失只表示服务端没回报该档,不等于那里确实没写。注意这两个分档响应头同样只有开放平台文档背书,订阅端点尚无实测样本,恒为 0 时不要读成「确实没写入」;
|
|
154
155
|
- **视频输入可用**(`k3`、`kimi-for-coding`、`k3.1-pro`):
|
|
155
156
|
- DSH 的模态词表只有 `text`/`image`,但它是可合并扩展的接口,本插件用 TypeScript 模块增强把它扩到 `video`(**未改动 DSH 任何代码**),因此视频走 DSH 真实的能力通道,而不是只能显示在提示里;
|
package/lib/client.js
CHANGED
|
@@ -57420,26 +57420,10 @@ window.__ModuleLoader__.load({
|
|
|
57420
57420
|
className: "dsh-subagent-selection",
|
|
57421
57421
|
"data-dsh-part": "subagent-target",
|
|
57422
57422
|
children: [
|
|
57423
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("
|
|
57423
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("fieldset", {
|
|
57424
57424
|
className: "dsh-subagent-target-bar",
|
|
57425
57425
|
children: [
|
|
57426
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
57427
|
-
className: "dsh-subagent-target-header",
|
|
57428
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
57429
|
-
className: "dsh-subagent-target-label",
|
|
57430
|
-
htmlFor: mainModelId,
|
|
57431
|
-
children: t("subagentMainModelLabel")
|
|
57432
|
-
}), activeModelKey !== "default" && state.activeTargetOverridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
57433
|
-
type: "button",
|
|
57434
|
-
className: "dsh-subagent-reset",
|
|
57435
|
-
"data-dsh-part": "subagent-reset-to-global",
|
|
57436
|
-
disabled,
|
|
57437
|
-
onClick: () => {
|
|
57438
|
-
props.resetActiveTarget();
|
|
57439
|
-
},
|
|
57440
|
-
children: t("subagentResetToGlobal")
|
|
57441
|
-
}) : null]
|
|
57442
|
-
}),
|
|
57426
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("legend", { children: t("subagentMainModelLabel") }),
|
|
57443
57427
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
57444
57428
|
id: mainModelId,
|
|
57445
57429
|
className: "dsh-subagent-select",
|
|
@@ -57497,10 +57481,10 @@ window.__ModuleLoader__.load({
|
|
|
57497
57481
|
children: mainModelName(key) + " (" + String(state.overridesByMainModel[key]?.length ?? 0) + ")"
|
|
57498
57482
|
}, key))]
|
|
57499
57483
|
}),
|
|
57500
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
57484
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
57501
57485
|
className: "dsh-subagent-status",
|
|
57502
57486
|
"data-dsh-part": "subagent-target-status",
|
|
57503
|
-
children: activeModelKey === "default" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
57487
|
+
children: [activeModelKey === "default" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
57504
57488
|
className: "dsh-subagent-hint",
|
|
57505
57489
|
children: t("subagentTargetGlobalHint")
|
|
57506
57490
|
}) : state.activeTargetOverridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
@@ -57509,7 +57493,16 @@ window.__ModuleLoader__.load({
|
|
|
57509
57493
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
57510
57494
|
className: "dsh-subagent-hint",
|
|
57511
57495
|
children: t("subagentTargetFollowGlobalStatus")
|
|
57512
|
-
})
|
|
57496
|
+
}), activeModelKey !== "default" && state.activeTargetOverridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
57497
|
+
type: "button",
|
|
57498
|
+
className: "dsh-subagent-reset",
|
|
57499
|
+
"data-dsh-part": "subagent-reset-to-global",
|
|
57500
|
+
disabled,
|
|
57501
|
+
onClick: () => {
|
|
57502
|
+
props.resetActiveTarget();
|
|
57503
|
+
},
|
|
57504
|
+
children: t("subagentResetToGlobal")
|
|
57505
|
+
}) : null]
|
|
57513
57506
|
})
|
|
57514
57507
|
]
|
|
57515
57508
|
}),
|
|
@@ -58177,26 +58170,19 @@ window.__ModuleLoader__.load({
|
|
|
58177
58170
|
|
|
58178
58171
|
.dsh-subagent-target-bar {
|
|
58179
58172
|
display: grid;
|
|
58173
|
+
align-content: start;
|
|
58180
58174
|
gap: 8px;
|
|
58181
|
-
|
|
58175
|
+
min-width: 0;
|
|
58176
|
+
margin: 0;
|
|
58177
|
+
padding: 10px;
|
|
58182
58178
|
border: 0.5px solid var(--dsw-alias-border-l4);
|
|
58183
58179
|
border-radius: var(--dsw-radius-lg, 10px);
|
|
58184
|
-
background:
|
|
58185
|
-
min-width: 0;
|
|
58186
|
-
}
|
|
58187
|
-
|
|
58188
|
-
.dsh-subagent-target-header {
|
|
58189
|
-
display: flex;
|
|
58190
|
-
align-items: center;
|
|
58191
|
-
justify-content: space-between;
|
|
58192
|
-
gap: 8px;
|
|
58193
|
-
min-width: 0;
|
|
58180
|
+
background: transparent;
|
|
58194
58181
|
}
|
|
58195
58182
|
|
|
58196
|
-
.dsh-subagent-target-
|
|
58183
|
+
.dsh-subagent-target-bar > legend {
|
|
58184
|
+
padding: 0 4px;
|
|
58197
58185
|
font-size: 12px;
|
|
58198
|
-
font-weight: 500;
|
|
58199
|
-
line-height: 1.5;
|
|
58200
58186
|
color: var(--dsw-alias-label-secondary);
|
|
58201
58187
|
}
|
|
58202
58188
|
|
|
@@ -58204,9 +58190,9 @@ window.__ModuleLoader__.load({
|
|
|
58204
58190
|
height: 34px;
|
|
58205
58191
|
width: 100%;
|
|
58206
58192
|
padding: 0 10px;
|
|
58207
|
-
border: 0.5px solid var(--dsw-alias-border-
|
|
58193
|
+
border: 0.5px solid var(--dsw-alias-border-l3);
|
|
58208
58194
|
border-radius: var(--dsw-radius-md, 8px);
|
|
58209
|
-
background: var(--dsw-alias-bg-layer-
|
|
58195
|
+
background: var(--dsw-alias-bg-layer-1, transparent);
|
|
58210
58196
|
color: var(--dsw-alias-label-primary);
|
|
58211
58197
|
font: inherit;
|
|
58212
58198
|
font-size: 13px;
|
|
@@ -58215,9 +58201,16 @@ window.__ModuleLoader__.load({
|
|
|
58215
58201
|
cursor: pointer;
|
|
58216
58202
|
}
|
|
58217
58203
|
|
|
58204
|
+
@media (hover: hover) {
|
|
58205
|
+
.dsh-subagent-select:hover:not(:disabled) {
|
|
58206
|
+
border-color: var(--dsw-alias-border-l4);
|
|
58207
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
58208
|
+
}
|
|
58209
|
+
}
|
|
58210
|
+
|
|
58218
58211
|
.dsh-subagent-select option,
|
|
58219
58212
|
.dsh-subagent-select optgroup {
|
|
58220
|
-
background: var(--dsw-alias-bg-layer-
|
|
58213
|
+
background: var(--dsw-alias-bg-layer-2, #1e1e1e);
|
|
58221
58214
|
color: var(--dsw-alias-label-primary, #e5e5e5);
|
|
58222
58215
|
}
|
|
58223
58216
|
|
|
@@ -58243,7 +58236,7 @@ window.__ModuleLoader__.load({
|
|
|
58243
58236
|
padding: 3px 10px;
|
|
58244
58237
|
border: 0.5px solid var(--dsw-alias-border-l3);
|
|
58245
58238
|
border-radius: 999px;
|
|
58246
|
-
background:
|
|
58239
|
+
background: transparent;
|
|
58247
58240
|
color: var(--dsw-alias-label-secondary);
|
|
58248
58241
|
font: inherit;
|
|
58249
58242
|
font-size: 12px;
|
|
@@ -58251,6 +58244,13 @@ window.__ModuleLoader__.load({
|
|
|
58251
58244
|
cursor: pointer;
|
|
58252
58245
|
}
|
|
58253
58246
|
|
|
58247
|
+
@media (hover: hover) {
|
|
58248
|
+
.dsh-subagent-chip:hover:not(:disabled):not([aria-pressed='true']) {
|
|
58249
|
+
background: var(--dsw-alias-bg-layer-4);
|
|
58250
|
+
color: var(--dsw-alias-label-primary);
|
|
58251
|
+
}
|
|
58252
|
+
}
|
|
58253
|
+
|
|
58254
58254
|
.dsh-subagent-chip[aria-pressed='true'] {
|
|
58255
58255
|
border-color: var(--dsw-alias-brand-primary, #e06c3b);
|
|
58256
58256
|
background: color-mix(in srgb, var(--dsw-alias-brand-primary, #e06c3b) 15%, transparent);
|
|
@@ -58270,13 +58270,15 @@ window.__ModuleLoader__.load({
|
|
|
58270
58270
|
justify-content: space-between;
|
|
58271
58271
|
gap: 8px;
|
|
58272
58272
|
min-width: 0;
|
|
58273
|
+
padding-top: 6px;
|
|
58274
|
+
border-top: 0.5px solid var(--dsw-alias-border-l3);
|
|
58273
58275
|
}
|
|
58274
58276
|
|
|
58275
58277
|
.dsh-subagent-reset {
|
|
58276
|
-
padding:
|
|
58277
|
-
border: 0.5px solid var(--dsw-alias-border-
|
|
58278
|
-
border-radius: var(--dsw-radius-
|
|
58279
|
-
background:
|
|
58278
|
+
padding: 2px 8px;
|
|
58279
|
+
border: 0.5px solid var(--dsw-alias-border-l3);
|
|
58280
|
+
border-radius: var(--dsw-radius-sm, 6px);
|
|
58281
|
+
background: transparent;
|
|
58280
58282
|
color: var(--dsw-alias-label-secondary);
|
|
58281
58283
|
font: inherit;
|
|
58282
58284
|
font-size: 12px;
|