dsh-auto-collapse 0.1.3 → 0.1.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/lib/index.js CHANGED
@@ -1,8 +1,27 @@
1
- /**
2
- * dsh-auto-collapse — node half(构建产物,与 src/index.ts 对应)。
3
- *
4
- * 纯 UI 插件:空 apply 让插件出现在宿主插件树;浏览器端 bundle 由
5
- * dsh.client 声明 + exports["./client"] 提供。
6
- */
7
-
8
- export function apply() {}
1
+ import z from "@deepseek-ai/schemastery";
2
+ import { installSettingsSection, settingsNamespace } from "@deepseek-ai/dsh-settings";
3
+ const name = "dsh-auto-collapse";
4
+ const inject = [];
5
+ const DEFAULT_STATUS_TEXT = "Deep sleeping...";
6
+ const AUTO_COLLAPSE_SETTINGS_NAMESPACE = settingsNamespace("dsh-auto-collapse");
7
+ const AUTO_COLLAPSE_SETTINGS_SCHEMA = z.object({
8
+ statusText: z.string().default(DEFAULT_STATUS_TEXT)
9
+ });
10
+ function apply(ctx, config = {}) {
11
+ let current = () => ({ statusText: config.statusText ?? DEFAULT_STATUS_TEXT });
12
+ installSettingsSection(ctx, AUTO_COLLAPSE_SETTINGS_NAMESPACE, AUTO_COLLAPSE_SETTINGS_SCHEMA, {
13
+ statusText: config.statusText ?? DEFAULT_STATUS_TEXT
14
+ }, {
15
+ setSource: (source) => {
16
+ current = source;
17
+ },
18
+ onChange: () => {
19
+ void current;
20
+ }
21
+ });
22
+ }
23
+ export {
24
+ apply,
25
+ inject,
26
+ name
27
+ };
@@ -0,0 +1,13 @@
1
+ export declare const name = "dsh-auto-collapse";
2
+ /**
3
+ * 不声明必需服务:slots/settingsScope 只是可选增强能力,不能阻止核心折叠
4
+ * 插件启动。运行时通过 ctx.get() 读取,服务不存在时仅跳过设置卡片与配置订阅。
5
+ */
6
+ export declare const inject: string[];
7
+ /** 客户端根上下文的最小结构化类型(仅用 cordis 标准 effect,无运行时依赖)。 */
8
+ export interface FoldClientCtx {
9
+ effect(fn: () => unknown, label?: string): unknown;
10
+ /** Cordis 动态客户端上下文提供的可选服务查询。 */
11
+ get?<T>(name: string): T | undefined;
12
+ }
13
+ export declare function apply(ctx: FoldClientCtx): void;
@@ -0,0 +1,264 @@
1
+ /**
2
+ * FoldController —— dsh-auto-collapse 的核心。
3
+ *
4
+ * 把会话流([data-chat-flow])里的“非正文 display”折叠成内联的一行,
5
+ * 折叠行实时显示**当前正在进行的工作**(与 Codex 对齐):
6
+ *
7
+ * - 块里有运行中的工具调用 → 标题 = "Running" + 工具名(Bash/Read/
8
+ * Search…,读 data-tool),摘要 = 正在执行的命令/路径/查询(读工具
9
+ * 卡片的 summary 行);标题与摘要带平滑呼吸动画(Pulse)。
10
+ * - 块里正在思考(think running)→ 标题 = "Thinking",摘要 = 思考的
11
+ * 最新一行(读 [data-follow-end],官方 ReasoningRow 的实时摘要锚点)。
12
+ * - 全部完成 → 标题 = 类型总结(编辑了文件 / 运行了命令 / 已思考 /
13
+ * 上下文注入),摘要清空;出错 → 红色,中断 → 琥珀。
14
+ *
15
+ * 另外把官方 ChatView 尾部的运行状态行文字 "Deep diving..." 替换为
16
+ * 可配置的状态提示词(默认 "Deep sleeping...";流光特效在 CSS 上,
17
+ * 替换文本节点不影响)。React 重渲染会恢复原文,pass() 每轮自愈改回。
18
+ * 设置为空时不替换,等价于恢复官方 "Deep diving..."。
19
+ *
20
+ * 点击一行展开,再点收起;折叠态下若有行被选中(详情联动)自动展开。
21
+ *
22
+ * 折叠规则(沿用 dsh-web-archive 验证过的算法):每个回合合成一块——
23
+ * 某条消息的 Think 推理组与其后紧跟的工具组合并成一块(只有 think 或
24
+ * 只有工具组时各自成块),在块宿主**原位**插入 chip;带正文文本的消息
25
+ * 断开合并。结构保持 文本a - [折叠块] - 文本b - 文本c。
26
+ *
27
+ * 与 React 的关系:chip 插入 React 管理的 flow 子树内,但只做前置插入与
28
+ * style.display 切换(React 的 vdom diff 不会感知也不会清除 CSSOM 上的
29
+ * 手动样式);MutationObserver 每轮把结构变化合并到一次
30
+ * requestAnimationFrame 里重放(自愈:React 重渲染、切换会话、流式新
31
+ * 卡片都会自动跟上)。
32
+ *
33
+ * 零核心改动:不修改任何 slot 注册,不依赖任何 client 服务。
34
+ */
35
+ export declare class FoldController {
36
+ private observer;
37
+ /** 防止同一个控制器重复注册 observer、定时器和可见性监听。 */
38
+ private started;
39
+ /** body 尚未创建时等待 DOMContentLoaded,再补一次启动。 */
40
+ private waitingForBody;
41
+ private readonly onDomContentLoaded;
42
+ private raf;
43
+ private timer;
44
+ private disposed;
45
+ private lastPassError;
46
+ private flow;
47
+ /** 稳定 block key → 当前 React 渲染中的 chip/host。 */
48
+ private chips;
49
+ private currentBlocks;
50
+ private blockExpanded;
51
+ /** host → 三级合并思考行(展开二级后连续思考合并显示为一个三级行)。 */
52
+ private mergedThinks;
53
+ /** 合并思考行的展开状态(true = 显示合并内容块)。 */
54
+ private mergedExpanded;
55
+ /** 合并内容缓存(首次从原生行读取后保存,pass 重建内容块时不再重新展开原生行)。 */
56
+ private mergedBodyTexts;
57
+ /** 合并行标题缓存(原生行展开态提取不到摘要时保持首次标题,不丢成“思考”)。 */
58
+ private mergedTitles;
59
+ /** 稳定 segment key → 一级折叠行与展开状态。 */
60
+ private segmentStates;
61
+ /** segment 首次观察到 running 的时间,用于没有官方时长的实时回合。 */
62
+ private runningSince;
63
+ /** 曾完成过的 segment key:段恢复运行时据此重开本地计时,防止重新结算
64
+ * 的本地时长吞掉完成间隙。 */
65
+ private completedOnce;
66
+ /** 插件改写 display 前的精确原值;受控集合用于分类漂移和 stop() 恢复。 */
67
+ private originalDisplay;
68
+ private controlledDisplay;
69
+ /** 元素 → 插件最后确保的 display 值:恢复前与当前内联值比对,漂移即视为
70
+ * 外部介入(镜像 turnStatusTexts 的 original/written 双快照守卫,issue #11)。 */
71
+ private writtenDisplay;
72
+ /** 被改写为状态提示词的原生状态文本:original = 宿主原文(卸载还原用),
73
+ * written = 插件最后一次写入的值(仅当节点仍等于它时才还原,避免覆盖
74
+ * 宿主在插件写入之后的状态更新)。 */
75
+ private turnStatusTexts;
76
+ /** 当前状态提示词读取器;返回空串时插件不替换状态行。 */
77
+ private statusTextProvider;
78
+ /** 正文判定缓存(消息元素 → 有无正文):流式期间只有被 mutation 命中的
79
+ * 消息失效重算,历史消息跨 pass 复用,避免每帧全量 TreeWalker。 */
80
+ private bodyTextCache;
81
+ /** 自上次 pass 以来子树发生变化的 flow 顶层消息;pass 开头统一失效。 */
82
+ private dirtyMessages;
83
+ /** 在途显示动画(元素 → 记录):冲突仲裁、记账对齐与生命周期清理的依据。
84
+ * 用 Map 不用 WeakMap——switchFlow/stop 需要遍历全量 cancel。 */
85
+ private pendingAnims;
86
+ /** 手势点击的一次性可动画 block key;segment 级点击另保留中间正文的门控。 */
87
+ private animatableKeys;
88
+ /** segment 点击时只让点击前已存在的 block 播放 reveal;流式中新出现的
89
+ * 临时分裂块直接显示,避免分类收敛时留下半透明 stale chip。 */
90
+ private animatableSegmentBlocks;
91
+ /** 外部变更对账定时器句柄(自重排 setTimeout 链,见 armAuditLoop)。 */
92
+ private auditTimer;
93
+ /** 上一轮 pass 记录的关键元素内联 display,用于 audit 轻量检测漂移。
94
+ * audit 只读这份快照,不在页面稳定时重新执行完整 pass。 */
95
+ private auditDisplays;
96
+ /** 自上次 pass 以来 flow 子树发生过结构变化(childList)或正文判定翻转:
97
+ * 为 true 时 pass 重建分块快照,否则复用 currentBlocks——characterData/
98
+ * attributes 批次(流式文本、data-state 翻转)不改变块结构,跳过全量
99
+ * querySelectorAll 重扫(issue #14:长会话下每轮重扫造成主线程卡顿)。 */
100
+ private structureDirty;
101
+ /** 滚动稳定化(issue #14):flow 最近的滚动容器缓存(按 flow 身份失效)。 */
102
+ private scrollContainer;
103
+ private scrollContainerFlow;
104
+ /** 回到前台立即补一轮对账;后台 tab 由 document.hidden 门控跳过。 */
105
+ private readonly onVisibilityChange;
106
+ constructor(statusTextProvider?: () => string | undefined, options?: {
107
+ auditIntervalMs?: number;
108
+ });
109
+ private readonly auditIntervalMs;
110
+ /** 设置变更后重跑一轮,让状态提示词立即生效。 */
111
+ refresh(): void;
112
+ start(): void;
113
+ /** 外部显示变更对账循环(issue #11 Bug B):外部对宿主行的 style 写入不产生
114
+ * observer record(style 不在 attributeFilter 内,监听会因插件自身直写 style
115
+ * 自激),改用低频轻量对账兜底——发现漂移后才由 pass 收敛;
116
+ * 后台 tab 由 document.hidden 门控跳过,回前台由 visibilitychange 立即补一轮。
117
+ * 用自重排 setTimeout 链而非 setInterval:与 schedule 的兜底定时器同源,
118
+ * 测试桩 clearTimers 后链条自然熄灭。 */
119
+ private armAuditLoop;
120
+ private rearmAudit;
121
+ /** 低成本显示状态对账:只有发现外部漂移时才启动完整 pass。
122
+ *
123
+ * 外部 style.display 写入不会产生当前 observer 的 attribute 记录,
124
+ * 因此仍保留 audit;但稳定页面不应每秒重扫整个 flow。快照只覆盖
125
+ * flow 顶层行、插件控制中的宿主行和插件自有展示行,避免引入布局读取。 */
126
+ private audit;
127
+ stop(): void;
128
+ /** body 级 observer 只负责发现 flow 替换;已有 flow 外的文本变化不再触发全量扫描。 */
129
+ private shouldSchedule;
130
+ /** 判断 mutation 是否会影响宿主 flow;插件自有节点的回写直接忽略,
131
+ * 避免“pass 插入 chip → observer 再开一轮 pass”的自激循环。 */
132
+ private isRelevantMutation;
133
+ /** 记录本批 mutation 命中的 flow 顶层消息,供正文判定缓存定向失效。
134
+ * 从 record.target 沿 parentNode 走到 flow 的直接子级即所属消息。
135
+ * 失效粒度(issue #14):只有 childList 使分块快照失效;flow 直挂层的
136
+ * 插件节点/文本节点与 flow 外的混批记录不影响任何消息的正文判定,跳过
137
+ * 而非全量失效——旧逻辑把它们全部放大成 O(全会话) 的 TreeWalker 重扫,
138
+ * 长会话流式期间每帧如此。空批次仍保守全量失效(测试桩的调度通知)。 */
139
+ private markDirty;
140
+ private schedule;
141
+ /** 异步 observer 异常不能静默杀死协调器;保留非可视诊断并允许后续 mutation 重试。 */
142
+ private runPass;
143
+ private reportError;
144
+ /** 一轮重放:重算堆积 → 应用折叠/展开 → 摆放并更新 chip → 替换状态行。 */
145
+ private pass;
146
+ /** flow 最近的滚动容器(issue #14 滚动稳定化的测量基准):沿父链找第一个
147
+ * overflow-y 为 auto/scroll 且实际可滚动的祖先。结果按 flow 身份缓存;
148
+ * 找不到时不缓存(内容增长后祖先可能变为可滚动),每 pass 重探的代价
149
+ * 只是几次 clean-layout 的 computed style / scrollHeight 读取。 */
150
+ private findScrollContainer;
151
+ /** 几何写入前捕捉贴底意图(issue #14):视口距底 ≤ 上游 FOLLOW_THRESHOLD
152
+ * 时返回锚点,stabilizeScrollAfterFold 在写入后同帧钉回底部。远离底部
153
+ * (用户正在滚动浏览)时不干预——视口上方的高度变化由浏览器 scroll
154
+ * anchoring 补偿,视口下方的折叠不可见,插件再写 scrollTop 只会加入
155
+ * 上游吸底回写的拉锯。 */
156
+ private captureScrollAnchor;
157
+ /** 几何写入后把贴底视口钉回底部:折叠让 scrollHeight 缩小时若不在此帧
158
+ * 补写 scrollTop,宿主 ChatView 要到下一帧 ResizeObserver 才吸底回写,
159
+ * 中间的空档让触控板惯性滚动乘虚而入,反复折叠时表现为上下抽搐(用户
160
+ * 实测:长会话滚到底部附近无法稳定定位)。同一帧内钉回后,宿主的吸底
161
+ * 回写成为幂等 no-op,不再是第二个 scrollTop 写入方。 */
162
+ private stabilizeScrollAfterFold;
163
+ /** flow 元素变化即视为会话切换:完整恢复旧 flow,再从新 DOM 重建。 */
164
+ private switchFlow;
165
+ private createProcessedRow;
166
+ private syncProcessedRow;
167
+ private placeProcessedRow;
168
+ private reconcileBlock;
169
+ private ensureChip;
170
+ private suppressBlock;
171
+ private retainDisplayControl;
172
+ private cleanupStaleChips;
173
+ /** 连续思考合并行:插在第一个思考行前,标题用第一行思考内容;
174
+ * 点击切换显示/隐藏全部原始思考行。 */
175
+ private syncMergedThink;
176
+ /** 展开合并行:直接读各思考行文本合成内容块(不依赖原生行展开:
177
+ * 程序化 click 不触发 React 展开,且后台 tab 的 rAF 不执行)。
178
+ * 返回是否成功——思考行已不可读(parts 为空)时返回 false,调用方
179
+ * 据此保持收起态,避免展开状态与内容块脱节。 */
180
+ private expandMergedBody;
181
+ /** 创建/更新合并内容块(缓存优先,不重新展开原生行)。
182
+ * 返回内容块与其是否为本次新建(新建才走展开动画)。 */
183
+ private ensureMergedBody;
184
+ /** 清理合并 think 行(v12):状态 map 立即清除;DOM 在手势动画路径下
185
+ * 渐隐后移除(settle 回调),其余路径瞬删。渐隐中途被反向取消时元素
186
+ * 保留,由后续 pass 的 syncMergedThink 重建/复用。
187
+ * settle 透传给每个渐隐目标的移除回调之后(chip 间距钉住的结算探测点,
188
+ * AI 评审 P0:merged 行渐隐不走 block.rows,必须纳入同一钉住体系)。 */
189
+ private releaseMergedThink;
190
+ /** merged-body 展开高度动画(机制样板:插件全资 DOM)。
191
+ * 关键帧含 marginBottom 0→16px——其 CSS 有常量 margin-bottom:16px,
192
+ * 高度从 0 起步时这 16px 会先占位产生小跳变。fill:'forwards' 托住终态,
193
+ * onfinish 清内联后 cancel 释放,无闪烁窗口。收起由 collapseMergedBody
194
+ * 做镜像高度卷下(同款账本与身份守卫),开合对称。 */
195
+ private revealMergedBody;
196
+ /** 收起合并行:内容块高度卷下后移除——镜像 revealMergedBody 的唯一几何动画,
197
+ * 开合对称。插件全资静态文本 DOM、无 React 协调竞争,可安全做几何收起
198
+ * (与 seat 级拒绝盲卷的场景不同:那里是 React 混杂多卡片)。
199
+ * reduced-motion / 无 WAAPI / 零高度降级为同步 remove()。 */
200
+ private collapseMergedBody;
201
+ /** 当前宿主内的思考行(现取,React 重渲染后引用仍然有效)。 */
202
+ private currentThinkRows;
203
+ /** 移除合并思考行(二级收起 / 一级收起时),恢复行由 applyRows 控制。
204
+ * 合并内容块(btn 的兄弟节点)一并移除,避免宿主展开后残留文本。 */
205
+ private removeMergedThink;
206
+ /** 正文判定(带缓存):同一消息子树未变时直接复用上次结果。失效由
207
+ * markDirty(mutation 定向)与 switchFlow(整体重置)驱动;缓存的是
208
+ * 纯文本/媒体存在性判定,与 display 状态无关,插件自身的显隐切换
209
+ * 不会产生脏数据。 */
210
+ private hasBodyCached;
211
+ /** 本块是否有在途收起渐隐(rows/containers/merged 行/body 任一)。
212
+ * 基于 pendingAnims 账本无状态判定:onfinish/oncancel 都会即时清账,
213
+ * 取消路径天然解锁(计数器/最后注册者会卡死)。merged 行渐隐时已被
214
+ * releaseMergedThink 摘出 mergedThinks,按 DOM 类名现查。 */
215
+ private hasPendingCollapse;
216
+ /** 钉住 chip 与首行的 16px 间距(收起 fade 期间;内联优先于 aria=false 的 0)。
217
+ * flow-chip(context 等 before-mounted)豁免:其间距由宿主 row-gap 16px
218
+ * 提供、自身 CSS 恒 0,钉住 16px 会叠加成 32px(真机实测:收起上下文
219
+ * 注入时二级与三级间距瞬间扩大)。
220
+ */
221
+ private pinChipMargin;
222
+ /** 解除钉住(aria=true 的 16px 或 aria=false 的 0 由 CSS 接管)。 */
223
+ private unpinChipMargin;
224
+ /** 外部介入检测(issue #11 Bug A):当前内联值 ≠ 插件最后确保值,或所有权
225
+ * 哨兵被 style 整体改写抹除。返回 true 时调用方放弃本次写回并交还账本——
226
+ * 属性级改写由值比对捕获,整体改写(cssText / setAttribute('style'))由
227
+ * 哨兵缺失捕获,两层合起来覆盖外部介入的两种形态。 */
228
+ private displayForeign;
229
+ /** 清空单个元素的显示账本(三账本 + 所有权哨兵)。 */
230
+ private releaseDisplayLedger;
231
+ /** 返回 true 表示启动了渐隐动画(调用方可据此决定内部元素的处置)。
232
+ * settle 在渐隐自然结束时调用(onfinish 链;反向取消不触发)。 */
233
+ private hideElement;
234
+ private restoreElement;
235
+ /** 是否可动画:WAAPI 特性检测 + reduced-motion 门控(均做 typeof 防桩缺失)。 */
236
+ private canAnimate;
237
+ /** 展开方向淡入(opacity + 4px 微位移):无高度分量、零布局读取。
238
+ * onfinish 按终态可见对齐账本(双删除)并 schedule() 幂等重同步;
239
+ * oncancel 只做身份守卫删除——取消方的终态写入自己负责。 */
240
+ private startReveal;
241
+ /** 同步取消在途动画并清账:收起动画需同时清锁高内联(height/overflow/
242
+ * marginBottom),否则取消方写完终态后元素仍被锁高裁剪一帧以上。 */
243
+ private cancelPendingSync;
244
+ private clearCollapseLock;
245
+ /** 祖先 seat 在途动画检测:沿 parentNode 走到 flow,任一祖先在 pendingAnims
246
+ * 即视为在途。分层规则——同一视觉变化只动画一层。 */
247
+ private hasAnimatingAncestor;
248
+ /** 收起方向渐隐动画(v11 定稿):镜像 reveal 的 opacity + 4px 微位移,
249
+ * 淡完 onfinish 写 display:none 并保持双条目(镜像 hideElement 终态契约)。
250
+ * fill:'forwards' 占位到终态写入后释放;无几何锁、无 gap 补偿。 */
251
+ private startFadeCollapse;
252
+ /** 轻量视觉 reveal(opacity + 4px 微位移):用于插件全资元素的即时显示
253
+ * 路径——chip(一级展开时出现)与 merged-think 行(二级展开时出现)。
254
+ * 这些元素的 display 完全由插件直写、无 React 协调竞争,因此不入
255
+ * pendingAnims 账本、无仲裁;收起同为直写 display:none,无 fill 的在途
256
+ * 动画残留在隐藏元素上自然失效。门控沿用 animate 布尔(手势路径才调)。 */
257
+ private revealVisual;
258
+ private restoreUnusedDisplays;
259
+ /** 收集 audit 需要观察的 display 集合;只读取内联样式,不触发布局计算。 */
260
+ private collectAuditDisplays;
261
+ /** 在完整 pass 完成后保存 display 基线,供下一次轻量 audit 比对。 */
262
+ private captureAuditDisplays;
263
+ private restoreAllDisplays;
264
+ }
@@ -1,10 +1,11 @@
1
- /**
2
- * dsh-auto-collapse — host half 类型声明。
3
- *
4
- * 纯 UI 插件:host 侧没有行为,空的 apply 让插件出现在宿主插件树;
5
- * 浏览器端 bundle 通过 package.json 的 dsh.client 声明 + exports["./client"]
6
- * 被 dsh web 的 client-modules 服务发现并注入页面。
7
- */
8
-
9
- /** Host 插件体 —— 无 host 侧行为。 */
10
- export function apply(): void
1
+ /** Host 插件名。 */
2
+ export declare const name = "dsh-auto-collapse";
3
+ /** Host 侧不注入额外服务;settings 是可选的运行能力,由 installSettingsSection 惰性接入。 */
4
+ export declare const inject: string[];
5
+ /** 插件配置。 */
6
+ export interface Config {
7
+ /** 自定义状态提示词;留空恢复官方 "Deep diving..."。 */
8
+ statusText?: string;
9
+ }
10
+ /** Host 插件体:注册设置命名空间。 */
11
+ export declare function apply(ctx: unknown, config?: Config): void;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * dsh-auto-collapse — 插件配置卡片。
3
+ *
4
+ * 在 DSH Web 设置 → 插件 → 插件配置 中追加“状态提示词”卡片,编辑
5
+ * dsh-auto-collapse 的 settings 命名空间。卡片只做暂存与保存,不改动
6
+ * 业务逻辑;运行时文字替换由 FoldController 读取同一 scope 后实时生效。
7
+ */
8
+ /** settings 命名空间。Host 侧与客户端侧使用同一个值才能配对出现。 */
9
+ export declare const AUTO_COLLAPSE_NS = "dsh-auto-collapse";
10
+ /** 默认状态提示词。 */
11
+ export declare const DEFAULT_STATUS_TEXT = "Deep sleeping...";
12
+ /** 客户端 settings scope 的最小结构化类型。 */
13
+ export interface SettingsScopeLike {
14
+ getSnapshot(): {
15
+ status: 'loading' | 'ready' | 'unavailable';
16
+ value?: Record<string, unknown>;
17
+ base?: Record<string, unknown>;
18
+ user?: Record<string, unknown>;
19
+ writable: boolean;
20
+ };
21
+ subscribe(listener: () => void): () => void;
22
+ set(field: string, value: unknown): Promise<void>;
23
+ unset(field: string): Promise<void>;
24
+ }
25
+ /** 客户端 slots 服务的最小结构化类型。 */
26
+ export interface SlotsLike {
27
+ inject(key: string, callback: () => unknown): () => void;
28
+ register(options: {
29
+ name: string;
30
+ key: string;
31
+ inject: () => unknown;
32
+ }, renderer: (props: {
33
+ scope: SettingsScopeLike;
34
+ }) => unknown): unknown;
35
+ }
36
+ /** 从绑定的 settings scope 构造实时状态提示词读取器。 */
37
+ export declare function statusTextProvider(scope: SettingsScopeLike | undefined): () => string | undefined;
38
+ /** 向 DSH 插件配置页注册“状态提示词”卡片。 */
39
+ export declare function setupSettingsCard(ctx: {
40
+ slots: SlotsLike;
41
+ }, scope: SettingsScopeLike): () => void;
package/package.json CHANGED
@@ -1,54 +1,61 @@
1
- {
2
- "name": "dsh-auto-collapse",
3
- "version": "0.1.3",
4
- "description": "DeepSeek Harness Web 客户端插件:把会话里的工具卡片与 Think 推理块折叠成一行,折叠态实时显示当前正在进行的工作(工具名 + 正在执行的命令/参数、或思考内容),运行中带流光动画;点击展开/收起。让界面只保留模型说的话。",
5
- "type": "module",
6
- "main": "lib/index.js",
7
- "types": "lib/types/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./lib/types/index.d.ts",
11
- "default": "./lib/index.js"
12
- },
13
- "./client": {
14
- "types": "./lib/types/client/index.d.ts",
15
- "default": "./lib/client.js"
16
- },
17
- "./package.json": "./package.json"
18
- },
19
- "dsh": {
20
- "bundle": {
21
- "patch": "./cordis.patch.yml"
22
- },
23
- "client": {
24
- "inject": [],
25
- "platform": "web"
26
- }
27
- },
28
- "scripts": {
29
- "build": "node build.mjs",
30
- "deploy": "node deploy.mjs",
31
- "test": "node test/run-all.mjs",
32
- "typecheck": "tsc --noEmit --pretty false",
33
- "check": "npm run typecheck && npm test",
34
- "prepack": "node build.mjs"
35
- },
36
- "files": [
37
- "lib",
38
- "cordis.patch.yml"
39
- ],
40
- "keywords": [
41
- "dsh",
42
- "deepseek-harness",
43
- "client-plugin",
44
- "ui",
45
- "collapse",
46
- "auto-collapse",
47
- "chat"
48
- ],
49
- "license": "MIT",
50
- "devDependencies": {
51
- "esbuild": "0.25.0",
52
- "typescript": "5.9.3"
53
- }
54
- }
1
+ {
2
+ "name": "dsh-auto-collapse",
3
+ "version": "0.1.5",
4
+ "description": "DeepSeek Harness Web 客户端插件:把会话里的工具卡片与 Think 推理块折叠成一行,折叠态实时显示当前正在进行的工作(工具名 + 正在执行的命令/参数、或思考内容),运行中带流光动画;点击展开/收起。让界面只保留模型说的话。",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "types": "lib/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/types/index.d.ts",
11
+ "default": "./lib/index.js"
12
+ },
13
+ "./client": {
14
+ "types": "./lib/types/client.d.ts",
15
+ "default": "./lib/client.js"
16
+ },
17
+ "./package.json": "./package.json"
18
+ },
19
+ "dsh": {
20
+ "bundle": {
21
+ "patch": "./cordis.patch.yml"
22
+ },
23
+ "client": {
24
+ "inject": [
25
+ "@deepseek-ai/dsh-client-runtime",
26
+ "@deepseek-ai/dsh-client-ui-settings"
27
+ ],
28
+ "platform": "web"
29
+ }
30
+ },
31
+ "scripts": {
32
+ "build": "node build.mjs",
33
+ "deploy": "node deploy.mjs",
34
+ "test": "node test/run-all.mjs",
35
+ "typecheck": "tsc --noEmit --pretty false",
36
+ "check": "npm run typecheck && npm test",
37
+ "prepack": "node build.mjs"
38
+ },
39
+ "files": [
40
+ "lib",
41
+ "cordis.patch.yml"
42
+ ],
43
+ "keywords": [
44
+ "dsh",
45
+ "deepseek-harness",
46
+ "client-plugin",
47
+ "ui",
48
+ "collapse",
49
+ "auto-collapse",
50
+ "chat"
51
+ ],
52
+ "license": "MIT",
53
+ "devDependencies": {
54
+ "esbuild": "0.25.0",
55
+ "typescript": "5.9.3"
56
+ },
57
+ "peerDependencies": {
58
+ "@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
59
+ "@deepseek-ai/schemastery": "^3.18.1"
60
+ }
61
+ }
@@ -1,15 +0,0 @@
1
- /**
2
- * dsh-auto-collapse — browser half 类型声明。
3
- *
4
- * 折叠会话里的工具卡片与 Think 推理块;把官方 "Deep diving..." 运行状态行
5
- * 替换为 "Deep sleeping..."(特效不变)。
6
- */
7
-
8
- /** 客户端根上下文的最小结构化类型(仅用 cordis 标准 effect)。 */
9
- export interface FoldClientCtx {
10
- effect(fn: () => unknown, label?: string): unknown
11
- }
12
-
13
- export const name: string
14
- export const inject: string[]
15
- export function apply(ctx: FoldClientCtx): void