foliko 1.0.74 → 1.0.76

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 (238) 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 +11 -1
  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 +11 -11
  128. package/cli/src/commands/chat.js +143 -141
  129. package/cli/src/commands/list.js +93 -90
  130. package/cli/src/index.js +75 -75
  131. package/cli/src/ui/chat-ui.js +201 -199
  132. package/cli/src/utils/ansi.js +40 -40
  133. package/cli/src/utils/markdown.js +292 -296
  134. package/docker-compose.yml +1 -1
  135. package/docs/ai-sdk-optimization.md +655 -643
  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 +194 -196
  140. package/examples/basic.js +50 -45
  141. package/examples/bootstrap.js +121 -112
  142. package/examples/mcp-example.js +19 -16
  143. package/examples/skill-example.js +20 -20
  144. package/examples/test-chat.js +137 -135
  145. package/examples/test-mcp.js +85 -79
  146. package/examples/test-reload.js +59 -61
  147. package/examples/test-telegram.js +50 -50
  148. package/examples/test-tg-bot.js +45 -42
  149. package/examples/test-tg-simple.js +47 -46
  150. package/examples/test-tg.js +62 -62
  151. package/examples/test-think.js +43 -37
  152. package/examples/test-web-plugin.js +103 -98
  153. package/examples/test-weixin-feishu.js +103 -100
  154. package/examples/workflow.js +158 -158
  155. package/package.json +37 -3
  156. package/plugins/ai-plugin.js +102 -100
  157. package/plugins/ambient-agent/EventWatcher.js +113 -0
  158. package/plugins/ambient-agent/ExplorerLoop.js +640 -0
  159. package/plugins/ambient-agent/GoalManager.js +197 -0
  160. package/plugins/ambient-agent/Reflector.js +95 -0
  161. package/plugins/ambient-agent/StateStore.js +90 -0
  162. package/plugins/ambient-agent/constants.js +101 -0
  163. package/plugins/ambient-agent/index.js +579 -0
  164. package/plugins/audit-plugin.js +187 -187
  165. package/plugins/default-plugins.js +662 -649
  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 +481 -477
  174. package/plugins/file-system-plugin.js +826 -476
  175. package/plugins/install-plugin.js +199 -197
  176. package/plugins/python-executor-plugin.js +367 -365
  177. package/plugins/python-plugin-loader.js +481 -479
  178. package/plugins/rules-plugin.js +294 -292
  179. package/plugins/scheduler-plugin.js +691 -689
  180. package/plugins/session-plugin.js +369 -367
  181. package/plugins/shell-executor-plugin.js +197 -197
  182. package/plugins/storage-plugin.js +240 -238
  183. package/plugins/subagent-plugin.js +845 -785
  184. package/plugins/telegram-plugin.js +482 -475
  185. package/plugins/think-plugin.js +345 -343
  186. package/plugins/tools-plugin.js +196 -194
  187. package/plugins/web-plugin.js +606 -604
  188. package/plugins/weixin-plugin.js +545 -538
  189. package/reports/system-health-report-20260401.md +79 -0
  190. package/skills/ambient-agent/SKILL.md +49 -39
  191. package/skills/foliko-dev/AGENTS.md +64 -61
  192. package/skills/foliko-dev/SKILL.md +125 -119
  193. package/skills/mcp-usage/SKILL.md +19 -17
  194. package/skills/python-plugin-dev/SKILL.md +16 -15
  195. package/skills/skill-guide/SKILL.md +12 -12
  196. package/skills/subagent-guide/SKILL.md +237 -0
  197. package/skills/workflow-guide/SKILL.md +90 -45
  198. package/skills/workflow-troubleshooting/DEBUGGING.md +36 -21
  199. package/skills/workflow-troubleshooting/SKILL.md +156 -79
  200. package/src/capabilities/index.js +11 -11
  201. package/src/capabilities/skill-manager.js +609 -595
  202. package/src/capabilities/workflow-engine.js +1109 -1195
  203. package/src/core/agent-chat.js +882 -735
  204. package/src/core/agent.js +892 -688
  205. package/src/core/framework.js +465 -431
  206. package/src/core/index.js +19 -19
  207. package/src/core/plugin-base.js +219 -219
  208. package/src/core/plugin-manager.js +863 -767
  209. package/src/core/provider.js +114 -111
  210. package/src/core/sub-agent-config.js +264 -0
  211. package/src/core/system-prompt-builder.js +120 -0
  212. package/src/core/tool-registry.js +517 -134
  213. package/src/core/tool-router.js +297 -216
  214. package/src/executors/executor-base.js +12 -12
  215. package/src/executors/mcp-executor.js +741 -729
  216. package/src/index.js +25 -37
  217. package/src/utils/circuit-breaker.js +301 -0
  218. package/src/utils/error-boundary.js +363 -0
  219. package/src/utils/error.js +374 -0
  220. package/src/utils/event-emitter.js +97 -97
  221. package/src/utils/id.js +133 -0
  222. package/src/utils/index.js +217 -3
  223. package/src/utils/logger.js +181 -0
  224. package/src/utils/plugin-helpers.js +90 -0
  225. package/src/utils/retry.js +122 -0
  226. package/src/utils/sandbox.js +292 -0
  227. package/test/tool-registry-validation.test.js +218 -0
  228. package/test_report.md +70 -0
  229. package/website/docs/api.html +169 -107
  230. package/website/docs/configuration.html +296 -144
  231. package/website/docs/plugin-development.html +154 -85
  232. package/website/docs/project-structure.html +110 -109
  233. package/website/docs/skill-development.html +117 -61
  234. package/website/index.html +209 -205
  235. package/website/script.js +136 -133
  236. package/website/styles.css +1 -1
  237. package/plugins/ambient-agent-plugin.js +0 -1565
  238. package/plugins/email.js +0 -1142
@@ -1,158 +1,158 @@
1
- /**
2
- * 工作流示例
3
- * 展示如何使用工作流引擎
4
- */
5
-
6
- const { Framework } = require('../src')
7
- const { WorkflowPlugin } = require('../src/capabilities/workflow-engine')
8
-
9
- async function main() {
10
- console.log('=== Workflow Example ===\n')
11
-
12
- // 创建框架
13
- const framework = new Framework({ debug: true })
14
-
15
- // 加载工作流插件
16
- await framework.loadPlugin(new WorkflowPlugin())
17
-
18
- console.log('\n--- Testing Script Step ---')
19
-
20
- // 直接执行工作流
21
- const result1 = await framework.executeTool('execute_workflow', {
22
- workflow: JSON.stringify({
23
- steps: [
24
- {
25
- type: 'script',
26
- name: 'Calculate',
27
- script: `
28
- const a = 10;
29
- const b = 20;
30
- context.variables.sum = a + b;
31
- return a + b;
32
- `
33
- },
34
- {
35
- type: 'script',
36
- name: 'Multiply',
37
- script: `
38
- const sum = context.variables.sum;
39
- context.variables.product = sum * 2;
40
- return sum * 2;
41
- `
42
- }
43
- ]
44
- }),
45
- input: {}
46
- })
47
-
48
- console.log('Result:', result1)
49
-
50
- console.log('\n--- Testing Loop Step ---')
51
-
52
- const result2 = await framework.executeTool('execute_workflow', {
53
- workflow: JSON.stringify({
54
- steps: [
55
- {
56
- type: 'loop',
57
- name: 'Loop 3 times',
58
- maxIterations: 3,
59
- loopVariable: 'i',
60
- steps: [
61
- {
62
- type: 'script',
63
- name: 'Log iteration',
64
- script: `
65
- console.log('Iteration ' + context.variables.i);
66
- return context.variables.i;
67
- `
68
- }
69
- ]
70
- }
71
- ]
72
- }),
73
- input: {}
74
- })
75
-
76
- console.log('Result:', result2)
77
-
78
- console.log('\n--- Testing Condition Step ---')
79
-
80
- const result3 = await framework.executeTool('execute_workflow', {
81
- workflow: JSON.stringify({
82
- steps: [
83
- {
84
- type: 'script',
85
- name: 'Set value',
86
- outputVariable: 'value',
87
- script: `
88
- context.variables.value = 15;
89
- return 15;
90
- `
91
- },
92
- {
93
- type: 'condition',
94
- name: 'Check value',
95
- branches: [
96
- {
97
- name: 'Greater than 10',
98
- condition: 'context.variables.value > 10',
99
- steps: [
100
- {
101
- type: 'script',
102
- name: 'Log greater',
103
- script: `console.log('Value is greater than 10'); return 'greater';`
104
- }
105
- ]
106
- },
107
- {
108
- name: 'Less than or equal 10',
109
- condition: 'context.variables.value <= 10',
110
- steps: [
111
- {
112
- type: 'script',
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
- ]
121
- }),
122
- input: {}
123
- })
124
-
125
- console.log('Result:', result3)
126
-
127
- console.log('\n--- Testing Delay ---')
128
-
129
- const startTime = Date.now()
130
- const result4 = await framework.executeTool('execute_workflow', {
131
- workflow: JSON.stringify({
132
- steps: [
133
- {
134
- type: 'delay',
135
- name: 'Wait 500ms',
136
- delayMs: 500
137
- },
138
- {
139
- type: 'script',
140
- name: 'Check elapsed',
141
- script: `
142
- const elapsed = Date.now() - context.variables.startTime;
143
- return { elapsed: elapsed, expected: 500 };
144
- `
145
- }
146
- ]
147
- }),
148
- input: {}
149
- })
150
-
151
- console.log('Result:', result4)
152
-
153
- // 清理
154
- await framework.destroy()
155
- console.log('\n[Done]')
156
- }
157
-
158
- main().catch(console.error)
1
+ /**
2
+ * 工作流示例
3
+ * 展示如何使用工作流引擎
4
+ */
5
+
6
+ const { Framework } = require('../src');
7
+ const { WorkflowPlugin } = require('../src/capabilities/workflow-engine');
8
+
9
+ async function main() {
10
+ console.log('=== Workflow Example ===\n');
11
+
12
+ // 创建框架
13
+ const framework = new Framework({ debug: true });
14
+
15
+ // 加载工作流插件
16
+ await framework.loadPlugin(new WorkflowPlugin());
17
+
18
+ console.log('\n--- Testing Script Step ---');
19
+
20
+ // 直接执行工作流
21
+ const result1 = await framework.executeTool('execute_workflow', {
22
+ workflow: JSON.stringify({
23
+ steps: [
24
+ {
25
+ type: 'script',
26
+ name: 'Calculate',
27
+ script: `
28
+ const a = 10;
29
+ const b = 20;
30
+ context.variables.sum = a + b;
31
+ return a + b;
32
+ `,
33
+ },
34
+ {
35
+ type: 'script',
36
+ name: 'Multiply',
37
+ script: `
38
+ const sum = context.variables.sum;
39
+ context.variables.product = sum * 2;
40
+ return sum * 2;
41
+ `,
42
+ },
43
+ ],
44
+ }),
45
+ input: {},
46
+ });
47
+
48
+ console.log('Result:', result1);
49
+
50
+ console.log('\n--- Testing Loop Step ---');
51
+
52
+ const result2 = await framework.executeTool('execute_workflow', {
53
+ workflow: JSON.stringify({
54
+ steps: [
55
+ {
56
+ type: 'loop',
57
+ name: 'Loop 3 times',
58
+ maxIterations: 3,
59
+ loopVariable: 'i',
60
+ steps: [
61
+ {
62
+ type: 'script',
63
+ name: 'Log iteration',
64
+ script: `
65
+ console.log('Iteration ' + context.variables.i);
66
+ return context.variables.i;
67
+ `,
68
+ },
69
+ ],
70
+ },
71
+ ],
72
+ }),
73
+ input: {},
74
+ });
75
+
76
+ console.log('Result:', result2);
77
+
78
+ console.log('\n--- Testing Condition Step ---');
79
+
80
+ const result3 = await framework.executeTool('execute_workflow', {
81
+ workflow: JSON.stringify({
82
+ steps: [
83
+ {
84
+ type: 'script',
85
+ name: 'Set value',
86
+ outputVariable: 'value',
87
+ script: `
88
+ context.variables.value = 15;
89
+ return 15;
90
+ `,
91
+ },
92
+ {
93
+ type: 'condition',
94
+ name: 'Check value',
95
+ branches: [
96
+ {
97
+ name: 'Greater than 10',
98
+ condition: 'context.variables.value > 10',
99
+ steps: [
100
+ {
101
+ type: 'script',
102
+ name: 'Log greater',
103
+ script: `console.log('Value is greater than 10'); return 'greater';`,
104
+ },
105
+ ],
106
+ },
107
+ {
108
+ name: 'Less than or equal 10',
109
+ condition: 'context.variables.value <= 10',
110
+ steps: [
111
+ {
112
+ type: 'script',
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
+ ],
121
+ }),
122
+ input: {},
123
+ });
124
+
125
+ console.log('Result:', result3);
126
+
127
+ console.log('\n--- Testing Delay ---');
128
+
129
+ const startTime = Date.now();
130
+ const result4 = await framework.executeTool('execute_workflow', {
131
+ workflow: JSON.stringify({
132
+ steps: [
133
+ {
134
+ type: 'delay',
135
+ name: 'Wait 500ms',
136
+ delayMs: 500,
137
+ },
138
+ {
139
+ type: 'script',
140
+ name: 'Check elapsed',
141
+ script: `
142
+ const elapsed = Date.now() - context.variables.startTime;
143
+ return { elapsed: elapsed, expected: 500 };
144
+ `,
145
+ },
146
+ ],
147
+ }),
148
+ input: {},
149
+ });
150
+
151
+ console.log('Result:', result4);
152
+
153
+ // 清理
154
+ await framework.destroy();
155
+ console.log('\n[Done]');
156
+ }
157
+
158
+ main().catch(console.error);
package/package.json CHANGED
@@ -1,21 +1,49 @@
1
1
  {
2
2
  "name": "foliko",
3
- "version": "1.0.74",
3
+ "version": "1.0.76",
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
  }
@@ -1,100 +1,102 @@
1
- /**
2
- * AI 插件
3
- * 提供 AI 对话能力
4
- */
5
-
6
- const { Plugin } = require('../src/core/plugin-base')
7
- const { createAI } = require('../src/core/provider')
8
-
9
- class AIPlugin extends Plugin {
10
- constructor(config = {}) {
11
- super()
12
- this.name = 'ai'
13
- this.version = '1.0.0'
14
- this.description = 'AI 对话能力插件'
15
- this.priority = 1 // 最先加载
16
- this.system = true
17
-
18
- this.config = {
19
- provider: config.provider || 'deepseek',
20
- model: config.model || 'deepseek-chat',
21
- apiKey: config.apiKey,
22
- baseURL: config.baseURL,
23
- maxSteps: config.maxSteps || 20,
24
- maxOutputTokens:config.maxOutputTokens||8192
25
- }
26
-
27
- this._aiClient = null
28
- this._framework = null
29
- }
30
-
31
- install(framework) {
32
- this._framework = framework
33
- this._initAIClient()
34
- return this
35
- }
36
-
37
- start(framework) {
38
- // AI client 已在 install 中初始化
39
- return this
40
- }
41
-
42
- _initAIClient() {
43
-
44
- if (!this.config.apiKey) {
45
- console.warn('[AIPlugin] No API key provided, AI features disabled')
46
- return
47
- }
48
- try {
49
- const provider = createAI({
50
- provider: this.config.provider,
51
- model: this.config.model,
52
- apiKey: this.config.apiKey,
53
- baseURL: this.config.baseURL
54
- })
55
-
56
- // 创建模型实例
57
- this._aiClient = provider(this.config.model)
58
- console.log(`[AIPlugin] Initialized ${this.config.provider}/${this.config.model}`)
59
- } catch (err) {
60
- console.error('[AIPlugin] Failed to initialize AI client:', err.message)
61
- }
62
- }
63
-
64
- /**
65
- * 获取 AI 客户端
66
- * @returns {Object} AI 模型客户端
67
- */
68
- getAIClient() {
69
- return this._aiClient
70
- }
71
-
72
- /**
73
- * 获取配置
74
- * @returns {Object}
75
- */
76
- getConfig() {
77
- return { ...this.config }
78
- }
79
-
80
- reload(framework) {
81
- console.log('[AIPlugin] Reloading...')
82
- this._framework = framework
83
- this._initAIClient()
84
-
85
- // 刷新所有已有 Agent 的 AI client
86
- for (const agent of framework._agents || []) {
87
- if (agent._chatHandler) {
88
- agent._chatHandler.setAIClient(this._aiClient)
89
- console.log(`[AIPlugin] Refreshed AI client for agent: ${agent.name}`)
90
- }
91
- }
92
- }
93
-
94
- uninstall(framework) {
95
- this._aiClient = null
96
- this._framework = null
97
- }
98
- }
99
-
100
- module.exports = { AIPlugin }
1
+ /**
2
+ * AI 插件
3
+ * 提供 AI 对话能力
4
+ */
5
+
6
+ const { Plugin } = require('../src/core/plugin-base')
7
+ const { logger } = require('../src/utils/logger')
8
+ const log = logger.child('AIPlugin')
9
+ const { createAI } = require('../src/core/provider')
10
+
11
+ class AIPlugin extends Plugin {
12
+ constructor(config = {}) {
13
+ super()
14
+ this.name = 'ai'
15
+ this.version = '1.0.0'
16
+ this.description = 'AI 对话能力插件'
17
+ this.priority = 1 // 最先加载
18
+ this.system = true
19
+
20
+ this.config = {
21
+ provider: config.provider || 'deepseek',
22
+ model: config.model || 'deepseek-chat',
23
+ apiKey: config.apiKey,
24
+ baseURL: config.baseURL,
25
+ maxSteps: config.maxSteps || 20,
26
+ maxOutputTokens:config.maxOutputTokens||8192
27
+ }
28
+
29
+ this._aiClient = null
30
+ this._framework = null
31
+ }
32
+
33
+ install(framework) {
34
+ this._framework = framework
35
+ this._initAIClient()
36
+ return this
37
+ }
38
+
39
+ start(framework) {
40
+ // AI client 已在 install 中初始化
41
+ return this
42
+ }
43
+
44
+ _initAIClient() {
45
+
46
+ if (!this.config.apiKey) {
47
+ log.warn(' No API key provided, AI features disabled')
48
+ return
49
+ }
50
+ try {
51
+ const provider = createAI({
52
+ provider: this.config.provider,
53
+ model: this.config.model,
54
+ apiKey: this.config.apiKey,
55
+ baseURL: this.config.baseURL
56
+ })
57
+
58
+ // 创建模型实例
59
+ this._aiClient = provider(this.config.model)
60
+ log.info(` Initialized ${this.config.provider}/${this.config.model}`)
61
+ } catch (err) {
62
+ log.error(' Failed to initialize AI client:', err.message)
63
+ }
64
+ }
65
+
66
+ /**
67
+ * 获取 AI 客户端
68
+ * @returns {Object} AI 模型客户端
69
+ */
70
+ getAIClient() {
71
+ return this._aiClient
72
+ }
73
+
74
+ /**
75
+ * 获取配置
76
+ * @returns {Object}
77
+ */
78
+ getConfig() {
79
+ return { ...this.config }
80
+ }
81
+
82
+ reload(framework) {
83
+ log.info(' Reloading...')
84
+ this._framework = framework
85
+ this._initAIClient()
86
+
87
+ // 刷新所有已有 Agent 的 AI client
88
+ for (const agent of framework._agents || []) {
89
+ if (agent._chatHandler) {
90
+ agent._chatHandler.setAIClient(this._aiClient)
91
+ log.info(` Refreshed AI client for agent: ${agent.name}`)
92
+ }
93
+ }
94
+ }
95
+
96
+ uninstall(framework) {
97
+ this._aiClient = null
98
+ this._framework = null
99
+ }
100
+ }
101
+
102
+ module.exports = { AIPlugin }