@zhin.js/core 1.0.25 → 1.0.26
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/CHANGELOG.md +10 -0
- package/README.md +84 -342
- package/lib/adapter.d.ts +17 -0
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +84 -2
- package/lib/adapter.js.map +1 -1
- package/lib/ai/agent.d.ts +126 -0
- package/lib/ai/agent.d.ts.map +1 -0
- package/lib/ai/agent.js +645 -0
- package/lib/ai/agent.js.map +1 -0
- package/lib/ai/context-manager.d.ts +213 -0
- package/lib/ai/context-manager.d.ts.map +1 -0
- package/lib/ai/context-manager.js +313 -0
- package/lib/ai/context-manager.js.map +1 -0
- package/lib/ai/conversation-memory.d.ts +181 -0
- package/lib/ai/conversation-memory.d.ts.map +1 -0
- package/lib/ai/conversation-memory.js +581 -0
- package/lib/ai/conversation-memory.js.map +1 -0
- package/lib/ai/follow-up.d.ts +131 -0
- package/lib/ai/follow-up.d.ts.map +1 -0
- package/lib/ai/follow-up.js +265 -0
- package/lib/ai/follow-up.js.map +1 -0
- package/lib/ai/index.d.ts +29 -0
- package/lib/ai/index.d.ts.map +1 -0
- package/lib/ai/index.js +34 -0
- package/lib/ai/index.js.map +1 -0
- package/lib/ai/init.d.ts +30 -0
- package/lib/ai/init.d.ts.map +1 -0
- package/lib/ai/init.js +424 -0
- package/lib/ai/init.js.map +1 -0
- package/lib/ai/output.d.ts +93 -0
- package/lib/ai/output.d.ts.map +1 -0
- package/lib/ai/output.js +176 -0
- package/lib/ai/output.js.map +1 -0
- package/lib/ai/providers/anthropic.d.ts +23 -0
- package/lib/ai/providers/anthropic.d.ts.map +1 -0
- package/lib/ai/providers/anthropic.js +322 -0
- package/lib/ai/providers/anthropic.js.map +1 -0
- package/lib/ai/providers/base.d.ts +43 -0
- package/lib/ai/providers/base.d.ts.map +1 -0
- package/lib/ai/providers/base.js +135 -0
- package/lib/ai/providers/base.js.map +1 -0
- package/lib/ai/providers/index.d.ts +12 -0
- package/lib/ai/providers/index.d.ts.map +1 -0
- package/lib/ai/providers/index.js +9 -0
- package/lib/ai/providers/index.js.map +1 -0
- package/lib/ai/providers/ollama.d.ts +25 -0
- package/lib/ai/providers/ollama.d.ts.map +1 -0
- package/lib/ai/providers/ollama.js +243 -0
- package/lib/ai/providers/ollama.js.map +1 -0
- package/lib/ai/providers/openai.d.ts +46 -0
- package/lib/ai/providers/openai.d.ts.map +1 -0
- package/lib/ai/providers/openai.js +132 -0
- package/lib/ai/providers/openai.js.map +1 -0
- package/lib/ai/rate-limiter.d.ts +38 -0
- package/lib/ai/rate-limiter.d.ts.map +1 -0
- package/lib/ai/rate-limiter.js +86 -0
- package/lib/ai/rate-limiter.js.map +1 -0
- package/lib/ai/service.d.ts +81 -0
- package/lib/ai/service.d.ts.map +1 -0
- package/lib/ai/service.js +274 -0
- package/lib/ai/service.js.map +1 -0
- package/lib/ai/session.d.ts +186 -0
- package/lib/ai/session.d.ts.map +1 -0
- package/lib/ai/session.js +443 -0
- package/lib/ai/session.js.map +1 -0
- package/lib/ai/tone-detector.d.ts +19 -0
- package/lib/ai/tone-detector.d.ts.map +1 -0
- package/lib/ai/tone-detector.js +72 -0
- package/lib/ai/tone-detector.js.map +1 -0
- package/lib/ai/tools.d.ts +45 -0
- package/lib/ai/tools.d.ts.map +1 -0
- package/lib/ai/tools.js +206 -0
- package/lib/ai/tools.js.map +1 -0
- package/lib/ai/types.d.ts +264 -0
- package/lib/ai/types.d.ts.map +1 -0
- package/lib/ai/types.js +6 -0
- package/lib/ai/types.js.map +1 -0
- package/lib/ai/user-profile.d.ts +56 -0
- package/lib/ai/user-profile.d.ts.map +1 -0
- package/lib/ai/user-profile.js +130 -0
- package/lib/ai/user-profile.js.map +1 -0
- package/lib/ai/zhin-agent.d.ts +165 -0
- package/lib/ai/zhin-agent.d.ts.map +1 -0
- package/lib/ai/zhin-agent.js +707 -0
- package/lib/ai/zhin-agent.js.map +1 -0
- package/lib/built/ai-trigger.d.ts.map +1 -1
- package/lib/built/ai-trigger.js +7 -3
- package/lib/built/ai-trigger.js.map +1 -1
- package/lib/built/command.d.ts +33 -17
- package/lib/built/command.d.ts.map +1 -1
- package/lib/built/command.js +71 -44
- package/lib/built/command.js.map +1 -1
- package/lib/built/component.d.ts +42 -15
- package/lib/built/component.d.ts.map +1 -1
- package/lib/built/component.js +84 -52
- package/lib/built/component.js.map +1 -1
- package/lib/built/config.d.ts +54 -5
- package/lib/built/config.d.ts.map +1 -1
- package/lib/built/config.js +76 -10
- package/lib/built/config.js.map +1 -1
- package/lib/built/cron.d.ts +41 -18
- package/lib/built/cron.d.ts.map +1 -1
- package/lib/built/cron.js +106 -63
- package/lib/built/cron.js.map +1 -1
- package/lib/built/database.d.ts +55 -6
- package/lib/built/database.d.ts.map +1 -1
- package/lib/built/database.js +93 -22
- package/lib/built/database.js.map +1 -1
- package/lib/built/dispatcher.d.ts +118 -0
- package/lib/built/dispatcher.d.ts.map +1 -0
- package/lib/built/dispatcher.js +196 -0
- package/lib/built/dispatcher.js.map +1 -0
- package/lib/built/permission.d.ts +45 -5
- package/lib/built/permission.d.ts.map +1 -1
- package/lib/built/permission.js +56 -11
- package/lib/built/permission.js.map +1 -1
- package/lib/built/skill.d.ts +117 -0
- package/lib/built/skill.d.ts.map +1 -0
- package/lib/built/skill.js +191 -0
- package/lib/built/skill.js.map +1 -0
- package/lib/built/tool.d.ts +71 -164
- package/lib/built/tool.d.ts.map +1 -1
- package/lib/built/tool.js +212 -297
- package/lib/built/tool.js.map +1 -1
- package/lib/feature.d.ts +75 -0
- package/lib/feature.d.ts.map +1 -0
- package/lib/feature.js +69 -0
- package/lib/feature.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -1
- package/lib/plugin.d.ts +25 -17
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +180 -20
- package/lib/plugin.js.map +1 -1
- package/lib/types.d.ts +4 -9
- package/lib/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/adapter.ts +101 -2
- package/src/ai/agent.ts +772 -0
- package/src/ai/context-manager.ts +440 -0
- package/src/ai/conversation-memory.ts +774 -0
- package/src/ai/follow-up.ts +357 -0
- package/src/ai/index.ts +128 -0
- package/src/ai/init.ts +502 -0
- package/src/ai/output.ts +261 -0
- package/src/ai/providers/anthropic.ts +375 -0
- package/src/ai/providers/base.ts +173 -0
- package/src/ai/providers/index.ts +13 -0
- package/src/ai/providers/ollama.ts +292 -0
- package/src/ai/providers/openai.ts +167 -0
- package/src/ai/rate-limiter.ts +129 -0
- package/src/ai/service.ts +319 -0
- package/src/ai/session.ts +544 -0
- package/src/ai/tone-detector.ts +89 -0
- package/src/ai/tools.ts +218 -0
- package/src/ai/types.ts +296 -0
- package/src/ai/user-profile.ts +181 -0
- package/src/ai/zhin-agent.ts +845 -0
- package/src/built/ai-trigger.ts +6 -3
- package/src/built/command.ts +75 -69
- package/src/built/component.ts +94 -76
- package/src/built/config.ts +238 -128
- package/src/built/cron.ts +117 -101
- package/src/built/database.ts +128 -33
- package/src/built/dispatcher.ts +332 -0
- package/src/built/permission.ts +146 -54
- package/src/built/skill.ts +280 -0
- package/src/built/tool.ts +245 -366
- package/src/feature.ts +113 -0
- package/src/index.ts +7 -0
- package/src/plugin.ts +198 -33
- package/src/types.ts +6 -10
- package/tests/adapter.test.ts +153 -1
- package/tests/ai/agent.test.ts +614 -0
- package/tests/ai/ai-trigger.test.ts +368 -0
- package/tests/ai/context-manager.test.ts +413 -0
- package/tests/ai/conversation-memory.test.ts +128 -0
- package/tests/ai/follow-up.test.ts +175 -0
- package/tests/ai/integration.test.ts +584 -0
- package/tests/ai/output.test.ts +128 -0
- package/tests/ai/providers.integration.test.ts +227 -0
- package/tests/ai/rate-limiter.test.ts +108 -0
- package/tests/ai/session.test.ts +375 -0
- package/tests/ai/setup.ts +308 -0
- package/tests/ai/tone-detector.test.ts +80 -0
- package/tests/ai/tool.test.ts +800 -0
- package/tests/ai/tools-builtin.test.ts +346 -0
- package/tests/ai/user-profile.test.ts +73 -0
- package/tests/ai/zhin-agent.test.ts +177 -0
- package/tests/config.test.ts +46 -0
- package/tests/cron.test.ts +94 -5
- package/tests/dispatcher.test.ts +146 -0
- package/tests/feature.test.ts +145 -0
- package/tests/features-builtin.test.ts +191 -0
- package/tests/plugin.test.ts +88 -14
- package/tests/skill-feature.test.ts +179 -0
- package/tests/tool-feature.test.ts +254 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/built/permission.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/built/permission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillFeature — AI 可见能力描述层
|
|
3
|
+
*
|
|
4
|
+
* 核心概念:
|
|
5
|
+
* Plugin = 运行时容器(生命周期、服务注册、中间件)
|
|
6
|
+
* Skill = AI 可见的能力接口(名称、描述、工具列表)
|
|
7
|
+
*
|
|
8
|
+
* 每个 Plugin 可以声明一个 Skill 描述,告诉 AI Agent:
|
|
9
|
+
* "我叫什么、我能做什么、我有哪些工具"
|
|
10
|
+
*
|
|
11
|
+
* SkillFeature 全局收集所有 Skill,供 Agent 进行两级过滤:
|
|
12
|
+
* 1. 粗筛:根据用户消息选择相关 Skill
|
|
13
|
+
* 2. 细筛:从选中 Skill 内选择具体 Tool
|
|
14
|
+
*/
|
|
15
|
+
import { Feature, FeatureJSON } from '../feature.js';
|
|
16
|
+
import type { Tool } from '../types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Skill — AI 可见的能力描述
|
|
19
|
+
*/
|
|
20
|
+
export interface Skill {
|
|
21
|
+
/** 技能名称(通常与插件名一致) */
|
|
22
|
+
name: string;
|
|
23
|
+
/** 技能描述(AI 用来理解这个 Skill 的用途) */
|
|
24
|
+
description: string;
|
|
25
|
+
/** 该 Skill 提供的工具列表 */
|
|
26
|
+
tools: Tool[];
|
|
27
|
+
/**
|
|
28
|
+
* 触发关键词
|
|
29
|
+
* 当用户消息包含这些关键词时,优先选择此 Skill
|
|
30
|
+
*/
|
|
31
|
+
keywords?: string[];
|
|
32
|
+
/**
|
|
33
|
+
* 分类标签
|
|
34
|
+
* 用于按领域分组(如 'news', 'weather', 'entertainment')
|
|
35
|
+
*/
|
|
36
|
+
tags?: string[];
|
|
37
|
+
/** 来源插件名 */
|
|
38
|
+
pluginName: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Skill 元数据 — 开发者在插件中声明
|
|
42
|
+
* 由 plugin.declareSkill() 注册
|
|
43
|
+
*/
|
|
44
|
+
export interface SkillMetadata {
|
|
45
|
+
/** 技能描述(必填) */
|
|
46
|
+
description: string;
|
|
47
|
+
/** 触发关键词(可选,自动从工具中聚合) */
|
|
48
|
+
keywords?: string[];
|
|
49
|
+
/** 分类标签(可选) */
|
|
50
|
+
tags?: string[];
|
|
51
|
+
}
|
|
52
|
+
export interface SkillContextExtensions {
|
|
53
|
+
/**
|
|
54
|
+
* 声明本插件的 Skill 元数据
|
|
55
|
+
* 调用后,插件的工具会自动聚合为一个 Skill 注册到 SkillFeature
|
|
56
|
+
*/
|
|
57
|
+
declareSkill(metadata: SkillMetadata): void;
|
|
58
|
+
}
|
|
59
|
+
declare module '../plugin.js' {
|
|
60
|
+
namespace Plugin {
|
|
61
|
+
interface Extensions extends SkillContextExtensions {
|
|
62
|
+
}
|
|
63
|
+
interface Contexts {
|
|
64
|
+
skill: SkillFeature;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export declare class SkillFeature extends Feature<Skill> {
|
|
69
|
+
#private;
|
|
70
|
+
readonly name: "skill";
|
|
71
|
+
readonly icon = "Brain";
|
|
72
|
+
readonly desc = "\u6280\u80FD";
|
|
73
|
+
/** 按名称索引 */
|
|
74
|
+
readonly byName: Map<string, Skill>;
|
|
75
|
+
/**
|
|
76
|
+
* 添加 Skill
|
|
77
|
+
*/
|
|
78
|
+
add(skill: Skill, pluginName: string): () => void;
|
|
79
|
+
/**
|
|
80
|
+
* 移除 Skill
|
|
81
|
+
*/
|
|
82
|
+
remove(skill: Skill): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* 按名称获取 Skill
|
|
85
|
+
*/
|
|
86
|
+
get(name: string): Skill | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* 获取所有已注册 Skill
|
|
89
|
+
*/
|
|
90
|
+
getAll(): Skill[];
|
|
91
|
+
/**
|
|
92
|
+
* 按关键词/标签搜索相关 Skill
|
|
93
|
+
* 返回按相关性排序的 Skill 列表
|
|
94
|
+
*/
|
|
95
|
+
search(query: string, options?: {
|
|
96
|
+
maxResults?: number;
|
|
97
|
+
}): Skill[];
|
|
98
|
+
/**
|
|
99
|
+
* 获取所有 Skill 的工具(扁平化)
|
|
100
|
+
*/
|
|
101
|
+
collectAllTools(): Tool[];
|
|
102
|
+
/**
|
|
103
|
+
* 已注册 Skill 数量
|
|
104
|
+
*/
|
|
105
|
+
get size(): number;
|
|
106
|
+
/**
|
|
107
|
+
* 序列化为 JSON
|
|
108
|
+
*/
|
|
109
|
+
toJSON(pluginName?: string): FeatureJSON;
|
|
110
|
+
/**
|
|
111
|
+
* 提供给 Plugin.prototype 的扩展方法
|
|
112
|
+
*/
|
|
113
|
+
get extensions(): {
|
|
114
|
+
declareSkill(metadata: SkillMetadata): void;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/built/skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAMxC;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IAEb,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IAEpB,sBAAsB;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,YAAY;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,eAAe;IACf,WAAW,EAAE,MAAM,CAAC;IAEpB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAC7C;AAED,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,sBAAsB;SAAG;QACtD,UAAU,QAAQ;YAChB,KAAK,EAAE,YAAY,CAAC;SACrB;KACF;CACF;AAMD,qBAAa,YAAa,SAAQ,OAAO,CAAC,KAAK,CAAC;;IAC9C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,IAAI,kBAAQ;IAErB,YAAY;IACZ,QAAQ,CAAC,MAAM,qBAA4B;IAE3C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,IAAI;IAKjD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAK7B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIpC;;OAEG;IACH,MAAM,IAAI,KAAK,EAAE;IAIjB;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,EAAE;IAWjE;;OAEG;IACH,eAAe,IAAI,IAAI,EAAE;IAQzB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IA0CD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW;IAiBxC;;OAEG;IACH,IAAI,UAAU;+BAGa,aAAa;MAiDvC;CACF"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillFeature — AI 可见能力描述层
|
|
3
|
+
*
|
|
4
|
+
* 核心概念:
|
|
5
|
+
* Plugin = 运行时容器(生命周期、服务注册、中间件)
|
|
6
|
+
* Skill = AI 可见的能力接口(名称、描述、工具列表)
|
|
7
|
+
*
|
|
8
|
+
* 每个 Plugin 可以声明一个 Skill 描述,告诉 AI Agent:
|
|
9
|
+
* "我叫什么、我能做什么、我有哪些工具"
|
|
10
|
+
*
|
|
11
|
+
* SkillFeature 全局收集所有 Skill,供 Agent 进行两级过滤:
|
|
12
|
+
* 1. 粗筛:根据用户消息选择相关 Skill
|
|
13
|
+
* 2. 细筛:从选中 Skill 内选择具体 Tool
|
|
14
|
+
*/
|
|
15
|
+
import { Feature } from '../feature.js';
|
|
16
|
+
import { getPlugin } from '../plugin.js';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// SkillFeature 实现
|
|
19
|
+
// ============================================================================
|
|
20
|
+
export class SkillFeature extends Feature {
|
|
21
|
+
name = 'skill';
|
|
22
|
+
icon = 'Brain';
|
|
23
|
+
desc = '技能';
|
|
24
|
+
/** 按名称索引 */
|
|
25
|
+
byName = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* 添加 Skill
|
|
28
|
+
*/
|
|
29
|
+
add(skill, pluginName) {
|
|
30
|
+
this.byName.set(skill.name, skill);
|
|
31
|
+
return super.add(skill, pluginName);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 移除 Skill
|
|
35
|
+
*/
|
|
36
|
+
remove(skill) {
|
|
37
|
+
this.byName.delete(skill.name);
|
|
38
|
+
return super.remove(skill);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 按名称获取 Skill
|
|
42
|
+
*/
|
|
43
|
+
get(name) {
|
|
44
|
+
return this.byName.get(name);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 获取所有已注册 Skill
|
|
48
|
+
*/
|
|
49
|
+
getAll() {
|
|
50
|
+
return [...this.items];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 按关键词/标签搜索相关 Skill
|
|
54
|
+
* 返回按相关性排序的 Skill 列表
|
|
55
|
+
*/
|
|
56
|
+
search(query, options) {
|
|
57
|
+
const maxResults = options?.maxResults ?? 5;
|
|
58
|
+
const scored = this.items
|
|
59
|
+
.map(skill => ({ skill, score: this.#scoreSkill(skill, query) }))
|
|
60
|
+
.filter(({ score }) => score > 0)
|
|
61
|
+
.sort((a, b) => b.score - a.score)
|
|
62
|
+
.slice(0, maxResults);
|
|
63
|
+
return scored.map(({ skill }) => skill);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 获取所有 Skill 的工具(扁平化)
|
|
67
|
+
*/
|
|
68
|
+
collectAllTools() {
|
|
69
|
+
const tools = [];
|
|
70
|
+
for (const skill of this.items) {
|
|
71
|
+
tools.push(...skill.tools);
|
|
72
|
+
}
|
|
73
|
+
return tools;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 已注册 Skill 数量
|
|
77
|
+
*/
|
|
78
|
+
get size() {
|
|
79
|
+
return this.items.length;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 简单的关键词匹配评分
|
|
83
|
+
*/
|
|
84
|
+
#scoreSkill(skill, query) {
|
|
85
|
+
const lowerQuery = query.toLowerCase();
|
|
86
|
+
let score = 0;
|
|
87
|
+
// 关键词精确匹配
|
|
88
|
+
if (skill.keywords) {
|
|
89
|
+
for (const kw of skill.keywords) {
|
|
90
|
+
if (lowerQuery.includes(kw.toLowerCase()))
|
|
91
|
+
score += 1.0;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// 标签匹配
|
|
95
|
+
if (skill.tags) {
|
|
96
|
+
for (const tag of skill.tags) {
|
|
97
|
+
if (lowerQuery.includes(tag.toLowerCase()))
|
|
98
|
+
score += 0.5;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// 名称匹配
|
|
102
|
+
if (lowerQuery.includes(skill.name.toLowerCase()))
|
|
103
|
+
score += 0.3;
|
|
104
|
+
// 描述匹配(双向)
|
|
105
|
+
const lowerDesc = skill.description.toLowerCase();
|
|
106
|
+
if (lowerDesc.includes(lowerQuery))
|
|
107
|
+
score += 0.2;
|
|
108
|
+
if (lowerQuery.includes(lowerDesc))
|
|
109
|
+
score += 0.15;
|
|
110
|
+
// 工具名/描述匹配
|
|
111
|
+
for (const tool of skill.tools) {
|
|
112
|
+
if (lowerQuery.includes(tool.name.toLowerCase()))
|
|
113
|
+
score += 0.4;
|
|
114
|
+
if (tool.description && lowerQuery.includes(tool.description.toLowerCase().slice(0, 10))) {
|
|
115
|
+
score += 0.1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return score;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 序列化为 JSON
|
|
122
|
+
*/
|
|
123
|
+
toJSON(pluginName) {
|
|
124
|
+
const list = pluginName ? this.getByPlugin(pluginName) : this.items;
|
|
125
|
+
return {
|
|
126
|
+
name: this.name,
|
|
127
|
+
icon: this.icon,
|
|
128
|
+
desc: this.desc,
|
|
129
|
+
count: list.length,
|
|
130
|
+
items: list.map(s => ({
|
|
131
|
+
name: s.name,
|
|
132
|
+
desc: s.description,
|
|
133
|
+
toolCount: s.tools.length,
|
|
134
|
+
keywords: s.keywords,
|
|
135
|
+
tags: s.tags,
|
|
136
|
+
})),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 提供给 Plugin.prototype 的扩展方法
|
|
141
|
+
*/
|
|
142
|
+
get extensions() {
|
|
143
|
+
const feature = this;
|
|
144
|
+
return {
|
|
145
|
+
declareSkill(metadata) {
|
|
146
|
+
const plugin = getPlugin();
|
|
147
|
+
const pluginName = plugin.name;
|
|
148
|
+
// 收集该插件注册的工具
|
|
149
|
+
const toolService = plugin.root.inject('tool');
|
|
150
|
+
let tools = [];
|
|
151
|
+
if (toolService && typeof toolService.getToolsByPlugin === 'function') {
|
|
152
|
+
tools = toolService.getToolsByPlugin(pluginName);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// 回退:从插件本地工具获取
|
|
156
|
+
tools = plugin.getAllTools?.() || [];
|
|
157
|
+
}
|
|
158
|
+
// 聚合关键词:开发者声明 + 工具自带
|
|
159
|
+
const allKeywords = new Set(metadata.keywords || []);
|
|
160
|
+
for (const tool of tools) {
|
|
161
|
+
if (tool.keywords) {
|
|
162
|
+
for (const kw of tool.keywords) {
|
|
163
|
+
allKeywords.add(kw);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// 聚合标签
|
|
168
|
+
const allTags = new Set(metadata.tags || []);
|
|
169
|
+
for (const tool of tools) {
|
|
170
|
+
if (tool.tags) {
|
|
171
|
+
for (const tag of tool.tags) {
|
|
172
|
+
allTags.add(tag);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const skill = {
|
|
177
|
+
name: pluginName,
|
|
178
|
+
description: metadata.description,
|
|
179
|
+
tools,
|
|
180
|
+
keywords: Array.from(allKeywords),
|
|
181
|
+
tags: Array.from(allTags),
|
|
182
|
+
pluginName,
|
|
183
|
+
};
|
|
184
|
+
const dispose = feature.add(skill, pluginName);
|
|
185
|
+
plugin.recordFeatureContribution(feature.name, pluginName);
|
|
186
|
+
plugin.onDispose(dispose);
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/built/skill.ts"],"names":[],"mappings":"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"}
|
package/lib/built/tool.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* ToolFeature — 统一的工具管理服务
|
|
3
|
+
* 支持 Tool ↔ Command 互转
|
|
4
4
|
*/
|
|
5
|
+
import { Feature, FeatureJSON } from "../feature.js";
|
|
5
6
|
import { MessageCommand } from "../command.js";
|
|
6
|
-
import {
|
|
7
|
+
import { Plugin } from "../plugin.js";
|
|
7
8
|
import type { Tool, ToolDefinition, RegisteredAdapter, ToolContext, ToolJsonSchema, ToolParametersSchema, PropertySchema, MaybePromise, ToolPermissionLevel, ToolScope } from "../types.js";
|
|
8
9
|
/**
|
|
9
10
|
* 权限级别优先级(数字越大权限越高)
|
|
@@ -35,29 +36,6 @@ export declare function generatePattern(tool: Tool): string;
|
|
|
35
36
|
export declare function extractParamInfo(parameters: ToolJsonSchema): Tool.ParamInfo[];
|
|
36
37
|
/**
|
|
37
38
|
* 定义工具的辅助函数(提供类型推断)
|
|
38
|
-
*
|
|
39
|
-
* 使用泛型参数获得 execute 函数的类型检查,
|
|
40
|
-
* 返回通用的 Tool 类型,可直接传给 addTool
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* ```typescript
|
|
44
|
-
* const myTool = defineTool<{ name: string }>({
|
|
45
|
-
* name: 'greet',
|
|
46
|
-
* description: '打招呼',
|
|
47
|
-
* parameters: {
|
|
48
|
-
* type: 'object',
|
|
49
|
-
* properties: {
|
|
50
|
-
* name: { type: 'string', description: '名字' }
|
|
51
|
-
* },
|
|
52
|
-
* required: ['name']
|
|
53
|
-
* },
|
|
54
|
-
* execute: async (args) => {
|
|
55
|
-
* return `你好,${args.name}!`; // args.name 有类型提示
|
|
56
|
-
* }
|
|
57
|
-
* });
|
|
58
|
-
*
|
|
59
|
-
* plugin.addTool(myTool); // 无需类型断言
|
|
60
|
-
* ```
|
|
61
39
|
*/
|
|
62
40
|
export declare function defineTool<TArgs extends Record<string, any> = Record<string, any>>(tool: ToolDefinition<TArgs>): Tool;
|
|
63
41
|
/**
|
|
@@ -71,129 +49,30 @@ interface ParamDef {
|
|
|
71
49
|
/**
|
|
72
50
|
* ZhinTool 类
|
|
73
51
|
* 提供类似 MessageCommand 的链式调用风格来定义工具
|
|
74
|
-
*
|
|
75
|
-
* @example
|
|
76
|
-
* ```typescript
|
|
77
|
-
* const weatherTool = new ZhinTool('weather')
|
|
78
|
-
* .desc('查询天气信息')
|
|
79
|
-
* .param('city', { type: 'string', description: '城市名称' }, true)
|
|
80
|
-
* .param('days', { type: 'number', description: '预报天数' })
|
|
81
|
-
* .platform('qq', 'telegram')
|
|
82
|
-
* .scope('group', 'private')
|
|
83
|
-
* .permission('user')
|
|
84
|
-
* // AI 调用时执行(必须)
|
|
85
|
-
* .execute(async (args, ctx) => {
|
|
86
|
-
* return `${args.city} 的天气是晴天`;
|
|
87
|
-
* })
|
|
88
|
-
* // 可选:命令回调(与 MessageCommand.action 一致)
|
|
89
|
-
* // 如果定义了此回调,会生成 Command
|
|
90
|
-
* .action(async (message, result) => {
|
|
91
|
-
* return `命令执行: ${result.params.city}`;
|
|
92
|
-
* });
|
|
93
|
-
*
|
|
94
|
-
* plugin.addTool(weatherTool);
|
|
95
|
-
* ```
|
|
96
52
|
*/
|
|
97
53
|
export declare class ZhinTool {
|
|
98
54
|
#private;
|
|
99
|
-
/**
|
|
100
|
-
* 创建工具实例
|
|
101
|
-
* @param name 工具名称(唯一标识,建议使用 snake_case)
|
|
102
|
-
*/
|
|
103
55
|
constructor(name: string);
|
|
104
|
-
/** 获取工具名称 */
|
|
105
56
|
get name(): string;
|
|
106
|
-
/** 获取工具描述 */
|
|
107
57
|
get description(): string;
|
|
108
|
-
/** 获取有序的参数列表 */
|
|
109
58
|
get params(): ParamDef[];
|
|
110
|
-
/**
|
|
111
|
-
* 设置工具描述
|
|
112
|
-
* @param description 工具描述(供 AI 和帮助系统使用)
|
|
113
|
-
*/
|
|
114
59
|
desc(description: string): this;
|
|
115
|
-
/**
|
|
116
|
-
* 添加参数(按调用顺序保持有序)
|
|
117
|
-
* @param name 参数名称
|
|
118
|
-
* @param schema 参数 Schema(类型、描述等)
|
|
119
|
-
* @param required 是否必填(默认 false)
|
|
120
|
-
*/
|
|
121
60
|
param(name: string, schema: PropertySchema, required?: boolean): this;
|
|
122
|
-
/**
|
|
123
|
-
* 设置支持的平台
|
|
124
|
-
* @param platforms 平台名称列表(如 'qq', 'telegram')
|
|
125
|
-
*/
|
|
126
61
|
platform(...platforms: string[]): this;
|
|
127
|
-
/**
|
|
128
|
-
* 设置支持的场景
|
|
129
|
-
* @param scopes 场景类型列表('private', 'group', 'channel')
|
|
130
|
-
*/
|
|
131
62
|
scope(...scopes: ToolScope[]): this;
|
|
132
|
-
/**
|
|
133
|
-
* 设置权限级别
|
|
134
|
-
* @param level 权限级别('user', 'group_admin', 'group_owner', 'bot_admin', 'owner')
|
|
135
|
-
*/
|
|
136
63
|
permission(level: ToolPermissionLevel): this;
|
|
137
|
-
/**
|
|
138
|
-
* 添加旧版权限要求(兼容 MessageCommand)
|
|
139
|
-
* @param permissions 权限字符串列表
|
|
140
|
-
*/
|
|
141
64
|
permit(...permissions: string[]): this;
|
|
142
|
-
/**
|
|
143
|
-
* 添加标签
|
|
144
|
-
* @param tags 标签列表
|
|
145
|
-
*/
|
|
146
65
|
tag(...tags: string[]): this;
|
|
147
|
-
|
|
148
|
-
* 设置是否隐藏
|
|
149
|
-
* @param value 是否隐藏(默认 true)
|
|
150
|
-
*/
|
|
66
|
+
keyword(...keywords: string[]): this;
|
|
151
67
|
hidden(value?: boolean): this;
|
|
152
|
-
/**
|
|
153
|
-
* 设置使用说明(命令配置)
|
|
154
|
-
* @param usage 使用说明列表
|
|
155
|
-
*/
|
|
156
68
|
usage(...usage: string[]): this;
|
|
157
|
-
/**
|
|
158
|
-
* 设置示例(命令配置)
|
|
159
|
-
* @param examples 示例列表
|
|
160
|
-
*/
|
|
161
69
|
examples(...examples: string[]): this;
|
|
162
|
-
/**
|
|
163
|
-
* 设置别名(命令配置)
|
|
164
|
-
* @param alias 别名列表
|
|
165
|
-
*/
|
|
166
70
|
alias(...alias: string[]): this;
|
|
167
|
-
/**
|
|
168
|
-
* 设置自定义命令模式
|
|
169
|
-
* @param pattern 命令模式(如 'weather <city> [days]')
|
|
170
|
-
*/
|
|
171
71
|
pattern(pattern: string): this;
|
|
172
|
-
/**
|
|
173
|
-
* 设置 AI 工具执行函数
|
|
174
|
-
* @param callback 执行回调,入参是 (args, context)
|
|
175
|
-
*/
|
|
176
72
|
execute(callback: (args: Record<string, any>, context?: ToolContext) => MaybePromise<any>): this;
|
|
177
|
-
/**
|
|
178
|
-
* 设置命令回调(可选,与 MessageCommand.action 一致)
|
|
179
|
-
* 如果定义了此回调,会自动生成 Command
|
|
180
|
-
* 入参是 (message, matchResult)
|
|
181
|
-
*
|
|
182
|
-
* @param callback 命令回调
|
|
183
|
-
*/
|
|
184
73
|
action(callback: MessageCommand.Callback<RegisteredAdapter>): this;
|
|
185
|
-
/**
|
|
186
|
-
* 转换为 Tool 对象
|
|
187
|
-
*/
|
|
188
74
|
toTool(): Tool;
|
|
189
|
-
/**
|
|
190
|
-
* 获取 action 回调(命令回调,如果有)
|
|
191
|
-
*/
|
|
192
75
|
getActionCallback(): MessageCommand.Callback<RegisteredAdapter> | undefined;
|
|
193
|
-
/**
|
|
194
|
-
* 转换为 JSON 格式(供 AI 使用,不包含 execute 函数)
|
|
195
|
-
* 符合 OpenAI Function Calling 规范
|
|
196
|
-
*/
|
|
197
76
|
toJSON(): {
|
|
198
77
|
name: string;
|
|
199
78
|
description: string;
|
|
@@ -203,13 +82,7 @@ export declare class ZhinTool {
|
|
|
203
82
|
permissionLevel?: ToolPermissionLevel;
|
|
204
83
|
tags?: string[];
|
|
205
84
|
};
|
|
206
|
-
/**
|
|
207
|
-
* 输出帮助信息(类似 MessageCommand)
|
|
208
|
-
*/
|
|
209
85
|
get help(): string;
|
|
210
|
-
/**
|
|
211
|
-
* 输出简短信息
|
|
212
|
-
*/
|
|
213
86
|
toString(): string;
|
|
214
87
|
}
|
|
215
88
|
export declare function isZhinTool(obj: any): obj is ZhinTool;
|
|
@@ -218,7 +91,7 @@ export declare function isZhinTool(obj: any): obj is ZhinTool;
|
|
|
218
91
|
*/
|
|
219
92
|
export type ToolInput = Tool | ZhinTool;
|
|
220
93
|
/**
|
|
221
|
-
*
|
|
94
|
+
* ToolContext 扩展方法类型
|
|
222
95
|
*/
|
|
223
96
|
export interface ToolContextExtensions {
|
|
224
97
|
/** 添加工具(自动生成命令) */
|
|
@@ -231,51 +104,85 @@ declare module "../plugin.js" {
|
|
|
231
104
|
interface Extensions extends ToolContextExtensions {
|
|
232
105
|
}
|
|
233
106
|
interface Contexts {
|
|
234
|
-
tool:
|
|
107
|
+
tool: ToolFeature;
|
|
235
108
|
}
|
|
236
109
|
}
|
|
237
110
|
}
|
|
238
111
|
/**
|
|
239
|
-
*
|
|
112
|
+
* 将 Tool 转换为 MessageCommand
|
|
113
|
+
*/
|
|
114
|
+
declare function toolToCommand(tool: Tool): MessageCommand<RegisteredAdapter>;
|
|
115
|
+
/**
|
|
116
|
+
* 将 MessageCommand 转换为 Tool
|
|
240
117
|
*/
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
readonly
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
118
|
+
declare function commandToToolFn(command: MessageCommand<RegisteredAdapter>, pluginName: string): Tool;
|
|
119
|
+
export declare class ToolFeature extends Feature<Tool> {
|
|
120
|
+
#private;
|
|
121
|
+
readonly name: "tool";
|
|
122
|
+
readonly icon = "Wrench";
|
|
123
|
+
readonly desc = "\u5DE5\u5177";
|
|
124
|
+
/** 按名称索引 */
|
|
125
|
+
readonly byName: Map<string, Tool>;
|
|
126
|
+
/** 工具对应的命令 */
|
|
127
|
+
readonly toolCommands: Map<string, MessageCommand<"process">>;
|
|
128
|
+
/**
|
|
129
|
+
* 添加工具
|
|
130
|
+
* @param toolInput 工具或 ZhinTool 实例
|
|
131
|
+
* @param pluginName 注册插件名
|
|
132
|
+
* @param generateCommand 是否生成命令(默认 true)
|
|
133
|
+
*/
|
|
134
|
+
addTool(toolInput: ToolInput, pluginName: string, generateCommand?: boolean): () => void;
|
|
135
|
+
/**
|
|
136
|
+
* 移除工具
|
|
137
|
+
*/
|
|
138
|
+
removeTool(name: string): boolean;
|
|
139
|
+
/**
|
|
140
|
+
* 获取工具
|
|
141
|
+
*/
|
|
251
142
|
get(name: string): Tool | undefined;
|
|
252
|
-
/**
|
|
143
|
+
/**
|
|
144
|
+
* 获取所有工具
|
|
145
|
+
*/
|
|
253
146
|
getAll(): Tool[];
|
|
254
|
-
/**
|
|
147
|
+
/**
|
|
148
|
+
* 根据标签过滤工具
|
|
149
|
+
*/
|
|
255
150
|
getByTags(tags: string[]): Tool[];
|
|
256
|
-
/**
|
|
151
|
+
/**
|
|
152
|
+
* 执行工具
|
|
153
|
+
*/
|
|
257
154
|
execute(name: string, args: Record<string, any>, context?: ToolContext): Promise<any>;
|
|
258
|
-
/**
|
|
155
|
+
/**
|
|
156
|
+
* 将 Command 转换为 Tool
|
|
157
|
+
*/
|
|
259
158
|
commandToTool(command: MessageCommand<RegisteredAdapter>, pluginName: string): Tool;
|
|
260
|
-
/**
|
|
159
|
+
/**
|
|
160
|
+
* 收集所有可用工具(包括从 Command 转换的)
|
|
161
|
+
*/
|
|
261
162
|
collectAll(plugin: Plugin): Tool[];
|
|
262
163
|
/**
|
|
263
164
|
* 根据上下文过滤工具
|
|
264
|
-
* 检查平台、场景、权限是否匹配
|
|
265
165
|
*/
|
|
266
166
|
filterByContext(tools: Tool[], context: ToolContext): Tool[];
|
|
167
|
+
/**
|
|
168
|
+
* 按插件名获取工具
|
|
169
|
+
*/
|
|
170
|
+
getToolsByPlugin(pluginName: string): Tool[];
|
|
171
|
+
/**
|
|
172
|
+
* 兼容旧接口:tools Map
|
|
173
|
+
*/
|
|
174
|
+
get tools(): Map<string, Tool>;
|
|
175
|
+
/**
|
|
176
|
+
* 序列化为 JSON
|
|
177
|
+
*/
|
|
178
|
+
toJSON(pluginName?: string): FeatureJSON;
|
|
179
|
+
/**
|
|
180
|
+
* 提供给 Plugin.prototype 的扩展方法
|
|
181
|
+
*/
|
|
182
|
+
get extensions(): {
|
|
183
|
+
addTool(tool: ToolInput): () => void;
|
|
184
|
+
addToolOnly(tool: ToolInput): () => void;
|
|
185
|
+
};
|
|
267
186
|
}
|
|
268
|
-
|
|
269
|
-
* 将 Tool 转换为 MessageCommand
|
|
270
|
-
*/
|
|
271
|
-
declare function toolToCommand(tool: Tool): MessageCommand<RegisteredAdapter>;
|
|
272
|
-
/**
|
|
273
|
-
* 将 MessageCommand 转换为 Tool
|
|
274
|
-
*/
|
|
275
|
-
declare function commandToTool(command: MessageCommand<RegisteredAdapter>, pluginName: string): Tool;
|
|
276
|
-
/**
|
|
277
|
-
* 创建工具服务 Context
|
|
278
|
-
*/
|
|
279
|
-
export declare function createToolService(): Context<'tool', ToolContextExtensions>;
|
|
280
|
-
export { toolToCommand, commandToTool, canAccessTool, inferPermissionLevel, hasPermissionLevel, PERMISSION_LEVEL_PRIORITY, };
|
|
187
|
+
export { toolToCommand, commandToToolFn as commandToTool, canAccessTool, inferPermissionLevel, hasPermissionLevel, PERMISSION_LEVEL_PRIORITY, };
|
|
281
188
|
//# sourceMappingURL=tool.d.ts.map
|