@jsbot-tellus/core 2.1.0 → 2.3.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 +14 -14
- package/dist/app.js +4 -2
- package/dist/app.js.map +1 -1
- package/dist/core/dispatch/command.d.ts.map +1 -1
- package/dist/core/dispatch/command.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/kernel.d.ts.map +1 -1
- package/dist/core/kernel.js +5 -1
- package/dist/core/kernel.js.map +1 -1
- package/dist/core/plugin/command-params.d.ts +23 -1
- package/dist/core/plugin/command-params.d.ts.map +1 -1
- package/dist/core/plugin/command-params.js +35 -0
- package/dist/core/plugin/command-params.js.map +1 -1
- package/dist/core/plugin/context.d.ts.map +1 -1
- package/dist/core/plugin/context.js.map +1 -1
- package/dist/core/plugin/loader.d.ts +13 -2
- package/dist/core/plugin/loader.d.ts.map +1 -1
- package/dist/core/plugin/loader.js +87 -5
- package/dist/core/plugin/loader.js.map +1 -1
- package/dist/core/plugin/types.d.ts +8 -7
- package/dist/core/plugin/types.d.ts.map +1 -1
- package/dist/core/plugin/types.js.map +1 -1
- package/dist/plugins/core/index.js +1 -1
- package/dist/plugins/core/index.js.map +1 -1
- package/docs/architecture.md +3 -3
- package/docs/configuration.md +3 -3
- package/docs/feature-parity.md +2 -2
- package/docs/plugin-api.md +12 -4
- package/docs/plugin-development.md +34 -24
- package/package.json +3 -1
- package/src/app.ts +4 -2
- package/src/core/dispatch/command.ts +9 -5
- package/src/core/index.ts +1 -0
- package/src/core/kernel.ts +8 -1
- package/src/core/plugin/command-params.ts +119 -1
- package/src/core/plugin/context.ts +9 -5
- package/src/core/plugin/loader.ts +150 -7
- package/src/core/plugin/types.ts +17 -11
- package/src/plugins/core/index.ts +1 -1
|
@@ -3,6 +3,59 @@ import { join, resolve } from 'node:path';
|
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
4
|
import fg from 'fast-glob';
|
|
5
5
|
import { collectPluginExports } from './exports.js';
|
|
6
|
+
import { readInstallState, readJsonFile } from './install-dir.js';
|
|
7
|
+
import { NpmCliRunner } from './npm-runner.js';
|
|
8
|
+
const DEFAULT_BUILD_TIMEOUT_MS = 120_000;
|
|
9
|
+
function isRecord(value) {
|
|
10
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
async function directoryExists(path) {
|
|
13
|
+
const info = await stat(path).catch(() => null);
|
|
14
|
+
return info?.isDirectory() ?? false;
|
|
15
|
+
}
|
|
16
|
+
async function readBuildScript(directory) {
|
|
17
|
+
const manifest = await readJsonFile(join(directory, 'package.json')).catch(() => undefined);
|
|
18
|
+
if (!isRecord(manifest) || !isRecord(manifest['scripts'])) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const build = manifest['scripts']['build'];
|
|
22
|
+
return typeof build === 'string' && build.trim().length > 0
|
|
23
|
+
? build
|
|
24
|
+
: undefined;
|
|
25
|
+
}
|
|
26
|
+
async function readManagedDirectories(root) {
|
|
27
|
+
try {
|
|
28
|
+
const state = await readInstallState(root);
|
|
29
|
+
return new Set(Object.values(state.packages).map((record) => record.dir));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function buildLocalPlugin(directory, name, logger, runner, timeoutMs) {
|
|
36
|
+
if ((await readBuildScript(directory)) === undefined) {
|
|
37
|
+
logger?.warn(`skipping local plugin ${name}: dist directory not found and package.json has no build script`);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (!(await directoryExists(join(directory, 'node_modules')))) {
|
|
41
|
+
logger?.warn(`skipping local plugin ${name}: dist directory not found and node_modules is missing; run npm install --prefix ${directory}`);
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
logger?.info?.(`building local plugin ${name}: dist directory not found`);
|
|
45
|
+
try {
|
|
46
|
+
await runner.run(['run', 'build'], {
|
|
47
|
+
cwd: directory,
|
|
48
|
+
timeoutMs,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger?.error(`failed to build local plugin ${name}`, error);
|
|
53
|
+
logger?.warn(`skipping local plugin ${name}: build failed`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
logger?.info?.(`built local plugin ${name}`);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
6
59
|
export async function loadPluginsFromDirectory(directory, logger) {
|
|
7
60
|
const absolute = resolve(directory);
|
|
8
61
|
const info = await stat(absolute).catch(() => null);
|
|
@@ -39,23 +92,52 @@ export async function loadPluginsFromDirectory(directory, logger) {
|
|
|
39
92
|
}
|
|
40
93
|
return plugins;
|
|
41
94
|
}
|
|
42
|
-
export async function loadLocalPlugins(root, logger) {
|
|
95
|
+
export async function loadLocalPlugins(root, logger, options = {}) {
|
|
43
96
|
const absolute = resolve(root);
|
|
44
97
|
const info = await stat(absolute).catch(() => null);
|
|
45
98
|
if (!info?.isDirectory())
|
|
46
99
|
return [];
|
|
47
100
|
const entries = (await readdir(absolute, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));
|
|
48
101
|
const plugins = [];
|
|
102
|
+
let autoBuild = options.autoBuild !== false;
|
|
103
|
+
let managed = new Set();
|
|
104
|
+
if (autoBuild) {
|
|
105
|
+
const directories = await readManagedDirectories(absolute);
|
|
106
|
+
if (directories === null) {
|
|
107
|
+
logger?.warn('cannot read plugin install state; automatic local plugin build is disabled');
|
|
108
|
+
autoBuild = false;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
managed = directories;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const runner = options.runner ?? new NpmCliRunner();
|
|
115
|
+
const timeoutMs = options.buildTimeoutMs ?? DEFAULT_BUILD_TIMEOUT_MS;
|
|
49
116
|
for (const entry of entries) {
|
|
50
117
|
if (!entry.isDirectory() || entry.name.startsWith('.'))
|
|
51
118
|
continue;
|
|
52
119
|
if (entry.name === 'node_modules')
|
|
53
120
|
continue;
|
|
54
|
-
const
|
|
55
|
-
const
|
|
121
|
+
const directory = join(absolute, entry.name);
|
|
122
|
+
const dist = join(directory, 'dist');
|
|
123
|
+
let distInfo = await stat(dist).catch(() => null);
|
|
56
124
|
if (!distInfo?.isDirectory()) {
|
|
57
|
-
|
|
58
|
-
|
|
125
|
+
if (!autoBuild) {
|
|
126
|
+
logger?.warn(`skipping local plugin ${entry.name}: dist directory not found`);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (managed.has(entry.name)) {
|
|
130
|
+
logger?.warn(`skipping local plugin ${entry.name}: dist directory not found (installed package is expected to include dist)`);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const built = await buildLocalPlugin(directory, entry.name, logger, runner, timeoutMs);
|
|
134
|
+
if (!built)
|
|
135
|
+
continue;
|
|
136
|
+
distInfo = await stat(dist).catch(() => null);
|
|
137
|
+
if (!distInfo?.isDirectory()) {
|
|
138
|
+
logger?.warn(`skipping local plugin ${entry.name}: build finished but dist directory not found`);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
59
141
|
}
|
|
60
142
|
plugins.push(...(await loadPluginsFromDirectory(dist, logger)));
|
|
61
143
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/plugin/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,MAAM,WAAW,CAAA;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/plugin/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import type { SendOptions } from '../messaging/sender.js';
|
|
|
7
7
|
import type { PluginKV } from '../plugin/kv.js';
|
|
8
8
|
import type { Permission } from '../security/permission.js';
|
|
9
9
|
import type { SessionStore } from '../storage/session.js';
|
|
10
|
+
import type { CommandParamArgs } from './command-params.js';
|
|
10
11
|
export type EventType = 'message' | 'notice' | 'request' | 'meta';
|
|
11
12
|
export interface CommandMatch {
|
|
12
13
|
command: string;
|
|
@@ -35,20 +36,20 @@ export type MessageHandler = (event: OneBotMessageEvent, context: EventContext<O
|
|
|
35
36
|
export type NoticeHandler = (event: OneBotNoticeEvent, context: EventContext<OneBotNoticeEvent>) => void | Promise<void>;
|
|
36
37
|
export type RequestHandler = (event: OneBotRequestEvent, context: EventContext<OneBotRequestEvent>) => void | Promise<void>;
|
|
37
38
|
export type PluginMiddleware = (event: SnowLumaEvent, context: EventContext, next: () => Promise<void>) => void | Promise<void>;
|
|
38
|
-
export interface CommandOptions {
|
|
39
|
+
export interface CommandOptions<Declaration extends string = string> {
|
|
39
40
|
name: string;
|
|
40
41
|
aliases?: string[] | undefined;
|
|
41
42
|
prefixes?: string[] | undefined;
|
|
42
43
|
permission?: Permission | undefined;
|
|
43
44
|
description?: string | undefined;
|
|
44
|
-
params?:
|
|
45
|
+
params?: Declaration | undefined;
|
|
45
46
|
}
|
|
46
|
-
export interface CommandGroupOptions<
|
|
47
|
-
handler?: CommandHandler<OneBotMessageEvent,
|
|
47
|
+
export interface CommandGroupOptions<Declaration extends string = string> extends CommandOptions<Declaration> {
|
|
48
|
+
handler?: CommandHandler<OneBotMessageEvent, CommandParamArgs<Declaration>> | undefined;
|
|
48
49
|
}
|
|
49
50
|
export interface CommandGroupRegistrar {
|
|
50
|
-
register<
|
|
51
|
-
group<
|
|
51
|
+
register<Declaration extends string = string>(options: CommandOptions<Declaration>, handler: CommandHandler<OneBotMessageEvent, CommandParamArgs<Declaration>>): () => void;
|
|
52
|
+
group<Declaration extends string = string>(options: CommandGroupOptions<Declaration>, setup: (group: CommandGroupRegistrar) => void): () => void;
|
|
52
53
|
}
|
|
53
54
|
export interface NoticeOptions {
|
|
54
55
|
noticeType?: string | undefined;
|
|
@@ -122,7 +123,7 @@ export interface CoreServices {
|
|
|
122
123
|
can(actual: Permission, required: Permission): boolean;
|
|
123
124
|
};
|
|
124
125
|
commands: {
|
|
125
|
-
list(): ReadonlyArray<CommandInfo>;
|
|
126
|
+
list(event?: SnowLumaEvent): ReadonlyArray<CommandInfo>;
|
|
126
127
|
};
|
|
127
128
|
plugins: PluginStatus;
|
|
128
129
|
installer: PluginInstaller;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/plugin/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EAChB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/plugin/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/plugin/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/plugin/types.ts"],"names":[],"mappings":"AAyOA,MAAM,UAAU,YAAY,CACxB,UAA6C;IAE7C,OAAO,UAAU,CAAA;AACrB,CAAC"}
|
|
@@ -31,7 +31,7 @@ export const corePlugin = definePlugin({
|
|
|
31
31
|
}, async (event, context) => {
|
|
32
32
|
const role = ctx.core.roles.roleOf(event.user_id);
|
|
33
33
|
const commands = ctx.core.commands
|
|
34
|
-
.list()
|
|
34
|
+
.list(event)
|
|
35
35
|
.filter((command) => ctx.core.roles.can(role, command.permission))
|
|
36
36
|
.map((command) => {
|
|
37
37
|
const usage = command.usage !== undefined
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/core/index.ts"],"names":[],"mappings":"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"}
|
package/docs/architecture.md
CHANGED
|
@@ -16,7 +16,7 @@ src/core/* -X-> src/plugins/*
|
|
|
16
16
|
- 插件只能通过 `PluginContext`、`EventContext` 和 `BotApi` 使用能力。
|
|
17
17
|
- `core` 不 import 任何插件;`core`、`admin` 在 `src/plugins/index.ts` 显式注册。
|
|
18
18
|
- 内置插件是普通源码,随内核一起编译;没有独立依赖,不单独建包。
|
|
19
|
-
- 本地插件由 `src/app.ts` 在启动前扫描 `plugins/<id>/dist`
|
|
19
|
+
- 本地插件由 `src/app.ts` 在启动前扫描 `plugins/<id>/dist` 并追加到内置插件之后;缺少 `dist` 时加载器会尝试执行插件的 `build` 脚本。
|
|
20
20
|
- 本地插件放在不跟踪的 `plugins/`,每个插件是独立包,构建后自动加载。
|
|
21
21
|
|
|
22
22
|
## 运行时主链路
|
|
@@ -58,7 +58,7 @@ 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 本地插件目录加载(缺 dist 时自动构建)
|
|
62
62
|
security/ 角色、权限、拒绝提示
|
|
63
63
|
messaging/ reply/forward 发送和回复分段
|
|
64
64
|
storage/ SQLite 和 Session
|
|
@@ -131,7 +131,7 @@ npm run build:local
|
|
|
131
131
|
node dist/app.js
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
-
应用会固定扫描 `plugins/<id>/dist`,并跳过与内置插件同 ID 的本地插件,避免重复注册。没有 `dist`
|
|
134
|
+
应用会固定扫描 `plugins/<id>/dist`,并跳过与内置插件同 ID 的本地插件,避免重复注册。没有 `dist` 的本地插件如果带有 `build` 脚本且依赖已安装,会先自动构建再加载;没有 `build` 脚本、缺少 `node_modules` 或构建失败时会记录警告并跳过。
|
|
135
135
|
|
|
136
136
|
## 在线安装插件
|
|
137
137
|
|
package/docs/configuration.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| 数据目录 | `--data-dir` | `BOT_DATA_DIR` | `./data` |
|
|
9
9
|
| 日志级别 | `--log-level` | `BOT_LOG_LEVEL` | `info` |
|
|
10
10
|
|
|
11
|
-
本地插件目录固定为 `./plugins`,不提供 CLI 或环境变量覆盖;每个插件从 `./plugins/<id>/dist`
|
|
11
|
+
本地插件目录固定为 `./plugins`,不提供 CLI 或环境变量覆盖;每个插件从 `./plugins/<id>/dist` 加载,缺失时会在启动阶段尝试自动构建,相对路径按 `process.cwd()` 解析。
|
|
12
12
|
|
|
13
13
|
## 完整示例
|
|
14
14
|
|
|
@@ -151,7 +151,7 @@ npm run build
|
|
|
151
151
|
node dist/app.js
|
|
152
152
|
```
|
|
153
153
|
|
|
154
|
-
没有 `dist`
|
|
154
|
+
没有 `dist` 的本地插件如果带有 `build` 脚本且依赖已安装,启动时会先自动执行 `npm run build` 再加载;没有 `build` 脚本、缺少 `node_modules` 或构建失败时会记录警告并跳过。通过 `/plugin install` 安装的包会直接出现在 `plugins/<插件id>/`,与手动放在 `plugins/` 的本地插件没有区别;安装器管理的包应自带 `dist`,加载器不会为它们自动构建。安装状态、registry 和允许列表见[插件安装器](#插件安装器)。
|
|
155
155
|
|
|
156
156
|
插件自己的配置字段由 `manifest.configSchema` 校验。例如一个 `demo` 插件:
|
|
157
157
|
|
|
@@ -179,7 +179,7 @@ npm run build:local
|
|
|
179
179
|
npm run dev
|
|
180
180
|
```
|
|
181
181
|
|
|
182
|
-
本地插件从 `plugins/<id>/dist`
|
|
182
|
+
本地插件从 `plugins/<id>/dist` 自动加载;缺少 `dist` 时会先尝试构建。应用会跳过与内置插件同 ID 的本地插件。
|
|
183
183
|
|
|
184
184
|
## 错误处理
|
|
185
185
|
|
package/docs/feature-parity.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
## 本地插件
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
以下插件保留在本地,但不进入仓库,从 `plugins/<id>/dist` 自动加载(缺少 `dist` 时会先尝试自动构建):
|
|
22
22
|
|
|
23
23
|
| 能力 | 位置 | 说明 |
|
|
24
24
|
| ---- | -------------- | -------------------------------------------- |
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
- 插件 setup/start 失败可以回滚。
|
|
51
51
|
- 长消息转 forward,短消息默认引用回复。
|
|
52
52
|
- 配置错误包含路径,未知插件 ID 启动失败。
|
|
53
|
-
- 本地插件可以从 `plugins/<id>/dist`
|
|
53
|
+
- 本地插件可以从 `plugins/<id>/dist` 自动加载并执行;缺少 `dist` 且带有 `build` 脚本时会先自动构建。
|
|
54
54
|
- 已安装的 npm 插件包可以在自动重启后加载,安装失败会回滚。
|
|
55
55
|
- 非 SuperAdmin 不能使用 `/plugin` 的任何子命令,包括 `help` 和 `list`。
|
|
56
56
|
- `npm run build` 后 `node dist/app.js` 可用。
|
package/docs/plugin-api.md
CHANGED
|
@@ -176,6 +176,7 @@ const result = await ctx.api.call('get_group_list')
|
|
|
176
176
|
const role = ctx.core.roles.roleOf(userId)
|
|
177
177
|
const allowed = ctx.core.roles.can(role, 'Admin')
|
|
178
178
|
const commands = ctx.core.commands.list()
|
|
179
|
+
const visibleCommands = ctx.core.commands.list(event)
|
|
179
180
|
const plugins = ctx.core.plugins.list()
|
|
180
181
|
const uptime = ctx.core.uptime()
|
|
181
182
|
|
|
@@ -183,7 +184,7 @@ const installed = await ctx.core.installer.list()
|
|
|
183
184
|
ctx.core.restart()
|
|
184
185
|
```
|
|
185
186
|
|
|
186
|
-
核心服务由内核注入,适合帮助、状态类插件。`ctx.core.installer` 额外提供 `install` / `remove` / `update` / `list`;它不会检查调用者角色,权限判断由调用方负责(`admin` 的 `/plugin` 命令要求 SuperAdmin)。安装器默认关闭,必须在配置中显式启用。`ctx.core.restart()` 请求应用重建运行时并重新加载插件;第三方插件不应把这些方法暴露给普通用户。
|
|
187
|
+
核心服务由内核注入,适合帮助、状态类插件。`ctx.core.commands.list(event)` 会按当前会话的 `enabled`、`groups`、`private` gating 过滤命令;不传 `event` 时返回全部命令。`ctx.core.installer` 额外提供 `install` / `remove` / `update` / `list`;它不会检查调用者角色,权限判断由调用方负责(`admin` 的 `/plugin` 命令要求 SuperAdmin)。安装器默认关闭,必须在配置中显式启用。`ctx.core.restart()` 请求应用重建运行时并重新加载插件;第三方插件不应把这些方法暴露给普通用户。
|
|
187
188
|
|
|
188
189
|
安装的插件与内置插件运行在同一个宿主进程中,可访问文件系统、网络和 `process.env`,属于完全可信代码,不是安全沙箱。
|
|
189
190
|
|
|
@@ -230,7 +231,8 @@ ctx.commands.register(
|
|
|
230
231
|
description: '向模型提问',
|
|
231
232
|
params: '<question:string> [count:integer=1]',
|
|
232
233
|
},
|
|
233
|
-
async (_event, context, _match, question
|
|
234
|
+
async (_event, context, _match, question, count) => {
|
|
235
|
+
// question: string, count: number
|
|
234
236
|
await context.send(`问题:${question}(${count} 次)`)
|
|
235
237
|
}
|
|
236
238
|
)
|
|
@@ -254,6 +256,7 @@ ctx.commands.register(
|
|
|
254
256
|
- `number`:有限数字,包括小数。
|
|
255
257
|
- `integer`:整数。
|
|
256
258
|
- `boolean`:`true/false`、`1/0`、`yes/no`、`y/n`、`on/off`,大小写不敏感。
|
|
259
|
+
- `at`:@ 提及或 QQ 号,解析为数字。支持 `[CQ:at,qq=123456]`(可带 `name` 等附加参数)和纯数字 `123456`;`@全体成员` 和普通文本会报类型错误,且不能声明默认值。
|
|
257
260
|
- `[...rest]`:把剩余 token 依次收集为字符串;只能放在最后,且没有必填形式。
|
|
258
261
|
|
|
259
262
|
固定参数可以用双引号或单引号包裹,例如 `/ask "hello world" 2` 会把 `hello world` 作为一个 token;引号内的反斜杠用于转义。
|
|
@@ -265,7 +268,11 @@ ctx.commands.register(
|
|
|
265
268
|
- 必填参数缺失、已声明槽位类型错误或引号未闭合时,Router 会自动回复错误和用法,handler 不会执行。
|
|
266
269
|
- usage 会自动生成,并显示在 `/help` 和指令组根命令的用法提示中。
|
|
267
270
|
- 必填参数不能出现在可选参数之后;参数名不能重复;`text` 和变长参数必须放在最后;必填参数不能声明默认值。
|
|
268
|
-
-
|
|
271
|
+
- 当 `params` 是字符串字面量时,handler 从第四个参数开始的位置参数类型会自动推导。例如 `<question:string> [count:integer=1]` 会推导为 `(question: string, count: number)`,`[name:string]` 会推导为 `string | undefined`,`[...rest]` 会推导为 `...string[]`。
|
|
272
|
+
- 需要在类型位置复用推导结果时,可以使用导出的 `CommandParamArgs<'<question:string>'>`。
|
|
273
|
+
- 也可以继续手写 handler 参数注解;注解与声明不一致时会在编译期报错。
|
|
274
|
+
- 自动推导只对字面量生效:运行时拼接的字符串,或显式声明为 `string` 的变量会回退为 `any[]`。需要保留字面量类型时,使用 `const` 变量或 `as const`。
|
|
275
|
+
- 类型层解析覆盖上面的声明语法;如果默认值包含 `]` 等会干扰声明边界的字符,可能回退为 `any[]`,但不影响运行时解析。非法声明仍然在注册时抛错,而不是变成类型错误。
|
|
269
276
|
|
|
270
277
|
参数错误示例:
|
|
271
278
|
|
|
@@ -431,6 +438,7 @@ await context.send('自动转义 CQ 码', { autoEscape: true })
|
|
|
431
438
|
- `plugins.<id>.enabled` 控制整体启用。
|
|
432
439
|
- `plugins.<id>.groups.allow` / `deny` 只作用于群事件,二者不能同时非空。
|
|
433
440
|
- `plugins.<id>.private` 控制私聊,默认 `true`。
|
|
441
|
+
- `/help` 只列出当前会话中启用的插件命令;群 gating 或 `private: false` 会隐藏对应命令。
|
|
434
442
|
|
|
435
443
|
## 配置校验
|
|
436
444
|
|
|
@@ -511,7 +519,7 @@ npm run build:local
|
|
|
511
519
|
node dist/app.js
|
|
512
520
|
```
|
|
513
521
|
|
|
514
|
-
应用会自动扫描 `plugins/<id>/dist`;没有 `dist`
|
|
522
|
+
应用会自动扫描 `plugins/<id>/dist`;没有 `dist` 的本地插件如果带有 `build` 脚本且依赖已安装,会先自动构建再加载,构建失败则记录警告并跳过。示例见 [`examples/plugins/hello`](../examples/plugins/hello)。
|
|
515
523
|
|
|
516
524
|
## 通过 npm 发布与安装
|
|
517
525
|
|
|
@@ -6,11 +6,11 @@ API 细节(`PluginContext`、命令、事件、中间件、KV、Session 等)
|
|
|
6
6
|
|
|
7
7
|
## 先选插件类型
|
|
8
8
|
|
|
9
|
-
| 类型 | 推荐位置 | 是否进入本仓库 | 加载方式
|
|
10
|
-
| -------- | ------------------- | -------------- |
|
|
11
|
-
| 内置插件 | `src/plugins/<id>/` | 是 | 注册到 `src/plugins/index.ts`
|
|
12
|
-
| 本地插件 | `plugins/<id>/` | 否 | 启动时自动扫描 `plugins/<id>/dist
|
|
13
|
-
| npm 插件 | 独立仓库或独立包 | 独立管理 | `/plugin install <包名>[@版本]`
|
|
9
|
+
| 类型 | 推荐位置 | 是否进入本仓库 | 加载方式 | 适用场景 |
|
|
10
|
+
| -------- | ------------------- | -------------- | ------------------------------------------------------ | ---------------------------- |
|
|
11
|
+
| 内置插件 | `src/plugins/<id>/` | 是 | 注册到 `src/plugins/index.ts` | 随内核发布的官方功能 |
|
|
12
|
+
| 本地插件 | `plugins/<id>/` | 否 | 启动时自动扫描 `plugins/<id>/dist`,缺失时尝试自动构建 | 个人使用、内部功能、开发调试 |
|
|
13
|
+
| npm 插件 | 独立仓库或独立包 | 独立管理 | `/plugin install <包名>[@版本]` | 发布给其他用户安装 |
|
|
14
14
|
|
|
15
15
|
位置约定:
|
|
16
16
|
|
|
@@ -39,7 +39,7 @@ plugins/my-plugin/
|
|
|
39
39
|
|
|
40
40
|
- `src/index.ts` 是开发入口。
|
|
41
41
|
- `dist/index.js` 是运行时入口。
|
|
42
|
-
- 构建产物固定放在 `plugins/<id>/dist
|
|
42
|
+
- 构建产物固定放在 `plugins/<id>/dist`,启动时自动扫描;缺少 `dist` 且 `package.json` 中存在 `build` 脚本时会先自动构建,不要指向或加载 `src/`。
|
|
43
43
|
- 每个本地插件都是独立包,有自己的 `package.json`、lockfile 和 `node_modules`。
|
|
44
44
|
|
|
45
45
|
### 内置插件
|
|
@@ -107,13 +107,18 @@ npm run plugin:gen -- my-plugin --no-install
|
|
|
107
107
|
npm install --prefix plugins/my-plugin
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
然后启动:
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
|
-
npm run build --prefix plugins/my-plugin
|
|
114
113
|
node dist/app.js
|
|
115
114
|
```
|
|
116
115
|
|
|
116
|
+
启动时如果插件还没有 `dist`,应用会自动执行 `npm run build --prefix plugins/my-plugin`;前提是已经安装依赖。也可以手动提前构建:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npm run build --prefix plugins/my-plugin
|
|
120
|
+
```
|
|
121
|
+
|
|
117
122
|
如果目标目录已经存在,命令会拒绝覆盖。
|
|
118
123
|
|
|
119
124
|
下面以手动创建 `plugins/my-plugin/` 为例。
|
|
@@ -202,7 +207,7 @@ export default definePlugin({
|
|
|
202
207
|
description: '发送一条问候',
|
|
203
208
|
params: '[name:string="世界"]',
|
|
204
209
|
},
|
|
205
|
-
async (_event, context, _match, name
|
|
210
|
+
async (_event, context, _match, name) => {
|
|
206
211
|
await context.send(`${name}:${ctx.config.reply}`)
|
|
207
212
|
}
|
|
208
213
|
)
|
|
@@ -218,14 +223,15 @@ export default definePlugin({
|
|
|
218
223
|
- 多级命令(例如 `/plugin install`)使用 `ctx.commands.group()`,不要直接注册带空格的命令名。详见[插件 API 的命令章节](plugin-api.md#命令)。
|
|
219
224
|
- 修改命令、事件或配置后,完整重启进程最可靠;自动重启不会清空 ESM 模块缓存。
|
|
220
225
|
|
|
221
|
-
### 4.
|
|
226
|
+
### 4. 安装依赖
|
|
222
227
|
|
|
223
228
|
```bash
|
|
224
229
|
npm install --prefix plugins/my-plugin
|
|
225
230
|
npm run build
|
|
226
|
-
npm run build --prefix plugins/my-plugin
|
|
227
231
|
```
|
|
228
232
|
|
|
233
|
+
根目录的 `npm run build` 构建内核。插件自身的构建在启动时缺少 `dist` 会自动执行;需要提前校验时也可以手动运行 `npm run build --prefix plugins/my-plugin`。
|
|
234
|
+
|
|
229
235
|
根目录的 `npm run build:local` / `npm run check:local` 目前只覆盖 `plugins/poke` 和 `plugins/llm`。新增插件请使用 `npm run build --prefix plugins/<id>` 和 `npm run check --prefix plugins/<id>`,或者把新目录加入根 `package.json` 的对应脚本。
|
|
230
236
|
|
|
231
237
|
开发时可以单独开一个终端监听:
|
|
@@ -258,7 +264,7 @@ node dist/app.js
|
|
|
258
264
|
npm run dev
|
|
259
265
|
```
|
|
260
266
|
|
|
261
|
-
不需要额外参数;多个本地插件按 `plugins/<id>/dist` 并存。没有 `dist`
|
|
267
|
+
不需要额外参数;多个本地插件按 `plugins/<id>/dist` 并存。没有 `dist` 的本地插件如果带有 `build` 脚本且 `node_modules` 存在,会先自动执行 `npm run build` 再加载;没有 `build` 脚本、缺少依赖或构建失败时会记录警告并跳过。
|
|
262
268
|
|
|
263
269
|
### 6. 配置插件
|
|
264
270
|
|
|
@@ -289,24 +295,28 @@ npm run dev
|
|
|
289
295
|
- `export const plugins = [...]`
|
|
290
296
|
- 没有导出插件定义的 helper 模块会被跳过。
|
|
291
297
|
- 生产环境应加载编译后的 JavaScript;TypeScript 源码必须先构建,或者在使用 `tsx` 的开发环境中运行。
|
|
298
|
+
- `dist` 缺失时,如果插件目录中有 `package.json`、`package.json` 声明了 `scripts.build`,并且 `node_modules` 存在,加载器会执行 `npm run build` 后再加载;构建失败或构建后仍无 `dist` 时只跳过该插件。
|
|
299
|
+
- 通过 `/plugin install` 安装的包由安装器管理,缺少 `dist` 时不会自动构建,而是直接告警跳过。
|
|
292
300
|
- 空目录不会报错;如果目录中存在无法导入或无法识别的文件,并且最终没有加载到任何有效插件,启动失败。只要至少有一个有效插件,其他无法识别的文件会记录警告并跳过。
|
|
293
301
|
- 本地插件和在线安装的插件都从 `plugins/<目录>/dist` 自动加载,没有单独的安装目录。
|
|
294
302
|
- 同一个 ID 同时来自内置插件和 `plugins/` 中的多个目录时,只有最先加载的那个生效。
|
|
295
303
|
|
|
296
304
|
## 调试与常见问题
|
|
297
305
|
|
|
298
|
-
| 现象 | 可能原因 | 处理
|
|
299
|
-
| ---------------------------------------------------- | ---------------------------------------------------- |
|
|
300
|
-
| `skipping local plugin ... dist directory not found` |
|
|
301
|
-
| `failed to
|
|
302
|
-
| `dist`
|
|
303
|
-
| `
|
|
304
|
-
| `
|
|
305
|
-
|
|
|
306
|
-
|
|
|
307
|
-
|
|
|
308
|
-
|
|
|
309
|
-
|
|
|
306
|
+
| 现象 | 可能原因 | 处理 |
|
|
307
|
+
| ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
308
|
+
| `skipping local plugin ... dist directory not found` | 没有 `build` 脚本、缺少 `node_modules`,或构建失败 | 执行 `npm install --prefix plugins/<id>`,检查 `scripts.build`,或手动执行 `npm run build --prefix plugins/<id>` |
|
|
309
|
+
| `failed to build local plugin ...` | `build` 脚本执行失败或超时 | 查看 npm 输出和插件源码,修复后重启 |
|
|
310
|
+
| `build finished but dist directory not found` | `build` 脚本没有把产物输出到插件的 `dist` 目录 | 检查 `tsconfig.json` 的 `outDir` 和 `scripts.build` |
|
|
311
|
+
| `failed to import ...` | TypeScript 未编译、入口有运行时错误 | 先构建;查看日志中的具体导入错误 |
|
|
312
|
+
| `dist` 目录没有有效插件 | 没有导出 `default` / `plugin` / `plugins` | 检查入口导出和 `dist` 中的构建输出 |
|
|
313
|
+
| `skipping ... plugin id already loaded` | 插件 ID 重复 | 修改 `manifest.id`,或移除重复的插件目录 |
|
|
314
|
+
| `unknown plugin id` | 配置里写了未加载的插件 ID | 启用插件、修正 ID,或删除 `plugins.<id>` 配置 |
|
|
315
|
+
| 命令没有响应 | 插件未启用、权限不足、群组 gating、命令前缀不匹配 | 检查 `plugins.<id>.enabled`、角色、群组配置和命令前缀 |
|
|
316
|
+
| 修改代码后行为没变 | ESM 模块缓存、自动重启未刷新本地插件 | 完整退出并重新启动进程 |
|
|
317
|
+
| `Cannot find module '@jsbot-tellus/core'` | 没有安装 devDependency,或 `file:` 依赖尚未构建 | 在插件目录执行 `npm install`;使用 `file:` 时先构建根项目 |
|
|
318
|
+
| `/plugin install` 拒绝包 | 使用了路径、`file:`、git/url、范围版本或未启用安装器 | 改用 npm 包名 + 精确版本或 dist-tag;确认 `installer.enabled` 和 allowlist |
|
|
319
|
+
| 安装完成但提示网络错误 | 安装后的通知发送失败,不代表安装失败 | 用 `/plugin list` 确认;必要时手动重启进程 |
|
|
310
320
|
|
|
311
321
|
注意:安装器在安装或更新成功后会请求重建运行时,但安装后的通知发送失败不会回滚安装。遇到“网络连接异常”时优先检查 `/plugin list` 和 `plugins/.jsbot-installed.json`。
|
|
312
322
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsbot-tellus/core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": "^24.22.1 || >=26.12.1"
|
|
6
6
|
},
|
|
@@ -59,6 +59,8 @@
|
|
|
59
59
|
"dev": "tsx watch src/app.ts",
|
|
60
60
|
"smoke": "node dist/app.js --help",
|
|
61
61
|
"format": "prettier --write .",
|
|
62
|
+
"format:plugin": "prettier --write plugins --ignore-path ''",
|
|
63
|
+
"format:plugin:check": "prettier --check plugins --ignore-path ''",
|
|
62
64
|
"format:check": "prettier --check ."
|
|
63
65
|
},
|
|
64
66
|
"dependencies": {
|
package/src/app.ts
CHANGED
|
@@ -33,7 +33,7 @@ Options:
|
|
|
33
33
|
|
|
34
34
|
Config precedence: CLI > environment > ./bot.config.json.
|
|
35
35
|
Data precedence: CLI > environment > ./data.
|
|
36
|
-
Local plugins: ./${LOCAL_PLUGIN_DIR}/<id>/dist.
|
|
36
|
+
Local plugins: ./${LOCAL_PLUGIN_DIR}/<id>/dist (auto-built when missing).
|
|
37
37
|
`
|
|
38
38
|
|
|
39
39
|
function pick(value: unknown): string | undefined {
|
|
@@ -103,7 +103,9 @@ async function loadRuntimeSpec(
|
|
|
103
103
|
|
|
104
104
|
logger.info('loading plugins from', pluginDir)
|
|
105
105
|
|
|
106
|
-
const localPlugins = await loadLocalPlugins(pluginDir, logger
|
|
106
|
+
const localPlugins = await loadLocalPlugins(pluginDir, logger, {
|
|
107
|
+
buildTimeoutMs: config.installer.timeoutMs,
|
|
108
|
+
})
|
|
107
109
|
|
|
108
110
|
if (localPlugins.length > 0) {
|
|
109
111
|
logger.info(`loaded ${localPlugins.length} plugin(s) from ${pluginDir}`)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { OneBotMessageEvent } from '@snowluma/sdk'
|
|
2
2
|
import {
|
|
3
3
|
compileCommandParams,
|
|
4
|
+
type CommandParamArgs,
|
|
4
5
|
type CompiledCommandParams,
|
|
5
6
|
} from '../plugin/command-params.js'
|
|
6
7
|
import type {
|
|
@@ -432,9 +433,12 @@ export class CommandRegistry {
|
|
|
432
433
|
}
|
|
433
434
|
|
|
434
435
|
const registrar: CommandGroupRegistrar = {
|
|
435
|
-
register: <
|
|
436
|
-
options: CommandOptions
|
|
437
|
-
handler: CommandHandler<
|
|
436
|
+
register: <Declaration extends string = string>(
|
|
437
|
+
options: CommandOptions<Declaration>,
|
|
438
|
+
handler: CommandHandler<
|
|
439
|
+
OneBotMessageEvent,
|
|
440
|
+
CommandParamArgs<Declaration>
|
|
441
|
+
>
|
|
438
442
|
) => {
|
|
439
443
|
const childBases = composedBases(
|
|
440
444
|
bases,
|
|
@@ -484,8 +488,8 @@ export class CommandRegistry {
|
|
|
484
488
|
})
|
|
485
489
|
},
|
|
486
490
|
|
|
487
|
-
group: <
|
|
488
|
-
options: CommandGroupOptions<
|
|
491
|
+
group: <Declaration extends string = string>(
|
|
492
|
+
options: CommandGroupOptions<Declaration>,
|
|
489
493
|
nestedSetup: (group: CommandGroupRegistrar) => void
|
|
490
494
|
) => {
|
|
491
495
|
const nestedBases = composedBases(
|
package/src/core/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ export type {
|
|
|
9
9
|
} from './config/schema.js'
|
|
10
10
|
export type { TaskQueue } from './dispatch/task-queue.js'
|
|
11
11
|
export type { Logger, LogLevel } from './logging/logger.js'
|
|
12
|
+
export type { CommandParamArgs } from './plugin/command-params.js'
|
|
12
13
|
export { splitReply } from './messaging/render.js'
|
|
13
14
|
export type { MessageSender, SendOptions } from './messaging/sender.js'
|
|
14
15
|
export { PluginConfigError } from './plugin/host.js'
|
package/src/core/kernel.ts
CHANGED
|
@@ -78,7 +78,14 @@ export class Kernel {
|
|
|
78
78
|
can: (actual, required) => roles.can(actual, required),
|
|
79
79
|
},
|
|
80
80
|
commands: {
|
|
81
|
-
list: () =>
|
|
81
|
+
list: (event) =>
|
|
82
|
+
event === undefined
|
|
83
|
+
? this.router.listCommands()
|
|
84
|
+
: this.router
|
|
85
|
+
.listCommands()
|
|
86
|
+
.filter((command) =>
|
|
87
|
+
gate.isEnabled(command.pluginId, event)
|
|
88
|
+
),
|
|
82
89
|
},
|
|
83
90
|
plugins: {
|
|
84
91
|
list: () => host.listStatus(),
|