@zhin.js/core 1.0.57 → 1.1.2

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 (126) hide show
  1. package/lib/adapter.d.ts +1 -26
  2. package/lib/adapter.d.ts.map +1 -1
  3. package/lib/adapter.js +20 -117
  4. package/lib/adapter.js.map +1 -1
  5. package/lib/ai/index.d.ts +2 -0
  6. package/lib/ai/index.d.ts.map +1 -1
  7. package/lib/ai/index.js +1 -0
  8. package/lib/ai/index.js.map +1 -1
  9. package/lib/built/adapter-process.d.ts +0 -4
  10. package/lib/built/adapter-process.d.ts.map +1 -1
  11. package/lib/built/adapter-process.js +0 -95
  12. package/lib/built/adapter-process.js.map +1 -1
  13. package/lib/built/agent-preset.d.ts +2 -0
  14. package/lib/built/agent-preset.d.ts.map +1 -1
  15. package/lib/built/agent-preset.js +4 -0
  16. package/lib/built/agent-preset.js.map +1 -1
  17. package/lib/built/command.d.ts +4 -0
  18. package/lib/built/command.d.ts.map +1 -1
  19. package/lib/built/command.js +6 -0
  20. package/lib/built/command.js.map +1 -1
  21. package/lib/built/component.d.ts.map +1 -1
  22. package/lib/built/component.js +1 -0
  23. package/lib/built/component.js.map +1 -1
  24. package/lib/built/dispatcher.d.ts.map +1 -1
  25. package/lib/built/dispatcher.js +0 -13
  26. package/lib/built/dispatcher.js.map +1 -1
  27. package/lib/built/message-filter.d.ts +2 -0
  28. package/lib/built/message-filter.d.ts.map +1 -1
  29. package/lib/built/message-filter.js +5 -0
  30. package/lib/built/message-filter.js.map +1 -1
  31. package/lib/built/skill.d.ts +11 -0
  32. package/lib/built/skill.d.ts.map +1 -1
  33. package/lib/built/skill.js +14 -0
  34. package/lib/built/skill.js.map +1 -1
  35. package/lib/built/tool.d.ts +11 -44
  36. package/lib/built/tool.d.ts.map +1 -1
  37. package/lib/built/tool.js +14 -353
  38. package/lib/built/tool.js.map +1 -1
  39. package/lib/plugin.d.ts +1 -25
  40. package/lib/plugin.d.ts.map +1 -1
  41. package/lib/plugin.js +1 -77
  42. package/lib/plugin.js.map +1 -1
  43. package/lib/types.d.ts +0 -25
  44. package/lib/types.d.ts.map +1 -1
  45. package/package.json +10 -7
  46. package/CHANGELOG.md +0 -538
  47. package/REFACTORING_COMPLETE.md +0 -178
  48. package/REFACTORING_STATUS.md +0 -263
  49. package/src/adapter.ts +0 -275
  50. package/src/ai/index.ts +0 -52
  51. package/src/ai/providers/anthropic.ts +0 -379
  52. package/src/ai/providers/base.ts +0 -175
  53. package/src/ai/providers/index.ts +0 -13
  54. package/src/ai/providers/ollama.ts +0 -302
  55. package/src/ai/providers/openai.ts +0 -174
  56. package/src/ai/types.ts +0 -348
  57. package/src/bot.ts +0 -37
  58. package/src/built/adapter-process.ts +0 -177
  59. package/src/built/agent-preset.ts +0 -136
  60. package/src/built/ai-trigger.ts +0 -259
  61. package/src/built/command.ts +0 -108
  62. package/src/built/common-adapter-tools.ts +0 -242
  63. package/src/built/component.ts +0 -130
  64. package/src/built/config.ts +0 -335
  65. package/src/built/cron.ts +0 -156
  66. package/src/built/database.ts +0 -134
  67. package/src/built/dispatcher.ts +0 -496
  68. package/src/built/login-assist.ts +0 -131
  69. package/src/built/message-filter.ts +0 -390
  70. package/src/built/permission.ts +0 -151
  71. package/src/built/schema-feature.ts +0 -190
  72. package/src/built/skill.ts +0 -221
  73. package/src/built/tool.ts +0 -948
  74. package/src/command.ts +0 -87
  75. package/src/component.ts +0 -565
  76. package/src/cron.ts +0 -4
  77. package/src/errors.ts +0 -46
  78. package/src/feature.ts +0 -7
  79. package/src/index.ts +0 -53
  80. package/src/jsx-dev-runtime.ts +0 -2
  81. package/src/jsx-runtime.ts +0 -12
  82. package/src/jsx.ts +0 -135
  83. package/src/message.ts +0 -48
  84. package/src/models/system-log.ts +0 -20
  85. package/src/models/user.ts +0 -15
  86. package/src/notice.ts +0 -98
  87. package/src/plugin.ts +0 -896
  88. package/src/prompt.ts +0 -293
  89. package/src/request.ts +0 -95
  90. package/src/scheduler/index.ts +0 -19
  91. package/src/scheduler/scheduler.ts +0 -372
  92. package/src/scheduler/types.ts +0 -74
  93. package/src/tool-zod.ts +0 -115
  94. package/src/types-generator.ts +0 -78
  95. package/src/types.ts +0 -505
  96. package/src/utils.ts +0 -227
  97. package/tests/adapter.test.ts +0 -638
  98. package/tests/ai/ai-trigger.test.ts +0 -368
  99. package/tests/ai/providers.integration.test.ts +0 -227
  100. package/tests/ai/setup.ts +0 -308
  101. package/tests/ai/tool.test.ts +0 -800
  102. package/tests/bot.test.ts +0 -151
  103. package/tests/command.test.ts +0 -737
  104. package/tests/component-new.test.ts +0 -361
  105. package/tests/config.test.ts +0 -372
  106. package/tests/cron.test.ts +0 -82
  107. package/tests/dispatcher.test.ts +0 -293
  108. package/tests/errors.test.ts +0 -21
  109. package/tests/expression-evaluation.test.ts +0 -258
  110. package/tests/features-builtin.test.ts +0 -191
  111. package/tests/jsx-runtime.test.ts +0 -45
  112. package/tests/jsx.test.ts +0 -319
  113. package/tests/message-filter.test.ts +0 -566
  114. package/tests/message.test.ts +0 -402
  115. package/tests/notice.test.ts +0 -198
  116. package/tests/plugin.test.ts +0 -779
  117. package/tests/prompt.test.ts +0 -78
  118. package/tests/redos-protection.test.ts +0 -198
  119. package/tests/request.test.ts +0 -221
  120. package/tests/schema.test.ts +0 -248
  121. package/tests/skill-feature.test.ts +0 -179
  122. package/tests/test-utils.ts +0 -59
  123. package/tests/tool-feature.test.ts +0 -254
  124. package/tests/types.test.ts +0 -162
  125. package/tests/utils.test.ts +0 -135
  126. package/tsconfig.json +0 -24
@@ -1,248 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { Schema } from '@zhin.js/core'
3
-
4
- describe('Schema系统测试', () => {
5
- describe('基础类型Schema', () => {
6
- it('应该创建字符串Schema', () => {
7
- const schema = Schema.string('测试字符串')
8
- expect(schema.meta.type).toBe('string')
9
- expect(schema.meta.key).toBe('测试字符串')
10
- })
11
-
12
- it('应该创建数字Schema', () => {
13
- const schema = Schema.number('测试数字').min(0).max(100)
14
- expect(schema.meta.type).toBe('number')
15
- expect(schema.meta.min).toBe(0)
16
- expect(schema.meta.max).toBe(100)
17
- })
18
-
19
- it('应该创建布尔Schema', () => {
20
- const schema = Schema.boolean('测试布尔')
21
- expect(schema.meta.type).toBe('boolean')
22
- expect(schema.meta.key).toBe('测试布尔')
23
- })
24
-
25
- it('应该创建常量Schema', () => {
26
- const schema = Schema.const('constant_value', '常量值')
27
- expect(schema.meta.type).toBe('const')
28
- expect(schema.meta.default).toBe('constant_value')
29
- })
30
- })
31
-
32
- describe('复合类型Schema', () => {
33
- it('应该创建对象Schema', () => {
34
- const schema = Schema.object({
35
- name: Schema.string('名称'),
36
- age: Schema.number('年龄'),
37
- active: Schema.boolean('是否激活')
38
- })
39
-
40
- expect(schema.meta.type).toBe('object')
41
- expect(Object.keys(schema.options.object!)).toEqual(['name', 'age', 'active'])
42
- })
43
-
44
- it('应该创建列表Schema', () => {
45
- const schema = Schema.list(Schema.string('项目'), '字符串列表')
46
- expect(schema.meta.type).toBe('list')
47
- expect(schema.options.inner?.meta.type).toBe('string')
48
- })
49
-
50
- it('应该创建字典Schema', () => {
51
- const schema = Schema.dict(Schema.number('值'), '数字字典')
52
- expect(schema.meta.type).toBe('dict')
53
- expect(schema.options.inner?.meta.type).toBe('number')
54
- })
55
-
56
- it('应该支持联合类型', () => {
57
- const schema = Schema.union([
58
- Schema.string('option1'),
59
- Schema.number('option2'),
60
- Schema.boolean('option3')
61
- ], 'unionTest')
62
-
63
- expect(schema.meta.type).toBe('union')
64
- expect(schema.options.list).toHaveLength(3)
65
- expect(schema.options.list![0].meta.type).toBe('string')
66
- expect(schema.options.list![1].meta.type).toBe('number')
67
- expect(schema.options.list![2].meta.type).toBe('boolean')
68
- })
69
-
70
- it('应该创建元组Schema', () => {
71
- const schema = Schema.tuple([
72
- Schema.string('first'),
73
- Schema.number('second'),
74
- Schema.boolean('third')
75
- ], 'tupleTest')
76
-
77
- expect(schema.meta.type).toBe('tuple')
78
- expect(schema.options.list).toHaveLength(3)
79
- expect(schema.options.list![0].meta.type).toBe('string')
80
- expect(schema.options.list![1].meta.type).toBe('number')
81
- expect(schema.options.list![2].meta.type).toBe('boolean')
82
- })
83
- })
84
-
85
- describe('Schema链式API', () => {
86
- it('应该支持required()链式调用', () => {
87
- const schema = Schema.string('测试').required()
88
- expect(schema.meta.required).toBe(true)
89
- })
90
-
91
- it('应该支持default()链式调用', () => {
92
- const schema = Schema.string('测试').default('默认值')
93
- expect(schema.meta.default).toBe('默认值')
94
- })
95
-
96
- it('应该支持description()链式调用', () => {
97
- const schema = Schema.string('测试').description('新描述')
98
- expect(schema.meta.description).toBe('新描述')
99
- })
100
-
101
- it('应该支持hidden()链式调用', () => {
102
- const schema = Schema.string('测试').hidden()
103
- expect(schema.meta.hidden).toBe(true)
104
- })
105
-
106
- it('应该支持component()链式调用', () => {
107
- const schema = Schema.string('测试').component('CustomInput')
108
- expect(schema.meta.component).toBe('CustomInput')
109
- })
110
- })
111
-
112
- describe('Schema数值约束', () => {
113
- it('应该支持数字最小值约束', () => {
114
- const schema = Schema.number('测试').min(10)
115
- expect(schema.meta.min).toBe(10)
116
- })
117
-
118
- it('应该支持数字最大值约束', () => {
119
- const schema = Schema.number('测试').max(100)
120
- expect(schema.meta.max).toBe(100)
121
- })
122
-
123
- it('应该支持数字步长约束', () => {
124
- const schema = Schema.number('测试').step(5)
125
- expect(schema.meta.step).toBe(5)
126
- })
127
- })
128
-
129
- describe('Schema验证功能', () => {
130
- it('应该验证字符串值', () => {
131
- const schema = Schema.string('测试字符串')
132
-
133
- // 调用schema函数进行验证
134
- expect(() => schema('有效字符串')).not.toThrow()
135
- expect(schema('有效字符串')).toBe('有效字符串')
136
- })
137
-
138
- it('应该验证数字值', () => {
139
- const schema = Schema.number('测试数字')
140
-
141
- expect(() => schema(42)).not.toThrow()
142
- expect(schema(42)).toBe(42)
143
- })
144
-
145
- it('应该验证布尔值', () => {
146
- const schema = Schema.boolean('测试布尔')
147
-
148
- expect(() => schema(true)).not.toThrow()
149
- expect(schema(true)).toBe(true)
150
- })
151
-
152
- it('应该在验证失败时抛出类型错误', () => {
153
- const schema = Schema.string('字符串类型')
154
-
155
- // 测试类型系统的存在
156
- expect(schema.meta.type).toBe('string')
157
- })
158
- })
159
-
160
- describe('Schema序列化', () => {
161
- it('应该正确序列化为JSON', () => {
162
- const schema = Schema.string('测试')
163
- .required()
164
- .default('默认值')
165
- .description('描述信息')
166
-
167
- const json = schema.toJSON()
168
-
169
- expect(json.type).toBe('string')
170
- expect(json.required).toBe(true)
171
- expect(json.default).toBe('默认值')
172
- expect(json.description).toBe('描述信息')
173
- })
174
-
175
- it('应该正确从JSON反序列化', () => {
176
- const json = {
177
- type: 'string' as const,
178
- key: 'test-string',
179
- required: true,
180
- default: '默认值',
181
- description: '描述信息'
182
- }
183
-
184
- const schema = Schema.fromJSON(json)
185
-
186
- expect(schema.meta.type).toBe('string')
187
- expect(schema.meta.required).toBe(true)
188
- expect(schema.meta.default).toBe('默认值')
189
- expect(schema.meta.description).toBe('描述信息')
190
- })
191
- })
192
-
193
- describe('复杂Schema场景', () => {
194
- it('应该处理嵌套对象Schema', () => {
195
- const schema = Schema.object({
196
- user: Schema.object({
197
- name: Schema.string('用户名').required(),
198
- profile: Schema.object({
199
- age: Schema.number('年龄').min(0),
200
- email: Schema.string('邮箱')
201
- })
202
- }),
203
- settings: Schema.dict(Schema.boolean('设置值'), '设置字典')
204
- })
205
-
206
- expect(schema.meta.type).toBe('object')
207
- expect(schema.options.object!.user.meta.type).toBe('object')
208
- expect(schema.options.object!.settings.meta.type).toBe('dict')
209
- })
210
-
211
- it('应该处理带选项的Schema', () => {
212
- const schema = Schema.string('选择项')
213
- schema.meta.options = [
214
- { label: '选项1', value: 'opt1' },
215
- { label: '选项2', value: 'opt2' }
216
- ]
217
-
218
- expect(schema.meta.options).toHaveLength(2)
219
- expect(schema.meta.options![0]).toEqual({ label: '选项1', value: 'opt1' })
220
- })
221
-
222
- it('应该处理多选Schema', () => {
223
- const schema = Schema.string('多选项')
224
- schema.meta.options = Schema.formatOptionList(['选项1', '选项2', '选项3'])
225
- schema.meta.multiple = true
226
-
227
- expect(schema.meta.multiple).toBe(true)
228
- expect(schema.meta.options).toHaveLength(3)
229
- })
230
- })
231
-
232
- describe('特殊类型Schema', () => {
233
- it('应该创建日期Schema', () => {
234
- const schema = Schema.date('日期选择')
235
- expect(schema.meta.type).toBe('date')
236
- })
237
-
238
- it('应该创建正则表达式Schema', () => {
239
- const schema = Schema.regexp('正则表达式')
240
- expect(schema.meta.type).toBe('regexp')
241
- })
242
-
243
- it('应该创建百分比Schema', () => {
244
- // 百分比类型测试暂时跳过,因为新Schema还未实现percent方法
245
- expect(true).toBe(true)
246
- })
247
- })
248
- })
@@ -1,179 +0,0 @@
1
- /**
2
- * SkillFeature 测试
3
- */
4
- import { describe, it, expect, beforeEach } from 'vitest';
5
- import { SkillFeature, Skill } from '../src/built/skill.js';
6
- import type { Tool } from '../src/types.js';
7
-
8
- function makeTool(name: string, desc: string = ''): Tool {
9
- return {
10
- name,
11
- description: desc,
12
- parameters: { type: 'object', properties: {} },
13
- execute: async () => '',
14
- };
15
- }
16
-
17
- function makeSkill(overrides: Partial<Skill> & { name: string }): Skill {
18
- return {
19
- description: '默认描述',
20
- tools: [],
21
- pluginName: overrides.name,
22
- ...overrides,
23
- };
24
- }
25
-
26
- describe('SkillFeature', () => {
27
- let feature: SkillFeature;
28
-
29
- beforeEach(() => {
30
- feature = new SkillFeature();
31
- });
32
-
33
- describe('add / remove', () => {
34
- it('应该能添加 Skill', () => {
35
- const skill = makeSkill({ name: 'weather', description: '天气查询' });
36
- const dispose = feature.add(skill, 'plugin-weather');
37
-
38
- expect(feature.items).toHaveLength(1);
39
- expect(feature.byName.get('weather')).toBe(skill);
40
- expect(feature.size).toBe(1);
41
- });
42
-
43
- it('dispose 应移除 Skill', () => {
44
- const skill = makeSkill({ name: 'weather' });
45
- const dispose = feature.add(skill, 'plugin-weather');
46
-
47
- dispose();
48
- expect(feature.items).toHaveLength(0);
49
- expect(feature.byName.has('weather')).toBe(false);
50
- });
51
-
52
- it('remove 应从 byName 和 items 中移除', () => {
53
- const skill = makeSkill({ name: 'weather' });
54
- feature.add(skill, 'plugin-weather');
55
-
56
- feature.remove(skill);
57
- expect(feature.items).toHaveLength(0);
58
- expect(feature.byName.has('weather')).toBe(false);
59
- });
60
- });
61
-
62
- describe('get / getAll', () => {
63
- it('按名称获取', () => {
64
- const skill = makeSkill({ name: 'news' });
65
- feature.add(skill, 'plugin-news');
66
-
67
- expect(feature.get('news')).toBe(skill);
68
- expect(feature.get('nonexistent')).toBeUndefined();
69
- });
70
-
71
- it('获取所有', () => {
72
- feature.add(makeSkill({ name: 'a' }), 'pa');
73
- feature.add(makeSkill({ name: 'b' }), 'pb');
74
-
75
- const all = feature.getAll();
76
- expect(all).toHaveLength(2);
77
- });
78
- });
79
-
80
- describe('search', () => {
81
- beforeEach(() => {
82
- feature.add(makeSkill({
83
- name: 'weather',
84
- description: '查询天气预报',
85
- keywords: ['天气', '气温', '温度'],
86
- tags: ['weather', '生活'],
87
- tools: [makeTool('get_weather', '获取天气')],
88
- }), 'plugin-weather');
89
-
90
- feature.add(makeSkill({
91
- name: 'news',
92
- description: '获取新闻资讯',
93
- keywords: ['新闻', '头条', '资讯'],
94
- tags: ['news', '信息'],
95
- tools: [makeTool('get_news', '获取新闻')],
96
- }), 'plugin-news');
97
-
98
- feature.add(makeSkill({
99
- name: 'music',
100
- description: '音乐搜索与播放',
101
- keywords: ['音乐', '歌曲', '播放'],
102
- tags: ['music', '娱乐'],
103
- tools: [makeTool('search_music')],
104
- }), 'plugin-music');
105
- });
106
-
107
- it('关键词匹配应返回相关 Skill', () => {
108
- const results = feature.search('今天天气怎么样');
109
- expect(results.length).toBeGreaterThan(0);
110
- expect(results[0].name).toBe('weather');
111
- });
112
-
113
- it('标签匹配应返回相关 Skill', () => {
114
- const results = feature.search('news');
115
- expect(results.some(s => s.name === 'news')).toBe(true);
116
- });
117
-
118
- it('无匹配时应返回空数组', () => {
119
- const results = feature.search('完全无关的内容 xyz');
120
- expect(results).toHaveLength(0);
121
- });
122
-
123
- it('maxResults 应限制返回数量', () => {
124
- // 搜索一个泛化词,可能匹配多个
125
- const results = feature.search('获取', { maxResults: 1 });
126
- expect(results.length).toBeLessThanOrEqual(1);
127
- });
128
- });
129
-
130
- describe('collectAllTools', () => {
131
- it('应收集所有 Skill 的工具', () => {
132
- feature.add(makeSkill({
133
- name: 'a',
134
- tools: [makeTool('t1'), makeTool('t2')],
135
- }), 'pa');
136
- feature.add(makeSkill({
137
- name: 'b',
138
- tools: [makeTool('t3')],
139
- }), 'pb');
140
-
141
- const tools = feature.collectAllTools();
142
- expect(tools).toHaveLength(3);
143
- expect(tools.map(t => t.name)).toEqual(['t1', 't2', 't3']);
144
- });
145
- });
146
-
147
- describe('toJSON', () => {
148
- it('应序列化所有 Skill', () => {
149
- feature.add(makeSkill({
150
- name: 'test',
151
- description: '测试技能',
152
- keywords: ['test'],
153
- tags: ['t'],
154
- tools: [makeTool('t1'), makeTool('t2')],
155
- }), 'plugin-test');
156
-
157
- const json = feature.toJSON();
158
- expect(json.name).toBe('skill');
159
- expect(json.icon).toBe('Brain');
160
- expect(json.count).toBe(1);
161
- expect(json.items[0]).toMatchObject({
162
- name: 'test',
163
- desc: '测试技能',
164
- toolCount: 2,
165
- keywords: ['test'],
166
- tags: ['t'],
167
- });
168
- });
169
-
170
- it('按插件名过滤', () => {
171
- feature.add(makeSkill({ name: 'a' }), 'pa');
172
- feature.add(makeSkill({ name: 'b' }), 'pb');
173
-
174
- const json = feature.toJSON('pa');
175
- expect(json.count).toBe(1);
176
- expect(json.items[0].name).toBe('a');
177
- });
178
- });
179
- });
@@ -1,59 +0,0 @@
1
- import { MessageSegment, Message, MessageSender, MessageChannel, SendContent } from '../src/types'
2
-
3
- // 创建测试消息片段
4
- export function createTestMessageSegment(type: string, data: Record<string, any>): MessageSegment {
5
- return { type, data }
6
- }
7
-
8
- // 创建测试消息发送者
9
- export function createTestSender(id: string, name?: string): MessageSender {
10
- return { id, name }
11
- }
12
-
13
- // 创建测试消息频道
14
- export function createTestChannel(id: string, type: 'group' | 'private' | 'channel'): MessageChannel {
15
- return { id, type }
16
- }
17
-
18
- // 创建测试消息
19
- export function createTestMessage(
20
- id: string,
21
- content: MessageSegment[],
22
- sender: MessageSender,
23
- channel: MessageChannel,
24
- raw: string = '',
25
- timestamp: number = Date.now()
26
- ): Message {
27
- return {
28
- id,
29
- content,
30
- sender,
31
- channel,
32
- raw,
33
- timestamp,
34
- reply: async (content: SendContent, quote?: boolean | string) => {
35
- // 模拟回复功能
36
- }
37
- }
38
- }
39
-
40
- // 等待指定时间
41
- export function wait(ms: number): Promise<void> {
42
- return new Promise(resolve => setTimeout(resolve, ms))
43
- }
44
-
45
- // 创建测试错误
46
- export class TestError extends Error {
47
- constructor(message: string) {
48
- super(message)
49
- this.name = 'TestError'
50
- }
51
- }
52
-
53
- // 创建测试日志记录器
54
- export const TestLogger = {
55
- debug: vi.fn(),
56
- info: vi.fn(),
57
- warn: vi.fn(),
58
- error: vi.fn()
59
- }