tianxincode 1.0.7 → 1.0.9

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 (128) hide show
  1. package/@.txcode/req//351/241/265/351/235/242/345/270/203/345/261/200/AI/346/234/215/345/212/241/345/225/206/345/222/214/346/250/241/345/236/213/351/205/215/347/275/256.html +241 -0
  2. package/dist/api/ai-log.routes.d.ts +2 -0
  3. package/dist/api/ai-log.routes.d.ts.map +1 -0
  4. package/dist/api/ai-log.routes.js +21 -0
  5. package/dist/api/ai-log.routes.js.map +1 -0
  6. package/dist/api/chat.routes.d.ts.map +1 -1
  7. package/dist/api/chat.routes.js +35 -1
  8. package/dist/api/chat.routes.js.map +1 -1
  9. package/dist/api/config.routes.js +21 -0
  10. package/dist/api/config.routes.js.map +1 -1
  11. package/dist/api/index.d.ts.map +1 -1
  12. package/dist/api/index.js +2 -0
  13. package/dist/api/index.js.map +1 -1
  14. package/dist/components/App.d.ts.map +1 -1
  15. package/dist/components/App.js +71 -19
  16. package/dist/components/App.js.map +1 -1
  17. package/dist/index.js +2 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/modules/ai/ai-log.service.d.ts +42 -0
  20. package/dist/modules/ai/ai-log.service.d.ts.map +1 -0
  21. package/dist/modules/ai/ai-log.service.js +52 -0
  22. package/dist/modules/ai/ai-log.service.js.map +1 -0
  23. package/dist/modules/ai/ai.service.d.ts +7 -6
  24. package/dist/modules/ai/ai.service.d.ts.map +1 -1
  25. package/dist/modules/ai/ai.service.js +53 -25
  26. package/dist/modules/ai/ai.service.js.map +1 -1
  27. package/dist/modules/ai/ai.types.d.ts +3 -0
  28. package/dist/modules/ai/ai.types.d.ts.map +1 -1
  29. package/dist/modules/ai/openai.provider.d.ts +2 -0
  30. package/dist/modules/ai/openai.provider.d.ts.map +1 -1
  31. package/dist/modules/ai/openai.provider.js +26 -2
  32. package/dist/modules/ai/openai.provider.js.map +1 -1
  33. package/dist/modules/ai/provider/base.d.ts +1 -0
  34. package/dist/modules/ai/provider/base.d.ts.map +1 -1
  35. package/dist/modules/ai/provider/openai/openai-agent.d.ts +2 -0
  36. package/dist/modules/ai/provider/openai/openai-agent.d.ts.map +1 -1
  37. package/dist/modules/ai/provider/openai/openai-agent.js +45 -8
  38. package/dist/modules/ai/provider/openai/openai-agent.js.map +1 -1
  39. package/dist/modules/ai/provider/openai/prompts.js +1 -1
  40. package/dist/modules/ai/provider/openai/prompts.js.map +1 -1
  41. package/dist/modules/ai/react.agent.d.ts +1 -0
  42. package/dist/modules/ai/react.agent.d.ts.map +1 -1
  43. package/dist/modules/ai/react.agent.js +14 -1
  44. package/dist/modules/ai/react.agent.js.map +1 -1
  45. package/dist/modules/db/db.service.d.ts +13 -66
  46. package/dist/modules/db/db.service.d.ts.map +1 -1
  47. package/dist/modules/db/db.service.js +171 -143
  48. package/dist/modules/db/db.service.js.map +1 -1
  49. package/dist/modules/db/db.types.d.ts +3 -3
  50. package/dist/modules/db/db.types.d.ts.map +1 -1
  51. package/dist/modules/db/db.types.js +1 -1
  52. package/dist/modules/tools/builtin/bash.js +3 -2
  53. package/dist/modules/tools/builtin/bash.js.map +1 -1
  54. package/dist/modules/tools/provider/bash.d.ts +3 -0
  55. package/dist/modules/tools/provider/bash.d.ts.map +1 -0
  56. package/dist/modules/tools/provider/bash.js +135 -0
  57. package/dist/modules/tools/provider/bash.js.map +1 -0
  58. package/dist/modules/tools/provider/code_search.d.ts +3 -0
  59. package/dist/modules/tools/provider/code_search.d.ts.map +1 -0
  60. package/dist/modules/tools/provider/code_search.js +90 -0
  61. package/dist/modules/tools/provider/code_search.js.map +1 -0
  62. package/dist/modules/tools/provider/edit_file.d.ts +3 -0
  63. package/dist/modules/tools/provider/edit_file.d.ts.map +1 -0
  64. package/dist/modules/tools/provider/edit_file.js +95 -0
  65. package/dist/modules/tools/provider/edit_file.js.map +1 -0
  66. package/dist/modules/tools/provider/glob.d.ts +3 -0
  67. package/dist/modules/tools/provider/glob.d.ts.map +1 -0
  68. package/dist/modules/tools/provider/glob.js +87 -0
  69. package/dist/modules/tools/provider/glob.js.map +1 -0
  70. package/dist/modules/tools/provider/grep.d.ts +3 -0
  71. package/dist/modules/tools/provider/grep.d.ts.map +1 -0
  72. package/dist/modules/tools/provider/grep.js +96 -0
  73. package/dist/modules/tools/provider/grep.js.map +1 -0
  74. package/dist/modules/tools/provider/index.d.ts +7 -0
  75. package/dist/modules/tools/provider/index.d.ts.map +1 -0
  76. package/dist/modules/tools/provider/index.js +37 -0
  77. package/dist/modules/tools/provider/index.js.map +1 -0
  78. package/dist/modules/tools/provider/lsp.d.ts +6 -0
  79. package/dist/modules/tools/provider/lsp.d.ts.map +1 -0
  80. package/dist/modules/tools/provider/lsp.js +128 -0
  81. package/dist/modules/tools/provider/lsp.js.map +1 -0
  82. package/dist/modules/tools/provider/memory.d.ts +3 -0
  83. package/dist/modules/tools/provider/memory.d.ts.map +1 -0
  84. package/dist/modules/tools/provider/memory.js +80 -0
  85. package/dist/modules/tools/provider/memory.js.map +1 -0
  86. package/dist/modules/tools/provider/read_file.d.ts +3 -0
  87. package/dist/modules/tools/provider/read_file.d.ts.map +1 -0
  88. package/dist/modules/tools/provider/read_file.js +109 -0
  89. package/dist/modules/tools/provider/read_file.js.map +1 -0
  90. package/dist/modules/tools/provider/skill.d.ts +6 -0
  91. package/dist/modules/tools/provider/skill.d.ts.map +1 -0
  92. package/dist/modules/tools/provider/skill.js +64 -0
  93. package/dist/modules/tools/provider/skill.js.map +1 -0
  94. package/dist/modules/tools/provider/todo_read.d.ts +3 -0
  95. package/dist/modules/tools/provider/todo_read.d.ts.map +1 -0
  96. package/dist/modules/tools/provider/todo_read.js +26 -0
  97. package/dist/modules/tools/provider/todo_read.js.map +1 -0
  98. package/dist/modules/tools/provider/todo_write.d.ts +3 -0
  99. package/dist/modules/tools/provider/todo_write.d.ts.map +1 -0
  100. package/dist/modules/tools/provider/todo_write.js +49 -0
  101. package/dist/modules/tools/provider/todo_write.js.map +1 -0
  102. package/dist/modules/tools/provider/tools.d.ts +4 -0
  103. package/dist/modules/tools/provider/tools.d.ts.map +1 -0
  104. package/dist/modules/tools/provider/tools.js +14 -0
  105. package/dist/modules/tools/provider/tools.js.map +1 -0
  106. package/dist/modules/tools/provider/web_fetch.d.ts +3 -0
  107. package/dist/modules/tools/provider/web_fetch.d.ts.map +1 -0
  108. package/dist/modules/tools/provider/web_fetch.js +56 -0
  109. package/dist/modules/tools/provider/web_fetch.js.map +1 -0
  110. package/dist/modules/tools/provider/web_search.d.ts +3 -0
  111. package/dist/modules/tools/provider/web_search.d.ts.map +1 -0
  112. package/dist/modules/tools/provider/web_search.js +104 -0
  113. package/dist/modules/tools/provider/web_search.js.map +1 -0
  114. package/dist/modules/tools/provider/write_file.d.ts +3 -0
  115. package/dist/modules/tools/provider/write_file.d.ts.map +1 -0
  116. package/dist/modules/tools/provider/write_file.js +63 -0
  117. package/dist/modules/tools/provider/write_file.js.map +1 -0
  118. package/dist/web/web.service.d.ts +2 -0
  119. package/dist/web/web.service.d.ts.map +1 -1
  120. package/dist/web/web.service.js +57 -8
  121. package/dist/web/web.service.js.map +1 -1
  122. package/package.json +5 -3
  123. package/web/dist/assets/AiLogsView-DWqwdXrD.js +1 -0
  124. package/web/dist/assets/Layout-CoiSqTWB.js +1 -0
  125. package/web/dist/assets/{index-CEHMSOel.js → index-B-R-RCGS.js} +65 -65
  126. package/web/dist/assets/{index-BnpKQafm.css → index-BGmGnKjT.css} +1 -1
  127. package/web/dist/index.html +2 -2
  128. package/web/dist/assets/Layout-Pvn6DBHZ.js +0 -1
@@ -0,0 +1,241 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>AI 服务商 & 模型配置</title>
7
+ <style>
8
+ * { margin: 0; padding: 0; box-sizing: border-box; }
9
+ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #f5f5f5; padding: 20px; }
10
+ .container { max-width: 900px; margin: 0 auto; }
11
+ h1 { font-size: 20px; font-weight: 600; margin-bottom: 20px; color: #333; }
12
+
13
+ .card { background: #fff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); margin-bottom: 16px; }
14
+ .card-header { padding: 16px; border-bottom: 1px solid #eee; display: flex; justify-content: space-between; align-items: center; }
15
+ .card-header h2 { font-size: 16px; font-weight: 600; }
16
+ .card-body { padding: 16px; }
17
+
18
+ .provider-item { border: 1px solid #e5e5e5; border-radius: 6px; margin-bottom: 12px; overflow: hidden; }
19
+ .provider-main { display: flex; align-items: center; padding: 12px; cursor: pointer; transition: background 0.2s; }
20
+ .provider-main:hover { background: #fafafa; }
21
+ .provider-main.active { background: #f0f7ff; border-bottom: 1px solid #e5e5e5; }
22
+ .expand-icon { width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; transition: transform 0.2s; margin-right: 8px; }
23
+ .expand-icon.expanded { transform: rotate(90deg); }
24
+ .provider-logo { width: 40px; height: 40px; background: #eee; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 14px; margin-right: 12px; }
25
+ .provider-info { flex: 1; }
26
+ .provider-name { font-weight: 600; font-size: 14px; }
27
+ .provider-desc { font-size: 12px; color: #999; margin-top: 2px; }
28
+ .provider-actions { display: flex; gap: 8px; }
29
+
30
+ .models-panel { display: none; padding: 16px; background: #fafafa; }
31
+ .models-panel.expanded { display: block; }
32
+ .models-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }
33
+ .models-header h3 { font-size: 14px; color: #666; }
34
+
35
+ .model-item { display: flex; align-items: center; padding: 10px 12px; background: #fff; border: 1px solid #e5e5e5; border-radius: 6px; margin-bottom: 8px; }
36
+ .model-item:hover { border-color: #1890ff; }
37
+ .model-name { flex: 1; font-size: 14px; }
38
+ .model-status { font-size: 12px; color: #52c41a; margin-right: 12px; }
39
+ .model-actions { display: flex; gap: 6px; }
40
+
41
+ .btn { padding: 6px 12px; border-radius: 4px; font-size: 12px; cursor: pointer; border: 1px solid #d9d9d9; background: #fff; transition: all 0.2s; }
42
+ .btn:hover { border-color: #1890ff; color: #1890ff; }
43
+ .btn-primary { background: #1890ff; color: #fff; border: none; }
44
+ .btn-primary:hover { background: #40a9ff; }
45
+ .btn-danger { color: #ff4d4f; border-color: #ff4d4f; }
46
+ .btn-danger:hover { background: #fff1f0; }
47
+ .btn-sm { padding: 4px 8px; font-size: 11px; }
48
+ </style>
49
+ </head>
50
+ <body>
51
+ <div class="container">
52
+ <h1>AI 服务商 & 模型配置</h1>
53
+
54
+ <div class="card">
55
+ <div class="card-header">
56
+ <h2>服务商列表</h2>
57
+ <button class="btn btn-primary">+ 添加服务商</button>
58
+ </div>
59
+ <div class="card-body">
60
+
61
+ <div class="provider-item">
62
+ <div class="provider-main" onclick="toggleModels(this)">
63
+ <span class="expand-icon">▶</span>
64
+ <div class="provider-logo" style="background:#412dea;color:#fff;">O</div>
65
+ <div class="provider-info">
66
+ <div class="provider-name">OpenAI</div>
67
+ <div class="provider-desc">GPT-4、GPT-3.5 等模型</div>
68
+ </div>
69
+ <div class="provider-actions">
70
+ <button class="btn btn-sm">修改</button>
71
+ <button class="btn btn-sm btn-danger">删除</button>
72
+ </div>
73
+ </div>
74
+ <div class="models-panel">
75
+ <div class="models-header">
76
+ <h3>模型列表</h3>
77
+ <button class="btn btn-sm btn-primary">+ 添加模型</button>
78
+ </div>
79
+ <div class="model-item">
80
+ <div class="model-name">gpt-4o</div>
81
+ <span class="model-status">● 默认</span>
82
+ <div class="model-actions">
83
+ <button class="btn btn-sm">修改</button>
84
+ <button class="btn btn-sm btn-danger">删除</button>
85
+ </div>
86
+ </div>
87
+ <div class="model-item">
88
+ <div class="model-name">gpt-4-turbo</div>
89
+ <div class="model-actions">
90
+ <button class="btn btn-sm">修改</button>
91
+ <button class="btn btn-sm btn-danger">删除</button>
92
+ </div>
93
+ </div>
94
+ <div class="model-item">
95
+ <div class="model-name">gpt-4</div>
96
+ <div class="model-actions">
97
+ <button class="btn btn-sm">修改</button>
98
+ <button class="btn btn-sm btn-danger">删除</button>
99
+ </div>
100
+ </div>
101
+ <div class="model-item">
102
+ <div class="model-name">gpt-3.5-turbo</div>
103
+ <div class="model-actions">
104
+ <button class="btn btn-sm">修改</button>
105
+ <button class="btn btn-sm btn-danger">删除</button>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+
111
+ <div class="provider-item">
112
+ <div class="provider-main" onclick="toggleModels(this)">
113
+ <span class="expand-icon">▶</span>
114
+ <div class="provider-logo" style="background:#25b864;color:#fff;">A</div>
115
+ <div class="provider-info">
116
+ <div class="provider-name">Anthropic Claude</div>
117
+ <div class="provider-desc">Claude 3.5、Claude 3 等模型</div>
118
+ </div>
119
+ <div class="provider-actions">
120
+ <button class="btn btn-sm">修改</button>
121
+ <button class="btn btn-sm btn-danger">删除</button>
122
+ </div>
123
+ </div>
124
+ <div class="models-panel">
125
+ <div class="models-header">
126
+ <h3>模型列表</h3>
127
+ <button class="btn btn-sm btn-primary">+ 添加模型</button>
128
+ </div>
129
+ <div class="model-item">
130
+ <div class="model-name">claude-3-5-sonnet-20241022</div>
131
+ <span class="model-status">● 默认</span>
132
+ <div class="model-actions">
133
+ <button class="btn btn-sm">修改</button>
134
+ <button class="btn btn-sm btn-danger">删除</button>
135
+ </div>
136
+ </div>
137
+ <div class="model-item">
138
+ <div class="model-name">claude-3-opus-20240229</div>
139
+ <div class="model-actions">
140
+ <button class="btn btn-sm">修改</button>
141
+ <button class="btn btn-sm btn-danger">删除</button>
142
+ </div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+
147
+ <div class="provider-item">
148
+ <div class="provider-main" onclick="toggleModels(this)">
149
+ <span class="expand-icon">▶</span>
150
+ <div class="provider-logo" style="background:#1abcab;color:#fff;">G</div>
151
+ <div class="provider-info">
152
+ <div class="provider-name">Google Gemini</div>
153
+ <div class="provider-desc">Gemini Pro、Flash 等模型</div>
154
+ </div>
155
+ <div class="provider-actions">
156
+ <button class="btn btn-sm">修改</button>
157
+ <button class="btn btn-sm btn-danger">删除</button>
158
+ </div>
159
+ </div>
160
+ <div class="models-panel">
161
+ <div class="models-header">
162
+ <h3>模型列表</h3>
163
+ <button class="btn btn-sm btn-primary">+ 添加模型</button>
164
+ </div>
165
+ <div class="model-item">
166
+ <div class="model-name">gemini-2.0-flash-exp</div>
167
+ <span class="model-status">● 默认</span>
168
+ <div class="model-actions">
169
+ <button class="btn btn-sm">修改</button>
170
+ <button class="btn btn-sm btn-danger">删除</button>
171
+ </div>
172
+ </div>
173
+ <div class="model-item">
174
+ <div class="model-name">gemini-1.5-pro</div>
175
+ <div class="model-actions">
176
+ <button class="btn btn-sm">修改</button>
177
+ <button class="btn btn-sm btn-danger">删除</button>
178
+ </div>
179
+ </div>
180
+ <div class="model-item">
181
+ <div class="model-name">gemini-1.5-flash</div>
182
+ <div class="model-actions">
183
+ <button class="btn btn-sm">修改</button>
184
+ <button class="btn btn-sm btn-danger">删除</button>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+
190
+ <div class="provider-item">
191
+ <div class="provider-main" onclick="toggleModels(this)">
192
+ <span class="expand-icon">▶</span>
193
+ <div class="provider-logo" style="background:#fe7a1e;color:#fff;">D</div>
194
+ <div class="provider-info">
195
+ <div class="provider-name">DeepSeek</div>
196
+ <div class="provider-desc">DeepSeek V3、DeepSeek Coder</div>
197
+ </div>
198
+ <div class="provider-actions">
199
+ <button class="btn btn-sm">修改</button>
200
+ <button class="btn btn-sm btn-danger">删除</button>
201
+ </div>
202
+ </div>
203
+ <div class="models-panel">
204
+ <div class="models-header">
205
+ <h3>模型列表</h3>
206
+ <button class="btn btn-sm btn-primary">+ 添加模型</button>
207
+ </div>
208
+ <div class="model-item">
209
+ <div class="model-name">deepseek-chat</div>
210
+ <span class="model-status">● 默认</span>
211
+ <div class="model-actions">
212
+ <button class="btn btn-sm">修改</button>
213
+ <button class="btn btn-sm btn-danger">删除</button>
214
+ </div>
215
+ </div>
216
+ <div class="model-item">
217
+ <div class="model-name">deepseek-coder</div>
218
+ <div class="model-actions">
219
+ <button class="btn btn-sm">修改</button>
220
+ <button class="btn btn-sm btn-danger">删除</button>
221
+ </div>
222
+ </div>
223
+ </div>
224
+ </div>
225
+
226
+ </div>
227
+ </div>
228
+
229
+ </div>
230
+
231
+ <script>
232
+ function toggleModels(el) {
233
+ const panel = el.nextElementSibling;
234
+ const icon = el.querySelector('.expand-icon');
235
+ panel.classList.toggle('expanded');
236
+ icon.classList.toggle('expanded');
237
+ el.classList.toggle('active');
238
+ }
239
+ </script>
240
+ </body>
241
+ </html>
@@ -0,0 +1,2 @@
1
+ export declare const aiLogRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=ai-log.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-log.routes.d.ts","sourceRoot":"","sources":["../../src/api/ai-log.routes.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,4CAAW,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Router } from 'express';
2
+ import { aiLogService } from '../modules/ai/ai-log.service.js';
3
+ export const aiLogRouter = Router();
4
+ aiLogRouter.get('/logs', async (req, res) => {
5
+ const page = parseInt(req.query.page) || 1;
6
+ const pageSize = parseInt(req.query.pageSize) || 50;
7
+ try {
8
+ const result = aiLogService.getLogs(page, pageSize);
9
+ res.json({
10
+ success: true,
11
+ data: result,
12
+ });
13
+ }
14
+ catch (error) {
15
+ res.status(500).json({
16
+ success: false,
17
+ error: error instanceof Error ? error.message : 'Unknown error',
18
+ });
19
+ }
20
+ });
21
+ //# sourceMappingURL=ai-log.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-log.routes.js","sourceRoot":"","sources":["../../src/api/ai-log.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;AAEpC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAkB,CAAC,IAAI,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat.routes.d.ts","sourceRoot":"","sources":["../../src/api/chat.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAUH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,4CAAW,CAAC"}
1
+ {"version":3,"file":"chat.routes.d.ts","sourceRoot":"","sources":["../../src/api/chat.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAmBH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,4CAAW,CAAC"}
@@ -21,6 +21,15 @@ import { aiService } from '../modules/ai/index.js';
21
21
  import { sessionService } from '../modules/session/index.js';
22
22
  import { memoryService } from '../modules/memory/index.js';
23
23
  import { logger } from '../modules/logger/logger.js';
24
+ import { aiLogService } from '../modules/ai/ai-log.service.js';
25
+ import { configService } from '../modules/config/config.service.js';
26
+ function calculateCost(usage) {
27
+ if (!usage)
28
+ return 0;
29
+ const promptCost = (usage.promptTokens || 0) * 0.00015 / 1000;
30
+ const completionCost = (usage.completionTokens || 0) * 0.0006 / 1000;
31
+ return promptCost + completionCost;
32
+ }
24
33
  /**
25
34
  * 创建聊天路由 Router
26
35
  *
@@ -82,6 +91,8 @@ chatRouter.post('/', async (req, res) => {
82
91
  // ========== 步骤 3: 切换到当前会话 ==========
83
92
  // 设置当前会话为活跃状态,后续操作都基于此会话
84
93
  sessionService.switchTo(session.id);
94
+ // ========== 记录请求开始时间 ==========
95
+ const requestStartTime = Date.now();
85
96
  // ========== 步骤 4: 准备 ReAct 执行 ==========
86
97
  // 创建数组存储 ReAct 执行过程中的每一步
87
98
  // 用于返回给客户端,便于调试和展示思考过程
@@ -105,7 +116,7 @@ chatRouter.post('/', async (req, res) => {
105
116
  * - memoryService: 记忆服务
106
117
  * - onStep: 每一步执行完的回调 (用于收集步骤)
107
118
  */
108
- const result = await aiService.chatWithReAct(message, {
119
+ const result = await aiService.chatWithTools(message, {
109
120
  sessionId: session.id,
110
121
  projectPath: session.projectPath || undefined,
111
122
  memoryService,
@@ -127,6 +138,24 @@ chatRouter.post('/', async (req, res) => {
127
138
  });
128
139
  },
129
140
  });
141
+ // ========== 记录 AI 调用日志 ==========
142
+ const requestEndTime = Date.now();
143
+ const durationMs = requestEndTime - requestStartTime;
144
+ const providerConfig = configService.getDefaultProvider();
145
+ const models = providerConfig ? configService.getModels(providerConfig.id) : [];
146
+ const defaultModel = models.find(m => m.enabled) || { name: 'gpt-4' };
147
+ aiLogService.logAiCall({
148
+ model_address: providerConfig?.baseUrl || '',
149
+ model_name: defaultModel?.name || '',
150
+ request_time: new Date(requestStartTime),
151
+ response_time: new Date(requestEndTime),
152
+ duration_ms: durationMs,
153
+ input_tokens: result.usage?.promptTokens || 0,
154
+ output_tokens: result.usage?.completionTokens || 0,
155
+ cost: calculateCost(result.usage),
156
+ call_type: reactSteps.length > 0 ? 'tool_call' : 'normal',
157
+ session_id: session.id,
158
+ });
130
159
  // ========== 步骤 5: 返回响应 ==========
131
160
  const lastStep = result.steps[result.steps.length - 1];
132
161
  const lastThought = lastStep && 'thought' in lastStep ? lastStep.thought : undefined;
@@ -137,6 +166,11 @@ chatRouter.post('/', async (req, res) => {
137
166
  iterations: result.iterations,
138
167
  success: result.success,
139
168
  error: result.error,
169
+ usage: result.usage ? {
170
+ promptTokens: result.usage.promptTokens,
171
+ completionTokens: result.usage.completionTokens,
172
+ totalTokens: result.usage.totalTokens,
173
+ } : undefined,
140
174
  };
141
175
  // 记录响应日志
142
176
  logger.logResponse('/api/chat', responseData);
@@ -1 +1 @@
1
- {"version":3,"file":"chat.routes.js","sourceRoot":"","sources":["../../src/api/chat.routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat.routes.js","sourceRoot":"","sources":["../../src/api/chat.routes.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,27 @@ configRouter.get('/providers', (req, res) => {
26
26
  })),
27
27
  });
28
28
  });
29
+ /**
30
+ * 获取单个提供商(包含 API Key)
31
+ */
32
+ configRouter.get('/providers/:id', (req, res) => {
33
+ const id = String(req.params.id);
34
+ const provider = configService.getProvider(id);
35
+ if (!provider) {
36
+ return res.status(404).json({ success: false, error: 'Provider not found' });
37
+ }
38
+ res.json({
39
+ success: true,
40
+ data: {
41
+ id: provider.id,
42
+ name: provider.name,
43
+ apiKey: provider.apiKey,
44
+ baseUrl: provider.baseUrl,
45
+ enabled: provider.enabled,
46
+ isDefault: provider.isDefault,
47
+ },
48
+ });
49
+ });
29
50
  /**
30
51
  * 添加提供商
31
52
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.routes.js","sourceRoot":"","sources":["../../src/api/config.routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.routes.js","sourceRoot":"","sources":["../../src/api/config.routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,eAAO,MAAM,SAAS,4CAAW,CAAC;AAYlC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,eAAO,MAAM,SAAS,4CAAW,CAAC;AAalC,cAAc,gBAAgB,CAAC"}
package/dist/api/index.js CHANGED
@@ -11,6 +11,7 @@ import { projectsRouter } from './projects.routes.js';
11
11
  import { dbRouter } from './db.routes.js';
12
12
  import { filesRouter } from './files.routes.js';
13
13
  import { filesystemRouter } from './filesystem.routes.js';
14
+ import { aiLogRouter } from './ai-log.routes.js';
14
15
  export const apiRouter = Router();
15
16
  apiRouter.use('/chat', chatRouter);
16
17
  apiRouter.use('/sessions', sessionRouter);
@@ -21,5 +22,6 @@ apiRouter.use('/projects', projectsRouter);
21
22
  apiRouter.use('/db', dbRouter);
22
23
  apiRouter.use('/files', filesRouter);
23
24
  apiRouter.use('/filesystem', filesystemRouter);
25
+ apiRouter.use('/ai-logs', aiLogRouter);
24
26
  export * from './api.types.js';
25
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;AAElC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACnC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1C,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACjC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAC3C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACrC,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAE/C,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;AAElC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACnC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1C,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACjC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAC3C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACrC,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAC/C,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAEvC,cAAc,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAsBhE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,GAAG,sBA8tBlB"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAuBhE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,GAAG,sBAyxBlB"}
@@ -21,6 +21,7 @@ import { executeCommand } from '../cli/commands.js';
21
21
  import { sessionService } from '../modules/session/index.js';
22
22
  import { memoryService } from '../modules/memory/index.js';
23
23
  import { aiService } from '../modules/ai/index.js';
24
+ import { dbService } from '../modules/db/index.js';
24
25
  /**
25
26
  * App 主组件函数
26
27
  *
@@ -50,7 +51,7 @@ export function App() {
50
51
  // ========== 消息相关状态 ==========
51
52
  /** 聊天消息列表 */
52
53
  const [messages, setMessages] = useState([]);
53
- /** 当前状态:idle(空闲) 或 thinking(AI 思考中) */
54
+ /** 当前状态:idle(空闲) 或 thinking(AI 思考中) 或 stopping(正在停止) */
54
55
  const [status, setStatus] = useState('idle');
55
56
  /** 当前会话 ID */
56
57
  const [currentSession, setCurrentSession] = useState(null);
@@ -90,6 +91,39 @@ export function App() {
90
91
  const [inputHistory, setInputHistory] = useState([]);
91
92
  /** 当前历史记录索引 */
92
93
  const [historyIndex, setHistoryIndex] = useState(-1);
94
+ // ========== 动画相关状态 ==========
95
+ /** 三点动画字符 */
96
+ const [dotAnimation, setDotAnimation] = useState('');
97
+ // ========== AI 停止控制 ==========
98
+ /** AbortController 用于停止 AI 调用 */
99
+ const abortControllerRef = React.useRef(null);
100
+ // ========== 程序退出时保存数据库 ==========
101
+ useEffect(() => {
102
+ const handleExit = () => {
103
+ dbService.close();
104
+ };
105
+ process.on('exit', handleExit);
106
+ process.on('SIGINT', handleExit);
107
+ return () => {
108
+ process.off('exit', handleExit);
109
+ process.off('SIGINT', handleExit);
110
+ };
111
+ }, []);
112
+ // ========== 三点动画效果 ==========
113
+ useEffect(() => {
114
+ if (status === 'thinking') {
115
+ const dots = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧'];
116
+ let i = 0;
117
+ const interval = setInterval(() => {
118
+ setDotAnimation(dots[i % dots.length]);
119
+ i++;
120
+ }, 150);
121
+ return () => clearInterval(interval);
122
+ }
123
+ else {
124
+ setDotAnimation('');
125
+ }
126
+ }, [status]);
93
127
  // ========== 辅助函数 ==========
94
128
  /**
95
129
  * 加载目录内容 - 用于文件选择器
@@ -263,6 +297,7 @@ export function App() {
263
297
  addMessage('system', result.message);
264
298
  }
265
299
  if (result.data?.exit) {
300
+ dbService.close();
266
301
  exit();
267
302
  }
268
303
  if (result.data?.id && result.success) {
@@ -279,10 +314,12 @@ export function App() {
279
314
  sessionService.switchTo(sessionId);
280
315
  }
281
316
  setStatus('thinking');
317
+ abortControllerRef.current = new AbortController();
282
318
  try {
283
- const result = await aiService.chatWithReAct(trimmedInput, {
319
+ const result = await aiService.chatWithTools(trimmedInput, {
284
320
  sessionId: sessionId,
285
321
  memoryService,
322
+ abortSignal: abortControllerRef.current.signal,
286
323
  onStep: (state, iteration) => {
287
324
  if (state.thought) {
288
325
  const thoughtPreview = state.thought.length > 150
@@ -405,11 +442,11 @@ export function App() {
405
442
  memoryService.addMessage(sessionId, 'assistant', result.answer, true);
406
443
  }
407
444
  if (result.usage) {
408
- setTokenStats(prev => ({
409
- promptTokens: prev.promptTokens + result.usage.promptTokens,
410
- completionTokens: prev.completionTokens + result.usage.completionTokens,
411
- totalTokens: prev.totalTokens + result.usage.totalTokens,
412
- }));
445
+ setTokenStats({
446
+ promptTokens: result.usage.promptTokens,
447
+ completionTokens: result.usage.completionTokens,
448
+ totalTokens: result.usage.totalTokens,
449
+ });
413
450
  }
414
451
  if (sessionId) {
415
452
  const stats = memoryService.getSessionStats(sessionId);
@@ -421,10 +458,16 @@ export function App() {
421
458
  }
422
459
  catch (err) {
423
460
  const errorMsg = err instanceof Error ? err.message : 'Unknown error';
424
- setError(errorMsg);
425
- addMessage('system', `错误: ${errorMsg}`);
461
+ if (errorMsg === 'ABORTED') {
462
+ addMessage('system', '已停止');
463
+ }
464
+ else {
465
+ setError(errorMsg);
466
+ addMessage('system', `错误: ${errorMsg}`);
467
+ }
426
468
  }
427
469
  finally {
470
+ abortControllerRef.current = null;
428
471
  setStatus('idle');
429
472
  }
430
473
  }, [input, status, currentSession, addMessage, exit]);
@@ -566,7 +609,14 @@ export function App() {
566
609
  }
567
610
  }
568
611
  else if (key.escape) {
569
- exit();
612
+ if (status === 'thinking' && abortControllerRef.current) {
613
+ setStatus('stopping');
614
+ abortControllerRef.current.abort();
615
+ }
616
+ else if (status === 'idle') {
617
+ dbService.close();
618
+ exit();
619
+ }
570
620
  }
571
621
  else if (char && !key.ctrl && !key.meta) {
572
622
  const newInput = input.slice(0, cursorPosition) + char + input.slice(cursorPosition);
@@ -644,12 +694,15 @@ export function App() {
644
694
  React.createElement(Text, { bold: true, color: "cyan" }, "\u25A3 Build"),
645
695
  React.createElement(Text, { dimColor: true },
646
696
  " \u00B7 ",
647
- currentModelName)))),
697
+ currentModelName),
698
+ React.createElement(Text, { dimColor: true }, " \u00B7 \u6309 ESC \u505C\u6B62..."))),
699
+ status === 'stopping' && (React.createElement(Box, { marginBottom: 1, paddingLeft: 2 },
700
+ React.createElement(Text, { bold: true, color: "yellow" }, "\u25A0 \u6B63\u5728\u505C\u6B62...")))),
648
701
  React.createElement(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, marginBottom: 1 },
649
702
  React.createElement(Text, { dimColor: true }, '> '),
650
- React.createElement(Text, null, input.slice(0, cursorPosition)),
703
+ React.createElement(Text, null, status === 'stopping' ? '等待停止...' : input.slice(0, cursorPosition)),
651
704
  React.createElement(Text, { color: "cyan" }, "\u258B"),
652
- React.createElement(Text, null, input.slice(cursorPosition))),
705
+ React.createElement(Text, null, status === 'stopping' ? '' : input.slice(cursorPosition))),
653
706
  fileSelectMode && (React.createElement(Box, { flexDirection: "column", marginBottom: 1, paddingX: 1 },
654
707
  React.createElement(Text, { dimColor: true },
655
708
  currentDir || '/',
@@ -664,12 +717,11 @@ export function App() {
664
717
  modelList.length === 0 && (React.createElement(Text, { dimColor: true }, "\u672A\u627E\u5230\u6A21\u578B...")))),
665
718
  React.createElement(Box, { paddingX: 2 },
666
719
  React.createElement(Text, { dimColor: true },
667
- "\u5C31\u7EEA | \u6A21\u578B: ",
668
- currentModelName,
669
- tokenStats.totalTokens > 0 && ` | Token: ${tokenStats.totalTokens}`,
670
- compressionPercent > 0 && ` | 压缩: ${compressionPercent}%`,
671
- ` | 会话: ${sessionText}`,
672
- ' | /help 帮助 | ESC 退出')),
720
+ status === 'thinking' ? `${dotAnimation} 思考中` : '✓ 就绪',
721
+ ` | 模型:${currentModelName}`,
722
+ ` | 会话:${sessionText}`,
723
+ ` | token:(${tokenStats.promptTokens}${tokenStats.promptTokens > 50000 ? ' 会话太大推荐用/compact压缩会话' : ''})`,
724
+ ` | 帮助 /help | 退出 ctrl+c`)),
673
725
  error && (React.createElement(Box, { marginTop: 1 },
674
726
  React.createElement(Text, { color: "red" },
675
727
  "\u9519\u8BEF: ",