foliko 1.1.93 → 2.0.0
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/.claude/settings.local.json +2 -1
- package/CLAUDE.md +56 -30
- package/REFACTORING_PLAN.md +645 -0
- package/docs/architecture.md +131 -0
- package/docs/migration.md +57 -0
- package/docs/public-api.md +138 -0
- package/docs/usage.md +385 -0
- package/examples/ambient-example.js +20 -137
- package/examples/basic.js +21 -48
- package/examples/bootstrap.js +16 -74
- package/examples/mcp-example.js +6 -29
- package/examples/skill-example.js +6 -19
- package/examples/workflow.js +8 -56
- package/package.json +8 -4
- package/plugins/README.md +49 -0
- package/plugins/{ambient-agent → ambient}/EventWatcher.js +1 -1
- package/plugins/{ambient-agent → ambient}/ExplorerLoop.js +3 -3
- package/plugins/{ambient-agent → ambient}/GoalManager.js +2 -2
- package/plugins/ambient/README.md +14 -0
- package/plugins/{ambient-agent → ambient}/Reflector.js +1 -1
- package/plugins/{ambient-agent → ambient}/StateStore.js +1 -1
- package/plugins/{ambient-agent → ambient}/index.js +2 -2
- package/plugins/{ai-plugin.js → core/ai/index.js} +14 -30
- package/plugins/{audit-plugin.js → core/audit/index.js} +3 -30
- package/plugins/{coordinator-plugin.js → core/coordinator/index.js} +3 -35
- package/plugins/core/default/bootstrap.js +202 -0
- package/plugins/core/default/config.js +220 -0
- package/plugins/core/default/index.js +58 -0
- package/plugins/core/mcp/index.js +1 -0
- package/plugins/{python-plugin-loader.js → core/python-loader/index.js} +7 -187
- package/plugins/{rules-plugin.js → core/rules/index.js} +121 -64
- package/plugins/{scheduler-plugin.js → core/scheduler/index.js} +12 -114
- package/plugins/{session-plugin.js → core/session/index.js} +9 -73
- package/{src/capabilities/skill-manager.js → plugins/core/skill-manager/index.js} +64 -18
- package/plugins/{storage-plugin.js → core/storage/index.js} +5 -29
- package/plugins/{subagent-plugin.js → core/sub-agent/index.js} +10 -171
- package/plugins/{think-plugin.js → core/think/index.js} +24 -91
- package/{src/capabilities/workflow-engine.js → plugins/core/workflow/index.js} +87 -85
- package/plugins/default-plugins.js +6 -720
- package/plugins/{data-splitter-plugin.js → executors/data-splitter/index.js} +9 -83
- package/plugins/{extension-executor-plugin.js → executors/extension/index.js} +13 -97
- package/plugins/{python-executor-plugin.js → executors/python/index.js} +6 -31
- package/plugins/{shell-executor-plugin.js → executors/shell/index.js} +2 -5
- package/plugins/install/README.md +9 -0
- package/plugins/{install-plugin.js → install/index.js} +3 -3
- package/plugins/{file-system-plugin.js → io/file-system/index.js} +34 -236
- package/plugins/{web-plugin.js → io/web/index.js} +11 -113
- package/plugins/memory/README.md +13 -0
- package/plugins/{memory-plugin.js → memory/index.js} +4 -18
- package/plugins/messaging/email/README.md +19 -0
- package/plugins/{email → messaging/email}/index.js +2 -2
- package/plugins/{feishu-plugin.js → messaging/feishu/index.js} +3 -3
- package/plugins/{qq-plugin.js → messaging/qq/index.js} +5 -16
- package/plugins/{telegram-plugin.js → messaging/telegram/index.js} +3 -3
- package/plugins/{weixin-plugin.js → messaging/weixin/index.js} +15 -15
- package/plugins/{plugin-manager-plugin.js → plugin-manager/index.js} +36 -180
- package/plugins/{tools-plugin.js → tools/index.js} +68 -116
- package/plugins/trading/README.md +15 -0
- package/plugins/{gate-trading.js → trading/index.js} +8 -8
- package/{examples → sandbox}/test-concurrent-chat.js +2 -2
- package/{examples → sandbox}/test-long-chat.js +2 -2
- package/{examples → sandbox}/test-session-chat.js +2 -2
- package/{examples → sandbox}/test-web-plugin.js +1 -1
- package/{examples → sandbox}/test-weixin-feishu.js +2 -2
- package/src/agent/base.js +56 -0
- package/src/{core/agent-chat.js → agent/chat.js} +11 -11
- package/src/{core/coordinator-manager.js → agent/coordinator.js} +3 -3
- package/src/agent/index.js +111 -0
- package/src/agent/main.js +337 -0
- package/src/agent/prompt.js +78 -0
- package/src/agent/sub.js +198 -0
- package/src/agent/worker.js +104 -0
- package/{cli/bin/foliko.js → src/cli/bin.js} +1 -1
- package/{cli/src → src/cli}/commands/chat.js +25 -21
- package/{cli/src → src/cli}/index.js +1 -0
- package/{cli/src → src/cli}/ui/chat-ui-old.js +40 -178
- package/{cli/src → src/cli}/ui/chat-ui.js +3 -3
- package/{cli/src → src/cli}/ui/components/footer-bar.js +1 -1
- package/src/common/errors.js +402 -0
- package/src/{utils → common}/logger.js +33 -0
- package/src/{utils/chat-queue.js → common/queue.js} +2 -2
- package/src/config/plugin-config.js +50 -0
- package/src/context/agent.js +32 -0
- package/src/context/compaction-prompts.js +170 -0
- package/src/context/compaction-utils.js +191 -0
- package/src/context/compressor.js +413 -0
- package/src/context/index.js +9 -0
- package/src/{core/context-manager.js → context/manager.js} +1 -1
- package/src/context/request.js +50 -0
- package/src/context/session.js +33 -0
- package/src/context/storage.js +30 -0
- package/src/executors/mcp-client.js +153 -0
- package/src/executors/mcp-desc.js +236 -0
- package/src/executors/mcp-executor.js +91 -956
- package/src/{core → framework}/command-registry.js +1 -1
- package/src/framework/framework.js +300 -0
- package/src/framework/index.js +18 -0
- package/src/framework/lifecycle.js +203 -0
- package/src/framework/loader.js +78 -0
- package/src/framework/registry.js +86 -0
- package/src/{core/ui-extension-context.js → framework/ui-extension.js} +1 -1
- package/src/index.js +130 -15
- package/src/llm/index.js +26 -0
- package/src/llm/provider.js +212 -0
- package/src/llm/registry.js +11 -0
- package/src/{core/token-counter.js → llm/tokens.js} +4 -37
- package/src/{core/plugin-base.js → plugin/base.js} +10 -136
- package/src/plugin/index.js +14 -0
- package/src/plugin/loader.js +101 -0
- package/src/plugin/manager.js +261 -0
- package/src/{core → session}/branch-summary-auto.js +2 -2
- package/src/{core/chat-session.js → session/chat.js} +2 -2
- package/src/session/index.js +7 -0
- package/src/{core/session-manager.js → session/session.js} +2 -2
- package/src/session/ttl.js +92 -0
- package/src/{core/jsonl-storage.js → storage/jsonl.js} +1 -1
- package/src/tool/executor.js +85 -0
- package/src/tool/index.js +15 -0
- package/src/tool/registry.js +143 -0
- package/src/{core/tool-router.js → tool/router.js} +17 -124
- package/src/tool/schema.js +108 -0
- package/src/utils/data-splitter.js +1 -1
- package/src/utils/download.js +1 -1
- package/src/utils/index.js +6 -6
- package/src/utils/message-validator.js +1 -1
- package/tests/core/context-storage.test.js +46 -0
- package/tests/core/llm.test.js +54 -0
- package/tests/core/plugin.test.js +42 -0
- package/tests/core/tool.test.js +60 -0
- package/tests/setup.js +10 -0
- package/tests/smoke.test.js +58 -0
- package/vitest.config.js +9 -0
- package/cli/src/daemon.js +0 -149
- package/docs/CONTEXT_DESIGN.md +0 -1596
- package/docs/ai-sdk-optimization.md +0 -655
- package/docs/features.md +0 -120
- package/docs/qq-bot.md +0 -976
- package/docs/quick-reference.md +0 -160
- package/docs/user-manual.md +0 -1391
- package/images/geometric_shapes.jpg +0 -0
- package/images/sunset_mountain_lake.jpg +0 -0
- package/skills/poster-guide/SKILL.md +0 -792
- package/src/capabilities/index.js +0 -11
- package/src/core/agent.js +0 -808
- package/src/core/context-compressor.js +0 -959
- package/src/core/enhanced-context-compressor.js +0 -210
- package/src/core/framework.js +0 -1422
- package/src/core/index.js +0 -30
- package/src/core/plugin-manager.js +0 -961
- package/src/core/provider-registry.js +0 -159
- package/src/core/provider.js +0 -156
- package/src/core/request-context.js +0 -98
- package/src/core/subagent.js +0 -442
- package/src/core/system-prompt-builder.js +0 -120
- package/src/core/tool-executor.js +0 -202
- package/src/core/tool-registry.js +0 -517
- package/src/core/worker-agent.js +0 -192
- package/src/executors/executor-base.js +0 -58
- package/src/utils/error-boundary.js +0 -363
- package/src/utils/error.js +0 -374
- package/system.md +0 -1645
- package/website_v2/README.md +0 -57
- package/website_v2/SPEC.md +0 -1
- package/website_v2/docs/api.html +0 -128
- package/website_v2/docs/configuration.html +0 -147
- package/website_v2/docs/plugin-development.html +0 -129
- package/website_v2/docs/project-structure.html +0 -89
- package/website_v2/docs/skill-development.html +0 -85
- package/website_v2/index.html +0 -489
- package/website_v2/scripts/main.js +0 -93
- package/website_v2/styles/animations.css +0 -8
- package/website_v2/styles/docs.css +0 -83
- package/website_v2/styles/main.css +0 -417
- package/xhs_auth.json +0 -268
- package//346/265/267/346/212/245/346/217/222/344/273/266.md +0 -621
- /package/plugins/{ambient-agent → ambient}/constants.js +0 -0
- /package/plugins/{email → messaging/email}/constants.js +0 -0
- /package/plugins/{email → messaging/email}/handlers.js +0 -0
- /package/plugins/{email → messaging/email}/monitor.js +0 -0
- /package/plugins/{email → messaging/email}/parser.js +0 -0
- /package/plugins/{email → messaging/email}/reply.js +0 -0
- /package/plugins/{email → messaging/email}/utils.js +0 -0
- /package/{examples → sandbox}/test-chat.js +0 -0
- /package/{examples → sandbox}/test-mcp.js +0 -0
- /package/{examples → sandbox}/test-reload.js +0 -0
- /package/{examples → sandbox}/test-telegram.js +0 -0
- /package/{examples → sandbox}/test-tg-bot.js +0 -0
- /package/{examples → sandbox}/test-tg-simple.js +0 -0
- /package/{examples → sandbox}/test-tg.js +0 -0
- /package/{examples → sandbox}/test-think.js +0 -0
- /package/src/{core/sub-agent-config.js → agent/sub-config.js} +0 -0
- /package/{cli/src → src/cli}/commands/daemon.js +0 -0
- /package/{cli/src → src/cli}/commands/list.js +0 -0
- /package/{cli/src → src/cli}/commands/plugin.js +0 -0
- /package/{cli/src → src/cli}/ui/components/agent-mention-provider.js +0 -0
- /package/{cli/src → src/cli}/ui/components/chained-autocomplete-provider.js +0 -0
- /package/{cli/src → src/cli}/ui/components/message-bubble.js +0 -0
- /package/{cli/src → src/cli}/ui/components/status-bar.js +0 -0
- /package/{cli/src → src/cli}/utils/ansi.js +0 -0
- /package/{cli/src → src/cli}/utils/config.js +0 -0
- /package/{cli/src → src/cli}/utils/markdown.js +0 -0
- /package/{cli/src → src/cli}/utils/plugin-config.js +0 -0
- /package/{cli/src → src/cli}/utils/render-diff.js +0 -0
- /package/src/{utils/circuit-breaker.js → common/circuit.js} +0 -0
- /package/src/{core → common}/constants.js +0 -0
- /package/src/{utils/edit-diff.js → common/diff.js} +0 -0
- /package/src/{utils/event-emitter.js → common/events.js} +0 -0
- /package/src/{utils → common}/id.js +0 -0
- /package/src/{utils → common}/retry.js +0 -0
- /package/src/{core/notification-manager.js → notification/manager.js} +0 -0
- /package/src/{core/session-entry.js → session/entry.js} +0 -0
- /package/src/{core/storage-manager.js → storage/manager.js} +0 -0
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* 使用 child_process 执行 Python 代码和脚本
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const { Plugin } = require('
|
|
7
|
-
const { logger } = require('
|
|
6
|
+
const { Plugin } = require('../../../src/plugin/base')
|
|
7
|
+
const { logger } = require('../../../src/common/logger')
|
|
8
8
|
const log = logger.child('PythonExecutor')
|
|
9
9
|
const { spawn } = require('child_process')
|
|
10
10
|
const fs = require('fs')
|
|
@@ -21,13 +21,13 @@ class PythonExecutorPlugin extends Plugin {
|
|
|
21
21
|
this.priority = 15
|
|
22
22
|
|
|
23
23
|
this.config = {
|
|
24
|
-
pythonPath: config.pythonPath || 'python',
|
|
25
|
-
timeout: config.timeout || 120000,
|
|
24
|
+
pythonPath: config.pythonPath || 'python',
|
|
25
|
+
timeout: config.timeout || 120000,
|
|
26
26
|
baseDir: config.baseDir || '.foliko/python-scripts',
|
|
27
|
-
pipPath: config.pipPath || null
|
|
27
|
+
pipPath: config.pipPath || null
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
this.system = true
|
|
30
|
+
this.system = true
|
|
31
31
|
|
|
32
32
|
this._framework = null
|
|
33
33
|
this._tempDir = null
|
|
@@ -36,7 +36,6 @@ class PythonExecutorPlugin extends Plugin {
|
|
|
36
36
|
install(framework) {
|
|
37
37
|
this._framework = framework
|
|
38
38
|
|
|
39
|
-
// 确保临时目录存在
|
|
40
39
|
this._tempDir = path.join(os.tmpdir(), `vb-python-${process.pid}`)
|
|
41
40
|
if (!fs.existsSync(this._tempDir)) {
|
|
42
41
|
fs.mkdirSync(this._tempDir, { recursive: true })
|
|
@@ -46,7 +45,6 @@ class PythonExecutorPlugin extends Plugin {
|
|
|
46
45
|
}
|
|
47
46
|
|
|
48
47
|
start(framework) {
|
|
49
|
-
// 注册 python-execute 工具
|
|
50
48
|
framework.registerTool({
|
|
51
49
|
name: 'python-execute',
|
|
52
50
|
description: '执行 Python 代码,禁止传入无用的emoji',
|
|
@@ -60,7 +58,6 @@ class PythonExecutorPlugin extends Plugin {
|
|
|
60
58
|
}
|
|
61
59
|
})
|
|
62
60
|
|
|
63
|
-
// 注册 python_script 工具
|
|
64
61
|
framework.registerTool({
|
|
65
62
|
name: 'python_script',
|
|
66
63
|
description: '执行 Python 脚本文件',
|
|
@@ -74,7 +71,6 @@ class PythonExecutorPlugin extends Plugin {
|
|
|
74
71
|
}
|
|
75
72
|
})
|
|
76
73
|
|
|
77
|
-
// 注册 pip_install 工具
|
|
78
74
|
framework.registerTool({
|
|
79
75
|
name: 'pip_install',
|
|
80
76
|
description: '安装 Python 包',
|
|
@@ -91,20 +87,14 @@ class PythonExecutorPlugin extends Plugin {
|
|
|
91
87
|
return this
|
|
92
88
|
}
|
|
93
89
|
|
|
94
|
-
/**
|
|
95
|
-
* 执行 Python 代码
|
|
96
|
-
* @private
|
|
97
|
-
*/
|
|
98
90
|
_executePython(code, timeout, inputData) {
|
|
99
91
|
return new Promise((resolve) => {
|
|
100
92
|
const startTime = Date.now()
|
|
101
93
|
let output = ''
|
|
102
94
|
let errorOutput = ''
|
|
103
95
|
|
|
104
|
-
// 创建临时脚本文件
|
|
105
96
|
const tempFile = path.join(this._tempDir, `temp_${Date.now()}.py`)
|
|
106
97
|
|
|
107
|
-
// 注入 input_data 变量
|
|
108
98
|
let inputDataSetup = ''
|
|
109
99
|
if (inputData) {
|
|
110
100
|
const inputDataJson = JSON.stringify(inputData).replace(/'/g, "\\'")
|
|
@@ -113,7 +103,6 @@ class PythonExecutorPlugin extends Plugin {
|
|
|
113
103
|
inputDataSetup = `input_data = {}\n`
|
|
114
104
|
}
|
|
115
105
|
|
|
116
|
-
// 包装代码,添加错误处理
|
|
117
106
|
const wrappedCode = `
|
|
118
107
|
import sys
|
|
119
108
|
import traceback
|
|
@@ -143,14 +132,12 @@ except Exception:
|
|
|
143
132
|
})
|
|
144
133
|
|
|
145
134
|
proc.on('close', (code) => {
|
|
146
|
-
// 清理临时文件
|
|
147
135
|
try {
|
|
148
136
|
fs.unlinkSync(tempFile)
|
|
149
137
|
} catch (e) { }
|
|
150
138
|
|
|
151
139
|
const elapsed = Date.now() - startTime
|
|
152
140
|
|
|
153
|
-
// 限制返回数据大小,避免上下文超限(限制为 5000 字符)
|
|
154
141
|
const MAX_OUTPUT_LENGTH = 5000
|
|
155
142
|
let truncatedOutput = output
|
|
156
143
|
let truncated = false
|
|
@@ -173,7 +160,6 @@ except Exception:
|
|
|
173
160
|
})
|
|
174
161
|
|
|
175
162
|
proc.on('error', (err) => {
|
|
176
|
-
// 清理临时文件
|
|
177
163
|
try {
|
|
178
164
|
fs.unlinkSync(tempFile)
|
|
179
165
|
} catch (e) { }
|
|
@@ -191,7 +177,6 @@ except Exception:
|
|
|
191
177
|
fs.unlinkSync(tempFile)
|
|
192
178
|
} catch (e) { }
|
|
193
179
|
|
|
194
|
-
// 限制返回数据大小
|
|
195
180
|
const MAX_OUTPUT_LENGTH = 5000
|
|
196
181
|
const truncatedOutput = output.length > MAX_OUTPUT_LENGTH
|
|
197
182
|
? output.substring(0, MAX_OUTPUT_LENGTH) + `\n... [输出已截断,总长度 ${output.length} 字符]`
|
|
@@ -211,17 +196,12 @@ except Exception:
|
|
|
211
196
|
})
|
|
212
197
|
}
|
|
213
198
|
|
|
214
|
-
/**
|
|
215
|
-
* 执行 Python 脚本文件
|
|
216
|
-
* @private
|
|
217
|
-
*/
|
|
218
199
|
_executeScript(scriptPath, args, timeout) {
|
|
219
200
|
return new Promise((resolve) => {
|
|
220
201
|
const startTime = Date.now()
|
|
221
202
|
let output = ''
|
|
222
203
|
let errorOutput = ''
|
|
223
204
|
|
|
224
|
-
// 检查文件是否存在
|
|
225
205
|
if (!fs.existsSync(scriptPath)) {
|
|
226
206
|
resolve({
|
|
227
207
|
success: false,
|
|
@@ -282,10 +262,6 @@ except Exception:
|
|
|
282
262
|
})
|
|
283
263
|
}
|
|
284
264
|
|
|
285
|
-
/**
|
|
286
|
-
* 安装 Python 包
|
|
287
|
-
* @private
|
|
288
|
-
*/
|
|
289
265
|
_pipInstall(packageName, upgrade, timeout) {
|
|
290
266
|
return new Promise((resolve) => {
|
|
291
267
|
const startTime = Date.now()
|
|
@@ -352,7 +328,6 @@ except Exception:
|
|
|
352
328
|
}
|
|
353
329
|
|
|
354
330
|
uninstall(framework) {
|
|
355
|
-
// 清理临时目录
|
|
356
331
|
if (this._tempDir && fs.existsSync(this._tempDir)) {
|
|
357
332
|
try {
|
|
358
333
|
fs.rmSync(this._tempDir, { recursive: true, force: true })
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 使用 child_process 执行终端命令
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const { Plugin } = require('
|
|
6
|
+
const { Plugin } = require('../../../src/plugin/base')
|
|
7
7
|
const { spawn } = require('child_process')
|
|
8
8
|
const { z } = require('zod')
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ class ShellExecutorPlugin extends Plugin {
|
|
|
15
15
|
this.description = 'Shell 执行器,用于运行终端命令和脚本'
|
|
16
16
|
this.priority = 15
|
|
17
17
|
|
|
18
|
-
this.system = true
|
|
18
|
+
this.system = true
|
|
19
19
|
|
|
20
20
|
this.config = {
|
|
21
21
|
timeout: config.timeout || 60000,
|
|
@@ -52,7 +52,6 @@ class ShellExecutorPlugin extends Plugin {
|
|
|
52
52
|
let output = ''
|
|
53
53
|
let errorOutput = ''
|
|
54
54
|
|
|
55
|
-
// 检测命令类型
|
|
56
55
|
const isWindows = process.platform === 'win32'
|
|
57
56
|
const shell = isWindows ? 'cmd.exe' : '/bin/sh'
|
|
58
57
|
const shellArg = isWindows ? '/c' : '-c'
|
|
@@ -93,7 +92,6 @@ class ShellExecutorPlugin extends Plugin {
|
|
|
93
92
|
})
|
|
94
93
|
})
|
|
95
94
|
|
|
96
|
-
// 超时处理
|
|
97
95
|
setTimeout(() => {
|
|
98
96
|
if (!proc.killed) {
|
|
99
97
|
proc.kill('SIGTERM')
|
|
@@ -112,7 +110,6 @@ class ShellExecutorPlugin extends Plugin {
|
|
|
112
110
|
}
|
|
113
111
|
})
|
|
114
112
|
|
|
115
|
-
// 注册 PowerShell 工具 (Windows)
|
|
116
113
|
if (process.platform === 'win32') {
|
|
117
114
|
framework.registerTool({
|
|
118
115
|
name: 'powershell',
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
const { execSync } = require('child_process')
|
|
7
7
|
const fs = require('fs')
|
|
8
8
|
const path = require('path')
|
|
9
|
-
const { Plugin } = require('
|
|
10
|
-
const { logger } = require('
|
|
9
|
+
const { Plugin } = require('../../src/plugin/base')
|
|
10
|
+
const { logger } = require('../../src/common/logger')
|
|
11
11
|
const log = logger.child('InstallPlugin')
|
|
12
12
|
const { z } = require('zod')
|
|
13
13
|
|
|
@@ -20,7 +20,7 @@ class InstallPlugin extends Plugin {
|
|
|
20
20
|
|
|
21
21
|
this._agentDir = config.agentDir || '.foliko' // 默认安装到 .foliko 目录
|
|
22
22
|
this._nodeModulesDir = null
|
|
23
|
-
this.system = true
|
|
23
|
+
this.system = true
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
install(framework) {
|