@jsbot-tellus/core 2.0.3 → 2.1.0
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/README.md +13 -17
- package/dist/app.js +12 -40
- package/dist/app.js.map +1 -1
- package/dist/core/config/schema.d.ts +0 -2
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +0 -1
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/dispatch/command.d.ts +24 -2
- package/dist/core/dispatch/command.d.ts.map +1 -1
- package/dist/core/dispatch/command.js +297 -60
- package/dist/core/dispatch/command.js.map +1 -1
- package/dist/core/dispatch/router.d.ts +17 -3
- package/dist/core/dispatch/router.d.ts.map +1 -1
- package/dist/core/dispatch/router.js +38 -2
- package/dist/core/dispatch/router.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/plugin/command-params.d.ts +15 -0
- package/dist/core/plugin/command-params.d.ts.map +1 -0
- package/dist/core/plugin/command-params.js +427 -0
- package/dist/core/plugin/command-params.js.map +1 -0
- package/dist/core/plugin/context.d.ts.map +1 -1
- package/dist/core/plugin/context.js +27 -0
- package/dist/core/plugin/context.js.map +1 -1
- package/dist/core/plugin/install-dir.d.ts +6 -9
- package/dist/core/plugin/install-dir.d.ts.map +1 -1
- package/dist/core/plugin/install-dir.js +99 -79
- package/dist/core/plugin/install-dir.js.map +1 -1
- package/dist/core/plugin/install-validate.d.ts +2 -1
- package/dist/core/plugin/install-validate.d.ts.map +1 -1
- package/dist/core/plugin/install-validate.js +25 -17
- package/dist/core/plugin/install-validate.js.map +1 -1
- package/dist/core/plugin/installer.d.ts +3 -3
- package/dist/core/plugin/installer.d.ts.map +1 -1
- package/dist/core/plugin/installer.js +143 -140
- package/dist/core/plugin/installer.js.map +1 -1
- package/dist/core/plugin/loader.d.ts +1 -0
- package/dist/core/plugin/loader.d.ts.map +1 -1
- package/dist/core/plugin/loader.js +24 -2
- package/dist/core/plugin/loader.js.map +1 -1
- package/dist/core/plugin/types.d.ts +11 -3
- package/dist/core/plugin/types.d.ts.map +1 -1
- package/dist/core/plugin/types.js.map +1 -1
- package/dist/plugins/admin/index.d.ts.map +1 -1
- package/dist/plugins/admin/index.js +119 -86
- package/dist/plugins/admin/index.js.map +1 -1
- package/dist/plugins/core/index.d.ts.map +1 -1
- package/dist/plugins/core/index.js +4 -1
- package/dist/plugins/core/index.js.map +1 -1
- package/docs/architecture.md +22 -24
- package/docs/configuration.md +19 -23
- package/docs/feature-parity.md +4 -4
- package/docs/migration.md +13 -13
- package/docs/plugin-api.md +156 -26
- package/docs/plugin-development.md +390 -0
- package/docs/release.md +2 -2
- package/examples/plugins/hello/README.md +10 -5
- package/examples/plugins/hello/index.js +3 -6
- package/package.json +2 -1
- package/src/app.ts +16 -55
- package/src/core/config/schema.ts +0 -1
- package/src/core/dispatch/command.ts +474 -70
- package/src/core/dispatch/router.ts +77 -3
- package/src/core/index.ts +2 -0
- package/src/core/plugin/command-params.ts +595 -0
- package/src/core/plugin/context.ts +47 -2
- package/src/core/plugin/install-dir.ts +117 -111
- package/src/core/plugin/install-validate.ts +36 -34
- package/src/core/plugin/installer.ts +228 -184
- package/src/core/plugin/loader.ts +36 -2
- package/src/core/plugin/types.ts +23 -3
- package/src/plugins/admin/index.ts +302 -233
- package/src/plugins/core/index.ts +5 -1
- package/dist/core/plugin/installed.d.ts +0 -9
- package/dist/core/plugin/installed.d.ts.map +0 -1
- package/dist/core/plugin/installed.js +0 -113
- package/dist/core/plugin/installed.js.map +0 -1
- package/src/core/plugin/installed.ts +0 -165
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { definePlugin } from '../../core/index.js';
|
|
3
|
+
const INSTALLER_DISABLED = '插件安装功能未启用(installer.enabled=false)。';
|
|
3
4
|
const PLUGIN_USAGE = `用法:
|
|
4
5
|
/plugin install <npm包[@版本|tag]>
|
|
5
6
|
/plugin list
|
|
@@ -21,50 +22,49 @@ export const adminPlugin = definePlugin({
|
|
|
21
22
|
configSchema: z.object({}).strict(),
|
|
22
23
|
},
|
|
23
24
|
setup(ctx) {
|
|
24
|
-
ctx.commands.
|
|
25
|
+
ctx.commands.group({
|
|
25
26
|
name: 'utter',
|
|
26
27
|
permission: 'Admin',
|
|
27
28
|
description: '向当前会话发送文本',
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
29
|
+
handler: async (_event, context, match) => {
|
|
30
|
+
if (!match.rest) {
|
|
31
|
+
await context.send('用法:/utter <文本>');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
await context.send(match.rest, {
|
|
35
|
+
quote: false,
|
|
36
|
+
autoEscape: true,
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
}, (utter) => {
|
|
40
|
+
utter.register({
|
|
41
|
+
name: 'raw',
|
|
42
|
+
permission: 'SuperAdmin',
|
|
43
|
+
description: '发送原始 CQ 消息',
|
|
44
|
+
}, async (_event, context, match) => {
|
|
45
|
+
if (!match.rest) {
|
|
46
|
+
await context.send('用法:/utter raw <CQ 消息>');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
await context.send(match.rest, {
|
|
50
|
+
quote: false,
|
|
51
|
+
autoEscape: false,
|
|
52
|
+
});
|
|
50
53
|
});
|
|
51
54
|
});
|
|
52
|
-
ctx.commands.
|
|
55
|
+
ctx.commands.group({
|
|
53
56
|
name: 'plugin',
|
|
54
57
|
permission: 'SuperAdmin',
|
|
55
58
|
description: '管理已安装的插件包',
|
|
56
|
-
|
|
57
|
-
const sub = (match.args[0] ?? '').toLowerCase();
|
|
58
|
-
const argument = match.rest
|
|
59
|
-
.slice(match.args[0]?.length ?? 0)
|
|
60
|
-
.trim();
|
|
61
|
-
const installer = ctx.core.installer;
|
|
62
|
-
const sessionId = context.sessionId;
|
|
63
|
-
if (sub.length === 0 || sub === 'help') {
|
|
59
|
+
handler: async (_event, context) => {
|
|
64
60
|
await context.send(PLUGIN_USAGE, { quote: false });
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
},
|
|
62
|
+
}, (plugin) => {
|
|
63
|
+
plugin.register({
|
|
64
|
+
name: 'list',
|
|
65
|
+
description: '列出已安装的插件包',
|
|
66
|
+
}, async (_event, context) => {
|
|
67
|
+
const installer = ctx.core.installer;
|
|
68
68
|
try {
|
|
69
69
|
const packages = await installer.list();
|
|
70
70
|
if (packages.length === 0) {
|
|
@@ -74,7 +74,9 @@ export const adminPlugin = definePlugin({
|
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
76
|
const lines = packages.map((item) => {
|
|
77
|
-
const status = item.loaded
|
|
77
|
+
const status = item.loaded
|
|
78
|
+
? '已加载'
|
|
79
|
+
: '重启后生效';
|
|
78
80
|
return `- ${item.packageName}@${item.version} → ${formatIds(item.pluginIds)}(${status})`;
|
|
79
81
|
});
|
|
80
82
|
await context.send([
|
|
@@ -85,17 +87,20 @@ export const adminPlugin = definePlugin({
|
|
|
85
87
|
catch (error) {
|
|
86
88
|
await context.send(`❌ 读取插件包失败:${errorMessage(error)}`, { quote: false });
|
|
87
89
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
90
|
+
});
|
|
91
|
+
plugin.register({
|
|
92
|
+
name: 'install',
|
|
93
|
+
description: '安装 npm 插件包',
|
|
94
|
+
}, async (_event, context, match) => {
|
|
95
|
+
const installer = ctx.core.installer;
|
|
96
|
+
const sessionId = context.sessionId;
|
|
97
|
+
if (!installer.enabled) {
|
|
98
|
+
await context.send(INSTALLER_DISABLED, {
|
|
99
|
+
quote: false,
|
|
100
|
+
});
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const argument = match.rest.trim();
|
|
99
104
|
if (argument.length === 0) {
|
|
100
105
|
await context.send('用法:/plugin install <npm包[@版本|tag]>', { quote: false });
|
|
101
106
|
return;
|
|
@@ -126,9 +131,20 @@ export const adminPlugin = definePlugin({
|
|
|
126
131
|
await ctx.api.send(sessionId, `❌ 安装失败:${errorMessage(error)}`, { quote: false });
|
|
127
132
|
}
|
|
128
133
|
});
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
134
|
+
});
|
|
135
|
+
plugin.register({
|
|
136
|
+
name: 'remove',
|
|
137
|
+
description: '卸载插件包',
|
|
138
|
+
}, async (_event, context, match) => {
|
|
139
|
+
const installer = ctx.core.installer;
|
|
140
|
+
const sessionId = context.sessionId;
|
|
141
|
+
if (!installer.enabled) {
|
|
142
|
+
await context.send(INSTALLER_DISABLED, {
|
|
143
|
+
quote: false,
|
|
144
|
+
});
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const argument = match.rest.trim();
|
|
132
148
|
if (argument.length === 0) {
|
|
133
149
|
await context.send('用法:/plugin remove <包名|插件id> [--force]', { quote: false });
|
|
134
150
|
return;
|
|
@@ -147,7 +163,9 @@ export const adminPlugin = definePlugin({
|
|
|
147
163
|
ctx.tasks.enqueue('plugin-installer', async (signal) => {
|
|
148
164
|
try {
|
|
149
165
|
const result = await installer.remove(target, signal, { force });
|
|
150
|
-
const lines = [
|
|
166
|
+
const lines = [
|
|
167
|
+
`✅ 已卸载 ${result.packageName}。`,
|
|
168
|
+
];
|
|
151
169
|
if (result.pluginIds.length > 0) {
|
|
152
170
|
lines.push(`插件 id: ${formatIds(result.pluginIds)}`);
|
|
153
171
|
}
|
|
@@ -171,44 +189,59 @@ export const adminPlugin = definePlugin({
|
|
|
171
189
|
await ctx.api.send(sessionId, `❌ 卸载失败:${errorMessage(error)}`, { quote: false });
|
|
172
190
|
}
|
|
173
191
|
});
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const warnings = result.updated.flatMap((item) => item.warnings);
|
|
184
|
-
for (const item of result.updated) {
|
|
185
|
-
lines.push(`✅ ${item.packageName}@${item.version}(插件 id: ${formatIds(item.pluginIds)})`);
|
|
186
|
-
}
|
|
187
|
-
for (const item of result.failed) {
|
|
188
|
-
lines.push(`❌ ${item.packageName}:${item.message}`);
|
|
189
|
-
}
|
|
190
|
-
for (const warning of warnings) {
|
|
191
|
-
lines.push(`⚠️ ${warning}`);
|
|
192
|
-
}
|
|
193
|
-
if (lines.length === 0) {
|
|
194
|
-
lines.push('没有可更新的插件包。');
|
|
195
|
-
}
|
|
196
|
-
if (result.updated.length > 0) {
|
|
197
|
-
lines.push(warnings.length === 0
|
|
198
|
-
? '正在重启。'
|
|
199
|
-
: '请处理以上问题后手动重启。');
|
|
200
|
-
}
|
|
201
|
-
await ctx.api.send(sessionId, lines.join('\n'), {
|
|
192
|
+
});
|
|
193
|
+
plugin.register({
|
|
194
|
+
name: 'update',
|
|
195
|
+
description: '更新插件包',
|
|
196
|
+
}, async (_event, context, match) => {
|
|
197
|
+
const installer = ctx.core.installer;
|
|
198
|
+
const sessionId = context.sessionId;
|
|
199
|
+
if (!installer.enabled) {
|
|
200
|
+
await context.send(INSTALLER_DISABLED, {
|
|
202
201
|
quote: false,
|
|
203
202
|
});
|
|
204
|
-
|
|
205
|
-
warnings.length === 0) {
|
|
206
|
-
ctx.core.restart();
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
await ctx.api.send(sessionId, `❌ 更新失败:${errorMessage(error)}`, { quote: false });
|
|
203
|
+
return;
|
|
211
204
|
}
|
|
205
|
+
const argument = match.rest.trim();
|
|
206
|
+
await context.send(argument.length > 0
|
|
207
|
+
? `正在更新 ${argument} ...`
|
|
208
|
+
: '正在更新全部插件包 ...', { quote: false });
|
|
209
|
+
ctx.tasks.enqueue('plugin-installer', async (signal) => {
|
|
210
|
+
try {
|
|
211
|
+
const result = await installer.update(argument.length > 0
|
|
212
|
+
? argument
|
|
213
|
+
: undefined, signal);
|
|
214
|
+
const lines = [];
|
|
215
|
+
const warnings = result.updated.flatMap((item) => item.warnings);
|
|
216
|
+
for (const item of result.updated) {
|
|
217
|
+
lines.push(`✅ ${item.packageName}@${item.version}(插件 id: ${formatIds(item.pluginIds)})`);
|
|
218
|
+
}
|
|
219
|
+
for (const item of result.failed) {
|
|
220
|
+
lines.push(`❌ ${item.packageName}:${item.message}`);
|
|
221
|
+
}
|
|
222
|
+
for (const warning of warnings) {
|
|
223
|
+
lines.push(`⚠️ ${warning}`);
|
|
224
|
+
}
|
|
225
|
+
if (lines.length === 0) {
|
|
226
|
+
lines.push('没有可更新的插件包。');
|
|
227
|
+
}
|
|
228
|
+
if (result.updated.length > 0) {
|
|
229
|
+
lines.push(warnings.length === 0
|
|
230
|
+
? '正在重启。'
|
|
231
|
+
: '请处理以上问题后手动重启。');
|
|
232
|
+
}
|
|
233
|
+
await ctx.api.send(sessionId, lines.join('\n'), {
|
|
234
|
+
quote: false,
|
|
235
|
+
});
|
|
236
|
+
if (result.updated.length > 0 &&
|
|
237
|
+
warnings.length === 0) {
|
|
238
|
+
ctx.core.restart();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
await ctx.api.send(sessionId, `❌ 更新失败:${errorMessage(error)}`, { quote: false });
|
|
243
|
+
}
|
|
244
|
+
});
|
|
212
245
|
});
|
|
213
246
|
});
|
|
214
247
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/admin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,YAAY,GAAG;;;;oBAID,CAAA;AAEpB,SAAS,YAAY,CAAC,KAAc;IAChC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACjE,CAAC;AAED,SAAS,SAAS,CAAC,SAAmB;IAClC,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AAC9D,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;IACpC,QAAQ,EAAE;QACN,EAAE,EAAE,OAAO;QACX,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,iCAAiC;QAC9C,QAAQ,EAAE,GAAG;QACb,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;KACtC;IAED,KAAK,CAAC,GAAG;QACL,GAAG,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/admin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/core/index.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/core/index.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,UAAU,6EAyFrB,CAAA"}
|
|
@@ -34,6 +34,9 @@ export const corePlugin = definePlugin({
|
|
|
34
34
|
.list()
|
|
35
35
|
.filter((command) => ctx.core.roles.can(role, command.permission))
|
|
36
36
|
.map((command) => {
|
|
37
|
+
const usage = command.usage !== undefined
|
|
38
|
+
? ` ${command.usage}`
|
|
39
|
+
: '';
|
|
37
40
|
const aliases = command.aliases.length > 0
|
|
38
41
|
? ` (${command.aliases
|
|
39
42
|
.map((alias) => `/${alias}`)
|
|
@@ -42,7 +45,7 @@ export const corePlugin = definePlugin({
|
|
|
42
45
|
const description = command.description
|
|
43
46
|
? ` - ${command.description}`
|
|
44
47
|
: '';
|
|
45
|
-
return `/${command.name}${aliases}${description}`;
|
|
48
|
+
return `/${command.name}${usage}${aliases}${description}`;
|
|
46
49
|
});
|
|
47
50
|
await context.send(`可用命令:\n${commands.join('\n')}`);
|
|
48
51
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,SAAS,YAAY,CAAC,EAAU;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAA;IAEjC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO,GAAG,CAAA;IAC9C,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAA;IACpC,CAAC;IAED,OAAO,GAAG,OAAO,GAAG,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;IACnC,QAAQ,EAAE;QACN,EAAE,EAAE,MAAM;QACV,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,mCAAmC;QAChD,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;KACtC;IACD,KAAK,CAAC,GAAG;QACL,GAAG,CAAC,QAAQ,CAAC,QAAQ,CACjB;YACI,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC,GAAG,CAAC;YACd,UAAU,EAAE,MAAM;YAClB,WAAW,EAAE,QAAQ;SACxB,EACD,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACjD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ;iBAC7B,IAAI,EAAE;iBACN,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAChB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAC/C;iBACA,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACb,MAAM,OAAO,GACT,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBACtB,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO;yBACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;yBAC3B,IAAI,CAAC,IAAI,CAAC,GAAG;oBACpB,CAAC,CAAC,EAAE,CAAA;gBACZ,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW;oBACnC,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE;oBAC7B,CAAC,CAAC,EAAE,CAAA;gBAER,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,OAAO,GAAG,WAAW,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/core/index.ts"],"names":[],"mappings":"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"}
|
package/docs/architecture.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
```text
|
|
6
6
|
src/plugins/* -> src/core/index.ts 的公共 API(内置插件)
|
|
7
|
-
|
|
7
|
+
本地/npm 插件包 -> @jsbot-tellus/core 的公共 API
|
|
8
8
|
src/core/* -> SDK adapter、Node 内置模块、SQLite
|
|
9
9
|
src/core/* -X-> src/plugins/*
|
|
10
10
|
```
|
|
@@ -16,8 +16,8 @@ src/core/* -X-> src/plugins/*
|
|
|
16
16
|
- 插件只能通过 `PluginContext`、`EventContext` 和 `BotApi` 使用能力。
|
|
17
17
|
- `core` 不 import 任何插件;`core`、`admin` 在 `src/plugins/index.ts` 显式注册。
|
|
18
18
|
- 内置插件是普通源码,随内核一起编译;没有独立依赖,不单独建包。
|
|
19
|
-
-
|
|
20
|
-
- 本地插件放在不跟踪的 `plugins
|
|
19
|
+
- 本地插件由 `src/app.ts` 在启动前扫描 `plugins/<id>/dist` 并追加到内置插件之后。
|
|
20
|
+
- 本地插件放在不跟踪的 `plugins/`,每个插件是独立包,构建后自动加载。
|
|
21
21
|
|
|
22
22
|
## 运行时主链路
|
|
23
23
|
|
|
@@ -25,7 +25,7 @@ src/core/* -X-> src/plugins/*
|
|
|
25
25
|
SDK WebSocket
|
|
26
26
|
-> client.use(router.dispatch)
|
|
27
27
|
-> Router 中间件(按 priority 降序,逐插件 gating)
|
|
28
|
-
-> CommandRegistry.match
|
|
28
|
+
-> CommandRegistry.match(前缀最长优先,完整路径最长优先)
|
|
29
29
|
-> 命中命令:stopPropagation
|
|
30
30
|
-> 插件启用 / 群组 / 私聊 gating
|
|
31
31
|
-> 权限检查
|
|
@@ -48,7 +48,7 @@ src/
|
|
|
48
48
|
config/ 配置 schema 和加载
|
|
49
49
|
dispatch/
|
|
50
50
|
router.ts 唯一 SDK middleware
|
|
51
|
-
command.ts
|
|
51
|
+
command.ts 命令索引、组注册、多级匹配和冲突检测
|
|
52
52
|
handler.ts 事件 handler 注册表
|
|
53
53
|
middleware.ts 插件中间件注册表
|
|
54
54
|
task-queue.ts 按 key 串行任务队列
|
|
@@ -58,14 +58,14 @@ src/
|
|
|
58
58
|
host.ts 插件排序、配置校验、setup/start/stop
|
|
59
59
|
gating.ts enabled/private/groups
|
|
60
60
|
kv.ts SQLite KV
|
|
61
|
-
loader.ts
|
|
61
|
+
loader.ts 本地插件目录加载
|
|
62
62
|
security/ 角色、权限、拒绝提示
|
|
63
63
|
messaging/ reply/forward 发送和回复分段
|
|
64
64
|
storage/ SQLite 和 Session
|
|
65
65
|
lifecycle/ 启动/停止状态机
|
|
66
66
|
plugins/
|
|
67
67
|
core/index.ts /help、/status、/role
|
|
68
|
-
admin/index.ts /utter、/utter
|
|
68
|
+
admin/index.ts /utter、/utter raw
|
|
69
69
|
index.ts 内置插件清单
|
|
70
70
|
plugins/ 本地插件根目录,整个目录不跟踪
|
|
71
71
|
poke/
|
|
@@ -75,7 +75,7 @@ plugins/ 本地插件根目录,整个目录不跟踪
|
|
|
75
75
|
## 启动顺序
|
|
76
76
|
|
|
77
77
|
```text
|
|
78
|
-
|
|
78
|
+
加载配置和本地插件
|
|
79
79
|
-> 打开数据库
|
|
80
80
|
-> 创建 Kernel
|
|
81
81
|
-> 创建 Router、PluginGate、SessionStore、TaskQueue、BotApi
|
|
@@ -128,24 +128,21 @@ npm run smoke # node dist/app.js --help
|
|
|
128
128
|
npm install --prefix plugins/poke
|
|
129
129
|
npm install --prefix plugins/llm
|
|
130
130
|
npm run build:local
|
|
131
|
-
node dist/app.js
|
|
132
|
-
--plugin-dir plugins/poke/dist \
|
|
133
|
-
--plugin-dir plugins/llm/dist
|
|
131
|
+
node dist/app.js
|
|
134
132
|
```
|
|
135
133
|
|
|
136
|
-
|
|
134
|
+
应用会固定扫描 `plugins/<id>/dist`,并跳过与内置插件同 ID 的本地插件,避免重复注册。没有 `dist` 的插件目录会被跳过并记录警告。
|
|
137
135
|
|
|
138
136
|
## 在线安装插件
|
|
139
137
|
|
|
140
|
-
`admin` 插件注册 `/plugin`
|
|
138
|
+
`admin` 插件注册 `/plugin` 指令组,通过 `ctx.core.installer` 调用 `NpmPluginInstaller`。安装器位于 `src/core/plugin/`:
|
|
141
139
|
|
|
142
140
|
```text
|
|
143
141
|
spec.ts 解析并校验 npm 包名 / 精确版本 / dist-tag
|
|
144
142
|
npm-runner.ts execFile 调用 npm,支持超时和取消
|
|
145
|
-
install-dir.ts
|
|
146
|
-
install-validate.ts
|
|
147
|
-
installer.ts 安装 / 列表 / 卸载 /
|
|
148
|
-
installed.ts 启动时从安装目录加载已安装包
|
|
143
|
+
install-dir.ts plugins/ 的安装状态、校验脚本和 @jsbot-tellus/core 链接
|
|
144
|
+
install-validate.ts 在子进程中扫描插件 dist,确认它导出插件定义
|
|
145
|
+
installer.ts 安装 / 列表 / 卸载 / 更新、串行化、目录替换与回滚
|
|
149
146
|
```
|
|
150
147
|
|
|
151
148
|
安装流程:
|
|
@@ -153,17 +150,18 @@ installed.ts 启动时从安装目录加载已安装包
|
|
|
153
150
|
```text
|
|
154
151
|
/plugin install <spec>
|
|
155
152
|
-> 校验 npm registry 来源和允许列表
|
|
156
|
-
-> npm install <spec> --save-exact [--ignore-scripts]
|
|
157
|
-
->
|
|
158
|
-
->
|
|
153
|
+
-> 在 plugins/.staging-<uuid> 中 npm install <spec> --save-exact [--ignore-scripts]
|
|
154
|
+
-> 把包内容移到插件目录根,依赖留在 <插件目录>/node_modules
|
|
155
|
+
-> 创建 <插件目录>/node_modules/@jsbot-tellus/core 链接
|
|
156
|
+
-> 子进程扫描 dist,收集 manifest.id / version / dependencies
|
|
159
157
|
-> 检查 id 冲突和完整依赖图(缺失、自依赖、循环)
|
|
160
|
-
->
|
|
161
|
-
->
|
|
158
|
+
-> 原子替换 plugins/<插件id>,写入 plugins/.jsbot-installed.json
|
|
159
|
+
-> 自动重建运行时,由同一个本地插件加载器重新加载
|
|
162
160
|
```
|
|
163
161
|
|
|
164
|
-
|
|
162
|
+
安装或校验失败时目标目录不会被替换;更新会先用暂存目录完成下载和校验,再替换旧目录。所有安装操作通过内部队列串行执行。状态文件损坏时安装器会明确报错,不会用空状态覆盖其它包记录。
|
|
165
163
|
|
|
166
|
-
|
|
164
|
+
启动时加载顺序是内置插件 → `plugins/` 中的全部目录(本地插件和在线安装的插件没有区别)。重复 ID 保留先加载的插件并记录警告。安装器不直接修改运行中的插件状态;操作成功后由应用重建运行时并重新加载。卸载时如果检测到配置残留,会跳过自动重启并提示手动处理;如果其它已安装包依赖被卸载的插件,默认拒绝卸载,`--force` 可强制继续。安装器默认关闭,安装的插件是完全可信的宿主进程代码。
|
|
167
165
|
|
|
168
166
|
## 测试边界
|
|
169
167
|
|
package/docs/configuration.md
CHANGED
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## 路径和优先级
|
|
4
4
|
|
|
5
|
-
| 项目 | CLI
|
|
6
|
-
| -------- |
|
|
7
|
-
| 配置文件 | `--config`
|
|
8
|
-
| 数据目录 | `--data-dir`
|
|
9
|
-
| 日志级别 | `--log-level`
|
|
10
|
-
| 插件目录 | `--plugin-dir` | `BOT_PLUGIN_DIR` | 无 |
|
|
5
|
+
| 项目 | CLI | 环境变量 | 默认值 |
|
|
6
|
+
| -------- | ------------- | --------------- | ------------------- |
|
|
7
|
+
| 配置文件 | `--config` | `BOT_CONFIG` | `./bot.config.json` |
|
|
8
|
+
| 数据目录 | `--data-dir` | `BOT_DATA_DIR` | `./data` |
|
|
9
|
+
| 日志级别 | `--log-level` | `BOT_LOG_LEVEL` | `info` |
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
本地插件目录固定为 `./plugins`,不提供 CLI 或环境变量覆盖;每个插件从 `./plugins/<id>/dist` 加载,相对路径按 `process.cwd()` 解析。
|
|
13
12
|
|
|
14
13
|
## 完整示例
|
|
15
14
|
|
|
@@ -68,7 +67,6 @@ npm 包会在宿主进程中执行,拥有与内核相同的文件系统、环
|
|
|
68
67
|
{
|
|
69
68
|
"installer": {
|
|
70
69
|
"enabled": true,
|
|
71
|
-
"dir": "data/plugins",
|
|
72
70
|
"registry": "https://registry.npmjs.org/",
|
|
73
71
|
"allowedPackages": ["@scope/*", "another-plugin"],
|
|
74
72
|
"allowScripts": false,
|
|
@@ -80,19 +78,20 @@ npm 包会在宿主进程中执行,拥有与内核相同的文件系统、环
|
|
|
80
78
|
| 字段 | 默认值 | 说明 |
|
|
81
79
|
| ----------------- | ----------------------------- | ------------------------------------------------------------------ |
|
|
82
80
|
| `enabled` | `false` | 为 `false` 时禁用安装、卸载和更新;列表仍可用(仍要求 SuperAdmin) |
|
|
83
|
-
| `dir` | `<data-dir>/plugins` | 安装目录,相对路径按 `process.cwd()` 解析 |
|
|
84
81
|
| `registry` | `https://registry.npmjs.org/` | npm registry,可换成镜像(如 npmmirror) |
|
|
85
82
|
| `allowedPackages` | `[]` | 允许安装的包;空表示不限制,支持精确名和 `@scope/*` |
|
|
86
83
|
| `allowScripts` | `false` | 为 `false` 时 npm 操作带 `--ignore-scripts` |
|
|
87
84
|
| `timeoutMs` | `120000` | 单次 npm/校验操作的超时,最大 600000 |
|
|
88
85
|
|
|
89
|
-
|
|
86
|
+
插件根目录固定为 `plugins/`,不能通过配置修改;旧配置中的 `installer.dir` 已被移除,继续保留会导致配置校验失败。安装器把包直接放到 `plugins/<插件id>/`,和本地插件使用同一个加载器;首次安装时,一个包导出多个插件会使用包名作为目录(例如 `@scope/bundle` 对应 `plugins/@scope__bundle/`)。插件自身在 `plugins/<目录>/dist`,运行时依赖在 `plugins/<目录>/node_modules`,不会放进共享的 `node_modules`。
|
|
90
87
|
|
|
91
|
-
|
|
88
|
+
`plugins/.jsbot-installed.json` 保存安装状态和包名到目录的映射,由内核维护,不要手动修改。安装、更新会先在临时目录完成下载和校验,再原子替换目标目录;失败时保留原目录。状态文件损坏会明确报错,不会静默清空。如果目标目录已存在但没有安装记录,安装会被拒绝,避免覆盖手动放在 `plugins/` 的本地插件。
|
|
89
|
+
|
|
90
|
+
安装器会在每个已安装插件目录创建 `node_modules/@jsbot-tellus/core` 链接,指向当前内核包。`@jsbot-tellus/core` 的入口是 `dist/core/index.js`,所以在线安装和加载已安装插件都需要先执行 `npm run build`;直接从 TypeScript 源码运行(`tsx`)时不要依赖安装器。
|
|
92
91
|
|
|
93
92
|
安装只接受 npm registry 包。以下来源会被拒绝:git/github 地址、`file:`、`http(s):`、`workspace:`、`link:`、本地路径和 semver 范围(`^`、`~`、`1.x`)。版本部分只接受精确版本或 dist-tag。
|
|
94
93
|
|
|
95
|
-
|
|
94
|
+
安装、更新、卸载成功后会自动重建运行时并重新加载插件,不需要手动重启,进程本身不会退出。卸载时如果配置里仍有对应插件 ID,会给出警告并跳过自动重启;如果其它已安装包依赖被卸载的插件 ID,默认拒绝卸载,需要确认后使用 `/plugin remove <目标> --force`。安装和更新会检查完整依赖图,拒绝自依赖、循环依赖和缺失依赖。启动时把内置插件和 `plugins/` 中的全部目录一起加载;出现重复插件 ID 时保留先加载的插件并记录警告。
|
|
96
95
|
|
|
97
96
|
## 插件公共信封
|
|
98
97
|
|
|
@@ -141,19 +140,18 @@ npm 包会在宿主进程中执行,拥有与内核相同的文件系统、环
|
|
|
141
140
|
```
|
|
142
141
|
|
|
143
142
|
- `/utter <文本>`:Admin 权限,发送自动转义的纯文本(CQ 码不会被解析)。
|
|
144
|
-
- `/utter
|
|
143
|
+
- `/utter raw <CQ 消息>`:SuperAdmin 权限,发送原始 CQ 字符串。
|
|
145
144
|
|
|
146
|
-
##
|
|
145
|
+
## 插件目录配置
|
|
147
146
|
|
|
148
|
-
`plugins` 中出现的插件 ID
|
|
147
|
+
`plugins` 中出现的插件 ID 必须对应已加载的插件,否则启动失败。本地插件和在线安装的插件都固定从 `plugins/<目录>/dist` 自动加载:
|
|
149
148
|
|
|
150
149
|
```bash
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
--plugin-dir plugins/llm/dist
|
|
150
|
+
npm run build
|
|
151
|
+
node dist/app.js
|
|
154
152
|
```
|
|
155
153
|
|
|
156
|
-
|
|
154
|
+
没有 `dist` 的插件目录会被跳过并记录警告。通过 `/plugin install` 安装的包会直接出现在 `plugins/<插件id>/`,与手动放在 `plugins/` 的本地插件没有区别。安装状态、registry 和允许列表见[插件安装器](#插件安装器)。
|
|
157
155
|
|
|
158
156
|
插件自己的配置字段由 `manifest.configSchema` 校验。例如一个 `demo` 插件:
|
|
159
157
|
|
|
@@ -178,12 +176,10 @@ npm install --prefix plugins/poke
|
|
|
178
176
|
npm install --prefix plugins/llm
|
|
179
177
|
npm run build:local
|
|
180
178
|
|
|
181
|
-
npm run dev
|
|
182
|
-
--plugin-dir plugins/poke/dist \
|
|
183
|
-
--plugin-dir plugins/llm/dist
|
|
179
|
+
npm run dev
|
|
184
180
|
```
|
|
185
181
|
|
|
186
|
-
|
|
182
|
+
本地插件从 `plugins/<id>/dist` 自动加载;应用会跳过与内置插件同 ID 的本地插件。
|
|
187
183
|
|
|
188
184
|
## 错误处理
|
|
189
185
|
|
package/docs/feature-parity.md
CHANGED
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
| 群开关 | `PluginGate` | `enabled/private/groups` |
|
|
12
12
|
| 消息发送 | `core/messaging/sender.ts` | reply、长消息 forward |
|
|
13
13
|
| 插件 KV | `core/plugin/kv.ts` | 按插件 ID 隔离的 SQLite KV |
|
|
14
|
-
| 管理发送 | `src/plugins/admin` | `/utter`、`/utter
|
|
14
|
+
| 管理发送 | `src/plugins/admin` | `/utter`、`/utter raw` |
|
|
15
15
|
| 角色查询/帮助 | `src/plugins/core` | `/role`、`/help`、`/status` |
|
|
16
16
|
| 内置插件 | `src/plugins/*` | 普通源码,随内核编译 |
|
|
17
17
|
| 在线安装 | `core/plugin/installer.ts` | `/plugin install/list/remove/update`,重启生效 |
|
|
18
18
|
|
|
19
19
|
## 本地插件
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
以下插件保留在本地,但不进入仓库,构建后放在 `plugins/<id>/dist` 自动加载:
|
|
22
22
|
|
|
23
23
|
| 能力 | 位置 | 说明 |
|
|
24
24
|
| ---- | -------------- | -------------------------------------------- |
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
## 验收场景
|
|
43
43
|
|
|
44
44
|
- 只注册一个 SDK middleware。
|
|
45
|
+
- 命令支持多级路径,按最长路径匹配;组根未提供 handler 时自动生成用法提示。
|
|
45
46
|
- 命令命中后不会进入普通消息 handler。
|
|
46
47
|
- 禁用命令不会穿透到普通消息 handler。
|
|
47
48
|
- 权限不足不执行 handler,并返回通用提示。
|
|
@@ -49,8 +50,7 @@
|
|
|
49
50
|
- 插件 setup/start 失败可以回滚。
|
|
50
51
|
- 长消息转 forward,短消息默认引用回复。
|
|
51
52
|
- 配置错误包含路径,未知插件 ID 启动失败。
|
|
52
|
-
-
|
|
53
|
-
- 本地插件可以通过 `--plugin-dir` 加载。
|
|
53
|
+
- 本地插件可以从 `plugins/<id>/dist` 自动加载并执行。
|
|
54
54
|
- 已安装的 npm 插件包可以在自动重启后加载,安装失败会回滚。
|
|
55
55
|
- 非 SuperAdmin 不能使用 `/plugin` 的任何子命令,包括 `help` 和 `list`。
|
|
56
56
|
- `npm run build` 后 `node dist/app.js` 可用。
|