foliko 1.0.74 → 1.0.75

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 (237) 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 +157 -149
  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 +4 -4
  128. package/cli/src/commands/chat.js +53 -51
  129. package/cli/src/commands/list.js +40 -37
  130. package/cli/src/index.js +18 -18
  131. package/cli/src/ui/chat-ui.js +78 -76
  132. package/cli/src/utils/ansi.js +15 -15
  133. package/cli/src/utils/markdown.js +112 -116
  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 +95 -97
  140. package/examples/basic.js +115 -110
  141. package/examples/bootstrap.js +52 -43
  142. package/examples/mcp-example.js +56 -53
  143. package/examples/skill-example.js +49 -49
  144. package/examples/test-chat.js +60 -58
  145. package/examples/test-mcp.js +49 -43
  146. package/examples/test-reload.js +38 -40
  147. package/examples/test-telegram.js +3 -3
  148. package/examples/test-tg-bot.js +7 -4
  149. package/examples/test-tg-simple.js +4 -3
  150. package/examples/test-tg.js +3 -3
  151. package/examples/test-think.js +13 -7
  152. package/examples/test-web-plugin.js +61 -56
  153. package/examples/test-weixin-feishu.js +40 -37
  154. package/examples/workflow.js +49 -49
  155. package/foliko-1.0.75.tgz +0 -0
  156. package/package.json +37 -3
  157. package/plugins/ai-plugin.js +7 -5
  158. package/plugins/ambient-agent/EventWatcher.js +113 -0
  159. package/plugins/ambient-agent/ExplorerLoop.js +640 -0
  160. package/plugins/ambient-agent/GoalManager.js +197 -0
  161. package/plugins/ambient-agent/Reflector.js +95 -0
  162. package/plugins/ambient-agent/StateStore.js +90 -0
  163. package/plugins/ambient-agent/constants.js +101 -0
  164. package/plugins/ambient-agent/index.js +579 -0
  165. package/plugins/default-plugins.js +62 -49
  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 +23 -19
  174. package/plugins/file-system-plugin.js +456 -106
  175. package/plugins/install-plugin.js +6 -4
  176. package/plugins/python-executor-plugin.js +3 -1
  177. package/plugins/python-plugin-loader.js +10 -8
  178. package/plugins/rules-plugin.js +5 -3
  179. package/plugins/scheduler-plugin.js +18 -16
  180. package/plugins/session-plugin.js +3 -1
  181. package/plugins/storage-plugin.js +5 -3
  182. package/plugins/subagent-plugin.js +152 -92
  183. package/plugins/telegram-plugin.js +26 -19
  184. package/plugins/think-plugin.js +4 -2
  185. package/plugins/tools-plugin.js +3 -1
  186. package/plugins/web-plugin.js +15 -13
  187. package/plugins/weixin-plugin.js +43 -36
  188. package/reports/system-health-report-20260401.md +79 -0
  189. package/skills/ambient-agent/SKILL.md +49 -39
  190. package/skills/foliko-dev/AGENTS.md +64 -61
  191. package/skills/foliko-dev/SKILL.md +125 -119
  192. package/skills/mcp-usage/SKILL.md +19 -17
  193. package/skills/python-plugin-dev/SKILL.md +16 -15
  194. package/skills/skill-guide/SKILL.md +12 -12
  195. package/skills/subagent-guide/SKILL.md +237 -0
  196. package/skills/workflow-guide/SKILL.md +90 -45
  197. package/skills/workflow-troubleshooting/DEBUGGING.md +36 -21
  198. package/skills/workflow-troubleshooting/SKILL.md +156 -79
  199. package/src/capabilities/index.js +4 -4
  200. package/src/capabilities/skill-manager.js +211 -197
  201. package/src/capabilities/workflow-engine.js +461 -547
  202. package/src/core/agent-chat.js +426 -279
  203. package/src/core/agent.js +453 -249
  204. package/src/core/framework.js +183 -149
  205. package/src/core/index.js +8 -8
  206. package/src/core/plugin-base.js +52 -52
  207. package/src/core/plugin-manager.js +377 -281
  208. package/src/core/provider.js +35 -32
  209. package/src/core/sub-agent-config.js +264 -0
  210. package/src/core/system-prompt-builder.js +120 -0
  211. package/src/core/tool-registry.js +416 -33
  212. package/src/core/tool-router.js +149 -68
  213. package/src/executors/executor-base.js +58 -58
  214. package/src/executors/mcp-executor.js +269 -257
  215. package/src/index.js +5 -17
  216. package/src/utils/circuit-breaker.js +301 -0
  217. package/src/utils/error-boundary.js +363 -0
  218. package/src/utils/error.js +374 -0
  219. package/src/utils/event-emitter.js +20 -20
  220. package/src/utils/id.js +133 -0
  221. package/src/utils/index.js +217 -3
  222. package/src/utils/logger.js +181 -0
  223. package/src/utils/plugin-helpers.js +90 -0
  224. package/src/utils/retry.js +122 -0
  225. package/src/utils/sandbox.js +292 -0
  226. package/test/tool-registry-validation.test.js +218 -0
  227. package/test_report.md +70 -0
  228. package/website/docs/api.html +169 -107
  229. package/website/docs/configuration.html +296 -144
  230. package/website/docs/plugin-development.html +154 -85
  231. package/website/docs/project-structure.html +110 -109
  232. package/website/docs/skill-development.html +117 -61
  233. package/website/index.html +209 -205
  234. package/website/script.js +20 -17
  235. package/website/styles.css +1 -1
  236. package/plugins/ambient-agent-plugin.js +0 -1565
  237. package/plugins/email.js +0 -1142
@@ -3,28 +3,28 @@
3
3
  * 使用 readline question() 实现多行输入
4
4
  */
5
5
 
6
- const readline = require('readline')
7
- const { CLEAR_LINE, CYAN, DIM, GREEN, RED, YELLOW, colored } = require('../utils/ansi')
8
- const { renderLine } = require('../utils/markdown')
6
+ const readline = require('readline');
7
+ const { CLEAR_LINE, CYAN, DIM, GREEN, RED, YELLOW, colored } = require('../utils/ansi');
8
+ const { renderLine } = require('../utils/markdown');
9
9
 
10
10
  class ChatUI {
11
11
  constructor(agent, options = {}) {
12
- this.agent = agent
13
- this.rl = null
14
- this.lines = [] // 多行输入的累积
12
+ this.agent = agent;
13
+ this.rl = null;
14
+ this.lines = []; // 多行输入的累积
15
15
 
16
16
  // 会话管理
17
- this.sessionId = options.sessionId || 'cli_default'
18
- this.sessionPlugin = null
17
+ this.sessionId = options.sessionId || 'cli_default';
18
+ this.sessionPlugin = null;
19
19
 
20
20
  // 如果 agent 有 framework,获取 SessionPlugin
21
21
  if (agent.framework) {
22
- this.sessionPlugin = agent.framework.pluginManager.get('session')
22
+ this.sessionPlugin = agent.framework.pluginManager.get('session');
23
23
  // 确保会话存在
24
24
  if (this.sessionPlugin) {
25
25
  this.sessionPlugin.getOrCreateSession(this.sessionId, {
26
- metadata: { platform: 'cli' }
27
- })
26
+ metadata: { platform: 'cli' },
27
+ });
28
28
  }
29
29
  }
30
30
  }
@@ -36,19 +36,21 @@ class ChatUI {
36
36
  this.rl = readline.createInterface({
37
37
  input: process.stdin,
38
38
  output: process.stdout,
39
- crlfDelay: Infinity
40
- })
39
+ crlfDelay: Infinity,
40
+ });
41
41
 
42
- this.printWelcome()
43
- this.promptUser()
42
+ this.printWelcome();
43
+ this.promptUser();
44
44
  }
45
45
 
46
46
  /**
47
47
  * 打印欢迎信息
48
48
  */
49
49
  printWelcome() {
50
- console.log(`${colored('Foliko', CYAN)} - 持续对话聊天`)
51
- console.log(`${colored('Ctrl+C', DIM)} 退出 | ${colored('连续两次回车', DIM)} 发送多行 | ${colored('!!', DIM)} 立即发送\n`)
50
+ console.log(`${colored('Foliko', CYAN)} - 持续对话聊天`);
51
+ console.log(
52
+ `${colored('Ctrl+C', DIM)} 退出 | ${colored('连续两次回车', DIM)} 发送多行 | ${colored('!!', DIM)} 立即发送\n`
53
+ );
52
54
  }
53
55
 
54
56
  /**
@@ -56,33 +58,33 @@ class ChatUI {
56
58
  */
57
59
  getMultilineInput() {
58
60
  return new Promise((resolve) => {
59
- const lines = []
61
+ const lines = [];
60
62
 
61
63
  const question = (isFirst) => {
62
- const prompt = isFirst ? colored('> ', GREEN) : colored('- ', DIM)
64
+ const prompt = isFirst ? colored('> ', GREEN) : colored('- ', DIM);
63
65
  this.rl.question(prompt, (input) => {
64
66
  // 输入 !! 立即结束
65
67
  if (input.trim() === '!!') {
66
- const result = lines.join('\n').trim()
67
- resolve(result)
68
- return
68
+ const result = lines.join('\n').trim();
69
+ resolve(result);
70
+ return;
69
71
  }
70
72
 
71
73
  // 空行:结束输入并发送(第一次空行就发送)
72
74
  if (input.trim() === '') {
73
- const result = lines.join('\n').trim()
74
- resolve(result)
75
- return
75
+ const result = lines.join('\n').trim();
76
+ resolve(result);
77
+ return;
76
78
  }
77
79
 
78
80
  // 非空行:添加到 lines,继续输入
79
- lines.push(input)
80
- question(false)
81
- })
82
- }
81
+ lines.push(input);
82
+ question(false);
83
+ });
84
+ };
83
85
 
84
- question(true)
85
- })
86
+ question(true);
87
+ });
86
88
  }
87
89
 
88
90
  /**
@@ -90,28 +92,28 @@ class ChatUI {
90
92
  */
91
93
  async promptUser() {
92
94
  try {
93
- const input = await this.getMultilineInput()
95
+ const input = await this.getMultilineInput();
94
96
 
95
97
  if (!input) {
96
- await this.promptUser()
97
- return
98
+ await this.promptUser();
99
+ return;
98
100
  }
99
101
 
100
102
  // 退出命令
101
103
  if (input.toLowerCase() === 'exit' || input.toLowerCase() === 'quit') {
102
- console.log('再见!')
103
- this.rl.close()
104
- return
104
+ console.log('再见!');
105
+ this.rl.close();
106
+ return;
105
107
  }
106
108
 
107
109
  // 发送消息
108
- await this.sendMessage(input)
110
+ await this.sendMessage(input);
109
111
 
110
112
  // 继续等待下一条消息
111
- await this.promptUser()
113
+ await this.promptUser();
112
114
  } catch (err) {
113
- console.error(`\n${colored('[错误]', RED)} ${err.message}`)
114
- await this.promptUser()
115
+ console.error(`\n${colored('[错误]', RED)} ${err.message}`);
116
+ await this.promptUser();
115
117
  }
116
118
  }
117
119
 
@@ -119,81 +121,81 @@ class ChatUI {
119
121
  * 发送消息并显示响应
120
122
  */
121
123
  async sendMessage(message) {
122
- console.log()
124
+ console.log();
123
125
 
124
126
  // 添加用户消息到会话历史
125
127
  if (this.sessionPlugin) {
126
- this.sessionPlugin.addMessage(this.sessionId, { role: 'user', content: message })
128
+ this.sessionPlugin.addMessage(this.sessionId, { role: 'user', content: message });
127
129
  }
128
130
 
129
131
  // 用于打断的标志
130
- let interrupted = false
132
+ let interrupted = false;
131
133
 
132
134
  // 设置打断处理
133
135
  const interruptHandler = () => {
134
136
  if (!interrupted) {
135
- interrupted = true
136
- console.log(`\n${colored('[中断]', RED)} 输出已中断`)
137
+ interrupted = true;
138
+ console.log(`\n${colored('[中断]', RED)} 输出已中断`);
137
139
  }
138
- }
140
+ };
139
141
 
140
142
  // 监听 Ctrl+C
141
- process.on('SIGINT', interruptHandler)
143
+ process.on('SIGINT', interruptHandler);
142
144
 
143
- let fullResponse = ''
145
+ let fullResponse = '';
144
146
 
145
147
  try {
146
- let lineBuffer = ''
147
- const renderState = { inThink: false, inCodeBlock: false }
148
+ let lineBuffer = '';
149
+ const renderState = { inThink: false, inCodeBlock: false };
148
150
 
149
- console.log(colored('● ', GREEN))
151
+ console.log(colored('● ', GREEN));
150
152
  // console.log()
151
153
 
152
- const runWithContext = this.agent.framework?.runWithContext.bind(this.agent.framework)
153
- const { sessionId } = this
154
+ const runWithContext = this.agent.framework?.runWithContext.bind(this.agent.framework);
155
+ const { sessionId } = this;
154
156
 
155
157
  await runWithContext({ sessionId }, async () => {
156
158
  for await (const chunk of this.agent.chatStream(message, { sessionId })) {
157
- if (interrupted) break
159
+ if (interrupted) break;
158
160
 
159
- if (chunk.type === 'text') {
160
- fullResponse += chunk.text
161
- lineBuffer += chunk.text
161
+ if (chunk.type === 'text') {
162
+ fullResponse += chunk.text;
163
+ lineBuffer += chunk.text;
162
164
 
163
- while (lineBuffer.includes('\n')) {
164
- if (interrupted) break
165
+ while (lineBuffer.includes('\n')) {
166
+ if (interrupted) break;
165
167
 
166
- const nlIndex = lineBuffer.indexOf('\n')
167
- const line = lineBuffer.substring(0, nlIndex)
168
- lineBuffer = lineBuffer.substring(nlIndex + 1)
169
- if (line.trim()) {
170
- console.log(renderLine(line, renderState))
168
+ const nlIndex = lineBuffer.indexOf('\n');
169
+ const line = lineBuffer.substring(0, nlIndex);
170
+ lineBuffer = lineBuffer.substring(nlIndex + 1);
171
+ if (line.trim()) {
172
+ console.log(renderLine(line, renderState));
173
+ }
171
174
  }
175
+ } else if (chunk.type === 'tool-call') {
176
+ console.log(`\n${colored('[工具调用]', YELLOW)} ${chunk.toolName}`);
177
+ } else if (chunk.type === 'error') {
178
+ console.error(`\n${colored('[错误]', RED)} ${chunk.error}`);
172
179
  }
173
- } else if (chunk.type === 'tool-call') {
174
- console.log(`\n${colored('[工具调用]', YELLOW)} ${chunk.toolName}`)
175
- } else if (chunk.type === 'error') {
176
- console.error(`\n${colored('[错误]', RED)} ${chunk.error}`)
177
- }
178
180
  }
179
- })
181
+ });
180
182
 
181
183
  if (lineBuffer.trim() && !interrupted) {
182
- console.log(renderLine(lineBuffer, renderState))
184
+ console.log(renderLine(lineBuffer, renderState));
183
185
  }
184
186
  } catch (err) {
185
187
  if (!interrupted) {
186
- console.error(`\n${colored('[错误]', RED)} ${err.message}\n`)
188
+ console.error(`\n${colored('[错误]', RED)} ${err.message}\n`);
187
189
  }
188
190
  } finally {
189
- process.removeListener('SIGINT', interruptHandler)
191
+ process.removeListener('SIGINT', interruptHandler);
190
192
 
191
193
  // 添加助手回复到会话历史
192
194
  if (this.sessionPlugin && fullResponse) {
193
- this.sessionPlugin.addMessage(this.sessionId, { role: 'assistant', content: fullResponse })
195
+ this.sessionPlugin.addMessage(this.sessionId, { role: 'assistant', content: fullResponse });
194
196
  }
195
197
  }
196
198
  }
197
199
  }
198
200
 
199
- module.exports = { ChatUI }
201
+ module.exports = { ChatUI };
@@ -2,26 +2,26 @@
2
2
  * ANSI 转义序列工具
3
3
  */
4
4
 
5
- const CLEAR = '\x1B[0m'
6
- const CLEAR_LINE = '\x1B[2K'
5
+ const CLEAR = '\x1B[0m';
6
+ const CLEAR_LINE = '\x1B[2K';
7
7
 
8
8
  // 颜色
9
- const RED = '\x1B[31m'
10
- const GREEN = '\x1B[32m'
11
- const YELLOW = '\x1B[33m'
12
- const BLUE = '\x1B[34m'
13
- const MAGENTA = '\x1B[35m'
14
- const CYAN = '\x1B[36m'
15
- const WHITE = '\x1B[37m'
16
- const DIM = '\x1B[2m'
17
- const BOLD = '\x1B[1m'
9
+ const RED = '\x1B[31m';
10
+ const GREEN = '\x1B[32m';
11
+ const YELLOW = '\x1B[33m';
12
+ const BLUE = '\x1B[34m';
13
+ const MAGENTA = '\x1B[35m';
14
+ const CYAN = '\x1B[36m';
15
+ const WHITE = '\x1B[37m';
16
+ const DIM = '\x1B[2m';
17
+ const BOLD = '\x1B[1m';
18
18
 
19
19
  /**
20
20
  * 创建带颜色的字符串
21
21
  */
22
22
  function colored(text, color) {
23
- if (!color) return text
24
- return `${color}${text}${CLEAR}`
23
+ if (!color) return text;
24
+ return `${color}${text}${CLEAR}`;
25
25
  }
26
26
 
27
27
  module.exports = {
@@ -36,5 +36,5 @@ module.exports = {
36
36
  WHITE,
37
37
  DIM,
38
38
  BOLD,
39
- colored
40
- }
39
+ colored,
40
+ };