foliko 1.1.36 → 1.1.39

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 (168) hide show
  1. package/.agent/agents/network-requester.md +44 -0
  2. package/.agent/agents/poster-designer.md +52 -0
  3. package/.agent/agents/ui-designer.md +1 -1
  4. package/.agent/data/default.json +23 -407
  5. package/.agent/data/email/processed-emails.json +1 -0
  6. package/.agent/data/plugins-state.json +103 -200
  7. package/.agent/data/scheduler/tasks.json +1 -86
  8. package/.agent/data/web/web-config.json +5 -0
  9. package/.agent/data/weixin/images/file_1776188148383jpg +0 -0
  10. package/.agent/data/weixin/images/file_1776188458326.jpg +0 -0
  11. package/.agent/data/weixin/images/file_1776188689423.jpg +0 -0
  12. package/.agent/data/weixin/images/file_1776188813604.jpg +0 -0
  13. package/.agent/data/weixin/images/file_1776189097450.jpg +0 -0
  14. package/.agent/data/weixin/videos/file_1776188318431.mp4 +0 -0
  15. package/.agent/mcp_config.json +4 -17
  16. package/.agent/memory/user/mof6gk94-kneeuh.md +9 -0
  17. package/.agent/package.json +8 -0
  18. package/.agent/plugins/marknative/README.md +134 -0
  19. package/.agent/plugins/marknative/fonts/SegoeUI Emoji.ttf +0 -0
  20. package/.agent/plugins/marknative/fonts.zip +0 -0
  21. package/.agent/plugins/marknative/index.js +256 -0
  22. package/.agent/plugins/marknative/package.json +12 -0
  23. package/.agent/plugins/test-plugin.py +99 -0
  24. package/.agent/plugins.json +11 -5
  25. package/.agent/python-scripts/test_sample.py +24 -0
  26. package/.agent/sessions/cli_default.json +2415 -349
  27. package/.agent/sessions/default.json +82 -0
  28. package/.agent/sessions/qq_c2c_D960F12877541624D7B2C836110B3D0F.json +25 -0
  29. package/.agent/sessions/test-clean.json +26 -0
  30. package/.agent/sessions/test-compress.json +1462 -0
  31. package/.agent/sessions/test-session.json +13 -0
  32. package/.agent/sessions/weixin_test.json +22 -0
  33. package/.agent/sessions/weixin_test_user_123.json +11 -0
  34. package/.agent/skills/agent-browser/SKILL.md +311 -0
  35. package/.agent/skills/agent-browser/TEST_PLAN.md +200 -0
  36. package/.agent/skills/sysinfo/SKILL.md +38 -0
  37. package/.agent/skills/sysinfo/system-info.sh +130 -0
  38. package/.agent/skills/workflow/SKILL.md +324 -0
  39. package/.agent/test-agent.js +35 -0
  40. package/.agent/weixin.json +6 -0
  41. package/.agent/workflows/email-digest.json +50 -0
  42. package/.agent/workflows/file-backup.json +21 -0
  43. package/.agent/workflows/get-ip-notify.json +32 -0
  44. package/.agent/workflows/news-aggregator.json +93 -0
  45. package/.agent/workflows/news-dashboard-v2.json +94 -0
  46. package/.agent/workflows/notification-batch.json +32 -0
  47. package/.claude/settings.local.json +2 -1
  48. package/.env.example +56 -56
  49. package/README.md +441 -441
  50. package/cli/src/utils/debounce.js +6 -3
  51. package/docs/qq-bot.md +976 -0
  52. package/package.json +3 -1
  53. package/plugins/qq-plugin.js +939 -0
  54. package/plugins/scheduler-plugin.js +17 -17
  55. package/skills/find-skills/AGENTS.md +162 -162
  56. package/skills/find-skills/SKILL.md +133 -133
  57. package/src/core/agent-chat.js +11 -6
  58. package/temp_img.md +1 -0
  59. package/website_v2/styles/animations.css +7 -7
  60. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +0 -26
  61. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +0 -97
  62. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +0 -101
  63. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +0 -31
  64. package/.agent/.shared/ui-ux-pro-max/data/products.csv +0 -97
  65. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +0 -24
  66. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +0 -45
  67. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  68. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  69. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  70. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  71. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -51
  72. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  73. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  74. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -54
  75. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  76. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  77. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  78. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  79. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +0 -59
  80. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +0 -58
  81. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  82. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  83. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +0 -31
  84. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  85. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  86. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +0 -258
  87. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +0 -1067
  88. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +0 -106
  89. package/.agent/ARCHITECTURE.md +0 -288
  90. package/.agent/data/ambient/goals.json +0 -1
  91. package/.agent/data/puppeteer-sessions/undefined.json +0 -6
  92. package/.agent/data/weixin-media/2026-04-08/img_1775618677512.jpg +0 -0
  93. package/.agent/data/weixin-media/2026-04-08/img_1775619073340.jpg +0 -0
  94. package/.agent/data/weixin-media/2026-04-08/img_1775619097536.jpg +0 -0
  95. package/.agent/data/weixin-media/2026-04-08/img_1775619209388.jpg +0 -0
  96. package/.agent/memory/feedback/mnygjgox-ualjip.md +0 -11
  97. package/.agent/memory/feedback/mnzugpej-esdwsr.md +0 -9
  98. package/.agent/memory/feedback/mo2quxke-saxs56.md +0 -9
  99. package/.agent/memory/feedback/mo9l6nw9-sm1ye2.md +0 -13
  100. package/.agent/memory/feedback/mo9uxkb3-bbxz3x.md +0 -9
  101. package/.agent/memory/feedback/mo9wpqy0-ftsez9.md +0 -13
  102. package/.agent/memory/feedback/mo9x2ps4-p7huqq.md +0 -11
  103. package/.agent/memory/feedback/mo9x2uay-z7ndjn.md +0 -9
  104. package/.agent/memory/feedback/mo9x2y7d-9wecyx.md +0 -9
  105. package/.agent/memory/feedback/mo9x39q3-nn7myt.md +0 -9
  106. package/.agent/memory/feedback/mo9xfir9-4g8a8j.md +0 -9
  107. package/.agent/memory/feedback/mo9xfui8-ujqrc6.md +0 -9
  108. package/.agent/memory/feedback/mocnx1wx-qtxxlh.md +0 -9
  109. package/.agent/memory/project/mnqx54u5-loqtoe.md +0 -9
  110. package/.agent/memory/project/mnqx84cv-mx6dmd.md +0 -9
  111. package/.agent/memory/project/mnsacuyr-hgtk5n.md +0 -20
  112. package/.agent/memory/project/mnu5hy2x-bjsg7u.md +0 -9
  113. package/.agent/memory/project/mny28ot4-8qe9au.md +0 -9
  114. package/.agent/memory/project/mnztftxj-af82rh.md +0 -9
  115. package/.agent/memory/project/mo0y04d0-bmaefl.md +0 -9
  116. package/.agent/memory/project/mo2iztxb-3c7v81.md +0 -9
  117. package/.agent/memory/project/mo2ssa5x-tpi1p3.md +0 -9
  118. package/.agent/memory/reference/mnre3cww-penbo1.md +0 -9
  119. package/.agent/memory/reference/mns9wn48-luerua.md +0 -14
  120. package/.agent/memory/reference/mns9yz5c-thc2s0.md +0 -16
  121. package/.agent/memory/reference/mnsfy4um-910f1o.md +0 -23
  122. package/.agent/memory/reference/mnsg37dp-lmfj18.md +0 -32
  123. package/.agent/memory/reference/mnsll60q-0j911u.md +0 -36
  124. package/.agent/memory/reference/mnsmlb5y-nej31u.md +0 -16
  125. package/.agent/memory/reference/mnssle72-yrot96.md +0 -9
  126. package/.agent/memory/reference/mnygj8nb-bjthmc.md +0 -20
  127. package/.agent/memory/reference/mnzfvs4m-ufyg9a.md +0 -12
  128. package/.agent/memory/user/mnsfuon6-l416q1.md +0 -21
  129. package/.agent/memory/user/mnsg9kut-95m7rf.md +0 -20
  130. package/.agent/memory/user/mnu2eo1v-yy6fhe.md +0 -9
  131. package/.agent/memory/user/mnu2etuo-8u8jk8.md +0 -9
  132. package/.agent/memory/user/mnx0rk6g-gsznjj.md +0 -9
  133. package/.agent/memory/user/mnyf1riz-4yo5yz.md +0 -9
  134. package/.agent/memory/user/mnzuh4cw-zvee8w.md +0 -13
  135. package/.agent/memory/user/mnzvewyj-jl67cq.md +0 -9
  136. package/.agent/memory/user/mnzwh9xo-43ys3f.md +0 -9
  137. package/.agent/memory/user/mo0ycvpn-eebsxc.md +0 -9
  138. package/.agent/memory/user/mo2k8c8n-132r2u.md +0 -9
  139. package/.agent/memory/user/mo6y2dei-5cf537.md +0 -13
  140. package/.agent/memory/user/mo9xsdo6-8vylww.md +0 -13
  141. package/.agent/plugins/puppeteer-plugin/README.md +0 -147
  142. package/.agent/plugins/puppeteer-plugin/index.js +0 -1422
  143. package/.agent/plugins/puppeteer-plugin/package.json +0 -9
  144. package/.agent/rules/GEMINI.md +0 -273
  145. package/.agent/rules/allow-rule.md +0 -77
  146. package/.agent/rules/log-rule.md +0 -83
  147. package/.agent/rules/security-rule.md +0 -93
  148. package/.agent/scripts/auto_preview.py +0 -148
  149. package/.agent/scripts/checklist.py +0 -217
  150. package/.agent/scripts/session_manager.py +0 -120
  151. package/.agent/scripts/verify_all.py +0 -327
  152. package/.agent/skills/doc.md +0 -177
  153. package/.agent/skills/fk-poster/SKILL.md +0 -1129
  154. package/.agent/skills/fkbuilder/SKILL.md +0 -730
  155. package/.agent/skills/mmx-cli/SKILL.md +0 -431
  156. package/.agent/workflows/brainstorm.md +0 -113
  157. package/.agent/workflows/create.md +0 -59
  158. package/.agent/workflows/debug.md +0 -103
  159. package/.agent/workflows/deploy.md +0 -176
  160. package/.agent/workflows/enhance.md +0 -63
  161. package/.agent/workflows/orchestrate.md +0 -237
  162. package/.agent/workflows/plan.md +0 -89
  163. package/.agent/workflows/preview.md +0 -81
  164. package/.agent/workflows/simple-test.md +0 -42
  165. package/.agent/workflows/status.md +0 -86
  166. package/.agent/workflows/structured-orchestrate.md +0 -180
  167. package/.agent/workflows/test.md +0 -144
  168. package/.agent/workflows/ui-ux-pro-max.md +0 -296
@@ -0,0 +1,93 @@
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
+ }
@@ -0,0 +1,94 @@
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
+ }
@@ -0,0 +1,32 @@
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
+ }
@@ -206,7 +206,8 @@
206
206
  "mcp__MiniMax__web_search",
207
207
  "Bash(npm test:*)",
208
208
  "Bash(node -e \"require\\('./src/index.js'\\); console.log\\('Module loaded successfully'\\)\")",
209
- "Bash(node examples/basic.js 2>&1)"
209
+ "Bash(node examples/basic.js 2>&1)",
210
+ "Bash(node -c plugins/qq-plugin.js 2>&1)"
210
211
  ]
211
212
  }
212
213
  }
package/.env.example CHANGED
@@ -1,56 +1,56 @@
1
- # ========== AI Configuration ==========
2
- # 最大输出 tokens(影响 AI 回复长度)
3
- MAX_OUTPUT_TOKENS=8192
4
- # AI Provider: minimax, deepseek, openai, anthropic 等
5
- FOLIKO_PROVIDER=minimax
6
-
7
- # AI Model(如果未设置,使用 provider 默认值)
8
- # MiniMax: MiniMax-M2.7
9
- # DeepSeek: deepseek-chat, deepseek-coder 等
10
- FOLIKO_MODEL=MiniMax-M2.7
11
-
12
- # API Base URL(如果未设置,使用 provider 默认值)
13
- # MiniMax: https://api.minimaxi.com/v1
14
- # DeepSeek: https://api.deepseek.com/v1
15
- FOLIKO_BASE_URL=https://api.minimaxi.com/v1
16
-
17
- # API Key(通用,如果未设置则尝试 provider 专用 key)
18
- FOLIKO_API_KEY=sk-your-api-key
19
-
20
- # Provider 专用 API Key(可选,如果 FOLIKO_API_KEY 未设置则使用这些)
21
- DEEPSEEK_API_KEY=sk-your-deepseek-api-key
22
- MINIMAX_API_KEY=sk-your-minimax-api-key
23
-
24
- # ========== Email Configuration ==========
25
- # SMTP Settings (for sending emails)
26
- SMTP_HOST=smtp.gmail.com
27
- SMTP_PORT=587
28
- SMTP_SECURE=false
29
- SMTP_USER=your-email@gmail.com
30
- SMTP_PASS=your-app-password
31
-
32
- # IMAP Settings (for reading emails)
33
- IMAP_HOST=imap.gmail.com
34
- IMAP_PORT=993
35
- IMAP_USER=your-email@gmail.com
36
- IMAP_PASS=your-app-password
37
-
38
- # Default sender email address
39
- FROM_EMAIL=your-email@gmail.com
40
-
41
- # ========== Telegram Bot (optional) ==========
42
- TELEGRAM_BOT_TOKEN=your-telegram-bot-token
43
-
44
- # ========== Feishu Bot (optional) ==========
45
- FEISHU_APP_ID=cli_xxxxxxxxxxx
46
- FEISHU_APP_SECRET=app_secret
47
-
48
- # ========== Web Server (optional) ==========
49
- # Web 服务端口,默认 8088
50
- WEB_PORT=3000
51
-
52
- # Web 服务主机,默认 127.0.0.1
53
- WEB_HOST=127.0.0.1
54
-
55
- # 公网访问的 base URL(用于生成 webhook URL 等),不设置则使用 host:port,最好部署在docker中可以暴露自定义域名
56
- WEB_BASE_URL=https://your-domain.com
1
+ # ========== AI Configuration ==========
2
+ # 最大输出 tokens(影响 AI 回复长度)
3
+ MAX_OUTPUT_TOKENS=8192
4
+ # AI Provider: minimax, deepseek, openai, anthropic 等
5
+ FOLIKO_PROVIDER=minimax
6
+
7
+ # AI Model(如果未设置,使用 provider 默认值)
8
+ # MiniMax: MiniMax-M2.7
9
+ # DeepSeek: deepseek-chat, deepseek-coder 等
10
+ FOLIKO_MODEL=MiniMax-M2.7
11
+
12
+ # API Base URL(如果未设置,使用 provider 默认值)
13
+ # MiniMax: https://api.minimaxi.com/v1
14
+ # DeepSeek: https://api.deepseek.com/v1
15
+ FOLIKO_BASE_URL=https://api.minimaxi.com/v1
16
+
17
+ # API Key(通用,如果未设置则尝试 provider 专用 key)
18
+ FOLIKO_API_KEY=sk-your-api-key
19
+
20
+ # Provider 专用 API Key(可选,如果 FOLIKO_API_KEY 未设置则使用这些)
21
+ DEEPSEEK_API_KEY=sk-your-deepseek-api-key
22
+ MINIMAX_API_KEY=sk-your-minimax-api-key
23
+
24
+ # ========== Email Configuration ==========
25
+ # SMTP Settings (for sending emails)
26
+ SMTP_HOST=smtp.gmail.com
27
+ SMTP_PORT=587
28
+ SMTP_SECURE=false
29
+ SMTP_USER=your-email@gmail.com
30
+ SMTP_PASS=your-app-password
31
+
32
+ # IMAP Settings (for reading emails)
33
+ IMAP_HOST=imap.gmail.com
34
+ IMAP_PORT=993
35
+ IMAP_USER=your-email@gmail.com
36
+ IMAP_PASS=your-app-password
37
+
38
+ # Default sender email address
39
+ FROM_EMAIL=your-email@gmail.com
40
+
41
+ # ========== Telegram Bot (optional) ==========
42
+ TELEGRAM_BOT_TOKEN=your-telegram-bot-token
43
+
44
+ # ========== Feishu Bot (optional) ==========
45
+ FEISHU_APP_ID=cli_xxxxxxxxxxx
46
+ FEISHU_APP_SECRET=app_secret
47
+
48
+ # ========== Web Server (optional) ==========
49
+ # Web 服务端口,默认 8088
50
+ WEB_PORT=3000
51
+
52
+ # Web 服务主机,默认 127.0.0.1
53
+ WEB_HOST=127.0.0.1
54
+
55
+ # 公网访问的 base URL(用于生成 webhook URL 等),不设置则使用 host:port,最好部署在docker中可以暴露自定义域名
56
+ WEB_BASE_URL=https://your-domain.com