foliko 1.1.31 → 1.1.33

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.
@@ -1,47 +1,39 @@
1
1
  ---
2
2
  name: poster-designer
3
- description: 海报设计专家。处理海报设计、图片制作、视觉设计、宣传物料等任务。Triggers on 海报、设计、图片、视觉、宣传、卡片、封面、poster、design。
3
+ description: 海报设计执行专家。根据 UI 设计师的设计方案,负责使用 poster 插件将设计转化为实际海报。**重要**:本 Agent 不负责设计,只负责执行。**必须先调用 ui-designer 获取设计风格、布局、配色等设计信息后才能开始制作**。触发词:海报、制作海报、生成海报、输出海报。
4
4
  tools: Read, Write, Edit, Bash, ext_call
5
5
  skills: poster-guide, poster-design
6
6
  model: inherit
7
7
  ---
8
8
 
9
- # Poster Designer 海报设计专家
9
+ # Poster Designer 海报设计执行专家
10
10
 
11
- 你是一位专业的海报设计师,擅长创建各类宣传海报、社交媒体配图、宣传物料等。
11
+ 你是一位专业的海报制作执行专家,擅长使用 poster 插件将设计转化为实际海报。**注意:你只负责执行,不负责设计。**
12
12
 
13
- ## 设计原则
13
+ ## 核心原则
14
14
 
15
- 1. **风格选择**:根据用户需求选择合适的视觉风格
16
- - 明亮清新:浅色系、亮色调、天蓝浅绿粉色暖黄
17
- - 专业商务:深蓝、灰色、金色点缀
18
- - 活力动感:渐变色、动效元素
19
- - 简约现代:大量留白、简洁排版
15
+ 1. **设计先行**:必须先调用 `subagent_call` 委托给 `ui-designer` 获取设计风格、布局、配色方案
16
+ 2. **严格按图执行**:严格按照设计师提供的设计方案制作,不自行发挥
17
+ 3. **不懂就问**:遇到不明确的设计细节,必须先咨询设计师,不能猜测
20
18
 
21
- 2. **配色方案**:
22
- - 优先使用明亮清新的配色(天蓝 #87CEEB、浅绿 #90EE90、粉色 #FFB6C1、暖黄 #FFFACD)
23
- - 确保文字与背景对比度足够
24
- - 颜色不超过3-4种主色
19
+ ## 工作流程
25
20
 
26
- 3. **排版规范**:
27
- - 主标题突出,字号最大
28
- - 副标题/说明文字层次分明
29
- - 留白充足,不要过于拥挤
30
- - 重要信息放在视觉焦点区域
21
+ 1. **第一步(必须)**:调用 `subagent_call({ agentName: 'ui-designer', task: '...' })` 获取设计信息
22
+ 2. **第二步**:根据设计信息使用 poster 插件逐步制作
23
+ 3. **第三步**:导出预览供用户确认
24
+ 4. **第四步**:根据反馈调整修改
31
25
 
32
- 4. **内容完整**:
33
- - 信息要素齐全(时间、地点、内容、联系方式等)
34
- - 二维码/网址放在右下角
35
- - 日期格式规范
26
+ ## 海报制作步骤
36
27
 
37
- ## 海报制作流程
28
+ 1. `create_poster_canvas` - 创建画布(使用设计稿中的尺寸)
29
+ 2. `add_poster_background` - 添加背景(使用设计稿中的配色和背景)
30
+ 3. `add_poster_text` - 添加文字(按照设计稿的字体、字号、颜色)
31
+ 4. `add_poster_image` - 添加图片(按照设计稿的位置和尺寸)
32
+ 5. `add_poster_grid` - 添加网格布局(如设计稿需要)
33
+ 6. `add_poster_qrcode` - 添加二维码(如需要)
34
+ 7. `compose_poster` / `export_poster_canvas` - 生成并导出海报
38
35
 
39
- 1. **需求理解**:确认海报主题、尺寸、风格偏好
40
- 2. **方案设计**:确定配色、布局、主要元素
41
- 3. **素材准备**:准备背景图、图标、二维码等
42
- 4. **制作生成**:使用 poster 插件生成海报
43
- 5. **预览确认**:导出预览图供用户确认
44
- 6. **修改优化**:根据反馈调整设计
36
+ **重要**:每添加一个元素后,建议导出预览确认效果,再继续下一步。
45
37
 
46
38
  ## 常用尺寸
47
39
 
@@ -50,25 +42,11 @@ model: inherit
50
42
  - 方形海报:1:1
51
43
  - 手机壁纸:9:16
52
44
 
53
- ## 用户偏好(重要)
54
-
55
- 用户偏好**明亮清新**的风格:
56
- - 色彩:浅色系、亮色调、清新配色
57
- - 构图:简洁大方、留白充足
58
- - 氛围:阳光、活力、正能量
59
- - 避免:过于暗沉、狂野、复杂的设计
60
-
61
45
  ## 工具使用
62
46
 
63
- 使用 `ext_call` 调用 poster 插件:
64
- - `create_poster_canvas` - 创建画布
65
- - `add_poster_background` - 添加背景
66
- - `add_poster_text` - 添加文字
67
- - `add_poster_image` - 添加图片
68
- - `add_poster_qrcode` - 添加二维码
69
- - `compose_poster` / `generate_poster` - 生成海报
70
- - `export_poster_canvas` - 导出预览
71
-
72
- 使用 `ext_skill` 获取插件的接口列表和参数详情
47
+ 使用 `ext_skill({ plugin: 'poster' })` 获取 poster 插件的完整接口列表和参数详情。
73
48
 
74
- 图片比例默认使用 9:16(竖版),如需其他比例请询问用户。
49
+ 使用 `ext_call` 调用 poster 插件工具,格式:
50
+ ```javascript
51
+ ext_call({ plugin: 'poster', tool: '工具名', args: { 参数 } })
52
+ ```
@@ -1 +1,17 @@
1
- []
1
+ [
2
+ {
3
+ "id": "task_1776694090303_f9x38cehv",
4
+ "name": "30秒后执行ls命令",
5
+ "type": "shell",
6
+ "message": "执行 ls 命令列出当前目录文件",
7
+ "enabled": true,
8
+ "createdAt": "2026-04-20T14:08:10.303Z",
9
+ "lastRun": null,
10
+ "runCount": 0,
11
+ "runAt": "2026-04-20T14:08:40.303Z",
12
+ "sessionId": null,
13
+ "persistDelay": 30000,
14
+ "notify": true,
15
+ "shell": "ls -la"
16
+ }
17
+ ]
@@ -3,22 +3,117 @@
3
3
  "messages": [
4
4
  {
5
5
  "role": "user",
6
- "content": "网络管理员访问https://foliko.com,然后根据内容帮我制作一张海报"
6
+ "content": "设计师给我一套配色方案"
7
7
  },
8
8
  {
9
9
  "role": "assistant",
10
10
  "content": [
11
11
  {
12
12
  "type": "text",
13
- "text": "<think>\n用户想要:\n1. 访问 https://foliko.com 获取内容\n2. 根据内容制作一张海报\n\n这是一个需要两个步骤的任务:\n1. 先使用 network-requester Agent 获取网页内容\n2. 然后使用 poster-designer Agent 制作海报\n\n让我先调用 network-requester 来获取网页内容。\n</think>\n\n我来帮你完成这个任务。首先访问网页获取内容,然后制作海报。\n"
13
+ "text": "<think>\n用户提到\"设计师给我一套配色方案\",但没有具体说明是什么配色方案。我需要了解更多信息才能帮助用户。\n\n可能的情况:\n1. 用户想要查看/管理配色方案\n2. 用户想把这个配色方案应用到某个项目\n3. 用户想创建海报等设计作品\n4. 用户想分享/保存配色方案\n\n由于信息不足,我应该询问用户更多细节,比如:\n- 配色方案是什么内容?\n- 用户想用这个配色方案做什么?\n\n或者,如果用户是想让我帮忙处理这个配色方案(比如保存、应用到某个项目等),我需要等待用户提供具体的配色值。\n\n让我直接询问用户想要做什么。\n</think>\n\n需要了解更多背景信息:\n\n**请问您想用这套配色方案做什么?**\n\n1. **应用到海报设计** - 使用 poster 插件制作海报/卡片\n2. **保存到记忆库** - 存入 reference 类型记忆,方便后续复用\n3. **生成设计规范文档** - 输出色彩使用指南\n4. **其他用途** - 请说明具体需求\n\n另外,请提供配色方案的具体内容(如色值:#XXXXXX),或者截图/设计稿位置,我才能帮您处理。"
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "role": "user",
19
+ "content": "ui设计师给我一套海报配色方案"
20
+ },
21
+ {
22
+ "role": "assistant",
23
+ "content": [
24
+ {
25
+ "type": "text",
26
+ "text": "<think>\n用户说是UI设计师给的配色方案,用于海报。我需要:\n\n1. 首先调用 ui-designer 子Agent 获取设计风格、布局等信息\n2. 然后使用 poster-designer 来执行海报制作\n\n根据规则,我需要先调用 ui-designer 子Agent 获取设计信息,然后才能开始制作。\n\n让我先调用 ui-designer 子Agent,询问配色方案的具体内容和使用场景。\n</think>\n\n需要先了解配色方案的具体内容。请提供:\n\n1. **配色方案内容** - 色值列表(如 `#FF5733`, `#333333` 等)\n2. **使用场景** - 海报类型(促销海报、活动海报、个人名片等)\n3. **设计师提供的其他信息** - 如设计稿文件、布局要求等\n\n您可以:\n- 直接粘贴色值\n- 上传设计稿/截图\n- 告诉我配色方案的名称或文档位置\n\n提供后,我将调用 **UI设计师** 分析设计风格,再交由 **海报设计师** 制作。"
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "role": "user",
32
+ "content": "只要配色方案"
33
+ },
34
+ {
35
+ "role": "assistant",
36
+ "content": [
37
+ {
38
+ "type": "text",
39
+ "text": "<think>\n用户只需要配色方案,没有其他需求。可能是想:\n1. 保存配色方案\n2. 查看某种风格的海报配色\n3. 获取一套通用的海报配色方案\n\n用户说\"只要配色方案\",比较模糊。我应该询问具体需要什么类型的配色,或者用户是否有现成的配色方案需要保存。\n\n让我直接问清楚用户的需求。\n</think>\n\n请提供配色方案内容,例如:\n\n- **色值列表**:如 `#FF5733` `#333333` `#FFFFFF`\n- **风格描述**:如\"科技风\"、\"清新文艺\"、\"商务简约\"\n- **使用场景**:如\"618促销\"、\"节日活动\"、\"产品宣传\"\n\n或者您是想让我**生成一套海报配色方案**?请告诉我**主题风格**(如:科技、美食、旅游、节日等),我来为您推荐。"
40
+ }
41
+ ]
42
+ },
43
+ {
44
+ "role": "user",
45
+ "content": "科技"
46
+ },
47
+ {
48
+ "role": "assistant",
49
+ "content": [
50
+ {
51
+ "type": "text",
52
+ "text": "<think>\n用户想要一套科技风格的海报配色方案。这是一个UI设计相关的任务,我应该调用ui-designer子Agent来处理。\n</think>\n\n\n"
53
+ },
54
+ {
55
+ "type": "tool-call",
56
+ "toolCallId": "call_function_fmo70c2pm4do_1",
57
+ "toolName": "ui-designer",
58
+ "input": {
59
+ "task": "为科技主题海报设计一套完整的配色方案,包括:\n1. 主色(1-2个)\n2. 辅助色(2-3个)\n3. 背景色(1-2个)\n4. 强调色/文字色(1-2个)\n\n要求风格:科技感、现代、数字化\n\n请输出色值(HEX格式)和配色说明。"
60
+ }
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "role": "tool",
66
+ "content": [
67
+ {
68
+ "type": "tool-result",
69
+ "toolCallId": "call_function_fmo70c2pm4do_1",
70
+ "toolName": "ui-designer",
71
+ "output": {
72
+ "type": "text",
73
+ "value": "{\"agent\":\"ui-designer\",\"result\":\"subagentManager._buildSystemPrompt is not a function\",\"success\":false}"
74
+ }
75
+ }
76
+ ]
77
+ },
78
+ {
79
+ "role": "assistant",
80
+ "content": [
81
+ {
82
+ "type": "text",
83
+ "text": "<think>\n子Agent调用出错了。我直接自己来生成一套科技风格的配色方案吧。\n</think>\n\n以下是 **科技主题海报配色方案**:\n\n---\n\n## 🎨 科技风配色方案\n\n| 类型 | 色值 | 用途 |\n|------|------|------|\n| **主色** | `#00D4FF` | 科技蓝,代表未来感 |\n| **主色** | `#6366F1` | 靛蓝紫,代表智能 |\n| **辅助色** | `#0EA5E9` | 天蓝,用于渐变过渡 |\n| **辅助色** | `#8B5CF6` | 紫色,增添神秘科技感 |\n| **背景色** | `#0F172A` | 深蓝黑,主背景 |\n| **背景色** | `#1E293B` | 次级背景,卡片/区块 |\n| **强调色** | `#22D3EE` | 亮青色,高亮/按钮 |\n| **文字色** | `#F8FAFC` | 主文字 |\n| **文字色** | `#94A3B8` | 次级文字/说明 |\n\n---\n\n## 🌟 渐变组合推荐\n\n```\nbackground: linear-gradient(135deg, #0F172A 0%, #1E293B 100%)\naccent: linear-gradient(90deg, #00D4FF, #6366F1)\nglow: linear-gradient(180deg, #00D4FF 0%, #8B5CF6 100%)\n```\n\n---\n\n需要我将此方案应用到海报制作吗?"
84
+ }
85
+ ]
86
+ },
87
+ {
88
+ "role": "user",
89
+ "content": "ui设计师给我一套配色方案"
90
+ },
91
+ {
92
+ "role": "assistant",
93
+ "content": [
94
+ {
95
+ "type": "text",
96
+ "text": "<think>\n用户重复了之前的请求\"ui设计师给我一套配色方案\"。看起来用户可能想要:\n\n1. 继续之前的任务 - 制作科技主题海报\n2. 或者用户只是在测试/重复消息\n\n我应该询问用户具体想要什么:\n- 是否要基于刚才的配色方案制作海报?\n- 还是只是想获取配色方案?\n- 或者有新的配色方案要提供?\n\n让我简洁地问清楚用户意图。\n</think>\n\n请问您需要我做什么?\n\n1. **基于刚才的配色制作海报** - 使用 poster 插件生成科技风海报\n2. **获取其他主题配色** - 告诉我主题(如:美食、节日、商务等)\n3. **您有新的配色方案** - 请提供色值内容"
97
+ }
98
+ ]
99
+ },
100
+ {
101
+ "role": "user",
102
+ "content": "海报"
103
+ },
104
+ {
105
+ "role": "assistant",
106
+ "content": [
107
+ {
108
+ "type": "text",
109
+ "text": "<think>\n用户想要基于刚才的科技风配色方案制作海报。我需要调用 poster-designer 来制作。\n\n但根据规则,我需要先调用 ui-designer 获取设计风格、布局等信息,然后才能让 poster-designer 执行。\n\n让我先调用 ui-designer 获取设计信息。\n</think>\n\n\n"
14
110
  },
15
111
  {
16
112
  "type": "tool-call",
17
- "toolCallId": "call_function_40kqvxqg4mj8_1",
18
- "toolName": "subagent_call",
113
+ "toolCallId": "call_function_0s2k3pf0bkv0_1",
114
+ "toolName": "ui-designer",
19
115
  "input": {
20
- "agentName": "network-requester",
21
- "task": "访问 https://foliko.com,获取页面的主要内容,包括标题、简介、功能介绍等关键信息。返回完整的内容摘要。"
116
+ "task": "为科技主题海报提供完整设计方案:\n- 配色方案(使用刚才生成的科技风配色:主色#00D4FF、#6366F1,背景#0F172A,强调色#22D3EE)\n- 布局结构(标题区、内容区、装饰元素位置)\n- 视觉风格(科技感元素如:渐变、光效、几何图形、网格线等)\n- 字体建议\n\n请输出完整的设计规范供海报制作使用。"
22
117
  }
23
118
  }
24
119
  ]
@@ -28,11 +123,11 @@
28
123
  "content": [
29
124
  {
30
125
  "type": "tool-result",
31
- "toolCallId": "call_function_40kqvxqg4mj8_1",
32
- "toolName": "subagent_call",
126
+ "toolCallId": "call_function_0s2k3pf0bkv0_1",
127
+ "toolName": "ui-designer",
33
128
  "output": {
34
129
  "type": "text",
35
- "value": "{\"success\":true,\"agent\":\"network-requester\",\"result\":\"## Foliko 网站内容摘要\\n\\n### 基本信息\\n| 项目 | 内容 |\\n|------|------|\\n| **网站名称** | Foliko |\\n| **版本** | v2.0(全新 Ambient Agent) |\\n| **类型** | AI Agent 开发框架 |\\n| **编程语言** | 100% JavaScript |\\n| **开源协议** | MIT |\\n| **官网** | https://foliko.com |\\n\\n---\\n\\n### 项目简介\\nFoliko 是一个**纯 JavaScript 开发的简约插件化 Agent 框架**,支持多 AI、流式输出、子 Agent 系统,提供 40+ 内置插件,开箱即用。\\n\\n---\\n\\n### 核心统计数据\\n- 🔌 **40+** 内置插件\\n- 🤖 **5+** AI 提供商支持\\n- 💻 **100%** JavaScript\\n- 📜 MIT 开源协议\\n\\n---\\n\\n### 核心功能特性\\n\\n| 功能 | 描述 |\\n|------|------|\\n| **插件系统** | 可扩展的插件架构,40+ 内置插件覆盖工具、消息、数据处理等场景 |\\n| **多 AI 支持** | 无缝切换 Anthropic、DeepSeek、MiniMax 等多种 AI 提供商 |\\n| **流式输出** | 实时流式响应,完美适配交互式应用和聊天界面 |\\n| **子 Agent 系统** | 创建层级式 Agent 结构,主 Agent 可将任务委托给专业子 Agent |\\n| **Ambient Agent** | 持续后台运行的 Agent,支持目标管理、主动监控和定时任务 |\\n| **记忆系统** | 持久化对话历史,支持语义搜索,Agent 可跨会话记忆和召回信息 |\\n\\n---\\n\\n### 架构设计\\n\\n**三层上下文隔离:**\\n- **Request Context** - 请求级链路追踪、超时控制\\n- **Session Context** - 会话级消息、变量、元数据\\n- **Agent Context** - Agent 级工具、技能、系统提示\\n\\n**项目结构:**\\n```\\nsrc/\\n├── core/ # Framework、Agent、PluginManager、ToolRegistry\\n├── capabilities/ # SkillManager、WorkflowEngine\\n├── executors/ # MCPExecutor MCP 服务器集成\\n└── utils/ # EventEmitter、logger\\nplugins/ # 内置插件(40+ 插件)\\ncli/bin/ # CLI 入口\\nexamples/ # 示例代码\\n```\\n\\n---\\n\\n### 插件生态(40+ 插件)\\n\\n| 类别 | 插件示例 | 用途 |\\n|------|----------|------|\\n| **核心系统** | ai, session, storage, scheduler | AI对话、多会话管理、存储、定时任务 |\\n| **执行工具** | shell, python, mcp, file-system | Shell命令、Python执行、MCP集成、文件系统 |\\n| **即时通讯** | telegram, feishu, weixin, email | Telegram Bot、飞书、微信、邮件收发 |\\n| **智能代理** | subagent, ambient-agent, think, memory | 子Agent、后台运行、持续思考、记忆系统 |\\n| **服务扩展** | web, gate-trading, audit, rules | Web服务、加密货币交易、日志审计、规则引擎 |\\n| **高级功能** | coordinator, python-plugin-loader | 多Worker协作、Python插件加载 |\\n\\n---\\n\\n### 快速开始\\n\\n**安装:**\\n```bash\\nnpm install -g foliko\\n```\\n\\n**配置 AI(创建 .env 文件):**\\n```bash\\nFOLIKO_PROVIDER=minimax\\nMINIMAX_API_KEY=sk-your-api-key\\n```\\n\\n**启动对话:**\\n```bash\\nfoliko chat\\n```\\n\\n**编程使用:**\\n```javascript\\nconst { Framework } = require('foliko')\\nconst framework = new Framework()\\nframework.loadPlugin('ai')\\n\\nconst agent = framework.createAgent({\\n systemPrompt: '你是一个有帮助的助手'\\n})\\n\\nconst result = await agent.chat('你好')\\nconsole.log(result.message)\\n```\\n\\n---\\n\\n### 代码示例(19+ 示例)\\n- **基础** - basic.js(核心用法)\\n- **高级** - ambient-example.js(目标管理与持续运行)\\n- **集成** - test-telegram.js(Bot集成)、test-weixin-feishu.js(微信/飞书)\\n- **工作流** - workflow.js(多步骤编排)\\n- **技能** - skill-example.js(自定义技能)\\n- **MCP** - mcp-example.js(Model Context Protocol)\\n- **Web** - test-web-plugin.js(Web服务与Webhook)\\n\\n---\\n\\n### 总结\\n**Foliko** 是一个功能完整的开源 AI Agent 开发框架,适合从简单的聊天机器人到复杂的多 Agent 系统的各种应用场景,具有丰富的插件生态、灵活的多 AI 支持和强大的扩展能力。\"}"
130
+ "value": "{\"agent\":\"ui-designer\",\"result\":\"# 🎨 科技主题海报设计规范\\n\\n---\\n\\n## 一、配色方案\\n\\n### 主色调\\n| 颜色 | 色值 | 用途 |\\n|------|------|------|\\n| **主色-科技蓝** | `#00D4FF` | 核心标题、强调元素、CTA按钮 |\\n| **主色-渐变紫** | `#6366F1` | 次要标题、装饰线条、图标 |\\n| **背景色-深空黑** | `#0F172A` | 海报背景、大面积色块 |\\n| **强调色-青绿** | `#22D3EE` | 高亮文字、发光效果、数据展示 |\\n\\n### 辅助色\\n| 颜色 | 色值 | 用途 |\\n|------|------|------|\\n| 深蓝 | `#1E293B` | 卡片背景、分区背景 |\\n| 灰紫 | `#64748B` | 正文、次要信息 |\\n| 纯白 | `#FFFFFF` | 主标题、重要文字 |\\n| 浅灰 | `#94A3B8` | 说明文字、时间标注 |\\n\\n### 渐变配方\\n```\\n线性渐变-主标题: #00D4FF #6366F1 (45°)\\n线性渐变-背景光效: #6366F1(20%) #0F172A (径向)\\n发光效果: #00D4FF + blur(20px)\\n```\\n\\n---\\n\\n## 二、布局结构\\n\\n```\\n┌─────────────────────────────────────────┐\\n│ ┌─────────────────────────────────────┐│\\n│ │ 顶部装饰区 (8-12%) ││\\n│ │ ┌───┐ ═══════════════════ ┌───┐ ││\\n│ │ │几何│ 网格线/粒子装饰 │线条│ ││\\n│ │ └───┘ └───┘ ││\\n│ └─────────────────────────────────────┘│\\n│ │\\n│ ┌─────────────────────────────────────┐│\\n│ │ 标题区 (15-20%) ││\\n│ │ ││\\n│ │ ╔═══════════════════════╗ ││\\n│ │ ║ 主 标 题 文 字 ║ ││\\n│ │ ╚═══════════════════════╝ ││\\n│ │ 副标题 / 描述文字 ││\\n│ │ 标签徽章 🔥 科技 | 2025 ││\\n│ └─────────────────────────────────────┘│\\n│ │\\n│ ┌─────────────────────────────────────┐│\\n│ │ 内容区 (45-55%) ││\\n│ │ ││\\n│ │ ┌─────────┐ ┌─────────┐ ┌───────┐ ││\\n│ │ │ Feature │ │ Feature │ │ Card │ ││\\n│ │ │ 01 │ │ 02 │ │ 03 │ ││\\n│ │ └─────────┘ └─────────┘ └───────┘ ││\\n│ │ ││\\n│ │ ┌─────────┐ ┌─────────┐ ┌───────┐ ││\\n│ │ │ Feature │ │ Feature │ │ Card │ ││\\n│ │ │ 04 │ │ 05 │ │ 06 │ ││\\n│ │ └─────────┘ └─────────┘ └───────┘ ││\\n│ └─────────────────────────────────────┘│\\n│ │\\n│ ┌─────────────────────────────────────┐│\\n│ │ 底部CTA区 (12-15%) ││\\n│ │ ││\\n│ │ [ 行动号召按钮 ] ││\\n│ │ 扫码 / 链接 ││\\n│ └─────────────────────────────────────┘│\\n│ │\\n│ ┌─────────────────────────────────────┐│\\n│ │ 底部装饰区 (5-8%) ││\\n│ │ ════════════════════════════════ ││\\n│ │ 二维码 | LOGO | 日期 ││\\n│ └─────────────────────────────────────┘│\\n└─────────────────────────────────────────┘\\n```\\n\\n---\\n\\n## 三、视觉风格\\n\\n### 科技感元素清单\\n\\n| 元素类型 | 具体应用 | 视觉效果 |\\n|----------|----------|----------|\\n| **渐变光效** | 背景渐变、光晕效果、发光按钮 | 深度感、空间感 |\\n| **网格线** | 透视网格、点阵背景、科技线条 | 前沿、精密感 |\\n| **几何图形** | 六边形、圆形、三角形装饰 | 秩序、现代感 |\\n| **粒子效果** | 抽象粒子、漂浮光点 | 活力、未来感 |\\n| **光效边框** | 霓虹边框、流光线条 | 科技、视觉冲击 |\\n| **玻璃拟态** | 半透明卡片、毛玻璃效果 | 高级、现代 |\\n| **故障艺术** | 错位、撕裂、色差 | 赛博朋克、反叛 |\\n\\n### 背景处理\\n```\\n┌─────────────────────────────────────────┐\\n│ ● ● ○ ○ │ ← 粒子点缀\\n│ ╲ │\\n│ ╲ ╔═══════════════════════╗ │ ← 光晕效果\\n│ ╲ ║ ║ │\\n│ ╲ ║ 内容卡片 (玻璃态) ║ │\\n│ ╲╚═══════════════════════╝ │\\n ╲ ─── │ ← 网格线\\n│ ╲ │\\n│ ───────────────────────────────────── │ ← 地平线\\n└─────────────────────────────────────────┘\\n```\\n\\n---\\n\\n## 四、字体规范\\n\\n### 字体选择建议\\n\\n| 用途 | 推荐字体 | 备选字体 |\\n|------|----------|----------|\\n| **主标题** | Orbitron / 思源黑体 CN Bold | Bebas Neue / Rajdhani |\\n| **副标题** | Inter / 思源黑体 CN Medium | Noto Sans SC |\\n| **正文** | 思源黑体 CN Regular | Inter / Noto Sans SC |\\n| **数据/标签** | JetBrains Mono / Roboto Mono | Fira Code |\\n\\n### 字号规范 (以1920×1080为基准)\\n```\\n主标题: 72-96px (2.5-3rem)\\n副标题: 32-48px (1.25-1.5rem)\\n正文: 18-24px (0.875-1rem)\\n标签: 14-16px (0.625-0.75rem)\\n辅助: 12px (0.5rem)\\n```\\n\\n### 文字效果\\n- 主标题:渐变填充(#00D4FF→#6366F1) + 外发光(blur:10px, color:#00D4FF)\\n- 副标题:纯色白色 + 微阴影\\n- 正文:浅灰色(#94A3B8) + 行高1.6\\n\\n---\\n\\n## 五、组件设计\\n\\n### 卡片组件\\n```\\n┌──────────────────────────┐\\n│ ┌────┐ │ ← 图标区(64px)\\n│ │ 🎯 │ │\\n│ └────┘ │\\n│ │\\n│ 标题文字 │ ← 24px Bold #FFFFFF\\n│ │\\n│ 描述内容说明文字 │ ← 16px Regular #94A3B8\\n│ 最多显示2行... │\\n│ │\\n│ ────▶ │ ← 链接指示\\n└──────────────────────────┘\\n\\n样式: \\n- 背景: #1E293B (80%透明度)\\n- 边框: 1px solid #00D4FF (20%透明度)\\n- 圆角: 16px\\n- 特效: 微玻璃模糊\\n```\\n\\n### CTA按钮\\n```\\n╔════════════════════════════╗\\n║ ║\\n║ 🔗 立即体验 ║\\n║ ║\\n╚════════════════════════════╝\\n\\n样式:\\n- 背景: 线性渐变 #00D4FF → #6366F1\\n- 边框: none\\n- 圆角: 12px\\n- 阴影: 0 4px 24px rgba(0,212,255,0.4)\\n- 悬停: 发光增强 + scale(1.02)\\n```\\n\\n### 标签徽章\\n```\\n[ 🔥 热门 ] [ ✨ NEW ] [ 🎯 限时 ]\\n\\n样式:\\n- 背景: 渐变 或 半透明\\n- 边框: 1px solid 对应主色\\n- 圆角: 6px\\n- 字号: 12-14px\\n```\\n\\n---\\n\\n## 六、光效叠加示例\\n\\n```css\\n/* 霓虹发光文字 */\\n.tech-glow {\\n background: linear-gradient(135deg, #00D4FF, #6366F1);\\n -webkit-background-clip: text;\\n -webkit-text-fill-color: transparent;\\n text-shadow: 0 0 20px rgba(0,212,255,0.5),\\n 0 0 40px rgba(0,212,255,0.3),\\n 0 0 60px rgba(99,102,241,0.2);\\n}\\n\\n/* 玻璃拟态卡片 */\\n.glass-card {\\n background: rgba(30,41,59,0.7);\\n backdrop-filter: blur(12px);\\n border: 1px solid rgba(0,212,255,0.2);\\n border-radius: 16px;\\n box-shadow: 0 8px 32px rgba(0,0,0,0.3);\\n}\\n```\\n\\n---\\n\\n## 七、设计检查清单\\n\\n- [ ] 主标题使用渐变色 + 发光效果\\n- [ ] 背景使用深色 + 网格/粒子装饰\\n- [ ] 卡片使用玻璃拟态效果\\n- [ ] CTA按钮使用渐变 + 阴影\\n- [ ] 数据/标签使用等宽字体\\n- [ ] 整体保持 60% 负空间\\n- [ ] 元素间距遵循 8px 基准栅格\\n- [ ] 装饰元素透明度 ≤ 30%\\n\\n---\\n\\n> 📌 **提示**: 此设计规范可直接用于海报制作执行,如需生成海报请调用 `poster-designer` Agent 并传递本规范。\",\"success\":true}"
36
131
  }
37
132
  }
38
133
  ]
@@ -42,15 +137,14 @@
42
137
  "content": [
43
138
  {
44
139
  "type": "text",
45
- "text": "<think>\n成功获取了 Foliko 网站的内容。现在我需要调用 poster-designer 子 Agent 来制作海报。根据获取到的内容,我可以制作一张展示 Foliko 项目特点的宣传海报。\n</think>\n\n已获取网站内容,现在为你制作海报。\n"
140
+ "text": "<think>\nUI设计师已经提供了完整的设计方案。现在我需要调用 poster-designer 来执行海报制作,并将设计规范传递给它。\n</think>\n\n设计规范已生成,现在调用海报设计师执行制作:\n"
46
141
  },
47
142
  {
48
143
  "type": "tool-call",
49
- "toolCallId": "call_function_9lo3zwzf4hkt_1",
50
- "toolName": "subagent_call",
144
+ "toolCallId": "call_function_pw0vn0qjoj0g_1",
145
+ "toolName": "poster-designer",
51
146
  "input": {
52
- "agentName": "poster-designer",
53
- "task": "根据以下 Foliko 项目信息,制作一张项目宣传海报:\n\n**项目名称**: Foliko\n**副标题**: 纯 JavaScript 开发的简约插件化 Agent 框架\n**版本**: v2.0(全新 Ambient Agent)\n\n**核心亮点**:\n- 🔌 40+ 内置插件\n- 🤖 5+ AI 提供商支持\n- 💻 100% 纯 JavaScript\n- 📜 MIT 开源协议\n\n**主要功能**:\n- 插件系统 - 可扩展的插件架构\n- 多 AI 支持 - Anthropic、DeepSeek、MiniMax 等\n- 流式输出 - 实时流式响应\n- 子 Agent 系统 - 层级式 Agent 结构\n- Ambient Agent - 持续后台运行\n- 记忆系统 - 持久化对话历史\n\n**官网**: https://foliko.com\n\n**设计要求**:\n1. 科技感、现代感的设计风格\n2. 主色调使用蓝色/紫色渐变,体现 AI/科技感\n3. 突出展示\"40+ 插件\"、\"100% JS\"、\"Ambient Agent\"等核心卖点\n4. 包含官网地址\n5. 海报尺寸:800x1200(竖版)\n\n请创建并导出海报,然后返回海报的图片路径。"
147
+ "task": "基于以下设计规范,制作一张科技主题海报:\n\n**配色方案:**\n- 主色:#00D4FF(科技蓝)、#6366F1(渐变紫)\n- 背景:#0F172A(深空黑)\n- 辅助:#1E293B(卡片背景)、#22D3EE(强调色)\n- 文字:#FFFFFF(标题)、#94A3B8(正文)\n\n**布局要求:**\n- 顶部:装饰区(几何图形、网格线)\n- 标题区:主标题\"科技创新未来\"、副标题、标签徽章\n- 内容区:6个功能卡片(玻璃拟态风格)\n- 底部:CTA按钮\"立即体验\"、二维码区域\n\n**视觉风格:**\n- 科技感元素:渐变光效、网格线、几何图形、发光边框\n- 主标题使用渐变填充+外发光效果\n- 卡片使用玻璃拟态(半透明+模糊+发光边框)\n- CTA按钮使用渐变+阴影\n\n**字体:** 标题用粗体,正文用常规\n\n请生成完整的海报图片并输出。"
54
148
  }
55
149
  }
56
150
  ]
@@ -60,11 +154,11 @@
60
154
  "content": [
61
155
  {
62
156
  "type": "tool-result",
63
- "toolCallId": "call_function_9lo3zwzf4hkt_1",
64
- "toolName": "subagent_call",
157
+ "toolCallId": "call_function_pw0vn0qjoj0g_1",
158
+ "toolName": "poster-designer",
65
159
  "output": {
66
160
  "type": "text",
67
- "value": "{\"success\":true,\"agent\":\"poster-designer\",\"result\":\" Foliko 项目宣传海报已成功创建!\\n\\n**海报文件路径:** `/tmp/foliko_poster.png`\\n\\n---\\n\\n### 📋 海报设计概览\\n\\n| 项目 | 内容 |\\n|------|------|\\n| **尺寸** | 800 x 1200 像素(竖版) |\\n| **风格** | 科技感、现代感 |\\n| **主色调** | 蓝紫渐变 (#667eea → #764ba2) |\\n\\n### 🎨 设计亮点\\n\\n1. **渐变背景** - 深蓝色调配蓝紫渐变,营造 AI/科技氛围\\n2. **装饰光斑** - 半透明圆形光斑增强层次感和科技感\\n3. **主标题** - \\\"Foliko\\\" 使用渐变色艺术字,带发光阴影效果\\n4. **v2.0 徽章** - 醒目的版本标签,突出\\\"全新 Ambient Agent\\\"\\n5. **核心数据卡片** - 4 个统计卡片展示核心卖点:\\n - 🔌 40+ 内置插件\\n - 🤖 5+ AI 提供商\\n - 💻 100% 纯 JavaScript\\n - 📜 MIT 开源协议\\n6. **功能列表** - 5 个核心功能详细展示\\n7. **突出特性** - Ambient Agent 和记忆系统两个特性卡片\\n8. **底部 CTA** - 醒目的官网地址按钮\\n\\n您可以直接使用该海报进行项目宣传!\"}"
161
+ "value": "{\"agent\":\"poster-designer\",\"result\":\"科技主题海报已成功生成!\\n\\n## 📋 海报制作完成\\n\\n**输出文件**:`output/tech_poster.png`(约 144KB)\\n\\n### 海报结构\\n\\n| 区域 | 内容 |\\n|------|------|\\n| **顶部装饰区** | 六边形渐变光效、圆形光点、网格线 |\\n| **标题区** | \\\"科技创新未来\\\"(渐变+发光)、副标题\\\"引领数字时代新纪元\\\"、标签徽章 [AI] [云计算] [大数据] |\\n| **功能卡片区** | 6张玻璃拟态卡片:🤖人工智能、☁️云计算、📊大数据分析、🔐区块链、🌐物联网、💫边缘计算 |\\n| **底部区** | 渐变CTA按钮\\\"立即体验 →\\\"、二维码\\\"扫码了解更多\\\" |\\n\\n### 设计亮点\\n\\n- 主标题:#00D4FF #6366F1 渐变 + 外发光\\n- 玻璃拟态卡片:半透明背景 + 发光边框\\n- 科技元素:网格线、六边形、圆形装饰\\n- CTA按钮:渐变填充 + 阴影光效\\n- 深空黑背景 #0F172A 营造科技氛围\\n\\n海报尺寸:1080 × 1920 px(竖版),适配手机壁纸和朋友圈海报格式。\",\"success\":true}"
68
162
  }
69
163
  }
70
164
  ]
@@ -74,15 +168,15 @@
74
168
  "content": [
75
169
  {
76
170
  "type": "text",
77
- "text": "<think>\n海报已经成功创建,保存在 `/tmp/foliko_poster.png`。让我展示给用户看。\n</think>\n\n海报制作完成!\n\n## 📢 Foliko 项目宣传海报\n\n| 项目 | 内容 |\n|------|------|\n| **文件路径** | `/tmp/foliko_poster.png` |\n| **尺寸** | 800 x 1200 像素(竖版) |\n| **风格** | 科技感、现代感 |\n\n### 🎨 设计亮点\n\n1. **渐变背景** - 深蓝色调配蓝紫渐变,营造 AI/科技氛围\n2. **主标题** - \"Foliko\" 使用渐变色艺术字,带发光阴影效果\n3. **v2.0 徽章** - 醒目的版本标签,突出\"全新 Ambient Agent\"\n4. **核心数据卡片** - 4 个统计卡片展示核心卖点:\n - 🔌 40+ 内置插件\n - 🤖 5+ AI 提供商\n - 💻 100% 纯 JavaScript\n - 📜 MIT 开源协议\n5. **功能列表** - 5 个核心功能详细展示\n6. **底部 CTA** - 醒目的官网地址按钮 https://foliko.com\n\n**海报文件已保存至:** `/tmp/foliko_poster.png`\n\n你可以直接使用该海报进行项目宣传!是否需要我展示海报预览或者对设计进行修改?"
171
+ "text": "<think>\n海报已经成功生成。现在我需要展示给用户看。用户可以在 output/tech_poster.png 找到这个文件。让我告诉用户结果。\n</think>\n\n## ✅ 科技主题海报制作完成\n\n**输出文件**:`output/tech_poster.png`\n\n### 海报内容\n\n| 区域 | 内容 |\n|------|------|\n| **顶部装饰** | 六边形光效、圆形粒子、网格线 |\n| **标题区** | \"科技创新未来\"(渐变+发光)、副标题、标签 [AI] [云计算] [大数据] |\n| **功能卡片** | 6张玻璃拟态卡片(人工智能、云计算、大数据、区块链、物联网、边缘计算) |\n| **底部** | 渐变CTA按钮\"立即体验 →\"、二维码区域 |\n\n### 设计特点\n- 主标题:`#00D4FF #6366F1` 渐变 + 外发光\n- 卡片:玻璃拟态(半透明 + 发光边框)\n- 背景:深空黑 `#0F172A`\n- 尺寸:1080 × 1920 px(竖版)\n\n---\n\n文件位置:`output/tech_poster.png`\n\n如需调整内容(文字、卡片数量、颜色微调等),请告诉我。"
78
172
  }
79
173
  ]
80
174
  }
81
175
  ],
82
176
  "variables": {},
83
177
  "metadata": {
84
- "createdAt": 1776521369357,
85
- "lastActive": 1776521369357,
178
+ "createdAt": 1776696294886,
179
+ "lastActive": 1776696294886,
86
180
  "messageCount": 0,
87
181
  "compressionCount": 0
88
182
  }
@@ -202,8 +202,7 @@
202
202
  "Bash(node -e \"\nconst { createTools } = require\\('ai'\\);\nconsole.log\\('createTools exists:', typeof createTools\\);\n\" 2>&1)",
203
203
  "Bash(node -e \"\nconst poster = require\\('/d/code/foliko-plugins/poster-plugin'\\);\nconsole.log\\('poster.tools:', typeof poster.tools\\);\nconsole.log\\('poster.tools keys:', Object.keys\\(poster.tools || {}\\).slice\\(0, 5\\)\\);\n\" 2>&1)",
204
204
  "Bash(node -e \"require\\('./src/core/agent-chat.js'\\); console.log\\('OK'\\)\" 2>&1)",
205
- "Bash(node -e \"const ai = require\\('ai'\\); console.log\\('tool type:', typeof ai.tool\\)\")",
206
- "Bash(node -c D:/Code/foliko/plugins/extension-executor-plugin.js 2>&1)"
205
+ "Bash(node -e \"const ai = require\\('ai'\\); console.log\\('tool type:', typeof ai.tool\\)\")"
207
206
  ]
208
207
  }
209
208
  }
@@ -175,6 +175,7 @@ class ChatUI {
175
175
  sessionScope.on('queue:failed', ({ error }) => {
176
176
  hasError = true;
177
177
  console.error(`\n${colored('[错误]', RED)} ${error}`);
178
+ sessionScope.removeAllListeners();
178
179
  });
179
180
 
180
181
  // 调用 sendMessage 触发事件
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foliko",
3
- "version": "1.1.31",
3
+ "version": "1.1.33",
4
4
  "description": "简约的插件化 Agent 框架",
5
5
  "main": "src/index.js",
6
6
  "type": "commonjs",
@@ -53,7 +53,7 @@ class GoalManager {
53
53
  completedAt: null,
54
54
  failedAt: null,
55
55
  attempts: 0,
56
- maxAttempts: goalData.maxAttempts || 10,
56
+ maxAttempts: goalData.maxAttempts || Infinity,
57
57
  consecutiveSameActions: 0,
58
58
  lastActionId: null,
59
59
  eventsReceived: []
@@ -56,7 +56,8 @@ class TaskStore {
56
56
  llm: t.llm,
57
57
  persistDelay: t.persistDelay, // 相对时间的延迟毫秒数
58
58
  persistNextRun: t.persistNextRun, // 下次执行时间
59
- notify: t.notify // 是否发送通知
59
+ notify: t.notify, // 是否发送通知
60
+ shell: t.shell // Shell 命令
60
61
  }))
61
62
  fs.writeFileSync(this._getTasksPath(), JSON.stringify(serializable, null, 2))
62
63
  } catch (err) {
@@ -182,16 +183,112 @@ class SchedulerPlugin extends Plugin {
182
183
  cronExpression: z.string().optional().describe('Cron 表达式 (当 repeat 为 true 时使用)'),
183
184
  sessionId: z.string().optional().describe('会话 ID(提醒将发送到该会话,不填则使用默认会话)'),
184
185
  llm: z.boolean().optional().describe('是否需要 LLM 处理(自动检测,可手动覆盖)'),
185
- notify: z.boolean().optional().describe('任务完成后是否发送通知(默认 true)。设为 false 时,任务将在后台静默执行,不发送任何通知')
186
+ notify: z.boolean().optional().describe('任务完成后是否发送通知(默认 true)。设为 false 时,任务将在后台静默执行,不发送任何通知'),
187
+ shell: z.string().optional().describe('要执行的 Shell/Bash 命令(如 echo hello, ls -la)')
186
188
  }),
187
189
  execute: async (args) => {
188
190
  try {
189
- const { scheduleTime, message, repeat, cronExpression, sessionId } = args
191
+ const { scheduleTime, message, repeat, cronExpression, sessionId, shell } = args
190
192
  const agent = this._getAgent()
191
193
  if (!agent) {
192
194
  return { success: false, error: 'Agent not available' }
193
195
  }
194
196
 
197
+ // 如果指定了 shell 命令,创建 Shell 任务
198
+ if (shell) {
199
+ const taskId = `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
200
+ const isCron = /^[\d*,\/-\s]+$/.test(scheduleTime) && scheduleTime.split(' ').length >= 5
201
+
202
+ if (isCron || repeat) {
203
+ if (!cron) {
204
+ return { success: false, error: 'node-cron not installed' }
205
+ }
206
+ const task = {
207
+ id: taskId,
208
+ name: args.name || 'ShellTask',
209
+ type: 'shell',
210
+ cronExpression: cronExpression || scheduleTime,
211
+ message: message || shell,
212
+ enabled: true,
213
+ createdAt: new Date(),
214
+ lastRun: null,
215
+ runCount: 0,
216
+ timer: null,
217
+ cronTask: null,
218
+ sessionId: sessionId || null,
219
+ shell,
220
+ notify: args.notify !== false
221
+ }
222
+ task.cronTask = cron.schedule(task.cronExpression, async () => {
223
+ await this._executeTask(task)
224
+ })
225
+ this._tasks.set(task.id, task)
226
+ this._taskStats.total++
227
+ this._saveTasks()
228
+ return {
229
+ success: true,
230
+ taskId: task.id,
231
+ name: task.name,
232
+ type: 'shell',
233
+ shell,
234
+ scheduleTime,
235
+ cronExpression: task.cronExpression,
236
+ message: repeat ? 'Shell 定时任务已创建 (重复执行)' : 'Shell 任务已创建',
237
+ sessionId: sessionId || 'default',
238
+ notify: task.notify
239
+ }
240
+ } else {
241
+ // 一次性 Shell 任务
242
+ const delayMs = parseDelay(scheduleTime)
243
+ if (!delayMs && !scheduleTime.includes(':')) {
244
+ return { success: false, error: '无效的时间格式' }
245
+ }
246
+ let runAt = null
247
+ let delay = 0
248
+ if (scheduleTime.includes(':')) {
249
+ runAt = parseAtTime(scheduleTime)
250
+ delay = runAt.getTime() - Date.now()
251
+ } else {
252
+ delay = parseDelay(scheduleTime)
253
+ runAt = new Date(Date.now() + delay)
254
+ }
255
+ const task = {
256
+ id: taskId,
257
+ name: args.name || 'ShellTask',
258
+ type: 'shell',
259
+ runAt,
260
+ message: message || shell,
261
+ enabled: true,
262
+ createdAt: new Date(),
263
+ lastRun: null,
264
+ runCount: 0,
265
+ timer: null,
266
+ sessionId: sessionId || null,
267
+ shell,
268
+ persistDelay: delay,
269
+ notify: args.notify !== false
270
+ }
271
+ task.timer = setTimeout(async () => {
272
+ await this._executeTask(task)
273
+ }, delay)
274
+ this._tasks.set(task.id, task)
275
+ this._taskStats.total++
276
+ this._saveTasks()
277
+ return {
278
+ success: true,
279
+ taskId: task.id,
280
+ name: task.name,
281
+ type: 'shell',
282
+ shell,
283
+ scheduleTime,
284
+ executeAt: runAt.toISOString(),
285
+ message: 'Shell 任务已创建',
286
+ sessionId: sessionId || 'default',
287
+ notify: task.notify
288
+ }
289
+ }
290
+ }
291
+
195
292
  // 如果没有指定 sessionId,优先从执行上下文获取(来自 WeChat 等消息源)
196
293
  let targetSessionId = sessionId
197
294
  if (!targetSessionId) {
@@ -361,7 +458,8 @@ class SchedulerPlugin extends Plugin {
361
458
  cronExpression: t.cronExpression,
362
459
  llm: t.llm,
363
460
  notify: t.notify,
364
- sessionId: t.sessionId
461
+ sessionId: t.sessionId,
462
+ shell: t.shell
365
463
  }))
366
464
 
367
465
  return {
@@ -500,6 +598,19 @@ class SchedulerPlugin extends Plugin {
500
598
  log.error(` 恢复 Cron 任务失败: ${task.name}`, err.message)
501
599
  }
502
600
  }
601
+ // 重新调度 Cron Shell 任务
602
+ else if (task.type === 'shell' && task.enabled && task.cronExpression && cron) {
603
+ try {
604
+ task.cronTask = cron.schedule(task.cronExpression, async () => {
605
+ await this._executeTask(task)
606
+ })
607
+ this._tasks.set(task.id, task)
608
+ this._taskStats.total++
609
+ log.info(` 已恢复 Shell Cron 任务: ${task.name}`)
610
+ } catch (err) {
611
+ log.error(` 恢复 Shell Cron 任务失败: ${task.name}`, err.message)
612
+ }
613
+ }
503
614
  // 重新调度相对时间任务(计算新的执行时间)
504
615
  else if (task.type === 'once' && task.enabled && task.persistDelay) {
505
616
  const newDelay = task.persistDelay
@@ -562,7 +673,34 @@ class SchedulerPlugin extends Plugin {
562
673
  this._taskStats.running++
563
674
 
564
675
  try {
565
- if (task.llm) {
676
+ // Shell 命令执行模式
677
+ if (task.type === 'shell') {
678
+ const result = await this._framework.executeTool('shell', { command: task.shell })
679
+ this._taskStats.completed++
680
+
681
+ const output = result.error ? `执行失败: ${result.error}` : (result.output || result.stdout || JSON.stringify(result))
682
+ if (task.notify !== false) {
683
+ this._framework.emit('notification', {
684
+ title: task.name,
685
+ message: output,
686
+ source: 'scheduler',
687
+ level: result.error ? 'error' : 'info',
688
+ sessionId: task.sessionId,
689
+ timestamp: new Date()
690
+ })
691
+ }
692
+
693
+ this._framework.emit('scheduler:task_completed', {
694
+ taskId: task.id,
695
+ result: output
696
+ })
697
+
698
+ if (task.type === 'once' && !task.cronTask) {
699
+ this._cleanupTask(task.id)
700
+ }
701
+
702
+ return { success: true }
703
+ } else if (task.llm) {
566
704
  // LLM 模式:使用子Agent处理
567
705
  const schedulerAgent = this._framework.createSubAgent({
568
706
  name: 'scheduler_task',
@@ -566,6 +566,7 @@ class WeixinPlugin extends Plugin {
566
566
  this.stopTypingInterval()
567
567
  await this._sendMessageBatch(originalMsg, userId, error, true)
568
568
  lineBuffer = ''
569
+ sessionScope.removeAllListeners();
569
570
  })
570
571
 
571
572
  const result=await agent.sendMessage(text, { sessionId, priority: 1 })