@zhin.js/core 1.3.1 → 1.3.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/README.md +66 -11
- package/lib/adapter.d.ts +41 -3
- package/lib/adapter.js +110 -6
- package/lib/agent-prompt.d.ts +0 -1
- package/lib/agent-prompt.js +0 -1
- package/lib/built/adapter-process.d.ts +11 -2
- package/lib/built/adapter-process.js +43 -2
- package/lib/built/agent-preset.d.ts +0 -1
- package/lib/built/agent-preset.js +0 -1
- package/lib/built/ai-access.d.ts +36 -0
- package/lib/built/ai-access.js +46 -0
- package/lib/built/ai-outbound/adapter-access.d.ts +3 -0
- package/lib/built/ai-outbound/adapter-access.js +9 -0
- package/lib/built/ai-outbound/extensions/onebot-keyboard.d.ts +2 -0
- package/lib/built/ai-outbound/extensions/onebot-keyboard.js +67 -0
- package/lib/built/ai-outbound/extensions/qq-message.d.ts +3 -0
- package/lib/built/ai-outbound/extensions/qq-message.js +23 -0
- package/lib/built/ai-outbound/index.d.ts +9 -0
- package/lib/built/ai-outbound/index.js +9 -0
- package/lib/built/ai-outbound/parse.d.ts +13 -0
- package/lib/built/ai-outbound/parse.js +94 -0
- package/lib/built/ai-outbound/plain-mention-rewrite.d.ts +6 -0
- package/lib/built/ai-outbound/plain-mention-rewrite.js +37 -0
- package/lib/built/ai-outbound/prompt.d.ts +11 -0
- package/lib/built/ai-outbound/prompt.js +44 -0
- package/lib/built/ai-outbound/resolve.d.ts +4 -0
- package/lib/built/ai-outbound/resolve.js +64 -0
- package/lib/built/ai-outbound/structured-detect.d.ts +3 -0
- package/lib/built/ai-outbound/structured-detect.js +7 -0
- package/lib/built/ai-outbound/types.d.ts +60 -0
- package/lib/built/ai-outbound/types.js +5 -0
- package/lib/built/ai-trigger.d.ts +5 -1
- package/lib/built/ai-trigger.js +3 -7
- package/lib/built/authorization.d.ts +0 -1
- package/lib/built/authorization.js +0 -1
- package/lib/built/command.d.ts +2 -1
- package/lib/built/command.js +14 -4
- package/lib/built/common-adapter-tools.d.ts +25 -26
- package/lib/built/common-adapter-tools.js +48 -49
- package/lib/built/component.d.ts +0 -1
- package/lib/built/component.js +1 -3
- package/lib/built/config.d.ts +4 -1
- package/lib/built/config.js +26 -5
- package/lib/built/connect-endpoint-instance.d.ts +0 -1
- package/lib/built/connect-endpoint-instance.js +3 -2
- package/lib/built/database.d.ts +0 -1
- package/lib/built/database.js +1 -3
- package/lib/built/dispatcher.d.ts +6 -6
- package/lib/built/dispatcher.js +20 -8
- package/lib/built/endpoint-commands.d.ts +3 -0
- package/lib/built/endpoint-commands.js +99 -0
- package/lib/built/endpoint-lifecycle-service.d.ts +28 -0
- package/lib/built/endpoint-lifecycle-service.js +241 -0
- package/lib/built/endpoint-lifecycle.d.ts +0 -1
- package/lib/built/endpoint-lifecycle.js +0 -1
- package/lib/built/endpoint-manager.d.ts +34 -0
- package/lib/built/endpoint-manager.js +1 -0
- package/lib/built/generated-qrcode.d.ts +24 -0
- package/lib/built/generated-qrcode.js +45 -0
- package/lib/built/generic-segment-mapper.d.ts +6 -0
- package/lib/built/generic-segment-mapper.js +232 -0
- package/lib/built/html-renderer-loader.d.ts +13 -0
- package/lib/built/html-renderer-loader.js +33 -0
- package/lib/built/html-segment-fallback.d.ts +2 -2
- package/lib/built/html-segment-fallback.js +0 -1
- package/lib/built/html-to-text.d.ts +0 -1
- package/lib/built/html-to-text.js +0 -1
- package/lib/built/inbound-pipeline.d.ts +0 -1
- package/lib/built/inbound-pipeline.js +0 -1
- package/lib/built/inbound-runner.d.ts +0 -1
- package/lib/built/inbound-runner.js +0 -1
- package/lib/built/interactive-segment-contract.d.ts +6 -0
- package/lib/built/interactive-segment-contract.js +9 -0
- package/lib/built/interactive-segments/action.d.ts +17 -0
- package/lib/built/interactive-segments/action.js +54 -0
- package/lib/built/interactive-segments/button-spec.d.ts +10 -0
- package/lib/built/interactive-segments/button-spec.js +21 -0
- package/lib/built/interactive-segments/handlers.d.ts +9 -0
- package/lib/built/interactive-segments/handlers.js +58 -0
- package/lib/built/interactive-segments/index.d.ts +7 -0
- package/lib/built/interactive-segments/index.js +7 -0
- package/lib/built/interactive-segments/keyboard-segment.d.ts +12 -0
- package/lib/built/interactive-segments/keyboard-segment.js +13 -0
- package/lib/built/interactive-segments/onebot-keyboard.d.ts +10 -0
- package/lib/built/interactive-segments/onebot-keyboard.js +53 -0
- package/lib/built/interactive-segments/resolve.d.ts +9 -0
- package/lib/built/interactive-segments/resolve.js +84 -0
- package/lib/built/interactive-segments/types.d.ts +62 -0
- package/lib/built/interactive-segments/types.js +13 -0
- package/lib/built/introspection-format.d.ts +10 -0
- package/lib/built/introspection-format.js +28 -0
- package/lib/built/login-assist.d.ts +1 -2
- package/lib/built/login-assist.js +0 -1
- package/lib/built/management-command-guard.d.ts +15 -0
- package/lib/built/management-command-guard.js +25 -0
- package/lib/built/message-enrich.d.ts +0 -1
- package/lib/built/message-enrich.js +0 -1
- package/lib/built/message-filter.d.ts +0 -1
- package/lib/built/message-filter.js +1 -3
- package/lib/built/optional-peer-import.d.ts +3 -0
- package/lib/built/optional-peer-import.js +33 -0
- package/lib/built/outbound-media-contract.d.ts +22 -0
- package/lib/built/outbound-media-contract.js +10 -0
- package/lib/built/outbound-media-utils.d.ts +9 -0
- package/lib/built/outbound-media-utils.js +62 -0
- package/lib/built/permission.d.ts +0 -1
- package/lib/built/permission.js +1 -3
- package/lib/built/permit-check.d.ts +0 -1
- package/lib/built/permit-check.js +0 -1
- package/lib/built/permit-parse.d.ts +0 -1
- package/lib/built/permit-parse.js +0 -1
- package/lib/built/platform-permit.d.ts +5 -6
- package/lib/built/platform-permit.js +11 -12
- package/lib/built/prepend-quote-context.d.ts +0 -1
- package/lib/built/prepend-quote-context.js +0 -1
- package/lib/built/qrcode-segment.d.ts +18 -0
- package/lib/built/qrcode-segment.js +78 -0
- package/lib/built/queue-im-field-contract.d.ts +6 -1
- package/lib/built/queue-im-field-contract.js +10 -1
- package/lib/built/rich-segments/adapter-policies.d.ts +9 -0
- package/lib/built/rich-segments/adapter-policies.js +27 -0
- package/lib/built/rich-segments/base.d.ts +11 -0
- package/lib/built/rich-segments/base.js +24 -0
- package/lib/built/rich-segments/builtins.d.ts +4 -0
- package/lib/built/rich-segments/builtins.js +40 -0
- package/lib/built/rich-segments/capabilities.d.ts +6 -0
- package/lib/built/rich-segments/capabilities.js +39 -0
- package/lib/built/rich-segments/html-segment.d.ts +15 -0
- package/lib/built/rich-segments/html-segment.js +65 -0
- package/lib/built/rich-segments/index.d.ts +13 -0
- package/lib/built/rich-segments/index.js +13 -0
- package/lib/built/rich-segments/markdown-segment.d.ts +14 -0
- package/lib/built/rich-segments/markdown-segment.js +61 -0
- package/lib/built/rich-segments/markdown-to-text.d.ts +3 -0
- package/lib/built/rich-segments/markdown-to-text.js +27 -0
- package/lib/built/rich-segments/qrcode-segment.d.ts +18 -0
- package/lib/built/rich-segments/qrcode-segment.js +73 -0
- package/lib/built/rich-segments/registry.d.ts +16 -0
- package/lib/built/rich-segments/registry.js +52 -0
- package/lib/built/rich-segments/resolve.d.ts +5 -0
- package/lib/built/rich-segments/resolve.js +87 -0
- package/lib/built/rich-segments/tts-segment.d.ts +13 -0
- package/lib/built/rich-segments/tts-segment.js +51 -0
- package/lib/built/rich-segments/types.d.ts +84 -0
- package/lib/built/rich-segments/types.js +17 -0
- package/lib/built/roles.d.ts +0 -1
- package/lib/built/roles.js +0 -1
- package/lib/built/runtime-io.d.ts +0 -1
- package/lib/built/runtime-io.js +0 -1
- package/lib/built/schedule.d.ts +55 -0
- package/lib/built/schedule.js +112 -0
- package/lib/built/schema-endpoint-manager.d.ts +17 -0
- package/lib/built/schema-endpoint-manager.js +73 -0
- package/lib/built/schema-feature.d.ts +0 -1
- package/lib/built/schema-feature.js +1 -3
- package/lib/built/segment-contract/assert.d.ts +4 -0
- package/lib/built/segment-contract/assert.js +30 -0
- package/lib/built/segment-contract/delivery.d.ts +5 -0
- package/lib/built/segment-contract/delivery.js +40 -0
- package/lib/built/segment-contract/image.d.ts +5 -0
- package/lib/built/segment-contract/image.js +10 -0
- package/lib/built/segment-contract/index.d.ts +8 -0
- package/lib/built/segment-contract/index.js +7 -0
- package/lib/built/segment-contract/media.d.ts +8 -0
- package/lib/built/segment-contract/media.js +39 -0
- package/lib/built/segment-contract/mention.d.ts +10 -0
- package/lib/built/segment-contract/mention.js +26 -0
- package/lib/built/segment-contract/preview.d.ts +3 -0
- package/lib/built/segment-contract/preview.js +159 -0
- package/lib/built/segment-contract/types.d.ts +70 -0
- package/lib/built/segment-contract/types.js +5 -0
- package/lib/built/segment-contract/validate.d.ts +138 -0
- package/lib/built/segment-contract/validate.js +124 -0
- package/lib/built/skill.d.ts +0 -1
- package/lib/built/skill.js +0 -1
- package/lib/built/speech-loader.d.ts +14 -0
- package/lib/built/speech-loader.js +32 -0
- package/lib/built/tool.d.ts +0 -1
- package/lib/built/tool.js +1 -3
- package/lib/command.d.ts +12 -7
- package/lib/command.js +38 -16
- package/lib/component.d.ts +0 -1
- package/lib/component.js +0 -1
- package/lib/endpoint-capabilities.d.ts +3 -1
- package/lib/endpoint-capabilities.js +0 -1
- package/lib/endpoint.d.ts +0 -1
- package/lib/endpoint.js +0 -1
- package/lib/errors.d.ts +0 -1
- package/lib/errors.js +0 -1
- package/lib/host-plugin-registry.d.ts +0 -1
- package/lib/host-plugin-registry.js +0 -1
- package/lib/im-scene.d.ts +29 -0
- package/lib/im-scene.js +77 -0
- package/lib/im-session-id.d.ts +25 -12
- package/lib/im-session-id.js +35 -17
- package/lib/index.d.ts +25 -5
- package/lib/index.js +22 -4
- package/lib/jsx-dev-runtime.d.ts +0 -1
- package/lib/jsx-dev-runtime.js +0 -1
- package/lib/jsx-runtime.d.ts +0 -1
- package/lib/jsx-runtime.js +0 -1
- package/lib/jsx.d.ts +0 -1
- package/lib/jsx.js +0 -1
- package/lib/message-quote.d.ts +1 -2
- package/lib/message-quote.js +2 -3
- package/lib/message.d.ts +12 -2
- package/lib/message.js +16 -1
- package/lib/models/system-log.d.ts +0 -1
- package/lib/models/system-log.js +0 -1
- package/lib/models/user.d.ts +0 -1
- package/lib/models/user.js +0 -1
- package/lib/notice.d.ts +0 -1
- package/lib/notice.js +0 -1
- package/lib/plugin-context.d.ts +0 -1
- package/lib/plugin-context.js +0 -1
- package/lib/plugin.d.ts +11 -2
- package/lib/plugin.js +22 -23
- package/lib/prompt.d.ts +0 -1
- package/lib/prompt.js +1 -2
- package/lib/request.d.ts +0 -1
- package/lib/request.js +0 -1
- package/lib/tool-zod.d.ts +0 -1
- package/lib/tool-zod.js +0 -1
- package/lib/types-generator.d.ts +0 -1
- package/lib/types-generator.js +0 -1
- package/lib/types.d.ts +30 -11
- package/lib/types.js +0 -1
- package/lib/utils.d.ts +57 -12
- package/lib/utils.js +54 -19
- package/package.json +18 -9
- package/lib/adapter.d.ts.map +0 -1
- package/lib/adapter.js.map +0 -1
- package/lib/agent-prompt.d.ts.map +0 -1
- package/lib/agent-prompt.js.map +0 -1
- package/lib/built/adapter-process.d.ts.map +0 -1
- package/lib/built/adapter-process.js.map +0 -1
- package/lib/built/agent-preset.d.ts.map +0 -1
- package/lib/built/agent-preset.js.map +0 -1
- package/lib/built/ai-trigger.d.ts.map +0 -1
- package/lib/built/ai-trigger.js.map +0 -1
- package/lib/built/authorization.d.ts.map +0 -1
- package/lib/built/authorization.js.map +0 -1
- package/lib/built/command.d.ts.map +0 -1
- package/lib/built/command.js.map +0 -1
- package/lib/built/common-adapter-tools.d.ts.map +0 -1
- package/lib/built/common-adapter-tools.js.map +0 -1
- package/lib/built/component.d.ts.map +0 -1
- package/lib/built/component.js.map +0 -1
- package/lib/built/config.d.ts.map +0 -1
- package/lib/built/config.js.map +0 -1
- package/lib/built/connect-endpoint-instance.d.ts.map +0 -1
- package/lib/built/connect-endpoint-instance.js.map +0 -1
- package/lib/built/cron.d.ts +0 -75
- package/lib/built/cron.d.ts.map +0 -1
- package/lib/built/cron.js +0 -122
- package/lib/built/cron.js.map +0 -1
- package/lib/built/database.d.ts.map +0 -1
- package/lib/built/database.js.map +0 -1
- package/lib/built/dispatcher.d.ts.map +0 -1
- package/lib/built/dispatcher.js.map +0 -1
- package/lib/built/endpoint-lifecycle.d.ts.map +0 -1
- package/lib/built/endpoint-lifecycle.js.map +0 -1
- package/lib/built/html-segment-fallback.d.ts.map +0 -1
- package/lib/built/html-segment-fallback.js.map +0 -1
- package/lib/built/html-to-text.d.ts.map +0 -1
- package/lib/built/html-to-text.js.map +0 -1
- package/lib/built/inbound-pipeline.d.ts.map +0 -1
- package/lib/built/inbound-pipeline.js.map +0 -1
- package/lib/built/inbound-runner.d.ts.map +0 -1
- package/lib/built/inbound-runner.js.map +0 -1
- package/lib/built/login-assist.d.ts.map +0 -1
- package/lib/built/login-assist.js.map +0 -1
- package/lib/built/mcp-mesh-registrar.d.ts +0 -9
- package/lib/built/mcp-mesh-registrar.d.ts.map +0 -1
- package/lib/built/mcp-mesh-registrar.js +0 -17
- package/lib/built/mcp-mesh-registrar.js.map +0 -1
- package/lib/built/message-enrich.d.ts.map +0 -1
- package/lib/built/message-enrich.js.map +0 -1
- package/lib/built/message-filter.d.ts.map +0 -1
- package/lib/built/message-filter.js.map +0 -1
- package/lib/built/permission.d.ts.map +0 -1
- package/lib/built/permission.js.map +0 -1
- package/lib/built/permit-check.d.ts.map +0 -1
- package/lib/built/permit-check.js.map +0 -1
- package/lib/built/permit-parse.d.ts.map +0 -1
- package/lib/built/permit-parse.js.map +0 -1
- package/lib/built/platform-permit.d.ts.map +0 -1
- package/lib/built/platform-permit.js.map +0 -1
- package/lib/built/prepend-quote-context.d.ts.map +0 -1
- package/lib/built/prepend-quote-context.js.map +0 -1
- package/lib/built/queue-im-field-contract.d.ts.map +0 -1
- package/lib/built/queue-im-field-contract.js.map +0 -1
- package/lib/built/roles.d.ts.map +0 -1
- package/lib/built/roles.js.map +0 -1
- package/lib/built/runtime-io.d.ts.map +0 -1
- package/lib/built/runtime-io.js.map +0 -1
- package/lib/built/schema-feature.d.ts.map +0 -1
- package/lib/built/schema-feature.js.map +0 -1
- package/lib/built/skill.d.ts.map +0 -1
- package/lib/built/skill.js.map +0 -1
- package/lib/built/tool.d.ts.map +0 -1
- package/lib/built/tool.js.map +0 -1
- package/lib/command.d.ts.map +0 -1
- package/lib/command.js.map +0 -1
- package/lib/component.d.ts.map +0 -1
- package/lib/component.js.map +0 -1
- package/lib/endpoint-capabilities.d.ts.map +0 -1
- package/lib/endpoint-capabilities.js.map +0 -1
- package/lib/endpoint.d.ts.map +0 -1
- package/lib/endpoint.js.map +0 -1
- package/lib/errors.d.ts.map +0 -1
- package/lib/errors.js.map +0 -1
- package/lib/host-plugin-registry.d.ts.map +0 -1
- package/lib/host-plugin-registry.js.map +0 -1
- package/lib/im-session-id.d.ts.map +0 -1
- package/lib/im-session-id.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/jsx-dev-runtime.d.ts.map +0 -1
- package/lib/jsx-dev-runtime.js.map +0 -1
- package/lib/jsx-runtime.d.ts.map +0 -1
- package/lib/jsx-runtime.js.map +0 -1
- package/lib/jsx.d.ts.map +0 -1
- package/lib/jsx.js.map +0 -1
- package/lib/message-quote.d.ts.map +0 -1
- package/lib/message-quote.js.map +0 -1
- package/lib/message.d.ts.map +0 -1
- package/lib/message.js.map +0 -1
- package/lib/models/system-log.d.ts.map +0 -1
- package/lib/models/system-log.js.map +0 -1
- package/lib/models/user.d.ts.map +0 -1
- package/lib/models/user.js.map +0 -1
- package/lib/notice.d.ts.map +0 -1
- package/lib/notice.js.map +0 -1
- package/lib/plugin-context.d.ts.map +0 -1
- package/lib/plugin-context.js.map +0 -1
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js.map +0 -1
- package/lib/prompt.d.ts.map +0 -1
- package/lib/prompt.js.map +0 -1
- package/lib/request.d.ts.map +0 -1
- package/lib/request.js.map +0 -1
- package/lib/scheduler/scheduler.d.ts +0 -49
- package/lib/scheduler/scheduler.d.ts.map +0 -1
- package/lib/scheduler/scheduler.js +0 -352
- package/lib/scheduler/scheduler.js.map +0 -1
- package/lib/scheduler/types.d.ts +0 -71
- package/lib/scheduler/types.d.ts.map +0 -1
- package/lib/scheduler/types.js +0 -8
- package/lib/scheduler/types.js.map +0 -1
- package/lib/tool-zod.d.ts.map +0 -1
- package/lib/tool-zod.js.map +0 -1
- package/lib/types-generator.d.ts.map +0 -1
- package/lib/types-generator.js.map +0 -1
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js.map +0 -1
- package/lib/utils.d.ts.map +0 -1
- package/lib/utils.js.map +0 -1
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Scene Management — 方法规范与 Tool 工厂
|
|
3
3
|
*
|
|
4
4
|
* 设计理念:
|
|
5
|
-
* 各 IM
|
|
5
|
+
* 各 IM 平台在适配器内自行实现场景治理方法(removeMember、muteMember 等),
|
|
6
6
|
* 并自行注册 Tool;平台说明使用包内 `skills/<adapter>/SKILL.md`。
|
|
7
7
|
*
|
|
8
8
|
* 使用方式(在各适配器 start 或注册方法中):
|
|
9
9
|
*
|
|
10
|
-
* import {
|
|
11
|
-
* const tools =
|
|
10
|
+
* import { createSceneManagementTools, SCENE_MANAGEMENT_SKILL_KEYWORDS, SCENE_MANAGEMENT_SKILL_TAGS } from 'zhin.js';
|
|
11
|
+
* const tools = createSceneManagementTools(this, this.name);
|
|
12
12
|
* tools.forEach(t => this.addTool(t));
|
|
13
13
|
* // 另:包内 skills/<name>/SKILL.md 供 Agent 发现
|
|
14
14
|
*/
|
|
15
|
-
import {
|
|
16
|
-
export const
|
|
15
|
+
import { registerDefaultScenePlatformPermitChecker } from './platform-permit.js';
|
|
16
|
+
export const SCENE_MANAGEMENT_METHOD_SPECS = [
|
|
17
17
|
{
|
|
18
|
-
method: '
|
|
19
|
-
toolSuffix: '
|
|
20
|
-
description: '
|
|
18
|
+
method: 'removeMember',
|
|
19
|
+
toolSuffix: 'remove_member',
|
|
20
|
+
description: '将成员移出当前 IM 场景。适用于严重违规、广告号等需要移除的场景。如果只需要用户名而没有 user_id,请先调用 list_members 查询',
|
|
21
21
|
keywords: ['踢', 'kick', '移除', '踢出'],
|
|
22
|
-
permit: '
|
|
22
|
+
permit: 'scene_admin',
|
|
23
23
|
extraParams: {
|
|
24
24
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
25
25
|
},
|
|
@@ -30,7 +30,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
30
30
|
toolSuffix: 'mute_member',
|
|
31
31
|
description: '禁言或解除禁言群成员。适用于违规发言、刷屏、骚扰他人等需要临时限制发言的场景。duration 单位为秒,传 0 表示解除禁言。默认禁言 10 分钟(600秒)。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
32
32
|
keywords: ['禁言', 'mute', '静音', '解除禁言', '解禁', '闭嘴'],
|
|
33
|
-
permit: '
|
|
33
|
+
permit: 'scene_admin',
|
|
34
34
|
extraParams: {
|
|
35
35
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
36
36
|
duration: { type: 'number', description: '禁言时长(秒),0=解除禁言,默认600(10分钟)。常用值:60=1分钟, 600=10分钟, 3600=1小时, 86400=1天', default: 600 },
|
|
@@ -42,7 +42,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
42
42
|
toolSuffix: 'set_nickname',
|
|
43
43
|
description: '设置群成员的群昵称/名片。仅修改群内显示名称,不影响用户的全局昵称。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
44
44
|
keywords: ['昵称', '名片', 'nickname', 'card', '改名片'],
|
|
45
|
-
permit: '
|
|
45
|
+
permit: 'scene_admin',
|
|
46
46
|
extraParams: {
|
|
47
47
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
48
48
|
nickname: { type: 'string', description: '新的群昵称/名片' },
|
|
@@ -50,11 +50,11 @@ export const GROUP_METHOD_SPECS = [
|
|
|
50
50
|
extraRequired: ['user_id', 'nickname'],
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
|
-
method: '
|
|
54
|
-
toolSuffix: '
|
|
55
|
-
description: '
|
|
53
|
+
method: 'setModerator',
|
|
54
|
+
toolSuffix: 'set_moderator',
|
|
55
|
+
description: '设置或取消场景管理员。注意:此操作通常需要场景所有者权限。enable=true 为设置管理员,enable=false 为取消管理员。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
56
56
|
keywords: ['管理员', 'admin', '设置管理', '取消管理', '提升管理', '撤销管理'],
|
|
57
|
-
permit: '
|
|
57
|
+
permit: 'scene_owner',
|
|
58
58
|
extraParams: {
|
|
59
59
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
60
60
|
enable: { type: 'boolean', description: 'true=设置为管理员,false=取消管理员身份', default: true },
|
|
@@ -74,7 +74,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
74
74
|
toolSuffix: 'ban_member',
|
|
75
75
|
description: '永久封禁成员(拉入黑名单)。与踢人(kick)不同,封禁后该成员无法再加入群聊。适用于恶意用户、严重违规等需要永久禁止的场景。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
76
76
|
keywords: ['封禁', 'ban', '拉黑', '黑名单'],
|
|
77
|
-
permit: '
|
|
77
|
+
permit: 'scene_admin',
|
|
78
78
|
extraParams: {
|
|
79
79
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
80
80
|
reason: { type: 'string', description: '封禁原因(将记录在封禁日志中)' },
|
|
@@ -86,37 +86,37 @@ export const GROUP_METHOD_SPECS = [
|
|
|
86
86
|
toolSuffix: 'unban_member',
|
|
87
87
|
description: '解除封禁,将成员从黑名单中移除。解除后该成员可以重新加入群聊。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
88
88
|
keywords: ['解封', 'unban', '解除封禁', '移出黑名单'],
|
|
89
|
-
permit: '
|
|
89
|
+
permit: 'scene_admin',
|
|
90
90
|
extraParams: {
|
|
91
91
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
92
92
|
},
|
|
93
93
|
extraRequired: ['user_id'],
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
|
-
method: '
|
|
97
|
-
toolSuffix: '
|
|
98
|
-
description: '
|
|
96
|
+
method: 'renameScene',
|
|
97
|
+
toolSuffix: 'rename_scene',
|
|
98
|
+
description: '修改 IM 场景名称。修改后所有成员立即可见新名称',
|
|
99
99
|
keywords: ['群名', '改名', 'group name', '修改群名'],
|
|
100
|
-
permit: '
|
|
100
|
+
permit: 'scene_admin',
|
|
101
101
|
extraParams: {
|
|
102
102
|
name: { type: 'string', description: '新群名称' },
|
|
103
103
|
},
|
|
104
104
|
extraRequired: ['name'],
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
|
-
method: '
|
|
108
|
-
toolSuffix: '
|
|
109
|
-
description: '
|
|
107
|
+
method: 'setSceneMuted',
|
|
108
|
+
toolSuffix: 'set_scene_muted',
|
|
109
|
+
description: '开启或关闭场景全员禁言。开启后除管理员外所有成员都无法发言。适用于紧急维护、重要通知、聊天秩序混乱等场景。enable=true 开启,enable=false 解除',
|
|
110
110
|
keywords: ['全员禁言', 'mute all', '全体禁言', '全体解禁'],
|
|
111
|
-
permit: '
|
|
111
|
+
permit: 'scene_admin',
|
|
112
112
|
extraParams: {
|
|
113
113
|
enable: { type: 'boolean', description: 'true=开启全员禁言,false=解除全员禁言', default: true },
|
|
114
114
|
},
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
|
-
method: '
|
|
118
|
-
toolSuffix: '
|
|
119
|
-
description: '
|
|
117
|
+
method: 'getSceneInfo',
|
|
118
|
+
toolSuffix: 'get_scene_info',
|
|
119
|
+
description: '获取 IM 场景基本信息,包括名称、所有者、成员数量、创建时间等。用于了解场景概况',
|
|
120
120
|
keywords: ['群信息', 'group info', '群资料', '群详情'],
|
|
121
121
|
extraParams: {},
|
|
122
122
|
preExecutable: true,
|
|
@@ -125,12 +125,12 @@ export const GROUP_METHOD_SPECS = [
|
|
|
125
125
|
// ============================================================================
|
|
126
126
|
// Skill 常量(群管相关 SKILL.md 与文档可复用 keywords/tags)
|
|
127
127
|
// ============================================================================
|
|
128
|
-
export const
|
|
129
|
-
export const
|
|
130
|
-
'群管理', '踢人', '禁言', '封禁', '管理员', '群名',
|
|
128
|
+
export const SCENE_MANAGEMENT_SKILL_TAGS = ['scene', 'management', 'im', 'admin'];
|
|
129
|
+
export const SCENE_MANAGEMENT_SKILL_KEYWORDS = [
|
|
130
|
+
'场景治理', '群管理', '踢人', '禁言', '封禁', '管理员', '群名',
|
|
131
131
|
'成员', 'kick', 'mute', 'ban', 'admin', 'members',
|
|
132
132
|
];
|
|
133
|
-
export function
|
|
133
|
+
export function defaultScenePermitResolver(adapterPrefix) {
|
|
134
134
|
return (logicalPerm) => `platform(${adapterPrefix},${logicalPerm})`;
|
|
135
135
|
}
|
|
136
136
|
function resolveSpecPermit(specPerm, prefix, permitResolver) {
|
|
@@ -139,12 +139,12 @@ function resolveSpecPermit(specPerm, prefix, permitResolver) {
|
|
|
139
139
|
const resolved = permitResolver(specPerm);
|
|
140
140
|
return resolved ? [resolved] : undefined;
|
|
141
141
|
}
|
|
142
|
-
export function
|
|
143
|
-
const permitResolver = options.permitResolver ??
|
|
142
|
+
export function createSceneManagementTools(adapter, prefix, options = {}) {
|
|
143
|
+
const permitResolver = options.permitResolver ?? defaultScenePermitResolver(prefix);
|
|
144
144
|
if (options.registerChecker !== false) {
|
|
145
|
-
|
|
145
|
+
registerDefaultScenePlatformPermitChecker(prefix);
|
|
146
146
|
}
|
|
147
|
-
return
|
|
147
|
+
return createSceneManagementToolsRaw(adapter, prefix, (spec, prefix, execute) => {
|
|
148
148
|
const specPermissions = resolveSpecPermit(spec.permit, prefix, permitResolver);
|
|
149
149
|
return {
|
|
150
150
|
name: `${prefix}_${spec.toolSuffix}`,
|
|
@@ -153,13 +153,13 @@ export function createGroupManagementTools(adapter, prefix, options = {}) {
|
|
|
153
153
|
type: 'object',
|
|
154
154
|
properties: {
|
|
155
155
|
endpoint_id: { type: 'string', description: 'Endpoint ID', contextKey: 'endpointId' },
|
|
156
|
-
scene_id: { type: 'string', description: '
|
|
156
|
+
scene_id: { type: 'string', description: 'IM 场景 ID', contextKey: 'sceneId' },
|
|
157
157
|
...Object.fromEntries(Object.entries(spec.extraParams)),
|
|
158
158
|
},
|
|
159
159
|
required: ['endpoint_id', 'scene_id', ...(spec.extraRequired ?? [])],
|
|
160
160
|
},
|
|
161
161
|
execute,
|
|
162
|
-
tags: ['
|
|
162
|
+
tags: ['scene', 'management', prefix],
|
|
163
163
|
keywords: spec.keywords,
|
|
164
164
|
...(specPermissions ? { permissions: specPermissions } : {}),
|
|
165
165
|
scopes: ['group', 'channel'],
|
|
@@ -167,16 +167,16 @@ export function createGroupManagementTools(adapter, prefix, options = {}) {
|
|
|
167
167
|
};
|
|
168
168
|
});
|
|
169
169
|
}
|
|
170
|
-
export function
|
|
170
|
+
export function createSceneManagementToolsRaw(adapter, prefix, factory) {
|
|
171
171
|
const tools = [];
|
|
172
|
-
for (const spec of
|
|
172
|
+
for (const spec of SCENE_MANAGEMENT_METHOD_SPECS) {
|
|
173
173
|
const fn = adapter[spec.method];
|
|
174
174
|
if (typeof fn !== 'function')
|
|
175
175
|
continue;
|
|
176
176
|
const boundFn = fn.bind(adapter);
|
|
177
177
|
const execute = async (args) => {
|
|
178
178
|
const { endpoint_id, scene_id, ...rest } = args;
|
|
179
|
-
const methodArgs =
|
|
179
|
+
const methodArgs = buildSceneMethodArgs(spec.method, endpoint_id, scene_id, rest);
|
|
180
180
|
return boundFn.apply(adapter, methodArgs);
|
|
181
181
|
};
|
|
182
182
|
tools.push(factory(spec, prefix, execute));
|
|
@@ -186,19 +186,18 @@ export function createGroupManagementToolsRaw(adapter, prefix, factory) {
|
|
|
186
186
|
// ============================================================================
|
|
187
187
|
// 参数映射(method → 有序参数列表)
|
|
188
188
|
// ============================================================================
|
|
189
|
-
export function
|
|
189
|
+
export function buildSceneMethodArgs(method, endpointId, sceneId, rest) {
|
|
190
190
|
switch (method) {
|
|
191
|
-
case '
|
|
191
|
+
case 'removeMember': return [endpointId, sceneId, rest.user_id];
|
|
192
192
|
case 'muteMember': return [endpointId, sceneId, rest.user_id, rest.duration ?? 600];
|
|
193
193
|
case 'setMemberNickname': return [endpointId, sceneId, rest.user_id, rest.nickname];
|
|
194
|
-
case '
|
|
194
|
+
case 'setModerator': return [endpointId, sceneId, rest.user_id, rest.enable ?? true];
|
|
195
195
|
case 'listMembers': return [endpointId, sceneId];
|
|
196
196
|
case 'banMember': return [endpointId, sceneId, rest.user_id, rest.reason];
|
|
197
197
|
case 'unbanMember': return [endpointId, sceneId, rest.user_id];
|
|
198
|
-
case '
|
|
199
|
-
case '
|
|
200
|
-
case '
|
|
198
|
+
case 'renameScene': return [endpointId, sceneId, rest.name];
|
|
199
|
+
case 'setSceneMuted': return [endpointId, sceneId, rest.enable ?? true];
|
|
200
|
+
case 'getSceneInfo': return [endpointId, sceneId];
|
|
201
201
|
default: return [endpointId, sceneId, ...Object.values(rest)];
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
|
-
//# sourceMappingURL=common-adapter-tools.js.map
|
package/lib/built/component.d.ts
CHANGED
package/lib/built/component.js
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Feature } from "@zhin.js/kernel";
|
|
6
6
|
import { renderComponents } from "../component.js";
|
|
7
|
-
import { getPlugin } from "../plugin.js";
|
|
8
7
|
/**
|
|
9
8
|
* 组件服务 Feature
|
|
10
9
|
*/
|
|
@@ -87,7 +86,7 @@ export class ComponentFeature extends Feature {
|
|
|
87
86
|
const feature = this;
|
|
88
87
|
return {
|
|
89
88
|
addComponent(component) {
|
|
90
|
-
const plugin =
|
|
89
|
+
const plugin = this;
|
|
91
90
|
const dispose = feature.add(component, plugin.name);
|
|
92
91
|
plugin.recordFeatureContribution(feature.name, component.name);
|
|
93
92
|
plugin.onDispose(dispose);
|
|
@@ -96,4 +95,3 @@ export class ComponentFeature extends Feature {
|
|
|
96
95
|
};
|
|
97
96
|
}
|
|
98
97
|
}
|
|
99
|
-
//# sourceMappingURL=component.js.map
|
package/lib/built/config.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export declare class ConfigLoader<T extends object> {
|
|
|
10
10
|
get data(): T;
|
|
11
11
|
get raw(): T;
|
|
12
12
|
get extension(): string;
|
|
13
|
+
/** `load()` / `patchKey()` 使用的绝对路径 */
|
|
14
|
+
get resolvedPath(): string;
|
|
13
15
|
constructor(filename: string, initial: T, schema?: Schema<T> | undefined);
|
|
14
16
|
resolvePath(baseDir?: string): string;
|
|
15
17
|
load(baseDir?: string): void;
|
|
@@ -20,6 +22,8 @@ export declare class ConfigLoader<T extends object> {
|
|
|
20
22
|
*/
|
|
21
23
|
patchKey(key: string, value: any): void;
|
|
22
24
|
}
|
|
25
|
+
/** 解析 endpoint 配置中的 `${ENV}` 引用(运行时 add 后热连接用) */
|
|
26
|
+
export declare function resolveEndpointConfigEnv(config: Record<string, unknown>): Record<string, unknown>;
|
|
23
27
|
export declare function mergeConfigDefaults<T>(defaults: T, overrides: unknown): T;
|
|
24
28
|
export declare namespace ConfigLoader {
|
|
25
29
|
const supportedExtensions: string[];
|
|
@@ -96,4 +100,3 @@ export declare class ConfigFeature extends Feature<ConfigRecord> {
|
|
|
96
100
|
* @deprecated Use ConfigFeature instead
|
|
97
101
|
*/
|
|
98
102
|
export declare const ConfigService: typeof ConfigFeature;
|
|
99
|
-
//# sourceMappingURL=config.d.ts.map
|
package/lib/built/config.js
CHANGED
|
@@ -8,7 +8,6 @@ import fs from "node:fs";
|
|
|
8
8
|
import { stringify as stringifyYaml, parse as parseYaml, parseDocument } from "yaml";
|
|
9
9
|
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
10
10
|
import { Feature } from "@zhin.js/kernel";
|
|
11
|
-
import { getPlugin } from "../plugin.js";
|
|
12
11
|
/** Deno / Node 统一的工作目录(`Deno.chdir` 后应与 `process.cwd()` 一致) */
|
|
13
12
|
export function runtimeCwd() {
|
|
14
13
|
const g = globalThis;
|
|
@@ -37,6 +36,10 @@ export class ConfigLoader {
|
|
|
37
36
|
get extension() {
|
|
38
37
|
return path.extname(this.filename).toLowerCase();
|
|
39
38
|
}
|
|
39
|
+
/** `load()` / `patchKey()` 使用的绝对路径 */
|
|
40
|
+
get resolvedPath() {
|
|
41
|
+
return this.#resolvedPath || this.resolvePath();
|
|
42
|
+
}
|
|
40
43
|
constructor(filename, initial, schema) {
|
|
41
44
|
this.filename = filename;
|
|
42
45
|
this.initial = initial;
|
|
@@ -96,8 +99,10 @@ export class ConfigLoader {
|
|
|
96
99
|
? this.filename
|
|
97
100
|
: path.resolve(baseDir, this.filename);
|
|
98
101
|
}
|
|
99
|
-
load(baseDir
|
|
100
|
-
const fullPath =
|
|
102
|
+
load(baseDir) {
|
|
103
|
+
const fullPath = baseDir !== undefined
|
|
104
|
+
? this.resolvePath(baseDir)
|
|
105
|
+
: (this.#resolvedPath || this.resolvePath());
|
|
101
106
|
this.#resolvedPath = fullPath;
|
|
102
107
|
if (!fs.existsSync(fullPath)) {
|
|
103
108
|
try {
|
|
@@ -197,6 +202,23 @@ function isPlainObject(value) {
|
|
|
197
202
|
&& !Array.isArray(value)
|
|
198
203
|
&& Object.getPrototypeOf(value) === Object.prototype;
|
|
199
204
|
}
|
|
205
|
+
/** 解析 endpoint 配置中的 `${ENV}` 引用(运行时 add 后热连接用) */
|
|
206
|
+
export function resolveEndpointConfigEnv(config) {
|
|
207
|
+
const out = { ...config };
|
|
208
|
+
for (const [key, value] of Object.entries(out)) {
|
|
209
|
+
if (typeof value !== 'string')
|
|
210
|
+
continue;
|
|
211
|
+
const match = value.match(/^\$\{([^}]+)\}$/);
|
|
212
|
+
if (!match)
|
|
213
|
+
continue;
|
|
214
|
+
const envKey = match[1];
|
|
215
|
+
const resolved = envLookup(envKey);
|
|
216
|
+
if (resolved != null && resolved !== '') {
|
|
217
|
+
out[key] = resolved;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return out;
|
|
221
|
+
}
|
|
200
222
|
export function mergeConfigDefaults(defaults, overrides) {
|
|
201
223
|
if (Array.isArray(defaults)) {
|
|
202
224
|
return (Array.isArray(overrides) ? overrides : defaults);
|
|
@@ -327,7 +349,7 @@ export class ConfigFeature extends Feature {
|
|
|
327
349
|
const feature = this;
|
|
328
350
|
return {
|
|
329
351
|
addConfig(key, defaultValue) {
|
|
330
|
-
const plugin =
|
|
352
|
+
const plugin = this;
|
|
331
353
|
// 尝试写入主配置文件(如果 key 不存在)
|
|
332
354
|
if (feature.#primaryConfigFile) {
|
|
333
355
|
const config = feature.configs.get(feature.#primaryConfigFile);
|
|
@@ -352,4 +374,3 @@ export class ConfigFeature extends Feature {
|
|
|
352
374
|
* @deprecated Use ConfigFeature instead
|
|
353
375
|
*/
|
|
354
376
|
export const ConfigService = ConfigFeature;
|
|
355
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -15,4 +15,3 @@ export declare function connectEndpointInstance(options: ConnectEndpointInstance
|
|
|
15
15
|
* 按 Endpoint capabilities 断开单个实例。
|
|
16
16
|
*/
|
|
17
17
|
export declare function disconnectEndpointInstance(plugin: Plugin, adapter: Adapter, endpoint: Endpoint): Promise<void>;
|
|
18
|
-
//# sourceMappingURL=connect-endpoint-instance.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assertInbound, getAdapterCapabilities, hasInbound, registerEndpointCapabilities, resolveEndpointCapabilities, } from '../endpoint-capabilities.js';
|
|
2
2
|
import { emitEndpointLifecycle } from './endpoint-lifecycle.js';
|
|
3
|
+
import { resolveEndpointConfigEnv } from './config.js';
|
|
3
4
|
/**
|
|
4
5
|
* 按 Endpoint capabilities 连接或注册单个实例(connectEndpoints 与 Adapter.start 共用)。
|
|
5
6
|
*/
|
|
@@ -7,7 +8,8 @@ export async function connectEndpointInstance(options) {
|
|
|
7
8
|
const { plugin, adapter, config } = options;
|
|
8
9
|
const adapterCaps = getAdapterCapabilities(adapter);
|
|
9
10
|
const caps = resolveEndpointCapabilities(adapterCaps, config.capabilities);
|
|
10
|
-
const
|
|
11
|
+
const resolvedConfig = resolveEndpointConfigEnv(config);
|
|
12
|
+
const endpoint = adapter.createEndpoint(resolvedConfig);
|
|
11
13
|
registerEndpointCapabilities(endpoint, caps);
|
|
12
14
|
if (caps.includes('inbound')) {
|
|
13
15
|
assertInbound(endpoint);
|
|
@@ -38,4 +40,3 @@ export async function disconnectEndpointInstance(plugin, adapter, endpoint) {
|
|
|
38
40
|
await endpoint.$disconnect();
|
|
39
41
|
await emitEndpointLifecycle(plugin, adapter, endpoint, 'disconnect');
|
|
40
42
|
}
|
|
41
|
-
//# sourceMappingURL=connect-endpoint-instance.js.map
|
package/lib/built/database.d.ts
CHANGED
package/lib/built/database.js
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
import { Registry } from "@zhin.js/database";
|
|
6
6
|
import { formatCompact } from '@zhin.js/logger';
|
|
7
7
|
import { Feature } from "@zhin.js/kernel";
|
|
8
|
-
import { getPlugin } from "../plugin.js";
|
|
9
8
|
import { SystemLogDefinition } from "../models/system-log.js";
|
|
10
9
|
import { UserDefinition } from "../models/user.js";
|
|
11
10
|
const databaseAfterStartHooks = [];
|
|
@@ -96,7 +95,7 @@ export class DatabaseFeature extends Feature {
|
|
|
96
95
|
const feature = this;
|
|
97
96
|
return {
|
|
98
97
|
defineModel(name, definition) {
|
|
99
|
-
const plugin =
|
|
98
|
+
const plugin = this;
|
|
100
99
|
const record = { name: name, definition };
|
|
101
100
|
const dispose = feature.add(record, plugin.name);
|
|
102
101
|
plugin.recordFeatureContribution(feature.name, name);
|
|
@@ -105,4 +104,3 @@ export class DatabaseFeature extends Feature {
|
|
|
105
104
|
};
|
|
106
105
|
}
|
|
107
106
|
}
|
|
108
|
-
//# sourceMappingURL=database.js.map
|
|
@@ -27,12 +27,9 @@
|
|
|
27
27
|
* 默认路由为 exclusive(命令与 AI 互斥);需双轨时请显式 dualRoute.mode: 'dual'。
|
|
28
28
|
*/
|
|
29
29
|
import { Message } from '../message.js';
|
|
30
|
-
import type { MessageMiddleware, RegisteredAdapter, MaybePromise, SendContent, OutboundReplySource, OutboundPolishMiddleware } from '../types.js';
|
|
30
|
+
import type { MessageMiddleware, RegisteredAdapter, MaybePromise, SendContent, OutboundReplySource, OutboundPolishMiddleware, OutboundReplyStore } from '../types.js';
|
|
31
31
|
import type { Context } from '../plugin.js';
|
|
32
|
-
export declare function getOutboundReplyStore():
|
|
33
|
-
message: Message<any>;
|
|
34
|
-
source: OutboundReplySource;
|
|
35
|
-
} | undefined;
|
|
32
|
+
export declare function getOutboundReplyStore(): OutboundReplyStore | undefined;
|
|
36
33
|
/**
|
|
37
34
|
* 路由判定结果(互斥模式 legacy)
|
|
38
35
|
*/
|
|
@@ -110,6 +107,10 @@ export interface MessageDispatcherService {
|
|
|
110
107
|
* 在 `before.sendMessage` 管道内调用 `message.$reply`(与 Adapter#sendMessage 同一出站链)
|
|
111
108
|
*/
|
|
112
109
|
replyWithPolish(message: Message<any>, source: ReplySource, content: SendContent, options?: ReplyWithPolishOptions): Promise<unknown>;
|
|
110
|
+
/** Proactive 出站:在 ALS 内执行 send,触发 outbound polish / before.sendMessage */
|
|
111
|
+
runWithOutboundPolish<T>(store: Pick<OutboundReplyStore, 'message' | 'trigger' | 'proactiveSource'> & {
|
|
112
|
+
source?: OutboundReplySource;
|
|
113
|
+
}, fn: () => Promise<T>): Promise<T>;
|
|
113
114
|
/**
|
|
114
115
|
* 是否匹配为指令路径(与 dispatch 内判定一致)
|
|
115
116
|
*/
|
|
@@ -136,4 +137,3 @@ declare module '../plugin.js' {
|
|
|
136
137
|
}
|
|
137
138
|
}
|
|
138
139
|
export declare function createMessageDispatcher(options?: CreateMessageDispatcherOptions): Context<'dispatcher', DispatcherContextExtensions>;
|
|
139
|
-
//# sourceMappingURL=dispatcher.d.ts.map
|
package/lib/built/dispatcher.js
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* 默认路由为 exclusive(命令与 AI 互斥);需双轨时请显式 dualRoute.mode: 'dual'。
|
|
28
28
|
*/
|
|
29
29
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
30
|
-
import {
|
|
30
|
+
import { isActionMessage } from './interactive-segments/action.js';
|
|
31
31
|
/** Dispatcher 管理的「会话回复」异步上下文,供 `before.sendMessage` 内读取(与 Adapter.renderSendMessage 同链) */
|
|
32
32
|
const outboundReplyAls = new AsyncLocalStorage();
|
|
33
33
|
export function getOutboundReplyStore() {
|
|
@@ -206,10 +206,22 @@ export function createMessageDispatcher(options) {
|
|
|
206
206
|
if (!rootPlugin) {
|
|
207
207
|
return quote ? message.$reply(content, quote) : message.$reply(content);
|
|
208
208
|
}
|
|
209
|
-
return outboundReplyAls.run({
|
|
209
|
+
return outboundReplyAls.run({
|
|
210
|
+
message,
|
|
211
|
+
source,
|
|
212
|
+
trigger: 'inbound',
|
|
213
|
+
}, () => quote ? message.$reply(content, quote) : message.$reply(content));
|
|
214
|
+
}
|
|
215
|
+
async function runWithOutboundPolish(store, fn) {
|
|
216
|
+
return outboundReplyAls.run({
|
|
217
|
+
message: store.message,
|
|
218
|
+
source: store.source ?? 'proactive',
|
|
219
|
+
trigger: store.trigger,
|
|
220
|
+
proactiveSource: store.proactiveSource,
|
|
221
|
+
}, fn);
|
|
210
222
|
}
|
|
211
223
|
async function maybeRecordGroupPassiveContext(message) {
|
|
212
|
-
if (!groupPassiveContextHandler)
|
|
224
|
+
if (!groupPassiveContextHandler || isActionMessage(message))
|
|
213
225
|
return;
|
|
214
226
|
const scope = message.$channel?.type;
|
|
215
227
|
if (scope !== 'group' && scope !== 'channel')
|
|
@@ -336,6 +348,9 @@ export function createMessageDispatcher(options) {
|
|
|
336
348
|
replyWithPolish(message, source, content, options) {
|
|
337
349
|
return replyWithPolishInternal(message, source, content, options);
|
|
338
350
|
},
|
|
351
|
+
runWithOutboundPolish(store, fn) {
|
|
352
|
+
return runWithOutboundPolish(store, fn);
|
|
353
|
+
},
|
|
339
354
|
matchCommand(message) {
|
|
340
355
|
return matchCommandInternal(message);
|
|
341
356
|
},
|
|
@@ -354,18 +369,15 @@ export function createMessageDispatcher(options) {
|
|
|
354
369
|
},
|
|
355
370
|
extensions: {
|
|
356
371
|
addGuardrail(guardrail) {
|
|
357
|
-
const plugin = getPlugin();
|
|
358
372
|
const dispose = service.addGuardrail(guardrail);
|
|
359
|
-
|
|
373
|
+
rootPlugin?.onDispose(dispose);
|
|
360
374
|
return dispose;
|
|
361
375
|
},
|
|
362
376
|
addOutboundPolish(handler) {
|
|
363
|
-
const plugin = getPlugin();
|
|
364
377
|
const dispose = service.addOutboundPolish(handler);
|
|
365
|
-
|
|
378
|
+
rootPlugin?.onDispose(dispose);
|
|
366
379
|
return dispose;
|
|
367
380
|
},
|
|
368
381
|
},
|
|
369
382
|
};
|
|
370
383
|
}
|
|
371
|
-
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IM Endpoint 管理与 /endpoints 内省命令(@zhin.js/core)
|
|
3
|
+
*/
|
|
4
|
+
import { Adapter } from '../adapter.js';
|
|
5
|
+
import { MessageCommand } from '../command.js';
|
|
6
|
+
import { MANAGEMENT_OPERATOR_PERMIT } from './management-command-guard.js';
|
|
7
|
+
import { createEndpointLifecycleService } from './endpoint-lifecycle-service.js';
|
|
8
|
+
import { endpointHelpText, formatEndpointsList } from './introspection-format.js';
|
|
9
|
+
function collectRuntimeEndpoints(root) {
|
|
10
|
+
const rows = [];
|
|
11
|
+
for (const adapterName of root.adapters) {
|
|
12
|
+
const adapter = root.inject(adapterName);
|
|
13
|
+
if (!(adapter instanceof Adapter))
|
|
14
|
+
continue;
|
|
15
|
+
for (const [endpointId, endpoint] of adapter.endpoints.entries()) {
|
|
16
|
+
rows.push({
|
|
17
|
+
adapter: String(adapterName),
|
|
18
|
+
name: endpointId,
|
|
19
|
+
online: !!endpoint.$connected,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return rows;
|
|
24
|
+
}
|
|
25
|
+
export function registerEndpointManagementCommands(plugin, commandService) {
|
|
26
|
+
const root = plugin.root;
|
|
27
|
+
const disposers = [];
|
|
28
|
+
const service = () => createEndpointLifecycleService(root);
|
|
29
|
+
const register = (pattern, desc, handler) => {
|
|
30
|
+
const cmd = new MessageCommand(pattern)
|
|
31
|
+
.desc(desc)
|
|
32
|
+
.permit(MANAGEMENT_OPERATOR_PERMIT)
|
|
33
|
+
.action(async (message, match) => {
|
|
34
|
+
try {
|
|
35
|
+
return await handler(message, match);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
return `❌ ${err instanceof Error ? err.message : String(err)}`;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
commandService.add(cmd, plugin.name);
|
|
42
|
+
disposers.push(() => commandService.remove(cmd));
|
|
43
|
+
};
|
|
44
|
+
register('/endpoint help', 'Endpoint 管理帮助', () => endpointHelpText());
|
|
45
|
+
register('/endpoint add [adapter:word]', '添加 Endpoint', async (message, match) => {
|
|
46
|
+
const adapterKey = typeof match?.params?.adapter === 'string' ? match.params.adapter.trim() : '';
|
|
47
|
+
if (!adapterKey) {
|
|
48
|
+
const list = service().listProvisionableAdapters();
|
|
49
|
+
if (list.length === 0) {
|
|
50
|
+
return '当前没有支持运行时添加的适配器(需 EndpointManager 或 endpointConfigSchema)。';
|
|
51
|
+
}
|
|
52
|
+
return [
|
|
53
|
+
'可用适配器:',
|
|
54
|
+
...list.map((a) => ` • ${a} — /endpoint add ${a}`),
|
|
55
|
+
].join('\n');
|
|
56
|
+
}
|
|
57
|
+
const result = await service().add(adapterKey, message);
|
|
58
|
+
return result.message;
|
|
59
|
+
});
|
|
60
|
+
register('/endpoint remove <adapter:word> <name:word>', '从配置移除 Endpoint', async (_message, match) => {
|
|
61
|
+
const adapterKey = String(match?.params?.adapter ?? '');
|
|
62
|
+
const name = String(match?.params?.name ?? '');
|
|
63
|
+
const result = await service().remove(adapterKey, name);
|
|
64
|
+
return result.message;
|
|
65
|
+
});
|
|
66
|
+
register('/endpoint edit <adapter:word> <name:word>', '编辑 Endpoint 配置', async (message, match) => {
|
|
67
|
+
const adapterKey = String(match?.params?.adapter ?? '');
|
|
68
|
+
const name = String(match?.params?.name ?? '');
|
|
69
|
+
const result = await service().edit(adapterKey, name, message);
|
|
70
|
+
return result.message;
|
|
71
|
+
});
|
|
72
|
+
register('/endpoint start <adapter:word> <name:word>', '连接 Endpoint', async (message, match) => {
|
|
73
|
+
const adapterKey = String(match?.params?.adapter ?? '');
|
|
74
|
+
const name = String(match?.params?.name ?? '');
|
|
75
|
+
const result = await service().start(adapterKey, name, message);
|
|
76
|
+
return result.message;
|
|
77
|
+
});
|
|
78
|
+
register('/endpoint stop <adapter:word> <name:word>', '断开 Endpoint(保留配置)', async (_message, match) => {
|
|
79
|
+
const adapterKey = String(match?.params?.adapter ?? '');
|
|
80
|
+
const name = String(match?.params?.name ?? '');
|
|
81
|
+
const result = await service().stop(adapterKey, name);
|
|
82
|
+
return result.message;
|
|
83
|
+
});
|
|
84
|
+
register('/endpoint cancel', '取消进行中的 Endpoint 添加/绑定', () => {
|
|
85
|
+
if (!service().cancelProvision()) {
|
|
86
|
+
return '当前没有进行中的 Endpoint 绑定流程。';
|
|
87
|
+
}
|
|
88
|
+
return '已取消 Endpoint 绑定流程。';
|
|
89
|
+
});
|
|
90
|
+
register('/endpoint sync', '将内存中的 endpoint 配置写回 zhin.config', async () => {
|
|
91
|
+
const result = await service().syncToDisk();
|
|
92
|
+
return result.message;
|
|
93
|
+
});
|
|
94
|
+
register('/endpoints', '列出各适配器下的 Endpoint 及在线状态', () => formatEndpointsList(collectRuntimeEndpoints(root)));
|
|
95
|
+
return () => {
|
|
96
|
+
for (const d of disposers)
|
|
97
|
+
d();
|
|
98
|
+
};
|
|
99
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Adapter } from '../adapter.js';
|
|
2
|
+
import type { Endpoint } from '../endpoint.js';
|
|
3
|
+
import type { Message } from '../message.js';
|
|
4
|
+
import type { Plugin } from '../plugin.js';
|
|
5
|
+
import type { EndpointConfigRecord, EndpointManager } from './endpoint-manager.js';
|
|
6
|
+
export interface EndpointLifecycleResult {
|
|
7
|
+
message: string;
|
|
8
|
+
config?: EndpointConfigRecord;
|
|
9
|
+
}
|
|
10
|
+
export declare class EndpointLifecycleService {
|
|
11
|
+
private readonly root;
|
|
12
|
+
constructor(root: Plugin);
|
|
13
|
+
resolveAdapter(adapterKey: string): Adapter;
|
|
14
|
+
resolveManager(adapterKey: string): EndpointManager;
|
|
15
|
+
listProvisionableAdapters(): string[];
|
|
16
|
+
persistEndpoints(endpoints: EndpointConfigRecord[]): Promise<void>;
|
|
17
|
+
/** 将内存中的 endpoints 写回 zhin.config(修复运行时与磁盘不一致) */
|
|
18
|
+
syncToDisk(): Promise<EndpointLifecycleResult>;
|
|
19
|
+
connectConfig(adapter: Adapter, config: EndpointConfigRecord): Promise<Endpoint>;
|
|
20
|
+
disconnectRuntime(adapter: Adapter, name: string): Promise<boolean>;
|
|
21
|
+
add(adapterKey: string, message: Message, initialReply?: string): Promise<EndpointLifecycleResult>;
|
|
22
|
+
edit(adapterKey: string, name: string, message: Message): Promise<EndpointLifecycleResult>;
|
|
23
|
+
remove(adapterKey: string, name: string): Promise<EndpointLifecycleResult>;
|
|
24
|
+
start(adapterKey: string, name: string, message: Message): Promise<EndpointLifecycleResult>;
|
|
25
|
+
stop(adapterKey: string, name: string): Promise<EndpointLifecycleResult>;
|
|
26
|
+
cancelProvision(): boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function createEndpointLifecycleService(root: Plugin): EndpointLifecycleService;
|