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,343 +1,345 @@
1
- /**
2
- * Think 主动思考插件
3
- * 支持 LLM 自我唤醒、自动反思、持续思考
4
- */
5
-
6
- const { Plugin } = require('../src/core/plugin-base')
7
- const { z } = require('zod')
8
-
9
- class ThinkPlugin extends Plugin {
10
- constructor(config = {}) {
11
- super()
12
- this.name = 'think'
13
- this.version = '1.0.0'
14
- this.description = '主动思考插件,支持 LLM 自我唤醒和持续思考'
15
- this.priority = 5 // 高优先级,早期加载
16
-
17
- this.config = {
18
- autoReflect: config.autoReflect === true, // 默认关闭自动反思
19
- reflectDelay: config.reflectDelay || 2000, // 反思延迟(ms)
20
- maxReflectDepth: config.maxReflectDepth || 3, // 最大反思深度
21
- enableContinuous: config.enableContinuous || false // 是否启用持续思考
22
- }
23
-
24
- this._framework = null
25
- this._thoughts = [] // 思考记录
26
- this._reflectionChain = [] // 反思链
27
- this._continuousMode = false
28
- this._continuousTimer = null
29
- this._pendingReflection = null
30
- }
31
-
32
- install(framework) {
33
- this._framework = framework
34
- return this
35
- }
36
-
37
- start(framework) {
38
- // 注册思考工具
39
- framework.registerTool({
40
- name: 'think_now',
41
- description: '立即触发 LLM 主动思考(用于反思、自我检视、生成想法)',
42
- inputSchema: z.object({
43
- topic: z.string().optional().describe('思考主题,不提供则让 LLM 自己决定思考什么'),
44
- mode: z.enum(['reflect', 'brainstorm', 'analyze', 'plan']).optional().describe('思考模式'),
45
- depth: z.number().optional().describe('思考深度 1-5')
46
- }),
47
- execute: async (args) => {
48
- return await this._triggerThinking(args)
49
- }
50
- })
51
-
52
- framework.registerTool({
53
- name: 'think_continue',
54
- description: '让 LLM 持续思考模式(后台自动思考,定期输出结果)',
55
- inputSchema: z.object({
56
- interval: z.number().optional().describe('思考间隔毫秒,默认 30000 (30秒)'),
57
- topic: z.string().optional().describe('思考主题')
58
- }),
59
- execute: async (args) => {
60
- return await this._startContinuousThinking(args)
61
- }
62
- })
63
-
64
- framework.registerTool({
65
- name: 'think_stop',
66
- description: '停止持续思考模式',
67
- inputSchema: z.object({}),
68
- execute: async () => {
69
- return this._stopContinuousThinking()
70
- }
71
- })
72
-
73
- framework.registerTool({
74
- name: 'think_get_thoughts',
75
- description: '获取思考历史记录',
76
- inputSchema: z.object({
77
- limit: z.number().optional().describe('返回条数,默认 10')
78
- }),
79
- execute: async (args) => {
80
- const limit = args.limit || 10
81
- return {
82
- success: true,
83
- thoughts: this._thoughts.slice(-limit).reverse(),
84
- total: this._thoughts.length
85
- }
86
- }
87
- })
88
-
89
- return this
90
- }
91
-
92
- /**
93
- * 触发主动思考
94
- */
95
- async _triggerThinking(args) {
96
- const mode = args.mode || 'reflect'
97
- const depth = Math.min(args.depth || 2, 5)
98
- const topic = args.topic || '刚才的对话还有什么可以改进或补充的地方?'
99
-
100
- try {
101
- const agent = this._getActiveAgent()
102
- if (!agent) {
103
- return { success: false, error: 'No active agent found' }
104
- }
105
-
106
- // 检查 agent 是否有 AI 配置
107
- if (!agent.apiKey && !this._framework.pluginManager.get('ai')) {
108
- return {
109
- success: false,
110
- error: 'AI 未配置。请在 .agent/ai.json 或环境变量中配置 AI API Key。'
111
- }
112
- }
113
-
114
- const reflectPrompt = this._buildReflectPrompt(mode, depth, topic)
115
- const result = await agent.pushMessage(reflectPrompt)
116
-
117
- const thought = {
118
- id: Date.now(),
119
- mode,
120
- depth,
121
- topic,
122
- prompt: reflectPrompt,
123
- result: typeof result === 'string' ? result : JSON.stringify(result),
124
- timestamp: new Date()
125
- }
126
-
127
- this._thoughts.push(thought)
128
- if (this._thoughts.length > 100) {
129
- this._thoughts = this._thoughts.slice(-100)
130
- }
131
-
132
- // 触发思考完成事件
133
- if (this._framework) {
134
- this._framework.emit('think:thought_completed', thought)
135
- }
136
-
137
- return {
138
- success: true,
139
- thought,
140
- message: `【主动思考完成】\n模式: ${mode}\n主题: ${topic}\n\n${typeof result === 'string' ? result : JSON.stringify(result, null, 2)}`
141
- }
142
- } catch (err) {
143
- return { success: false, error: err.message }
144
- }
145
- }
146
-
147
- /**
148
- * 构建反思提示
149
- */
150
- _buildReflectPrompt(mode, depth, topic) {
151
- const depthDesc = {
152
- 1: '快速检视',
153
- 2: '简单反思',
154
- 3: '深入思考',
155
- 4: '批判性分析',
156
- 5: '全面审视'
157
- }
158
-
159
- const modePrompts = {
160
- reflect: `你刚刚完成了一次对话。请${depthDesc[depth]}:
161
-
162
- 1. 检查回答是否完整、准确
163
- 2. 是否有遗漏的重要信息
164
- 3. 是否有更好的表达方式
165
- 4. 是否需要补充示例或细节
166
-
167
- ${topic ? `额外关注: ${topic}` : ''}
168
-
169
- 请直接输出你的反思结果,不需要重复之前的对话内容。`,
170
-
171
- brainstorm: `请进行头脑风暴,针对以下主题产生更多想法:
172
-
173
- ${topic || '刚才讨论的内容'}
174
-
175
- 产生至少 3-5 个新的观点或方向,不必拘泥于之前讨论的内容。`,
176
-
177
- analyze: `请对以下主题进行深度分析:
178
-
179
- ${topic || '刚才讨论的内容'}
180
-
181
- 分析要点:
182
- - 根本原因是什么?
183
- - 有哪些支持/反对的证据?
184
- - 可能的发展方向?`,
185
-
186
- plan: `基于目前的讨论,请制定下一步计划:
187
-
188
- ${topic || '接下来的行动'}
189
-
190
- 计划要具体、可执行,包含时间线和预期结果。`
191
- }
192
-
193
- return modePrompts[mode] || modePrompts.reflect
194
- }
195
-
196
- /**
197
- * 自动反思(响应完成后)
198
- */
199
- async _autoReflect(data) {
200
- if (!this._framework) return
201
-
202
- try {
203
- // 检查是否需要反思(避免短时间重复反思)
204
- const lastThought = this._thoughts[this._thoughts.length - 1]
205
- if (lastThought && Date.now() - lastThought.timestamp.getTime() < 10000) {
206
- return // 10秒内不重复反思
207
- }
208
-
209
- const agent = this._getActiveAgent()
210
- if (!agent) return
211
-
212
- // 构建轻量级反思
213
- const reflectPrompt = `作为助手,请快速检视刚才的回答是否:
214
- 1. 完整回答了用户的问题
215
- 2. 表达清晰易懂
216
- 3. 有没有遗漏关键信息
217
-
218
- 如果发现不足,请直接补充。如果没问题,请简短回复"检查完毕,无需补充"。`
219
-
220
- // 静默思考,不打断用户
221
- const result = await agent.pushMessage(reflectPrompt)
222
-
223
- const thought = {
224
- id: Date.now(),
225
- mode: 'auto-reflect',
226
- topic: '自动检视',
227
- result: typeof result === 'string' ? result : '反思完成',
228
- timestamp: new Date(),
229
- auto: true
230
- }
231
-
232
- this._thoughts.push(thought)
233
-
234
- // 如果反思有重要补充,触发事件通知
235
- if (typeof result === 'string' && result.includes('补充') && !result.includes('无需补充')) {
236
- this._framework.emit('think:reflection_needs_attention', {
237
- thought,
238
- originalData: data
239
- })
240
- }
241
- } catch (err) {
242
- console.error('[Think] Auto-reflect error:', err.message)
243
- }
244
- }
245
-
246
- /**
247
- * 启动持续思考模式
248
- */
249
- async _startContinuousThinking(args) {
250
- if (this._continuousMode) {
251
- return { success: false, error: 'Continuous thinking already running' }
252
- }
253
-
254
- const interval = args.interval || 30000
255
- const topic = args.topic || '基于最近的对话,还有什么值得深入思考的方向?'
256
-
257
- this._continuousMode = true
258
- this._continuousTopic = topic
259
-
260
- const runThink = async () => {
261
- if (!this._continuousMode) return
262
-
263
- try {
264
- await this._triggerThinking({
265
- topic: this._continuousTopic,
266
- mode: 'reflect',
267
- depth: 2
268
- })
269
-
270
- // 触发下一轮
271
- if (this._continuousMode) {
272
- this._continuousTimer = setTimeout(runThink, interval)
273
- }
274
- } catch (err) {
275
- console.error('[Think] Continuous think error:', err.message)
276
- }
277
- }
278
-
279
- // 立即执行一次
280
- await runThink()
281
-
282
- return {
283
- success: true,
284
- message: `【持续思考已启动】\n间隔: ${interval}ms\n主题: ${topic}\n\nLLM 将定期自动思考并在有新想法时通知你。`
285
- }
286
- }
287
-
288
- /**
289
- * 停止持续思考模式
290
- */
291
- _stopContinuousThinking() {
292
- this._continuousMode = false
293
- if (this._continuousTimer) {
294
- clearTimeout(this._continuousTimer)
295
- this._continuousTimer = null
296
- }
297
- return {
298
- success: true,
299
- message: '持续思考已停止'
300
- }
301
- }
302
-
303
- /**
304
- * 获取当前活跃的 Agent
305
- */
306
- _getActiveAgent() {
307
- // 优先使用主 Agent
308
- if (this._framework._mainAgent) {
309
- return this._framework._mainAgent
310
- }
311
-
312
- // 否则找一个空闲的 Agent
313
- if (this._framework._agents && this._framework._agents.length > 0) {
314
- for (let i = this._framework._agents.length - 1; i >= 0; i--) {
315
- const agent = this._framework._agents[i]
316
- if (agent.getStatus() === 'idle') {
317
- return agent
318
- }
319
- }
320
- }
321
- return null
322
- }
323
-
324
- /**
325
- * 获取待处理的反思通知
326
- */
327
- getPendingThoughts() {
328
- return this._thoughts.slice(-10).reverse()
329
- }
330
-
331
- reload(framework) {
332
- this._framework = framework
333
- }
334
-
335
- uninstall(framework) {
336
- this._stopContinuousThinking()
337
- this._thoughts = []
338
- this._reflectionChain = []
339
- this._framework = null
340
- }
341
- }
342
-
343
- module.exports = { ThinkPlugin }
1
+ /**
2
+ * Think 主动思考插件
3
+ * 支持 LLM 自我唤醒、自动反思、持续思考
4
+ */
5
+
6
+ const { Plugin } = require('../src/core/plugin-base')
7
+ const { logger } = require('../src/utils/logger')
8
+ const log = logger.child('Think')
9
+ const { z } = require('zod')
10
+
11
+ class ThinkPlugin extends Plugin {
12
+ constructor(config = {}) {
13
+ super()
14
+ this.name = 'think'
15
+ this.version = '1.0.0'
16
+ this.description = '主动思考插件,支持 LLM 自我唤醒和持续思考'
17
+ this.priority = 5 // 高优先级,早期加载
18
+
19
+ this.config = {
20
+ autoReflect: config.autoReflect === true, // 默认关闭自动反思
21
+ reflectDelay: config.reflectDelay || 2000, // 反思延迟(ms)
22
+ maxReflectDepth: config.maxReflectDepth || 3, // 最大反思深度
23
+ enableContinuous: config.enableContinuous || false // 是否启用持续思考
24
+ }
25
+
26
+ this._framework = null
27
+ this._thoughts = [] // 思考记录
28
+ this._reflectionChain = [] // 反思链
29
+ this._continuousMode = false
30
+ this._continuousTimer = null
31
+ this._pendingReflection = null
32
+ }
33
+
34
+ install(framework) {
35
+ this._framework = framework
36
+ return this
37
+ }
38
+
39
+ start(framework) {
40
+ // 注册思考工具
41
+ framework.registerTool({
42
+ name: 'think_now',
43
+ description: '立即触发 LLM 主动思考(用于反思、自我检视、生成想法)',
44
+ inputSchema: z.object({
45
+ topic: z.string().optional().describe('思考主题,不提供则让 LLM 自己决定思考什么'),
46
+ mode: z.enum(['reflect', 'brainstorm', 'analyze', 'plan']).optional().describe('思考模式'),
47
+ depth: z.number().optional().describe('思考深度 1-5')
48
+ }),
49
+ execute: async (args) => {
50
+ return await this._triggerThinking(args)
51
+ }
52
+ })
53
+
54
+ framework.registerTool({
55
+ name: 'think_continue',
56
+ description: ' LLM 持续思考模式(后台自动思考,定期输出结果)',
57
+ inputSchema: z.object({
58
+ interval: z.number().optional().describe('思考间隔毫秒,默认 30000 (30秒)'),
59
+ topic: z.string().optional().describe('思考主题')
60
+ }),
61
+ execute: async (args) => {
62
+ return await this._startContinuousThinking(args)
63
+ }
64
+ })
65
+
66
+ framework.registerTool({
67
+ name: 'think_stop',
68
+ description: '停止持续思考模式',
69
+ inputSchema: z.object({}),
70
+ execute: async () => {
71
+ return this._stopContinuousThinking()
72
+ }
73
+ })
74
+
75
+ framework.registerTool({
76
+ name: 'think_get_thoughts',
77
+ description: '获取思考历史记录',
78
+ inputSchema: z.object({
79
+ limit: z.number().optional().describe('返回条数,默认 10')
80
+ }),
81
+ execute: async (args) => {
82
+ const limit = args.limit || 10
83
+ return {
84
+ success: true,
85
+ thoughts: this._thoughts.slice(-limit).reverse(),
86
+ total: this._thoughts.length
87
+ }
88
+ }
89
+ })
90
+
91
+ return this
92
+ }
93
+
94
+ /**
95
+ * 触发主动思考
96
+ */
97
+ async _triggerThinking(args) {
98
+ const mode = args.mode || 'reflect'
99
+ const depth = Math.min(args.depth || 2, 5)
100
+ const topic = args.topic || '刚才的对话还有什么可以改进或补充的地方?'
101
+
102
+ try {
103
+ const agent = this._getActiveAgent()
104
+ if (!agent) {
105
+ return { success: false, error: 'No active agent found' }
106
+ }
107
+
108
+ // 检查 agent 是否有 AI 配置
109
+ if (!agent.apiKey && !this._framework.pluginManager.get('ai')) {
110
+ return {
111
+ success: false,
112
+ error: 'AI 未配置。请在 .agent/ai.json 或环境变量中配置 AI API Key。'
113
+ }
114
+ }
115
+
116
+ const reflectPrompt = this._buildReflectPrompt(mode, depth, topic)
117
+ const result = await agent.pushMessage(reflectPrompt)
118
+
119
+ const thought = {
120
+ id: Date.now(),
121
+ mode,
122
+ depth,
123
+ topic,
124
+ prompt: reflectPrompt,
125
+ result: typeof result === 'string' ? result : JSON.stringify(result),
126
+ timestamp: new Date()
127
+ }
128
+
129
+ this._thoughts.push(thought)
130
+ if (this._thoughts.length > 100) {
131
+ this._thoughts = this._thoughts.slice(-100)
132
+ }
133
+
134
+ // 触发思考完成事件
135
+ if (this._framework) {
136
+ this._framework.emit('think:thought_completed', thought)
137
+ }
138
+
139
+ return {
140
+ success: true,
141
+ thought,
142
+ message: `【主动思考完成】\n模式: ${mode}\n主题: ${topic}\n\n${typeof result === 'string' ? result : JSON.stringify(result, null, 2)}`
143
+ }
144
+ } catch (err) {
145
+ return { success: false, error: err.message }
146
+ }
147
+ }
148
+
149
+ /**
150
+ * 构建反思提示
151
+ */
152
+ _buildReflectPrompt(mode, depth, topic) {
153
+ const depthDesc = {
154
+ 1: '快速检视',
155
+ 2: '简单反思',
156
+ 3: '深入思考',
157
+ 4: '批判性分析',
158
+ 5: '全面审视'
159
+ }
160
+
161
+ const modePrompts = {
162
+ reflect: `你刚刚完成了一次对话。请${depthDesc[depth]}:
163
+
164
+ 1. 检查回答是否完整、准确
165
+ 2. 是否有遗漏的重要信息
166
+ 3. 是否有更好的表达方式
167
+ 4. 是否需要补充示例或细节
168
+
169
+ ${topic ? `额外关注: ${topic}` : ''}
170
+
171
+ 请直接输出你的反思结果,不需要重复之前的对话内容。`,
172
+
173
+ brainstorm: `请进行头脑风暴,针对以下主题产生更多想法:
174
+
175
+ ${topic || '刚才讨论的内容'}
176
+
177
+ 产生至少 3-5 个新的观点或方向,不必拘泥于之前讨论的内容。`,
178
+
179
+ analyze: `请对以下主题进行深度分析:
180
+
181
+ ${topic || '刚才讨论的内容'}
182
+
183
+ 分析要点:
184
+ - 根本原因是什么?
185
+ - 有哪些支持/反对的证据?
186
+ - 可能的发展方向?`,
187
+
188
+ plan: `基于目前的讨论,请制定下一步计划:
189
+
190
+ ${topic || '接下来的行动'}
191
+
192
+ 计划要具体、可执行,包含时间线和预期结果。`
193
+ }
194
+
195
+ return modePrompts[mode] || modePrompts.reflect
196
+ }
197
+
198
+ /**
199
+ * 自动反思(响应完成后)
200
+ */
201
+ async _autoReflect(data) {
202
+ if (!this._framework) return
203
+
204
+ try {
205
+ // 检查是否需要反思(避免短时间重复反思)
206
+ const lastThought = this._thoughts[this._thoughts.length - 1]
207
+ if (lastThought && Date.now() - lastThought.timestamp.getTime() < 10000) {
208
+ return // 10秒内不重复反思
209
+ }
210
+
211
+ const agent = this._getActiveAgent()
212
+ if (!agent) return
213
+
214
+ // 构建轻量级反思
215
+ const reflectPrompt = `作为助手,请快速检视刚才的回答是否:
216
+ 1. 完整回答了用户的问题
217
+ 2. 表达清晰易懂
218
+ 3. 有没有遗漏关键信息
219
+
220
+ 如果发现不足,请直接补充。如果没问题,请简短回复"检查完毕,无需补充"。`
221
+
222
+ // 静默思考,不打断用户
223
+ const result = await agent.pushMessage(reflectPrompt)
224
+
225
+ const thought = {
226
+ id: Date.now(),
227
+ mode: 'auto-reflect',
228
+ topic: '自动检视',
229
+ result: typeof result === 'string' ? result : '反思完成',
230
+ timestamp: new Date(),
231
+ auto: true
232
+ }
233
+
234
+ this._thoughts.push(thought)
235
+
236
+ // 如果反思有重要补充,触发事件通知
237
+ if (typeof result === 'string' && result.includes('补充') && !result.includes('无需补充')) {
238
+ this._framework.emit('think:reflection_needs_attention', {
239
+ thought,
240
+ originalData: data
241
+ })
242
+ }
243
+ } catch (err) {
244
+ log.error(' Auto-reflect error:', err.message)
245
+ }
246
+ }
247
+
248
+ /**
249
+ * 启动持续思考模式
250
+ */
251
+ async _startContinuousThinking(args) {
252
+ if (this._continuousMode) {
253
+ return { success: false, error: 'Continuous thinking already running' }
254
+ }
255
+
256
+ const interval = args.interval || 30000
257
+ const topic = args.topic || '基于最近的对话,还有什么值得深入思考的方向?'
258
+
259
+ this._continuousMode = true
260
+ this._continuousTopic = topic
261
+
262
+ const runThink = async () => {
263
+ if (!this._continuousMode) return
264
+
265
+ try {
266
+ await this._triggerThinking({
267
+ topic: this._continuousTopic,
268
+ mode: 'reflect',
269
+ depth: 2
270
+ })
271
+
272
+ // 触发下一轮
273
+ if (this._continuousMode) {
274
+ this._continuousTimer = setTimeout(runThink, interval)
275
+ }
276
+ } catch (err) {
277
+ log.error(' Continuous think error:', err.message)
278
+ }
279
+ }
280
+
281
+ // 立即执行一次
282
+ await runThink()
283
+
284
+ return {
285
+ success: true,
286
+ message: `【持续思考已启动】\n间隔: ${interval}ms\n主题: ${topic}\n\nLLM 将定期自动思考并在有新想法时通知你。`
287
+ }
288
+ }
289
+
290
+ /**
291
+ * 停止持续思考模式
292
+ */
293
+ _stopContinuousThinking() {
294
+ this._continuousMode = false
295
+ if (this._continuousTimer) {
296
+ clearTimeout(this._continuousTimer)
297
+ this._continuousTimer = null
298
+ }
299
+ return {
300
+ success: true,
301
+ message: '持续思考已停止'
302
+ }
303
+ }
304
+
305
+ /**
306
+ * 获取当前活跃的 Agent
307
+ */
308
+ _getActiveAgent() {
309
+ // 优先使用主 Agent
310
+ if (this._framework._mainAgent) {
311
+ return this._framework._mainAgent
312
+ }
313
+
314
+ // 否则找一个空闲的 Agent
315
+ if (this._framework._agents && this._framework._agents.length > 0) {
316
+ for (let i = this._framework._agents.length - 1; i >= 0; i--) {
317
+ const agent = this._framework._agents[i]
318
+ if (agent.getStatus() === 'idle') {
319
+ return agent
320
+ }
321
+ }
322
+ }
323
+ return null
324
+ }
325
+
326
+ /**
327
+ * 获取待处理的反思通知
328
+ */
329
+ getPendingThoughts() {
330
+ return this._thoughts.slice(-10).reverse()
331
+ }
332
+
333
+ reload(framework) {
334
+ this._framework = framework
335
+ }
336
+
337
+ uninstall(framework) {
338
+ this._stopContinuousThinking()
339
+ this._thoughts = []
340
+ this._reflectionChain = []
341
+ this._framework = null
342
+ }
343
+ }
344
+
345
+ module.exports = { ThinkPlugin }