foliko 1.0.73 → 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 -636
- 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 +469 -120
- 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 -248
- 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/cli/bin/foliko.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* Foliko CLI 入口
|
|
4
4
|
* Usage: foliko <command> [options]
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
// 加载 dotenv
|
|
8
|
-
require('dotenv').config()
|
|
8
|
+
require('dotenv').config();
|
|
9
9
|
|
|
10
|
-
const { cli } = require('../src')
|
|
10
|
+
const { cli } = require('../src');
|
|
11
11
|
|
|
12
|
-
cli()
|
|
12
|
+
cli();
|
package/cli/src/commands/chat.js
CHANGED
|
@@ -2,55 +2,55 @@
|
|
|
2
2
|
* Chat 命令实现
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
const path = require('path')
|
|
6
|
-
const dotenv = require('dotenv')
|
|
7
|
-
const { Framework } = require('../../../src')
|
|
8
|
-
const { ChatUI } = require('../ui/chat-ui')
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const dotenv = require('dotenv');
|
|
7
|
+
const { Framework } = require('../../../src');
|
|
8
|
+
const { ChatUI } = require('../ui/chat-ui');
|
|
9
9
|
|
|
10
10
|
// 加载 .env 文件
|
|
11
|
-
dotenv.config()
|
|
11
|
+
dotenv.config();
|
|
12
12
|
|
|
13
13
|
// 默认配置
|
|
14
14
|
const DEFAULT_CONFIG = {
|
|
15
15
|
model: 'MiniMax-M2.7',
|
|
16
16
|
provider: 'minimax',
|
|
17
17
|
baseURL: 'https://api.minimaxi.com/v1',
|
|
18
|
-
apiKey: null
|
|
19
|
-
}
|
|
18
|
+
apiKey: null,
|
|
19
|
+
};
|
|
20
20
|
|
|
21
21
|
// Provider 默认配置
|
|
22
22
|
const PROVIDER_DEFAULTS = {
|
|
23
23
|
minimax: {
|
|
24
24
|
model: 'MiniMax-M2.7',
|
|
25
|
-
baseURL: 'https://api.minimaxi.com/v1'
|
|
25
|
+
baseURL: 'https://api.minimaxi.com/v1',
|
|
26
26
|
},
|
|
27
27
|
deepseek: {
|
|
28
28
|
model: 'deepseek-chat',
|
|
29
|
-
baseURL: 'https://api.deepseek.com/v1'
|
|
30
|
-
}
|
|
31
|
-
}
|
|
29
|
+
baseURL: 'https://api.deepseek.com/v1',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* 获取环境变量配置
|
|
35
35
|
*/
|
|
36
36
|
function getEnvConfig() {
|
|
37
|
-
const provider = process.env.FOLIKO_PROVIDER || DEFAULT_CONFIG.provider
|
|
38
|
-
const providerDefaults = PROVIDER_DEFAULTS[provider] || PROVIDER_DEFAULTS.minimax
|
|
37
|
+
const provider = process.env.FOLIKO_PROVIDER || DEFAULT_CONFIG.provider;
|
|
38
|
+
const providerDefaults = PROVIDER_DEFAULTS[provider] || PROVIDER_DEFAULTS.minimax;
|
|
39
39
|
|
|
40
40
|
// 支持多种 API key 环境变量名
|
|
41
|
-
let apiKey = process.env.FOLIKO_API_KEY || null
|
|
41
|
+
let apiKey = process.env.FOLIKO_API_KEY || null;
|
|
42
42
|
if (!apiKey) {
|
|
43
43
|
// 根据 provider 查找对应的 API key
|
|
44
|
-
const upperProvider = provider.toUpperCase().replace(/-/g, '_')
|
|
45
|
-
apiKey = process.env[`${upperProvider}_API_KEY`] || null
|
|
44
|
+
const upperProvider = provider.toUpperCase().replace(/-/g, '_');
|
|
45
|
+
apiKey = process.env[`${upperProvider}_API_KEY`] || null;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
return {
|
|
49
49
|
model: process.env.FOLIKO_MODEL || providerDefaults.model,
|
|
50
50
|
provider: provider,
|
|
51
51
|
baseURL: process.env.FOLIKO_BASE_URL || providerDefaults.baseURL,
|
|
52
|
-
apiKey: apiKey
|
|
53
|
-
}
|
|
52
|
+
apiKey: apiKey,
|
|
53
|
+
};
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/**
|
|
@@ -58,35 +58,34 @@ function getEnvConfig() {
|
|
|
58
58
|
*/
|
|
59
59
|
function parseArgs(args) {
|
|
60
60
|
// 先获取环境变量配置(作为默认值)
|
|
61
|
-
const envConfig = getEnvConfig()
|
|
62
|
-
const options = { ...envConfig }
|
|
61
|
+
const envConfig = getEnvConfig();
|
|
62
|
+
const options = { ...envConfig };
|
|
63
63
|
|
|
64
64
|
for (let i = 0; i < args.length; i++) {
|
|
65
|
-
const arg = args[i]
|
|
65
|
+
const arg = args[i];
|
|
66
66
|
if (arg === '--model' && args[i + 1]) {
|
|
67
|
-
options.model = args[++i]
|
|
67
|
+
options.model = args[++i];
|
|
68
68
|
} else if (arg === '--provider' && args[i + 1]) {
|
|
69
|
-
options.provider = args[++i]
|
|
69
|
+
options.provider = args[++i];
|
|
70
70
|
} else if (arg === '--base-url' && args[i + 1]) {
|
|
71
|
-
options.baseURL = args[++i]
|
|
71
|
+
options.baseURL = args[++i];
|
|
72
72
|
} else if (arg === '--api-key' && args[i + 1]) {
|
|
73
|
-
options.apiKey = args[++i]
|
|
73
|
+
options.apiKey = args[++i];
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
return options
|
|
77
|
+
return options;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
81
|
* Chat 命令入口
|
|
82
82
|
*/
|
|
83
83
|
async function chatCommand(args) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
console.log('
|
|
87
|
-
console.log('输入 exit 或 quit 退出\n')
|
|
84
|
+
const options = parseArgs(args);
|
|
85
|
+
console.log('=== Foliko 持续对话 ===\n');
|
|
86
|
+
console.log('输入 exit 或 quit 退出\n');
|
|
88
87
|
// 初始化框架
|
|
89
|
-
const framework = new Framework({ debug: false })
|
|
88
|
+
const framework = new Framework({ debug: false });
|
|
90
89
|
await framework.bootstrap({
|
|
91
90
|
agentDir: process.cwd() + '/.agent',
|
|
92
91
|
aiConfig: {
|
|
@@ -94,48 +93,51 @@ async function chatCommand(args) {
|
|
|
94
93
|
model: options.model,
|
|
95
94
|
baseURL: options.baseURL,
|
|
96
95
|
apiKey: options.apiKey,
|
|
97
|
-
providerOptions:{
|
|
96
|
+
providerOptions: {
|
|
98
97
|
maxOutputTokens: 8192,
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
})
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
});
|
|
102
101
|
|
|
103
102
|
// 创建 Agent
|
|
104
103
|
const agent = framework.createAgent({
|
|
105
104
|
name: 'FolikoAgent',
|
|
106
105
|
systemPrompt: `你是一个有帮助的助手,擅长回答问题和执行任务。
|
|
107
|
-
|
|
106
|
+
**重要:** 子Agent 匹配规则必须遵守:
|
|
107
|
+
- 根据【子 Agent 匹配表】,将任务委托给最匹配的子Agent处理
|
|
108
|
+
- 使用 subagent_call 工具并指定 agentName 来委托任务
|
|
109
|
+
- 只有当没有匹配的子Agent时,才直接调用工具
|
|
108
110
|
**命令执行规范:**
|
|
109
111
|
- 执行 npx skills add / npx skills remove / npx skills list 命令时,必须自动添加参数:-a openclaw -y
|
|
110
112
|
- 禁止添加 -g 参数
|
|
111
113
|
- 例如:npx skills add xxx 应该执行为 npx skills add xxx -a openclaw -y`,
|
|
112
114
|
sharedPrompt: `工作目录: {{WORK_DIR}}`,
|
|
113
115
|
metadata: {
|
|
114
|
-
WORK_DIR: process.cwd()
|
|
115
|
-
}
|
|
116
|
-
})
|
|
116
|
+
WORK_DIR: process.cwd(), // 覆盖内置的 WORK_DIR
|
|
117
|
+
},
|
|
118
|
+
});
|
|
117
119
|
|
|
118
120
|
// 初始化 UI
|
|
119
|
-
const ui = new ChatUI(agent)
|
|
121
|
+
const ui = new ChatUI(agent);
|
|
120
122
|
|
|
121
123
|
// 监听通知事件,在 CLI 中显示
|
|
122
124
|
// 显示当前会话的通知,以及没有指定 sessionId 的广播通知
|
|
123
125
|
framework.on('notification', (data) => {
|
|
124
|
-
const { title, message, source, timestamp, sessionId } = data
|
|
126
|
+
const { title, message, source, timestamp, sessionId } = data;
|
|
125
127
|
// 如果通知指定了 sessionId 且不匹配 CLI 会话,跳过
|
|
126
128
|
if (sessionId && sessionId !== ui.sessionId) {
|
|
127
|
-
return
|
|
129
|
+
return;
|
|
128
130
|
}
|
|
129
|
-
const time = timestamp ? new Date(timestamp).toLocaleTimeString('zh-CN') : ''
|
|
130
|
-
console.log('\n' + '='.repeat(50))
|
|
131
|
-
console.log(`🔔 [${source}] ${title}`)
|
|
132
|
-
console.log(message)
|
|
133
|
-
if (time) console.log(`时间: ${time}`)
|
|
134
|
-
console.log('='.repeat(50) + '\n')
|
|
135
|
-
})
|
|
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
|
+
});
|
|
136
138
|
|
|
137
139
|
// 启动聊天
|
|
138
|
-
ui.start()
|
|
140
|
+
ui.start();
|
|
139
141
|
}
|
|
140
142
|
|
|
141
|
-
module.exports = { chatCommand }
|
|
143
|
+
module.exports = { chatCommand };
|
package/cli/src/commands/list.js
CHANGED
|
@@ -3,88 +3,91 @@
|
|
|
3
3
|
* 列出所有子Agent配置
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const fs = require('fs')
|
|
7
|
-
const path = require('path')
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* 列出 .agent/agents 目录下的所有 Agent 配置
|
|
11
11
|
*/
|
|
12
12
|
async function listCommand() {
|
|
13
|
-
const agentsDir = path.resolve(process.cwd(), '.agent', 'agents')
|
|
13
|
+
const agentsDir = path.resolve(process.cwd(), '.agent', 'agents');
|
|
14
14
|
|
|
15
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
|
|
16
|
+
console.log('No .agent/agents directory found.');
|
|
17
|
+
console.log('Create agents by adding files to: .agent/agents/');
|
|
18
|
+
return;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
const entries = fs.readdirSync(agentsDir, { withFileTypes: true })
|
|
22
|
-
const agents = []
|
|
21
|
+
const entries = fs.readdirSync(agentsDir, { withFileTypes: true });
|
|
22
|
+
const agents = [];
|
|
23
23
|
|
|
24
24
|
for (const entry of entries) {
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
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);
|
|
28
31
|
|
|
29
32
|
try {
|
|
30
|
-
let config = { name: baseName }
|
|
33
|
+
let config = { name: baseName };
|
|
31
34
|
|
|
32
35
|
if (entry.name.endsWith('.json')) {
|
|
33
|
-
const content = fs.readFileSync(filePath, 'utf-8')
|
|
34
|
-
config = { ...config, ...JSON.parse(content) }
|
|
36
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
37
|
+
config = { ...config, ...JSON.parse(content) };
|
|
35
38
|
} else if (entry.name.endsWith('.md')) {
|
|
36
39
|
// 尝试从 markdown 中提取配置
|
|
37
|
-
const content = fs.readFileSync(filePath, 'utf-8')
|
|
38
|
-
const jsonMatch = content.match(/```json\n([\s\S]*?)\n```/)
|
|
40
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
41
|
+
const jsonMatch = content.match(/```json\n([\s\S]*?)\n```/);
|
|
39
42
|
if (jsonMatch) {
|
|
40
|
-
config = { ...config, ...JSON.parse(jsonMatch[1]) }
|
|
43
|
+
config = { ...config, ...JSON.parse(jsonMatch[1]) };
|
|
41
44
|
}
|
|
42
45
|
// 提取 name 行
|
|
43
|
-
const nameMatch = content.match(/^name:\s*(.+)$/m)
|
|
46
|
+
const nameMatch = content.match(/^name:\s*(.+)$/m);
|
|
44
47
|
if (nameMatch) {
|
|
45
|
-
config.name = nameMatch[1].trim()
|
|
48
|
+
config.name = nameMatch[1].trim();
|
|
46
49
|
}
|
|
47
50
|
} else {
|
|
48
51
|
// .js 文件,尝试加载
|
|
49
|
-
delete require.cache[require.resolve(filePath)]
|
|
50
|
-
const mod = require(filePath)
|
|
51
|
-
config = typeof mod === 'function' ? mod() : mod
|
|
52
|
+
delete require.cache[require.resolve(filePath)];
|
|
53
|
+
const mod = require(filePath);
|
|
54
|
+
config = typeof mod === 'function' ? mod() : mod;
|
|
52
55
|
}
|
|
53
56
|
|
|
54
57
|
agents.push({
|
|
55
58
|
name: config.name || baseName,
|
|
56
59
|
role: config.role || '-',
|
|
57
60
|
description: config.description || '-',
|
|
58
|
-
file: entry.name
|
|
59
|
-
})
|
|
61
|
+
file: entry.name,
|
|
62
|
+
});
|
|
60
63
|
} catch (err) {
|
|
61
64
|
agents.push({
|
|
62
65
|
name: baseName,
|
|
63
66
|
role: '-',
|
|
64
67
|
description: `Error loading: ${err.message}`,
|
|
65
|
-
file: entry.name
|
|
66
|
-
})
|
|
68
|
+
file: entry.name,
|
|
69
|
+
});
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
if (agents.length === 0) {
|
|
72
|
-
console.log('No agents found in .agent/agents/')
|
|
73
|
-
return
|
|
75
|
+
console.log('No agents found in .agent/agents/');
|
|
76
|
+
return;
|
|
74
77
|
}
|
|
75
78
|
|
|
76
|
-
console.log(`\nFound ${agents.length} agent(s) in .agent/agents/:\n`)
|
|
77
|
-
console.log('Name Role Description')
|
|
78
|
-
console.log('---------------- ------------------ ------------------------------------------')
|
|
79
|
+
console.log(`\nFound ${agents.length} agent(s) in .agent/agents/:\n`);
|
|
80
|
+
console.log('Name Role Description');
|
|
81
|
+
console.log('---------------- ------------------ ------------------------------------------');
|
|
79
82
|
|
|
80
83
|
for (const agent of agents) {
|
|
81
|
-
const name = (agent.name || '').padEnd(16).slice(0, 16)
|
|
82
|
-
const role = (agent.role || '-').padEnd(18).slice(0, 18)
|
|
83
|
-
const desc = (agent.description || '-').slice(0, 40)
|
|
84
|
-
console.log(`${name} ${role} ${desc}`)
|
|
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}`);
|
|
85
88
|
}
|
|
86
89
|
|
|
87
|
-
console.log('')
|
|
90
|
+
console.log('');
|
|
88
91
|
}
|
|
89
92
|
|
|
90
|
-
module.exports = { listCommand }
|
|
93
|
+
module.exports = { listCommand };
|
package/cli/src/index.js
CHANGED
|
@@ -2,45 +2,45 @@
|
|
|
2
2
|
* Foliko CLI 主逻辑
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
const { chatCommand } = require('./commands/chat')
|
|
6
|
-
const { listCommand } = require('./commands/list')
|
|
5
|
+
const { chatCommand } = require('./commands/chat');
|
|
6
|
+
const { listCommand } = require('./commands/list');
|
|
7
7
|
const fs = require('fs');
|
|
8
8
|
const path = require('path');
|
|
9
9
|
/**
|
|
10
10
|
* CLI 主入口
|
|
11
11
|
*/
|
|
12
12
|
async function cli() {
|
|
13
|
-
const args = process.argv.slice(2)
|
|
14
|
-
const command = args[0] || 'chat'
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
const command = args[0] || 'chat';
|
|
15
15
|
const packageJsonPath = path.join(__dirname, '../../package.json');
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
switch (command) {
|
|
18
18
|
case 'chat':
|
|
19
|
-
await chatCommand(args.slice(1))
|
|
20
|
-
break
|
|
19
|
+
await chatCommand(args.slice(1));
|
|
20
|
+
break;
|
|
21
21
|
|
|
22
22
|
case 'list':
|
|
23
23
|
case 'ls':
|
|
24
|
-
await listCommand()
|
|
25
|
-
break
|
|
24
|
+
await listCommand();
|
|
25
|
+
break;
|
|
26
26
|
|
|
27
27
|
case 'help':
|
|
28
28
|
case '--help':
|
|
29
29
|
case '-h':
|
|
30
|
-
printHelp()
|
|
31
|
-
break
|
|
30
|
+
printHelp();
|
|
31
|
+
break;
|
|
32
32
|
|
|
33
33
|
case 'version':
|
|
34
34
|
case '--version':
|
|
35
35
|
case '-v':
|
|
36
36
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
37
|
-
console.log(`${packageJson.name} v${packageJson.version}`)
|
|
38
|
-
break
|
|
37
|
+
console.log(`${packageJson.name} v${packageJson.version}`);
|
|
38
|
+
break;
|
|
39
39
|
|
|
40
40
|
default:
|
|
41
|
-
console.error(`Unknown command: ${command}`)
|
|
42
|
-
console.error('Run "foliko help" for usage information')
|
|
43
|
-
process.exit(1)
|
|
41
|
+
console.error(`Unknown command: ${command}`);
|
|
42
|
+
console.error('Run "foliko help" for usage information');
|
|
43
|
+
process.exit(1);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -69,7 +69,7 @@ Examples:
|
|
|
69
69
|
foliko chat --model MiniMax-M2.7
|
|
70
70
|
foliko chat --provider minimax --base-url https://api.minimaxi.com/v1
|
|
71
71
|
foliko list
|
|
72
|
-
`)
|
|
72
|
+
`);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
module.exports = { cli }
|
|
75
|
+
module.exports = { cli };
|