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.
- package/.claude/settings.local.json +159 -157
- package/cli/bin/foliko.js +12 -12
- package/cli/src/commands/chat.js +143 -143
- package/cli/src/commands/list.js +93 -93
- package/cli/src/index.js +75 -75
- package/cli/src/ui/chat-ui.js +201 -201
- package/cli/src/utils/ansi.js +40 -40
- package/cli/src/utils/markdown.js +292 -292
- package/examples/ambient-example.js +194 -194
- package/examples/basic.js +115 -115
- package/examples/bootstrap.js +121 -121
- package/examples/mcp-example.js +56 -56
- package/examples/skill-example.js +49 -49
- package/examples/test-chat.js +137 -137
- package/examples/test-mcp.js +85 -85
- package/examples/test-reload.js +59 -59
- package/examples/test-telegram.js +50 -50
- package/examples/test-tg-bot.js +45 -45
- package/examples/test-tg-simple.js +47 -47
- package/examples/test-tg.js +62 -62
- package/examples/test-think.js +43 -43
- package/examples/test-web-plugin.js +103 -103
- package/examples/test-weixin-feishu.js +103 -103
- package/examples/workflow.js +158 -158
- package/package.json +1 -1
- package/plugins/ai-plugin.js +102 -102
- package/plugins/ambient-agent/EventWatcher.js +113 -113
- package/plugins/ambient-agent/ExplorerLoop.js +640 -640
- package/plugins/ambient-agent/GoalManager.js +197 -197
- package/plugins/ambient-agent/Reflector.js +95 -95
- package/plugins/ambient-agent/StateStore.js +90 -90
- package/plugins/ambient-agent/constants.js +101 -101
- package/plugins/ambient-agent/index.js +579 -579
- package/plugins/audit-plugin.js +187 -187
- package/plugins/default-plugins.js +662 -662
- package/plugins/email/constants.js +64 -64
- package/plugins/email/handlers.js +461 -461
- package/plugins/email/index.js +278 -278
- package/plugins/email/monitor.js +269 -269
- package/plugins/email/parser.js +138 -138
- package/plugins/email/reply.js +151 -151
- package/plugins/email/utils.js +124 -124
- package/plugins/feishu-plugin.js +481 -481
- package/plugins/file-system-plugin.js +826 -826
- package/plugins/install-plugin.js +199 -199
- package/plugins/python-executor-plugin.js +367 -367
- package/plugins/python-plugin-loader.js +481 -481
- package/plugins/rules-plugin.js +294 -294
- package/plugins/scheduler-plugin.js +691 -691
- package/plugins/session-plugin.js +369 -369
- package/plugins/shell-executor-plugin.js +197 -197
- package/plugins/storage-plugin.js +240 -240
- package/plugins/subagent-plugin.js +845 -845
- package/plugins/telegram-plugin.js +482 -482
- package/plugins/think-plugin.js +345 -345
- package/plugins/tools-plugin.js +196 -196
- package/plugins/web-plugin.js +606 -606
- package/plugins/weixin-plugin.js +545 -545
- package/src/capabilities/index.js +11 -11
- package/src/capabilities/skill-manager.js +609 -609
- package/src/capabilities/workflow-engine.js +1109 -1109
- package/src/core/agent-chat.js +882 -882
- package/src/core/agent.js +892 -892
- package/src/core/framework.js +465 -465
- package/src/core/index.js +19 -19
- package/src/core/plugin-base.js +219 -219
- package/src/core/plugin-manager.js +863 -863
- package/src/core/provider.js +114 -114
- package/src/core/sub-agent-config.js +264 -264
- package/src/core/system-prompt-builder.js +120 -120
- package/src/core/tool-registry.js +517 -517
- package/src/core/tool-router.js +297 -297
- package/src/executors/executor-base.js +58 -58
- package/src/executors/mcp-executor.js +741 -741
- package/src/index.js +25 -25
- package/src/utils/circuit-breaker.js +301 -301
- package/src/utils/error-boundary.js +363 -363
- package/src/utils/error.js +374 -374
- package/src/utils/event-emitter.js +97 -97
- package/src/utils/id.js +133 -133
- package/src/utils/index.js +217 -217
- package/src/utils/logger.js +181 -181
- package/src/utils/plugin-helpers.js +90 -90
- package/src/utils/retry.js +122 -122
- package/src/utils/sandbox.js +292 -292
- package/test/tool-registry-validation.test.js +218 -218
- package/website/script.js +136 -136
- package/foliko-1.0.75.tgz +0 -0
package/plugins/think-plugin.js
CHANGED
|
@@ -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 }
|