foliko 2.0.5 → 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 (65) hide show
  1. package/.claude/settings.local.json +4 -1
  2. package/.cli_default_systemPrompt.md +291 -0
  3. package/.editorconfig +56 -56
  4. package/.lintstagedrc +7 -7
  5. package/.prettierignore +29 -29
  6. package/.prettierrc +11 -11
  7. package/CLAUDE.md +3 -0
  8. package/Dockerfile +63 -63
  9. package/README.md +20 -3
  10. package/docs/architecture.md +34 -2
  11. package/docs/extensions.md +199 -0
  12. package/docs/migration.md +100 -0
  13. package/docs/public-api.md +280 -24
  14. package/docs/usage.md +122 -30
  15. package/install.ps1 +129 -129
  16. package/install.sh +121 -121
  17. package/package.json +1 -1
  18. package/plugins/core/audit/index.js +1 -1
  19. package/plugins/core/default/bootstrap.js +44 -19
  20. package/plugins/core/python-loader/index.js +43 -25
  21. package/plugins/core/skill-manager/PROMPT.md +6 -0
  22. package/plugins/core/skill-manager/index.js +402 -115
  23. package/plugins/core/sub-agent/PROMPT.md +10 -0
  24. package/plugins/core/sub-agent/index.js +36 -3
  25. package/plugins/core/think/index.js +1 -0
  26. package/plugins/core/workflow/index.js +82 -22
  27. package/plugins/executors/data-splitter/PROMPT.md +13 -0
  28. package/plugins/executors/data-splitter/index.js +5 -4
  29. package/plugins/executors/extension/extension-registry.js +145 -0
  30. package/plugins/executors/extension/index.js +405 -437
  31. package/plugins/executors/extension/prompt-builder.js +359 -0
  32. package/plugins/executors/extension/skill-helper.js +143 -0
  33. package/plugins/messaging/feishu/index.js +5 -3
  34. package/plugins/messaging/qq/index.js +6 -4
  35. package/plugins/messaging/telegram/index.js +6 -3
  36. package/plugins/messaging/weixin/index.js +5 -3
  37. package/plugins/tools/PROMPT.md +26 -0
  38. package/plugins/tools/index.js +6 -5
  39. package/skills/find-skills/SKILL.md +133 -133
  40. package/skills/foliko/AGENTS.md +196 -43
  41. package/skills/foliko/SKILL.md +157 -28
  42. package/skills/mcp/SKILL.md +77 -118
  43. package/skills/plugins/SKILL.md +89 -3
  44. package/skills/python/SKILL.md +57 -39
  45. package/skills/skill-guide/SKILL.md +42 -34
  46. package/skills/workflows/SKILL.md +224 -9
  47. package/skills/workflows/workflow-troubleshooting/SKILL.md +221 -281
  48. package/src/agent/chat.js +48 -27
  49. package/src/agent/main.js +34 -13
  50. package/src/agent/prompt-registry.js +56 -16
  51. package/src/agent/prompts/PROMPT.md +3 -0
  52. package/src/agent/sub.js +1 -1
  53. package/src/cli/ui/chat-ui-old.js +5 -2
  54. package/src/cli/ui/chat-ui.js +5 -2
  55. package/src/common/constants.js +12 -0
  56. package/src/common/error-capture.js +91 -0
  57. package/src/common/logger.js +2 -2
  58. package/src/context/compressor.js +6 -2
  59. package/src/executors/mcp-executor.js +105 -125
  60. package/src/framework/framework.js +23 -11
  61. package/src/index.js +4 -0
  62. package/src/plugin/base.js +908 -5
  63. package/src/plugin/manager.js +29 -8
  64. package/src/tool/schema.js +32 -9
  65. package/website/index.html +821 -0
@@ -341,28 +341,69 @@ module.exports = MyPlugin;
341
341
 
342
342
  ## 生命周期
343
343
 
344
- | 方法 | 调用时机 | 必须实现 |
345
- | ---------------------- | ---------- | -------- |
346
- | `install(framework)` | 插件安装时 | ✅ |
347
- | `start(framework)` | 插件启动时 | 推荐 |
348
- | `reload(framework)` | 热重载时 | 可选 |
349
- | `uninstall(framework)` | 卸载时 | 推荐 |
344
+ | 方法 | 调用时机 | 必须实现 | 说明 |
345
+ |------|----------|----------|------|
346
+ | `install(framework)` | 插件安装时 | ✅ | 初始化,获取 framework |
347
+ | `onStart(framework)` | start/enable/reload | 推荐 | 注册工具、扩展、子代理 |
348
+ | `onStop()` | disable 时 | 可选 | 清理资源 |
349
+ | `reload(framework)` | 热重载时 | 可选 | prompts 自动清理/注册 |
350
+ | `uninstall(framework)` | 卸载时 | 推荐 | 清理资源 |
351
+
352
+ ### onStart / onStop(推荐方式)
353
+
354
+ **推荐使用 `onStart` 注册工具和扩展**,基类自动处理生命周期:
355
+
356
+ ```javascript
357
+ class MyPlugin extends Plugin {
358
+ name = 'my-plugin';
359
+ version = '1.0.0';
360
+ description = '我的工具插件';
361
+
362
+ onStart(framework) {
363
+ // 注册 AI SDK 工具(直接调用)
364
+ this.tool.register({
365
+ name: 'hello',
366
+ description: '打招呼',
367
+ inputSchema: framework.z.object({
368
+ name: framework.z.string().describe('姓名')
369
+ }),
370
+ execute: async (args) => ({ message: `Hello, ${args.name}!` }),
371
+ });
372
+
373
+ // 注册扩展工具(通过 ext_call 调用)
374
+ this.extension.register({
375
+ name: 'greet',
376
+ description: '打招呼扩展',
377
+ inputSchema: framework.z.object({
378
+ name: framework.z.string()
379
+ }),
380
+ execute: async (args) => ({ message: `Hi, ${args.name}!` }),
381
+ });
382
+ }
383
+ }
384
+ ```
385
+
386
+ ### 生命周期自动管理
387
+
388
+ | 操作 | 效果 |
389
+ |------|------|
390
+ | `disable` | 自动移除工具/扩展(保留注册记录) |
391
+ | `enable` | 自动重新注册工具/扩展 |
392
+ | `reload` | 移除后重新注册 |
393
+ | `uninstall` | 移除并清空注册记录 |
350
394
 
351
395
  ---
352
396
 
353
397
  ## 注册工具
354
398
 
355
- ### 最新方式:定义在 `this.tools = {}`
399
+ ### 方式1:`this.tools = {}`(ExtensionExecutor 自动扫描)
356
400
 
357
- 插件将工具定义在 `this.tools = {}` 中,ExtensionExecutor 会自动扫描并注册到系统提示词:
401
+ 插件将工具定义在 `this.tools = {}` 中,ExtensionExecutor 会自动扫描并注册:
358
402
 
359
403
  ```javascript
360
404
  class MyPlugin extends Plugin {
361
- constructor(config = {}) {
362
- super();
363
- this.name = 'my-plugin';
364
- this.description = '我的工具插件';
365
- }
405
+ name = 'my-plugin';
406
+ description = '我的工具插件';
366
407
 
367
408
  tools = {
368
409
  my_tool: {
@@ -378,37 +419,125 @@ class MyPlugin extends Plugin {
378
419
  }
379
420
  ```
380
421
 
381
- ### 方式2:使用 `this.registerTool()`
422
+ ### 方式2:`this.tool.register()`(推荐)
382
423
 
383
- 支持两种调用格式:
424
+ 在 `onStart` 中使用,支持完整的生命周期管理:
384
425
 
385
426
  ```javascript
386
- install(framework) {
387
- const { z } = require('zod');
388
-
389
- // 方式1:分开传 name 和 def
390
- this.registerTool('my_tool', {
427
+ onStart(framework) {
428
+ this.tool.register({
429
+ name: 'my_tool',
391
430
  description: '我的工具',
392
- inputSchema: z.object({
393
- param: z.string().describe('参数描述')
431
+ inputSchema: framework.z.object({
432
+ param: framework.z.string().describe('参数描述')
394
433
  }),
395
434
  execute: async (args) => {
396
435
  return { success: true, result: args.param };
397
436
  }
398
437
  });
438
+ }
439
+ ```
399
440
 
400
- // 方式2:直接传对象(name 在对象中)
401
- this.registerTool({
402
- name: 'another_tool',
403
- description: '另一个工具',
404
- inputSchema: z.object({}),
441
+ ### 方式3:`this.registerTool()`(旧方式)
442
+
443
+ ```javascript
444
+ install(framework) {
445
+ this.registerTool('my_tool', {
446
+ description: '我的工具',
447
+ inputSchema: framework.z.object({
448
+ param: framework.z.string().describe('参数描述')
449
+ }),
405
450
  execute: async (args) => ({ success: true })
406
451
  });
407
-
408
452
  return this;
409
453
  }
410
454
  ```
411
455
 
456
+ ### 注册扩展工具
457
+
458
+ ```javascript
459
+ onStart(framework) {
460
+ this.extension.register({
461
+ name: 'my_ext_tool',
462
+ description: '扩展工具',
463
+ inputSchema: framework.z.object({
464
+ param: framework.z.string()
465
+ }),
466
+ execute: async (args) => ({ success: true })
467
+ });
468
+ }
469
+ ```
470
+
471
+ ---
472
+
473
+ ## 工具/扩展操作
474
+
475
+ ```javascript
476
+ // 注册
477
+ this.tool.register({ name: 'xxx', ... });
478
+ this.extension.register({ name: 'xxx', ... });
479
+
480
+ // 移除
481
+ this.tool.remove('xxx');
482
+ this.extension.remove('xxx');
483
+
484
+ // 执行
485
+ const r1 = await this.tool.execute('any-tool', { arg: 'value' }); // 执行任何已注册工具
486
+ const r2 = await this.extension.execute('xxx', { arg: 'value' }); // 执行当前插件的扩展
487
+ const r3 = await this.extension.execute('plugin-name', 'xxx', { arg: 'value' }); // 执行指定插件的扩展
488
+ ```
489
+
490
+ ## 工作流操作
491
+
492
+ ```javascript
493
+ // 注册工作流
494
+ this.workflow.register('my-workflow', {
495
+ name: 'my-workflow',
496
+ description: '我的工作流',
497
+ steps: [
498
+ { type: 'tool', tool: 'hello', args: {} }
499
+ ]
500
+ });
501
+
502
+ // 执行工作流
503
+ const result = await this.workflow.execute('my-workflow', { input: 'value' });
504
+
505
+ // 移除工作流
506
+ this.workflow.remove('my-workflow');
507
+ ```
508
+
509
+ ## 子代理操作
510
+
511
+ ```javascript
512
+ // 注册子代理
513
+ this.agent.register({
514
+ name: 'my-agent',
515
+ role: '助手',
516
+ goal: '描述',
517
+ tools: {},
518
+ parentTools: ['read_file', 'write_file']
519
+ });
520
+
521
+ // 获取子代理
522
+ const agent = this.agent.get('my-agent');
523
+
524
+ // 移除子代理
525
+ this.agent.remove('my-agent');
526
+ ```
527
+
528
+ ## Prompt 操作
529
+
530
+ ```javascript
531
+ // 注册 prompt
532
+ this.prompt.register('my-prompt', () => 'Prompt content', {
533
+ scope: 'global',
534
+ priority: 50
535
+ });
536
+
537
+ // 移除 prompt
538
+ this.prompt.remove('my-prompt');
539
+ ```
540
+
412
541
  ---
413
542
 
414
543
  ## 核心规则
@@ -1,200 +1,159 @@
1
1
  ---
2
2
  name: mcp-usage
3
3
  description: How to use MCP (Model Context Protocol) tools. Available tools, calling patterns, and best practices.
4
- allowed-tools: mcp_call, mcp_list_servers, mcp_tool_schema, mcp_reload, Read, Write, Edit, Glob, Grep, execute_command
4
+ allowed-tools: ext_skill, ext_call, mcp_reload, mcp_list_servers, mcp_set_enabled, Read, Write, Edit, Glob, Grep, execute_command
5
5
  ---
6
6
 
7
7
  # MCP Usage Guide
8
8
 
9
- > How to use MCP tools in this environment.
9
+ > MCP 工具已统一通过 `ext_call` / `ext_skill` 调用,每个 MCP 服务器自动注册为 `mcp:<servername>` 扩展。
10
10
 
11
11
  ---
12
12
 
13
- ## 1. Available Tools
13
+ ## 1. 核心概念
14
14
 
15
- ### mcp_list_servers
16
-
17
- 列出所有已连接的 MCP 服务器及其工具。
15
+ 每个 MCP 服务器(如 `designmd`、`fetch`)启动后会自动注册为扩展插件 `mcp:<servername>`。
16
+ 其原始工具直接挂在该扩展下,**无需 `mcp_call` 中转**。
18
17
 
19
18
  ```
20
- mcp_list_servers()
19
+ mcp:<servername>
20
+ ├── <tool1>: 描述...
21
+ ├── <tool2>: 描述...
22
+ └── <tool3>: 描述...
21
23
  ```
22
24
 
23
- 返回示例:
25
+ ## 2. 调用模式
24
26
 
25
- ```json
26
- {
27
- "success": true,
28
- "servers": [{ "name": "fetch", "tools": [{ "name": "fetch", "description": "..." }] }]
29
- }
30
- ```
31
-
32
- ### mcp_tool_schema
33
-
34
- 查询工具的完整参数结构,直接返回可复制的调用示例。
27
+ ### 2.1 标准三步走(推荐)
35
28
 
36
29
  ```
37
- mcp_tool_schema({ server: "服务器名", tool: "工具名" })
30
+ // 1. 查询参数说明
31
+ ext_skill({ plugin: "mcp:<servername>" })
32
+
33
+ // 2. 根据返回的参数定义调用
34
+ ext_call({
35
+ plugin: "mcp:<servername>",
36
+ tool: "<tool_name>",
37
+ args: { "参数名": "参数值", ... }
38
+ })
38
39
  ```
39
40
 
40
- 返回示例:
41
+ ### 2.2 简单调用(已知参数)
41
42
 
42
- ```json
43
- {
44
- "success": true,
45
- "result": {
46
- "name": "fetch",
47
- "description": "Fetches a URL from the internet...",
48
- "required": ["url"],
49
- "example": "{\"url\": \"https://example.com\"}",
50
- "fullExample": "mcp_call({ server: \"fetch\", tool: \"fetch\", args_json: '{\"url\": \"https://...\"}' })"
51
- }
52
- }
43
+ ```
44
+ ext_call({
45
+ plugin: "mcp:designmd",
46
+ tool: "search_design_kits",
47
+ args: { query: "dark", limit: 5 }
48
+ })
53
49
  ```
54
50
 
55
- ### mcp_call
56
-
57
- 调用 MCP 服务器的工具。
51
+ ### 2.3 嵌套参数
58
52
 
59
53
  ```
60
- mcp_call({
61
- server: "服务器名",
62
- tool: "工具名",
63
- args_json: '{"参数名": "参数值"}'
54
+ ext_call({
55
+ plugin: "mcp:designmd",
56
+ tool: "search_design_kits",
57
+ args: {
58
+ query: "minimal",
59
+ tags: ["dark", "saas"],
60
+ sort: "trending",
61
+ limit: 10
62
+ }
64
63
  })
65
64
  ```
66
65
 
67
- **重要**:
66
+ ---
68
67
 
69
- - `args_json` 必须是有效的 JSON 字符串
70
- - 必填参数不能为空
71
- - 如果不知道参数结构,先用 `mcp_tool_schema` 查询
68
+ ## 3. 管理工具
72
69
 
73
- ### mcp_reload
70
+ ### mcp_list_servers
74
71
 
75
- 重新加载 MCP 配置。当 `.foliko/mcp_config.json` 修改后使用。
72
+ 列出所有 MCP 服务器及其连接状态。
76
73
 
77
74
  ```
78
- mcp_reload()
75
+ mcp_list_servers()
79
76
  ```
80
77
 
81
- ---
82
-
83
- ## 2. Calling Patterns
78
+ ### mcp_reload
84
79
 
85
- ### 简单参数调用
80
+ 重新加载 `.foliko/mcp_config.json` 配置。
86
81
 
87
- ```javascript
88
- // 调用 fetch 工具获取网页
89
- mcp_call({
90
- server: 'fetch',
91
- tool: 'fetch',
92
- args_json: '{"url": "https://news.baidu.com"}',
93
- });
94
82
  ```
95
-
96
- ### 多个参数调用
97
-
98
- ```javascript
99
- // 调用搜索工具
100
- mcp_call({
101
- server: 'bing-cn-mcp-server',
102
- tool: 'bing_search',
103
- args_json: '{"query": "关键词", "count": 10}',
104
- });
83
+ mcp_reload()
105
84
  ```
106
85
 
107
- ### 复杂参数调用
108
-
109
- 对于复杂参数(嵌套对象、数组等):
86
+ ### mcp_set_enabled
110
87
 
111
- 1. 先查询参数结构:
88
+ 动态开启/关闭某个 MCP 服务器(关闭时对应的 `mcp:<server>` 扩展也会注销)。
112
89
 
113
90
  ```
114
- mcp_tool_schema({ server: "服务器", tool: "工具" })
91
+ mcp_set_enabled({ server: "designmd", enabled: false })
115
92
  ```
116
93
 
117
- 2. 根据返回的 `example` 或 `fullExample` 构造调用
118
-
119
94
  ---
120
95
 
121
- ## 3. Error Handling
122
-
123
- ### 参数为空
96
+ ## 4. 错误处理
124
97
 
125
- 如果忘记传参数,会返回错误:
98
+ ### 插件不存在
126
99
 
127
100
  ```json
128
- {
129
- "success": false,
130
- "error": "参数为空!必须提供: url",
131
- "hint": "正确格式: {\"url\": \"具体值\"}"
132
- }
101
+ { "success": false, "error": "扩展插件 'mcp:foo' 不存在" }
133
102
  ```
134
103
 
135
- ### 参数格式错误
104
+ 先调用 `mcp_list_servers()` 确认服务器名是否正确
136
105
 
137
- 如果 JSON 格式不正确:
106
+ ### 参数缺失或类型错误
138
107
 
139
- ```json
140
- {
141
- "success": false,
142
- "error": "args_json 格式错误,不是有效的 JSON"
143
- }
144
- ```
108
+ → 调用 `ext_skill({ plugin: "mcp:<server>" })` 查看参数定义
145
109
 
146
- ### 服务器不存在
110
+ ### 服务器连接失败
147
111
 
148
- ```json
149
- {
150
- "success": false,
151
- "error": "MCP server 'xxx' not found"
152
- }
153
- ```
112
+ → 检查 `.foliko/mcp_config.json` 配置,或调用 `mcp_reload()` 重试
154
113
 
155
114
  ---
156
115
 
157
- ## 4. Configuration
116
+ ## 5. 配置
158
117
 
159
118
  MCP 服务器配置在 `.foliko/mcp_config.json`:
160
119
 
161
120
  ```json
162
121
  {
163
122
  "mcpServers": {
164
- "服务器名": {
165
- "type": "sse",
166
- "url": "https://...",
167
- "headers": {
168
- "Authorization": "Bearer xxx"
169
- }
123
+ "designmd": {
124
+ "enabled": true,
125
+ "command": "npx",
126
+ "args": ["designmd-mcp"],
127
+ "env": { "DESIGNMD_API_KEY": "xxx" }
170
128
  }
171
129
  }
172
130
  }
173
131
  ```
174
132
 
175
- 添加或修改配置后,调用 `mcp_reload()` 重载。
133
+ `enabled: false` 的服务器不会自动连接;可通过 `mcp_set_enabled` 动态开启。
176
134
 
177
135
  ---
178
136
 
179
- ## 5. Best Practices
137
+ ## 6. Best Practices
180
138
 
181
- - [ ] 不知道参数时,先用 `mcp_tool_schema` 查询
182
- - [ ] `args_json` 必须是有效的 JSON 字符串(用单引号包裹整个 JSON)
183
- - [ ] 必填参数必须提供
139
+ - [ ] 不确定参数时先调用 `ext_skill({ plugin: "mcp:<server>" })`
140
+ - [ ] 参数值遵守 JSON 格式(注意引号)
184
141
  - [ ] 修改配置后用 `mcp_reload()` 重载
185
- - [ ] 使用前先 `mcp_list_servers` 查看可用服务器
142
+ - [ ] 调用前可先 `mcp_list_servers()` 确认服务器状态
143
+ - [ ] args 直接传对象,不要序列化成字符串
186
144
 
187
145
  ---
188
146
 
189
- ## 6. Quick Reference
147
+ ## 7. Quick Reference
190
148
 
191
- | 场景 | 操作 |
192
- | -------------- | ------------------------------------------------------- |
193
- | 查看可用服务器 | `mcp_list_servers()` |
194
- | 查询参数结构 | `mcp_tool_schema({ server: "x", tool: "y" })` |
195
- | 调用工具 | `mcp_call({ server: "x", tool: "y", args_json: '{}' })` |
196
- | 重载配置 | `mcp_reload()` |
149
+ | 场景 | 操作 |
150
+ | -------------- | ---------------------------------------------------------- |
151
+ | 查看服务器列表 | `mcp_list_servers()` |
152
+ | 查询参数说明 | `ext_skill({ plugin: "mcp:<server>" })` |
153
+ | 调用工具 | `ext_call({ plugin: "mcp:<server>", tool: "x", args: {} })` |
154
+ | 重载配置 | `mcp_reload()` |
155
+ | 启停服务器 | `mcp_set_enabled({ server: "x", enabled: true })` |
197
156
 
198
157
  ---
199
158
 
200
- > **Tip:** 当工具调用失败时,仔细阅读错误信息,它会告诉你缺少什么参数或格式问题。
159
+ > **Tip:** MCP 工具的 `args` 是普通对象,不需要像旧版那样序列化成 JSON 字符串。
@@ -15,13 +15,99 @@ Foliko 支持两种插件开发方式:
15
15
  | **function(foliko)** | `module.exports = function(foliko) {}` | `.foliko/plugins/*.js` |
16
16
  | **类式插件** | `class MyPlugin extends Plugin {}` | `.foliko/plugins/*/index.js` |
17
17
 
18
- 推荐使用 **function(foliko)** 方式,更简洁直观。
18
+ **推荐使用类式插件**,支持更完善的生命周期管理(disable/enable 时自动处理工具/扩展)。
19
19
 
20
20
  ---
21
21
 
22
- ## 快速开始
22
+ ## 快速开始 - 类式插件(推荐)
23
23
 
24
- 创建 `.foliko/plugins/my-plugin.js`:
24
+ 创建 `.foliko/plugins/my-plugin/index.js`:
25
+
26
+ ```javascript
27
+ const { Plugin } = require('foliko');
28
+
29
+ class MyPlugin extends Plugin {
30
+ name = 'my-plugin';
31
+ version = '1.0.0';
32
+ description = '我的插件';
33
+
34
+ onStart(framework) {
35
+ // 注册 AI SDK 工具(直接调用)
36
+ this.tool.register({
37
+ name: 'hello',
38
+ description: '打招呼',
39
+ inputSchema: framework.z.object({
40
+ name: framework.z.string().describe('姓名')
41
+ }),
42
+ execute: async (args) => ({ message: `Hello, ${args.name}!` }),
43
+ });
44
+
45
+ // 注册扩展工具(通过 ext_call 调用)
46
+ this.extension.register({
47
+ name: 'greet',
48
+ description: '打招呼扩展',
49
+ inputSchema: framework.z.object({
50
+ name: framework.z.string()
51
+ }),
52
+ execute: async (args) => ({ message: `Hi, ${args.name}!` }),
53
+ });
54
+ }
55
+ }
56
+
57
+ module.exports = MyPlugin;
58
+ ```
59
+
60
+ ### 类式插件生命周期
61
+
62
+ | 方法 | 调用时机 | 用途 |
63
+ |------|----------|------|
64
+ | `onStart(framework)` | start/enable/reload | 注册工具、扩展、子代理 |
65
+ | `onStop()` | disable | 清理资源(工具/扩展基类自动处理) |
66
+ | `onCwdChanged(oldCwd, newCwd, framework)` | 工作目录变更 | 更新资源路径 |
67
+
68
+ ### 工具/扩展自动管理
69
+
70
+ | 操作 | 效果 |
71
+ |------|------|
72
+ | `disable` | 自动移除工具/扩展(保留注册记录) |
73
+ | `enable` | 自动重新注册工具/扩展 |
74
+ | `reload` | 移除后重新注册 |
75
+ | `uninstall` | 移除并清空注册记录 |
76
+
77
+ ### 手动操作
78
+
79
+ ```javascript
80
+ // 注册
81
+ this.tool.register({ name: 'xxx', ... });
82
+ this.extension.register({ name: 'xxx', ... });
83
+
84
+ // 移除
85
+ this.tool.remove('xxx');
86
+ this.extension.remove('xxx');
87
+
88
+ // 执行
89
+ const r1 = await this.tool.execute('any-tool', { arg: 'value' }); // 执行任何已注册工具
90
+ const r2 = await this.extension.execute('xxx', { arg: 'value' }); // 执行当前插件的扩展
91
+ const r3 = await this.extension.execute('plugin-name', 'xxx', { arg: 'value' }); // 执行指定插件的扩展
92
+
93
+ // 工作流
94
+ this.workflow.register('my-workflow', { name: 'my-workflow', steps: [...] });
95
+ const result = await this.workflow.execute('my-workflow', { input: 'value' });
96
+ this.workflow.remove('my-workflow');
97
+
98
+ // 子代理
99
+ this.agent.register({ name: 'my-agent', role: '助手', goal: '描述' });
100
+ const agent = this.agent.get('my-agent');
101
+ this.agent.remove('my-agent');
102
+
103
+ // Prompt
104
+ this.prompt.register('my-prompt', () => 'content', { scope: 'global' });
105
+ this.prompt.remove('my-prompt');
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 快速开始 - function(foliko)
25
111
 
26
112
  ```javascript
27
113
  /**