foliko 1.0.87 → 1.1.1

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 (259) hide show
  1. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
  2. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
  3. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
  4. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
  5. package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
  6. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
  7. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
  8. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  9. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  10. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  11. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  12. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  13. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  14. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  15. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
  16. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  17. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  18. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  19. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  20. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
  21. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
  22. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  23. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  24. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
  25. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  26. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  27. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
  28. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
  29. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
  30. package/.agent/ARCHITECTURE.md +288 -0
  31. package/.agent/agents/ambient-agent.md +57 -0
  32. package/.agent/agents/debugger.md +55 -0
  33. package/.agent/agents/email-assistant.md +49 -0
  34. package/.agent/agents/file-manager.md +42 -0
  35. package/.agent/agents/python-developer.md +60 -0
  36. package/.agent/agents/scheduler.md +59 -0
  37. package/.agent/agents/web-developer.md +45 -0
  38. package/.agent/data/default.json +325 -21
  39. package/.agent/data/plugins-state.json +194 -162
  40. package/.agent/data/puppeteer-sessions/undefined.json +6 -0
  41. package/.agent/mcp_config.json +0 -1
  42. package/.agent/mcp_config_updated.json +12 -0
  43. package/.agent/plugins/poster-plugin/README.md +304 -0
  44. package/.agent/plugins/poster-plugin/fonts/NotoColorEmoji-Regular.ttf +0 -0
  45. package/.agent/plugins/poster-plugin/fonts/PatuaOne-Regular.ttf +0 -0
  46. package/.agent/plugins/poster-plugin/fonts//345/276/256/350/275/257/351/233/205/351/273/221.ttf +0 -0
  47. package/.agent/plugins/poster-plugin/fonts//345/276/256/350/275/257/351/233/205/351/273/221/347/262/227/344/275/223.ttf +0 -0
  48. package/.agent/plugins/poster-plugin/index.js +13 -0
  49. package/.agent/plugins/poster-plugin/package.json +28 -0
  50. package/.agent/plugins/poster-plugin/src/canvas.js +161 -0
  51. package/.agent/plugins/poster-plugin/src/components/arrow.js +84 -0
  52. package/.agent/plugins/poster-plugin/src/components/avatar.js +71 -0
  53. package/.agent/plugins/poster-plugin/src/components/badge.js +85 -0
  54. package/.agent/plugins/poster-plugin/src/components/card.js +88 -0
  55. package/.agent/plugins/poster-plugin/src/components/chart.js +127 -0
  56. package/.agent/plugins/poster-plugin/src/components/chip.js +88 -0
  57. package/.agent/plugins/poster-plugin/src/components/columns.js +107 -0
  58. package/.agent/plugins/poster-plugin/src/components/cta.js +85 -0
  59. package/.agent/plugins/poster-plugin/src/components/divider.js +55 -0
  60. package/.agent/plugins/poster-plugin/src/components/feature.js +85 -0
  61. package/.agent/plugins/poster-plugin/src/components/featureGrid.js +112 -0
  62. package/.agent/plugins/poster-plugin/src/components/grid.js +118 -0
  63. package/.agent/plugins/poster-plugin/src/components/imageFrame.js +155 -0
  64. package/.agent/plugins/poster-plugin/src/components/index.js +62 -0
  65. package/.agent/plugins/poster-plugin/src/components/listItem.js +146 -0
  66. package/.agent/plugins/poster-plugin/src/components/notification.js +123 -0
  67. package/.agent/plugins/poster-plugin/src/components/progress.js +79 -0
  68. package/.agent/plugins/poster-plugin/src/components/progressCircle.js +117 -0
  69. package/.agent/plugins/poster-plugin/src/components/quote.js +97 -0
  70. package/.agent/plugins/poster-plugin/src/components/rating.js +85 -0
  71. package/.agent/plugins/poster-plugin/src/components/star.js +70 -0
  72. package/.agent/plugins/poster-plugin/src/components/statCard.js +105 -0
  73. package/.agent/plugins/poster-plugin/src/components/stepper.js +118 -0
  74. package/.agent/plugins/poster-plugin/src/components/table.js +159 -0
  75. package/.agent/plugins/poster-plugin/src/components/tagCloud.js +78 -0
  76. package/.agent/plugins/poster-plugin/src/components/timeline.js +105 -0
  77. package/.agent/plugins/poster-plugin/src/components/watermark.js +52 -0
  78. package/.agent/plugins/poster-plugin/src/composer.js +1904 -0
  79. package/.agent/plugins/poster-plugin/src/elements/artText.js +60 -0
  80. package/.agent/plugins/poster-plugin/src/elements/background.js +52 -0
  81. package/.agent/plugins/poster-plugin/src/elements/circle.js +31 -0
  82. package/.agent/plugins/poster-plugin/src/elements/image.js +71 -0
  83. package/.agent/plugins/poster-plugin/src/elements/index.js +26 -0
  84. package/.agent/plugins/poster-plugin/src/elements/line.js +23 -0
  85. package/.agent/plugins/poster-plugin/src/elements/polygon.js +63 -0
  86. package/.agent/plugins/poster-plugin/src/elements/rectangle.js +32 -0
  87. package/.agent/plugins/poster-plugin/src/elements/svg.js +92 -0
  88. package/.agent/plugins/poster-plugin/src/elements/text.js +107 -0
  89. package/.agent/plugins/poster-plugin/src/fonts.js +233 -0
  90. package/.agent/plugins/poster-plugin/src/index.js +1658 -0
  91. package/.agent/plugins/poster-plugin/src/presets.js +36 -0
  92. package/.agent/plugins/poster-plugin/src/templates/business.js +60 -0
  93. package/.agent/plugins/poster-plugin/src/templates/gradient.js +64 -0
  94. package/.agent/plugins/poster-plugin/src/templates/index.js +43 -0
  95. package/.agent/plugins/poster-plugin/src/templates/modern.js +69 -0
  96. package/.agent/plugins/poster-plugin/src/templates/simple.js +58 -0
  97. package/.agent/plugins/poster-plugin/src/templates/social.js +62 -0
  98. package/.agent/plugins/poster-plugin/src/templates/tech.js +84 -0
  99. package/.agent/plugins/{temp-repo/puppeteer-plugin → puppeteer-plugin}/index.js +1 -1
  100. package/.agent/plugins.json +5 -11
  101. package/.agent/rules/GEMINI.md +273 -0
  102. package/.agent/rules/allow-rule.md +77 -0
  103. package/.agent/rules/log-rule.md +83 -0
  104. package/.agent/rules/security-rule.md +93 -0
  105. package/.agent/scripts/auto_preview.py +148 -0
  106. package/.agent/scripts/checklist.py +217 -0
  107. package/.agent/scripts/session_manager.py +120 -0
  108. package/.agent/scripts/verify_all.py +327 -0
  109. package/.agent/sessions/cli_default.json +419 -0
  110. package/.agent/sessions/weixin_o9cq80zgZqKPA2-s59PN43GdDy1w@im.wechat.json +2195 -0
  111. package/.agent/skills/api-patterns/SKILL.md +81 -0
  112. package/.agent/skills/api-patterns/api-style.md +42 -0
  113. package/.agent/skills/api-patterns/auth.md +24 -0
  114. package/.agent/skills/api-patterns/documentation.md +26 -0
  115. package/.agent/skills/api-patterns/graphql.md +41 -0
  116. package/.agent/skills/api-patterns/rate-limiting.md +31 -0
  117. package/.agent/skills/api-patterns/response.md +37 -0
  118. package/.agent/skills/api-patterns/rest.md +40 -0
  119. package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  120. package/.agent/skills/api-patterns/security-testing.md +122 -0
  121. package/.agent/skills/api-patterns/trpc.md +41 -0
  122. package/.agent/skills/api-patterns/versioning.md +22 -0
  123. package/.agent/skills/app-builder/SKILL.md +75 -0
  124. package/.agent/skills/app-builder/agent-coordination.md +71 -0
  125. package/.agent/skills/app-builder/feature-building.md +53 -0
  126. package/.agent/skills/app-builder/project-detection.md +34 -0
  127. package/.agent/skills/app-builder/scaffolding.md +118 -0
  128. package/.agent/skills/app-builder/tech-stack.md +40 -0
  129. package/.agent/skills/app-builder/templates/SKILL.md +39 -0
  130. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  131. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  132. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  133. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  134. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  135. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  136. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  137. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
  138. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
  139. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
  140. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
  141. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  142. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
  143. package/.agent/skills/architecture/SKILL.md +55 -0
  144. package/.agent/skills/architecture/context-discovery.md +43 -0
  145. package/.agent/skills/architecture/examples.md +94 -0
  146. package/.agent/skills/architecture/pattern-selection.md +68 -0
  147. package/.agent/skills/architecture/patterns-reference.md +50 -0
  148. package/.agent/skills/architecture/trade-off-analysis.md +77 -0
  149. package/.agent/skills/clean-code/SKILL.md +201 -0
  150. package/.agent/skills/doc.md +177 -0
  151. package/.agent/skills/frontend-design/SKILL.md +418 -0
  152. package/.agent/skills/frontend-design/animation-guide.md +331 -0
  153. package/.agent/skills/frontend-design/color-system.md +311 -0
  154. package/.agent/skills/frontend-design/decision-trees.md +418 -0
  155. package/.agent/skills/frontend-design/motion-graphics.md +306 -0
  156. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  157. package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
  158. package/.agent/skills/frontend-design/typography-system.md +345 -0
  159. package/.agent/skills/frontend-design/ux-psychology.md +1116 -0
  160. package/.agent/skills/frontend-design/visual-effects.md +383 -0
  161. package/.agent/skills/i18n-localization/SKILL.md +154 -0
  162. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  163. package/.agent/skills/mcp-builder/SKILL.md +176 -0
  164. package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
  165. package/.agent/workflows/brainstorm.md +113 -0
  166. package/.agent/workflows/create.md +59 -0
  167. package/.agent/workflows/debug.md +103 -0
  168. package/.agent/workflows/deploy.md +176 -0
  169. package/.agent/workflows/enhance.md +63 -0
  170. package/.agent/workflows/orchestrate.md +237 -0
  171. package/.agent/workflows/plan.md +89 -0
  172. package/.agent/workflows/preview.md +81 -0
  173. package/.agent/workflows/simple-test.md +42 -0
  174. package/.agent/workflows/status.md +86 -0
  175. package/.agent/workflows/structured-orchestrate.md +180 -0
  176. package/.agent/workflows/test.md +144 -0
  177. package/.agent/workflows/ui-ux-pro-max.md +296 -0
  178. package/.claude/settings.local.json +20 -8
  179. package/.env.example +56 -56
  180. package/CLAUDE.md +144 -108
  181. package/README.md +441 -441
  182. package/calc_tokens_weixin.js +81 -0
  183. package/cli/src/commands/chat.js +2 -1
  184. package/docs/CONTEXT_DESIGN.md +1596 -0
  185. package/examples/test-concurrent-chat.js +60 -60
  186. package/foliko-creative-3.png +0 -0
  187. package/foliko-creative-4.png +0 -0
  188. package/foliko-creative-5.png +0 -0
  189. package/package.json +2 -2
  190. package/plugins/default-plugins.js +2 -1
  191. package/plugins/extension-executor-plugin.js +91 -2
  192. package/plugins/file-system-plugin.js +2 -2
  193. package/plugins/memory-plugin.js +984 -0
  194. package/plugins/session-plugin.js +57 -1
  195. package/plugins/weixin-plugin.js +33 -23
  196. package/skills/find-skills/AGENTS.md +162 -162
  197. package/skills/find-skills/SKILL.md +133 -133
  198. package/skills/poster-guide/SKILL.md +1059 -0
  199. package/skills/python-plugin-dev/SKILL.md +238 -238
  200. package/skills/skill-guide/SKILL.md +130 -108
  201. package/src/capabilities/skill-manager.js +99 -0
  202. package/src/core/agent-chat.js +620 -141
  203. package/src/core/agent-context.js +188 -0
  204. package/src/core/agent.js +6 -2
  205. package/src/core/context-manager.js +283 -0
  206. package/src/core/framework.js +264 -3
  207. package/src/core/plugin-manager.js +79 -2
  208. package/src/core/request-context.js +98 -0
  209. package/src/core/session-context.js +341 -0
  210. package/src/core/session-storage.js +274 -0
  211. package/src/executors/mcp-executor.js +2 -2
  212. package/src/utils/index.js +239 -67
  213. package/src/utils/plugin-helpers.js +17 -0
  214. package/story-cover-book-v2.png +0 -0
  215. package/story-cover-japanese-1.png +0 -0
  216. package/story-cover-japanese-2.png +0 -0
  217. package/story-cover-japanese-3.png +0 -0
  218. package/story-cover-moran.png +0 -0
  219. package/undefined.png +0 -0
  220. package//346/265/267/346/212/245/346/217/222/344/273/266.md +621 -0
  221. package/.agent/agents/code-assistant.json +0 -14
  222. package/.agent/agents/email-assistant.json +0 -14
  223. package/.agent/agents/file-assistant.json +0 -15
  224. package/.agent/agents/system-assistant.json +0 -15
  225. package/.agent/agents/web-assistant.json +0 -12
  226. package/.agent/data/ambient/goals.json +0 -50
  227. package/.agent/data/ambient/memories.json +0 -7
  228. package/.agent/data/scheduler/tasks.json +0 -1
  229. package/.agent/package.json +0 -8
  230. package/.agent/plugins/__pycache__/test_plugin.cpython-312.pyc +0 -0
  231. package/.agent/plugins/daytona/README.md +0 -89
  232. package/.agent/plugins/daytona/index.js +0 -377
  233. package/.agent/plugins/daytona/package.json +0 -12
  234. package/.agent/plugins/marknative/README.md +0 -134
  235. package/.agent/plugins/marknative/index.js +0 -228
  236. package/.agent/plugins/marknative/package.json +0 -12
  237. package/.agent/plugins/marknative/update-readme.js +0 -134
  238. package/.agent/plugins/system-info/index.js +0 -387
  239. package/.agent/plugins/system-info/package.json +0 -4
  240. package/.agent/plugins/system-info/test.js +0 -40
  241. package/.agent/plugins/temp-repo/LICENSE +0 -201
  242. package/.agent/plugins/test_plugin.py +0 -304
  243. package/.agent/python-scripts/test_sample.py +0 -24
  244. package/.agent/skills/agent-browser/SKILL.md +0 -311
  245. package/.agent/skills/agent-browser/TEST_PLAN.md +0 -200
  246. package/.agent/skills/sysinfo/SKILL.md +0 -38
  247. package/.agent/skills/sysinfo/system-info.sh +0 -130
  248. package/.agent/skills/workflow/SKILL.md +0 -324
  249. package/.agent/workflows/email-digest.json +0 -50
  250. package/.agent/workflows/file-backup.json +0 -21
  251. package/.agent/workflows/get-ip-notify.json +0 -32
  252. package/.agent/workflows/news-aggregator.json +0 -93
  253. package/.agent/workflows/news-dashboard-v2.json +0 -94
  254. package/.agent/workflows/notification-batch.json +0 -32
  255. package/examples/test-chat-debug.js +0 -102
  256. package/examples/test-chat-result.js +0 -76
  257. package/examples/test-chat-stream-diff.js +0 -63
  258. /package/.agent/plugins/{temp-repo/puppeteer-plugin → puppeteer-plugin}/README.md +0 -0
  259. /package/.agent/plugins/{temp-repo/puppeteer-plugin → puppeteer-plugin}/package.json +0 -0
@@ -1,50 +0,0 @@
1
- {
2
- "name": "email-digest",
3
- "description": "邮件摘要工作流 - 读取未读邮件并生成摘要",
4
- "steps": [
5
- {
6
- "type": "tool",
7
- "name": "获取未读数",
8
- "tool": "email_unread_count",
9
- "args": {},
10
- "outputVariable": "unreadResult"
11
- },
12
- {
13
- "type": "condition",
14
- "name": "检查是否有新邮件",
15
- "branches": [
16
- {
17
- "name": "有新邮件",
18
- "condition": "context.variables.unreadResult && context.variables.unreadResult.unreadCount > 0",
19
- "steps": [
20
- {
21
- "type": "script",
22
- "name": "记录状态",
23
- "script": "context.variables.status='有新邮件'; return true;"
24
- }
25
- ]
26
- },
27
- {
28
- "name": "无新邮件",
29
- "condition": "!context.variables.unreadResult || context.variables.unreadResult.unreadCount === 0",
30
- "steps": [
31
- {
32
- "type": "script",
33
- "name": "记录状态",
34
- "script": "context.variables.status='无新邮件'; return false;"
35
- }
36
- ]
37
- }
38
- ]
39
- },
40
- {
41
- "type": "tool",
42
- "name": "发送通知",
43
- "tool": "notification_send",
44
- "args": {
45
- "title": "邮件摘要",
46
- "message": "未读邮件数: {{unreadResult.unreadCount}}"
47
- }
48
- }
49
- ]
50
- }
@@ -1,21 +0,0 @@
1
- {
2
- "name": "file-backup",
3
- "description": "文件备份工作流",
4
- "steps": [
5
- {
6
- "type": "script",
7
- "name": "准备路径",
8
- "outputVariable": "backupInfo",
9
- "script": "context.variables.source='.'; context.variables.dest='/backup'; return {source:'.',dest:'/backup'};"
10
- },
11
- {
12
- "type": "tool",
13
- "name": "发送通知",
14
- "tool": "notification_send",
15
- "args": {
16
- "title": "备份开始",
17
- "message": "开始备份文件"
18
- }
19
- }
20
- ]
21
- }
@@ -1,32 +0,0 @@
1
- {
2
- "name": "get-ip-notify",
3
- "description": "从 ifconfig.me 获取公网 IP 地址并发送系统通知",
4
- "steps": [
5
- {
6
- "type": "tool",
7
- "name": "获取IP信息",
8
- "tool": "fetch",
9
- "args": {
10
- "url": "https://ifconfig.me/ip",
11
- "timeout": 30000,
12
- "proxy": true
13
- },
14
- "outputVariable": "ipResult"
15
- },
16
- {
17
- "type": "script",
18
- "name": "提取IP",
19
- "outputVariable": "currentIp",
20
- "script": "var r=context.variables.ipResult; var ip=r&&r.success&&r.body?r.body.trim():null; return ip||'获取失败';"
21
- },
22
- {
23
- "type": "tool",
24
- "name": "发送通知",
25
- "tool": "notification_send",
26
- "args": {
27
- "title": "IP 信息",
28
- "message": "当前公网IP: {{currentIp}}"
29
- }
30
- }
31
- ]
32
- }
@@ -1,93 +0,0 @@
1
- {
2
- "name": "news-aggregator",
3
- "description": "从多个新闻源(百度新闻、BBC、Reddit)获取新闻,整理生成网页",
4
- "steps": [
5
- {
6
- "type": "script",
7
- "name": "初始化新闻存储",
8
- "outputVariable": "allNews",
9
- "script": "context.variables.allNews=[]; context.variables.sources=['百度新闻','BBC','Reddit']; return context.variables.allNews;"
10
- },
11
- {
12
- "type": "tool",
13
- "name": "获取百度新闻",
14
- "tool": "fetch",
15
- "args": {
16
- "url": "https://top.baidu.com/board?tab=realtime",
17
- "timeout": 15000,
18
- "proxy": true
19
- },
20
- "outputVariable": "baiduNewsResult"
21
- },
22
- {
23
- "type": "tool",
24
- "name": "获取BBC新闻",
25
- "tool": "fetch",
26
- "args": {
27
- "url": "https://feeds.bbci.co.uk/news/world/rss.xml",
28
- "timeout": 15000,
29
- "proxy": true
30
- },
31
- "outputVariable": "bbcNewsResult"
32
- },
33
- {
34
- "type": "tool",
35
- "name": "获取Reddit新闻",
36
- "tool": "fetch",
37
- "args": {
38
- "url": "https://www.reddit.com/r/news/.json?limit=20",
39
- "timeout": 15000,
40
- "proxy": true
41
- },
42
- "outputVariable": "redditNewsResult"
43
- },
44
- {
45
- "type": "script",
46
- "name": "处理百度新闻",
47
- "outputVariable": "baiduNews",
48
- "script": "var r=context.variables.baiduNewsResult; if(r&&r.success&&r.body){try{var matches=r.body.match(/href=\"\\/news\\/([^\"]+)\"[^>]*>([^<]+)<\\/a>/g);if(!matches)matches=r.body.match(/\"query\":\"([^\"]+)\"/g);var items=[];if(matches)for(var i=0;i<Math.min(matches.length,10);i++){var m=matches[i].match(/\"query\":\"([^\"]+)\"/)||matches[i].match(/>([^<]+)</);if(m&&m[1])items.push(m[1].trim());}context.variables.baiduNews=items.length?items:['百度新闻:页面解析中...'];}catch(e){context.variables.baiduNews=['百度新闻:获取成功'];}}else{context.variables.baiduNews=['百度新闻:获取失败'];}return context.variables.baiduNews;"
49
- },
50
- {
51
- "type": "script",
52
- "name": "处理BBC新闻",
53
- "outputVariable": "bbcNews",
54
- "script": "var r=context.variables.bbcNewsResult; var items=[]; if(r&&r.success&&r.body){try{var titles=r.body.match(/<title><!\\[CDATA\\[([^\\]]+)\\]\\]><\\/title>/g)||r.body.match(/<title>([^<]+)<\\/title>/g);if(titles)for(var i=1;i<Math.min(titles.length,11);i++){var m=titles[i].match(/\\[([^\\]]+)\\]/);if(m&&m[1]&&m[1]!=='BBC News')items.push(m[1]);}}catch(e){}if(items.length===0)items=['BBC:获取成功'];}else{items=['BBC:获取失败'];}context.variables.bbcNews=items; return items;"
55
- },
56
- {
57
- "type": "script",
58
- "name": "处理Reddit新闻",
59
- "outputVariable": "redditNews",
60
- "script": "var r=context.variables.redditNewsResult; var items=[]; if(r&&r.success&&r.body){try{var data=typeof r.body==='string'?JSON.parse(r.body):r.body;if(data&&data.data&&data.data.children){data.data.children.slice(0,10).forEach(function(item){if(item.data&&item.data.title)items.push(item.data.title);});}}catch(e){}if(items.length===0)items=['Reddit:获取成功'];}else{items=['Reddit:获取失败'];}context.variables.redditNews=items; return items;"
61
- },
62
- {
63
- "type": "script",
64
- "name": "生成HTML网页",
65
- "outputVariable": "htmlContent",
66
- "script": "var now=new Date();var dateStr=now.toLocaleDateString('zh-CN',{year:'numeric',month:'long',day:'numeric',hour:'2-digit',minute:'2-digit'});var baidu=context.variables.baiduNews||[];var bbc=context.variables.bbcNews||[];var reddit=context.variables.redditNews||[];var html='<!DOCTYPE html>\\n<html lang=\"zh-CN\">\\n<head>\\n<meta charset=\"UTF-8\">\\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\\n<title>全球新闻聚合 - '+dateStr+'</title>\\n<style>\\n*{margin:0;padding:0;box-sizing:border-box;}\\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);min-height:100vh;padding:20px;}\\n.container{max-width:1200px;margin:0 auto;}\\nh1{text-align:center;color:#fff;margin-bottom:30px;font-size:2.5em;text-shadow:2px 2px 4px rgba(0,0,0,0.3);}\\n.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(350px,1fr));gap:25px;}\\n.card{background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 10px 40px rgba(0,0,0,0.2);transition:transform 0.3s ease;}\\n.card:hover{transform:translateY(-5px);}\\n.card-header{padding:20px;color:#fff;font-weight:bold;font-size:1.3em;}\\n.card-header.baidu{background:linear-gradient(135deg,#4e54c8,#8f94fb);}\\n.card-header.bbc{background:linear-gradient(135deg,#b21f1f,#f64f59);}\\n.card-header.reddit{background:linear-gradient(135deg,#ff4500,#ff6a33);}\\n.card-body{padding:20px;}\\n.news-list{list-style:none;}\\n.news-list li{padding:12px 0;border-bottom:1px solid #eee;cursor:pointer;transition:all 0.2s;}\\n.news-list li:last-child{border-bottom:none;}\\n.news-list li:hover{color:#667eea;padding-left:10px;}\\n.news-list li::before{content:\"• \";color:#667eea;font-weight:bold;margin-right:8px;}\\n.timestamp{text-align:center;color:#999;font-size:0.9em;margin-top:20px;}\\n</style>\\n</head>\\n<body>\\n<div class=\"container\">\\n<h1>📰 全球新闻聚合</h1>\\n<div class=\"grid\">\\n<div class=\"card\"><div class=\"card-header baidu\">🇨🇳 百度新闻</div><div class=\"card-body\"><ul class=\"news-list\">';baidu.forEach(function(n){html+='<li>'+n+'</li>';});html+='</ul></div></div>\\n<div class=\"card\"><div class=\"card-header bbc\">🇬🇧 BBC News</div><div class=\"card-body\"><ul class=\"news-list\">';bbc.forEach(function(n){html+='<li>'+n+'</li>';});html+='</ul></div></div>\\n<div class=\"card\"><div class=\"card-header reddit\">🤖 Reddit News</div><div class=\"card-body\"><ul class=\"news-list\">';reddit.forEach(function(n){html+='<li>'+n+'</li>';});html+='</ul></div></div>\\n</div>\\n<p class=\"timestamp\">更新时间: '+dateStr+' | 数据来源: 百度新闻、BBC、Reddit</p>\\n</div>\\n</body>\\n</html>';return html;"
67
- },
68
- {
69
- "type": "script",
70
- "name": "生成文件名",
71
- "outputVariable": "filePath",
72
- "script": "var now=new Date();var dateStr=now.toISOString().slice(0,10).replace(/-/g,'');var timestamp=Date.now();context.variables.filePath='D:/Code/vb-agent/news-'+dateStr+'-'+timestamp+'.html';return context.variables.filePath;"
73
- },
74
- {
75
- "type": "tool",
76
- "name": "保存HTML文件",
77
- "tool": "write_file",
78
- "args": {
79
- "path": "{{filePath}}",
80
- "content": "{{htmlContent}}"
81
- }
82
- },
83
- {
84
- "type": "tool",
85
- "name": "发送完成通知",
86
- "tool": "notification_send",
87
- "args": {
88
- "title": "📰 新闻聚合完成",
89
- "message": "已从百度新闻、BBC、Reddit获取新闻\\n网页已生成: {{filePath}}"
90
- }
91
- }
92
- ]
93
- }
@@ -1,94 +0,0 @@
1
- {
2
- "name": "news-dashboard-v2",
3
- "description": "新闻汇总工作流v2 - 从网络获取真实新闻数据并生成网页",
4
- "version": "2.2",
5
- "steps": [
6
- {
7
- "id": "step-1",
8
- "type": "tool",
9
- "name": "获取当前日期时间",
10
- "tool": "get_time",
11
- "output": "dateResult"
12
- },
13
- {
14
- "id": "step-2",
15
- "type": "tool",
16
- "name": "获取百度热搜",
17
- "tool": "fetch",
18
- "args": {
19
- "url": "https://top.baidu.com/board?tab=realtime",
20
- "timeout": 15000,
21
- "proxy": true
22
- },
23
- "output": "baiduResult"
24
- },
25
- {
26
- "id": "step-3",
27
- "type": "tool",
28
- "name": "获取BBC国际新闻",
29
- "tool": "fetch",
30
- "args": {
31
- "url": "https://feeds.bbci.co.uk/news/world/rss.xml",
32
- "timeout": 15000,
33
- "proxy": true
34
- },
35
- "output": "bbcResult"
36
- },
37
- {
38
- "id": "step-4",
39
- "type": "tool",
40
- "name": "获取Reddit热门",
41
- "tool": "fetch",
42
- "args": {
43
- "url": "https://www.reddit.com/r/popular/hot.json?limit=15",
44
- "timeout": 15000,
45
- "proxy": true
46
- },
47
- "output": "redditResult"
48
- },
49
- {
50
- "id": "step-5",
51
- "type": "tool",
52
- "name": "获取香港新闻",
53
- "tool": "fetch",
54
- "args": {
55
- "url": "https://rsshub.app/rsshub/rss",
56
- "timeout": 15000,
57
- "proxy": true
58
- },
59
- "output": "hkResult"
60
- },
61
- {
62
- "id": "step-6",
63
- "type": "script",
64
- "name": "处理新闻数据",
65
- "script": "var dateResult = context.variables.dateResult || {};\nvar baiduResult = context.variables.baiduResult || {};\nvar bbcResult = context.variables.bbcResult || {};\nvar redditResult = context.variables.redditResult || {};\nvar hkResult = context.variables.hkResult || {};\n\nvar dateStr = (dateResult.beijingTime || dateResult.formatted || {}).beijingTime || new Date().toLocaleString('zh-CN');\nvar baiduRaw = typeof baiduResult === 'string' ? baiduResult : (baiduResult.body || baiduResult.content || JSON.stringify(baiduResult));\nvar bbcRaw = typeof bbcResult === 'string' ? bbcResult : (bbcResult.body || bbcResult.content || JSON.stringify(bbcResult));\nvar redditRaw = typeof redditResult === 'string' ? redditResult : (redditResult.body || redditResult.content || JSON.stringify(redditResult));\nvar hkRaw = typeof hkResult === 'string' ? hkResult : (hkResult.body || hkResult.content || JSON.stringify(hkResult));\n\nvar baiduNews = [];\nif (baiduRaw) {\n var titleMatch = baiduRaw.match(/<a[^>]*class=\"c-single-text-ellipsis\"[^>]*>([^<]+)<\\/a>/g);\n if (titleMatch) {\n for (var i = 0; i < Math.min(titleMatch.length, 20); i++) {\n baiduNews.push({rank: i + 1, title: titleMatch[i].replace(/<[^>]+>/g, '').trim()});\n }\n }\n}\n\nvar bbcNews = [];\nif (bbcRaw) {\n var itemMatch = bbcRaw.match(/<item[^>]*>[\\s\\S]*?<\\/item>/g);\n if (itemMatch) {\n for (var i = 0; i < Math.min(itemMatch.length, 15); i++) {\n var t = itemMatch[i].match(/<title>([^<]+)<\\/title>/);\n var l = itemMatch[i].match(/<link>([^<]+)<\\/link>/);\n if (t) {\n bbcNews.push({title: t[1].trim(), link: l ? l[1].trim() : '#'});\n }\n }\n }\n}\n\nvar redditNews = [];\nif (redditRaw) {\n try {\n var data = JSON.parse(redditRaw);\n var children = (data.data || {}).children || [];\n for (var i = 0; i < Math.min(children.length, 10); i++) {\n var d = children[i].data || {};\n redditNews.push({rank: i + 1, title: d.title || '', score: d.score || 0, subreddit: d.subreddit || ''});\n }\n } catch(e) {}\n}\n\nvar hkNews = [];\nif (hkRaw) {\n var itemMatch = hkRaw.match(/<item[^>]*>[\\s\\S]*?<\\/item>/g);\n if (itemMatch) {\n for (var i = 0; i < Math.min(itemMatch.length, 10); i++) {\n var t = itemMatch[i].match(/<title>([^<]+)<\\/title>/);\n var l = itemMatch[i].match(/<link>([^<]+)<\\/link>/);\n if (t) {\n hkNews.push({title: t[1].trim(), link: l ? l[1].trim() : '#'});\n }\n }\n }\n}\n\nreturn {date: dateStr, baidu: baiduNews, bbc: bbcNews, reddit: redditNews, hk: hkNews};",
66
- "output": "processedNews"
67
- },
68
- {
69
- "id": "step-7",
70
- "type": "script",
71
- "name": "生成完整HTML",
72
- "script": "var newsData = context.variables.processedNews || {};\nvar dateStr = newsData.date || new Date().toLocaleString('zh-CN');\nvar baidu = newsData.baidu || [];\nvar bbc = newsData.bbc || [];\nvar reddit = newsData.reddit || [];\nvar hk = newsData.hk || [];\n\nfunction renderRank(rank, isHot) {\n if (isHot && rank <= 3) {\n var colors = ['#ff6b6b', '#ffa502', '#26de81'];\n return '<span style=\"background:' + colors[rank - 1] + ';color:white;padding:2px 8px;border-radius:4px;font-weight:bold;\">' + rank + '</span>';\n }\n return '<span style=\"color:#888;\">' + rank + '</span>';\n}\n\nfunction renderItem(item, index, isHot) {\n var rank = index + 1;\n var title = item.title || '';\n var link = item.link || '#';\n var score = item.score || 0;\n var subreddit = item.subreddit || '';\n var rankHtml = renderRank(rank, isHot);\n if (link && link !== '#') {\n return '<li class=\"news-item\">' + rankHtml + ' <a href=\"' + link + '\" target=\"_blank\">' + title + '</a></li>';\n } else if (subreddit) {\n return '<li class=\"news-item\">' + rankHtml + ' <span style=\"color:#ff4500;\">r/' + subreddit + '</span> ' + title + ' <span style=\"color:#888;font-size:0.8em;\">▲ ' + score + '</span></li>';\n }\n return '<li class=\"news-item\">' + rankHtml + ' ' + title + '</li>';\n}\n\nfunction renderList(items, isHot) {\n return items.map(function(item, i) { return renderItem(item, i, isHot); }).join('\\n');\n}\n\nvar html = '<!DOCTYPE html><html lang=\"zh-CN\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>新闻汇总 - ' + dateStr + '</title><style>*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);min-height:100vh;padding:20px}.container{max-width:1200px;margin:0 auto}header{text-align:center;color:white;padding:30px 0}header h1{font-size:2.5em;margin-bottom:10px;text-shadow:2px 2px 4px rgba(0,0,0,0.2)}header p{opacity:0.9;font-size:1.1em}.tabs{display:flex;gap:10px;margin-bottom:20px;flex-wrap:wrap;justify-content:center}.tab-btn{padding:12px 24px;border:none;border-radius:25px;cursor:pointer;font-size:1em;font-weight:600;transition:all 0.3s;background:rgba(255,255,255,0.2);color:white}.tab-btn:hover,.tab-btn.active{background:white;color:#667eea}.tab-content{display:none;background:white;border-radius:20px;padding:30px;box-shadow:0 20px 60px rgba(0,0,0,0.2)}.tab-content.active{display:block}.tab-content h2{color:#333;margin-bottom:20px;padding-bottom:10px;border-bottom:3px solid #667eea;display:inline-block}.news-item{padding:12px 0;border-bottom:1px solid #eee;display:flex;align-items:center;gap:10px}.news-item:last-child{border-bottom:none}.news-item a{color:#333;text-decoration:none;flex:1}.news-item a:hover{color:#667eea}.news-list{list-style:none}.empty{color:#888;text-align:center;padding:40px}@media(max-width:768px){body{padding:10px}header h1{font-size:1.8em}.tab-btn{padding:10px 16px;font-size:0.9em}.tab-content{padding:20px}}</style></head><body><div class=\"container\"><header><h1>📰 新闻汇总</h1><p>更新时间: ' + dateStr + '</p></header><div class=\"tabs\"><button class=\"tab-btn active\" onclick=\"showTab(\\'baidu\\')\">🔥 百度热搜</button><button class=\"tab-btn\" onclick=\"showTab(\\'bbc\\')\">🌍 BBC国际</button><button class=\"tab-btn\" onclick=\"showTab(\\'hk\\')\">🇭🇰 香港新闻</button><button class=\"tab-btn\" onclick=\"showTab(\\'reddit\\')\">💬 Reddit热帖</button></div><div id=\"baidu\" class=\"tab-content active\"><h2>🔥 百度热搜</h2><ul class=\"news-list\">' + (baidu.length > 0 ? renderList(baidu, true) : '<li class=\"empty\">正在获取数据...</li>') + '</ul></div><div id=\"bbc\" class=\"tab-content\"><h2>🌍 BBC国际新闻</h2><ul class=\"news-list\">' + (bbc.length > 0 ? renderList(bbc, false) : '<li class=\"empty\">正在获取数据...</li>') + '</ul></div><div id=\"hk\" class=\"tab-content\"><h2>🇭🇰 香港新闻</h2><ul class=\"news-list\">' + (hk.length > 0 ? renderList(hk, false) : '<li class=\"empty\">正在获取数据...</li>') + '</ul></div><div id=\"reddit\" class=\"tab-content\"><h2>💬 Reddit热门帖子</h2><ul class=\"news-list\">' + (reddit.length > 0 ? renderList(reddit, false) : '<li class=\"empty\">正在获取数据...</li>') + '</ul></div></div><script>function showTab(n){document.querySelectorAll(\".tab-content\").forEach(function(e){e.classList.remove(\"active\")});document.querySelectorAll(\".tab-btn\").forEach(function(e){e.classList.remove(\"active\")});document.getElementById(n).classList.add(\"active\");event.target.classList.add(\"active\")}</script></body></html>';\nreturn html;",
73
- "output": "finalHtml"
74
- },
75
- {
76
- "id": "step-8",
77
- "type": "tool",
78
- "name": "保存HTML文件",
79
- "tool": "write_file",
80
- "args": {
81
- "path": "D:\\Code\\vb-agent\\news.html",
82
- "content": "${step-7.output}"
83
- },
84
- "output": "savedPath"
85
- },
86
- {
87
- "id": "step-9",
88
- "type": "script",
89
- "name": "返回结果",
90
- "script": "return JSON.stringify({success: true, message: '新闻汇总工作流执行完成', output_file: 'D:\\\\Code\\\\vb-agent\\\\news.html', note: '新闻数据已从网络获取并生成网页'}, null, 2);",
91
- "output": "workflowResult"
92
- }
93
- ]
94
- }
@@ -1,32 +0,0 @@
1
- {
2
- "name": "notification-batch",
3
- "description": "批量通知工作流",
4
- "steps": [
5
- {
6
- "type": "script",
7
- "name": "初始化",
8
- "script": "context.variables.total=3; context.variables.sent=0; return {total:3};"
9
- },
10
- {
11
- "type": "loop",
12
- "name": "发送通知",
13
- "maxIterations": 3,
14
- "steps": [
15
- {
16
- "type": "script",
17
- "name": "计数",
18
- "script": "context.variables.sent=context.variables.sent+1;"
19
- },
20
- {
21
- "type": "tool",
22
- "name": "发送单个通知",
23
- "tool": "notification_send",
24
- "args": {
25
- "title": "进度",
26
- "message": "已发送: {{sent}}/{{total}}"
27
- }
28
- }
29
- ]
30
- }
31
- ]
32
- }
@@ -1,102 +0,0 @@
1
- /**
2
- * chat() 持续聊天调试测试
3
- * 专门测试 chat 方法为什么不返回数据
4
- */
5
-
6
- const { Framework } = require('../src');
7
- const AIPlugin = require('../plugins/ai-plugin');
8
- require('dotenv').config();
9
-
10
- async function main() {
11
- console.log('=== chat() 持续聊天调试测试 ===\n');
12
-
13
- // 创建框架
14
- const framework = new Framework({ debug: true });
15
-
16
- // 使用 MiniMax (Agent SDK)
17
- await framework.loadPlugin(
18
- new AIPlugin({
19
- provider: 'minimax',
20
- model: 'MiniMax-M2.7',
21
- apiKey: process.env.MINIMAX_API_KEY || 'your-api-key',
22
- })
23
- );
24
-
25
- // 注册一个简单的测试工具
26
- const { z } = require('zod');
27
- framework.registerTool({
28
- name: 'test_tool',
29
- description: '测试工具,返回传入的参数',
30
- inputSchema: z.object({
31
- msg: z.string().describe('要返回的消息'),
32
- }),
33
- execute: async (args) => {
34
- console.log('[DEBUG] test_tool called with:', args);
35
- return `工具收到: ${args.msg}`;
36
- },
37
- });
38
-
39
- console.log('[Framework] Ready!');
40
- console.log('[Tools]', framework.getTools().map((t) => t.name));
41
-
42
- // 创建 Agent
43
- const agent = framework.createAgent({
44
- name: 'DebugAgent',
45
- systemPrompt: '你是一个有帮助的助手。如果用户要求使用工具,请使用工具。',
46
- });
47
-
48
- // 监听所有事件
49
- agent.on('tool-call', (tool) => {
50
- console.log('[Event] tool-call:', tool.name, tool.args);
51
- });
52
-
53
- agent.on('tool-result', (result) => {
54
- console.log('[Event] tool-result:', result.name, '->', JSON.stringify(result.result).substring(0, 200));
55
- });
56
-
57
- agent.on('error', (err) => {
58
- console.error('[Event] error:', err.error);
59
- });
60
-
61
- // 测试函数
62
- const testChat = async (question, round) => {
63
- console.log(`\n========== Round ${round} ==========`);
64
- console.log(`[User] ${question}`);
65
-
66
- try {
67
- // 打印 result 的完整结构
68
- const result = await agent.chat(question);
69
- console.log(`\n[DEBUG] result keys:`, Object.keys(result));
70
- console.log(`[DEBUG] result:`, JSON.stringify(result, null, 2).substring(0, 500));
71
-
72
- if (result.message) {
73
- console.log(`\n[Agent] ${result.message}`);
74
- } else {
75
- console.log(`\n[WARNING] result.message is empty!`);
76
- }
77
-
78
- // 打印当前消息历史长度
79
- const chatHandler = agent._chatHandler;
80
- if (chatHandler) {
81
- console.log(`[DEBUG] _messages.length:`, chatHandler._messages.length);
82
- console.log(`[DEBUG] compression count:`, chatHandler._compressionCount);
83
- }
84
- } catch (err) {
85
- console.error(`\n[Error]`, err.message);
86
- console.error(err.stack);
87
- }
88
- };
89
-
90
- // 执行多轮测试
91
- await testChat('你好,介绍一下你自己', 1);
92
- await testChat('请用 test_tool 工具返回 "hello world"', 2);
93
- await testChat('今天天气不错,你觉得呢?', 3);
94
- await testChat('帮我计算 123 + 456 等于多少', 4);
95
- await testChat('再说一次你的名字', 5);
96
-
97
- console.log('\n========== 测试完成 ==========');
98
-
99
- await framework.destroy();
100
- }
101
-
102
- main().catch(console.error);
@@ -1,76 +0,0 @@
1
- /**
2
- * 测试 chat() 返回值的完整结构
3
- */
4
-
5
- const { Framework } = require('../src');
6
- const AIPlugin = require('../plugins/ai-plugin');
7
- require('dotenv').config();
8
-
9
- async function main() {
10
- console.log('=== 测试 chat() 返回值结构 ===\n');
11
-
12
- const framework = new Framework({ debug: true });
13
-
14
- await framework.loadPlugin(
15
- new AIPlugin({
16
- provider: 'minimax',
17
- model: 'MiniMax-M2.7',
18
- apiKey: process.env.MINIMAX_API_KEY || 'your-api-key',
19
- })
20
- );
21
-
22
- const { z } = require('zod');
23
- framework.registerTool({
24
- name: 'echo',
25
- description: '返回输入的内容',
26
- inputSchema: z.object({
27
- msg: z.string().describe('要返回的消息'),
28
- }),
29
- execute: async (args) => {
30
- return `工具收到: ${args.msg}`;
31
- },
32
- });
33
-
34
- console.log('[Framework] Ready!');
35
-
36
- const agent = framework.createAgent({
37
- name: 'TestAgent',
38
- systemPrompt: '你是一个有帮助的助手。',
39
- });
40
-
41
- // 测试 1:简单对话
42
- console.log('\n--- 测试 1:简单对话 ---');
43
- try {
44
- const result = await agent.chat('你好');
45
- console.log('[DEBUG] result:', JSON.stringify(result, null, 2));
46
- console.log('[DEBUG] result 顶层 keys:', Object.keys(result));
47
- } catch (err) {
48
- console.error('[Error]', err.message);
49
- }
50
-
51
- // 测试 2:触发工具调用
52
- console.log('\n--- 测试 2:触发工具调用 ---');
53
- try {
54
- const result = await agent.chat('请用 echo 工具返回 "hello"');
55
- console.log('[DEBUG] result:', JSON.stringify(result, null, 2));
56
- console.log('[DEBUG] result 顶层 keys:', Object.keys(result));
57
- } catch (err) {
58
- console.error('[Error]', err.message);
59
- }
60
-
61
- // 测试 3:多次对话(累积上下文)
62
- console.log('\n--- 测试 3:多次对话 ---');
63
- try {
64
- await agent.chat('你好');
65
- await agent.chat('今天天气不错');
66
- const result = await agent.chat('我刚才说什么了?');
67
- console.log('[DEBUG] result:', JSON.stringify(result, null, 2));
68
- } catch (err) {
69
- console.error('[Error]', err.message);
70
- }
71
-
72
- await framework.destroy();
73
- console.log('\n[Done]');
74
- }
75
-
76
- main().catch(console.error);
@@ -1,63 +0,0 @@
1
- /**
2
- * 测试 chat 和 chatStream 的差异
3
- */
4
-
5
- const { Framework } = require('../src');
6
- const AIPlugin = require('../plugins/ai-plugin');
7
- const SessionPlugin = require('../plugins/session-plugin');
8
- require('dotenv').config();
9
-
10
- async function main() {
11
- console.log('=== 测试 chat vs chatStream 差异 ===\n');
12
-
13
- const framework = new Framework({ debug: false });
14
-
15
- await framework.loadPlugin(
16
- new AIPlugin({
17
- provider: 'minimax',
18
- model: 'MiniMax-M2.7',
19
- apiKey: process.env.MINIMAX_API_KEY || 'your-api-key',
20
- })
21
- );
22
- await framework.loadPlugin(new SessionPlugin());
23
-
24
- const systemPrompt = `你是一个有帮助的助手。`;
25
-
26
- const agent = framework.createAgent({
27
- name: 'TestAgent',
28
- systemPrompt: systemPrompt,
29
- });
30
-
31
- const sessionId = 'test_session';
32
- const sessionPlugin = framework.pluginManager.get('session');
33
- sessionPlugin.getOrCreateSession(sessionId, { metadata: {} });
34
-
35
- // 测试 chat
36
- console.log('--- Test 1: chat() ---');
37
- const result1 = await agent.chat('你好,介绍一下自己', { sessionId });
38
- console.log('chat result.message length:', result1.message?.length);
39
- console.log('chat result.message:', result1.message?.substring(0, 100));
40
-
41
- // 测试 chatStream
42
- console.log('\n--- Test 2: chatStream() ---');
43
- let streamText = '';
44
- for await (const chunk of agent.chatStream('今天天气怎么样?', { sessionId })) {
45
- if (chunk.type === 'text') {
46
- streamText += chunk.text;
47
- }
48
- }
49
- console.log('chatStream full text length:', streamText.length);
50
- console.log('chatStream full text:', streamText.substring(0, 100));
51
-
52
- // 测试更多轮对话后的 chat
53
- console.log('\n--- Test 3: 多轮后 chat() ---');
54
- await agent.chat('再说一次你的名字', { sessionId });
55
- const result3 = await agent.chat('我叫什么?', { sessionId });
56
- console.log('chat result.message length:', result3.message?.length);
57
- console.log('chat result.message:', result3.message?.substring(0, 100));
58
-
59
- await framework.destroy();
60
- console.log('\n[Done]');
61
- }
62
-
63
- main().catch(console.error);