foliko 1.0.75 → 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 (88) hide show
  1. package/.claude/settings.local.json +159 -157
  2. package/cli/bin/foliko.js +12 -12
  3. package/cli/src/commands/chat.js +143 -143
  4. package/cli/src/commands/list.js +93 -93
  5. package/cli/src/index.js +75 -75
  6. package/cli/src/ui/chat-ui.js +201 -201
  7. package/cli/src/utils/ansi.js +40 -40
  8. package/cli/src/utils/markdown.js +292 -292
  9. package/examples/ambient-example.js +194 -194
  10. package/examples/basic.js +115 -115
  11. package/examples/bootstrap.js +121 -121
  12. package/examples/mcp-example.js +56 -56
  13. package/examples/skill-example.js +49 -49
  14. package/examples/test-chat.js +137 -137
  15. package/examples/test-mcp.js +85 -85
  16. package/examples/test-reload.js +59 -59
  17. package/examples/test-telegram.js +50 -50
  18. package/examples/test-tg-bot.js +45 -45
  19. package/examples/test-tg-simple.js +47 -47
  20. package/examples/test-tg.js +62 -62
  21. package/examples/test-think.js +43 -43
  22. package/examples/test-web-plugin.js +103 -103
  23. package/examples/test-weixin-feishu.js +103 -103
  24. package/examples/workflow.js +158 -158
  25. package/package.json +1 -1
  26. package/plugins/ai-plugin.js +102 -102
  27. package/plugins/ambient-agent/EventWatcher.js +113 -113
  28. package/plugins/ambient-agent/ExplorerLoop.js +640 -640
  29. package/plugins/ambient-agent/GoalManager.js +197 -197
  30. package/plugins/ambient-agent/Reflector.js +95 -95
  31. package/plugins/ambient-agent/StateStore.js +90 -90
  32. package/plugins/ambient-agent/constants.js +101 -101
  33. package/plugins/ambient-agent/index.js +579 -579
  34. package/plugins/audit-plugin.js +187 -187
  35. package/plugins/default-plugins.js +662 -662
  36. package/plugins/email/constants.js +64 -64
  37. package/plugins/email/handlers.js +461 -461
  38. package/plugins/email/index.js +278 -278
  39. package/plugins/email/monitor.js +269 -269
  40. package/plugins/email/parser.js +138 -138
  41. package/plugins/email/reply.js +151 -151
  42. package/plugins/email/utils.js +124 -124
  43. package/plugins/feishu-plugin.js +481 -481
  44. package/plugins/file-system-plugin.js +826 -826
  45. package/plugins/install-plugin.js +199 -199
  46. package/plugins/python-executor-plugin.js +367 -367
  47. package/plugins/python-plugin-loader.js +481 -481
  48. package/plugins/rules-plugin.js +294 -294
  49. package/plugins/scheduler-plugin.js +691 -691
  50. package/plugins/session-plugin.js +369 -369
  51. package/plugins/shell-executor-plugin.js +197 -197
  52. package/plugins/storage-plugin.js +240 -240
  53. package/plugins/subagent-plugin.js +845 -845
  54. package/plugins/telegram-plugin.js +482 -482
  55. package/plugins/think-plugin.js +345 -345
  56. package/plugins/tools-plugin.js +196 -196
  57. package/plugins/web-plugin.js +606 -606
  58. package/plugins/weixin-plugin.js +545 -545
  59. package/src/capabilities/index.js +11 -11
  60. package/src/capabilities/skill-manager.js +609 -609
  61. package/src/capabilities/workflow-engine.js +1109 -1109
  62. package/src/core/agent-chat.js +882 -882
  63. package/src/core/agent.js +892 -892
  64. package/src/core/framework.js +465 -465
  65. package/src/core/index.js +19 -19
  66. package/src/core/plugin-base.js +219 -219
  67. package/src/core/plugin-manager.js +863 -863
  68. package/src/core/provider.js +114 -114
  69. package/src/core/sub-agent-config.js +264 -264
  70. package/src/core/system-prompt-builder.js +120 -120
  71. package/src/core/tool-registry.js +517 -517
  72. package/src/core/tool-router.js +297 -297
  73. package/src/executors/executor-base.js +58 -58
  74. package/src/executors/mcp-executor.js +741 -741
  75. package/src/index.js +25 -25
  76. package/src/utils/circuit-breaker.js +301 -301
  77. package/src/utils/error-boundary.js +363 -363
  78. package/src/utils/error.js +374 -374
  79. package/src/utils/event-emitter.js +97 -97
  80. package/src/utils/id.js +133 -133
  81. package/src/utils/index.js +217 -217
  82. package/src/utils/logger.js +181 -181
  83. package/src/utils/plugin-helpers.js +90 -90
  84. package/src/utils/retry.js +122 -122
  85. package/src/utils/sandbox.js +292 -292
  86. package/test/tool-registry-validation.test.js +218 -218
  87. package/website/script.js +136 -136
  88. package/foliko-1.0.75.tgz +0 -0
@@ -1,345 +1,345 @@
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 }
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 }