foliko 1.1.92 → 2.0.0

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 (212) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/CLAUDE.md +56 -30
  3. package/REFACTORING_PLAN.md +645 -0
  4. package/docs/architecture.md +131 -0
  5. package/docs/migration.md +57 -0
  6. package/docs/public-api.md +138 -0
  7. package/docs/usage.md +385 -0
  8. package/examples/ambient-example.js +20 -137
  9. package/examples/basic.js +21 -48
  10. package/examples/bootstrap.js +16 -74
  11. package/examples/mcp-example.js +6 -29
  12. package/examples/skill-example.js +6 -19
  13. package/examples/workflow.js +8 -56
  14. package/package.json +8 -4
  15. package/plugins/README.md +49 -0
  16. package/plugins/{ambient-agent → ambient}/EventWatcher.js +1 -1
  17. package/plugins/{ambient-agent → ambient}/ExplorerLoop.js +3 -3
  18. package/plugins/{ambient-agent → ambient}/GoalManager.js +2 -2
  19. package/plugins/ambient/README.md +14 -0
  20. package/plugins/{ambient-agent → ambient}/Reflector.js +1 -1
  21. package/plugins/{ambient-agent → ambient}/StateStore.js +1 -1
  22. package/plugins/{ambient-agent → ambient}/index.js +2 -2
  23. package/plugins/{ai-plugin.js → core/ai/index.js} +14 -30
  24. package/plugins/{audit-plugin.js → core/audit/index.js} +3 -30
  25. package/plugins/{coordinator-plugin.js → core/coordinator/index.js} +3 -35
  26. package/plugins/core/default/bootstrap.js +202 -0
  27. package/plugins/core/default/config.js +220 -0
  28. package/plugins/core/default/index.js +58 -0
  29. package/plugins/core/mcp/index.js +1 -0
  30. package/plugins/{python-plugin-loader.js → core/python-loader/index.js} +7 -187
  31. package/plugins/{rules-plugin.js → core/rules/index.js} +121 -64
  32. package/plugins/{scheduler-plugin.js → core/scheduler/index.js} +12 -114
  33. package/plugins/{session-plugin.js → core/session/index.js} +9 -73
  34. package/{src/capabilities/skill-manager.js → plugins/core/skill-manager/index.js} +64 -18
  35. package/plugins/{storage-plugin.js → core/storage/index.js} +5 -29
  36. package/plugins/{subagent-plugin.js → core/sub-agent/index.js} +10 -171
  37. package/plugins/{think-plugin.js → core/think/index.js} +24 -91
  38. package/{src/capabilities/workflow-engine.js → plugins/core/workflow/index.js} +87 -85
  39. package/plugins/default-plugins.js +6 -720
  40. package/plugins/{data-splitter-plugin.js → executors/data-splitter/index.js} +9 -83
  41. package/plugins/{extension-executor-plugin.js → executors/extension/index.js} +13 -97
  42. package/plugins/{python-executor-plugin.js → executors/python/index.js} +6 -31
  43. package/plugins/{shell-executor-plugin.js → executors/shell/index.js} +2 -5
  44. package/plugins/install/README.md +9 -0
  45. package/plugins/{install-plugin.js → install/index.js} +3 -3
  46. package/plugins/{file-system-plugin.js → io/file-system/index.js} +34 -236
  47. package/plugins/{web-plugin.js → io/web/index.js} +11 -113
  48. package/plugins/memory/README.md +13 -0
  49. package/plugins/{memory-plugin.js → memory/index.js} +4 -18
  50. package/plugins/messaging/email/README.md +19 -0
  51. package/plugins/{email → messaging/email}/index.js +2 -2
  52. package/plugins/{feishu-plugin.js → messaging/feishu/index.js} +3 -3
  53. package/plugins/{qq-plugin.js → messaging/qq/index.js} +5 -16
  54. package/plugins/{telegram-plugin.js → messaging/telegram/index.js} +3 -3
  55. package/plugins/{weixin-plugin.js → messaging/weixin/index.js} +15 -15
  56. package/plugins/{plugin-manager-plugin.js → plugin-manager/index.js} +36 -180
  57. package/plugins/{tools-plugin.js → tools/index.js} +68 -116
  58. package/plugins/trading/README.md +15 -0
  59. package/plugins/{gate-trading.js → trading/index.js} +8 -8
  60. package/{examples → sandbox}/test-concurrent-chat.js +2 -2
  61. package/{examples → sandbox}/test-long-chat.js +2 -2
  62. package/{examples → sandbox}/test-session-chat.js +2 -2
  63. package/{examples → sandbox}/test-web-plugin.js +1 -1
  64. package/{examples → sandbox}/test-weixin-feishu.js +2 -2
  65. package/src/agent/base.js +56 -0
  66. package/src/{core/agent-chat.js → agent/chat.js} +11 -11
  67. package/src/{core/coordinator-manager.js → agent/coordinator.js} +3 -3
  68. package/src/agent/index.js +111 -0
  69. package/src/agent/main.js +337 -0
  70. package/src/agent/prompt.js +78 -0
  71. package/src/agent/sub.js +198 -0
  72. package/src/agent/worker.js +104 -0
  73. package/{cli/bin/foliko.js → src/cli/bin.js} +1 -1
  74. package/{cli/src → src/cli}/commands/chat.js +25 -21
  75. package/{cli/src → src/cli}/index.js +1 -0
  76. package/{cli/src → src/cli}/ui/chat-ui-old.js +40 -178
  77. package/{cli/src → src/cli}/ui/chat-ui.js +3 -3
  78. package/{cli/src → src/cli}/ui/components/footer-bar.js +1 -1
  79. package/src/{core → common}/constants.js +3 -0
  80. package/src/common/errors.js +402 -0
  81. package/src/{utils → common}/logger.js +33 -0
  82. package/src/{utils/chat-queue.js → common/queue.js} +2 -2
  83. package/src/config/plugin-config.js +50 -0
  84. package/src/context/agent.js +32 -0
  85. package/src/context/compaction-prompts.js +170 -0
  86. package/src/context/compaction-utils.js +191 -0
  87. package/src/context/compressor.js +413 -0
  88. package/src/context/index.js +9 -0
  89. package/src/{core/context-manager.js → context/manager.js} +1 -1
  90. package/src/context/request.js +50 -0
  91. package/src/context/session.js +33 -0
  92. package/src/context/storage.js +30 -0
  93. package/src/executors/mcp-client.js +153 -0
  94. package/src/executors/mcp-desc.js +236 -0
  95. package/src/executors/mcp-executor.js +91 -956
  96. package/src/{core → framework}/command-registry.js +1 -1
  97. package/src/framework/framework.js +300 -0
  98. package/src/framework/index.js +18 -0
  99. package/src/framework/lifecycle.js +203 -0
  100. package/src/framework/loader.js +78 -0
  101. package/src/framework/registry.js +86 -0
  102. package/src/{core/ui-extension-context.js → framework/ui-extension.js} +1 -1
  103. package/src/index.js +130 -15
  104. package/src/llm/index.js +26 -0
  105. package/src/llm/provider.js +212 -0
  106. package/src/llm/registry.js +11 -0
  107. package/src/{core/token-counter.js → llm/tokens.js} +4 -37
  108. package/src/{core/plugin-base.js → plugin/base.js} +10 -136
  109. package/src/plugin/index.js +14 -0
  110. package/src/plugin/loader.js +101 -0
  111. package/src/plugin/manager.js +261 -0
  112. package/src/{core → session}/branch-summary-auto.js +2 -2
  113. package/src/{core/chat-session.js → session/chat.js} +2 -2
  114. package/src/session/index.js +7 -0
  115. package/src/{core/session-manager.js → session/session.js} +2 -2
  116. package/src/session/ttl.js +92 -0
  117. package/src/{core/jsonl-storage.js → storage/jsonl.js} +1 -1
  118. package/src/tool/executor.js +85 -0
  119. package/src/tool/index.js +15 -0
  120. package/src/tool/registry.js +143 -0
  121. package/src/{core/tool-router.js → tool/router.js} +17 -124
  122. package/src/tool/schema.js +108 -0
  123. package/src/utils/data-splitter.js +1 -1
  124. package/src/utils/download.js +1 -1
  125. package/src/utils/index.js +6 -6
  126. package/src/utils/message-validator.js +1 -1
  127. package/tests/core/context-storage.test.js +46 -0
  128. package/tests/core/llm.test.js +54 -0
  129. package/tests/core/plugin.test.js +42 -0
  130. package/tests/core/tool.test.js +60 -0
  131. package/tests/setup.js +10 -0
  132. package/tests/smoke.test.js +58 -0
  133. package/vitest.config.js +9 -0
  134. package/cli/src/daemon.js +0 -149
  135. package/docs/CONTEXT_DESIGN.md +0 -1596
  136. package/docs/ai-sdk-optimization.md +0 -655
  137. package/docs/features.md +0 -120
  138. package/docs/qq-bot.md +0 -976
  139. package/docs/quick-reference.md +0 -160
  140. package/docs/user-manual.md +0 -1391
  141. package/images/geometric_shapes.jpg +0 -0
  142. package/images/sunset_mountain_lake.jpg +0 -0
  143. package/skills/poster-guide/SKILL.md +0 -792
  144. package/src/capabilities/index.js +0 -11
  145. package/src/core/agent.js +0 -808
  146. package/src/core/context-compressor.js +0 -959
  147. package/src/core/enhanced-context-compressor.js +0 -210
  148. package/src/core/framework.js +0 -1422
  149. package/src/core/index.js +0 -30
  150. package/src/core/plugin-manager.js +0 -961
  151. package/src/core/provider-registry.js +0 -159
  152. package/src/core/provider.js +0 -156
  153. package/src/core/request-context.js +0 -98
  154. package/src/core/subagent.js +0 -442
  155. package/src/core/system-prompt-builder.js +0 -120
  156. package/src/core/tool-executor.js +0 -202
  157. package/src/core/tool-registry.js +0 -517
  158. package/src/core/worker-agent.js +0 -192
  159. package/src/executors/executor-base.js +0 -58
  160. package/src/utils/error-boundary.js +0 -363
  161. package/src/utils/error.js +0 -374
  162. package/system.md +0 -1645
  163. package/website_v2/README.md +0 -57
  164. package/website_v2/SPEC.md +0 -1
  165. package/website_v2/docs/api.html +0 -128
  166. package/website_v2/docs/configuration.html +0 -147
  167. package/website_v2/docs/plugin-development.html +0 -129
  168. package/website_v2/docs/project-structure.html +0 -89
  169. package/website_v2/docs/skill-development.html +0 -85
  170. package/website_v2/index.html +0 -489
  171. package/website_v2/scripts/main.js +0 -93
  172. package/website_v2/styles/animations.css +0 -8
  173. package/website_v2/styles/docs.css +0 -83
  174. package/website_v2/styles/main.css +0 -417
  175. package/xhs_auth.json +0 -268
  176. package//346/265/267/346/212/245/346/217/222/344/273/266.md +0 -621
  177. /package/plugins/{ambient-agent → ambient}/constants.js +0 -0
  178. /package/plugins/{email → messaging/email}/constants.js +0 -0
  179. /package/plugins/{email → messaging/email}/handlers.js +0 -0
  180. /package/plugins/{email → messaging/email}/monitor.js +0 -0
  181. /package/plugins/{email → messaging/email}/parser.js +0 -0
  182. /package/plugins/{email → messaging/email}/reply.js +0 -0
  183. /package/plugins/{email → messaging/email}/utils.js +0 -0
  184. /package/{examples → sandbox}/test-chat.js +0 -0
  185. /package/{examples → sandbox}/test-mcp.js +0 -0
  186. /package/{examples → sandbox}/test-reload.js +0 -0
  187. /package/{examples → sandbox}/test-telegram.js +0 -0
  188. /package/{examples → sandbox}/test-tg-bot.js +0 -0
  189. /package/{examples → sandbox}/test-tg-simple.js +0 -0
  190. /package/{examples → sandbox}/test-tg.js +0 -0
  191. /package/{examples → sandbox}/test-think.js +0 -0
  192. /package/src/{core/sub-agent-config.js → agent/sub-config.js} +0 -0
  193. /package/{cli/src → src/cli}/commands/daemon.js +0 -0
  194. /package/{cli/src → src/cli}/commands/list.js +0 -0
  195. /package/{cli/src → src/cli}/commands/plugin.js +0 -0
  196. /package/{cli/src → src/cli}/ui/components/agent-mention-provider.js +0 -0
  197. /package/{cli/src → src/cli}/ui/components/chained-autocomplete-provider.js +0 -0
  198. /package/{cli/src → src/cli}/ui/components/message-bubble.js +0 -0
  199. /package/{cli/src → src/cli}/ui/components/status-bar.js +0 -0
  200. /package/{cli/src → src/cli}/utils/ansi.js +0 -0
  201. /package/{cli/src → src/cli}/utils/config.js +0 -0
  202. /package/{cli/src → src/cli}/utils/markdown.js +0 -0
  203. /package/{cli/src → src/cli}/utils/plugin-config.js +0 -0
  204. /package/{cli/src → src/cli}/utils/render-diff.js +0 -0
  205. /package/src/{utils/circuit-breaker.js → common/circuit.js} +0 -0
  206. /package/src/{utils/edit-diff.js → common/diff.js} +0 -0
  207. /package/src/{utils/event-emitter.js → common/events.js} +0 -0
  208. /package/src/{utils → common}/id.js +0 -0
  209. /package/src/{utils → common}/retry.js +0 -0
  210. /package/src/{core/notification-manager.js → notification/manager.js} +0 -0
  211. /package/src/{core/session-entry.js → session/entry.js} +0 -0
  212. /package/src/{core/storage-manager.js → storage/manager.js} +0 -0
@@ -1,210 +0,0 @@
1
- /**
2
- * EnhancedContextCompressor - 增强的上下文压缩器
3
- * 整合 pi 的 compaction 逻辑,提供更智能的压缩策略
4
- */
5
-
6
- const {
7
- ContextCompressor,
8
- CompactionDetails,
9
- CompactionResult,
10
- prepareCompaction,
11
- prepareBranchEntries,
12
- collectEntriesForBranchSummary,
13
- serializeConversation,
14
- DEFAULT_COMPACTION_SETTINGS,
15
- BRANCH_SUMMARY_PREAMBLE,
16
- BRANCH_SUMMARY_PROMPT,
17
- EntryTypes
18
- } = require('./context-compressor');
19
-
20
- const { logger } = require('../utils/logger');
21
-
22
- class EnhancedContextCompressor {
23
- /**
24
- * @param {Object} config
25
- * @param {Framework} config.framework - Framework 实例
26
- * @param {Agent} [config.agent] - Agent 实例
27
- * @param {string} [config.model] - 模型名称
28
- * @param {Function} [config.onCompaction] - 压缩完成回调
29
- * @param {Function} [config.onBranchSummary] - 分支摘要生成回调
30
- */
31
- constructor(config = {}) {
32
- this.framework = config.framework;
33
- this.agent = config.agent;
34
-
35
- this.settings = {
36
- ...DEFAULT_COMPACTION_SETTINGS,
37
- ...config.settings
38
- };
39
-
40
- this._onCompaction = config.onCompaction || null;
41
- this._onBranchSummary = config.onBranchSummary || null;
42
-
43
- // 创建底层压缩器
44
- this._compressor = new ContextCompressor({
45
- agent: this.agent,
46
- framework: this.framework,
47
- model: config.model,
48
- compactionSettings: this.settings,
49
- enableSmartCompress: config.enableSmartCompress !== false
50
- });
51
- }
52
-
53
- /**
54
- * 执行智能压缩
55
- * @param {string} sessionId - Session ID
56
- * @param {Array} messages - 消息数组
57
- * @param {Object} messageStore - 消息存储
58
- * @param {Object} [options] - 选项
59
- * @returns {Promise<{didCompact: boolean, reason?: string, summary?: string}>}
60
- */
61
- async smartCompact(sessionId, messages, messageStore, options = {}) {
62
- const {
63
- reserveTokens = this.settings.reserveTokens,
64
- keepRecentTokens = this.settings.keepRecentTokens,
65
- minTokensToCompact = 1000
66
- } = options;
67
-
68
- const totalTokens = this._estimateTokens(messages);
69
- const effectiveLimit = totalTokens - reserveTokens;
70
-
71
- // 检查是否需要压缩
72
- if (totalTokens <= effectiveLimit) {
73
- return { didCompact: false, reason: 'below_threshold' };
74
- }
75
-
76
- // 计算需要压缩的 token 数
77
- const tokensToCompact = totalTokens - keepRecentTokens;
78
- if (tokensToCompact < minTokensToCompact) {
79
- return { didCompact: false, reason: 'too_small' };
80
- }
81
-
82
- // 执行压缩
83
- try {
84
- await this._compressor.compress(sessionId, messages, messageStore);
85
-
86
- if (this._onCompaction) {
87
- await this._onCompaction({
88
- sessionId,
89
- tokensBefore: totalTokens,
90
- tokensAfter: this._estimateTokens(messages),
91
- messagesCompressed: tokensToCompact
92
- });
93
- }
94
-
95
- return {
96
- didCompact: true,
97
- tokensBefore: totalTokens,
98
- tokensAfter: this._estimateTokens(messages)
99
- };
100
- } catch (err) {
101
- logger.error('[EnhancedContextCompressor] Smart compact failed:', err.message);
102
- return { didCompact: false, reason: 'error', error: err.message };
103
- }
104
- }
105
-
106
- /**
107
- * 准备分支摘要
108
- * 当切换分支时,收集需要摘要的内容
109
- * @param {SessionManager} session - Session 管理器
110
- * @param {string} oldLeafId - 旧叶子节点 ID
111
- * @param {string} targetId - 目标节点 ID
112
- * @returns {Promise<{needsSummary: boolean, summary?: string, entriesCount?: number}>}
113
- */
114
- async prepareBranchSummary(session, oldLeafId, targetId) {
115
- const { entries, commonAncestorId } = collectEntriesForBranchSummary(
116
- session,
117
- oldLeafId,
118
- targetId
119
- );
120
-
121
- if (entries.length === 0) {
122
- return { needsSummary: false };
123
- }
124
-
125
- // 检查 token 数量是否足够生成摘要
126
- const prep = prepareBranchEntries(entries, 0);
127
- if (prep.totalTokens < 500) {
128
- return { needsSummary: false, reason: 'too_small' };
129
- }
130
-
131
- if (this._onBranchSummary) {
132
- await this._onBranchSummary({
133
- entries,
134
- commonAncestorId,
135
- totalTokens: prep.totalTokens
136
- });
137
- }
138
-
139
- return {
140
- needsSummary: true,
141
- entriesCount: entries.length,
142
- totalTokens: prep.totalTokens
143
- };
144
- }
145
-
146
- /**
147
- * 生成分支摘要
148
- * @param {Array} messages - 消息数组
149
- * @returns {Promise<string>} 摘要文本
150
- */
151
- async generateBranchSummary(messages) {
152
- const conversation = serializeConversation(messages);
153
-
154
- if (!this.framework) {
155
- return `[Branch summary: ${messages.length} messages]`;
156
- }
157
-
158
- const subagent = this.framework.createSubAgent({
159
- name: 'branch-summarizer',
160
- systemPrompt: BRANCH_SUMMARY_PROMPT,
161
- disableTools: true,
162
- maxRetries: 0
163
- });
164
-
165
- try {
166
- const result = await subagent.chat(BRANCH_SUMMARY_PREAMBLE + conversation);
167
- if (result.success) {
168
- return result.message;
169
- }
170
- throw new Error(result.error || 'Summary generation failed');
171
- } catch (err) {
172
- logger.warn('[EnhancedContextCompressor] Branch summary failed:', err.message);
173
- return `[Branch summary: ${messages.length} messages]`;
174
- }
175
- }
176
-
177
- /**
178
- * 获取压缩统计
179
- */
180
- getStats() {
181
- return this._compressor.getStats();
182
- }
183
-
184
- /**
185
- * 估算 token 数量
186
- */
187
- _estimateTokens(messages) {
188
- let total = 0;
189
- for (const msg of messages) {
190
- const content = Array.isArray(msg.content)
191
- ? msg.content.map(c => c.text || '').join('')
192
- : (msg.content || '');
193
- total += Math.ceil(content.length / 4); // 简单估算
194
- }
195
- return total;
196
- }
197
-
198
- /**
199
- * 启用/禁用智能压缩
200
- */
201
- setSmartCompress(enabled) {
202
- this._compressor._enableSmartCompress = enabled;
203
- return this;
204
- }
205
- }
206
-
207
- module.exports = {
208
- EnhancedContextCompressor,
209
- DEFAULT_COMPACTION_SETTINGS
210
- };