@templmf/temp-solf-lmf 0.0.55 → 0.0.57

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 (89) hide show
  1. package/fe-flow.md +348 -0
  2. package/package.json +1 -1
  3. package/ui-parse.md +308 -0
  4. package//345/242/236/351/207/217/351/234/200/346/261/202prompt +72 -0
  5. package/guanwang/README.md +0 -95
  6. package/guanwang/docs/changelog.md +0 -145
  7. package/guanwang/docs/doc-maintenance.md +0 -229
  8. package/guanwang/docs/product.md +0 -181
  9. package/guanwang/docs/test-cases.md +0 -395
  10. package/guanwang/docs/usage.md +0 -291
  11. package/guanwang/env.example +0 -27
  12. package/guanwang/index.html +0 -13
  13. package/guanwang/package-lock.json +0 -3825
  14. package/guanwang/package.json +0 -32
  15. package/guanwang/public/favicon.svg +0 -4
  16. package/guanwang/public/react-runtime/babel.min.js +0 -4
  17. package/guanwang/public/react-runtime/react-dom.min.js +0 -267
  18. package/guanwang/public/react-runtime/react.min.js +0 -31
  19. package/guanwang/public/vue-repl-assets/compiler-sfc.esm-browser.js +0 -50795
  20. package/guanwang/public/vue-repl-assets/runtime-dom.esm-browser.js +0 -12758
  21. package/guanwang/public/vue-repl-assets/server-renderer.esm-browser.js +0 -8600
  22. package/guanwang/public/vue-repl-assets/vue.esm-browser.js +0 -18672
  23. package/guanwang/src/App.vue +0 -61
  24. package/guanwang/src/chat-sdk/core/components/ChatBox.vue +0 -305
  25. package/guanwang/src/chat-sdk/core/components/ChatSidebar.vue +0 -84
  26. package/guanwang/src/chat-sdk/core/components/InputBar.vue +0 -354
  27. package/guanwang/src/chat-sdk/core/components/MessageBubble.vue +0 -703
  28. package/guanwang/src/chat-sdk/core/useTheme.js +0 -31
  29. package/guanwang/src/chat-sdk/features/artifact/ArtifactCard.vue +0 -172
  30. package/guanwang/src/chat-sdk/features/artifact/ArtifactPanel.vue +0 -963
  31. package/guanwang/src/chat-sdk/features/artifact/index.js +0 -13
  32. package/guanwang/src/chat-sdk/features/artifact/useArtifactStore.js +0 -275
  33. package/guanwang/src/chat-sdk/features/codepreview/CodePreview.vue +0 -523
  34. package/guanwang/src/chat-sdk/features/codepreview/index.js +0 -7
  35. package/guanwang/src/chat-sdk/features/markdown/index.js +0 -13
  36. package/guanwang/src/chat-sdk/features/markdown/useMarkdown.js +0 -724
  37. package/guanwang/src/chat-sdk/features/mermaid/MermaidZoom.vue +0 -254
  38. package/guanwang/src/chat-sdk/features/upload/FileAttachment.vue +0 -142
  39. package/guanwang/src/chat-sdk/features/upload/index.js +0 -17
  40. package/guanwang/src/chat-sdk/features/upload/useFileHandler.js +0 -336
  41. package/guanwang/src/chat-sdk/headless/api/adapters/openai.js +0 -76
  42. package/guanwang/src/chat-sdk/headless/api/chatApi.js +0 -126
  43. package/guanwang/src/chat-sdk/headless/buildSystemPrompt.js +0 -351
  44. package/guanwang/src/chat-sdk/headless/index.js +0 -15
  45. package/guanwang/src/chat-sdk/headless/useChat.js +0 -77
  46. package/guanwang/src/chat-sdk/headless/useChatDB.js +0 -147
  47. package/guanwang/src/chat-sdk/headless/useChatStore.js +0 -529
  48. package/guanwang/src/chat-sdk/index.js +0 -79
  49. package/guanwang/src/chat-sdk/modes/architect.js +0 -27
  50. package/guanwang/src/chat-sdk/modes/ask.js +0 -26
  51. package/guanwang/src/chat-sdk/modes/code.js +0 -25
  52. package/guanwang/src/chat-sdk/modes/index.js +0 -36
  53. package/guanwang/src/chat-sdk/modes/requirements.js +0 -175
  54. package/guanwang/src/chat-sdk/settings/SettingsPanel.vue +0 -170
  55. package/guanwang/src/chat-sdk/settings/index.js +0 -9
  56. package/guanwang/src/chat-sdk/settings/useSettings.js +0 -122
  57. package/guanwang/src/chat-sdk/tools/defaults.js +0 -89
  58. package/guanwang/src/chat-sdk/tools/index.js +0 -16
  59. package/guanwang/src/chat-sdk/tools/parser.js +0 -116
  60. package/guanwang/src/components/CustomCursor.vue +0 -69
  61. package/guanwang/src/components/Footer.vue +0 -24
  62. package/guanwang/src/components/LoginModal.vue +0 -109
  63. package/guanwang/src/components/Navbar.vue +0 -193
  64. package/guanwang/src/components/ThemeToggle.vue +0 -25
  65. package/guanwang/src/composables/useArtifactStore.js +0 -253
  66. package/guanwang/src/composables/useAuth.js +0 -88
  67. package/guanwang/src/composables/useChatDB.js +0 -147
  68. package/guanwang/src/composables/useCountUp.js +0 -24
  69. package/guanwang/src/composables/useFileHandler.js +0 -345
  70. package/guanwang/src/composables/useTheme.js +0 -31
  71. package/guanwang/src/config/api.js +0 -71
  72. package/guanwang/src/main.js +0 -23
  73. package/guanwang/src/router/index.js +0 -23
  74. package/guanwang/src/services/authApi.js +0 -27
  75. package/guanwang/src/services/chatApi.js +0 -66
  76. package/guanwang/src/styles/global.css +0 -478
  77. package/guanwang/src/tracker/analyze.js +0 -73
  78. package/guanwang/src/tracker/config.js +0 -82
  79. package/guanwang/src/tracker/index.js +0 -18
  80. package/guanwang/src/tracker/service.js +0 -102
  81. package/guanwang/src/tracker/useChatTracker.js +0 -179
  82. package/guanwang/src/tracker/useTracker.js +0 -45
  83. package/guanwang/src/views/ChatView.vue +0 -65
  84. package/guanwang/src/views/HomeView.vue +0 -156
  85. package/guanwang/src/views/MarketView.vue +0 -143
  86. package/guanwang/src/views/PracticesView.vue +0 -190
  87. package/guanwang/src/views/SkillsView.vue +0 -129
  88. package/guanwang/temp +0 -19
  89. package/guanwang/vite.config.js +0 -6
@@ -1,478 +0,0 @@
1
- ul,li {
2
- list-style: none;
3
- }
4
- /* ── Dark theme (default) ── */
5
- :root {
6
- --bg-primary: #0D1117;
7
- --bg-secondary: #161C25;
8
- --bg-tertiary: #1E2A3A;
9
- --bg-card: rgba(22, 28, 37, 0.7);
10
- --bg-card-hover: rgba(30, 42, 58, 0.85);
11
- --bg-input: rgba(13, 17, 23, 0.8);
12
- --border-subtle: rgba(255, 255, 255, 0.07);
13
- --border-default: rgba(255, 255, 255, 0.12);
14
- --text-primary: #e2e8f0;
15
- --text-secondary: #94a3b8;
16
- --text-muted: #64748b;
17
- --text-faint: #334155;
18
- --brand: #1A6FC4;
19
- --brand-glow: rgba(26, 111, 196, 0.25);
20
- --brand-400: #5a9ee8;
21
- --brand-500: #1A6FC4;
22
- --brand-600: #155fa8;
23
- --glass-bg: rgba(22, 28, 37, 0.7);
24
- --dot-color: rgba(255, 255, 255, 0.04);
25
- --scrollbar-track: #0D1117;
26
- --scrollbar-thumb: #1E2A3A;
27
- --code-bg: rgba(0, 0, 0, 0.4);
28
- --code-color: #7dd3fc;
29
- --msg-ai-bg: #1E2A3A;
30
- --msg-ai-color: #cbd5e1;
31
- --nav-mobile-bg: rgba(22, 28, 37, 0.97);
32
- --tag-bg: rgba(26, 111, 196, 0.15);
33
- --tag-color: #5a9ee8;
34
- --tag-border: rgba(26, 111, 196, 0.25);
35
- --sidebar-bg: #111820;
36
- }
37
-
38
- /* ── Light theme ── */
39
- [data-theme='light'] {
40
- --bg-primary: #f8fafc;
41
- --bg-secondary: #f1f5f9;
42
- --bg-tertiary: #e2e8f0;
43
- --bg-card: rgba(255, 255, 255, 0.85);
44
- --bg-card-hover: rgba(255, 255, 255, 0.98);
45
- --bg-input: rgba(255, 255, 255, 0.95);
46
- --border-subtle: rgba(0, 0, 0, 0.07);
47
- --border-default: rgba(0, 0, 0, 0.13);
48
- --text-primary: #0f172a;
49
- --text-secondary: #475569;
50
- --text-muted: #64748b;
51
- --text-faint: #94a3b8;
52
- --brand: #1A6FC4;
53
- --brand-glow: rgba(26, 111, 196, 0.2);
54
- --brand-400: #1A6FC4;
55
- --brand-500: #1A6FC4;
56
- --brand-600: #155fa8;
57
- --glass-bg: rgba(255, 255, 255, 0.8);
58
- --dot-color: rgba(0, 0, 0, 0.035);
59
- --scrollbar-track: #f1f5f9;
60
- --scrollbar-thumb: #cbd5e1;
61
- --code-bg: #f1f5f9;
62
- --code-color: #0369a1;
63
- --msg-ai-bg: #f1f5f9;
64
- --msg-ai-color: #1e293b;
65
- --nav-mobile-bg: rgba(248, 250, 252, 0.98);
66
- --tag-bg: rgba(26, 111, 196, 0.08);
67
- --tag-color: #1A6FC4;
68
- --tag-border: rgba(26, 111, 196, 0.2);
69
- --sidebar-bg: #f1f5f9;
70
- }
71
-
72
- /* ── Base reset ── */
73
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; text-decoration: none;}
74
-
75
- html { scroll-behavior: smooth; }
76
-
77
- body {
78
- font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
79
- background: var(--bg-primary);
80
- color: var(--text-primary);
81
- min-height: 100vh;
82
- -webkit-font-smoothing: antialiased;
83
- transition: background 0.3s ease, color 0.3s ease;
84
- }
85
-
86
- ::-webkit-scrollbar { width: 6px; }
87
- ::-webkit-scrollbar-track { background: var(--scrollbar-track); }
88
- ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: 3px; }
89
- ::-webkit-scrollbar-thumb:hover { background: var(--brand); }
90
-
91
- /* ── Typography ── */
92
- .font-display { font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; }
93
- .font-mono { font-family: 'Cascadia Code', 'Consolas', monospace; }
94
-
95
- .gradient-text {
96
- background: linear-gradient(135deg, var(--text-primary) 30%, #5a9ee8);
97
- -webkit-background-clip: text;
98
- -webkit-text-fill-color: transparent;
99
- background-clip: text;
100
- }
101
- [data-theme='light'] .gradient-text {
102
- background: linear-gradient(135deg, #0f172a 20%, #1A6FC4);
103
- -webkit-background-clip: text;
104
- background-clip: text;
105
- }
106
-
107
- .section-title {
108
- font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
109
- font-weight: 700;
110
- color: var(--text-primary);
111
- font-size: clamp(1.75rem, 3vw, 2.5rem);
112
- }
113
-
114
- /* ── Layout helpers ── */
115
- .dot-grid {
116
- background-image: radial-gradient(circle, var(--dot-color) 1px, transparent 1px);
117
- background-size: 28px 28px;
118
- }
119
-
120
- .glow-orb {
121
- position: absolute;
122
- border-radius: 50%;
123
- filter: blur(80px);
124
- pointer-events: none;
125
- }
126
- [data-theme='light'] .glow-orb { opacity: 0.4; }
127
-
128
- /* ── Glass effect ── */
129
- .glass {
130
- background: var(--glass-bg);
131
- backdrop-filter: blur(12px);
132
- -webkit-backdrop-filter: blur(12px);
133
- border: 1px solid var(--border-subtle);
134
- transition: background 0.3s, border-color 0.3s;
135
- }
136
-
137
- /* ── Card ── */
138
- .card {
139
- background: var(--bg-card);
140
- backdrop-filter: blur(12px);
141
- border: 1px solid var(--border-subtle);
142
- border-radius: 12px;
143
- padding: 20px;
144
- cursor: pointer;
145
- transition: background 0.2s, border-color 0.2s, box-shadow 0.2s, transform 0.2s;
146
- }
147
- .card:hover {
148
- background: var(--bg-card-hover);
149
- border-color: var(--border-default);
150
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(26, 111, 196, 0.1);
151
- transform: translateY(-2px);
152
- }
153
-
154
- /* ── Buttons ── */
155
- .btn-primary {
156
- display: inline-flex;
157
- align-items: center;
158
- justify-content: center;
159
- background: var(--brand-500);
160
- color: white;
161
- font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
162
- font-weight: 600;
163
- padding: 10px 20px;
164
- border-radius: 8px;
165
- border: none;
166
- cursor: pointer;
167
- font-size: 14px;
168
- transition: all 0.15s;
169
- text-decoration: none;
170
- gap: 6px;
171
- }
172
- .btn-primary:hover { background: var(--brand-600); box-shadow: 0 0 20px var(--brand-glow); transform: translateY(-1px); }
173
- .btn-primary:active { transform: scale(0.97); }
174
- .btn-primary:disabled { opacity: 0.4; cursor: not-allowed; transform: none; box-shadow: none; }
175
-
176
- .btn-ghost {
177
- display: inline-flex;
178
- align-items: center;
179
- justify-content: center;
180
- color: var(--text-secondary);
181
- background: transparent;
182
- padding: 8px 16px;
183
- border-radius: 8px;
184
- border: none;
185
- cursor: pointer;
186
- font-size: 14px;
187
- transition: all 0.15s;
188
- font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
189
- gap: 6px;
190
- }
191
- .btn-ghost:hover { color: var(--text-primary); background: var(--border-subtle); }
192
-
193
- /* ── Tag / Badge ── */
194
- .tag {
195
- display: inline-flex;
196
- align-items: center;
197
- font-size: 11px;
198
- padding: 3px 10px;
199
- border-radius: 999px;
200
- font-family: 'Cascadia Code', 'Consolas', monospace;
201
- background: var(--tag-bg);
202
- color: var(--tag-color);
203
- border: 1px solid var(--tag-border);
204
- }
205
-
206
- /* ── Code block ── */
207
- .code-block {
208
- font-family: 'Cascadia Code', 'Consolas', monospace;
209
- font-size: 12px;
210
- border-radius: 8px;
211
- padding: 12px 16px;
212
- background: var(--code-bg);
213
- border: 1px solid var(--border-subtle);
214
- color: var(--code-color);
215
- overflow-x: auto;
216
- }
217
- .code-block pre { margin: 0; white-space: pre-wrap; word-break: break-word; }
218
-
219
- /* ── Nav active indicator ── */
220
- .nav-active { color: var(--text-primary) !important; position: relative; }
221
- .nav-active::after {
222
- content: '';
223
- position: absolute;
224
- bottom: -2px;
225
- left: 0;
226
- right: 0;
227
- height: 2px;
228
- background: var(--brand);
229
- border-radius: 1px;
230
- }
231
-
232
- /* ── Theme toggle ── */
233
- .theme-track {
234
- width: 44px;
235
- height: 24px;
236
- border-radius: 12px;
237
- border: none;
238
- cursor: pointer;
239
- position: relative;
240
- display: flex;
241
- align-items: center;
242
- padding: 3px;
243
- transition: background 0.3s;
244
- flex-shrink: 0;
245
- }
246
- .theme-knob {
247
- width: 18px;
248
- height: 18px;
249
- border-radius: 50%;
250
- background: white;
251
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
252
- transition: transform 0.3s;
253
- display: flex;
254
- align-items: center;
255
- justify-content: center;
256
- font-size: 10px;
257
- }
258
-
259
- /* ── Chat sidebar ── */
260
- .chat-sidebar-bg {
261
- background: var(--sidebar-bg);
262
- border-right: 1px solid var(--border-subtle);
263
- transition: background 0.3s, border-color 0.3s;
264
- }
265
- .chat-history-item {
266
- padding: 9px 12px;
267
- border-radius: 8px;
268
- cursor: pointer;
269
- font-size: 13px;
270
- color: var(--text-secondary);
271
- font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
272
- white-space: nowrap;
273
- overflow: hidden;
274
- text-overflow: ellipsis;
275
- transition: background 0.15s, color 0.15s;
276
- }
277
- .chat-history-item:hover { background: var(--border-subtle); color: var(--text-primary); }
278
- .chat-history-item.active { background: var(--tag-bg); color: var(--brand-500); font-weight: 500; }
279
-
280
- /* ── Modal ── */
281
- .modal-backdrop {
282
- position: fixed;
283
- inset: 0;
284
- background: rgba(0, 0, 0, 0.5);
285
- backdrop-filter: blur(4px);
286
- z-index: 50;
287
- display: flex;
288
- align-items: center;
289
- justify-content: center;
290
- padding: 24px;
291
- animation: fadeUp 0.2s ease;
292
- }
293
-
294
- /* ── Animations ── */
295
- @keyframes fadeUp {
296
- from { opacity: 0; transform: translateY(16px); }
297
- to { opacity: 1; transform: translateY(0); }
298
- }
299
- @keyframes pulseSlow {
300
- 0%, 100% { opacity: 1; }
301
- 50% { opacity: 0.4; }
302
- }
303
- @keyframes blink {
304
- 0%, 100% { opacity: 1; }
305
- 50% { opacity: 0; }
306
- }
307
- @keyframes spin { to { transform: rotate(360deg); } }
308
- @keyframes slideDown {
309
- from { opacity: 0; transform: translateY(-8px); }
310
- to { opacity: 1; transform: translateY(0); }
311
- }
312
-
313
- .animate-fade-up { animation: fadeUp 0.5s ease forwards; opacity: 0; }
314
- .stagger-1 { animation-delay: 0.1s; }
315
- .stagger-2 { animation-delay: 0.2s; }
316
- .stagger-3 { animation-delay: 0.3s; }
317
- .animate-pulse-slow { animation: pulseSlow 2s ease infinite; }
318
- .animate-blink { animation: blink 1s step-end infinite; }
319
- .animate-spin { animation: spin 0.8s linear infinite; }
320
- .slide-down-enter { animation: slideDown 0.2s ease; }
321
-
322
- /* ── Element Plus 主题覆盖(与项目主题色对齐)────────────────── */
323
- :root {
324
- --el-color-primary: #1A6FC4;
325
- --el-color-primary-light-3: #4a96db;
326
- --el-color-primary-light-5: #7ab5e8;
327
- --el-color-primary-light-7: #aad0f2;
328
- --el-color-primary-light-8: #c5dff6;
329
- --el-color-primary-light-9: #deeefb;
330
- --el-color-primary-dark-2: #155fa8;
331
-
332
- /* 让 EP 组件背景/边框/文字接入项目 CSS 变量 */
333
- --el-bg-color: var(--bg-primary);
334
- --el-bg-color-overlay: var(--bg-secondary);
335
- --el-border-color: var(--border-default);
336
- --el-border-color-light: var(--border-subtle);
337
- --el-text-color-primary: var(--text-primary);
338
- --el-text-color-regular: var(--text-secondary);
339
- --el-text-color-secondary: var(--text-muted);
340
- --el-text-color-placeholder:var(--text-muted);
341
- --el-fill-color-blank: var(--bg-input);
342
- --el-fill-color: var(--bg-secondary);
343
- --el-fill-color-light: var(--bg-tertiary);
344
- --el-mask-color: rgba(0, 0, 0, 0.5);
345
- --el-box-shadow-light: 0 4px 24px rgba(0,0,0,0.2);
346
- --el-border-radius-base: 10px;
347
- --el-border-radius-small: 8px;
348
- --el-font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
349
- }
350
-
351
- /* EP Input 细节 */
352
- .el-input__wrapper,
353
- .el-textarea__inner {
354
- background-color: var(--bg-input) !important;
355
- box-shadow: 0 0 0 1px var(--border-default) inset !important;
356
- transition: box-shadow 0.15s;
357
- }
358
- .el-input__wrapper:hover,
359
- .el-textarea__inner:hover {
360
- box-shadow: 0 0 0 1px var(--border-default) inset !important;
361
- }
362
- .el-input__wrapper.is-focus,
363
- .el-textarea__inner:focus {
364
- box-shadow: 0 0 0 1px rgba(26,111,196,0.6) inset !important;
365
- }
366
- .el-input__inner,
367
- .el-textarea__inner {
368
- color: var(--text-primary) !important;
369
- font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
370
- background: transparent !important;
371
- }
372
-
373
- /* EP Select 下拉面板 */
374
- .el-select__popper,
375
- .el-select-dropdown {
376
- background: var(--bg-secondary) !important;
377
- border-color: var(--border-subtle) !important;
378
- }
379
- .el-select__popper .el-popper__arrow::before {
380
- background: var(--bg-secondary) !important;
381
- border-color: var(--border-subtle) !important;
382
- }
383
- .el-select-dropdown__item {
384
- color: var(--text-secondary);
385
- }
386
- .el-select-dropdown__item.is-selected,
387
- .el-select-dropdown__item.selected {
388
- color: var(--brand-500) !important;
389
- }
390
- .el-select-dropdown__item:hover {
391
- background: var(--border-subtle) !important;
392
- }
393
-
394
- /* EP Dialog */
395
- .el-dialog {
396
- background: var(--glass-bg) !important;
397
- backdrop-filter: blur(12px);
398
- border: 1px solid var(--border-subtle) !important;
399
- border-radius: 16px !important;
400
- }
401
- .el-dialog__header { border-bottom: 1px solid var(--border-subtle); padding: 16px 20px; }
402
- .el-dialog__title { color: var(--text-primary) !important; font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; font-weight: 700; }
403
- .el-dialog__body { color: var(--text-secondary); }
404
- .el-dialog__headerbtn .el-dialog__close { color: var(--text-muted) !important; }
405
-
406
- /* EP Tabs */
407
- .el-tabs__nav-wrap::after { background-color: var(--border-subtle) !important; }
408
- .el-tabs__item { color: var(--text-secondary) !important; font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; }
409
- .el-tabs__item.is-active { color: var(--text-primary) !important; }
410
- .el-tabs__active-bar { background-color: var(--brand-500) !important; }
411
-
412
- /* EP Button ghost style 对齐 */
413
- .el-button--default {
414
- background: transparent !important;
415
- border-color: var(--border-default) !important;
416
- color: var(--text-secondary) !important;
417
- }
418
- .el-button--default:hover {
419
- border-color: rgba(26,111,196,0.5) !important;
420
- color: var(--brand-400) !important;
421
- background: var(--tag-bg) !important;
422
- }
423
- .el-button--primary {
424
- background: var(--brand-500) !important;
425
- border-color: var(--brand-500) !important;
426
- font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
427
- font-weight: 600;
428
- }
429
- .el-button--primary:hover {
430
- background: var(--brand-600) !important;
431
- border-color: var(--brand-600) !important;
432
- box-shadow: 0 0 20px var(--brand-glow);
433
- }
434
-
435
- /* EP Tooltip / Popover */
436
- .el-popper {
437
- background: var(--bg-secondary) !important;
438
- border-color: var(--border-subtle) !important;
439
- color: var(--text-primary) !important;
440
- }
441
- .el-popper__arrow::before {
442
- background: var(--bg-secondary) !important;
443
- border-color: var(--border-subtle) !important;
444
- }
445
-
446
- /* EP Tag */
447
- .el-tag {
448
- background: var(--tag-bg) !important;
449
- border-color: var(--tag-border) !important;
450
- color: var(--tag-color) !important;
451
- font-family: 'Cascadia Code', 'Consolas', monospace;
452
- font-size: 11px;
453
- border-radius: 999px;
454
- }
455
-
456
- /* EP Alert */
457
- .el-alert--error { background: rgba(248,113,113,0.08) !important; border-color: rgba(248,113,113,0.25) !important; }
458
- .el-alert__title { color: #f87171 !important; }
459
-
460
- /* ── KaTeX 主题适配 ────────────────────────────────────────────── */
461
- .katex { color: var(--text-primary); }
462
- [data-theme='light'] .katex { color: #0f172a; }
463
-
464
- /* ── @vue/repl 主题适配 ────────────────────────────────────────── */
465
- .vue-repl {
466
- --color-branding: var(--brand-500) !important;
467
- }
468
-
469
- /* ── CodePreview dialog 无内边距 ──────────────────────────────── */
470
- .el-dialog__body:has(.preview-toolbar) {
471
- padding: 0 !important;
472
- }
473
-
474
- /* ── 骨架屏加载动画 ─────────────────────────────────────────────── */
475
- @keyframes skeleton-pulse {
476
- 0%, 100% { opacity: 1; }
477
- 50% { opacity: 0.4; }
478
- }
@@ -1,73 +0,0 @@
1
- /**
2
- * tracker/analyze.js
3
- *
4
- * 提问内容的本地分析函数,所有判断在客户端完成,不上报原文。
5
- */
6
- import {
7
- INTENT_KEYWORDS,
8
- MODE_TO_DIRECTION,
9
- COMPLEXITY_THRESHOLD,
10
- } from './config.js'
11
-
12
- /**
13
- * 根据当前模式判断提问方向
14
- * @param {string} mode
15
- * @returns {'code' | 'requirement'}
16
- */
17
- export function getDirection(mode) {
18
- return MODE_TO_DIRECTION[mode] || 'code'
19
- }
20
-
21
- /**
22
- * 根据提问文本和模式识别意图
23
- * 仅在代码方向(code/ask/architect)触发,需求方向直接返回 null
24
- * @param {string} text
25
- * @param {string} mode
26
- * @returns {string | null} 意图 key 或 null(需求方向 / 无法识别)
27
- */
28
- export function getIntent(text, mode) {
29
- // 需求方向不做意图细分
30
- if (MODE_TO_DIRECTION[mode] === 'requirement') return null
31
-
32
- const lower = text.toLowerCase()
33
-
34
- for (const [intent, keywords] of Object.entries(INTENT_KEYWORDS)) {
35
- if (keywords.some(kw => lower.includes(kw))) {
36
- return intent
37
- }
38
- }
39
-
40
- return 'other'
41
- }
42
-
43
- /**
44
- * 根据字符数判断提问复杂度
45
- * @param {string} text
46
- * @returns {'short' | 'medium' | 'long'}
47
- */
48
- export function getComplexity(text) {
49
- const len = (text || '').length
50
- if (len < COMPLEXITY_THRESHOLD.short) return 'short'
51
- if (len < COMPLEXITY_THRESHOLD.medium) return 'medium'
52
- return 'long'
53
- }
54
-
55
- /**
56
- * 判断附件类型
57
- * @param {Array} attachments
58
- * @returns {'image' | 'code_file' | 'pdf' | 'mixed' | 'none'}
59
- */
60
- export function getAttachmentType(attachments) {
61
- if (!attachments || attachments.length === 0) return 'none'
62
-
63
- const types = new Set(attachments.map(a => {
64
- if (a.type === 'image') return 'image'
65
- const ext = (a.ext || '').toLowerCase()
66
- if (['pdf'].includes(ext)) return 'pdf'
67
- if (['vue', 'ts', 'tsx', 'js', 'jsx', 'py', 'go', 'rs', 'java', 'css', 'html'].includes(ext)) return 'code_file'
68
- return 'other'
69
- }))
70
-
71
- if (types.size > 1) return 'mixed'
72
- return [...types][0] || 'other'
73
- }
@@ -1,82 +0,0 @@
1
- /**
2
- * tracker/config.js
3
- *
4
- * 埋点配置,所有 Ackee 相关的 URL、UUID、开关全部在这里维护。
5
- * 上线前把随机 UUID 替换成 Ackee 后台生成的真实 UUID。
6
- *
7
- * 环境变量(.env.local):
8
- * VITE_ACKEE_URL Ackee 服务地址,如 http://192.168.1.200:3000
9
- * VITE_ACKEE_DOMAIN Ackee Domain ID
10
- * VITE_TRACK_ENABLED 埋点总开关,false 时全部静默,默认 true
11
- */
12
-
13
- // ── Ackee 服务配置 ────────────────────────────────────────────────
14
- export const ACKEE_URL = import.meta.env.VITE_ACKEE_URL || ''
15
- export const ACKEE_DOMAIN = import.meta.env.VITE_ACKEE_DOMAIN || ''
16
-
17
- // 埋点总开关:false / 未配置 ACKEE_URL 时全部静默
18
- export const TRACK_ENABLED =
19
- import.meta.env.VITE_TRACK_ENABLED !== 'false' &&
20
- !!import.meta.env.VITE_ACKEE_URL
21
-
22
- // ── Event UUID ───────────────────────────────────────────────────
23
- // 每个 key 对应 Ackee 后台创建的一个 Event
24
- // 替换方式:去 Ackee 设置 → Events → 复制对应 UUID 粘贴到这里
25
- export const EVENTS = {
26
-
27
- // ── 页面行为(3个)────────────────────────────────────────────
28
- PAGE_VIEW: 'a1b2c3d4-0001-4000-8000-000000000001',
29
- BTN_CLICK: 'a1b2c3d4-0002-4000-8000-000000000002',
30
- LOGIN_SUCCESS: 'a1b2c3d4-0003-4000-8000-000000000003',
31
-
32
- // ── 对话行为(8个)────────────────────────────────────────────
33
- MSG_MODE: 'a1b2c3d4-0004-4000-8000-000000000004', // 消息发送-模式
34
- MSG_MODEL: 'a1b2c3d4-0005-4000-8000-000000000005', // 消息发送-模型
35
- MSG_USER: 'a1b2c3d4-0006-4000-8000-000000000006', // 消息发送-用户
36
- RESP_DURATION: 'a1b2c3d4-0007-4000-8000-000000000007', // 回复耗时(Chart 平均值)
37
- RESP_TTFB: 'a1b2c3d4-0008-4000-8000-000000000008', // 首字节延迟(Chart 平均值)
38
- RESP_ABORT: 'a1b2c3d4-0009-4000-8000-000000000009', // 回复中止
39
- RESP_ERROR: 'a1b2c3d4-0010-4000-8000-000000000010', // 回复报错
40
- MODE_SWITCH: 'a1b2c3d4-0011-4000-8000-000000000011', // 模式切换
41
-
42
- // ── 采纳行为(5个)────────────────────────────────────────────
43
- COPY_SOURCE: 'a1b2c3d4-0012-4000-8000-000000000012', // 内容复制-来源
44
- COPY_USER: 'a1b2c3d4-0013-4000-8000-000000000013', // 内容复制-用户
45
- COPY_LANG: 'a1b2c3d4-0014-4000-8000-000000000014', // 内容复制-语言
46
- DOWNLOAD_USER: 'a1b2c3d4-0015-4000-8000-000000000015', // 文件下载-用户
47
- DOWNLOAD_LANG: 'a1b2c3d4-0016-4000-8000-000000000016', // 文件下载-语言
48
-
49
- // ── 提问内容分析(4个,无用户关联)──────────────────────────
50
- Q_DIRECTION: 'a1b2c3d4-0017-4000-8000-000000000017', // 提问-方向
51
- Q_INTENT: 'a1b2c3d4-0018-4000-8000-000000000018', // 提问-意图
52
- Q_COMPLEXITY: 'a1b2c3d4-0019-4000-8000-000000000019', // 提问-复杂度
53
- Q_ATTACHMENT: 'a1b2c3d4-0020-4000-8000-000000000020', // 提问-含附件
54
-
55
- // ── 工具调用(1个)────────────────────────────────────────────
56
- TOOL_EXECUTED: 'a1b2c3d4-0021-4000-8000-000000000021', // 工具调用
57
- }
58
-
59
- // ── 意图关键词字典(仅代码方向使用)────────────────────────────
60
- // key = intent 名称,value = 匹配关键词数组(toLowerCase 后匹配)
61
- export const INTENT_KEYWORDS = {
62
- code_gen: ['生成', '写个', '写一个', '写一段', '实现', '创建', '新建', '帮我做', 'generate', 'create', 'implement', 'write'],
63
- debug: ['报错', '错误', 'error', 'bug', '不生效', '不工作', '为什么不', '怎么解决', '异常', 'exception', 'fix', 'wrong', 'fail'],
64
- explain: ['解释', '什么是', '怎么理解', '原理', '为什么', '如何工作', 'explain', 'what is', 'how does', 'why'],
65
- refactor: ['重构', '优化', '改进', '改写', '简化', 'refactor', 'optimize', 'improve', 'simplify', 'clean'],
66
- review: ['review', '代码审查', '有没有问题', '检查一下', '看看这段', '帮我看', '对吗', '有问题吗'],
67
- }
68
-
69
- // ── 模式 → 方向映射 ──────────────────────────────────────────────
70
- export const MODE_TO_DIRECTION = {
71
- code: 'code',
72
- ask: 'code',
73
- architect: 'code',
74
- requirements: 'requirement',
75
- }
76
-
77
- // ── 复杂度阈值 ───────────────────────────────────────────────────
78
- export const COMPLEXITY_THRESHOLD = {
79
- short: 50, // < 50 字符
80
- medium: 200, // 50 ~ 200 字符
81
- // > 200 = long
82
- }
@@ -1,18 +0,0 @@
1
- /**
2
- * tracker/index.js
3
- *
4
- * 统一入口,外部只需从这里导入。
5
- *
6
- * 官网页面埋点:
7
- * import { useTracker } from '@/tracker'
8
- *
9
- * AI 对话框埋点:
10
- * import { useChatTracker } from '@/tracker'
11
- *
12
- * 直接上报(特殊场景):
13
- * import { track, EVENTS } from '@/tracker'
14
- */
15
- export { useTracker } from './useTracker.js'
16
- export { useChatTracker } from './useChatTracker.js'
17
- export { track, trackBatch, EVENTS } from './service.js'
18
- export { TRACK_ENABLED } from './config.js'