@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.
- package/dist/util/abs-path.d.ts.map +1 -1
- package/dist/util/abs-path.js +19 -10
- package/dist/util/abs-path.js.map +1 -1
- package/package.json +1 -1
- package/settings-host.js +31 -17
|
@@ -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,
|
|
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"}
|
package/dist/util/abs-path.js
CHANGED
|
@@ -17,23 +17,32 @@ import { resolve } from 'node:path';
|
|
|
17
17
|
* 这里做兜底:不管上游给什么,都尽量还原成绝对路径,避免再让坏值流到 create/join。
|
|
18
18
|
*/
|
|
19
19
|
export function absCwdOf(p) {
|
|
20
|
-
|
|
21
|
-
if (!
|
|
20
|
+
const raw = String(p ?? '').trim();
|
|
21
|
+
if (!raw)
|
|
22
22
|
return '';
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
//
|
|
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
|
-
//
|
|
40
|
+
// Windows 相对路径没法可靠还原原意,退化成相对进程 cwd 解析(至少是个绝对路径)
|
|
32
41
|
try {
|
|
33
42
|
return resolve(s).replace(/\\/g, '/');
|
|
34
43
|
}
|
|
35
44
|
catch {
|
|
36
|
-
return
|
|
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,
|
|
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
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
|
-
|
|
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
|
/**
|