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
@@ -0,0 +1,197 @@
1
+ /**
2
+ * GoalManager - 管理目标及其生命周期状态
3
+ */
4
+
5
+ const { logger } = require('../../src/utils/logger')
6
+ const { GoalState } = require('./constants')
7
+ const { generateId } = require('../../src/utils/id')
8
+
9
+ const log = logger.child('Ambient:GoalManager')
10
+
11
+ class GoalManager {
12
+ constructor(stateStore) {
13
+ this._goals = new Map()
14
+ this._stateStore = stateStore
15
+ this._loadGoals()
16
+ }
17
+
18
+ _loadGoals() {
19
+ const savedGoals = this._stateStore.loadGoals()
20
+ for (const goal of savedGoals) {
21
+ this._goals.set(goal.id, goal)
22
+ }
23
+ }
24
+
25
+ _persist() {
26
+ const goalsArray = Array.from(this._goals.values())
27
+ this._stateStore.saveGoals(goalsArray)
28
+ }
29
+
30
+ /**
31
+ * 创建新目标
32
+ * @param {Object} goalData - 目标数据
33
+ * @returns {Object} 创建的目标
34
+ */
35
+ createGoal(goalData) {
36
+ const actions = goalData.actions || []
37
+ const goal = {
38
+ id: generateId(),
39
+ title: goalData.title || '未命名目标',
40
+ description: goalData.description || '',
41
+ priority: goalData.priority || 5,
42
+ state: GoalState.PENDING,
43
+ actions: actions,
44
+ _originalActions: actions.slice(), // 保存原始 actions,用于事件驱动目标重置
45
+ conditions: goalData.conditions || {},
46
+ createdAt: new Date(),
47
+ updatedAt: new Date(),
48
+ activatedAt: null,
49
+ completedAt: null,
50
+ failedAt: null,
51
+ attempts: 0,
52
+ maxAttempts: goalData.maxAttempts || 10,
53
+ consecutiveSameActions: 0,
54
+ lastActionId: null,
55
+ eventsReceived: []
56
+ }
57
+ this._goals.set(goal.id, goal)
58
+ this._persist()
59
+ return goal
60
+ }
61
+
62
+ /**
63
+ * 获取目标
64
+ * @param {string} id - 目标ID
65
+ * @returns {Object|null} 目标对象
66
+ */
67
+ getGoal(id) {
68
+ return this._goals.get(id)
69
+ }
70
+
71
+ /**
72
+ * 获取所有目标
73
+ * @returns {Array} 所有目标数组
74
+ */
75
+ getAllGoals() {
76
+ return Array.from(this._goals.values())
77
+ }
78
+
79
+ /**
80
+ * 获取活跃目标
81
+ * @returns {Array} 活跃目标数组
82
+ */
83
+ getActiveGoals() {
84
+ return Array.from(this._goals.values()).filter(g => g.state === GoalState.ACTIVE)
85
+ }
86
+
87
+ /**
88
+ * 获取待处理目标
89
+ * @returns {Array} 待处理目标数组
90
+ */
91
+ getPendingGoals() {
92
+ return Array.from(this._goals.values()).filter(g => g.state === GoalState.PENDING)
93
+ }
94
+
95
+ /**
96
+ * 更新目标
97
+ * @param {string} id - 目标ID
98
+ * @param {Object} updates - 更新数据
99
+ * @returns {Object|null} 更新后的目标
100
+ */
101
+ updateGoal(id, updates) {
102
+ const goal = this._goals.get(id)
103
+ if (!goal) return null
104
+ Object.assign(goal, updates, { updatedAt: new Date() })
105
+ this._persist()
106
+ return goal
107
+ }
108
+
109
+ /**
110
+ * 激活目标
111
+ * @param {string} id - 目标ID
112
+ * @returns {Object|null} 激活后的目标
113
+ */
114
+ activateGoal(id) {
115
+ const goal = this._goals.get(id)
116
+ if (!goal || goal.state !== GoalState.PENDING) return null
117
+ goal.state = GoalState.ACTIVE
118
+ goal.activatedAt = new Date()
119
+ goal.updatedAt = new Date()
120
+ this._persist()
121
+ return goal
122
+ }
123
+
124
+ /**
125
+ * 标记目标为已完成
126
+ * @param {string} id - 目标ID
127
+ * @returns {Object|null} 目标对象
128
+ */
129
+ completeGoal(id) {
130
+ const goal = this._goals.get(id)
131
+ if (!goal) return null
132
+ goal.state = GoalState.COMPLETED
133
+ goal.completedAt = new Date()
134
+ goal.updatedAt = new Date()
135
+ this._persist()
136
+ return goal
137
+ }
138
+
139
+ /**
140
+ * 标记目标为失败
141
+ * @param {string} id - 目标ID
142
+ * @param {string} reason - 失败原因
143
+ * @returns {Object|null} 目标对象
144
+ */
145
+ failGoal(id, reason) {
146
+ const goal = this._goals.get(id)
147
+ if (!goal) return null
148
+ goal.state = GoalState.FAILED
149
+ goal.failedAt = new Date()
150
+ goal.failureReason = reason
151
+ goal.updatedAt = new Date()
152
+ this._persist()
153
+ return goal
154
+ }
155
+
156
+ /**
157
+ * 删除目标
158
+ * @param {string} id - 目标ID
159
+ * @returns {boolean} 是否删除成功
160
+ */
161
+ deleteGoal(id) {
162
+ const deleted = this._goals.delete(id)
163
+ if (deleted) this._persist()
164
+ return deleted
165
+ }
166
+
167
+ /**
168
+ * 向目标添加事件(带去重)
169
+ * @param {string} goalId - 目标ID
170
+ * @param {Object} event - 事件数据
171
+ */
172
+ addEventToGoal(goalId, event) {
173
+ const goal = this._goals.get(goalId)
174
+ if (!goal) return
175
+
176
+ // 通用去重:如果最近 2 秒内已有相同类型的事件,跳过
177
+ const now = Date.now()
178
+ const recentSameEvent = goal.eventsReceived.find(e =>
179
+ e.event === event.type && (now - new Date(e.timestamp).getTime()) < 2000
180
+ )
181
+ if (recentSameEvent) {
182
+ log.info(`跳过重复事件: ${event.type} (2秒内不重复添加)`)
183
+ return
184
+ }
185
+
186
+ // event 格式: { type: 'email:received', email: {...}, timestamp: ... }
187
+ // 需要提取 type 和 data(email 对象)
188
+ goal.eventsReceived.push({
189
+ event: event.type,
190
+ data: event.data || event.email || event,
191
+ timestamp: new Date()
192
+ })
193
+ this._persist()
194
+ }
195
+ }
196
+
197
+ module.exports = { GoalManager }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Reflector - 评估操作结果,更新目标状态
3
+ */
4
+
5
+ const { logger } = require('../../src/utils/logger')
6
+
7
+ const log = logger.child('Ambient:Reflector')
8
+
9
+ class Reflector {
10
+ constructor(goalManager) {
11
+ this._goalManager = goalManager
12
+ }
13
+
14
+ /**
15
+ * 评估操作结果
16
+ * @param {Object} goal - 目标对象
17
+ * @param {Object} actionResult - 操作结果
18
+ * @returns {Object} 评估结果 { shouldContinue, goalComplete, actionTaken }
19
+ */
20
+ evaluateOutcome(goal, actionResult) {
21
+ if (!goal) return null
22
+
23
+ // 检查是否是事件驱动目标
24
+ const isEventDriven = goal.conditions?.events && goal.conditions.events.length > 0
25
+
26
+ // 检查错误
27
+ if (actionResult && actionResult.error) {
28
+ // 增加尝试次数但不立即失败
29
+ goal.attempts++
30
+ // 事件驱动目标:错误不导致失败或完成
31
+ if (isEventDriven) {
32
+ return { shouldContinue: true, goalComplete: false }
33
+ }
34
+ return {
35
+ shouldContinue: goal.attempts < goal.maxAttempts,
36
+ actionTaken: false
37
+ }
38
+ }
39
+
40
+ // 检查是否成功完成
41
+ if (actionResult && actionResult.success === true) {
42
+ goal.attempts++
43
+
44
+ // 事件驱动目标:永远不会完成,持续等待下一事件
45
+ if (isEventDriven) {
46
+ return { shouldContinue: true, goalComplete: false }
47
+ }
48
+
49
+ // 检查目标是否完成
50
+ if (goal.actions.length === 0 || goal.attempts >= goal.maxAttempts) {
51
+ return { shouldContinue: false, goalComplete: true }
52
+ }
53
+
54
+ return { shouldContinue: true, actionTaken: true }
55
+ }
56
+
57
+ // 工具执行无错误 - 视为成功
58
+ goal.attempts++
59
+
60
+ // 事件驱动目标:永远不会完成
61
+ if (isEventDriven) {
62
+ return { shouldContinue: true, goalComplete: false }
63
+ }
64
+
65
+ // 检查目标是否完成(没有更多操作)
66
+ if (goal.actions.length === 0 || goal.attempts >= goal.maxAttempts) {
67
+ return { shouldContinue: false, goalComplete: true }
68
+ }
69
+
70
+ return { shouldContinue: true, actionTaken: true }
71
+ }
72
+
73
+ /**
74
+ * 检查循环检测
75
+ * @param {Object} goal - 目标对象
76
+ * @param {string} actionId - 操作ID
77
+ * @returns {boolean} 是否检测到循环
78
+ */
79
+ checkLoopDetection(goal, actionId) {
80
+ // 如果同一操作连续重复3次,则目标失败
81
+ if (goal.lastActionId === actionId) {
82
+ goal.consecutiveSameActions++
83
+ if (goal.consecutiveSameActions >= 3) {
84
+ this._goalManager.failGoal(goal.id, '检测到循环:同一操作连续重复3次')
85
+ return true
86
+ }
87
+ } else {
88
+ goal.consecutiveSameActions = 1
89
+ goal.lastActionId = actionId
90
+ }
91
+ return false
92
+ }
93
+ }
94
+
95
+ module.exports = { Reflector }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * StateStore - 持久化目标和记忆到文件系统
3
+ */
4
+
5
+ const fs = require('fs')
6
+ const path = require('path')
7
+ const { logger } = require('../../src/utils/logger')
8
+
9
+ const log = logger.child('Ambient:StateStore')
10
+
11
+ class StateStore {
12
+ constructor(persistencePath) {
13
+ this._persistencePath = persistencePath
14
+ this._ensureDir()
15
+ }
16
+
17
+ _ensureDir() {
18
+ if (!fs.existsSync(this._persistencePath)) {
19
+ fs.mkdirSync(this._persistencePath, { recursive: true })
20
+ }
21
+ }
22
+
23
+ _getGoalsPath() {
24
+ return path.join(this._persistencePath, 'goals.json')
25
+ }
26
+
27
+ _getMemoriesPath() {
28
+ return path.join(this._persistencePath, 'memories.json')
29
+ }
30
+
31
+ /**
32
+ * 保存目标列表到文件
33
+ * @param {Array} goals - 目标数组
34
+ */
35
+ saveGoals(goals) {
36
+ try {
37
+ fs.writeFileSync(this._getGoalsPath(), JSON.stringify(goals, null, 2))
38
+ } catch (err) {
39
+ log.error('保存目标失败:', err.message)
40
+ }
41
+ }
42
+
43
+ /**
44
+ * 从文件加载目标列表
45
+ * @returns {Array} 目标数组
46
+ */
47
+ loadGoals() {
48
+ try {
49
+ const filePath = this._getGoalsPath()
50
+ if (fs.existsSync(filePath)) {
51
+ const data = fs.readFileSync(filePath, 'utf-8')
52
+ return JSON.parse(data)
53
+ }
54
+ } catch (err) {
55
+ log.error('加载目标失败:', err.message)
56
+ }
57
+ return []
58
+ }
59
+
60
+ /**
61
+ * 保存记忆列表到文件
62
+ * @param {Array} memories - 记忆数组
63
+ */
64
+ saveMemories(memories) {
65
+ try {
66
+ fs.writeFileSync(this._getMemoriesPath(), JSON.stringify(memories, null, 2))
67
+ } catch (err) {
68
+ log.error('保存记忆失败:', err.message)
69
+ }
70
+ }
71
+
72
+ /**
73
+ * 从文件加载记忆列表
74
+ * @returns {Array} 记忆数组
75
+ */
76
+ loadMemories() {
77
+ try {
78
+ const filePath = this._getMemoriesPath()
79
+ if (fs.existsSync(filePath)) {
80
+ const data = fs.readFileSync(filePath, 'utf-8')
81
+ return JSON.parse(data)
82
+ }
83
+ } catch (err) {
84
+ log.error('加载记忆失败:', err.message)
85
+ }
86
+ return []
87
+ }
88
+ }
89
+
90
+ module.exports = { StateStore }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Ambient Agent 常量定义
3
+ */
4
+
5
+ // 目标生命周期状态
6
+ const GoalState = {
7
+ PENDING: 'pending', // 待激活
8
+ ACTIVE: 'active', // 执行中
9
+ COMPLETED: 'completed', // 已完成
10
+ FAILED: 'failed' // 已失败
11
+ }
12
+
13
+ // 事件描述(用于生成插件描述)
14
+ const EventDescriptions = {
15
+ 'tool:result': '工具执行结果事件 - 参数: name(工具名), args(执行参数), result(执行结果), error(错误信息)',
16
+ 'scheduler:reminder': '定时提醒事件 - 参数: taskId(任务ID), message(提醒消息), time(触发时间)',
17
+ 'scheduler:task_completed': '任务完成事件 - 参数: taskId(任务ID), result(任务结果)',
18
+ 'scheduler:task_failed': '任务失败事件 - 参数: taskId(任务ID), error(错误信息)',
19
+ 'agent:message': '代理消息事件 - 参数: content(消息内容), sessionId(会话ID), agentId(代理ID)',
20
+ 'think:thought_completed': '思考完成事件 - 参数: mode(思考模式), topic(思考主题), thought(思考内容), depth(思考深度)',
21
+ 'email:received': '收到邮件事件 - 参数: from(发件人), to(收件人), subject(主题), text(正文), body(HTML正文), messageId(消息ID), timestamp(时间戳)',
22
+ 'webhook:received': 'Webhook接收事件 - 参数: headers(HTTP头), body(请求体), query(查询参数), path(请求路径)'
23
+ }
24
+
25
+ // 监听的事件类型列表
26
+ const DefaultEvents = [
27
+ 'tool:result',
28
+ 'scheduler:reminder',
29
+ 'agent:message',
30
+ 'think:thought_completed',
31
+ 'email:received',
32
+ 'webhook:received'
33
+ ]
34
+
35
+ // 系统提示词模板
36
+ const SystemPrompts = {
37
+ ambientWorker: `你是 ambient-worker,一个专门执行后台任务的子 agent。
38
+
39
+ 你的职责:
40
+ 1. 执行 LLM 调用的任务(如生成回复、发送消息)
41
+ 2. 不主动思考,只执行给定任务
42
+ 3. 快速响应,不等待用户交互
43
+
44
+ 当收到任务时,直接执行并返回结果。`
45
+ }
46
+
47
+ // 思考模式提示词
48
+ const ThinkModePrompts = {
49
+ reflect: (goal, topic) => `作为Ambient Agent,反思当前目标:
50
+ 标题: ${goal.title}
51
+ 描述: ${goal.description || '无'}
52
+ 优先级: ${goal.priority}
53
+ 状态: ${goal.state}
54
+ 尝试次数: ${goal.attempts}
55
+
56
+ ${topic ? `额外关注点: ${topic}` : ''}
57
+
58
+ 请反思:
59
+ 1. 这个目标仍然相关且可实现吗?
60
+ 2. 操作是否适合这个目标?
61
+ 3.有什么可以改进的?`,
62
+
63
+ brainstorm: (goal, topic) => `为Ambient Agent目标头脑风暴新方法:
64
+ 标题: ${goal.title}
65
+ ${goal.description ? `描述: ${goal.description}` : ''}
66
+ 计划的操作数: ${goal.actions ? goal.actions.length : 0}
67
+
68
+ ${topic ? `关注点: ${topic}` : '生成关于如何更有效地追求这个目标的新想法。'}`,
69
+
70
+ plan: (goal, topic) => `为Ambient Agent目标制定更精细的计划:
71
+ 标题: ${goal.title}
72
+ ${goal.description ? `描述: ${goal.description}` : ''}
73
+ ${topic ? `额外上下文: ${topic}` : ''}
74
+
75
+ 制定一个清晰、可操作的计划。`,
76
+
77
+ analyze: (goal, topic) => `分析Ambient Agent目标:
78
+ 标题: ${goal.title}
79
+ 状态: ${goal.state}
80
+ 优先级: ${goal.priority}
81
+ 操作: ${goal.actions ? JSON.stringify(goal.actions) : '无'}
82
+
83
+ ${topic ? `分析重点: ${topic}` : '这个目标的优势、劣势和潜在问题是什么?'}`
84
+ }
85
+
86
+ // 自由思考提示词
87
+ const FreeThinkPrompts = {
88
+ reflect: (topic) => `Ambient Agent反思: ${topic || '思考系统和目标的当前状态。有什么可以改进的?'}`,
89
+ brainstorm: (topic) => `Ambient Agent头脑风暴: ${topic || '生成关于新目标或方法的有创意想法。'}`,
90
+ plan: (topic) => `Ambient Agent计划: ${topic || '为待实现的目标制定计划。'}`,
91
+ analyze: (topic) => `Ambient Agent分析: ${topic || '分析当前目标及其进展。'}`
92
+ }
93
+
94
+ module.exports = {
95
+ GoalState,
96
+ EventDescriptions,
97
+ DefaultEvents,
98
+ SystemPrompts,
99
+ ThinkModePrompts,
100
+ FreeThinkPrompts
101
+ }