foliko 1.1.92 → 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.
Files changed (212) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/CLAUDE.md +56 -30
  3. package/REFACTORING_PLAN.md +645 -0
  4. package/docs/architecture.md +131 -0
  5. package/docs/migration.md +57 -0
  6. package/docs/public-api.md +138 -0
  7. package/docs/usage.md +385 -0
  8. package/examples/ambient-example.js +20 -137
  9. package/examples/basic.js +21 -48
  10. package/examples/bootstrap.js +16 -74
  11. package/examples/mcp-example.js +6 -29
  12. package/examples/skill-example.js +6 -19
  13. package/examples/workflow.js +8 -56
  14. package/package.json +8 -4
  15. package/plugins/README.md +49 -0
  16. package/plugins/{ambient-agent → ambient}/EventWatcher.js +1 -1
  17. package/plugins/{ambient-agent → ambient}/ExplorerLoop.js +3 -3
  18. package/plugins/{ambient-agent → ambient}/GoalManager.js +2 -2
  19. package/plugins/ambient/README.md +14 -0
  20. package/plugins/{ambient-agent → ambient}/Reflector.js +1 -1
  21. package/plugins/{ambient-agent → ambient}/StateStore.js +1 -1
  22. package/plugins/{ambient-agent → ambient}/index.js +2 -2
  23. package/plugins/{ai-plugin.js → core/ai/index.js} +14 -30
  24. package/plugins/{audit-plugin.js → core/audit/index.js} +3 -30
  25. package/plugins/{coordinator-plugin.js → core/coordinator/index.js} +3 -35
  26. package/plugins/core/default/bootstrap.js +202 -0
  27. package/plugins/core/default/config.js +220 -0
  28. package/plugins/core/default/index.js +58 -0
  29. package/plugins/core/mcp/index.js +1 -0
  30. package/plugins/{python-plugin-loader.js → core/python-loader/index.js} +7 -187
  31. package/plugins/{rules-plugin.js → core/rules/index.js} +121 -64
  32. package/plugins/{scheduler-plugin.js → core/scheduler/index.js} +12 -114
  33. package/plugins/{session-plugin.js → core/session/index.js} +9 -73
  34. package/{src/capabilities/skill-manager.js → plugins/core/skill-manager/index.js} +64 -18
  35. package/plugins/{storage-plugin.js → core/storage/index.js} +5 -29
  36. package/plugins/{subagent-plugin.js → core/sub-agent/index.js} +10 -171
  37. package/plugins/{think-plugin.js → core/think/index.js} +24 -91
  38. package/{src/capabilities/workflow-engine.js → plugins/core/workflow/index.js} +87 -85
  39. package/plugins/default-plugins.js +6 -720
  40. package/plugins/{data-splitter-plugin.js → executors/data-splitter/index.js} +9 -83
  41. package/plugins/{extension-executor-plugin.js → executors/extension/index.js} +13 -97
  42. package/plugins/{python-executor-plugin.js → executors/python/index.js} +6 -31
  43. package/plugins/{shell-executor-plugin.js → executors/shell/index.js} +2 -5
  44. package/plugins/install/README.md +9 -0
  45. package/plugins/{install-plugin.js → install/index.js} +3 -3
  46. package/plugins/{file-system-plugin.js → io/file-system/index.js} +34 -236
  47. package/plugins/{web-plugin.js → io/web/index.js} +11 -113
  48. package/plugins/memory/README.md +13 -0
  49. package/plugins/{memory-plugin.js → memory/index.js} +4 -18
  50. package/plugins/messaging/email/README.md +19 -0
  51. package/plugins/{email → messaging/email}/index.js +2 -2
  52. package/plugins/{feishu-plugin.js → messaging/feishu/index.js} +3 -3
  53. package/plugins/{qq-plugin.js → messaging/qq/index.js} +5 -16
  54. package/plugins/{telegram-plugin.js → messaging/telegram/index.js} +3 -3
  55. package/plugins/{weixin-plugin.js → messaging/weixin/index.js} +15 -15
  56. package/plugins/{plugin-manager-plugin.js → plugin-manager/index.js} +36 -180
  57. package/plugins/{tools-plugin.js → tools/index.js} +68 -116
  58. package/plugins/trading/README.md +15 -0
  59. package/plugins/{gate-trading.js → trading/index.js} +8 -8
  60. package/{examples → sandbox}/test-concurrent-chat.js +2 -2
  61. package/{examples → sandbox}/test-long-chat.js +2 -2
  62. package/{examples → sandbox}/test-session-chat.js +2 -2
  63. package/{examples → sandbox}/test-web-plugin.js +1 -1
  64. package/{examples → sandbox}/test-weixin-feishu.js +2 -2
  65. package/src/agent/base.js +56 -0
  66. package/src/{core/agent-chat.js → agent/chat.js} +11 -11
  67. package/src/{core/coordinator-manager.js → agent/coordinator.js} +3 -3
  68. package/src/agent/index.js +111 -0
  69. package/src/agent/main.js +337 -0
  70. package/src/agent/prompt.js +78 -0
  71. package/src/agent/sub.js +198 -0
  72. package/src/agent/worker.js +104 -0
  73. package/{cli/bin/foliko.js → src/cli/bin.js} +1 -1
  74. package/{cli/src → src/cli}/commands/chat.js +25 -21
  75. package/{cli/src → src/cli}/index.js +1 -0
  76. package/{cli/src → src/cli}/ui/chat-ui-old.js +40 -178
  77. package/{cli/src → src/cli}/ui/chat-ui.js +3 -3
  78. package/{cli/src → src/cli}/ui/components/footer-bar.js +1 -1
  79. package/src/{core → common}/constants.js +3 -0
  80. package/src/common/errors.js +402 -0
  81. package/src/{utils → common}/logger.js +33 -0
  82. package/src/{utils/chat-queue.js → common/queue.js} +2 -2
  83. package/src/config/plugin-config.js +50 -0
  84. package/src/context/agent.js +32 -0
  85. package/src/context/compaction-prompts.js +170 -0
  86. package/src/context/compaction-utils.js +191 -0
  87. package/src/context/compressor.js +413 -0
  88. package/src/context/index.js +9 -0
  89. package/src/{core/context-manager.js → context/manager.js} +1 -1
  90. package/src/context/request.js +50 -0
  91. package/src/context/session.js +33 -0
  92. package/src/context/storage.js +30 -0
  93. package/src/executors/mcp-client.js +153 -0
  94. package/src/executors/mcp-desc.js +236 -0
  95. package/src/executors/mcp-executor.js +91 -956
  96. package/src/{core → framework}/command-registry.js +1 -1
  97. package/src/framework/framework.js +300 -0
  98. package/src/framework/index.js +18 -0
  99. package/src/framework/lifecycle.js +203 -0
  100. package/src/framework/loader.js +78 -0
  101. package/src/framework/registry.js +86 -0
  102. package/src/{core/ui-extension-context.js → framework/ui-extension.js} +1 -1
  103. package/src/index.js +130 -15
  104. package/src/llm/index.js +26 -0
  105. package/src/llm/provider.js +212 -0
  106. package/src/llm/registry.js +11 -0
  107. package/src/{core/token-counter.js → llm/tokens.js} +4 -37
  108. package/src/{core/plugin-base.js → plugin/base.js} +10 -136
  109. package/src/plugin/index.js +14 -0
  110. package/src/plugin/loader.js +101 -0
  111. package/src/plugin/manager.js +261 -0
  112. package/src/{core → session}/branch-summary-auto.js +2 -2
  113. package/src/{core/chat-session.js → session/chat.js} +2 -2
  114. package/src/session/index.js +7 -0
  115. package/src/{core/session-manager.js → session/session.js} +2 -2
  116. package/src/session/ttl.js +92 -0
  117. package/src/{core/jsonl-storage.js → storage/jsonl.js} +1 -1
  118. package/src/tool/executor.js +85 -0
  119. package/src/tool/index.js +15 -0
  120. package/src/tool/registry.js +143 -0
  121. package/src/{core/tool-router.js → tool/router.js} +17 -124
  122. package/src/tool/schema.js +108 -0
  123. package/src/utils/data-splitter.js +1 -1
  124. package/src/utils/download.js +1 -1
  125. package/src/utils/index.js +6 -6
  126. package/src/utils/message-validator.js +1 -1
  127. package/tests/core/context-storage.test.js +46 -0
  128. package/tests/core/llm.test.js +54 -0
  129. package/tests/core/plugin.test.js +42 -0
  130. package/tests/core/tool.test.js +60 -0
  131. package/tests/setup.js +10 -0
  132. package/tests/smoke.test.js +58 -0
  133. package/vitest.config.js +9 -0
  134. package/cli/src/daemon.js +0 -149
  135. package/docs/CONTEXT_DESIGN.md +0 -1596
  136. package/docs/ai-sdk-optimization.md +0 -655
  137. package/docs/features.md +0 -120
  138. package/docs/qq-bot.md +0 -976
  139. package/docs/quick-reference.md +0 -160
  140. package/docs/user-manual.md +0 -1391
  141. package/images/geometric_shapes.jpg +0 -0
  142. package/images/sunset_mountain_lake.jpg +0 -0
  143. package/skills/poster-guide/SKILL.md +0 -792
  144. package/src/capabilities/index.js +0 -11
  145. package/src/core/agent.js +0 -808
  146. package/src/core/context-compressor.js +0 -959
  147. package/src/core/enhanced-context-compressor.js +0 -210
  148. package/src/core/framework.js +0 -1422
  149. package/src/core/index.js +0 -30
  150. package/src/core/plugin-manager.js +0 -961
  151. package/src/core/provider-registry.js +0 -159
  152. package/src/core/provider.js +0 -156
  153. package/src/core/request-context.js +0 -98
  154. package/src/core/subagent.js +0 -442
  155. package/src/core/system-prompt-builder.js +0 -120
  156. package/src/core/tool-executor.js +0 -202
  157. package/src/core/tool-registry.js +0 -517
  158. package/src/core/worker-agent.js +0 -192
  159. package/src/executors/executor-base.js +0 -58
  160. package/src/utils/error-boundary.js +0 -363
  161. package/src/utils/error.js +0 -374
  162. package/system.md +0 -1645
  163. package/website_v2/README.md +0 -57
  164. package/website_v2/SPEC.md +0 -1
  165. package/website_v2/docs/api.html +0 -128
  166. package/website_v2/docs/configuration.html +0 -147
  167. package/website_v2/docs/plugin-development.html +0 -129
  168. package/website_v2/docs/project-structure.html +0 -89
  169. package/website_v2/docs/skill-development.html +0 -85
  170. package/website_v2/index.html +0 -489
  171. package/website_v2/scripts/main.js +0 -93
  172. package/website_v2/styles/animations.css +0 -8
  173. package/website_v2/styles/docs.css +0 -83
  174. package/website_v2/styles/main.css +0 -417
  175. package/xhs_auth.json +0 -268
  176. package//346/265/267/346/212/245/346/217/222/344/273/266.md +0 -621
  177. /package/plugins/{ambient-agent → ambient}/constants.js +0 -0
  178. /package/plugins/{email → messaging/email}/constants.js +0 -0
  179. /package/plugins/{email → messaging/email}/handlers.js +0 -0
  180. /package/plugins/{email → messaging/email}/monitor.js +0 -0
  181. /package/plugins/{email → messaging/email}/parser.js +0 -0
  182. /package/plugins/{email → messaging/email}/reply.js +0 -0
  183. /package/plugins/{email → messaging/email}/utils.js +0 -0
  184. /package/{examples → sandbox}/test-chat.js +0 -0
  185. /package/{examples → sandbox}/test-mcp.js +0 -0
  186. /package/{examples → sandbox}/test-reload.js +0 -0
  187. /package/{examples → sandbox}/test-telegram.js +0 -0
  188. /package/{examples → sandbox}/test-tg-bot.js +0 -0
  189. /package/{examples → sandbox}/test-tg-simple.js +0 -0
  190. /package/{examples → sandbox}/test-tg.js +0 -0
  191. /package/{examples → sandbox}/test-think.js +0 -0
  192. /package/src/{core/sub-agent-config.js → agent/sub-config.js} +0 -0
  193. /package/{cli/src → src/cli}/commands/daemon.js +0 -0
  194. /package/{cli/src → src/cli}/commands/list.js +0 -0
  195. /package/{cli/src → src/cli}/commands/plugin.js +0 -0
  196. /package/{cli/src → src/cli}/ui/components/agent-mention-provider.js +0 -0
  197. /package/{cli/src → src/cli}/ui/components/chained-autocomplete-provider.js +0 -0
  198. /package/{cli/src → src/cli}/ui/components/message-bubble.js +0 -0
  199. /package/{cli/src → src/cli}/ui/components/status-bar.js +0 -0
  200. /package/{cli/src → src/cli}/utils/ansi.js +0 -0
  201. /package/{cli/src → src/cli}/utils/config.js +0 -0
  202. /package/{cli/src → src/cli}/utils/markdown.js +0 -0
  203. /package/{cli/src → src/cli}/utils/plugin-config.js +0 -0
  204. /package/{cli/src → src/cli}/utils/render-diff.js +0 -0
  205. /package/src/{utils/circuit-breaker.js → common/circuit.js} +0 -0
  206. /package/src/{utils/edit-diff.js → common/diff.js} +0 -0
  207. /package/src/{utils/event-emitter.js → common/events.js} +0 -0
  208. /package/src/{utils → common}/id.js +0 -0
  209. /package/src/{utils → common}/retry.js +0 -0
  210. /package/src/{core/notification-manager.js → notification/manager.js} +0 -0
  211. /package/src/{core/session-entry.js → session/entry.js} +0 -0
  212. /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('../src/core/plugin-base')
7
- const { logger } = require('../src/utils/logger')
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', // python 或 python3
25
- timeout: config.timeout || 120000, // 2分钟超时
24
+ pythonPath: config.pythonPath || 'python',
25
+ timeout: config.timeout || 120000,
26
26
  baseDir: config.baseDir || '.foliko/python-scripts',
27
- pipPath: config.pipPath || null // 可选,自定义 pip 路径
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('../src/core/plugin-base')
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',
@@ -0,0 +1,9 @@
1
+ # Install Plugin
2
+
3
+ npm 包自动安装器。在插件加载时自动检测并安装缺失的依赖。
4
+
5
+ ## 行为
6
+
7
+ - 插件安装 `install(framework)` 时扫描 `package.json` 中的依赖
8
+ - 自动执行 `npm install` 安装缺失包
9
+ - 失败时记录警告,不阻塞框架启动
@@ -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('../src/core/plugin-base')
10
- const { logger } = require('../src/utils/logger')
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) {