@zaofan/dsh-qqbot 1.10.28 → 1.10.30

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.
@@ -1 +1 @@
1
- {"version":3,"file":"abs-path.d.ts","sourceRoot":"","sources":["../../src/util/abs-path.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAe3C;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAG7C"}
1
+ {"version":3,"file":"abs-path.d.ts","sourceRoot":"","sources":["../../src/util/abs-path.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAwB3C;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAG7C"}
@@ -17,23 +17,32 @@ import { resolve } from 'node:path';
17
17
  * 这里做兜底:不管上游给什么,都尽量还原成绝对路径,避免再让坏值流到 create/join。
18
18
  */
19
19
  export function absCwdOf(p) {
20
- let s = String(p ?? '').trim();
21
- if (!s)
20
+ const raw = String(p ?? '').trim();
21
+ if (!raw)
22
22
  return '';
23
- // 反斜杠统一成正斜杠:Windows 上两种 Node 都认,但混用会让 join/split 出怪结果
24
- s = s.replace(/\\/g, '/');
25
- // ① 已经是绝对路径:Windows 盘符 / UNC / POSIX
26
- if (/^[A-Za-z]:\//.test(s) || s.startsWith('//') || s.startsWith('/'))
27
- return s;
28
- // ② POSIX(Linux / Android):补回被丢掉的前导 '/'
23
+ // ⚠️ 已经是绝对路径 → 【原样返回,一个字符都不动】。
24
+ // 为什么不能顺手把反斜杠归一成正斜杠:session-manager:670 用
25
+ // `prevCfg.cwd !== wantCwd` 做**字符串精确比较**来判断「cwd 改没改」,
26
+ // 改形式会让 Windows 老用户升级后判定 cwd 变了,白白触发一次
27
+ // fork 热迁移 / 弃旧开新(历史虽然会继承,但那是多余的档案分裂)。
28
+ // → 只在「相对路径」这一种真正会出事的情况下动手。
29
+ if (/^[A-Za-z]:[\\/]/.test(raw))
30
+ return raw; // D:\a\b 或 D:/a/b
31
+ if (raw.startsWith('\\') || raw.startsWith('//'))
32
+ return raw; // UNC \\server\share
33
+ if (raw.startsWith('/'))
34
+ return raw; // POSIX 绝对路径
35
+ // ── 以下只处理相对路径(issue #18 的坏值就长这样:storage\emulated\0\大肥鱼)──
36
+ const s = raw.replace(/\\/g, '/');
37
+ // POSIX(Linux / Android):补回被 dsh 编码时丢掉的前导 '/'
29
38
  if (process.platform !== 'win32')
30
39
  return '/' + s;
31
- // ③ Windows 相对路径没法可靠还原原意,退化成相对进程 cwd 解析(至少是个绝对路径)
40
+ // Windows 相对路径没法可靠还原原意,退化成相对进程 cwd 解析(至少是个绝对路径)
32
41
  try {
33
42
  return resolve(s).replace(/\\/g, '/');
34
43
  }
35
44
  catch {
36
- return s;
45
+ return raw;
37
46
  }
38
47
  }
39
48
  /** 判断一个路径是不是绝对路径(Windows 盘符 / UNC / POSIX 都算) */
@@ -1 +1 @@
1
- {"version":3,"file":"abs-path.js","sourceRoot":"","sources":["../../src/util/abs-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,sDAAsD;IACtD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1B,qCAAqC;IACrC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAChF,wCAAwC;IACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC;IACjD,kDAAkD;IAClD,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,SAAS,CAAC,CAAU;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"abs-path.js","sourceRoot":"","sources":["../../src/util/abs-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,+BAA+B;IAC/B,6CAA6C;IAC7C,yDAAyD;IACzD,0CAA0C;IAC1C,0CAA0C;IAC1C,+BAA+B;IAC/B,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,kBAAkB;IAC/D,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,qBAAqB;IACnF,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,aAAa;IAElD,2DAA2D;IAC3D,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,8CAA8C;IAC9C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC;IACjD,gDAAgD;IAChD,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,SAAS,CAAC,CAAU;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zaofan/dsh-qqbot",
3
- "version": "1.10.28",
3
+ "version": "1.10.30",
4
4
  "description": "QQ Bot IM channel plugin for deepseek-harness (dsh)",
5
5
  "type": "module",
6
6
  "main": "./entry.js",
package/settings-host.js CHANGED
@@ -4899,6 +4899,21 @@ const WHY_MAP = { busy: '目标会话回合活跃,已等待至回合结束仍超
4899
4899
  return out;
4900
4900
  }
4901
4901
 
4902
+ /**
4903
+ * 把工作区路径归一成**绝对路径**(与 src/util/abs-path.ts 的 absCwdOf 同一套规则)。
4904
+ * 绝对路径原样返回,只给相对路径补前导 `/`。
4905
+ */
4906
+ function absCwd(p) {
4907
+ const raw = String(p == null ? '' : p).trim();
4908
+ if (!raw) return '';
4909
+ if (/^[A-Za-z]:[\\/]/.test(raw)) return raw;
4910
+ if (raw.startsWith('\\\\') || raw.startsWith('//')) return raw;
4911
+ if (raw.startsWith('/')) return raw;
4912
+ const s = raw.replace(/\\/g, '/');
4913
+ if (process.platform !== 'win32') return '/' + s;
4914
+ return raw;
4915
+ }
4916
+
4902
4917
  /** 扫一个扩展根(含六个 kind 子目录),返回 { kinds:{tools:[...]}, total } */
4903
4918
  function scanExtRoot(root, dataRoot) {
4904
4919
  const kinds = {};
@@ -4936,12 +4951,12 @@ const WHY_MAP = { busy: '目标会话回合活跃,已等待至回合结束仍超
4936
4951
  const bcwd = norm(cfg.cwd);
4937
4952
  if (!bcwd || bcwd !== target) continue;
4938
4953
  if (cfg.dataRoot) return { dataRoot: String(cfg.dataRoot), source: 'bot.dataRoot' };
4939
- return { dataRoot: join(String(cfg.cwd), 'dshqqbot'), source: 'bot.cwd' };
4954
+ return { dataRoot: join(absCwd(cfg.cwd) || String(cfg.cwd), 'dshqqbot'), source: 'bot.cwd' };
4940
4955
  }
4941
4956
  }
4942
4957
 
4943
4958
  // ③ 传入的 cwd(该工作区没绑 bot 时,扩展目录仍在它自己的 dshqqbot 下)
4944
- if (hint) return { dataRoot: join(hint, 'dshqqbot'), source: 'workspace' };
4959
+ if (hint) return { dataRoot: join(absCwd(hint) || hint, 'dshqqbot'), source: 'workspace' };
4945
4960
 
4946
4961
  // ④ 兜底:老的推断
4947
4962
  for (const b of bots) {
@@ -5231,22 +5246,21 @@ const WHY_MAP = { busy: '目标会话回合活跃,已等待至回合结束仍超
5231
5246
  * --D-newwenjianjia-aiwork-~9CB8~9C7C~5A18-- ⇒ D:\newwenjianjia\aiwork\鲸鱼娘
5232
5247
  * '-' = 分隔符;'~XXXX' = 一个 UTF-16 码元;首段单字母 = 盘符
5233
5248
  */
5249
+ /**
5250
+ * `~/.dsh/sessions/{转义目录名}` → 工作区真实路径。
5251
+ *
5252
+ * 2026-10-24 修 issue #19:这里原来自己写了一遍解码(和 decodeSessionDirName 重复),
5253
+ * 而且有三个叠加缺陷:
5254
+ * ① `segs.join(String.fromCharCode(92, 92))` —— 拼出了**两个**反斜杠字符;
5255
+ * ② 分隔符写死反斜杠,POSIX 上直接坏;
5256
+ * ③ 目录名转义时根部的 `/` 就丢了,还原后也没补。
5257
+ * 结果 Android/Linux 上还原成 `storage\\emulated\\0\\大肥鱼` —— 相对路径,
5258
+ * 扩展面板拿它去 readdirSync 必然落空,三块计数全 0。
5259
+ *
5260
+ * 现在直接复用 decodeSessionDirName(那边已经按盘符/POSIX 分支处理过)。
5261
+ */
5234
5262
  function wsPathFromDir(dir) {
5235
- const t = String(dir || '').replace(/^--/, '').replace(/--$/, '');
5236
- const parts = [];
5237
- let cur = '';
5238
- let i = 0;
5239
- while (i < t.length) {
5240
- const ch = t[i];
5241
- if (ch === '-') { parts.push(cur); cur = ''; i += 1; continue; }
5242
- const m = /^~([0-9A-Fa-f]{4})/.exec(t.slice(i, i + 5));
5243
- if (m) { cur += String.fromCharCode(parseInt(m[1], 16)); i += 5; continue; }
5244
- cur += ch; i += 1;
5245
- }
5246
- parts.push(cur);
5247
- const segs = parts.filter((p) => p !== '');
5248
- if (segs.length && /^[A-Za-z]$/.test(segs[0])) segs[0] = segs[0] + ':';
5249
- return segs.join('\\\\');
5263
+ return decodeSessionDirName(String(dir || ''));
5250
5264
  }
5251
5265
 
5252
5266
  /**