foliko 2.0.4 → 2.0.6

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 (59) hide show
  1. package/.claude/settings.local.json +4 -1
  2. package/.cli_default_systemPrompt.md +291 -0
  3. package/CLAUDE.md +3 -0
  4. package/README.md +20 -3
  5. package/docs/architecture.md +34 -2
  6. package/docs/extensions.md +199 -0
  7. package/docs/migration.md +100 -0
  8. package/docs/public-api.md +1180 -6
  9. package/docs/usage.md +122 -30
  10. package/package.json +1 -1
  11. package/plugins/core/audit/index.js +1 -1
  12. package/plugins/core/default/bootstrap.js +65 -19
  13. package/plugins/core/python-loader/index.js +43 -25
  14. package/plugins/core/skill-manager/PROMPT.md +6 -0
  15. package/plugins/core/skill-manager/index.js +538 -93
  16. package/plugins/core/sub-agent/PROMPT.md +10 -0
  17. package/plugins/core/sub-agent/index.js +36 -3
  18. package/plugins/core/think/index.js +1 -0
  19. package/plugins/core/workflow/index.js +106 -22
  20. package/plugins/executors/data-splitter/PROMPT.md +13 -0
  21. package/plugins/executors/data-splitter/index.js +5 -4
  22. package/plugins/executors/extension/extension-registry.js +145 -0
  23. package/plugins/executors/extension/index.js +405 -437
  24. package/plugins/executors/extension/prompt-builder.js +359 -0
  25. package/plugins/executors/extension/skill-helper.js +143 -0
  26. package/plugins/messaging/feishu/index.js +5 -3
  27. package/plugins/messaging/qq/index.js +6 -4
  28. package/plugins/messaging/telegram/index.js +6 -3
  29. package/plugins/messaging/weixin/index.js +5 -3
  30. package/plugins/tools/PROMPT.md +26 -0
  31. package/plugins/tools/index.js +6 -5
  32. package/skills/foliko/AGENTS.md +196 -43
  33. package/skills/foliko/SKILL.md +157 -28
  34. package/skills/mcp/SKILL.md +77 -118
  35. package/skills/plugins/SKILL.md +89 -3
  36. package/skills/python/SKILL.md +57 -39
  37. package/skills/skill-guide/SKILL.md +42 -34
  38. package/skills/workflows/SKILL.md +224 -9
  39. package/skills/workflows/workflow-troubleshooting/SKILL.md +221 -281
  40. package/src/agent/chat.js +48 -27
  41. package/src/agent/main.js +34 -13
  42. package/src/agent/prompt-registry.js +133 -87
  43. package/src/agent/prompts/PROMPT.md +3 -0
  44. package/src/agent/sub.js +1 -1
  45. package/src/cli/ui/chat-ui-old.js +5 -2
  46. package/src/cli/ui/chat-ui.js +5 -2
  47. package/src/common/constants.js +12 -0
  48. package/src/common/error-capture.js +91 -0
  49. package/src/common/logger.js +2 -2
  50. package/src/context/compressor.js +6 -2
  51. package/src/executors/mcp-executor.js +105 -125
  52. package/src/framework/framework.js +632 -6
  53. package/src/index.js +4 -0
  54. package/src/plugin/base.js +913 -10
  55. package/src/plugin/manager.js +29 -8
  56. package/src/tool/schema.js +32 -9
  57. package/tests/core/plugin-prompts.test.js +13 -13
  58. package/tests/core/prompt-registry.test.js +59 -51
  59. package/website/index.html +821 -0
@@ -235,7 +235,10 @@
235
235
  "Bash(node -e \"const { spawn } = require\\('child_process'\\); const p = spawn\\('npx', ['designmd-mcp'], { stdio: 'pipe' }\\); let out = ''; p.stdout.on\\('data', \\(d\\) => { out += d.toString\\(\\); if\\(out.length > 1000\\) { console.log\\('OUTPUT_TOO_LONG:' + out.length\\); process.exit\\(0\\); } }\\); p.stderr.on\\('data', \\(d\\) => console.log\\('STDERR:' + d.toString\\(\\)\\)\\); setTimeout\\(\\(\\) => { console.log\\('FINAL_OUTPUT_LENGTH:' + out.length\\); process.exit\\(0\\); }, 3000\\);\")",
236
236
  "Bash(where npx *)",
237
237
  "Bash(node *)",
238
- "Bash(cmd //c \"D:\\\\\\\\tmp\\\\\\\\run-diag3.bat\")"
238
+ "Bash(cmd //c \"D:\\\\\\\\tmp\\\\\\\\run-diag3.bat\")",
239
+ "Bash(npm start *)",
240
+ "Bash(xxd)",
241
+ "Bash(python fix_ext2.py)"
239
242
  ]
240
243
  }
241
244
  }
@@ -0,0 +1,291 @@
1
+ 你是一个有帮助的助手,擅长回答问题和执行任务。
2
+ **重要:** 子Agent 匹配规则必须遵守:
3
+ - 根据【子 Agent 匹配表】,将任务委托给最匹配的子Agent处理
4
+ - 使用 subagent_call 工具并指定 agentName 来委托任务
5
+ - 只有当没有匹配的子Agent时,才直接调用工具
6
+ **命令执行规范:**
7
+ - 执行 npx skills add / npx skills remove / npx skills list 命令时,必须自动添加参数:-a openclaw -y
8
+ - 禁止添加 -g 参数
9
+ - 例如:npx skills add xxx 应该执行为 npx skills add xxx -a openclaw -y
10
+
11
+ ## 大数据处理能力
12
+
13
+ 你具备自动处理大文件和大网页的能力:
14
+
15
+ 1. **内容预览**:当工具返回的内容很大时,先用 `get_content_preview` 查看统计信息
16
+ 2. **分拆处理**:如果内容超过 10 万字符,用 `split_and_process` 将内容分块,每块交给独立的子 Agent 并行处理
17
+ 3. **自动汇总**:`split_and_process` 会自动汇总所有子 Agent 的处理结果,你只需基于汇总结果回答即可
18
+ 4. **性能提示**:分拆处理会并行运行多个子 Agent,处理大文件时效率很高
19
+
20
+ ### 使用建议
21
+ - 读取大文件(> 100KB)时:先读取,如果内容太大,用 `split_and_process` 分拆分析
22
+ - 抓取网页时:如果页面内容过多,用 `split_and_process` 分拆提取
23
+ - 分拆时指定清晰的任务描述,例如"提取所有关键代码函数"、"总结每段内容要点"
24
+
25
+ ## 工具调用核心规则
26
+
27
+ 1. **子 Agent 优先**:任务匹配子 Agent 专业领域时,**必须优先使用** `subagent_call` 工具并指定 `agentName` 委托给对应子 Agent 处理,而不是直接调用工具。只有当没有匹配的子 Agent 时,才直接调用工具。
28
+ 2. **子 Agent 任务独立**:每个子 Agent 负责独立任务。**不要重复完成子 Agent 已经完成的任务**,但可以继续调用其他子 Agent 或工具完成其他任务。
29
+ 3. **必须先调用工具再回复**:当问题需要信息、操作或计算时,必须调用工具获取真实结果后才能回答。禁止在未调用工具的情况下直接给出答案。
30
+ 4. **禁止编造数据**:不许捏造用户、订单、任务、文件、内容等任何数据。所有数据必须通过工具获取。
31
+ 5. **工具优先**:可用工具列表会提供,格式为 `toolName(toolArgs)`。不确定用哪个工具时,优先调用可能相关的工具。
32
+ 6. **结果导向**:调用工具后,基于返回结果回答,不要重复工具的内部实现细节。
33
+ 7. **多步骤任务**:复杂任务拆解为多个工具调用,逐步完成,每步基于结果决定下一步。
34
+ 8. **步骤未完成必须提示继续**:如果任务需要多步骤操作,在返回前必须明确告知用户当前进度和下一步操作。如果回复内容为空或不完整,必须说明"步骤进行中,请继续"。
35
+
36
+ ## 响应规范
37
+
38
+ > 直接给出结论或结果,不说"我需要..."、"我建议..."等铺垫话术
39
+
40
+ - 如果工具返回错误,说明错误原因并给出解决建议
41
+ - 如果信息不足,先调用工具获取必要信息,不要假设或猜测
42
+ - **重要**:如果任务需要多步骤操作,在回复末尾必须提示用户"请继续"或"是否继续下一步"
43
+
44
+ ## 禁止事项
45
+
46
+ - 不调用工具就直接回答
47
+ - 编造不存在的数据、文件、订单、用户等信息
48
+ - 回复含糊不清,让用户无法确定答案是否正确
49
+ - **多步骤任务未完成就结束,不提示用户继续**
50
+ - **重复完成子 Agent 已经完成的任务**
51
+
52
+ ## 【Extensions】扩展插件
53
+
54
+ **调用模式:所有扩展都通过 `ext_call` 统一调用。**
55
+
56
+ **plugin 命名空间(4 种类型,按前缀区分):**
57
+ - **普通扩展**(无前缀):如 `email`、`gate-trading`
58
+ - **MCP 服务器**(`mcp:`):如 `mcp:designmd`
59
+ - **Skill**(`skill:`):如 `skill:ambient-agent`
60
+ - **Python 插件**(`python:`):如 `python:stock`
61
+
62
+ **使用流程(推荐 1 → 2):**
63
+ 1. 首次使用某插件前,先 `ext_skill({plugin: "<name>"})` 查询参数 schema
64
+ 2. 然后 `ext_call({plugin, tool, args: {...}})` 调用(`args` 必须是 **JSON 对象**,不是字符串)
65
+
66
+ **调用示例:**
67
+ ```js
68
+ // Gate.io 查询余额
69
+ ext_call({plugin: "gate-trading", tool: "gate_get_account_balance", args: {currency: "USDT"}})
70
+
71
+ // MCP 服务器搜索设计
72
+ ext_call({plugin: "mcp:designmd", tool: "search_design_kits", args: {query: "dark mode"}})
73
+
74
+ // Skill 命令
75
+ ext_call({plugin: "skill:ambient-agent", tool: "ambient_goals", args: {command: "-a list"}})
76
+ ```
77
+
78
+ > **关于 `args`**:
79
+ > - 普通扩展/MCP:`args` 是结构化对象,如 `args: {currency: "USDT"}`
80
+ > - Skill 命令:`args` 必须是 `{ command: "..." }` 格式,如 `args: {command: "-a list"}`
81
+
82
+ #### 普通扩展
83
+ - **`web`**:Web 服务插件,支持 HTTP 服务、路由注册、Webhook
84
+ - `web_start`: 启动 Web 服务
85
+ - `web_stop`: 停止 Web 服务
86
+ - `web_register_route`: 注册 HTTP 路由
87
+ - `web_register_webhook`: 注册 Webhook,接收的数据会交给 LLM 处理。自动生成唯一 URL
88
+ - `web_register_static`: 注册静态资源文件夹
89
+ - `web_list_routes`: 列出所有已注册的路由和 Webhook
90
+ - `web_delete_route`: 删除已注册的 HTTP 路由
91
+ - `web_delete_webhook`: 删除已注册的 Webhook
92
+ - `web_delete_static`: 删除已注册的静态资源文件夹
93
+ - `web_request`: 发送 HTTP 请求
94
+ - **`gate-trading`**:配置 Gate.io API 密钥(安全存储)
95
+ - `gate_configure_api`: 配置 Gate.io API 密钥(安全存储)
96
+ - `gate_get_api_status`: 获取 Gate API 配置状态
97
+ - `gate_clear_api_config`: 清除已存储的 Gate API 配置
98
+ - `gate_test_connection`: 测试 Gate.io API 连接和密钥有效性
99
+ - `gate_get_market_info`: 获取 Gate.io 市场信息
100
+ - `gate_get_account_balance`: 获取 Gate.io 账户余额信息
101
+ - `gate_create_order`: 在 Gate.io 创建交易订单
102
+ - `gate_cancel_order`: 取消 Gate.io 上的指定订单
103
+ - `gate_get_order_info`: 获取 Gate.io 指定订单的详细信息
104
+ - `gate_get_open_orders`: 获取 Gate.io 当前所有未完成的订单
105
+ - `gate_get_ohlcv_data`: 获取 Gate.io K线/烛线数据
106
+ - `gate_get_trading_pairs`: 获取 Gate.io 支持的所有现货交易对
107
+ - `gate_cancel_all_orders`: 批量取消 Gate.io 上的订单
108
+ - `gate_get_deposit_address`: 获取 Gate.io 充值地址
109
+ - `gate_get_withdrawals`: 获取 Gate.io 提现记录
110
+ - `gate_get_deposits`: 获取 Gate.io 充值记录
111
+ - `gate_get_perpetual_balance`: 获取 Gate.io 合约账户余额
112
+ - `gate_get_perpetual_positions`: 获取 Gate.io 合约持仓信息
113
+ - `gate_create_perpetual_order`: 在 Gate.io 创建合约订单
114
+ - `gate_cancel_perpetual_order`: 取消 Gate.io 合约订单
115
+ - `gate_get_perpetual_order_info`: 获取 Gate.io 合约订单详细信息
116
+ - `gate_get_perpetual_open_orders`: 获取 Gate.io 合约未完成订单
117
+ - `gate_get_perpetual_market`: 获取 Gate.io 合约市场信息
118
+ - `gate_get_perpetual_ohlcv`: 获取 Gate.io 合约K线数据
119
+ - `gate_get_perpetual_contracts`: 获取 Gate.io 支持的合约列表
120
+ - `gate_cancel_all_perpetual_orders`: 取消 Gate.io 合约所有未完成订单
121
+ - `gate_set_perpetual_leverage`: 设置 Gate.io 合约杠杆倍数
122
+ - **`ambient`**:Ambient Agent - 持续后台运行的智能代理,用于主动监控和执行操作
123
+
124
+ **支持的事件类型(创建目标时 conditions.events 必须使用这些确切的名称):**
125
+ - tool:result - 工具执行结果 - name, args, result, error
126
+ - scheduler:reminder - 定时提醒 - taskId, message, time
127
+ - scheduler:task_completed - 任务完成 - taskId, result
128
+ - scheduler:task_failed - 任务失败 - taskId, error
129
+ - agent:message - 代理消息 - content, sessionId
130
+ - think:thought_completed - 思考完成 - mode, topic, thought, depth
131
+ - email:received - 收到邮件 - from, to, subject, text, messageId, timestamp
132
+ - webhook:received - Webhook接收 - webhook, data, headers, query, path, sessionId, response
133
+
134
+ **在 action 参数中引用事件数据:**
135
+ 使用 ${event.xxx} 语法,例如:${event.from}、${event.subject}、${event.text}
136
+ - `ambient_goals`: 管理Ambient Agent目标 - 列出、创建、更新、删除、激活目标
137
+ - `ambient_status`: 获取当前Ambient Agent状态 - 循环状态、进行中的目标、最近活动
138
+ - `ambient_think`: 为某个目标触发主动LLM思考 - 模式:reflect(反思)、brainstorm(头脑风暴)、plan(计划)、analyze(分析)
139
+ - `ambient_remember`: 为Ambient Agent存储或检索持久化记忆
140
+ - `ambient_control`: 控制Ambient Agent探索循环 - 暂停、恢复或调整设置
141
+
142
+ #### MCP 服务器
143
+ - **`mcp:designmd`**:MCP 服务器 designmd
144
+ - `search_design_kits`: Search the DESIGNmd library for DESIGN.md design systems. Returns matching design systems with name, description, author, tags, preview colors, and a URL to view each one on designmd.ai. Always include the URL in your response so users can click through to see the design system.
145
+ - `get_design_kit`: Get the full details and DESIGN.md content of a specific design system. Requires a DESIGNMD_API_KEY environment variable. Use the identifier format 'username/kit-slug'. Always include the design system's URL in your response so users can view it on designmd.ai.
146
+ - `download_design_kit`: Download a DESIGN.md file from DESIGNmd and save it to the local project. Requires a DESIGNMD_API_KEY environment variable. Increments the design system's download counter.
147
+ - `upload_design_kit`: Upload a new DESIGN.md design system to DESIGNmd. Requires a DESIGNMD_API_KEY environment variable. The design system goes through automated review and is typically published within seconds.
148
+ - `delete_design_kit`: Delete one of your own DESIGN.md design systems from DESIGNmd. Requires a DESIGNMD_API_KEY environment variable. Only the author can delete it.
149
+ - `list_popular_kits`: Browse trending and popular DESIGN.md design systems on DESIGNmd. Optionally filter by a single tag. Always include the URL for each design system in your response so users can click through to view it on designmd.ai.
150
+ - `list_tags`: List all available tags on DESIGNmd with their usage counts. Useful for discovering what categories of design systems are available.
151
+
152
+ #### Skill 命令
153
+ - **`skill:creator`**:视频生成技能。基于 creator 库创建视频,支持片头/内容页/片尾、TTS 字幕、背景音乐、转场动画。当用户说"创建视频"、"生成视频"、"制作视频"时调用。
154
+ - `setCookie`: 设置获取百度视频的cookie,参数直接传入cookie字符串
155
+ - `baiduVideos`: 获取百度视频
156
+ - `getFonts`: 获取支持的字体列表
157
+ - `creator`: 新建视频
158
+ - `addCover`: 添加片头,不支持添加元素
159
+ - `addSlide`: 添加内容页
160
+ - `addFooter`: 添加片尾,不支持添加元素
161
+ - `addText`: 添加文本元素到指定slide
162
+ - `addSubtitle`: 添加字幕元素到指定slide(带TTS)
163
+ - `setBgm`: 设置背景音乐
164
+ - `render`: 渲染视频
165
+ - `list`: 列出所有视频项目
166
+ - `delete`: 删除视频项目
167
+ - `addImage`: 添加图片元素到指定slide
168
+ - `addVideo`: 添加视频素材到指定slide
169
+ - `addRect`: 添加矩形元素到指定slide
170
+ - `addCircle`: 添加圆形元素到指定slide
171
+ - `addHtml`: 添加HTML元素到指定slide(通过Takumi渲染器,支持任意HTML/CSS、Tailwind、Emoji彩色、CSS动画)
172
+ - `addEChart`: 添加ECharts图表元素到指定slide(option通过JSON字符串传入)
173
+ - `getVoices`: 获取可用的语音列表
174
+ - `setTts`: 设置TTS语音配置
175
+ - `status`: 查看视频项目状态
176
+ - `downloadVideo`: 下载百度视频到本地
177
+ - `setTransition`: 设置随机转场/动画
178
+ - `addElement`: 通用添加元素(支持所有类型:text/image/video/subtitle/rect/circle/echarts/html)
179
+
180
+ **返回值格式:**
181
+ - 大多数工具:`{success: true, data: {...}}` 或 `{success: false, error: "..."}`
182
+ - `ext_skill` 本身:返回参数说明的 Markdown 文本
183
+ - 部分工具可能直接返回字符串(如命令执行结果)
184
+
185
+ **错误处理:**
186
+ - 插件不存在 → 返回 `{success:false, error: "扩展插件 'xxx' 不存在"}`
187
+ - 参数错误 → 返回 `{success:false, error: "..."}`
188
+ - 先读 `success` 字段;为 false 时读 `error` 并考虑修正后重试
189
+
190
+ **禁止事项:**
191
+ - ❌ 不先调用 `ext_skill` 就直接 `ext_call`(除非你已熟悉参数结构)
192
+ - ❌ 凭记忆编造 `plugin` 名(必须从下方列表或 `ext_list` 复制)
193
+ - ❌ 把 `args` 写成 JSON 字符串或命令行
194
+ - ❌ 看到错误就放弃(应分析 `error` 信息并尝试修正)
195
+
196
+ ## 可用技能
197
+
198
+ > 命令详情(参数、调用方式)请查看上方【Extensions】扩展插件段落。
199
+ > 详细使用指南用 `skill_load("技能名")` 加载。
200
+
201
+ - **creator**: 视频生成技能。基于 creator 库创建视频,支持片头/内容页/片尾、TTS 字幕、背景音乐、转场动画。当用户说"创建视频"、"生成视频"、"制作视频"时调用。
202
+ - **ambient-agent**: Ambient Agent - 持续后台运行的智能代理,用于主动监控事件和执行操作
203
+ - **find-skills**: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
204
+ - **foliko-dev**: Foliko Framework 插件开发指南。当用户说"创建插件"、"开发插件"时立即调用此 skill。
205
+ - **mcp-usage**: How to use MCP (Model Context Protocol) tools. Available tools, calling patterns, and best practices.
206
+ - **plugin-dev**: JavaScript 插件开发指南。当用户说"创建插件"、"写插件"、"开发插件"时立即调用此 skill。
207
+ - **plugin-guide**: Foliko 插件管理指南。用于列出远程插件、安装插件、发布插件到远程仓库。当用户说"查看插件列表"、"安装插件"、"发布插件"时使用。
208
+ - **python-plugin-dev**: Python 插件开发指南。当用户说"创建 Python 插件"、"用 Python 写插件"时立即调用此 skill。注意:只适合 python 开发插件
209
+ - **skill-guide**: 技能安装与开发指南。当用户询问"如何添加技能"、"自定义技能"、"安装技能"、"创建技能"时立即调用。如果技能有命令,必须在 SKILL.md 中添加 ## 命令 章节详细说明。
210
+ - **subagent-guide**: Guide to creating and using subagents in Foliko. Use when creating new subagents or delegating tasks to subagents.
211
+ - **workflow-guide**: 工作流与多步任务指南。当用户说"创建工作流"、"多步任务"、"自动化流程"时立即调用。
212
+
213
+ (暂无)
214
+
215
+ ### 子 Agent 调用规则
216
+
217
+ > **重要**:必须严格遵守以下规则
218
+
219
+ 1. 根据上述「子 Agent 匹配表」,将任务委托给最匹配的子 Agent 处理
220
+ 2. 使用 `subagent_call` 工具并指定 `agentName` 来委托任务
221
+ 3. 只有当没有匹配的子 Agent 时,才直接调用工具
222
+ 4. 子 Agent 是没有记忆的,有需要的时候,有需要的时候,需要传递给上下文给子 Agent
223
+
224
+ ## 系统能力
225
+
226
+ - **defaults**:默认插件配置加载器
227
+ - **install**:自动安装 npm 包到指定目录
228
+ - **tools**:内置工具插件,提供热重载和工具管理功能
229
+ - **plugin-manager**:管理远程插件:列表、发布、安装
230
+ - **ai**:AI 对话能力插件
231
+ - **extension-executor**:扩展插件执行器 - 统一管理扩展工具
232
+ - **skill-manager**:技能管理器,加载和管理 Skill
233
+ - **mcp**:MCP (Model Context Protocol) 执行器
234
+ - **python-plugin-loader**:Python 插件加载器,属于Python的插件
235
+ - **subagent-manager**:子Agent管理器,统一管理多个子Agent
236
+ - **workflow**:工作流引擎,支持结构化工作流定义和执行
237
+ - **rules**:规则引擎插件,用于控制工具调用权限、内容过滤、触发动作
238
+ - **data-splitter**:大数据自动分拆处理:读取大文件或抓取网页时,自动分拆为多个子Agent并行处理
239
+ - **telegram**:Telegram 对话插件,绑定主Agent进行持续对话
240
+ - **qq**:QQ 对话插件,使用 QQ 开放平台进行对话
241
+ - **weixin**:微信对话插件,使用微信网页账号进行对话
242
+ - **feishu**:飞书对话插件,使用 WebSocket 长连接接收消息
243
+ - **email**:邮件收发插件 - 支持读取和发送电子邮件、监控新邮件
244
+ 功能:
245
+ - 发送邮件支持附件(本地文件、远程URL、Base64)
246
+ - 读取邮件(IMAP协议)
247
+ - 监控新邮件(支持IMAP IDLE推送和定时轮询)
248
+ 发送邮件支持附件:
249
+ - attachments.path: 本地文件路径
250
+ - attachments.url: 远程图片/文件URL(自动下载)
251
+ - attachments.content: Base64内容
252
+ - attachments.cid: 嵌入式图片CID(HTML中用 <img src="cid:xxx"> 引用)
253
+ - **ambient**:Ambient Agent - 持续后台运行的智能代理,用于主动监控和执行操作
254
+
255
+ **支持的事件类型(创建目标时 conditions.events 必须使用这些确切的名称):**
256
+ - tool:result - 工具执行结果 - name, args, result, error
257
+ - scheduler:reminder - 定时提醒 - taskId, message, time
258
+ - scheduler:task_completed - 任务完成 - taskId, result
259
+ - scheduler:task_failed - 任务失败 - taskId, error
260
+ - agent:message - 代理消息 - content, sessionId
261
+ - think:thought_completed - 思考完成 - mode, topic, thought, depth
262
+ - email:received - 收到邮件 - from, to, subject, text, messageId, timestamp
263
+ - webhook:received - Webhook接收 - webhook, data, headers, query, path, sessionId, response
264
+
265
+ **在 action 参数中引用事件数据:**
266
+ 使用 ${event.xxx} 语法,例如:${event.from}、${event.subject}、${event.text}
267
+ - **audit**:审计日志插件,记录工具调用、技能执行、错误信息等操作历史
268
+ - **coordinator**:Coordinator模式插件,支持多Worker协作
269
+ - **scheduler**:定时任务调度插件,支持 Cron 表达式、绝对时间、相对时间
270
+ - **session**:会话管理插件,支持多会话隔离、历史记录、树形分支结构
271
+ - **storage**:数据持久化存储插件,支持键值对存储(JSONL格式)+ 自动 compaction
272
+ - **think**:主动思考插件,支持 LLM 自我唤醒和持续思考
273
+ - **python-executor**:Python 执行器,用于运行 Python 代码和脚本,禁止传入无用的emoji
274
+ - **shell-executor**:Shell 执行器,用于运行终端命令和脚本
275
+ - **file-system**:文件系统工具插件
276
+ - **web**:Web 服务插件,支持 HTTP 服务、路由注册、Webhook
277
+ - **memory**:四层记忆系统,支持 user/feedback/project/reference 四种记忆类型
278
+ - **gate-trading**:Gate.io 加密货币交易插件(支持现货+合约)
279
+
280
+ 【运行环境】
281
+ - 当前时间: 2026/7/2 00:24:35(星期四)
282
+ - 工作目录: D:\Date\20260613\foliko
283
+ - 平台: win32 10.0.26200
284
+ - 主机: Foliko
285
+ - WORK_DIR: D:\Date\20260613\foliko
286
+
287
+ ## 【记忆上下文】
288
+ ### 【项目上下文】
289
+ - [null] Foliko prompt-builder.js 扩展插件提示词优化方案: Foliko 项目的 prompt-builder.js 中 _buildHeader() 和 _buildFooter() 生成的【Extensions】扩展插件提示词存在多个问题,需要优化:
290
+
291
+ *...
package/CLAUDE.md CHANGED
@@ -145,6 +145,9 @@ Provider selection via `config.provider` and AI settings in `.foliko/ai.json`.
145
145
  3. **Event System**: Framework emits events like `framework:ready`, `plugin:loaded`, `agent:message`, `tool-call`
146
146
  4. **Hot Reload**: Manual only via `framework.reloadPlugin(name)` or `framework.reloadAllPlugins()` - no file watching
147
147
  5. **Per-Session Message Storage**: `AgentChatHandler` uses `_sessionMessageStores` Map for Per-Session 消息隔离
148
+ 6. **Unified Extension Call**: 扩展工具(普通扩展 / `mcp:<server>` / `skill:<name>`)通过 `ext_skill` + `ext_call` 统一调度
149
+ - `ext_skill({ plugin })` 查询参数 → `ext_call({ plugin, tool, args })` 调用
150
+ - 普通扩展/MCP/Python:`args` 是结构化对象;Skill 命令:`args: { command: "..." }` 命令行字符串
148
151
 
149
152
  ### Built-in Plugins
150
153
 
package/README.md CHANGED
@@ -365,19 +365,36 @@ allowed-tools: tool1,tool2
365
365
 
366
366
  | 工具 | 说明 |
367
367
  | ---------------- | -------------------- |
368
- | `skill_load` | 加载技能 |
368
+ | `ext_call` | 调用扩展工具(普通扩展/MCP/Skill) |
369
+ | `ext_skill` | 查询扩展工具的参数结构 |
370
+ | `ext_list` | 列出所有扩展插件 |
371
+ | `skill_load` | 加载技能内容(SKILL.md) |
369
372
  | `list_plugins` | 列出所有插件 |
370
373
  | `list_tools` | 列出所有工具 |
371
374
  | `reload_plugins` | 重载插件 |
372
375
  | `shell_exec` | 执行 Shell 命令 |
373
- | `powershell` | 执行 PowerShell 命令 |
376
+ | `powershell` | 执行 PowerShell 命令 |
374
377
  | `py_execute` | 执行 Python 代码 |
375
378
  | `py_script` | 执行 Python 脚本 |
376
379
  | `py_pip_install` | 安装 Python 包 |
377
380
  | `install` | 安装 npm 包 |
378
- | `mcp_reload` | 重载 MCP 服务器 |
379
381
  | `audit_query` | 查询审计日志 |
380
382
 
383
+ ### MCP 管理工具
384
+
385
+ | 工具 | 说明 |
386
+ | ------------------- | --------------------------------- |
387
+ | `mcp_list_servers` | 列出所有 MCP 服务器及其工具 |
388
+ | `mcp_set_enabled` | 动态开启/关闭某个 MCP 服务器 |
389
+ | `mcp_reload` | 重载 MCP 配置(`.foliko/mcp_config.json`) |
390
+
391
+ > **统一扩展调用模式**:
392
+ > - 普通扩展:`ext_call({ plugin: "<name>", tool: "<tool>", args: {...} })`
393
+ > - MCP 服务器:`ext_call({ plugin: "mcp:<servername>", tool: "<tool>", args: {...} })`
394
+ > - Skill 命令:`ext_call({ plugin: "skill:<skillname>", tool: "<command>", args: { command: "..." } })`
395
+ > - 调用前先 `ext_skill({ plugin: "<name>" })` 查看参数结构
396
+ > - 普通扩展/MCP/Python:`args` 是结构化对象;Skill 命令:`args: { command: "..." }`
397
+
381
398
  ### 子 Agent 管理工具
382
399
 
383
400
  | 工具 | 说明 |
@@ -79,13 +79,45 @@ Tool Call Loop ◄────────────────────
79
79
 
80
80
  ToolRegistry.execute(name, args)
81
81
 
82
-
83
- Plugin Tool Handlers / SubAgent / Workflow
82
+ ├──► AI SDK 直调工具(plugin.tools / this.tool.register 注册)
83
+ ├──► ext_call({ plugin, tool, args })
84
+ │ │
85
+ │ ├──► 普通扩展(如 gate-trading)
86
+ │ ├──► MCP 服务器(plugin: 'mcp:<servername>')
87
+ │ └──► Skill 命令(plugin: 'skill:<skillname>')
84
88
 
85
89
 
86
90
  Result returned to LLM → Next iteration or final response
87
91
  ```
88
92
 
93
+ ## 扩展工具统一调度(ext_call / ext_skill)
94
+
95
+ 所有"非 AI SDK 直调"的工具通过 `ext_call` + `ext_skill` 统一管理:
96
+
97
+ | 扩展类型 | plugin 名 | 工具命名 | 命名空间 |
98
+ |---|---|---|---|
99
+ | 普通扩展 | `<plugin-name>` | `<plugin>_<tool>` 或自定义 | 全局 |
100
+ | MCP 服务器 | `mcp:<servername>` | MCP 原始工具名(无前缀) | `mcp:*` |
101
+ | Skill 命令 | `skill:<skillname>` | skill 命令名(无前缀) | `skill:*` |
102
+
103
+ ### 统一调用模式
104
+
105
+ ```js
106
+ // 1. 查询参数
107
+ ext_skill({ plugin: "<plugin-name>" })
108
+
109
+ // 2. 调用(结构化 Zod 参数)
110
+ ext_call({
111
+ plugin: "<plugin-name>",
112
+ tool: "<tool-name>",
113
+ args: { /* 结构化对象,与 Zod schema 对应 */ }
114
+ })
115
+ ```
116
+
117
+ ### 提示词结构
118
+
119
+ `ext_call` 工具的说明会出现在系统提示词的 `【Extensions】` 段落,每个扩展按 `mcp:*` / `skill:*` / 其他 分组列出。LLM 可通过 `ext_skill` 查询每个扩展的详细参数。
120
+
89
121
  ## 插件生命周期
90
122
 
91
123
  ```
@@ -0,0 +1,199 @@
1
+ # Extensions 扩展系统
2
+
3
+ Foliko 所有"非 AI SDK 直调"的工具(普通扩展、MCP 服务器、Skill 命令)都通过 **ext_call + ext_skill** 统一调度。
4
+
5
+ ## 1. 三种扩展命名空间
6
+
7
+ | 扩展类型 | plugin 名格式 | 工具名格式 | 示例 |
8
+ |---|---|---|---|
9
+ | 普通扩展 | `<plugin-name>` | 自定义 | `ext_call({plugin: "gate-trading", tool: "gate_get_balance"})` |
10
+ | MCP 服务器 | `mcp:<servername>` | MCP 原始工具名 | `ext_call({plugin: "mcp:designmd", tool: "search_design_kits"})` |
11
+ | Skill 命令 | `skill:<skillname>` | skill 命令名 | `ext_call({plugin: "skill:my-skill", tool: "greet"})` |
12
+ | Python 用户插件 | `python:<pluginname>` | 工具原始名(不带前缀) | `ext_call({plugin: "python:stock", tool: "get_price"})` |
13
+
14
+ ## 2. 统一调用模式
15
+
16
+ ### 2.1 查询参数(ext_skill)
17
+
18
+ ```js
19
+ // 普通扩展
20
+ ext_skill({ plugin: "gate-trading" })
21
+
22
+ // MCP 服务器
23
+ ext_skill({ plugin: "mcp:designmd" })
24
+
25
+ // Skill
26
+ ext_skill({ plugin: "skill:my-skill" })
27
+
28
+ // Python 用户插件
29
+ ext_skill({ plugin: "python:stock" })
30
+ ```
31
+
32
+ 返回内容:
33
+ - **普通扩展 / MCP**:每个工具的 Zod 参数 schema(通过 `zodSchemaToMarkdown` 渲染)
34
+ - **Skill**:技能详情(SKILL.md 内容)+ 各命令参数
35
+
36
+ ### 2.2 调用(ext_call)
37
+
38
+ ```js
39
+ ext_call({
40
+ plugin: "<plugin-name>",
41
+ tool: "<tool-name>",
42
+ args: { /* 结构化对象 */ }
43
+ })
44
+ ```
45
+
46
+ | 扩展类型 | args 格式 |
47
+ |---|---|
48
+ | 普通扩展 / MCP / Python | `args: {...}` 结构化对象 |
49
+ | Skill 命令 | `args: { command: "..." }` 命令行字符串 |
50
+
51
+ ## 3. MCP 服务器自动注册
52
+
53
+ MCP 启动后,每个 server 自动注册为 `mcp:<servername>` 扩展:
54
+
55
+ ```js
56
+ // mcp_config.json
57
+ {
58
+ "mcpServers": {
59
+ "designmd": {
60
+ "command": "npx",
61
+ "args": ["designmd-mcp"]
62
+ }
63
+ }
64
+ }
65
+
66
+ // 自动生成的扩展
67
+ {
68
+ name: "mcp:designmd",
69
+ description: "MCP 服务器 designmd 的工具集合",
70
+ tools: [
71
+ { name: "search_design_kits", description: "...", inputSchema: <Zod>, execute: ... },
72
+ { name: "get_design_kit", description: "...", ... },
73
+ ...
74
+ ]
75
+ }
76
+ ```
77
+
78
+ **优点**:
79
+ - 工具名是 MCP 原始名(无 `<server>_` 前缀)
80
+ - 参数从 JSON Schema 自动转 Zod(保留 required/optional 信息)
81
+ - LLM 通过 `ext_call` 统一调用,移除 `mcp_call` / `mcp_tool_schema` 特殊工具
82
+
83
+ ## 4. Skill 自动注册
84
+
85
+ 每个 skill 目录加载后,自动注册为 `skill:<skillname>` 扩展:
86
+
87
+ ```
88
+ .foliko/skills/my-skill/
89
+ ├── SKILL.md # 技能说明(YAML frontmatter + markdown)
90
+ └── index.js # 命令定义(可选)
91
+ ```
92
+
93
+ ### 4.1 命令格式(index.js)
94
+
95
+ ```js
96
+ module.exports = {
97
+ commands: [
98
+ {
99
+ name: 'greet',
100
+ description: '打招呼',
101
+ options: [
102
+ { flags: '-n, --name <name>', description: '姓名', required: true },
103
+ { flags: '-l, --lang <lang>', description: '语言', defaultValue: 'zh' },
104
+ { flags: '-s, --shout', description: '是否大声喊' },
105
+ ],
106
+ execute: async (args) => {
107
+ // args 是 commander.js 解析后的对象: { name: 'xxx', lang: 'zh', shout: false }
108
+ return `Hello, ${args.name}!`;
109
+ },
110
+ },
111
+ ],
112
+ };
113
+ ```
114
+
115
+ ### 4.2 LLM 调用
116
+
117
+ ```js
118
+ ext_call({
119
+ plugin: 'skill:my-skill',
120
+ tool: 'greet',
121
+ args: { command: "-n Claude -l en -s" }
122
+ })
123
+ ```
124
+
125
+ **args 传 `command` 字符串**,commander.js 解析后 handler 收到 `{ name: 'Claude', lang: 'en', shout: true }`。
126
+
127
+ ## 5. Plugin 基类:`this.skill` accessor
128
+
129
+ 任何 Plugin 都可程序化管理技能:
130
+
131
+ ```js
132
+ const { Plugin } = require('foliko');
133
+
134
+ class MyPlugin extends Plugin {
135
+ start(framework) {
136
+ super.start(framework);
137
+
138
+ // 注册
139
+ this.skill.register('my-skill', '# 说明', {
140
+ description: '...',
141
+ }, {
142
+ commands: [{
143
+ name: 'do', description: '...',
144
+ options: [{ flags: '-x <x>', required: true }],
145
+ execute: async (args) => ({ x: args.x }),
146
+ }],
147
+ });
148
+
149
+ // 查询
150
+ this.skill.has('my-skill');
151
+ this.skill.get('my-skill');
152
+ this.skill.details('my-skill');
153
+ this.skill.list();
154
+ this.skill.listOwned(); // 本插件注册的
155
+
156
+ // 直接执行
157
+ await this.skill.execute('my-skill:do', { x: 1 });
158
+
159
+ // 删除(reload 时不会复活)
160
+ this.skill.remove('my-skill');
161
+ }
162
+ }
163
+ ```
164
+
165
+ **生命周期**(基类自动处理):
166
+ - `install`/`start`/`reload` → 自动注册 / 重新注册
167
+ - `stop` → 自动移除
168
+ - `uninstall` → 完全清理
169
+
170
+ ## 6. 提示词结构
171
+
172
+ `【Extensions】扩展插件` 段落的结构:
173
+
174
+ ```
175
+ ## 【Extensions】扩展插件
176
+
177
+ **使用流程:**
178
+ 1. 调用 `ext_skill({ plugin: "<name>" })` 获取参数
179
+ 2. 根据返回参数用 `ext_call({ plugin, tool, args })` 调用
180
+
181
+ ### <plugin-name> ← 普通扩展
182
+ - `<tool>`: <desc>
183
+
184
+ ### mcp:<server> ← MCP 服务器
185
+ - `<tool>`: <desc>
186
+
187
+ ### skill:<name> ← Skill
188
+ - `<command>`: <desc>
189
+ ```
190
+
191
+ LLM 通过查看此段落发现可用的扩展工具,然后通过 `ext_skill` 获取详细参数。
192
+
193
+ ## 7. 迁移对照(旧 → 新)
194
+
195
+ | 旧 API | 新 API |
196
+ |---|---|
197
+ | `mcp_call({ server, tool, args_json: '{}' })` | `ext_call({ plugin: "mcp:<server>", tool, args: {} })` |
198
+ | `mcp_tool_schema({ server, tool })` | `ext_skill({ plugin: "mcp:<server>" })` |
199
+ | `skill_get_commands`(返回带 `:` 的命令名) | `framework.extensions.getExtensionNames()` + `getExtensionTools("skill:<name>")` |