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
@@ -3,19 +3,19 @@
3
3
  * 展示如何使用工作流引擎
4
4
  */
5
5
 
6
- const { Framework } = require('../src')
7
- const { WorkflowPlugin } = require('../src/capabilities/workflow-engine')
6
+ const { Framework } = require('../src');
7
+ const { WorkflowPlugin } = require('../src/capabilities/workflow-engine');
8
8
 
9
9
  async function main() {
10
- console.log('=== Workflow Example ===\n')
10
+ console.log('=== Workflow Example ===\n');
11
11
 
12
12
  // 创建框架
13
- const framework = new Framework({ debug: true })
13
+ const framework = new Framework({ debug: true });
14
14
 
15
15
  // 加载工作流插件
16
- await framework.loadPlugin(new WorkflowPlugin())
16
+ await framework.loadPlugin(new WorkflowPlugin());
17
17
 
18
- console.log('\n--- Testing Script Step ---')
18
+ console.log('\n--- Testing Script Step ---');
19
19
 
20
20
  // 直接执行工作流
21
21
  const result1 = await framework.executeTool('execute_workflow', {
@@ -29,7 +29,7 @@ async function main() {
29
29
  const b = 20;
30
30
  context.variables.sum = a + b;
31
31
  return a + b;
32
- `
32
+ `,
33
33
  },
34
34
  {
35
35
  type: 'script',
@@ -38,16 +38,16 @@ async function main() {
38
38
  const sum = context.variables.sum;
39
39
  context.variables.product = sum * 2;
40
40
  return sum * 2;
41
- `
42
- }
43
- ]
41
+ `,
42
+ },
43
+ ],
44
44
  }),
45
- input: {}
46
- })
45
+ input: {},
46
+ });
47
47
 
48
- console.log('Result:', result1)
48
+ console.log('Result:', result1);
49
49
 
50
- console.log('\n--- Testing Loop Step ---')
50
+ console.log('\n--- Testing Loop Step ---');
51
51
 
52
52
  const result2 = await framework.executeTool('execute_workflow', {
53
53
  workflow: JSON.stringify({
@@ -64,18 +64,18 @@ async function main() {
64
64
  script: `
65
65
  console.log('Iteration ' + context.variables.i);
66
66
  return context.variables.i;
67
- `
68
- }
69
- ]
70
- }
71
- ]
67
+ `,
68
+ },
69
+ ],
70
+ },
71
+ ],
72
72
  }),
73
- input: {}
74
- })
73
+ input: {},
74
+ });
75
75
 
76
- console.log('Result:', result2)
76
+ console.log('Result:', result2);
77
77
 
78
- console.log('\n--- Testing Condition Step ---')
78
+ console.log('\n--- Testing Condition Step ---');
79
79
 
80
80
  const result3 = await framework.executeTool('execute_workflow', {
81
81
  workflow: JSON.stringify({
@@ -87,7 +87,7 @@ async function main() {
87
87
  script: `
88
88
  context.variables.value = 15;
89
89
  return 15;
90
- `
90
+ `,
91
91
  },
92
92
  {
93
93
  type: 'condition',
@@ -100,9 +100,9 @@ async function main() {
100
100
  {
101
101
  type: 'script',
102
102
  name: 'Log greater',
103
- script: `console.log('Value is greater than 10'); return 'greater';`
104
- }
105
- ]
103
+ script: `console.log('Value is greater than 10'); return 'greater';`,
104
+ },
105
+ ],
106
106
  },
107
107
  {
108
108
  name: 'Less than or equal 10',
@@ -111,29 +111,29 @@ async function main() {
111
111
  {
112
112
  type: 'script',
113
113
  name: 'Log less',
114
- script: `console.log('Value is less than or equal 10'); return 'less-or-equal';`
115
- }
116
- ]
117
- }
118
- ]
119
- }
120
- ]
114
+ script: `console.log('Value is less than or equal 10'); return 'less-or-equal';`,
115
+ },
116
+ ],
117
+ },
118
+ ],
119
+ },
120
+ ],
121
121
  }),
122
- input: {}
123
- })
122
+ input: {},
123
+ });
124
124
 
125
- console.log('Result:', result3)
125
+ console.log('Result:', result3);
126
126
 
127
- console.log('\n--- Testing Delay ---')
127
+ console.log('\n--- Testing Delay ---');
128
128
 
129
- const startTime = Date.now()
129
+ const startTime = Date.now();
130
130
  const result4 = await framework.executeTool('execute_workflow', {
131
131
  workflow: JSON.stringify({
132
132
  steps: [
133
133
  {
134
134
  type: 'delay',
135
135
  name: 'Wait 500ms',
136
- delayMs: 500
136
+ delayMs: 500,
137
137
  },
138
138
  {
139
139
  type: 'script',
@@ -141,18 +141,18 @@ async function main() {
141
141
  script: `
142
142
  const elapsed = Date.now() - context.variables.startTime;
143
143
  return { elapsed: elapsed, expected: 500 };
144
- `
145
- }
146
- ]
144
+ `,
145
+ },
146
+ ],
147
147
  }),
148
- input: {}
149
- })
148
+ input: {},
149
+ });
150
150
 
151
- console.log('Result:', result4)
151
+ console.log('Result:', result4);
152
152
 
153
153
  // 清理
154
- await framework.destroy()
155
- console.log('\n[Done]')
154
+ await framework.destroy();
155
+ console.log('\n[Done]');
156
156
  }
157
157
 
158
- main().catch(console.error)
158
+ main().catch(console.error);
Binary file
package/package.json CHANGED
@@ -1,21 +1,49 @@
1
1
  {
2
2
  "name": "foliko",
3
- "version": "1.0.73",
3
+ "version": "1.0.75",
4
4
  "description": "简约的插件化 Agent 框架",
5
5
  "main": "src/index.js",
6
+ "type": "commonjs",
6
7
  "bin": {
7
8
  "foliko": "./cli/bin/foliko.js"
8
9
  },
9
10
  "scripts": {
10
11
  "start": "node examples/basic.js",
11
12
  "chat": "node cli/bin/foliko.js chat",
12
- "test": "echo \"No tests yet\""
13
+ "dev": "node --watch examples/basic.js",
14
+ "lint": "echo \"No linter configured\"",
15
+ "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,yaml,yml,md,css,html}\"",
16
+ "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,yaml,yml,md,css,html}\"",
17
+ "prepare": "husky"
18
+ },
19
+ "lint-staged": {
20
+ "*.{js,jsx,ts,tsx}": [
21
+ "prettier --write"
22
+ ],
23
+ "*.{json,yaml,yml}": [
24
+ "prettier --write"
25
+ ],
26
+ "*.{md,mdx}": [
27
+ "prettier --write"
28
+ ],
29
+ "*.{css,scss,less}": [
30
+ "prettier --write"
31
+ ],
32
+ "*.{html,svg}": [
33
+ "prettier --write"
34
+ ]
35
+ },
36
+ "engines": {
37
+ "node": ">=18.0.0"
13
38
  },
14
39
  "keywords": [
15
40
  "agent",
16
41
  "ai",
17
42
  "framework",
18
- "plugin"
43
+ "plugin",
44
+ "claude",
45
+ "openai",
46
+ "anthropic"
19
47
  ],
20
48
  "author": "",
21
49
  "license": "MIT",
@@ -42,6 +70,12 @@
42
70
  "qrcode-terminal": "^0.12.0",
43
71
  "remove-markdown": "^0.6.3",
44
72
  "tiktoken": "^1.0.22",
73
+ "vm2": "^3.10.5",
45
74
  "zod": "^3.24.0"
75
+ },
76
+ "devDependencies": {
77
+ "husky": "^9.1.7",
78
+ "lint-staged": "^16.4.0",
79
+ "prettier": "^3.8.1"
46
80
  }
47
81
  }
@@ -4,6 +4,8 @@
4
4
  */
5
5
 
6
6
  const { Plugin } = require('../src/core/plugin-base')
7
+ const { logger } = require('../src/utils/logger')
8
+ const log = logger.child('AIPlugin')
7
9
  const { createAI } = require('../src/core/provider')
8
10
 
9
11
  class AIPlugin extends Plugin {
@@ -42,7 +44,7 @@ class AIPlugin extends Plugin {
42
44
  _initAIClient() {
43
45
 
44
46
  if (!this.config.apiKey) {
45
- console.warn('[AIPlugin] No API key provided, AI features disabled')
47
+ log.warn(' No API key provided, AI features disabled')
46
48
  return
47
49
  }
48
50
  try {
@@ -55,9 +57,9 @@ class AIPlugin extends Plugin {
55
57
 
56
58
  // 创建模型实例
57
59
  this._aiClient = provider(this.config.model)
58
- console.log(`[AIPlugin] Initialized ${this.config.provider}/${this.config.model}`)
60
+ log.info(` Initialized ${this.config.provider}/${this.config.model}`)
59
61
  } catch (err) {
60
- console.error('[AIPlugin] Failed to initialize AI client:', err.message)
62
+ log.error(' Failed to initialize AI client:', err.message)
61
63
  }
62
64
  }
63
65
 
@@ -78,7 +80,7 @@ class AIPlugin extends Plugin {
78
80
  }
79
81
 
80
82
  reload(framework) {
81
- console.log('[AIPlugin] Reloading...')
83
+ log.info(' Reloading...')
82
84
  this._framework = framework
83
85
  this._initAIClient()
84
86
 
@@ -86,7 +88,7 @@ class AIPlugin extends Plugin {
86
88
  for (const agent of framework._agents || []) {
87
89
  if (agent._chatHandler) {
88
90
  agent._chatHandler.setAIClient(this._aiClient)
89
- console.log(`[AIPlugin] Refreshed AI client for agent: ${agent.name}`)
91
+ log.info(` Refreshed AI client for agent: ${agent.name}`)
90
92
  }
91
93
  }
92
94
  }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * EventWatcher - 订阅框架事件,筛选相关事件
3
+ */
4
+
5
+ const { logger } = require('../../src/utils/logger')
6
+ const { DefaultEvents } = require('./constants')
7
+
8
+ const log = logger.child('Ambient:EventWatcher')
9
+
10
+ class EventWatcher {
11
+ constructor(goalManager, framework) {
12
+ this._goalManager = goalManager
13
+ this._framework = framework
14
+ this._handlers = []
15
+ this._relevantEvents = new Set(DefaultEvents)
16
+ }
17
+
18
+ /**
19
+ * 启动事件监听
20
+ */
21
+ start() {
22
+ const events = [
23
+ ['tool:result', (data) => this._handleEvent('tool:result', data)],
24
+ ['scheduler:reminder', (data) => this._handleEvent('scheduler:reminder', data)],
25
+ ['agent:message', (data) => this._handleEvent('agent:message', data)],
26
+ ['think:thought_completed', (data) => this._handleEvent('think:thought_completed', data)],
27
+ ['scheduler:task_completed', (data) => this._handleEvent('scheduler:task_completed', data)],
28
+ ['scheduler:task_failed', (data) => this._handleEvent('scheduler:task_failed', data)],
29
+ ['email:received', (data) => this._handleEvent('email:received', data)],
30
+ ['webhook:received', (data) => this._handleEvent('webhook:received', data)]
31
+ ]
32
+
33
+ for (const [event, handler] of events) {
34
+ this._framework.on(event, handler)
35
+ this._handlers.push({ event, handler })
36
+ }
37
+ }
38
+
39
+ /**
40
+ * 停止事件监听
41
+ */
42
+ stop() {
43
+ for (const { event, handler } of this._handlers) {
44
+ this._framework.off(event, handler)
45
+ }
46
+ this._handlers = []
47
+ }
48
+
49
+ /**
50
+ * 处理事件
51
+ * @param {string} type - 事件类型
52
+ * @param {Object} data - 事件数据
53
+ */
54
+ _handleEvent(type, data) {
55
+ const activeGoals = this._goalManager.getActiveGoals()
56
+ log.info(`_handleEvent: type=${type}, activeGoals=${activeGoals.length}`)
57
+
58
+ for (const goal of activeGoals) {
59
+ // 检查目标条件是否匹配此事件
60
+ const isRelevant = this._isRelevantToGoal(goal, type, data)
61
+ log.info(`goal=${goal.id}, isRelevant=${isRelevant}, conditions=${JSON.stringify(goal.conditions)}`)
62
+
63
+ if (isRelevant) {
64
+ // 将 data 展平到事件对象中,方便通过 {{_event.xxx}} 访问
65
+ this._goalManager.addEventToGoal(goal.id, { type, ...data })
66
+ log.info(`Event added to goal ${goal.id}`)
67
+ }
68
+ }
69
+
70
+ // 检查是否有 pending 目标需要激活
71
+ const pendingGoals = this._goalManager.getPendingGoals()
72
+ for (const goal of pendingGoals) {
73
+ if (this._isRelevantToGoal(goal, type, data)) {
74
+ // 激活目标
75
+ this._goalManager.activateGoal(goal.id)
76
+ // 添加事件
77
+ this._goalManager.addEventToGoal(goal.id, { type, ...data })
78
+ log.info(`事件触发激活目标: ${goal.id} (事件: ${type})`)
79
+ }
80
+ }
81
+ }
82
+
83
+ /**
84
+ * 检查事件是否与目标相关
85
+ * @param {Object} goal - 目标对象
86
+ * @param {string} eventType - 事件类型
87
+ * @param {Object} data - 事件数据
88
+ * @returns {boolean} 是否相关
89
+ */
90
+ _isRelevantToGoal(goal, eventType, data) {
91
+ // 检查条件中是否有明确的事件类型
92
+ if (goal.conditions && goal.conditions.events) {
93
+ const allowedEvents = Array.isArray(goal.conditions.events)
94
+ ? goal.conditions.events
95
+ : [goal.conditions.events]
96
+ if (!allowedEvents.includes(eventType)) {
97
+ return false
98
+ }
99
+ }
100
+ // 检查工具名称过滤器
101
+ if (goal.conditions && goal.conditions.toolNames) {
102
+ const toolNames = Array.isArray(goal.conditions.toolNames)
103
+ ? goal.conditions.toolNames
104
+ : [goal.conditions.toolNames]
105
+ if (data && data.toolName && !toolNames.includes(data.toolName)) {
106
+ return false
107
+ }
108
+ }
109
+ return true
110
+ }
111
+ }
112
+
113
+ module.exports = { EventWatcher }