@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.
Files changed (200) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +84 -342
  3. package/lib/adapter.d.ts +17 -0
  4. package/lib/adapter.d.ts.map +1 -1
  5. package/lib/adapter.js +84 -2
  6. package/lib/adapter.js.map +1 -1
  7. package/lib/ai/agent.d.ts +126 -0
  8. package/lib/ai/agent.d.ts.map +1 -0
  9. package/lib/ai/agent.js +645 -0
  10. package/lib/ai/agent.js.map +1 -0
  11. package/lib/ai/context-manager.d.ts +213 -0
  12. package/lib/ai/context-manager.d.ts.map +1 -0
  13. package/lib/ai/context-manager.js +313 -0
  14. package/lib/ai/context-manager.js.map +1 -0
  15. package/lib/ai/conversation-memory.d.ts +181 -0
  16. package/lib/ai/conversation-memory.d.ts.map +1 -0
  17. package/lib/ai/conversation-memory.js +581 -0
  18. package/lib/ai/conversation-memory.js.map +1 -0
  19. package/lib/ai/follow-up.d.ts +131 -0
  20. package/lib/ai/follow-up.d.ts.map +1 -0
  21. package/lib/ai/follow-up.js +265 -0
  22. package/lib/ai/follow-up.js.map +1 -0
  23. package/lib/ai/index.d.ts +29 -0
  24. package/lib/ai/index.d.ts.map +1 -0
  25. package/lib/ai/index.js +34 -0
  26. package/lib/ai/index.js.map +1 -0
  27. package/lib/ai/init.d.ts +30 -0
  28. package/lib/ai/init.d.ts.map +1 -0
  29. package/lib/ai/init.js +424 -0
  30. package/lib/ai/init.js.map +1 -0
  31. package/lib/ai/output.d.ts +93 -0
  32. package/lib/ai/output.d.ts.map +1 -0
  33. package/lib/ai/output.js +176 -0
  34. package/lib/ai/output.js.map +1 -0
  35. package/lib/ai/providers/anthropic.d.ts +23 -0
  36. package/lib/ai/providers/anthropic.d.ts.map +1 -0
  37. package/lib/ai/providers/anthropic.js +322 -0
  38. package/lib/ai/providers/anthropic.js.map +1 -0
  39. package/lib/ai/providers/base.d.ts +43 -0
  40. package/lib/ai/providers/base.d.ts.map +1 -0
  41. package/lib/ai/providers/base.js +135 -0
  42. package/lib/ai/providers/base.js.map +1 -0
  43. package/lib/ai/providers/index.d.ts +12 -0
  44. package/lib/ai/providers/index.d.ts.map +1 -0
  45. package/lib/ai/providers/index.js +9 -0
  46. package/lib/ai/providers/index.js.map +1 -0
  47. package/lib/ai/providers/ollama.d.ts +25 -0
  48. package/lib/ai/providers/ollama.d.ts.map +1 -0
  49. package/lib/ai/providers/ollama.js +243 -0
  50. package/lib/ai/providers/ollama.js.map +1 -0
  51. package/lib/ai/providers/openai.d.ts +46 -0
  52. package/lib/ai/providers/openai.d.ts.map +1 -0
  53. package/lib/ai/providers/openai.js +132 -0
  54. package/lib/ai/providers/openai.js.map +1 -0
  55. package/lib/ai/rate-limiter.d.ts +38 -0
  56. package/lib/ai/rate-limiter.d.ts.map +1 -0
  57. package/lib/ai/rate-limiter.js +86 -0
  58. package/lib/ai/rate-limiter.js.map +1 -0
  59. package/lib/ai/service.d.ts +81 -0
  60. package/lib/ai/service.d.ts.map +1 -0
  61. package/lib/ai/service.js +274 -0
  62. package/lib/ai/service.js.map +1 -0
  63. package/lib/ai/session.d.ts +186 -0
  64. package/lib/ai/session.d.ts.map +1 -0
  65. package/lib/ai/session.js +443 -0
  66. package/lib/ai/session.js.map +1 -0
  67. package/lib/ai/tone-detector.d.ts +19 -0
  68. package/lib/ai/tone-detector.d.ts.map +1 -0
  69. package/lib/ai/tone-detector.js +72 -0
  70. package/lib/ai/tone-detector.js.map +1 -0
  71. package/lib/ai/tools.d.ts +45 -0
  72. package/lib/ai/tools.d.ts.map +1 -0
  73. package/lib/ai/tools.js +206 -0
  74. package/lib/ai/tools.js.map +1 -0
  75. package/lib/ai/types.d.ts +264 -0
  76. package/lib/ai/types.d.ts.map +1 -0
  77. package/lib/ai/types.js +6 -0
  78. package/lib/ai/types.js.map +1 -0
  79. package/lib/ai/user-profile.d.ts +56 -0
  80. package/lib/ai/user-profile.d.ts.map +1 -0
  81. package/lib/ai/user-profile.js +130 -0
  82. package/lib/ai/user-profile.js.map +1 -0
  83. package/lib/ai/zhin-agent.d.ts +165 -0
  84. package/lib/ai/zhin-agent.d.ts.map +1 -0
  85. package/lib/ai/zhin-agent.js +707 -0
  86. package/lib/ai/zhin-agent.js.map +1 -0
  87. package/lib/built/ai-trigger.d.ts.map +1 -1
  88. package/lib/built/ai-trigger.js +7 -3
  89. package/lib/built/ai-trigger.js.map +1 -1
  90. package/lib/built/command.d.ts +33 -17
  91. package/lib/built/command.d.ts.map +1 -1
  92. package/lib/built/command.js +71 -44
  93. package/lib/built/command.js.map +1 -1
  94. package/lib/built/component.d.ts +42 -15
  95. package/lib/built/component.d.ts.map +1 -1
  96. package/lib/built/component.js +84 -52
  97. package/lib/built/component.js.map +1 -1
  98. package/lib/built/config.d.ts +54 -5
  99. package/lib/built/config.d.ts.map +1 -1
  100. package/lib/built/config.js +76 -10
  101. package/lib/built/config.js.map +1 -1
  102. package/lib/built/cron.d.ts +41 -18
  103. package/lib/built/cron.d.ts.map +1 -1
  104. package/lib/built/cron.js +106 -63
  105. package/lib/built/cron.js.map +1 -1
  106. package/lib/built/database.d.ts +55 -6
  107. package/lib/built/database.d.ts.map +1 -1
  108. package/lib/built/database.js +93 -22
  109. package/lib/built/database.js.map +1 -1
  110. package/lib/built/dispatcher.d.ts +118 -0
  111. package/lib/built/dispatcher.d.ts.map +1 -0
  112. package/lib/built/dispatcher.js +196 -0
  113. package/lib/built/dispatcher.js.map +1 -0
  114. package/lib/built/permission.d.ts +45 -5
  115. package/lib/built/permission.d.ts.map +1 -1
  116. package/lib/built/permission.js +56 -11
  117. package/lib/built/permission.js.map +1 -1
  118. package/lib/built/skill.d.ts +117 -0
  119. package/lib/built/skill.d.ts.map +1 -0
  120. package/lib/built/skill.js +191 -0
  121. package/lib/built/skill.js.map +1 -0
  122. package/lib/built/tool.d.ts +71 -164
  123. package/lib/built/tool.d.ts.map +1 -1
  124. package/lib/built/tool.js +212 -297
  125. package/lib/built/tool.js.map +1 -1
  126. package/lib/feature.d.ts +75 -0
  127. package/lib/feature.d.ts.map +1 -0
  128. package/lib/feature.js +69 -0
  129. package/lib/feature.js.map +1 -0
  130. package/lib/index.d.ts +4 -0
  131. package/lib/index.d.ts.map +1 -1
  132. package/lib/index.js +7 -0
  133. package/lib/index.js.map +1 -1
  134. package/lib/plugin.d.ts +25 -17
  135. package/lib/plugin.d.ts.map +1 -1
  136. package/lib/plugin.js +180 -20
  137. package/lib/plugin.js.map +1 -1
  138. package/lib/types.d.ts +4 -9
  139. package/lib/types.d.ts.map +1 -1
  140. package/package.json +4 -4
  141. package/src/adapter.ts +101 -2
  142. package/src/ai/agent.ts +772 -0
  143. package/src/ai/context-manager.ts +440 -0
  144. package/src/ai/conversation-memory.ts +774 -0
  145. package/src/ai/follow-up.ts +357 -0
  146. package/src/ai/index.ts +128 -0
  147. package/src/ai/init.ts +502 -0
  148. package/src/ai/output.ts +261 -0
  149. package/src/ai/providers/anthropic.ts +375 -0
  150. package/src/ai/providers/base.ts +173 -0
  151. package/src/ai/providers/index.ts +13 -0
  152. package/src/ai/providers/ollama.ts +292 -0
  153. package/src/ai/providers/openai.ts +167 -0
  154. package/src/ai/rate-limiter.ts +129 -0
  155. package/src/ai/service.ts +319 -0
  156. package/src/ai/session.ts +544 -0
  157. package/src/ai/tone-detector.ts +89 -0
  158. package/src/ai/tools.ts +218 -0
  159. package/src/ai/types.ts +296 -0
  160. package/src/ai/user-profile.ts +181 -0
  161. package/src/ai/zhin-agent.ts +845 -0
  162. package/src/built/ai-trigger.ts +6 -3
  163. package/src/built/command.ts +75 -69
  164. package/src/built/component.ts +94 -76
  165. package/src/built/config.ts +238 -128
  166. package/src/built/cron.ts +117 -101
  167. package/src/built/database.ts +128 -33
  168. package/src/built/dispatcher.ts +332 -0
  169. package/src/built/permission.ts +146 -54
  170. package/src/built/skill.ts +280 -0
  171. package/src/built/tool.ts +245 -366
  172. package/src/feature.ts +113 -0
  173. package/src/index.ts +7 -0
  174. package/src/plugin.ts +198 -33
  175. package/src/types.ts +6 -10
  176. package/tests/adapter.test.ts +153 -1
  177. package/tests/ai/agent.test.ts +614 -0
  178. package/tests/ai/ai-trigger.test.ts +368 -0
  179. package/tests/ai/context-manager.test.ts +413 -0
  180. package/tests/ai/conversation-memory.test.ts +128 -0
  181. package/tests/ai/follow-up.test.ts +175 -0
  182. package/tests/ai/integration.test.ts +584 -0
  183. package/tests/ai/output.test.ts +128 -0
  184. package/tests/ai/providers.integration.test.ts +227 -0
  185. package/tests/ai/rate-limiter.test.ts +108 -0
  186. package/tests/ai/session.test.ts +375 -0
  187. package/tests/ai/setup.ts +308 -0
  188. package/tests/ai/tone-detector.test.ts +80 -0
  189. package/tests/ai/tool.test.ts +800 -0
  190. package/tests/ai/tools-builtin.test.ts +346 -0
  191. package/tests/ai/user-profile.test.ts +73 -0
  192. package/tests/ai/zhin-agent.test.ts +177 -0
  193. package/tests/config.test.ts +46 -0
  194. package/tests/cron.test.ts +94 -5
  195. package/tests/dispatcher.test.ts +146 -0
  196. package/tests/feature.test.ts +145 -0
  197. package/tests/features-builtin.test.ts +191 -0
  198. package/tests/plugin.test.ts +88 -14
  199. package/tests/skill-feature.test.ts +179 -0
  200. package/tests/tool-feature.test.ts +254 -0
@@ -1 +1 @@
1
- {"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/built/permission.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,iBAAkB,SAAQ,KAAqB;IACxD;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAChE,OAAO,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC9D,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC7C,IAAG,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM,EAAE,GAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,IAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,KAAK,CAAC;YACnD,IAAG,EAAE,KAAG,EAAE,IAAE,EAAE,KAAG,GAAG;gBAAE,OAAO,IAAI,CAAC;YAClC,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAChE,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC/C,IAAG,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM,EAAE,GAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,IAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACrD,IAAG,EAAE,KAAG,EAAE,IAAE,EAAE,KAAG,GAAG;gBAAE,OAAO,IAAI,CAAC;YAClC,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAChE,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC/C,IAAG,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM,EAAE,GAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,IAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACrD,IAAG,EAAE,KAAG,EAAE,IAAE,EAAE,KAAG,GAAG;gBAAE,OAAO,IAAI,CAAC;YAClC,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,EAAC,CAAC,IAAI,EAAC,OAAO,EAAC,EAAE;YAC1D,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC/C,IAAG,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM,EAAE,GAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAG,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC,CAAA;IACP,CAAC;IACD,GAAG,CAAC,UAA0B;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,OAAmD;QACzE,KAAI,MAAM,UAAU,IAAI,IAAI,EAAC,CAAC;YAC1B,MAAM,MAAM,GAAC,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,EAAC,OAAO,CAAC,CAAC;YAClD,IAAG,MAAM;gBAAE,OAAO,IAAI,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AACD,MAAM,KAAW,WAAW,CAI3B;AAJD,WAAiB,WAAW;IACxB,SAAgB,MAAM,CAAkD,IAAqB,EAAE,KAA2B;QACtH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAFe,kBAAM,SAErB,CAAA;AACL,CAAC,EAJgB,WAAW,KAAX,WAAW,QAI3B"}
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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"}
@@ -1,9 +1,10 @@
1
1
  /**
2
- * Tool Service
3
- * 统一的工具管理服务,支持 Tool ↔ Command 互转
2
+ * ToolFeature — 统一的工具管理服务
3
+ * 支持 Tool ↔ Command 互转
4
4
  */
5
+ import { Feature, FeatureJSON } from "../feature.js";
5
6
  import { MessageCommand } from "../command.js";
6
- import { Context, Plugin } from "../plugin.js";
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
- * ToolService 扩展方法类型
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: ToolService;
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
- export interface ToolService {
242
- /** 所有注册的工具 */
243
- readonly tools: Map<string, Tool>;
244
- /** 工具对应的命令(如果生成了) */
245
- readonly toolCommands: Map<string, MessageCommand<RegisteredAdapter>>;
246
- /** 添加工具(支持 Tool 对象或 ZhinTool 实例) */
247
- add(tool: ToolInput, pluginName: string, generateCommand?: boolean): () => void;
248
- /** 移除工具 */
249
- remove(name: string): boolean;
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
- /** 将 Command 转换为 Tool */
155
+ /**
156
+ * 将 Command 转换为 Tool
157
+ */
259
158
  commandToTool(command: MessageCommand<RegisteredAdapter>, pluginName: string): Tool;
260
- /** 收集所有可用工具(包括从 Command 转换的) */
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