@wenbin_wb/dsh-bridge 2.10.9 → 2.10.10

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.
@@ -0,0 +1,52 @@
1
+ // 会话级配置(工作区 / Agent 预设 / 模型路由)的读写归一
2
+ //
3
+ // 这四个字段决定远程会话"建在哪里、挂什么预设、用哪个模型":
4
+ // - cwd 会话工作区
5
+ // - agentPreset DSH agent preset(决定该会话挂载的工具/提示词/技能目录)
6
+ // - agentProvider 模型提供方
7
+ // - agentModel 模型
8
+ //
9
+ // 它们同时出现在三处:cordis 配置 → 设置页写入(config.json)→ 启动恢复。
10
+ // 三处必须共用同一套字段名与空值语义,否则又会出现"配了不生效 / 重启就丢"。
11
+ // 空串表示"未设置":会话创建时回落到 DSH 默认值。
12
+
13
+ /** 会话级配置的字段名(顺序即 UI 展示顺序)。 */
14
+ export const SESSION_CONFIG_FIELDS = ['agentPreset', 'cwd', 'agentProvider', 'agentModel']
15
+
16
+ /**
17
+ * 读取会话级配置(供 UI 回显 / 持久化 patch 使用)。
18
+ * @param {object} config 会话桥的 config
19
+ * @returns {{agentPreset: string, cwd: string, agentProvider: string, agentModel: string}}
20
+ */
21
+ export function readSessionConfig(config) {
22
+ const out = {}
23
+ for (const field of SESSION_CONFIG_FIELDS) {
24
+ out[field] = typeof config?.[field] === 'string' ? config[field] : ''
25
+ }
26
+ return out
27
+ }
28
+
29
+ /**
30
+ * 应用一组会话级配置(就地修改 config)。
31
+ *
32
+ * 只接受字符串入参:未出现在 patch 里的字段保持原值,非字符串(undefined/null/数字)
33
+ * 一律忽略;字符串按 trim 后写入,空串表示显式清除该设置、回落 DSH 默认值。
34
+ *
35
+ * @param {object} config 会话桥的 config
36
+ * @param {object} patch 来自设置页的 patch
37
+ * @returns {string[]} 实际被改写的字段名
38
+ */
39
+ export function applySessionConfig(config, patch) {
40
+ if (!config || !patch) return []
41
+ const changed = []
42
+ for (const field of SESSION_CONFIG_FIELDS) {
43
+ if (!Object.hasOwn(patch, field)) continue
44
+ const raw = patch[field]
45
+ if (typeof raw !== 'string') continue
46
+ const next = raw.trim()
47
+ if (config[field] === next) continue
48
+ config[field] = next
49
+ changed.push(field)
50
+ }
51
+ return changed
52
+ }
@@ -1,21 +1,21 @@
1
- // 流式打字机输出的公共切片工具
2
- //
3
- // 各平台网关(qq/feishu/telegram)的流式输出都是"增量前缀"模式:
4
- // 第 i 片内容 = 前 i 个基础分片的拼接(服务端逐片覆盖,消息逐渐变长)。
5
- // 基础分块器因平台而异(QQ markdown 感知分块 / 飞书换行窗口 / Telegram splitForIM),
6
- // 本模块只沉淀三者复制的"前缀累积"逻辑。
7
-
8
- /**
9
- * 把基础分片转成增量前缀切片。
10
- * @param {string[]} chunks 基础分片(非空内容应至少产生 1 片)
11
- * @returns {string[]} 第 i 个元素 = chunks[0..i] 拼接
12
- */
13
- export function cumulativeSlices(chunks) {
14
- const slices = []
15
- let acc = ''
16
- for (const s of chunks) {
17
- acc += s
18
- slices.push(acc)
19
- }
20
- return slices
21
- }
1
+ // 流式打字机输出的公共切片工具
2
+ //
3
+ // 各平台网关(qq/feishu/telegram)的流式输出都是"增量前缀"模式:
4
+ // 第 i 片内容 = 前 i 个基础分片的拼接(服务端逐片覆盖,消息逐渐变长)。
5
+ // 基础分块器因平台而异(QQ markdown 感知分块 / 飞书换行窗口 / Telegram splitForIM),
6
+ // 本模块只沉淀三者复制的"前缀累积"逻辑。
7
+
8
+ /**
9
+ * 把基础分片转成增量前缀切片。
10
+ * @param {string[]} chunks 基础分片(非空内容应至少产生 1 片)
11
+ * @returns {string[]} 第 i 个元素 = chunks[0..i] 拼接
12
+ */
13
+ export function cumulativeSlices(chunks) {
14
+ const slices = []
15
+ let acc = ''
16
+ for (const s of chunks) {
17
+ acc += s
18
+ slices.push(acc)
19
+ }
20
+ return slices
21
+ }