foliko 1.0.74 → 1.0.75
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/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
- package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
- package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
- package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
- package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
- package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
- package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
- package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
- package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
- package/.agent/ARCHITECTURE.md +288 -0
- package/.agent/agents/ambient-agent.md +57 -0
- package/.agent/agents/debugger.md +55 -0
- package/.agent/agents/email-assistant.md +49 -0
- package/.agent/agents/file-manager.md +42 -0
- package/.agent/agents/python-developer.md +60 -0
- package/.agent/agents/scheduler.md +59 -0
- package/.agent/agents/web-developer.md +45 -0
- package/.agent/data/default.json +29 -0
- package/.agent/data/plugins-state.json +255 -0
- package/.agent/mcp_config.json +4 -0
- package/.agent/mcp_config_updated.json +12 -0
- package/.agent/plugins.json +5 -0
- package/.agent/rules/GEMINI.md +273 -0
- package/.agent/rules/allow-rule.md +77 -0
- package/.agent/rules/log-rule.md +83 -0
- package/.agent/rules/security-rule.md +93 -0
- package/.agent/scripts/auto_preview.py +148 -0
- package/.agent/scripts/checklist.py +217 -0
- package/.agent/scripts/session_manager.py +120 -0
- package/.agent/scripts/verify_all.py +327 -0
- package/.agent/skills/api-patterns/SKILL.md +81 -0
- package/.agent/skills/api-patterns/api-style.md +42 -0
- package/.agent/skills/api-patterns/auth.md +24 -0
- package/.agent/skills/api-patterns/documentation.md +26 -0
- package/.agent/skills/api-patterns/graphql.md +41 -0
- package/.agent/skills/api-patterns/rate-limiting.md +31 -0
- package/.agent/skills/api-patterns/response.md +37 -0
- package/.agent/skills/api-patterns/rest.md +40 -0
- package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
- package/.agent/skills/api-patterns/security-testing.md +122 -0
- package/.agent/skills/api-patterns/trpc.md +41 -0
- package/.agent/skills/api-patterns/versioning.md +22 -0
- package/.agent/skills/app-builder/SKILL.md +75 -0
- package/.agent/skills/app-builder/agent-coordination.md +71 -0
- package/.agent/skills/app-builder/feature-building.md +53 -0
- package/.agent/skills/app-builder/project-detection.md +34 -0
- package/.agent/skills/app-builder/scaffolding.md +118 -0
- package/.agent/skills/app-builder/tech-stack.md +40 -0
- package/.agent/skills/app-builder/templates/SKILL.md +39 -0
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/.agent/skills/architecture/SKILL.md +55 -0
- package/.agent/skills/architecture/context-discovery.md +43 -0
- package/.agent/skills/architecture/examples.md +94 -0
- package/.agent/skills/architecture/pattern-selection.md +68 -0
- package/.agent/skills/architecture/patterns-reference.md +50 -0
- package/.agent/skills/architecture/trade-off-analysis.md +77 -0
- package/.agent/skills/clean-code/SKILL.md +201 -0
- package/.agent/skills/doc.md +177 -0
- package/.agent/skills/frontend-design/SKILL.md +418 -0
- package/.agent/skills/frontend-design/animation-guide.md +331 -0
- package/.agent/skills/frontend-design/color-system.md +311 -0
- package/.agent/skills/frontend-design/decision-trees.md +418 -0
- package/.agent/skills/frontend-design/motion-graphics.md +306 -0
- package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/.agent/skills/frontend-design/typography-system.md +345 -0
- package/.agent/skills/frontend-design/ux-psychology.md +1116 -0
- package/.agent/skills/frontend-design/visual-effects.md +383 -0
- package/.agent/skills/i18n-localization/SKILL.md +154 -0
- package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/.agent/skills/mcp-builder/SKILL.md +176 -0
- package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
- package/.agent/workflows/brainstorm.md +113 -0
- package/.agent/workflows/create.md +59 -0
- package/.agent/workflows/debug.md +103 -0
- package/.agent/workflows/deploy.md +176 -0
- package/.agent/workflows/enhance.md +63 -0
- package/.agent/workflows/orchestrate.md +237 -0
- package/.agent/workflows/plan.md +89 -0
- package/.agent/workflows/preview.md +81 -0
- package/.agent/workflows/simple-test.md +42 -0
- package/.agent/workflows/status.md +86 -0
- package/.agent/workflows/structured-orchestrate.md +180 -0
- package/.agent/workflows/test.md +144 -0
- package/.agent/workflows/ui-ux-pro-max.md +296 -0
- package/.claude/settings.local.json +157 -149
- package/.editorconfig +56 -0
- package/.husky/pre-commit +4 -0
- package/.lintstagedrc +7 -0
- package/.prettierignore +29 -0
- package/.prettierrc +11 -0
- package/CLAUDE.md +2 -0
- package/README.md +64 -55
- package/SPEC.md +102 -61
- package/cli/bin/foliko.js +4 -4
- package/cli/src/commands/chat.js +53 -51
- package/cli/src/commands/list.js +40 -37
- package/cli/src/index.js +18 -18
- package/cli/src/ui/chat-ui.js +78 -76
- package/cli/src/utils/ansi.js +15 -15
- package/cli/src/utils/markdown.js +112 -116
- package/docker-compose.yml +1 -1
- package/docs/ai-sdk-optimization.md +655 -643
- package/docs/features.md +80 -80
- package/docs/quick-reference.md +49 -46
- package/docs/user-manual.md +411 -380
- package/examples/ambient-example.js +95 -97
- package/examples/basic.js +115 -110
- package/examples/bootstrap.js +52 -43
- package/examples/mcp-example.js +56 -53
- package/examples/skill-example.js +49 -49
- package/examples/test-chat.js +60 -58
- package/examples/test-mcp.js +49 -43
- package/examples/test-reload.js +38 -40
- package/examples/test-telegram.js +3 -3
- package/examples/test-tg-bot.js +7 -4
- package/examples/test-tg-simple.js +4 -3
- package/examples/test-tg.js +3 -3
- package/examples/test-think.js +13 -7
- package/examples/test-web-plugin.js +61 -56
- package/examples/test-weixin-feishu.js +40 -37
- package/examples/workflow.js +49 -49
- package/foliko-1.0.75.tgz +0 -0
- package/package.json +37 -3
- package/plugins/ai-plugin.js +7 -5
- package/plugins/ambient-agent/EventWatcher.js +113 -0
- package/plugins/ambient-agent/ExplorerLoop.js +640 -0
- package/plugins/ambient-agent/GoalManager.js +197 -0
- package/plugins/ambient-agent/Reflector.js +95 -0
- package/plugins/ambient-agent/StateStore.js +90 -0
- package/plugins/ambient-agent/constants.js +101 -0
- package/plugins/ambient-agent/index.js +579 -0
- package/plugins/default-plugins.js +62 -49
- package/plugins/email/constants.js +64 -0
- package/plugins/email/handlers.js +461 -0
- package/plugins/email/index.js +278 -0
- package/plugins/email/monitor.js +269 -0
- package/plugins/email/parser.js +138 -0
- package/plugins/email/reply.js +151 -0
- package/plugins/email/utils.js +124 -0
- package/plugins/feishu-plugin.js +23 -19
- package/plugins/file-system-plugin.js +456 -106
- package/plugins/install-plugin.js +6 -4
- package/plugins/python-executor-plugin.js +3 -1
- package/plugins/python-plugin-loader.js +10 -8
- package/plugins/rules-plugin.js +5 -3
- package/plugins/scheduler-plugin.js +18 -16
- package/plugins/session-plugin.js +3 -1
- package/plugins/storage-plugin.js +5 -3
- package/plugins/subagent-plugin.js +152 -92
- package/plugins/telegram-plugin.js +26 -19
- package/plugins/think-plugin.js +4 -2
- package/plugins/tools-plugin.js +3 -1
- package/plugins/web-plugin.js +15 -13
- package/plugins/weixin-plugin.js +43 -36
- package/reports/system-health-report-20260401.md +79 -0
- package/skills/ambient-agent/SKILL.md +49 -39
- package/skills/foliko-dev/AGENTS.md +64 -61
- package/skills/foliko-dev/SKILL.md +125 -119
- package/skills/mcp-usage/SKILL.md +19 -17
- package/skills/python-plugin-dev/SKILL.md +16 -15
- package/skills/skill-guide/SKILL.md +12 -12
- package/skills/subagent-guide/SKILL.md +237 -0
- package/skills/workflow-guide/SKILL.md +90 -45
- package/skills/workflow-troubleshooting/DEBUGGING.md +36 -21
- package/skills/workflow-troubleshooting/SKILL.md +156 -79
- package/src/capabilities/index.js +4 -4
- package/src/capabilities/skill-manager.js +211 -197
- package/src/capabilities/workflow-engine.js +461 -547
- package/src/core/agent-chat.js +426 -279
- package/src/core/agent.js +453 -249
- package/src/core/framework.js +183 -149
- package/src/core/index.js +8 -8
- package/src/core/plugin-base.js +52 -52
- package/src/core/plugin-manager.js +377 -281
- package/src/core/provider.js +35 -32
- package/src/core/sub-agent-config.js +264 -0
- package/src/core/system-prompt-builder.js +120 -0
- package/src/core/tool-registry.js +416 -33
- package/src/core/tool-router.js +149 -68
- package/src/executors/executor-base.js +58 -58
- package/src/executors/mcp-executor.js +269 -257
- package/src/index.js +5 -17
- package/src/utils/circuit-breaker.js +301 -0
- package/src/utils/error-boundary.js +363 -0
- package/src/utils/error.js +374 -0
- package/src/utils/event-emitter.js +20 -20
- package/src/utils/id.js +133 -0
- package/src/utils/index.js +217 -3
- package/src/utils/logger.js +181 -0
- package/src/utils/plugin-helpers.js +90 -0
- package/src/utils/retry.js +122 -0
- package/src/utils/sandbox.js +292 -0
- package/test/tool-registry-validation.test.js +218 -0
- package/test_report.md +70 -0
- package/website/docs/api.html +169 -107
- package/website/docs/configuration.html +296 -144
- package/website/docs/plugin-development.html +154 -85
- package/website/docs/project-structure.html +110 -109
- package/website/docs/skill-development.html +117 -61
- package/website/index.html +209 -205
- package/website/script.js +20 -17
- package/website/styles.css +1 -1
- package/plugins/ambient-agent-plugin.js +0 -1565
- package/plugins/email.js +0 -1142
package/src/core/tool-router.js
CHANGED
|
@@ -3,59 +3,142 @@
|
|
|
3
3
|
* 根据用户输入智能选择要传递给 LLM 的工具
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const { EventEmitter } = require('../utils/event-emitter')
|
|
6
|
+
const { EventEmitter } = require('../utils/event-emitter');
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* 内置意图分类
|
|
10
10
|
*/
|
|
11
11
|
const INTENT_PATTERNS = {
|
|
12
|
-
|
|
13
|
-
keywords: [
|
|
14
|
-
|
|
12
|
+
file_operation: {
|
|
13
|
+
keywords: [
|
|
14
|
+
'读取文件',
|
|
15
|
+
'写文件',
|
|
16
|
+
'创建文件',
|
|
17
|
+
'删除文件',
|
|
18
|
+
'修改文件',
|
|
19
|
+
'查看文件',
|
|
20
|
+
'read',
|
|
21
|
+
'write',
|
|
22
|
+
'create',
|
|
23
|
+
'delete',
|
|
24
|
+
'modify',
|
|
25
|
+
'file',
|
|
26
|
+
'文件',
|
|
27
|
+
],
|
|
28
|
+
tools: [
|
|
29
|
+
'read_file',
|
|
30
|
+
'write_file',
|
|
31
|
+
'delete_file',
|
|
32
|
+
'modify_file',
|
|
33
|
+
'read_directory',
|
|
34
|
+
'create_directory',
|
|
35
|
+
'search_file',
|
|
36
|
+
],
|
|
15
37
|
},
|
|
16
|
-
|
|
17
|
-
keywords: [
|
|
18
|
-
|
|
38
|
+
code_development: {
|
|
39
|
+
keywords: [
|
|
40
|
+
'写代码',
|
|
41
|
+
'开发',
|
|
42
|
+
'编程',
|
|
43
|
+
'创建插件',
|
|
44
|
+
'编写函数',
|
|
45
|
+
'code',
|
|
46
|
+
'develop',
|
|
47
|
+
'plugin',
|
|
48
|
+
'编程',
|
|
49
|
+
],
|
|
50
|
+
tools: ['loadSkill', 'read_file', 'write_file', 'execute_command', 'shell'],
|
|
19
51
|
},
|
|
20
|
-
|
|
21
|
-
keywords: [
|
|
22
|
-
|
|
52
|
+
system_info: {
|
|
53
|
+
keywords: [
|
|
54
|
+
'系统信息',
|
|
55
|
+
'内存',
|
|
56
|
+
'CPU',
|
|
57
|
+
'磁盘',
|
|
58
|
+
'进程',
|
|
59
|
+
'system',
|
|
60
|
+
'memory',
|
|
61
|
+
'cpu',
|
|
62
|
+
'disk',
|
|
63
|
+
'process',
|
|
64
|
+
'info',
|
|
65
|
+
],
|
|
66
|
+
tools: [
|
|
67
|
+
'get_system_info',
|
|
68
|
+
'get_memory_usage',
|
|
69
|
+
'get_cpu_info',
|
|
70
|
+
'get_disk_space',
|
|
71
|
+
'get_process_info',
|
|
72
|
+
],
|
|
23
73
|
},
|
|
24
|
-
|
|
74
|
+
data_analysis: {
|
|
25
75
|
keywords: ['分析', '数据', '统计', '查询', 'analyze', 'data', 'statistics', 'query'],
|
|
26
|
-
tools: ['execute_command', 'python', 'search_file']
|
|
76
|
+
tools: ['execute_command', 'python', 'search_file'],
|
|
27
77
|
},
|
|
28
|
-
|
|
78
|
+
plugin_management: {
|
|
29
79
|
keywords: ['插件', '重载', '加载插件', 'plugin', 'reload', 'load plugin'],
|
|
30
|
-
tools: ['reload_plugins', 'list_plugins', 'loadSkill']
|
|
80
|
+
tools: ['reload_plugins', 'list_plugins', 'loadSkill'],
|
|
31
81
|
},
|
|
32
|
-
|
|
82
|
+
shell_command: {
|
|
33
83
|
keywords: ['命令', '终端', 'shell', '执行', 'command', 'terminal', 'bash', 'cmd'],
|
|
34
|
-
tools: ['shell', 'powershell', 'execute_command']
|
|
84
|
+
tools: ['shell', 'powershell', 'execute_command'],
|
|
35
85
|
},
|
|
36
|
-
|
|
86
|
+
skill_usage: {
|
|
37
87
|
keywords: ['技能', 'skill', '使用技能', '加载技能'],
|
|
38
|
-
tools: ['loadSkill']
|
|
88
|
+
tools: ['loadSkill'],
|
|
39
89
|
},
|
|
40
|
-
|
|
41
|
-
keywords: [
|
|
42
|
-
|
|
90
|
+
scheduling: {
|
|
91
|
+
keywords: [
|
|
92
|
+
'定时',
|
|
93
|
+
'提醒',
|
|
94
|
+
'通知',
|
|
95
|
+
'schedule',
|
|
96
|
+
'remind',
|
|
97
|
+
'notify',
|
|
98
|
+
'cron',
|
|
99
|
+
'任务',
|
|
100
|
+
'稍后',
|
|
101
|
+
'天后',
|
|
102
|
+
'秒后',
|
|
103
|
+
'分钟后',
|
|
104
|
+
'小时后',
|
|
105
|
+
'明天',
|
|
106
|
+
'今天',
|
|
107
|
+
],
|
|
108
|
+
tools: [
|
|
109
|
+
'schedule_cron',
|
|
110
|
+
'schedule_once',
|
|
111
|
+
'schedule_list',
|
|
112
|
+
'schedule_cancel',
|
|
113
|
+
'schedule_get_results',
|
|
114
|
+
'schedule_notify',
|
|
115
|
+
],
|
|
43
116
|
},
|
|
44
|
-
|
|
45
|
-
keywords: [
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
117
|
+
thinking: {
|
|
118
|
+
keywords: [
|
|
119
|
+
'思考',
|
|
120
|
+
'反思',
|
|
121
|
+
'想想',
|
|
122
|
+
'think',
|
|
123
|
+
'reflect',
|
|
124
|
+
'分析一下',
|
|
125
|
+
'头脑风暴',
|
|
126
|
+
'持续思考',
|
|
127
|
+
'自动思考',
|
|
128
|
+
],
|
|
129
|
+
tools: ['think_now', 'think_continue', 'think_stop', 'think_get_thoughts'],
|
|
130
|
+
},
|
|
131
|
+
};
|
|
49
132
|
|
|
50
133
|
class ToolRouter extends EventEmitter {
|
|
51
134
|
constructor(tools = []) {
|
|
52
|
-
super()
|
|
53
|
-
this._tools = new Map()
|
|
54
|
-
this._defaultTools = new Set()
|
|
135
|
+
super();
|
|
136
|
+
this._tools = new Map();
|
|
137
|
+
this._defaultTools = new Set();
|
|
55
138
|
|
|
56
139
|
// 注册工具
|
|
57
140
|
for (const tool of tools) {
|
|
58
|
-
this.register(tool)
|
|
141
|
+
this.register(tool);
|
|
59
142
|
}
|
|
60
143
|
}
|
|
61
144
|
|
|
@@ -63,37 +146,37 @@ class ToolRouter extends EventEmitter {
|
|
|
63
146
|
* 注册工具
|
|
64
147
|
*/
|
|
65
148
|
register(tool) {
|
|
66
|
-
this._tools.set(tool.name, tool)
|
|
149
|
+
this._tools.set(tool.name, tool);
|
|
67
150
|
}
|
|
68
151
|
|
|
69
152
|
/**
|
|
70
153
|
* 设置默认工具(每个请求都会包含)
|
|
71
154
|
*/
|
|
72
155
|
setDefaultTools(toolNames) {
|
|
73
|
-
this._defaultTools = new Set(toolNames)
|
|
156
|
+
this._defaultTools = new Set(toolNames);
|
|
74
157
|
}
|
|
75
158
|
|
|
76
159
|
/**
|
|
77
160
|
* 判断是否为默认工具
|
|
78
161
|
*/
|
|
79
162
|
isDefaultTool(name) {
|
|
80
|
-
return this._defaultTools.has(name)
|
|
163
|
+
return this._defaultTools.has(name);
|
|
81
164
|
}
|
|
82
165
|
|
|
83
166
|
/**
|
|
84
167
|
* 分析用户输入,识别意图
|
|
85
168
|
*/
|
|
86
169
|
analyzeIntent(userMessage) {
|
|
87
|
-
const message = userMessage.toLowerCase()
|
|
170
|
+
const message = userMessage.toLowerCase();
|
|
88
171
|
|
|
89
|
-
const matchedIntents = []
|
|
172
|
+
const matchedIntents = [];
|
|
90
173
|
|
|
91
174
|
for (const [intentName, intentConfig] of Object.entries(INTENT_PATTERNS)) {
|
|
92
|
-
let score = 0
|
|
175
|
+
let score = 0;
|
|
93
176
|
|
|
94
177
|
for (const keyword of intentConfig.keywords) {
|
|
95
178
|
if (message.includes(keyword.toLowerCase())) {
|
|
96
|
-
score
|
|
179
|
+
score++;
|
|
97
180
|
}
|
|
98
181
|
}
|
|
99
182
|
|
|
@@ -101,31 +184,31 @@ class ToolRouter extends EventEmitter {
|
|
|
101
184
|
matchedIntents.push({
|
|
102
185
|
name: intentName,
|
|
103
186
|
score,
|
|
104
|
-
tools: intentConfig.tools
|
|
105
|
-
})
|
|
187
|
+
tools: intentConfig.tools,
|
|
188
|
+
});
|
|
106
189
|
}
|
|
107
190
|
}
|
|
108
191
|
|
|
109
192
|
// 按分数排序
|
|
110
|
-
matchedIntents.sort((a, b) => b.score - a.score)
|
|
193
|
+
matchedIntents.sort((a, b) => b.score - a.score);
|
|
111
194
|
|
|
112
|
-
return matchedIntents
|
|
195
|
+
return matchedIntents;
|
|
113
196
|
}
|
|
114
197
|
|
|
115
198
|
/**
|
|
116
199
|
* 获取指定意图对应的工具
|
|
117
200
|
*/
|
|
118
201
|
getToolsForIntent(intent) {
|
|
119
|
-
const result = []
|
|
202
|
+
const result = [];
|
|
120
203
|
|
|
121
204
|
for (const toolName of intent.tools) {
|
|
122
|
-
const tool = this._tools.get(toolName)
|
|
205
|
+
const tool = this._tools.get(toolName);
|
|
123
206
|
if (tool) {
|
|
124
|
-
result.push(tool)
|
|
207
|
+
result.push(tool);
|
|
125
208
|
}
|
|
126
209
|
}
|
|
127
210
|
|
|
128
|
-
return result
|
|
211
|
+
return result;
|
|
129
212
|
}
|
|
130
213
|
|
|
131
214
|
/**
|
|
@@ -136,81 +219,79 @@ class ToolRouter extends EventEmitter {
|
|
|
136
219
|
* @param {boolean} options.forceIntent - 强制使用指定意图
|
|
137
220
|
*/
|
|
138
221
|
selectTools(userMessage, options = {}) {
|
|
139
|
-
const { maxTools = 10 } = options
|
|
222
|
+
const { maxTools = 10 } = options;
|
|
140
223
|
|
|
141
224
|
// 如果没有工具,直接返回空的
|
|
142
225
|
if (this._tools.size === 0) {
|
|
143
|
-
return []
|
|
226
|
+
return [];
|
|
144
227
|
}
|
|
145
228
|
|
|
146
229
|
// 如果消息为空,返回默认工具
|
|
147
230
|
if (!userMessage || userMessage.trim() === '') {
|
|
148
|
-
return this.getDefaultTools()
|
|
231
|
+
return this.getDefaultTools();
|
|
149
232
|
}
|
|
150
233
|
|
|
151
234
|
// 分析意图
|
|
152
|
-
const intents = this.analyzeIntent(userMessage)
|
|
235
|
+
const intents = this.analyzeIntent(userMessage);
|
|
153
236
|
|
|
154
237
|
// 如果没有匹配到意图,返回默认工具
|
|
155
238
|
if (intents.length === 0) {
|
|
156
|
-
return this.getDefaultTools()
|
|
239
|
+
return this.getDefaultTools();
|
|
157
240
|
}
|
|
158
241
|
|
|
159
|
-
const selectedTools = new Map()
|
|
242
|
+
const selectedTools = new Map();
|
|
160
243
|
|
|
161
244
|
// 添加默认工具
|
|
162
245
|
for (const tool of this.getDefaultTools()) {
|
|
163
|
-
selectedTools.set(tool.name, tool)
|
|
246
|
+
selectedTools.set(tool.name, tool);
|
|
164
247
|
}
|
|
165
248
|
|
|
166
249
|
// 按意图选择工具
|
|
167
250
|
for (const intent of intents) {
|
|
168
|
-
if (selectedTools.size >= maxTools) break
|
|
251
|
+
if (selectedTools.size >= maxTools) break;
|
|
169
252
|
|
|
170
|
-
const intentTools = this.getToolsForIntent(intent)
|
|
253
|
+
const intentTools = this.getToolsForIntent(intent);
|
|
171
254
|
for (const tool of intentTools) {
|
|
172
|
-
if (selectedTools.size >= maxTools) break
|
|
255
|
+
if (selectedTools.size >= maxTools) break;
|
|
173
256
|
if (!selectedTools.has(tool.name)) {
|
|
174
|
-
selectedTools.set(tool.name, tool)
|
|
257
|
+
selectedTools.set(tool.name, tool);
|
|
175
258
|
}
|
|
176
259
|
}
|
|
177
260
|
}
|
|
178
261
|
|
|
179
|
-
return Array.from(selectedTools.values())
|
|
262
|
+
return Array.from(selectedTools.values());
|
|
180
263
|
}
|
|
181
264
|
|
|
182
265
|
/**
|
|
183
266
|
* 获取默认工具
|
|
184
267
|
*/
|
|
185
268
|
getDefaultTools() {
|
|
186
|
-
const result = []
|
|
269
|
+
const result = [];
|
|
187
270
|
for (const name of this._defaultTools) {
|
|
188
|
-
const tool = this._tools.get(name)
|
|
271
|
+
const tool = this._tools.get(name);
|
|
189
272
|
if (tool) {
|
|
190
|
-
result.push(tool)
|
|
273
|
+
result.push(tool);
|
|
191
274
|
}
|
|
192
275
|
}
|
|
193
|
-
return result
|
|
276
|
+
return result;
|
|
194
277
|
}
|
|
195
278
|
|
|
196
279
|
/**
|
|
197
280
|
* 获取所有工具
|
|
198
281
|
*/
|
|
199
282
|
getAllTools() {
|
|
200
|
-
return Array.from(this._tools.values())
|
|
283
|
+
return Array.from(this._tools.values());
|
|
201
284
|
}
|
|
202
285
|
|
|
203
286
|
/**
|
|
204
287
|
* 按类别获取工具
|
|
205
288
|
*/
|
|
206
289
|
getToolsByCategory(category) {
|
|
207
|
-
const intent = INTENT_PATTERNS[category]
|
|
208
|
-
if (!intent) return []
|
|
290
|
+
const intent = INTENT_PATTERNS[category];
|
|
291
|
+
if (!intent) return [];
|
|
209
292
|
|
|
210
|
-
return intent.tools
|
|
211
|
-
.map(name => this._tools.get(name))
|
|
212
|
-
.filter(t => t !== undefined)
|
|
293
|
+
return intent.tools.map((name) => this._tools.get(name)).filter((t) => t !== undefined);
|
|
213
294
|
}
|
|
214
295
|
}
|
|
215
296
|
|
|
216
|
-
module.exports = { ToolRouter, INTENT_PATTERNS }
|
|
297
|
+
module.exports = { ToolRouter, INTENT_PATTERNS };
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Executor 基类
|
|
3
|
-
* 执行器的基类,定义执行器接口
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const { EventEmitter } = require('../utils/event-emitter')
|
|
7
|
-
|
|
8
|
-
class ExecutorBase extends EventEmitter {
|
|
9
|
-
/**
|
|
10
|
-
* @param {string} name - 执行器名称
|
|
11
|
-
*/
|
|
12
|
-
constructor(name) {
|
|
13
|
-
super()
|
|
14
|
-
this.name = name
|
|
15
|
-
this._enabled = true
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* 执行
|
|
20
|
-
* @param {Object} params - 执行参数
|
|
21
|
-
* @returns {Promise<any>}
|
|
22
|
-
*/
|
|
23
|
-
async execute(params) {
|
|
24
|
-
throw new Error('execute() must be implemented')
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* 启用执行器
|
|
29
|
-
*/
|
|
30
|
-
enable() {
|
|
31
|
-
this._enabled = true
|
|
32
|
-
return this
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* 禁用执行器
|
|
37
|
-
*/
|
|
38
|
-
disable() {
|
|
39
|
-
this._enabled = false
|
|
40
|
-
return this
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* 是否启用
|
|
45
|
-
*/
|
|
46
|
-
isEnabled() {
|
|
47
|
-
return this._enabled
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* 销毁
|
|
52
|
-
*/
|
|
53
|
-
destroy() {
|
|
54
|
-
this.removeAllListeners()
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
module.exports = { ExecutorBase }
|
|
1
|
+
/**
|
|
2
|
+
* Executor 基类
|
|
3
|
+
* 执行器的基类,定义执行器接口
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { EventEmitter } = require('../utils/event-emitter');
|
|
7
|
+
|
|
8
|
+
class ExecutorBase extends EventEmitter {
|
|
9
|
+
/**
|
|
10
|
+
* @param {string} name - 执行器名称
|
|
11
|
+
*/
|
|
12
|
+
constructor(name) {
|
|
13
|
+
super();
|
|
14
|
+
this.name = name;
|
|
15
|
+
this._enabled = true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 执行
|
|
20
|
+
* @param {Object} params - 执行参数
|
|
21
|
+
* @returns {Promise<any>}
|
|
22
|
+
*/
|
|
23
|
+
async execute(params) {
|
|
24
|
+
throw new Error('execute() must be implemented');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 启用执行器
|
|
29
|
+
*/
|
|
30
|
+
enable() {
|
|
31
|
+
this._enabled = true;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 禁用执行器
|
|
37
|
+
*/
|
|
38
|
+
disable() {
|
|
39
|
+
this._enabled = false;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 是否启用
|
|
45
|
+
*/
|
|
46
|
+
isEnabled() {
|
|
47
|
+
return this._enabled;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 销毁
|
|
52
|
+
*/
|
|
53
|
+
destroy() {
|
|
54
|
+
this.removeAllListeners();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = { ExecutorBase };
|