foliko 1.0.74 → 1.0.76
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 +11 -1
- 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 +11 -11
- package/cli/src/commands/chat.js +143 -141
- package/cli/src/commands/list.js +93 -90
- package/cli/src/index.js +75 -75
- package/cli/src/ui/chat-ui.js +201 -199
- package/cli/src/utils/ansi.js +40 -40
- package/cli/src/utils/markdown.js +292 -296
- 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 +194 -196
- package/examples/basic.js +50 -45
- package/examples/bootstrap.js +121 -112
- package/examples/mcp-example.js +19 -16
- package/examples/skill-example.js +20 -20
- package/examples/test-chat.js +137 -135
- package/examples/test-mcp.js +85 -79
- package/examples/test-reload.js +59 -61
- package/examples/test-telegram.js +50 -50
- package/examples/test-tg-bot.js +45 -42
- package/examples/test-tg-simple.js +47 -46
- package/examples/test-tg.js +62 -62
- package/examples/test-think.js +43 -37
- package/examples/test-web-plugin.js +103 -98
- package/examples/test-weixin-feishu.js +103 -100
- package/examples/workflow.js +158 -158
- package/package.json +37 -3
- package/plugins/ai-plugin.js +102 -100
- 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/audit-plugin.js +187 -187
- package/plugins/default-plugins.js +662 -649
- 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 +481 -477
- package/plugins/file-system-plugin.js +826 -476
- package/plugins/install-plugin.js +199 -197
- package/plugins/python-executor-plugin.js +367 -365
- package/plugins/python-plugin-loader.js +481 -479
- package/plugins/rules-plugin.js +294 -292
- package/plugins/scheduler-plugin.js +691 -689
- package/plugins/session-plugin.js +369 -367
- package/plugins/shell-executor-plugin.js +197 -197
- package/plugins/storage-plugin.js +240 -238
- package/plugins/subagent-plugin.js +845 -785
- package/plugins/telegram-plugin.js +482 -475
- package/plugins/think-plugin.js +345 -343
- package/plugins/tools-plugin.js +196 -194
- package/plugins/web-plugin.js +606 -604
- package/plugins/weixin-plugin.js +545 -538
- 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 +11 -11
- package/src/capabilities/skill-manager.js +609 -595
- package/src/capabilities/workflow-engine.js +1109 -1195
- package/src/core/agent-chat.js +882 -735
- package/src/core/agent.js +892 -688
- package/src/core/framework.js +465 -431
- package/src/core/index.js +19 -19
- package/src/core/plugin-base.js +219 -219
- package/src/core/plugin-manager.js +863 -767
- package/src/core/provider.js +114 -111
- package/src/core/sub-agent-config.js +264 -0
- package/src/core/system-prompt-builder.js +120 -0
- package/src/core/tool-registry.js +517 -134
- package/src/core/tool-router.js +297 -216
- package/src/executors/executor-base.js +12 -12
- package/src/executors/mcp-executor.js +741 -729
- package/src/index.js +25 -37
- 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 +97 -97
- 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 +136 -133
- package/website/styles.css +1 -1
- package/plugins/ambient-agent-plugin.js +0 -1565
- package/plugins/email.js +0 -1142
package/cli/src/commands/chat.js
CHANGED
|
@@ -1,141 +1,143 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chat 命令实现
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
const path = require('path')
|
|
6
|
-
const dotenv = require('dotenv')
|
|
7
|
-
const { Framework } = require('../../../src')
|
|
8
|
-
const { ChatUI } = require('../ui/chat-ui')
|
|
9
|
-
|
|
10
|
-
// 加载 .env 文件
|
|
11
|
-
dotenv.config()
|
|
12
|
-
|
|
13
|
-
// 默认配置
|
|
14
|
-
const DEFAULT_CONFIG = {
|
|
15
|
-
model: 'MiniMax-M2.7',
|
|
16
|
-
provider: 'minimax',
|
|
17
|
-
baseURL: 'https://api.minimaxi.com/v1',
|
|
18
|
-
apiKey: null
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Provider 默认配置
|
|
22
|
-
const PROVIDER_DEFAULTS = {
|
|
23
|
-
minimax: {
|
|
24
|
-
model: 'MiniMax-M2.7',
|
|
25
|
-
baseURL: 'https://api.minimaxi.com/v1'
|
|
26
|
-
},
|
|
27
|
-
deepseek: {
|
|
28
|
-
model: 'deepseek-chat',
|
|
29
|
-
baseURL: 'https://api.deepseek.com/v1'
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* 获取环境变量配置
|
|
35
|
-
*/
|
|
36
|
-
function getEnvConfig() {
|
|
37
|
-
const provider = process.env.FOLIKO_PROVIDER || DEFAULT_CONFIG.provider
|
|
38
|
-
const providerDefaults = PROVIDER_DEFAULTS[provider] || PROVIDER_DEFAULTS.minimax
|
|
39
|
-
|
|
40
|
-
// 支持多种 API key 环境变量名
|
|
41
|
-
let apiKey = process.env.FOLIKO_API_KEY || null
|
|
42
|
-
if (!apiKey) {
|
|
43
|
-
// 根据 provider 查找对应的 API key
|
|
44
|
-
const upperProvider = provider.toUpperCase().replace(/-/g, '_')
|
|
45
|
-
apiKey = process.env[`${upperProvider}_API_KEY`] || null
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return {
|
|
49
|
-
model: process.env.FOLIKO_MODEL || providerDefaults.model,
|
|
50
|
-
provider: provider,
|
|
51
|
-
baseURL: process.env.FOLIKO_BASE_URL || providerDefaults.baseURL,
|
|
52
|
-
apiKey: apiKey
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 解析命令行参数(命令行参数优先于环境变量)
|
|
58
|
-
*/
|
|
59
|
-
function parseArgs(args) {
|
|
60
|
-
// 先获取环境变量配置(作为默认值)
|
|
61
|
-
const envConfig = getEnvConfig()
|
|
62
|
-
const options = { ...envConfig }
|
|
63
|
-
|
|
64
|
-
for (let i = 0; i < args.length; i++) {
|
|
65
|
-
const arg = args[i]
|
|
66
|
-
if (arg === '--model' && args[i + 1]) {
|
|
67
|
-
options.model = args[++i]
|
|
68
|
-
} else if (arg === '--provider' && args[i + 1]) {
|
|
69
|
-
options.provider = args[++i]
|
|
70
|
-
} else if (arg === '--base-url' && args[i + 1]) {
|
|
71
|
-
options.baseURL = args[++i]
|
|
72
|
-
} else if (arg === '--api-key' && args[i + 1]) {
|
|
73
|
-
options.apiKey = args[++i]
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return options
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Chat 命令入口
|
|
82
|
-
*/
|
|
83
|
-
async function chatCommand(args) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
console.log('
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
console.log(
|
|
133
|
-
|
|
134
|
-
console.log(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Chat 命令实现
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const dotenv = require('dotenv');
|
|
7
|
+
const { Framework } = require('../../../src');
|
|
8
|
+
const { ChatUI } = require('../ui/chat-ui');
|
|
9
|
+
|
|
10
|
+
// 加载 .env 文件
|
|
11
|
+
dotenv.config();
|
|
12
|
+
|
|
13
|
+
// 默认配置
|
|
14
|
+
const DEFAULT_CONFIG = {
|
|
15
|
+
model: 'MiniMax-M2.7',
|
|
16
|
+
provider: 'minimax',
|
|
17
|
+
baseURL: 'https://api.minimaxi.com/v1',
|
|
18
|
+
apiKey: null,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// Provider 默认配置
|
|
22
|
+
const PROVIDER_DEFAULTS = {
|
|
23
|
+
minimax: {
|
|
24
|
+
model: 'MiniMax-M2.7',
|
|
25
|
+
baseURL: 'https://api.minimaxi.com/v1',
|
|
26
|
+
},
|
|
27
|
+
deepseek: {
|
|
28
|
+
model: 'deepseek-chat',
|
|
29
|
+
baseURL: 'https://api.deepseek.com/v1',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 获取环境变量配置
|
|
35
|
+
*/
|
|
36
|
+
function getEnvConfig() {
|
|
37
|
+
const provider = process.env.FOLIKO_PROVIDER || DEFAULT_CONFIG.provider;
|
|
38
|
+
const providerDefaults = PROVIDER_DEFAULTS[provider] || PROVIDER_DEFAULTS.minimax;
|
|
39
|
+
|
|
40
|
+
// 支持多种 API key 环境变量名
|
|
41
|
+
let apiKey = process.env.FOLIKO_API_KEY || null;
|
|
42
|
+
if (!apiKey) {
|
|
43
|
+
// 根据 provider 查找对应的 API key
|
|
44
|
+
const upperProvider = provider.toUpperCase().replace(/-/g, '_');
|
|
45
|
+
apiKey = process.env[`${upperProvider}_API_KEY`] || null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
model: process.env.FOLIKO_MODEL || providerDefaults.model,
|
|
50
|
+
provider: provider,
|
|
51
|
+
baseURL: process.env.FOLIKO_BASE_URL || providerDefaults.baseURL,
|
|
52
|
+
apiKey: apiKey,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 解析命令行参数(命令行参数优先于环境变量)
|
|
58
|
+
*/
|
|
59
|
+
function parseArgs(args) {
|
|
60
|
+
// 先获取环境变量配置(作为默认值)
|
|
61
|
+
const envConfig = getEnvConfig();
|
|
62
|
+
const options = { ...envConfig };
|
|
63
|
+
|
|
64
|
+
for (let i = 0; i < args.length; i++) {
|
|
65
|
+
const arg = args[i];
|
|
66
|
+
if (arg === '--model' && args[i + 1]) {
|
|
67
|
+
options.model = args[++i];
|
|
68
|
+
} else if (arg === '--provider' && args[i + 1]) {
|
|
69
|
+
options.provider = args[++i];
|
|
70
|
+
} else if (arg === '--base-url' && args[i + 1]) {
|
|
71
|
+
options.baseURL = args[++i];
|
|
72
|
+
} else if (arg === '--api-key' && args[i + 1]) {
|
|
73
|
+
options.apiKey = args[++i];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return options;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Chat 命令入口
|
|
82
|
+
*/
|
|
83
|
+
async function chatCommand(args) {
|
|
84
|
+
const options = parseArgs(args);
|
|
85
|
+
console.log('=== Foliko 持续对话 ===\n');
|
|
86
|
+
console.log('输入 exit 或 quit 退出\n');
|
|
87
|
+
// 初始化框架
|
|
88
|
+
const framework = new Framework({ debug: false });
|
|
89
|
+
await framework.bootstrap({
|
|
90
|
+
agentDir: process.cwd() + '/.agent',
|
|
91
|
+
aiConfig: {
|
|
92
|
+
provider: options.provider,
|
|
93
|
+
model: options.model,
|
|
94
|
+
baseURL: options.baseURL,
|
|
95
|
+
apiKey: options.apiKey,
|
|
96
|
+
providerOptions: {
|
|
97
|
+
maxOutputTokens: 8192,
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// 创建 Agent
|
|
103
|
+
const agent = framework.createAgent({
|
|
104
|
+
name: 'FolikoAgent',
|
|
105
|
+
systemPrompt: `你是一个有帮助的助手,擅长回答问题和执行任务。
|
|
106
|
+
**重要:** 子Agent 匹配规则必须遵守:
|
|
107
|
+
- 根据【子 Agent 匹配表】,将任务委托给最匹配的子Agent处理
|
|
108
|
+
- 使用 subagent_call 工具并指定 agentName 来委托任务
|
|
109
|
+
- 只有当没有匹配的子Agent时,才直接调用工具
|
|
110
|
+
**命令执行规范:**
|
|
111
|
+
- 执行 npx skills add / npx skills remove / npx skills list 命令时,必须自动添加参数:-a openclaw -y
|
|
112
|
+
- 禁止添加 -g 参数
|
|
113
|
+
- 例如:npx skills add xxx 应该执行为 npx skills add xxx -a openclaw -y`,
|
|
114
|
+
sharedPrompt: `工作目录: {{WORK_DIR}}`,
|
|
115
|
+
metadata: {
|
|
116
|
+
WORK_DIR: process.cwd(), // 覆盖内置的 WORK_DIR
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// 初始化 UI
|
|
121
|
+
const ui = new ChatUI(agent);
|
|
122
|
+
|
|
123
|
+
// 监听通知事件,在 CLI 中显示
|
|
124
|
+
// 显示当前会话的通知,以及没有指定 sessionId 的广播通知
|
|
125
|
+
framework.on('notification', (data) => {
|
|
126
|
+
const { title, message, source, timestamp, sessionId } = data;
|
|
127
|
+
// 如果通知指定了 sessionId 且不匹配 CLI 会话,跳过
|
|
128
|
+
if (sessionId && sessionId !== ui.sessionId) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const time = timestamp ? new Date(timestamp).toLocaleTimeString('zh-CN') : '';
|
|
132
|
+
console.log('\n' + '='.repeat(50));
|
|
133
|
+
console.log(`🔔 [${source}] ${title}`);
|
|
134
|
+
console.log(message);
|
|
135
|
+
if (time) console.log(`时间: ${time}`);
|
|
136
|
+
console.log('='.repeat(50) + '\n');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// 启动聊天
|
|
140
|
+
ui.start();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
module.exports = { chatCommand };
|
package/cli/src/commands/list.js
CHANGED
|
@@ -1,90 +1,93 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* List 命令实现
|
|
3
|
-
* 列出所有子Agent配置
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const fs = require('fs')
|
|
7
|
-
const path = require('path')
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* 列出 .agent/agents 目录下的所有 Agent 配置
|
|
11
|
-
*/
|
|
12
|
-
async function listCommand() {
|
|
13
|
-
const agentsDir = path.resolve(process.cwd(), '.agent', 'agents')
|
|
14
|
-
|
|
15
|
-
if (!fs.existsSync(agentsDir)) {
|
|
16
|
-
console.log('No .agent/agents directory found.')
|
|
17
|
-
console.log('Create agents by adding files to: .agent/agents/')
|
|
18
|
-
return
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const entries = fs.readdirSync(agentsDir, { withFileTypes: true })
|
|
22
|
-
const agents = []
|
|
23
|
-
|
|
24
|
-
for (const entry of entries) {
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
1
|
+
/**
|
|
2
|
+
* List 命令实现
|
|
3
|
+
* 列出所有子Agent配置
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 列出 .agent/agents 目录下的所有 Agent 配置
|
|
11
|
+
*/
|
|
12
|
+
async function listCommand() {
|
|
13
|
+
const agentsDir = path.resolve(process.cwd(), '.agent', 'agents');
|
|
14
|
+
|
|
15
|
+
if (!fs.existsSync(agentsDir)) {
|
|
16
|
+
console.log('No .agent/agents directory found.');
|
|
17
|
+
console.log('Create agents by adding files to: .agent/agents/');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const entries = fs.readdirSync(agentsDir, { withFileTypes: true });
|
|
22
|
+
const agents = [];
|
|
23
|
+
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
if (
|
|
26
|
+
entry.isFile() &&
|
|
27
|
+
(entry.name.endsWith('.js') || entry.name.endsWith('.json') || entry.name.endsWith('.md'))
|
|
28
|
+
) {
|
|
29
|
+
const baseName = entry.name.replace(/\.(js|json|md)$/, '');
|
|
30
|
+
const filePath = path.join(agentsDir, entry.name);
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
let config = { name: baseName };
|
|
34
|
+
|
|
35
|
+
if (entry.name.endsWith('.json')) {
|
|
36
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
37
|
+
config = { ...config, ...JSON.parse(content) };
|
|
38
|
+
} else if (entry.name.endsWith('.md')) {
|
|
39
|
+
// 尝试从 markdown 中提取配置
|
|
40
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
41
|
+
const jsonMatch = content.match(/```json\n([\s\S]*?)\n```/);
|
|
42
|
+
if (jsonMatch) {
|
|
43
|
+
config = { ...config, ...JSON.parse(jsonMatch[1]) };
|
|
44
|
+
}
|
|
45
|
+
// 提取 name 行
|
|
46
|
+
const nameMatch = content.match(/^name:\s*(.+)$/m);
|
|
47
|
+
if (nameMatch) {
|
|
48
|
+
config.name = nameMatch[1].trim();
|
|
49
|
+
}
|
|
50
|
+
} else {
|
|
51
|
+
// .js 文件,尝试加载
|
|
52
|
+
delete require.cache[require.resolve(filePath)];
|
|
53
|
+
const mod = require(filePath);
|
|
54
|
+
config = typeof mod === 'function' ? mod() : mod;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
agents.push({
|
|
58
|
+
name: config.name || baseName,
|
|
59
|
+
role: config.role || '-',
|
|
60
|
+
description: config.description || '-',
|
|
61
|
+
file: entry.name,
|
|
62
|
+
});
|
|
63
|
+
} catch (err) {
|
|
64
|
+
agents.push({
|
|
65
|
+
name: baseName,
|
|
66
|
+
role: '-',
|
|
67
|
+
description: `Error loading: ${err.message}`,
|
|
68
|
+
file: entry.name,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (agents.length === 0) {
|
|
75
|
+
console.log('No agents found in .agent/agents/');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
console.log(`\nFound ${agents.length} agent(s) in .agent/agents/:\n`);
|
|
80
|
+
console.log('Name Role Description');
|
|
81
|
+
console.log('---------------- ------------------ ------------------------------------------');
|
|
82
|
+
|
|
83
|
+
for (const agent of agents) {
|
|
84
|
+
const name = (agent.name || '').padEnd(16).slice(0, 16);
|
|
85
|
+
const role = (agent.role || '-').padEnd(18).slice(0, 18);
|
|
86
|
+
const desc = (agent.description || '-').slice(0, 40);
|
|
87
|
+
console.log(`${name} ${role} ${desc}`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
console.log('');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
module.exports = { listCommand };
|
package/cli/src/index.js
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Foliko CLI 主逻辑
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
const { chatCommand } = require('./commands/chat')
|
|
6
|
-
const { listCommand } = require('./commands/list')
|
|
7
|
-
const fs = require('fs');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
/**
|
|
10
|
-
* CLI 主入口
|
|
11
|
-
*/
|
|
12
|
-
async function cli() {
|
|
13
|
-
const args = process.argv.slice(2)
|
|
14
|
-
const command = args[0] || 'chat'
|
|
15
|
-
const packageJsonPath = path.join(__dirname, '../../package.json');
|
|
16
|
-
|
|
17
|
-
switch (command) {
|
|
18
|
-
case 'chat':
|
|
19
|
-
await chatCommand(args.slice(1))
|
|
20
|
-
break
|
|
21
|
-
|
|
22
|
-
case 'list':
|
|
23
|
-
case 'ls':
|
|
24
|
-
await listCommand()
|
|
25
|
-
break
|
|
26
|
-
|
|
27
|
-
case 'help':
|
|
28
|
-
case '--help':
|
|
29
|
-
case '-h':
|
|
30
|
-
printHelp()
|
|
31
|
-
break
|
|
32
|
-
|
|
33
|
-
case 'version':
|
|
34
|
-
case '--version':
|
|
35
|
-
case '-v':
|
|
36
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
37
|
-
console.log(`${packageJson.name} v${packageJson.version}`)
|
|
38
|
-
break
|
|
39
|
-
|
|
40
|
-
default:
|
|
41
|
-
console.error(`Unknown command: ${command}`)
|
|
42
|
-
console.error('Run "foliko help" for usage information')
|
|
43
|
-
process.exit(1)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* 打印帮助信息
|
|
49
|
-
*/
|
|
50
|
-
function printHelp() {
|
|
51
|
-
console.log(`
|
|
52
|
-
Foliko CLI - Agent 框架的命令行工具
|
|
53
|
-
|
|
54
|
-
Usage: foliko <command> [options]
|
|
55
|
-
|
|
56
|
-
Commands:
|
|
57
|
-
chat 启动持续对话聊天
|
|
58
|
-
list 列出所有子Agent配置
|
|
59
|
-
help 显示帮助信息
|
|
60
|
-
version 显示版本号
|
|
61
|
-
|
|
62
|
-
Chat Options:
|
|
63
|
-
--model <name> 指定 AI 模型
|
|
64
|
-
--provider <name> 指定 AI 提供商
|
|
65
|
-
--base-url <url> 指定 API 基础地址
|
|
66
|
-
|
|
67
|
-
Examples:
|
|
68
|
-
foliko chat
|
|
69
|
-
foliko chat --model MiniMax-M2.7
|
|
70
|
-
foliko chat --provider minimax --base-url https://api.minimaxi.com/v1
|
|
71
|
-
foliko list
|
|
72
|
-
`)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
module.exports = { cli }
|
|
1
|
+
/**
|
|
2
|
+
* Foliko CLI 主逻辑
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const { chatCommand } = require('./commands/chat');
|
|
6
|
+
const { listCommand } = require('./commands/list');
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
/**
|
|
10
|
+
* CLI 主入口
|
|
11
|
+
*/
|
|
12
|
+
async function cli() {
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
const command = args[0] || 'chat';
|
|
15
|
+
const packageJsonPath = path.join(__dirname, '../../package.json');
|
|
16
|
+
|
|
17
|
+
switch (command) {
|
|
18
|
+
case 'chat':
|
|
19
|
+
await chatCommand(args.slice(1));
|
|
20
|
+
break;
|
|
21
|
+
|
|
22
|
+
case 'list':
|
|
23
|
+
case 'ls':
|
|
24
|
+
await listCommand();
|
|
25
|
+
break;
|
|
26
|
+
|
|
27
|
+
case 'help':
|
|
28
|
+
case '--help':
|
|
29
|
+
case '-h':
|
|
30
|
+
printHelp();
|
|
31
|
+
break;
|
|
32
|
+
|
|
33
|
+
case 'version':
|
|
34
|
+
case '--version':
|
|
35
|
+
case '-v':
|
|
36
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
37
|
+
console.log(`${packageJson.name} v${packageJson.version}`);
|
|
38
|
+
break;
|
|
39
|
+
|
|
40
|
+
default:
|
|
41
|
+
console.error(`Unknown command: ${command}`);
|
|
42
|
+
console.error('Run "foliko help" for usage information');
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 打印帮助信息
|
|
49
|
+
*/
|
|
50
|
+
function printHelp() {
|
|
51
|
+
console.log(`
|
|
52
|
+
Foliko CLI - Agent 框架的命令行工具
|
|
53
|
+
|
|
54
|
+
Usage: foliko <command> [options]
|
|
55
|
+
|
|
56
|
+
Commands:
|
|
57
|
+
chat 启动持续对话聊天
|
|
58
|
+
list 列出所有子Agent配置
|
|
59
|
+
help 显示帮助信息
|
|
60
|
+
version 显示版本号
|
|
61
|
+
|
|
62
|
+
Chat Options:
|
|
63
|
+
--model <name> 指定 AI 模型
|
|
64
|
+
--provider <name> 指定 AI 提供商
|
|
65
|
+
--base-url <url> 指定 API 基础地址
|
|
66
|
+
|
|
67
|
+
Examples:
|
|
68
|
+
foliko chat
|
|
69
|
+
foliko chat --model MiniMax-M2.7
|
|
70
|
+
foliko chat --provider minimax --base-url https://api.minimaxi.com/v1
|
|
71
|
+
foliko list
|
|
72
|
+
`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
module.exports = { cli };
|