foliko 1.0.73 → 1.0.75

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 (237) 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 +29 -0
  39. package/.agent/data/plugins-state.json +255 -0
  40. package/.agent/mcp_config.json +4 -0
  41. package/.agent/mcp_config_updated.json +12 -0
  42. package/.agent/plugins.json +5 -0
  43. package/.agent/rules/GEMINI.md +273 -0
  44. package/.agent/rules/allow-rule.md +77 -0
  45. package/.agent/rules/log-rule.md +83 -0
  46. package/.agent/rules/security-rule.md +93 -0
  47. package/.agent/scripts/auto_preview.py +148 -0
  48. package/.agent/scripts/checklist.py +217 -0
  49. package/.agent/scripts/session_manager.py +120 -0
  50. package/.agent/scripts/verify_all.py +327 -0
  51. package/.agent/skills/api-patterns/SKILL.md +81 -0
  52. package/.agent/skills/api-patterns/api-style.md +42 -0
  53. package/.agent/skills/api-patterns/auth.md +24 -0
  54. package/.agent/skills/api-patterns/documentation.md +26 -0
  55. package/.agent/skills/api-patterns/graphql.md +41 -0
  56. package/.agent/skills/api-patterns/rate-limiting.md +31 -0
  57. package/.agent/skills/api-patterns/response.md +37 -0
  58. package/.agent/skills/api-patterns/rest.md +40 -0
  59. package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  60. package/.agent/skills/api-patterns/security-testing.md +122 -0
  61. package/.agent/skills/api-patterns/trpc.md +41 -0
  62. package/.agent/skills/api-patterns/versioning.md +22 -0
  63. package/.agent/skills/app-builder/SKILL.md +75 -0
  64. package/.agent/skills/app-builder/agent-coordination.md +71 -0
  65. package/.agent/skills/app-builder/feature-building.md +53 -0
  66. package/.agent/skills/app-builder/project-detection.md +34 -0
  67. package/.agent/skills/app-builder/scaffolding.md +118 -0
  68. package/.agent/skills/app-builder/tech-stack.md +40 -0
  69. package/.agent/skills/app-builder/templates/SKILL.md +39 -0
  70. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  71. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  72. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  73. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  74. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  75. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  76. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  77. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
  78. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
  79. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
  80. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
  81. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  82. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
  83. package/.agent/skills/architecture/SKILL.md +55 -0
  84. package/.agent/skills/architecture/context-discovery.md +43 -0
  85. package/.agent/skills/architecture/examples.md +94 -0
  86. package/.agent/skills/architecture/pattern-selection.md +68 -0
  87. package/.agent/skills/architecture/patterns-reference.md +50 -0
  88. package/.agent/skills/architecture/trade-off-analysis.md +77 -0
  89. package/.agent/skills/clean-code/SKILL.md +201 -0
  90. package/.agent/skills/doc.md +177 -0
  91. package/.agent/skills/frontend-design/SKILL.md +418 -0
  92. package/.agent/skills/frontend-design/animation-guide.md +331 -0
  93. package/.agent/skills/frontend-design/color-system.md +311 -0
  94. package/.agent/skills/frontend-design/decision-trees.md +418 -0
  95. package/.agent/skills/frontend-design/motion-graphics.md +306 -0
  96. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  97. package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
  98. package/.agent/skills/frontend-design/typography-system.md +345 -0
  99. package/.agent/skills/frontend-design/ux-psychology.md +1116 -0
  100. package/.agent/skills/frontend-design/visual-effects.md +383 -0
  101. package/.agent/skills/i18n-localization/SKILL.md +154 -0
  102. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  103. package/.agent/skills/mcp-builder/SKILL.md +176 -0
  104. package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
  105. package/.agent/workflows/brainstorm.md +113 -0
  106. package/.agent/workflows/create.md +59 -0
  107. package/.agent/workflows/debug.md +103 -0
  108. package/.agent/workflows/deploy.md +176 -0
  109. package/.agent/workflows/enhance.md +63 -0
  110. package/.agent/workflows/orchestrate.md +237 -0
  111. package/.agent/workflows/plan.md +89 -0
  112. package/.agent/workflows/preview.md +81 -0
  113. package/.agent/workflows/simple-test.md +42 -0
  114. package/.agent/workflows/status.md +86 -0
  115. package/.agent/workflows/structured-orchestrate.md +180 -0
  116. package/.agent/workflows/test.md +144 -0
  117. package/.agent/workflows/ui-ux-pro-max.md +296 -0
  118. package/.claude/settings.local.json +157 -149
  119. package/.editorconfig +56 -0
  120. package/.husky/pre-commit +4 -0
  121. package/.lintstagedrc +7 -0
  122. package/.prettierignore +29 -0
  123. package/.prettierrc +11 -0
  124. package/CLAUDE.md +2 -0
  125. package/README.md +64 -55
  126. package/SPEC.md +102 -61
  127. package/cli/bin/foliko.js +4 -4
  128. package/cli/src/commands/chat.js +53 -51
  129. package/cli/src/commands/list.js +40 -37
  130. package/cli/src/index.js +18 -18
  131. package/cli/src/ui/chat-ui.js +78 -76
  132. package/cli/src/utils/ansi.js +15 -15
  133. package/cli/src/utils/markdown.js +112 -116
  134. package/docker-compose.yml +1 -1
  135. package/docs/ai-sdk-optimization.md +655 -636
  136. package/docs/features.md +80 -80
  137. package/docs/quick-reference.md +49 -46
  138. package/docs/user-manual.md +411 -380
  139. package/examples/ambient-example.js +95 -97
  140. package/examples/basic.js +115 -110
  141. package/examples/bootstrap.js +52 -43
  142. package/examples/mcp-example.js +56 -53
  143. package/examples/skill-example.js +49 -49
  144. package/examples/test-chat.js +60 -58
  145. package/examples/test-mcp.js +49 -43
  146. package/examples/test-reload.js +38 -40
  147. package/examples/test-telegram.js +3 -3
  148. package/examples/test-tg-bot.js +7 -4
  149. package/examples/test-tg-simple.js +4 -3
  150. package/examples/test-tg.js +3 -3
  151. package/examples/test-think.js +13 -7
  152. package/examples/test-web-plugin.js +61 -56
  153. package/examples/test-weixin-feishu.js +40 -37
  154. package/examples/workflow.js +49 -49
  155. package/foliko-1.0.75.tgz +0 -0
  156. package/package.json +37 -3
  157. package/plugins/ai-plugin.js +7 -5
  158. package/plugins/ambient-agent/EventWatcher.js +113 -0
  159. package/plugins/ambient-agent/ExplorerLoop.js +640 -0
  160. package/plugins/ambient-agent/GoalManager.js +197 -0
  161. package/plugins/ambient-agent/Reflector.js +95 -0
  162. package/plugins/ambient-agent/StateStore.js +90 -0
  163. package/plugins/ambient-agent/constants.js +101 -0
  164. package/plugins/ambient-agent/index.js +579 -0
  165. package/plugins/default-plugins.js +62 -49
  166. package/plugins/email/constants.js +64 -0
  167. package/plugins/email/handlers.js +461 -0
  168. package/plugins/email/index.js +278 -0
  169. package/plugins/email/monitor.js +269 -0
  170. package/plugins/email/parser.js +138 -0
  171. package/plugins/email/reply.js +151 -0
  172. package/plugins/email/utils.js +124 -0
  173. package/plugins/feishu-plugin.js +23 -19
  174. package/plugins/file-system-plugin.js +469 -120
  175. package/plugins/install-plugin.js +6 -4
  176. package/plugins/python-executor-plugin.js +3 -1
  177. package/plugins/python-plugin-loader.js +10 -8
  178. package/plugins/rules-plugin.js +5 -3
  179. package/plugins/scheduler-plugin.js +18 -16
  180. package/plugins/session-plugin.js +3 -1
  181. package/plugins/storage-plugin.js +5 -3
  182. package/plugins/subagent-plugin.js +152 -92
  183. package/plugins/telegram-plugin.js +26 -19
  184. package/plugins/think-plugin.js +4 -2
  185. package/plugins/tools-plugin.js +3 -1
  186. package/plugins/web-plugin.js +15 -13
  187. package/plugins/weixin-plugin.js +43 -36
  188. package/reports/system-health-report-20260401.md +79 -0
  189. package/skills/ambient-agent/SKILL.md +49 -39
  190. package/skills/foliko-dev/AGENTS.md +64 -61
  191. package/skills/foliko-dev/SKILL.md +125 -119
  192. package/skills/mcp-usage/SKILL.md +19 -17
  193. package/skills/python-plugin-dev/SKILL.md +16 -15
  194. package/skills/skill-guide/SKILL.md +12 -12
  195. package/skills/subagent-guide/SKILL.md +237 -0
  196. package/skills/workflow-guide/SKILL.md +90 -45
  197. package/skills/workflow-troubleshooting/DEBUGGING.md +36 -21
  198. package/skills/workflow-troubleshooting/SKILL.md +156 -79
  199. package/src/capabilities/index.js +4 -4
  200. package/src/capabilities/skill-manager.js +211 -197
  201. package/src/capabilities/workflow-engine.js +461 -547
  202. package/src/core/agent-chat.js +426 -279
  203. package/src/core/agent.js +453 -248
  204. package/src/core/framework.js +183 -149
  205. package/src/core/index.js +8 -8
  206. package/src/core/plugin-base.js +52 -52
  207. package/src/core/plugin-manager.js +377 -281
  208. package/src/core/provider.js +35 -32
  209. package/src/core/sub-agent-config.js +264 -0
  210. package/src/core/system-prompt-builder.js +120 -0
  211. package/src/core/tool-registry.js +416 -33
  212. package/src/core/tool-router.js +149 -68
  213. package/src/executors/executor-base.js +58 -58
  214. package/src/executors/mcp-executor.js +269 -257
  215. package/src/index.js +5 -17
  216. package/src/utils/circuit-breaker.js +301 -0
  217. package/src/utils/error-boundary.js +363 -0
  218. package/src/utils/error.js +374 -0
  219. package/src/utils/event-emitter.js +20 -20
  220. package/src/utils/id.js +133 -0
  221. package/src/utils/index.js +217 -3
  222. package/src/utils/logger.js +181 -0
  223. package/src/utils/plugin-helpers.js +90 -0
  224. package/src/utils/retry.js +122 -0
  225. package/src/utils/sandbox.js +292 -0
  226. package/test/tool-registry-validation.test.js +218 -0
  227. package/test_report.md +70 -0
  228. package/website/docs/api.html +169 -107
  229. package/website/docs/configuration.html +296 -144
  230. package/website/docs/plugin-development.html +154 -85
  231. package/website/docs/project-structure.html +110 -109
  232. package/website/docs/skill-development.html +117 -61
  233. package/website/index.html +209 -205
  234. package/website/script.js +20 -17
  235. package/website/styles.css +1 -1
  236. package/plugins/ambient-agent-plugin.js +0 -1565
  237. package/plugins/email.js +0 -1142
@@ -2,78 +2,84 @@
2
2
  * MCP 插件测试脚本
3
3
  */
4
4
 
5
- const { Framework } = require('../src')
6
- const { MCPExecutorPlugin } = require('../src/executors/mcp-executor')
5
+ const { Framework } = require('../src');
6
+ const { MCPExecutorPlugin } = require('../src/executors/mcp-executor');
7
7
 
8
8
  async function test() {
9
- console.log('=== MCP Plugin Test ===\n')
9
+ console.log('=== MCP Plugin Test ===\n');
10
10
 
11
- console.log('1. Creating framework...')
12
- const framework = new Framework({ debug: true })
11
+ console.log('1. Creating framework...');
12
+ const framework = new Framework({ debug: true });
13
13
 
14
- console.log('2. Creating MCP plugin with fetch server...')
14
+ console.log('2. Creating MCP plugin with fetch server...');
15
15
  const mcpPlugin = new MCPExecutorPlugin({
16
16
  servers: [
17
17
  {
18
18
  name: 'fetch',
19
19
  command: 'uvx',
20
- args: ['mcp-server-fetch']
21
- }
22
- ]
23
- })
20
+ args: ['mcp-server-fetch'],
21
+ },
22
+ ],
23
+ });
24
24
 
25
- console.log('3. Loading MCP plugin...')
26
- await framework.loadPlugin(mcpPlugin)
25
+ console.log('3. Loading MCP plugin...');
26
+ await framework.loadPlugin(mcpPlugin);
27
27
 
28
- console.log('4. Starting framework...')
29
- await framework.pluginManager.startAll()
28
+ console.log('4. Starting framework...');
29
+ await framework.pluginManager.startAll();
30
30
 
31
31
  // 等待 MCP 服务器连接
32
- console.log('\n5. Waiting for MCP connection...')
33
- await new Promise(resolve => setTimeout(resolve, 2000))
32
+ console.log('\n5. Waiting for MCP connection...');
33
+ await new Promise((resolve) => setTimeout(resolve, 2000));
34
34
 
35
- console.log('\n6. Listing MCP servers...')
36
- const servers = mcpPlugin.getServers()
37
- console.log('Servers:', JSON.stringify(servers, null, 2))
35
+ console.log('\n6. Listing MCP servers...');
36
+ const servers = mcpPlugin.getServers();
37
+ console.log('Servers:', JSON.stringify(servers, null, 2));
38
38
 
39
- console.log('\n7. Listing MCP tools...')
40
- const mcpTools = framework.getTools().filter(t => t.name.startsWith('mcp_'))
41
- console.log('MCP Tools:', mcpTools.map(t => t.name))
39
+ console.log('\n7. Listing MCP tools...');
40
+ const mcpTools = framework.getTools().filter((t) => t.name.startsWith('mcp_'));
41
+ console.log(
42
+ 'MCP Tools:',
43
+ mcpTools.map((t) => t.name)
44
+ );
42
45
 
43
46
  if (mcpTools.length > 0) {
44
- console.log('\n8. Testing mcp_list_servers...')
45
- const listResult = await framework.executeTool('mcp_list_servers', {})
46
- console.log('List Servers Result:', JSON.stringify(listResult, null, 2))
47
+ console.log('\n8. Testing mcp_list_servers...');
48
+ const listResult = await framework.executeTool('mcp_list_servers', {});
49
+ console.log('List Servers Result:', JSON.stringify(listResult, null, 2));
47
50
 
48
- console.log('\n9. Testing mcp_tool_schema...')
51
+ console.log('\n9. Testing mcp_tool_schema...');
49
52
  const schemaResult = await framework.executeTool('mcp_tool_schema', {
50
53
  server: 'fetch',
51
- tool: 'fetch'
52
- })
53
- console.log('Tool Schema:', JSON.stringify(schemaResult, null, 2))
54
+ tool: 'fetch',
55
+ });
56
+ console.log('Tool Schema:', JSON.stringify(schemaResult, null, 2));
54
57
 
55
- console.log('\n10. Testing mcp_call (fetch a webpage)...')
58
+ console.log('\n10. Testing mcp_call (fetch a webpage)...');
56
59
  const callResult = await framework.executeTool('mcp_call', {
57
60
  server: 'fetch',
58
61
  tool: 'fetch',
59
- args_json: JSON.stringify({ url: 'https://httpbin.org/get' })
60
- })
61
- console.log('Fetch Result (truncated):', JSON.stringify(callResult, null, 2).substring(0, 500) + '...')
62
+ args_json: JSON.stringify({ url: 'https://httpbin.org/get' }),
63
+ });
64
+ console.log(
65
+ 'Fetch Result (truncated):',
66
+ JSON.stringify(callResult, null, 2).substring(0, 500) + '...'
67
+ );
62
68
  }
63
69
 
64
- console.log('\n11. Destroying framework...')
65
- await framework.destroy()
70
+ console.log('\n11. Destroying framework...');
71
+ await framework.destroy();
66
72
 
67
- console.log('\n=== Test Complete ===')
73
+ console.log('\n=== Test Complete ===');
68
74
  }
69
75
 
70
76
  test()
71
77
  .then(() => {
72
- console.log('\n✓ Test completed successfully')
73
- process.exit(0)
74
- })
75
- .catch(err => {
76
- console.error('\n✗ Test failed:', err.message)
77
- console.error(err.stack)
78
- process.exit(1)
78
+ console.log('\n✓ Test completed successfully');
79
+ process.exit(0);
79
80
  })
81
+ .catch((err) => {
82
+ console.error('\n✗ Test failed:', err.message);
83
+ console.error(err.stack);
84
+ process.exit(1);
85
+ });
@@ -2,60 +2,58 @@
2
2
  * MCP mcp_reload 功能测试
3
3
  */
4
4
 
5
- const { Framework } = require('../src')
6
- const { MCPExecutorPlugin } = require('../src/executors/mcp-executor')
7
- const fs = require('fs')
8
- const path = require('path')
5
+ const { Framework } = require('../src');
6
+ const { MCPExecutorPlugin } = require('../src/executors/mcp-executor');
7
+ const fs = require('fs');
8
+ const path = require('path');
9
9
 
10
10
  async function test() {
11
- console.log('=== Testing mcp_reload ===\n')
12
-
11
+ console.log('=== Testing mcp_reload ===\n');
12
+
13
13
  // 创建框架
14
- const framework = new Framework({ debug: true })
15
-
14
+ const framework = new Framework({ debug: true });
15
+
16
16
  // 创建 MCP 插件
17
17
  const mcpPlugin = new MCPExecutorPlugin({
18
- servers: [
19
- { name: 'fetch', command: 'uvx', args: ['mcp-server-fetch'] }
20
- ]
21
- })
22
-
18
+ servers: [{ name: 'fetch', command: 'uvx', args: ['mcp-server-fetch'] }],
19
+ });
20
+
23
21
  // 加载并启动
24
- await framework.loadPlugin(mcpPlugin)
25
- await framework.pluginManager.startAll()
26
-
22
+ await framework.loadPlugin(mcpPlugin);
23
+ await framework.pluginManager.startAll();
24
+
27
25
  // 等待连接
28
- await new Promise(r => setTimeout(r, 2000))
29
-
30
- console.log('\n1. 初始服务器列表:')
31
- const initialServers = mcpPlugin.getServers()
32
- console.log(JSON.stringify(initialServers, null, 2))
33
-
26
+ await new Promise((r) => setTimeout(r, 2000));
27
+
28
+ console.log('\n1. 初始服务器列表:');
29
+ const initialServers = mcpPlugin.getServers();
30
+ console.log(JSON.stringify(initialServers, null, 2));
31
+
34
32
  // 测试 mcp_reload
35
- console.log('\n2. 调用 mcp_reload...')
36
- const result = await framework.executeTool('mcp_reload', {})
37
- console.log('mcp_reload 结果:')
38
- console.log(JSON.stringify(result, null, 2))
39
-
33
+ console.log('\n2. 调用 mcp_reload...');
34
+ const result = await framework.executeTool('mcp_reload', {});
35
+ console.log('mcp_reload 结果:');
36
+ console.log(JSON.stringify(result, null, 2));
37
+
40
38
  // 检查配置
41
- console.log('\n3. 当前配置文件:')
42
- const configPath = path.resolve('.agent/mcp_config.json')
39
+ console.log('\n3. 当前配置文件:');
40
+ const configPath = path.resolve('.agent/mcp_config.json');
43
41
  if (fs.existsSync(configPath)) {
44
- const config = JSON.parse(fs.readFileSync(configPath, 'utf8'))
45
- console.log(JSON.stringify(config, null, 2))
42
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
43
+ console.log(JSON.stringify(config, null, 2));
46
44
  } else {
47
- console.log('配置文件不存在: ' + configPath)
45
+ console.log('配置文件不存在: ' + configPath);
48
46
  }
49
-
47
+
50
48
  // 清理
51
- await framework.destroy()
52
-
53
- console.log('\n=== 测试完成 ===')
49
+ await framework.destroy();
50
+
51
+ console.log('\n=== 测试完成 ===');
54
52
  }
55
53
 
56
54
  test()
57
55
  .then(() => process.exit(0))
58
- .catch(err => {
59
- console.error('测试失败:', err)
60
- process.exit(1)
61
- })
56
+ .catch((err) => {
57
+ console.error('测试失败:', err);
58
+ process.exit(1);
59
+ });
@@ -10,8 +10,8 @@ async function main() {
10
10
  provider: process.env.FOLIKO_PROVIDER || 'minimax',
11
11
  model: process.env.FOLIKO_MODEL || 'MiniMax-M2.7',
12
12
  baseURL: process.env.FOLIKO_BASE_URL || 'https://api.minimaxi.com/v1',
13
- apiKey: process.env.MINIMAX_API_KEY || process.env.DEEPSEEK_API_KEY
14
- }
13
+ apiKey: process.env.MINIMAX_API_KEY || process.env.DEEPSEEK_API_KEY,
14
+ },
15
15
  });
16
16
 
17
17
  // 检查 telegram 插件
@@ -47,4 +47,4 @@ async function main() {
47
47
  await new Promise(() => {});
48
48
  }
49
49
 
50
- main().catch(console.error);
50
+ main().catch(console.error);
@@ -12,8 +12,8 @@ async function main() {
12
12
  provider: process.env.FOLIKO_PROVIDER || 'minimax',
13
13
  model: process.env.FOLIKO_MODEL || 'MiniMax-M2.7',
14
14
  baseURL: process.env.FOLIKO_BASE_URL || 'https://api.minimaxi.com/v1',
15
- apiKey: process.env.MINIMAX_API_KEY || process.env.DEEPSEEK_API_KEY
16
- }
15
+ apiKey: process.env.MINIMAX_API_KEY || process.env.DEEPSEEK_API_KEY,
16
+ },
17
17
  });
18
18
 
19
19
  // 检查主 Agent
@@ -21,7 +21,10 @@ async function main() {
21
21
  console.log('Main Agent:', mainAgent ? mainAgent.name : 'NOT FOUND');
22
22
  console.log('Agent apiKey:', mainAgent?.apiKey ? 'set' : 'NOT SET');
23
23
  console.log('Agent _chatHandler:', mainAgent?._chatHandler ? 'exists' : 'NOT EXISTS');
24
- console.log('Agent _chatHandler._aiClient:', mainAgent?._chatHandler?._aiClient ? 'exists' : 'NOT EXISTS');
24
+ console.log(
25
+ 'Agent _chatHandler._aiClient:',
26
+ mainAgent?._chatHandler?._aiClient ? 'exists' : 'NOT EXISTS'
27
+ );
25
28
 
26
29
  // 检查 Telegram 插件
27
30
  const tgPlugin = framework.pluginManager.get('telegram');
@@ -39,4 +42,4 @@ async function main() {
39
42
  await new Promise(() => {});
40
43
  }
41
44
 
42
- main().catch(console.error);
45
+ main().catch(console.error);
@@ -38,9 +38,10 @@ bot.on('message', (msg) => {
38
38
  console.log('========================\n');
39
39
 
40
40
  // 回复测试
41
- bot.sendMessage(msg.chat.id, 'Bot is working! Received: ' + msg.text)
41
+ bot
42
+ .sendMessage(msg.chat.id, 'Bot is working! Received: ' + msg.text)
42
43
  .then(() => console.log('Reply sent'))
43
- .catch(err => console.log('Reply error:', err.message));
44
+ .catch((err) => console.log('Reply error:', err.message));
44
45
  });
45
46
 
46
- console.log('Waiting for messages...');
47
+ console.log('Waiting for messages...');
@@ -10,8 +10,8 @@ async function main() {
10
10
  provider: process.env.FOLIKO_PROVIDER || 'minimax',
11
11
  model: process.env.FOLIKO_MODEL || 'MiniMax-M2.7',
12
12
  baseURL: process.env.FOLIKO_BASE_URL || 'https://api.minimaxi.com/v1',
13
- apiKey: process.env.MINIMAX_API_KEY || process.env.DEEPSEEK_API_KEY
14
- }
13
+ apiKey: process.env.MINIMAX_API_KEY || process.env.DEEPSEEK_API_KEY,
14
+ },
15
15
  });
16
16
 
17
17
  // 检查 telegram 插件
@@ -59,4 +59,4 @@ async function main() {
59
59
  await new Promise(() => {});
60
60
  }
61
61
 
62
- main().catch(console.error);
62
+ main().catch(console.error);
@@ -10,20 +10,26 @@ async function main() {
10
10
  provider: process.env.FOLIKO_PROVIDER || 'minimax',
11
11
  model: process.env.FOLIKO_MODEL || 'MiniMax-M2.7',
12
12
  baseURL: process.env.FOLIKO_BASE_URL || 'https://api.minimaxi.com/v1',
13
- apiKey: process.env.MINIMAX_API_KEY || process.env.DEEPSEEK_API_KEY
14
- }
13
+ apiKey: process.env.MINIMAX_API_KEY || process.env.DEEPSEEK_API_KEY,
14
+ },
15
15
  });
16
16
 
17
17
  const agent = framework.createAgent({
18
18
  name: 'FolikoAgent',
19
- systemPrompt: '你是一个有帮助的助手。'
19
+ systemPrompt: '你是一个有帮助的助手。',
20
20
  });
21
21
 
22
- console.log('_mainAgent provider:', framework._mainAgent ? framework._mainAgent.provider : 'none');
23
- console.log('_mainAgent has apiKey:', framework._mainAgent && framework._mainAgent.apiKey ? 'yes' : 'no');
22
+ console.log(
23
+ '_mainAgent provider:',
24
+ framework._mainAgent ? framework._mainAgent.provider : 'none'
25
+ );
26
+ console.log(
27
+ '_mainAgent has apiKey:',
28
+ framework._mainAgent && framework._mainAgent.apiKey ? 'yes' : 'no'
29
+ );
24
30
 
25
31
  const tools = framework.getTools();
26
- const thinkTool = tools.find(t => t.name === 'think_now');
32
+ const thinkTool = tools.find((t) => t.name === 'think_now');
27
33
 
28
34
  if (thinkTool) {
29
35
  const result = await thinkTool.execute({ mode: 'reflect', topic: '测试' });
@@ -34,4 +40,4 @@ async function main() {
34
40
  await framework.destroy();
35
41
  }
36
42
 
37
- main().catch(console.error);
43
+ main().catch(console.error);
@@ -3,96 +3,101 @@
3
3
  * 测试路由注册和请求响应
4
4
  */
5
5
 
6
- const { WebPlugin } = require('../plugins/web-plugin')
6
+ const { WebPlugin } = require('../plugins/web-plugin');
7
7
 
8
8
  async function test() {
9
- console.log('=== Web 插件测试 ===\n')
9
+ console.log('=== Web 插件测试 ===\n');
10
10
 
11
11
  // 1. 创建插件
12
- const plugin = new WebPlugin()
12
+ const plugin = new WebPlugin();
13
13
  const mockFramework = {
14
14
  registerTool: (tool) => console.log(`[工具注册] ${tool.name}`),
15
15
  _agents: [],
16
- pluginManager: { get: () => null }
17
- }
18
- plugin.install(mockFramework)
16
+ pluginManager: { get: () => null },
17
+ };
18
+ plugin.install(mockFramework);
19
19
 
20
20
  // 2. 启动服务
21
- console.log('\n[1] 启动 Web 服务...')
22
- const startResult = await plugin._startServer(3099)
23
- console.log('启动结果:', startResult.success ? '成功' : '失败')
24
- console.log('服务地址: http://localhost:3099\n')
21
+ console.log('\n[1] 启动 Web 服务...');
22
+ const startResult = await plugin._startServer(3099);
23
+ console.log('启动结果:', startResult.success ? '成功' : '失败');
24
+ console.log('服务地址: http://localhost:3099\n');
25
25
 
26
26
  // 3. 注册测试路由
27
- console.log('[2] 注册测试路由...')
27
+ console.log('[2] 注册测试路由...');
28
28
 
29
29
  // 返回固定字符串
30
- await plugin._registerRoute('GET', '/test', 'return "1232432"', '返回固定字符串')
31
- console.log('注册: GET /test -> return "1232432"')
30
+ await plugin._registerRoute('GET', '/test', 'return "1232432"', '返回固定字符串');
31
+ console.log('注册: GET /test -> return "1232432"');
32
32
 
33
33
  // 返回 JSON
34
- await plugin._registerRoute('GET', '/json', 'return { hello: "world", code: 200 }', '返回 JSON')
35
- console.log('注册: GET /json -> return { hello: "world", code: 200 }')
34
+ await plugin._registerRoute('GET', '/json', 'return { hello: "world", code: 200 }', '返回 JSON');
35
+ console.log('注册: GET /json -> return { hello: "world", code: 200 }');
36
36
 
37
37
  // 带参数
38
- await plugin._registerRoute('GET', '/user/:id', 'return { userId: context.params.id }', '路径参数')
39
- console.log('注册: GET /user/:id -> return { userId: context.params.id }')
38
+ await plugin._registerRoute(
39
+ 'GET',
40
+ '/user/:id',
41
+ 'return { userId: context.params.id }',
42
+ '路径参数'
43
+ );
44
+ console.log('注册: GET /user/:id -> return { userId: context.params.id }');
40
45
 
41
46
  // POST 路由
42
- await plugin._registerRoute('POST', '/echo', 'return { received: context.body }', '回显 body')
43
- console.log('注册: POST /echo -> return { received: context.body }')
47
+ await plugin._registerRoute('POST', '/echo', 'return { received: context.body }', '回显 body');
48
+ console.log('注册: POST /echo -> return { received: context.body }');
44
49
 
45
50
  // 4. 等待服务就绪
46
- await new Promise(r => setTimeout(r, 500))
51
+ await new Promise((r) => setTimeout(r, 500));
47
52
 
48
53
  // 5. 测试各路由
49
- console.log('\n[3] 测试路由响应...\n')
54
+ console.log('\n[3] 测试路由响应...\n');
50
55
 
51
56
  // GET /test
52
- console.log('GET /test:')
53
- const r1 = await plugin._sendRequest('GET', '/test')
54
- console.log(' 状态:', r1.status)
55
- console.log(' 响应:', JSON.stringify(r1.body))
56
- console.log()
57
+ console.log('GET /test:');
58
+ const r1 = await plugin._sendRequest('GET', '/test');
59
+ console.log(' 状态:', r1.status);
60
+ console.log(' 响应:', JSON.stringify(r1.body));
61
+ console.log();
57
62
 
58
63
  // GET /json
59
- console.log('GET /json:')
60
- const r2 = await plugin._sendRequest('GET', '/json')
61
- console.log(' 状态:', r2.status)
62
- console.log(' 响应:', JSON.stringify(r2.body))
63
- console.log()
64
+ console.log('GET /json:');
65
+ const r2 = await plugin._sendRequest('GET', '/json');
66
+ console.log(' 状态:', r2.status);
67
+ console.log(' 响应:', JSON.stringify(r2.body));
68
+ console.log();
64
69
 
65
70
  // GET /user/123
66
- console.log('GET /user/123:')
67
- const r3 = await plugin._sendRequest('GET', '/user/123')
68
- console.log(' 状态:', r3.status)
69
- console.log(' 响应:', JSON.stringify(r3.body))
70
- console.log()
71
+ console.log('GET /user/123:');
72
+ const r3 = await plugin._sendRequest('GET', '/user/123');
73
+ console.log(' 状态:', r3.status);
74
+ console.log(' 响应:', JSON.stringify(r3.body));
75
+ console.log();
71
76
 
72
77
  // POST /echo
73
- console.log('POST /echo (body: { name: "test" }):')
74
- const r4 = await plugin._sendRequest('POST', '/echo', { name: 'test' })
75
- console.log(' 状态:', r4.status)
76
- console.log(' 响应:', JSON.stringify(r4.body))
77
- console.log()
78
+ console.log('POST /echo (body: { name: "test" }):');
79
+ const r4 = await plugin._sendRequest('POST', '/echo', { name: 'test' });
80
+ console.log(' 状态:', r4.status);
81
+ console.log(' 响应:', JSON.stringify(r4.body));
82
+ console.log();
78
83
 
79
84
  // 6. 列出所有路由
80
- console.log('[4] 已注册的路由:')
81
- const routes = plugin._listRoutes()
82
- routes.routes.forEach(r => {
83
- console.log(` ${r.method} ${r.path} - ${r.description}`)
84
- })
85
- routes.webhooks.forEach(w => {
86
- console.log(` WEBHOOK ${w.path}`)
87
- })
88
- routes.statics.forEach(s => {
89
- console.log(` STATIC ${s.path} -> ${s.folder}`)
90
- })
85
+ console.log('[4] 已注册的路由:');
86
+ const routes = plugin._listRoutes();
87
+ routes.routes.forEach((r) => {
88
+ console.log(` ${r.method} ${r.path} - ${r.description}`);
89
+ });
90
+ routes.webhooks.forEach((w) => {
91
+ console.log(` WEBHOOK ${w.path}`);
92
+ });
93
+ routes.statics.forEach((s) => {
94
+ console.log(` STATIC ${s.path} -> ${s.folder}`);
95
+ });
91
96
 
92
97
  // 7. 停止服务
93
- console.log('\n[5] 停止服务...')
94
- await plugin._stopServer()
95
- console.log('测试完成!')
98
+ console.log('\n[5] 停止服务...');
99
+ await plugin._stopServer();
100
+ console.log('测试完成!');
96
101
  }
97
102
 
98
- test().catch(console.error)
103
+ test().catch(console.error);
@@ -3,12 +3,12 @@
3
3
  * 测试 chat() 方法(非流式)
4
4
  */
5
5
 
6
- const { Framework } = require('../src')
6
+ const { Framework } = require('../src');
7
7
 
8
8
  async function main() {
9
- console.log('=== Weixin/Feishu Plugin Test ===\n')
9
+ console.log('=== Weixin/Feishu Plugin Test ===\n');
10
10
 
11
- const framework = new Framework({ debug: true })
11
+ const framework = new Framework({ debug: true });
12
12
 
13
13
  // Bootstrap 加载默认插件
14
14
  await framework.bootstrap({
@@ -16,85 +16,88 @@ async function main() {
16
16
  aiConfig: {
17
17
  provider: 'deepseek',
18
18
  model: 'deepseek-chat',
19
- apiKey: process.env.DEEPSEEK_API_KEY || 'your-api-key'
20
- }
21
- })
19
+ apiKey: process.env.DEEPSEEK_API_KEY || 'your-api-key',
20
+ },
21
+ });
22
22
 
23
23
  // 加载微信插件
24
- const { WeixinPlugin } = require('../plugins/weixin-plugin')
24
+ const { WeixinPlugin } = require('../plugins/weixin-plugin');
25
25
  const weixinPlugin = new WeixinPlugin({
26
26
  forceLogin: false,
27
- allowedUsers: [] // 空数组表示允许所有人
28
- })
27
+ allowedUsers: [], // 空数组表示允许所有人
28
+ });
29
29
 
30
30
  // 加载飞书插件
31
- const { FeishuPlugin } = require('../plugins/feishu-plugin')
31
+ const { FeishuPlugin } = require('../plugins/feishu-plugin');
32
32
  const feishuPlugin = new FeishuPlugin({
33
33
  // appId: 'your-app-id',
34
34
  // appSecret: 'your-app-secret',
35
- allowedUsers: []
36
- })
35
+ allowedUsers: [],
36
+ });
37
37
 
38
38
  // 注册插件(不自动加载)
39
39
  // framework.registerPlugin(weixinPlugin)
40
40
  // framework.registerPlugin(feishuPlugin)
41
41
 
42
- console.log('\n--- Plugins Registered ---')
43
- console.log('Plugins:', framework.pluginManager.getAll().map(p => p.name))
42
+ console.log('\n--- Plugins Registered ---');
43
+ console.log(
44
+ 'Plugins:',
45
+ framework.pluginManager.getAll().map((p) => p.name)
46
+ );
44
47
 
45
48
  // 创建测试 Agent
46
49
  const agent = framework.createAgent({
47
50
  name: 'TestAgent',
48
- systemPrompt: '你是一个测试助手,回复要简洁。'
49
- })
51
+ systemPrompt: '你是一个测试助手,回复要简洁。',
52
+ });
50
53
 
51
54
  // 测试 chat() 方法(模拟消息处理)
52
- console.log('\n--- Test chat() method ---')
55
+ console.log('\n--- Test chat() method ---');
53
56
 
54
57
  // 模拟飞书的消息处理流程
55
- const mockOpenId = 'test_user_001'
56
- const mockText = '你好,请介绍一下你自己'
58
+ const mockOpenId = 'test_user_001';
59
+ const mockText = '你好,请介绍一下你自己';
57
60
 
58
61
  // 获取 session agent(内部逻辑)
59
62
  const sessionInfo = {
60
63
  agent: framework.createSessionAgent(`test_${mockOpenId}`, {
61
- systemPrompt: feishuPlugin.systemPrompt
64
+ systemPrompt: feishuPlugin.systemPrompt,
62
65
  }),
63
- sessionId: `test_${mockOpenId}`
64
- }
66
+ sessionId: `test_${mockOpenId}`,
67
+ };
65
68
 
66
69
  try {
67
70
  // 使用 chat() 而非 chatStream()
68
71
  const result = await sessionInfo.agent.chat(mockText, {
69
- sessionId: sessionInfo.sessionId
70
- })
72
+ sessionId: sessionInfo.sessionId,
73
+ });
71
74
 
72
- console.log('Result:', result)
73
- console.log('Message:', result.message)
74
- console.log('StepCount:', result.stepCount)
75
+ console.log('Result:', result);
76
+ console.log('Message:', result.message);
77
+ console.log('StepCount:', result.stepCount);
75
78
  } catch (err) {
76
- console.error('Chat error:', err.message)
79
+ console.error('Chat error:', err.message);
77
80
  }
78
81
 
79
82
  // 测试 chatStream() 对比
80
- console.log('\n--- Test chatStream() for comparison ---')
83
+ console.log('\n--- Test chatStream() for comparison ---');
81
84
  try {
82
- let fullResponse = ''
85
+ let fullResponse = '';
83
86
  for await (const chunk of sessionInfo.agent.chatStream('今天天气怎么样?', {
84
- sessionId: sessionInfo.sessionId
87
+ sessionId: sessionInfo.sessionId,
85
88
  })) {
86
89
  if (chunk.type === 'text' && chunk.text) {
87
- fullResponse += chunk.text
90
+ fullResponse += chunk.text;
88
91
  }
89
92
  }
90
- console.log('Stream result:', fullResponse)
93
+ console.log('Stream result:', fullResponse);
91
94
  } catch (err) {
92
- console.error('Stream error:', err.message)
95
+ console.error('Stream error:', err.message);
93
96
  }
94
97
 
95
98
  // 清理
96
- await framework.destroy()
97
- console.log('\n[Done]')
99
+ await framework.destroy();
100
+ console.log('\n[Done]');
98
101
  }
99
102
 
100
- main().catch(console.error)
103
+ main().catch(console.error);