foliko 1.1.29 → 1.1.30

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.
@@ -176,5 +176,13 @@
176
176
  "web": {
177
177
  "enabled": true,
178
178
  "config": {}
179
+ },
180
+ "weixin": {
181
+ "enabled": false,
182
+ "config": {
183
+ "forceLogin": false,
184
+ "qrcodeTerminal": true,
185
+ "allowedUsers": []
186
+ }
179
187
  }
180
188
  }
@@ -577,6 +577,154 @@
577
577
  "text": "<think>\n两者返回结果完全一致。所以 `mcp_call` 和 `ext_call` 功能是等价的,参数格式略有不同:\n- `mcp_call`: `args_json` 是 JSON 字符串\n- `ext_call`: `args` 是对象\n\n用户说得有道理,从功能上看:\n1. `mcp_call` = `ext_call`(功能完全一样,只是参数格式不同)\n2. `mcp_tool_schema` ≠ `ext_skill`(提供额外信息)\n\n所以:\n- `mcp_call` 可能可以不要\n- `mcp_tool_schema` 保留有价值\n\n但从设计角度,这些工具可能保留了是为了:\n1. **兼容性** - 历史代码可能依赖这些接口\n2. **用户习惯** - MCP 用户可能更熟悉这些专用接口\n3. **简化认知** - 新用户看到 `mcp_call` 就知道是调用 MCP,不需要知道\"mcp\"是一个 plugin\n</think>\n\n**两种调用结果完全一致!** 返回值相同。\n\n## 总结\n\n| 工具对比 | 功能差异 | 是否冗余 |\n|---------|---------|---------|\n| `mcp_call` vs `ext_call` | **功能相同**,只是参数格式不同 (`args_json` vs `args`) | **可以合并** |\n| `mcp_tool_schema` vs `ext_skill` | `mcp_tool_schema` 多返回 **详细参数描述 + 调用示例** | **有价值,保留** |\n\n---\n\n## 你的判断是对的\n\n从纯功能角度:\n\n```\next_call (plugin: \"mcp\", tool: \"fetch_fetch\", args: {...})\n```\n\n完全可以替代:\n\n```\nmcp_call (server: \"fetch\", tool: \"fetch\", args_json: \"...\")\n```\n\n保留 `mcp_call` 和 `mcp_tool_schema` 的可能原因:\n\n1. **历史兼容性** - 早期可能没有 `ext_call`,后来才统一\n2. **用户友好** - MCP 用户不需要知道\"mcp\"是插件的概念\n3. **渐进式设计** - 先有专用工具,后有统一抽象\n\n这是软件设计中常见的**统一抽象 vs 专用接口**的权衡。"
578
578
  }
579
579
  ]
580
+ },
581
+ {
582
+ "role": "user",
583
+ "content": "开启微信插件"
584
+ },
585
+ {
586
+ "role": "assistant",
587
+ "content": [
588
+ {
589
+ "type": "text",
590
+ "text": "<think>\n用户想要开启微信插件。我需要先看看系统中有哪些插件可用,然后尝试启用微信插件。\n\n让我先列出所有插件看看有没有微信插件。\n</think>\n\n\n"
591
+ },
592
+ {
593
+ "type": "tool-call",
594
+ "toolCallId": "call_function_0t3vrz6rz63a_1",
595
+ "toolName": "list_plugins",
596
+ "input": {}
597
+ }
598
+ ]
599
+ },
600
+ {
601
+ "role": "tool",
602
+ "content": [
603
+ {
604
+ "type": "tool-result",
605
+ "toolCallId": "call_function_0t3vrz6rz63a_1",
606
+ "toolName": "list_plugins",
607
+ "output": {
608
+ "type": "text",
609
+ "value": "{\"success\":true,\"plugins\":[{\"name\":\"defaults\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"install\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"ai\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"skill-manager\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"mcp\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"python-plugin-loader\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"subagent-manager\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":false},{\"name\":\"marknative\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.1\",\"system\":false},{\"name\":\"poster\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.2.2\",\"system\":false},{\"name\":\"ambient\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"audit\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"coordinator\",\"status\":\"registered\",\"enabled\":false,\"version\":\"1.0.0\",\"system\":false},{\"name\":\"email\",\"status\":\"registered\",\"enabled\":false,\"version\":\"1.1.0\",\"system\":false},{\"name\":\"extension-executor\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"feishu\",\"status\":\"registered\",\"enabled\":false,\"version\":\"1.1.0\",\"system\":false},{\"name\":\"file-system\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"gate-trading\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.1.0\",\"system\":false},{\"name\":\"memory\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"plugin_manager\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"python-executor\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"rules\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"scheduler\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"session\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"shell-executor\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"storage\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"telegram\",\"status\":\"registered\",\"enabled\":false,\"version\":\"2.1.0\",\"system\":false},{\"name\":\"think\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":false},{\"name\":\"tools\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"1.0.0\",\"system\":true},{\"name\":\"web\",\"status\":\"loaded\",\"enabled\":true,\"version\":\"3.1.0\",\"system\":true},{\"name\":\"weixin\",\"status\":\"registered\",\"enabled\":false,\"version\":\"1.0.0\",\"system\":false}]}"
610
+ }
611
+ }
612
+ ]
613
+ },
614
+ {
615
+ "role": "assistant",
616
+ "content": [
617
+ {
618
+ "type": "text",
619
+ "text": "<think>\n找到了!有一个 `weixin` 插件,状态是 \"registered\",但 `enabled` 是 false。我需要启用它。\n</think>\n\n找到 `weixin` 插件,当前状态是 **未启用**。现在启用它:\n"
620
+ },
621
+ {
622
+ "type": "tool-call",
623
+ "toolCallId": "call_function_g5my4jexcoyu_1",
624
+ "toolName": "enable_plugin",
625
+ "input": {
626
+ "name": "weixin"
627
+ }
628
+ }
629
+ ]
630
+ },
631
+ {
632
+ "role": "tool",
633
+ "content": [
634
+ {
635
+ "type": "tool-result",
636
+ "toolCallId": "call_function_g5my4jexcoyu_1",
637
+ "toolName": "enable_plugin",
638
+ "output": {
639
+ "type": "text",
640
+ "value": "{\"success\":true,\"message\":\"插件 'weixin' 已启用\"}"
641
+ }
642
+ }
643
+ ]
644
+ },
645
+ {
646
+ "role": "assistant",
647
+ "content": [
648
+ {
649
+ "type": "text",
650
+ "text": "<think>\n微信插件已经成功启用。让我再列出所有插件确认一下状态。\n</think>\n\n微信插件已启用 ✅\n\n| 插件名 | 状态 | enabled |\n|-------|------|---------|\n| weixin | registered → loaded | ✅ true |\n\n让我验证一下微信插件的工具是否可用:\n"
651
+ },
652
+ {
653
+ "type": "tool-call",
654
+ "toolCallId": "call_function_oxtqanooji4s_1",
655
+ "toolName": "ext_skill",
656
+ "input": {
657
+ "plugin": "weixin"
658
+ }
659
+ }
660
+ ]
661
+ },
662
+ {
663
+ "role": "tool",
664
+ "content": [
665
+ {
666
+ "type": "tool-result",
667
+ "toolCallId": "call_function_oxtqanooji4s_1",
668
+ "toolName": "ext_skill",
669
+ "output": {
670
+ "type": "text",
671
+ "value": "你可以通过 `ext_call` 工具调用以下扩展插件的功能。\n\n### 调用规则\n\n> **重要**:\n> 1. 调用前必须指定 `plugin`(插件名)和 `tool`(工具名)\n> 2. 参数通过 `args` 对象传入,参数名和类型见各工具说明,注意引号的问题,遵守JSON的格式\n> 3. 必填参数(Required)必须提供,可选参数(Optional)可省略\n\n---\n\n#### `weixin_send_message`\n\n发送文本消息到微信(发给登录的账号)\n\n**参数:**\n \n- message: 要发送的文本内容\n - String\n\n \n#### `weixin_send_image`\n\n发送图片到微信(发给登录的账号)\n\n**参数:**\n \n- imagePath: 本地图片文件路径\n - String\n\n \n#### `weixin_send_file`\n\n发送文件到微信(发给登录的账号)\n\n**参数:**\n \n- filePath: 本地文件路径\n - String\n- fileName: 文件名(可选,默认从路径推断)\n - Optional\n - String\n\n \n#### `weixin_send_video`\n\n发送视频到微信(发给登录的账号)\n\n**参数:**\n \n- videoPath: 本地视频文件路径\n - String\n- playLength: 视频时长(秒)\n - Optional\n - Number\n\n \n#### `weixin_send_voice`\n\n发送语音到微信(发给登录的账号,silk格式)\n\n**参数:**\n \n- voicePath: 本地语音文件路径(silk格式)\n - String\n\n \n"
672
+ }
673
+ }
674
+ ]
675
+ },
676
+ {
677
+ "role": "assistant",
678
+ "content": [
679
+ {
680
+ "type": "text",
681
+ "text": "<think>\n微信插件已经成功启用,并提供了以下工具:\n1. weixin_send_message - 发送文本消息\n2. weixin_send_image - 发送图片\n3. weixin_send_file - 发送文件\n4. weixin_send_video - 发送视频\n5. weixin_send_voice - 发送语音\n\n不过,微信插件需要微信网页版登录才能使用。用户可能需要配置一下才能使用。\n</think>\n\n微信插件已成功启用!可用工具:\n\n| 工具名 | 描述 | 参数 |\n|-------|------|------|\n| `weixin_send_message` | 发送文本消息 | `message: String` |\n| `weixin_send_image` | 发送图片 | `imagePath: String` |\n| `weixin_send_file` | 发送文件 | `filePath: String`, `fileName?: String` |\n| `weixin_send_video` | 发送视频 | `videoPath: String`, `playLength?: Number` |\n| `weixin_send_voice` | 发送语音 | `voicePath: String (silk格式)` |\n\n> ⚠️ **注意**:微信插件需要微信网页版已登录状态才能使用。如果需要配置,请告诉我。"
682
+ }
683
+ ]
684
+ },
685
+ {
686
+ "role": "user",
687
+ "content": "关闭微信插件"
688
+ },
689
+ {
690
+ "role": "assistant",
691
+ "content": [
692
+ {
693
+ "type": "text",
694
+ "text": "<think>\n用户想要关闭微信插件,我直接调用 disable_plugin 工具即可。\n</think>\n\n\n"
695
+ },
696
+ {
697
+ "type": "tool-call",
698
+ "toolCallId": "call_function_9t9a2kjw93ds_1",
699
+ "toolName": "disable_plugin",
700
+ "input": {
701
+ "name": "weixin"
702
+ }
703
+ }
704
+ ]
705
+ },
706
+ {
707
+ "role": "tool",
708
+ "content": [
709
+ {
710
+ "type": "tool-result",
711
+ "toolCallId": "call_function_9t9a2kjw93ds_1",
712
+ "toolName": "disable_plugin",
713
+ "output": {
714
+ "type": "text",
715
+ "value": "{\"success\":true,\"message\":\"插件 'weixin' 已禁用\"}"
716
+ }
717
+ }
718
+ ]
719
+ },
720
+ {
721
+ "role": "assistant",
722
+ "content": [
723
+ {
724
+ "type": "text",
725
+ "text": "<think>\n微信插件已成功禁用。\n</think>\n\n微信插件已禁用 ✅"
726
+ }
727
+ ]
580
728
  }
581
729
  ],
582
730
  "variables": {},
@@ -0,0 +1,25 @@
1
+ {
2
+ "sessionId": "weixin_o9cq80zgZqKPA2-s59PN43GdDy1w@im.wechat",
3
+ "messages": [
4
+ {
5
+ "role": "user",
6
+ "content": "你好"
7
+ },
8
+ {
9
+ "role": "assistant",
10
+ "content": [
11
+ {
12
+ "type": "text",
13
+ "text": "<think>\n用户只是打了个招呼说\"你好\",这是一个简单的问候。根据响应规范,我应该直接给出结论或结果,不需要调用工具,因为这是一个纯粹的对话问候,不需要获取信息或执行操作。\n\n我会简单友好地回应用户的问候。\n</think>\n\n你好!有什么我可以帮助你的吗?"
14
+ }
15
+ ]
16
+ }
17
+ ],
18
+ "variables": {},
19
+ "metadata": {
20
+ "createdAt": 1776492342359,
21
+ "lastActive": 1776492342359,
22
+ "messageCount": 0,
23
+ "compressionCount": 0
24
+ }
25
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foliko",
3
- "version": "1.1.29",
3
+ "version": "1.1.30",
4
4
  "description": "简约的插件化 Agent 框架",
5
5
  "main": "src/index.js",
6
6
  "type": "commonjs",
@@ -603,7 +603,7 @@ class AgentChatHandler extends EventEmitter {
603
603
 
604
604
  // 刷新系统提示词
605
605
  this._systemPrompt = this.agent._buildSystemPrompt();
606
- await fs.writeFile('system.md',this._systemPrompt)
606
+ //await fs.writeFile('system.md',this._systemPrompt)
607
607
  // 添加用户消息
608
608
  const userMessage = typeof message === 'string' ? { role: 'user', content: message } : message;
609
609