@zaofan/dsh-qqbot 1.1.2 → 1.1.3
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/features/group-hub.js +2 -2
- package/dist/features/group-hub.js.map +1 -1
- package/dist/setup.d.ts +15 -3
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +51 -32
- package/dist/setup.js.map +1 -1
- package/package.json +1 -1
- package/settings-host.js +137 -24
|
@@ -117,7 +117,7 @@ export async function notifyGroupHub(manager, config, logger, ev) {
|
|
|
117
117
|
lines.push('可回复我处理(如: 查看入群申请 / 通过 / 拒绝)');
|
|
118
118
|
}
|
|
119
119
|
else if (ev.kind === 'member_add') {
|
|
120
|
-
lines.push(`新成员 openid: ${
|
|
120
|
+
lines.push(`新成员 openid: ${ev.memberOpenid ?? '(未知)'}${ev.extra ? ' · ' + ev.extra : ''}`);
|
|
121
121
|
}
|
|
122
122
|
else {
|
|
123
123
|
lines.push(`操作者: ${tail(ev.memberOpenid)}${ev.extra ? ' · ' + ev.extra : ''}`);
|
|
@@ -224,7 +224,7 @@ export async function handleGroupMemberAddEvent(data, opts) {
|
|
|
224
224
|
kind: 'member_add',
|
|
225
225
|
gid,
|
|
226
226
|
memberOpenid: mid,
|
|
227
|
-
extra: ev.user_openid ? `user_openid ${
|
|
227
|
+
extra: ev.user_openid ? `user_openid ${ev.user_openid}` : undefined,
|
|
228
228
|
});
|
|
229
229
|
return true;
|
|
230
230
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-hub.js","sourceRoot":"","sources":["../../src/features/group-hub.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"group-hub.js","sourceRoot":"","sources":["../../src/features/group-hub.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts
CHANGED
|
@@ -15,11 +15,23 @@ export declare function runQrSetup(source?: string): Promise<SetupCredentials |
|
|
|
15
15
|
*
|
|
16
16
|
* 行级编辑(不再整文件 YAML 解析)——cordis.patch.yml 常含宿主 `!!js` 自定义标签,
|
|
17
17
|
* js-yaml 无法解析会抛错导致自动保存失败(实测线上文件即因此走到手动引导)。
|
|
18
|
-
*
|
|
19
|
-
* 文件其它内容(含 !!js、其它实例、insert 包装)
|
|
18
|
+
* 只定位/更新目标实例条目块(顶层或 `- insert:` 内的 4 空格形态)中的 appId/appSecret 行,
|
|
19
|
+
* 文件其它内容(含 !!js、其它实例、insert 包装)原样保留。
|
|
20
|
+
*
|
|
21
|
+
* ⚠️ 2026-09-10 修复两处线上事故:
|
|
22
|
+
* 1. 旧实现把条目名硬编码成 `im-qqbot`, 对 `im-qqbot-2` 这类实例找不到块 →
|
|
23
|
+
* 在文件末尾追加了一个顶层 `- id: im-qqbot`(新版 dsh 无此 entry, 会让整棵插件树加载失败);
|
|
24
|
+
* 现按 instEntryId(来自 config.settingsNs)定位, 且**绝不新建顶层 entry id**。
|
|
25
|
+
* 2. appId 必须写为**带引号的字符串** —— 新版 cordis 严格校验 `$.appId expected string`,
|
|
26
|
+
* 裸数字(1905515836)会让 preset/插件树整体挂载失败。
|
|
27
|
+
*
|
|
28
|
+
* @param credentials 扫码得到的 appId/appSecret
|
|
29
|
+
* @param profileDir dsh profile 目录(含 cordis.patch.yml)
|
|
30
|
+
* @param logger 日志器
|
|
31
|
+
* @param instEntryId 目标条目 id(即 loader entry id, 默认 `im-qqbot`)
|
|
20
32
|
*/
|
|
21
33
|
export declare function persistCredentialsToProfile(credentials: SetupCredentials, profileDir?: string, logger?: {
|
|
22
34
|
info(msg: string, ...args: unknown[]): void;
|
|
23
35
|
warn(msg: string, ...args: unknown[]): void;
|
|
24
|
-
}): boolean;
|
|
36
|
+
}, instEntryId?: string): boolean;
|
|
25
37
|
//# sourceMappingURL=setup.d.ts.map
|
package/dist/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAWA,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,SAAc,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAyDvF;AAED
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAWA,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,SAAc,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAyDvF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,gBAAgB,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,EACrG,WAAW,SAAa,GACvB,OAAO,CAgGT"}
|
package/dist/setup.js
CHANGED
|
@@ -72,12 +72,25 @@ export async function runQrSetup(source = 'dsh-qqbot') {
|
|
|
72
72
|
*
|
|
73
73
|
* 行级编辑(不再整文件 YAML 解析)——cordis.patch.yml 常含宿主 `!!js` 自定义标签,
|
|
74
74
|
* js-yaml 无法解析会抛错导致自动保存失败(实测线上文件即因此走到手动引导)。
|
|
75
|
-
*
|
|
76
|
-
* 文件其它内容(含 !!js、其它实例、insert 包装)
|
|
75
|
+
* 只定位/更新目标实例条目块(顶层或 `- insert:` 内的 4 空格形态)中的 appId/appSecret 行,
|
|
76
|
+
* 文件其它内容(含 !!js、其它实例、insert 包装)原样保留。
|
|
77
|
+
*
|
|
78
|
+
* ⚠️ 2026-09-10 修复两处线上事故:
|
|
79
|
+
* 1. 旧实现把条目名硬编码成 `im-qqbot`, 对 `im-qqbot-2` 这类实例找不到块 →
|
|
80
|
+
* 在文件末尾追加了一个顶层 `- id: im-qqbot`(新版 dsh 无此 entry, 会让整棵插件树加载失败);
|
|
81
|
+
* 现按 instEntryId(来自 config.settingsNs)定位, 且**绝不新建顶层 entry id**。
|
|
82
|
+
* 2. appId 必须写为**带引号的字符串** —— 新版 cordis 严格校验 `$.appId expected string`,
|
|
83
|
+
* 裸数字(1905515836)会让 preset/插件树整体挂载失败。
|
|
84
|
+
*
|
|
85
|
+
* @param credentials 扫码得到的 appId/appSecret
|
|
86
|
+
* @param profileDir dsh profile 目录(含 cordis.patch.yml)
|
|
87
|
+
* @param logger 日志器
|
|
88
|
+
* @param instEntryId 目标条目 id(即 loader entry id, 默认 `im-qqbot`)
|
|
77
89
|
*/
|
|
78
|
-
export function persistCredentialsToProfile(credentials, profileDir, logger) {
|
|
90
|
+
export function persistCredentialsToProfile(credentials, profileDir, logger, instEntryId = 'im-qqbot') {
|
|
79
91
|
const log = logger ?? console;
|
|
80
92
|
const dir = profileDir;
|
|
93
|
+
const entryId = (instEntryId || 'im-qqbot').trim() || 'im-qqbot';
|
|
81
94
|
if (!dir) {
|
|
82
95
|
// 开发模式:插件从源码加载、不在 node_modules 下,无法定位 profile 目录
|
|
83
96
|
printEnvInstructions(credentials);
|
|
@@ -91,28 +104,29 @@ export function persistCredentialsToProfile(credentials, profileDir, logger) {
|
|
|
91
104
|
text = readFileSync(patchPath, 'utf8');
|
|
92
105
|
const eol = text.includes('\r\n') ? '\r\n' : '\n';
|
|
93
106
|
const lines = text.length ? text.split(/\r\n|\n/) : [];
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
const HEAD_RE = /^-\s*id:\s*['"]?im-qqbot['"]?\s*$/;
|
|
107
|
+
/** appId/appSecret 一律单引号字符串: 宿主 schema 要求 string, 裸数字会挂载失败 */
|
|
108
|
+
const ystr = (v) => `'${String(v).replace(/'/g, "''")}'`;
|
|
109
|
+
// 条目行: 允许任意缩进(顶层 0 / insert 内 4), id 需精确匹配 entryId
|
|
110
|
+
const esc = entryId.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
111
|
+
const HEAD_RE = new RegExp(`^\\s*-\\s*id:\\s*['"]?${esc}['"]?\\s*$`);
|
|
100
112
|
const headIdx = lines.findIndex((l) => HEAD_RE.test(l));
|
|
101
113
|
let outLines;
|
|
102
114
|
if (headIdx >= 0) {
|
|
103
|
-
// 2a.
|
|
115
|
+
// 2a. 已有目标块: 块结束 = 下一个"缩进不更深的条目行"(或文件尾)
|
|
116
|
+
const headIndent = (lines[headIdx].match(/^\s*/) ?? [''])[0].length;
|
|
104
117
|
let blockEnd = lines.length;
|
|
105
118
|
for (let i = headIdx + 1; i < lines.length; i++) {
|
|
106
119
|
const li = lines[i];
|
|
107
|
-
|
|
120
|
+
const ind = ((li.match(/^\s*/) ?? [''])[0]).length;
|
|
121
|
+
if (/- /.test(li) && ind <= headIndent) {
|
|
108
122
|
blockEnd = i;
|
|
109
123
|
break;
|
|
110
124
|
}
|
|
111
125
|
}
|
|
112
126
|
const block = lines.slice(headIdx, blockEnd);
|
|
113
|
-
// config 字段缩进: 找块内 `config:` 行缩进; 默认 2
|
|
114
|
-
let cfgIndent = 2;
|
|
115
|
-
const cfgLine = block.findIndex((l) =>
|
|
127
|
+
// config 字段缩进: 找块内 `config:` 行缩进; 默认 headIndent + 2
|
|
128
|
+
let cfgIndent = headIndent + 2;
|
|
129
|
+
const cfgLine = block.findIndex((l) => new RegExp(`^\\s{${headIndent + 1},}config:\\s*$`).test(l));
|
|
116
130
|
if (cfgLine >= 0) {
|
|
117
131
|
cfgIndent = (block[cfgLine].match(/^\s*/) ?? [''])[0].length;
|
|
118
132
|
}
|
|
@@ -122,49 +136,52 @@ export function persistCredentialsToProfile(credentials, profileDir, logger) {
|
|
|
122
136
|
const hit = arr.findIndex((l) => re.test(l));
|
|
123
137
|
if (hit >= 0) {
|
|
124
138
|
const indent = (arr[hit].match(/^\s*/) ?? [''])[0];
|
|
125
|
-
arr[hit] = `${indent}${key}: ${
|
|
139
|
+
arr[hit] = `${indent}${key}: ${value}`;
|
|
126
140
|
return arr;
|
|
127
141
|
}
|
|
128
142
|
// 无该键: config: 行后插入; 无 config: 则在 id 行后补 config + 键
|
|
129
143
|
const insertAt = cfgLine >= 0 ? cfgLine + 1 : 1;
|
|
130
144
|
const pad = ' '.repeat(valIndent);
|
|
131
145
|
if (cfgLine < 0) {
|
|
132
|
-
arr.splice(1, 0, ' '.repeat(cfgIndent) + 'config:', `${pad}${key}: ${
|
|
146
|
+
arr.splice(1, 0, ' '.repeat(cfgIndent) + 'config:', `${pad}${key}: ${value}`);
|
|
133
147
|
}
|
|
134
148
|
else {
|
|
135
|
-
|
|
136
|
-
arr.splice(insertAt, 0, `${pad}${key}: ${yq(value)}`);
|
|
149
|
+
arr.splice(insertAt, 0, `${pad}${key}: ${value}`);
|
|
137
150
|
}
|
|
138
151
|
return arr;
|
|
139
152
|
};
|
|
140
|
-
const nb = upsertKey('appId', credentials.appId, block.slice());
|
|
141
|
-
upsertKey('appSecret', credentials.appSecret, nb);
|
|
153
|
+
const nb = upsertKey('appId', ystr(credentials.appId), block.slice());
|
|
154
|
+
upsertKey('appSecret', ystr(credentials.appSecret), nb);
|
|
142
155
|
outLines = lines.slice(0, headIdx).concat(nb, lines.slice(blockEnd));
|
|
143
156
|
}
|
|
144
157
|
else {
|
|
145
|
-
// 2b.
|
|
158
|
+
// 2b. 没有目标块: **不再新建顶层 `- id: xxx`**(顶层 id 只能覆盖已存在的 bundle entry,
|
|
159
|
+
// 否则宿主报 patch entry not found / 插件树加载失败)。改用 `- insert:` 包装新增。
|
|
146
160
|
const tail = lines.slice();
|
|
147
161
|
while (tail.length > 0 && tail[tail.length - 1] === '')
|
|
148
162
|
tail.pop();
|
|
149
163
|
outLines = tail.concat([
|
|
150
164
|
'',
|
|
151
165
|
'# QQ Bot 凭据(扫码绑定自动生成)',
|
|
152
|
-
'-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
166
|
+
'- insert:',
|
|
167
|
+
` - id: ${entryId}`,
|
|
168
|
+
' name: @zaofan/dsh-qqbot',
|
|
169
|
+
' config:',
|
|
170
|
+
` appId: ${ystr(credentials.appId)}`,
|
|
171
|
+
` appSecret: ${ystr(credentials.appSecret)}`,
|
|
172
|
+
...(entryId !== 'im-qqbot' ? [` settingsNs: '${entryId}'`] : []),
|
|
156
173
|
]);
|
|
157
174
|
}
|
|
158
175
|
mkdirSync(dir, { recursive: true });
|
|
159
176
|
const finalText = (outLines.join(eol)).replace(/\n{3,}/g, '\n\n').trimEnd() + eol;
|
|
160
177
|
writeFileSync(patchPath, finalText, 'utf8');
|
|
161
|
-
log.info(`✔ 凭据已写入: ${patchPath}`);
|
|
178
|
+
log.info(`✔ 凭据已写入: ${patchPath} (entry id: ${entryId})`);
|
|
162
179
|
log.info(` 下次启动将自动使用保存的凭据`);
|
|
163
180
|
return true;
|
|
164
181
|
}
|
|
165
182
|
catch (err) {
|
|
166
183
|
log.warn(`写入配置失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
167
|
-
printYamlInstructions(credentials, patchPath);
|
|
184
|
+
printYamlInstructions(credentials, patchPath, entryId);
|
|
168
185
|
return false;
|
|
169
186
|
}
|
|
170
187
|
}
|
|
@@ -186,13 +203,15 @@ function printEnvInstructions(credentials) {
|
|
|
186
203
|
}
|
|
187
204
|
}
|
|
188
205
|
/** 正式安装引导:自动写入失败,引导手动在 cordis.patch.yml 配置(console.log 确保可见) */
|
|
189
|
-
function printYamlInstructions(credentials, patchPath) {
|
|
206
|
+
function printYamlInstructions(credentials, patchPath, entryId = 'im-qqbot') {
|
|
190
207
|
console.log('无法自动保存凭据,请手动打开以下文件添加配置:');
|
|
191
208
|
console.log(` ${patchPath}`);
|
|
192
209
|
console.log('');
|
|
193
|
-
console.log(' -
|
|
194
|
-
console.log(
|
|
195
|
-
console.log(
|
|
196
|
-
console.log(
|
|
210
|
+
console.log(' - insert:');
|
|
211
|
+
console.log(` - id: ${entryId}`);
|
|
212
|
+
console.log(" name: '@zaofan/dsh-qqbot'");
|
|
213
|
+
console.log(' config:');
|
|
214
|
+
console.log(` appId: '${credentials.appId}'`);
|
|
215
|
+
console.log(` appSecret: '${credentials.appSecret}'`);
|
|
197
216
|
}
|
|
198
217
|
//# sourceMappingURL=setup.js.map
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AASlE,yDAAyD;AACzD,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,aAAa,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAM,GAAG,WAAW;IACnD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IAExE,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,uCAAuC;QACvC,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChF,cAAc,CACZ;gBACE,SAAS,EAAE,OAAO;gBAClB,SAAS,EAAE,MAAM;gBACjB,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;oBACrB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3C,CAAC;gBACD,WAAW,EAAE,GAAG,EAAE;oBAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAChC,CAAC;aACF,EACD,EAAE,MAAM,EAAE,CACX,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAE/C,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE7D,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACxE,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACxE,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/settings-host.js
CHANGED
|
@@ -282,9 +282,9 @@ export function apply(ctx) {
|
|
|
282
282
|
/** 解析 patch: 返回 {raw, bots:[{id,start,end,ins,cfg:{appId,appSecret,preset,cwd},disabled}], hasFile}
|
|
283
283
|
* patch 语义(宿主 dsh-app-boot applyEntryPatches): 顶层 `- id: X` 只能覆盖已存在 id(bundle insert 建的);
|
|
284
284
|
* 新增实例必须 `- insert:` 包装(其下 4 空格 `- id: Y`)。本文件里两种形态都识别。 */
|
|
285
|
-
function
|
|
285
|
+
function parsePatchFrom(rawText) {
|
|
286
286
|
const hasFile = existsSync(PATCH_FILE);
|
|
287
|
-
const raw = hasFile ? readFileSync(PATCH_FILE, 'utf8') : '';
|
|
287
|
+
const raw = rawText !== undefined && rawText !== null ? String(rawText) : (hasFile ? readFileSync(PATCH_FILE, 'utf8') : '');
|
|
288
288
|
// 行尾容错: 兼容 CRLF(2026-09-08 曾因 patch 被写成 CRLF 导致整段解析失败)
|
|
289
289
|
const lines = raw.split(/\r?\n/);
|
|
290
290
|
const bots = [];
|
|
@@ -309,7 +309,7 @@ export function apply(ctx) {
|
|
|
309
309
|
}
|
|
310
310
|
j += 1;
|
|
311
311
|
}
|
|
312
|
-
bots.push({ id, start, end: j, ins: false, cfg, disabled });
|
|
312
|
+
bots.push({ id, start, end: j, ins: false, cfg, disabled, headLine: start });
|
|
313
313
|
i = j;
|
|
314
314
|
} else if (isTopLine(t) && /^\s*-\s*insert:\s*$/.test(t)) {
|
|
315
315
|
// insert 形态: 找其下 4 空格 `- id: im-qqbot*`
|
|
@@ -342,7 +342,7 @@ export function apply(ctx) {
|
|
|
342
342
|
if (isTopLine(lines[j])) break;
|
|
343
343
|
j += 1;
|
|
344
344
|
}
|
|
345
|
-
bots.push({ id, start: insStart, end: j, ins: true, cfg, disabled });
|
|
345
|
+
bots.push({ id, start: insStart, end: j, ins: true, cfg, disabled, headLine: found.line });
|
|
346
346
|
i = j;
|
|
347
347
|
} else {
|
|
348
348
|
i += 1;
|
|
@@ -353,6 +353,8 @@ export function apply(ctx) {
|
|
|
353
353
|
}
|
|
354
354
|
return { raw, hasFile, bots };
|
|
355
355
|
}
|
|
356
|
+
/** 从磁盘读取并解析(parsePatchFrom 的包装) */
|
|
357
|
+
function parsePatch() { return parsePatchFrom(undefined); }
|
|
356
358
|
|
|
357
359
|
/** 渲染一个实例块。主 im-qqbot(bundle 已 insert)→ 顶层覆盖; 新实例 → `- insert:` 包装(4/6/8 缩进) */
|
|
358
360
|
function renderBotBlock(inst) {
|
|
@@ -379,47 +381,158 @@ export function apply(ctx) {
|
|
|
379
381
|
return out.join('\n');
|
|
380
382
|
}
|
|
381
383
|
|
|
384
|
+
/** 在已有条目块内只更新指定键,保留原结构(缩进/位置/未知字段如 groupAdmin、dataRoot、name)。
|
|
385
|
+
* ⚠️ 2026-09-10 新增: 原实现用 renderBotBlock 整块重建 —— 会把 insert: 下的 im-qqbot-2 提成顶层
|
|
386
|
+
* `- id: im-qqbot`(新版无此 entry, 直接让整棵插件树加载失败), 并丢掉 name/settingsNs/historyLimit/
|
|
387
|
+
* groupAdmin/dataRoot 等未在渲染里列出的字段。改为原地增量更新后结构不再被破坏。
|
|
388
|
+
* ⚠️ 2026-09-10 二次修复: 除更新已存在的键外, 还要**补写缺失的键**(如原本没有 cwd 的实例),
|
|
389
|
+
* 否则前端填了 cwd 也保存不进去(实测 im-qqbot-3 只更新 3/4 个键)。disabled 走块头层(children of id)。
|
|
390
|
+
* @param {string[]} lines 文件全部行(会被原地修改)
|
|
391
|
+
* @param {number} start 块首行索引(含, 即 `- id:` 或 `- insert:` 行)
|
|
392
|
+
* @param {number} end 块结束行索引(不含)
|
|
393
|
+
* @param {Record<string,string>} kv 要写入的键值(值为字符串); 已存在则改, 缺失则按规矩新增
|
|
394
|
+
* @returns {number} 实际写入的键数 */
|
|
395
|
+
function updateKeysInBlock(lines, start, end, kv) {
|
|
396
|
+
// 块头行: insert 包装时块首是 `- insert:`, 真正的 `- id:` 在下一行
|
|
397
|
+
let headIdx = start;
|
|
398
|
+
for (let i = start; i < Math.min(start + 3, end); i += 1) {
|
|
399
|
+
if (/^\s*-\s*id:/.test(lines[i])) { headIdx = i; break; }
|
|
400
|
+
}
|
|
401
|
+
const headIndent = ((lines[headIdx] ?? '').match(/^\s*/) ?? [''])[0].length;
|
|
402
|
+
const childIndent = headIndent + 2; // name: / disabled: / config: 的缩进
|
|
403
|
+
|
|
404
|
+
const pending = new Map(Object.entries(kv));
|
|
405
|
+
let touched = 0;
|
|
406
|
+
// ① 已存在的键: 原地改写(保留原缩进)
|
|
407
|
+
for (let i = headIdx + 1; i < end && pending.size > 0; i += 1) {
|
|
408
|
+
const m = /^(\s*)([A-Za-z_][A-Za-z0-9_]*):\s*(.*)$/.exec(lines[i]);
|
|
409
|
+
if (!m) continue;
|
|
410
|
+
const key = m[2];
|
|
411
|
+
if (!pending.has(key)) continue;
|
|
412
|
+
lines[i] = `${m[1]}${key}: ${pending.get(key)}`;
|
|
413
|
+
pending.delete(key);
|
|
414
|
+
touched += 1;
|
|
415
|
+
}
|
|
416
|
+
if (pending.size === 0) return touched;
|
|
417
|
+
|
|
418
|
+
// ② 缺失的键: 找本条目自己的 `config:` 行(缩进 = childIndent, 避免命中嵌套的 groupAdmin 等)
|
|
419
|
+
let cfgLine = -1;
|
|
420
|
+
for (let i = headIdx + 1; i < end; i += 1) {
|
|
421
|
+
if (new RegExp(`^\\s{${childIndent}}config:\\s*$`).test(lines[i])) { cfgLine = i; break; }
|
|
422
|
+
}
|
|
423
|
+
const keyIndent = childIndent + 2; // config 下子键的缩进
|
|
424
|
+
const addLines = [];
|
|
425
|
+
for (const [key, val] of pending) {
|
|
426
|
+
// disabled 属于条目层(childIndent), 也放这里 —— YAML 不要求键顺序
|
|
427
|
+
addLines.push(`${' '.repeat(key === 'disabled' ? childIndent : keyIndent)}${key}: ${val}`);
|
|
428
|
+
}
|
|
429
|
+
if (cfgLine >= 0) {
|
|
430
|
+
// 找 config: 之下最后一个同级键(含其子块), 插在后面。
|
|
431
|
+
// 注意: 同级键的缩进 == keyIndent(不是 >), 用 >= 才能走到最后一个键;
|
|
432
|
+
// 带子块的键(如 groupAdmin:) 其子行缩进 > keyIndent 也要一并跨过。
|
|
433
|
+
let scan = cfgLine + 1;
|
|
434
|
+
let lastLine = cfgLine;
|
|
435
|
+
while (scan < end) {
|
|
436
|
+
const blank = lines[scan].trim() === '';
|
|
437
|
+
const ind = ((lines[scan].match(/^\s*/) ?? [''])[0]).length;
|
|
438
|
+
if (!blank && ind >= keyIndent) { lastLine = scan; scan += 1; continue; }
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
lines.splice(lastLine + 1, 0, ...addLines);
|
|
442
|
+
} else {
|
|
443
|
+
// 没有 config: —— 在块头后补一个 config: 再放键
|
|
444
|
+
let insertAt = end;
|
|
445
|
+
for (let i = headIdx + 1; i < end; i += 1) {
|
|
446
|
+
const ind = ((lines[i].match(/^\s*/) ?? [''])[0]).length;
|
|
447
|
+
if (lines[i].trim() !== '' && ind <= headIndent && /- /.test(lines[i])) { insertAt = i; break; }
|
|
448
|
+
}
|
|
449
|
+
lines.splice(insertAt, 0, `${' '.repeat(childIndent)}config:`, ...addLines);
|
|
450
|
+
}
|
|
451
|
+
return touched + addLines.length;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
|
|
382
455
|
/** 保存实例清单(全量同步; 行级重建, 其它插件行/注释原样保留)
|
|
383
456
|
* 借鉴 dsh-qqbot-panel(2026-09-06): appSecret 空值/掩码(********) = 保留原值,
|
|
384
457
|
* 只有提供全新非掩码值才覆盖 —— 前端只回显掩码, 不会因漏传/未改而误清 secret。
|
|
385
458
|
* ⚠️ 2026-09-09: dataRoot 同理 —— 前端不编辑它, 保存时必须保留原值,
|
|
386
|
-
* 否则 accounts/save 会把 patch.yml 里的 dataRoot 覆盖掉(图库路径回退 cwd 的根因)。
|
|
459
|
+
* 否则 accounts/save 会把 patch.yml 里的 dataRoot 覆盖掉(图库路径回退 cwd 的根因)。
|
|
460
|
+
* ⚠️ 2026-09-10: 已存在的条目改为"原地只更新字段", 不再整块重建(见 updateKeysInBlock 注释)。 */
|
|
387
461
|
function saveInstances(instances) {
|
|
388
462
|
const { raw, hasFile, bots } = parsePatch();
|
|
389
463
|
if (!hasFile) return { ok: false, error: '找不到 cordis.patch.yml(仅 web profile 支持)' };
|
|
390
464
|
const lines = raw.split('\n');
|
|
391
|
-
const
|
|
465
|
+
const removals = [];
|
|
466
|
+
const updates = [];
|
|
467
|
+
const appends = [];
|
|
392
468
|
const targetIds = new Set(instances.filter((x) => !x.remove).map((x) => String(x.id)));
|
|
393
|
-
|
|
394
|
-
|
|
469
|
+
// 删除: 只删「没被提交的机器人条目」或显式 remove 的条目, 且范围严格限定在该条目自身:
|
|
470
|
+
// 起点 = 它自己的 `- id:` 行(headLine, 不是包裹它的 `- insert:` 行),
|
|
471
|
+
// 终点 = 下一个同级机器人条目的 headLine(或该 insert 块结束)。
|
|
472
|
+
// ⚠️ 2026-09-10 事故一: 原用 { start: b.start }(insert 包装时为 `- insert:` 行) 且 end 取块末,
|
|
473
|
+
// 导致同一 insert 下的其它插件条目(mcp-chrome)被连带删除。现改为按 headLine 精确切分。
|
|
474
|
+
// ⚠️ 2026-09-10 事故二: 前端把"空骨架实例"(如用于禁用幽灵 im-qqbot 的 `- id: im-qqbot`
|
|
475
|
+
// + disabled: true, appId/appSecret 均为空)过滤掉不提交 → 会被当成"要删除"而误删,
|
|
476
|
+
// 删掉后下次启动又触发扫码。故: 无凭据(appId/appSecret 皆空)的条目一律保留, 不参与自动删除。
|
|
477
|
+
const removeIds = new Set(instances.filter((x) => x.remove).map((x) => String(x.id)));
|
|
478
|
+
const doomed = bots.filter((b) => {
|
|
479
|
+
if (removeIds.has(b.id)) return true;
|
|
480
|
+
if (targetIds.has(b.id)) return false;
|
|
481
|
+
const hasCred = !!(b.cfg?.appId || b.cfg?.appSecret);
|
|
482
|
+
return hasCred;
|
|
483
|
+
});
|
|
484
|
+
for (const b of doomed) {
|
|
485
|
+
const sameGroup = bots
|
|
486
|
+
.filter((o) => o !== b && o.ins === b.ins && o.start === b.start && o.headLine > b.headLine)
|
|
487
|
+
.sort((x, y) => x.headLine - y.headLine);
|
|
488
|
+
const nextHead = sameGroup.length ? sameGroup[0].headLine : b.end;
|
|
489
|
+
let tail = nextHead;
|
|
490
|
+
while (tail > b.headLine + 1 && (lines[tail - 1] ?? '').trim() === '') tail -= 1;
|
|
491
|
+
removals.push({ start: b.headLine, end: tail });
|
|
395
492
|
}
|
|
396
493
|
for (const inst of instances) {
|
|
397
494
|
if (inst.remove) continue;
|
|
398
|
-
const
|
|
399
|
-
const orig = bots.find((b) => b.id === inst.id);
|
|
495
|
+
const orig = bots.find((b) => b.id === String(inst.id));
|
|
400
496
|
// 掩码/空 → 保留原 secret(仅当原值存在; 全新账号本就无原值则维持空)
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
else inst.appSecret = '';
|
|
404
|
-
}
|
|
497
|
+
let secret = String(inst.appSecret ?? '');
|
|
498
|
+
if (!secret || secret === SECRET_MASK) secret = orig?.cfg?.appSecret ? String(orig.cfg.appSecret) : '';
|
|
405
499
|
// 前端不编辑 dataRoot → 保留原值(2026-09-09: 曾因保存覆盖丢失导致图库路径回退 cwd)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
500
|
+
let dataRoot = inst.dataRoot;
|
|
501
|
+
if (dataRoot === undefined && orig?.cfg?.dataRoot) dataRoot = orig.cfg.dataRoot;
|
|
502
|
+
|
|
503
|
+
if (orig) {
|
|
504
|
+
const kv = {};
|
|
505
|
+
if (inst.appId !== undefined) kv.appId = yq(String(inst.appId));
|
|
506
|
+
if (secret) kv.appSecret = ysec(secret);
|
|
507
|
+
if (inst.preset !== undefined && String(inst.preset) !== '') kv.preset = yq(String(inst.preset));
|
|
508
|
+
if (inst.cwd !== undefined && String(inst.cwd) !== '') kv.cwd = yq(String(inst.cwd));
|
|
509
|
+
if (inst.disabled !== undefined) kv.disabled = inst.disabled ? 'true' : 'false';
|
|
510
|
+
updates.push({ id: String(inst.id), kv });
|
|
511
|
+
} else {
|
|
512
|
+
appends.push(renderBotBlock({ ...inst, appSecret: secret, dataRoot }));
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// 先删块(倒序), 再逐条原地改字段。
|
|
516
|
+
// ⚠️ 每次更新前重新 parsePatch 取最新下标: splice 过(删除或插入新键)之后,
|
|
517
|
+
// 之前算好的 start/end 会错位, 曾导致插入落到错误缩进上把 YAML 写坏。
|
|
518
|
+
for (const r of removals.sort((a, b) => b.start - a.start)) lines.splice(r.start, r.end - r.start);
|
|
519
|
+
for (const u of updates) {
|
|
520
|
+
let fresh = null;
|
|
521
|
+
try {
|
|
522
|
+
const reparsed = parsePatchFrom(lines.join('\n'));
|
|
523
|
+
fresh = reparsed.bots.find((b) => b.id === u.id) ?? null;
|
|
524
|
+
} catch { fresh = null; }
|
|
525
|
+
if (!fresh) continue;
|
|
526
|
+
updateKeysInBlock(lines, fresh.start, fresh.end, u.kv);
|
|
410
527
|
}
|
|
411
|
-
edits.filter((e) => e.start !== undefined).sort((a, b) => b.start - a.start).forEach((e) => {
|
|
412
|
-
if (e.text === null) lines.splice(e.start, e.end - e.start);
|
|
413
|
-
else lines.splice(e.start, e.end - e.start, ...e.text.split('\n'));
|
|
414
|
-
});
|
|
415
528
|
let out = lines.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
|
|
416
|
-
|
|
417
|
-
if (appendParts.length) out += (out ? '\n' : '') + appendParts.join('\n') + '\n';
|
|
529
|
+
if (appends.length) out += (out.trimEnd() ? '\n' : '') + appends.join('\n') + '\n';
|
|
418
530
|
writeFileSync(`${PATCH_FILE}.bak`, raw, 'utf8');
|
|
419
531
|
writeFileSync(PATCH_FILE, out, 'utf8');
|
|
420
532
|
return { ok: true, file: PATCH_FILE, needRestart: true };
|
|
421
533
|
}
|
|
422
534
|
|
|
535
|
+
|
|
423
536
|
// 账号列表(多账号: 每条带 settings ns 与数据目录, 供二级 UI 按账号读写)
|
|
424
537
|
// 借鉴 zhengjy01/dsh-qqbot-panel(2026-09-06): appSecret 只回显掩码(不泄露明文),
|
|
425
538
|
// 并带 hasSecret 供前端区分"已保存"与"真空"; 保存时空值/掩码 = 保留原 secret。
|