feihong-code 0.2.3 → 0.6.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 (180) hide show
  1. package/.github/FUNDING.yml +4 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -37
  3. package/.github/ISSUE_TEMPLATE/config.yml +14 -14
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -28
  5. package/.github/PULL_REQUEST_TEMPLATE.md +46 -46
  6. package/.github/SECURITY.md +67 -67
  7. package/.github/dependabot.yml +16 -0
  8. package/.github/workflows/ci.yml +1 -1
  9. package/AGENT-GUIDE.md +382 -237
  10. package/CHANGELOG.md +392 -0
  11. package/CODE_OF_CONDUCT.md +56 -56
  12. package/CONTRIBUTING.md +68 -68
  13. package/LICENSE +22 -22
  14. package/README.md +586 -522
  15. package/README.self-evolve.md +274 -0
  16. package/dist/agent/code-review.js +2 -0
  17. package/dist/agent/code-review.js.map +1 -1
  18. package/dist/agent/code-writer.js +74 -18
  19. package/dist/agent/code-writer.js.map +1 -1
  20. package/dist/agent/context-compactor.js +13 -4
  21. package/dist/agent/context-compactor.js.map +1 -1
  22. package/dist/agent/experience.js +319 -84
  23. package/dist/agent/experience.js.map +1 -1
  24. package/dist/agent/orchestrator.js +233 -71
  25. package/dist/agent/orchestrator.js.map +1 -1
  26. package/dist/agent/planner.js +30 -7
  27. package/dist/agent/planner.js.map +1 -1
  28. package/dist/agent/prompts.js +9 -0
  29. package/dist/agent/prompts.js.map +1 -1
  30. package/dist/agent/quality-gate.js +10 -4
  31. package/dist/agent/quality-gate.js.map +1 -1
  32. package/dist/agent/repo-context.js +181 -0
  33. package/dist/agent/repo-context.js.map +1 -0
  34. package/dist/agent/repo-reader.js +92 -99
  35. package/dist/agent/repo-reader.js.map +1 -1
  36. package/dist/agent/self-heal.js +80 -60
  37. package/dist/agent/self-heal.js.map +1 -1
  38. package/dist/agent/self-improver.js +65 -61
  39. package/dist/agent/self-improver.js.map +1 -1
  40. package/dist/agent/subagent-summary.js +31 -0
  41. package/dist/agent/subagent-summary.js.map +1 -0
  42. package/dist/agent/subagent.js +52 -2
  43. package/dist/agent/subagent.js.map +1 -1
  44. package/dist/agent/symbol-index.js +160 -0
  45. package/dist/agent/symbol-index.js.map +1 -0
  46. package/dist/agent/team.js +193 -0
  47. package/dist/agent/team.js.map +1 -0
  48. package/dist/cli/commands.js +124 -143
  49. package/dist/cli/commands.js.map +1 -1
  50. package/dist/cli/index.js +113 -106
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/cli/repl.js +82 -7
  53. package/dist/cli/repl.js.map +1 -1
  54. package/dist/cli/run.js +600 -95
  55. package/dist/cli/run.js.map +1 -1
  56. package/dist/cli/tui.js +145 -0
  57. package/dist/cli/tui.js.map +1 -0
  58. package/dist/cli/version.js +1 -1
  59. package/dist/enterprise/audit.js +145 -23
  60. package/dist/enterprise/audit.js.map +1 -1
  61. package/dist/enterprise/index.js +14 -11
  62. package/dist/enterprise/index.js.map +1 -1
  63. package/dist/enterprise/policy.js +22 -10
  64. package/dist/enterprise/policy.js.map +1 -1
  65. package/dist/harness/executor.js +127 -0
  66. package/dist/harness/executor.js.map +1 -0
  67. package/dist/harness/harness.js +87 -0
  68. package/dist/harness/harness.js.map +1 -0
  69. package/dist/harness/index.js +31 -0
  70. package/dist/harness/index.js.map +1 -0
  71. package/dist/harness/loader.js +138 -0
  72. package/dist/harness/loader.js.map +1 -0
  73. package/dist/harness/reporter.js +34 -0
  74. package/dist/harness/reporter.js.map +1 -0
  75. package/dist/harness/types.js +10 -0
  76. package/dist/harness/types.js.map +1 -0
  77. package/dist/harness/verifier.js +48 -0
  78. package/dist/harness/verifier.js.map +1 -0
  79. package/dist/hello.js +14 -0
  80. package/dist/hello.js.map +1 -0
  81. package/dist/memory/auto-summarize.js +208 -0
  82. package/dist/memory/auto-summarize.js.map +1 -0
  83. package/dist/memory/index.js +228 -0
  84. package/dist/memory/index.js.map +1 -0
  85. package/dist/models/model-router.js +100 -27
  86. package/dist/models/model-router.js.map +1 -1
  87. package/dist/models/model.dto.js +25 -3
  88. package/dist/models/model.dto.js.map +1 -1
  89. package/dist/models/providers/ollama.provider.js +12 -0
  90. package/dist/models/providers/ollama.provider.js.map +1 -1
  91. package/dist/models/providers/openai-compatible.provider.js +14 -1
  92. package/dist/models/providers/openai-compatible.provider.js.map +1 -1
  93. package/dist/plugins/plugin-loader.js +179 -0
  94. package/dist/plugins/plugin-loader.js.map +1 -0
  95. package/dist/runtime/event-log.js.map +1 -1
  96. package/dist/runtime/hooks.js +80 -0
  97. package/dist/runtime/hooks.js.map +1 -0
  98. package/dist/self-evolve/hook.js +60 -0
  99. package/dist/self-evolve/hook.js.map +1 -0
  100. package/dist/self-evolve/hook.ts +80 -0
  101. package/dist/self-evolve/manager.d.ts +8 -0
  102. package/dist/self-evolve/manager.js +401 -0
  103. package/dist/shared/config.js +35 -3
  104. package/dist/shared/config.js.map +1 -1
  105. package/dist/shared/errors.js +6 -2
  106. package/dist/shared/errors.js.map +1 -1
  107. package/dist/shared/i18n.js +535 -0
  108. package/dist/shared/i18n.js.map +1 -0
  109. package/dist/shared/secure-store.js +117 -0
  110. package/dist/shared/secure-store.js.map +1 -0
  111. package/dist/skills/grill.js +2 -1
  112. package/dist/skills/grill.js.map +1 -1
  113. package/dist/skills/self-heal.js +73 -0
  114. package/dist/skills/self-heal.js.map +1 -0
  115. package/dist/skills/skill-loader.js +131 -0
  116. package/dist/skills/skill-loader.js.map +1 -0
  117. package/dist/skills/skill-market.js +195 -0
  118. package/dist/skills/skill-market.js.map +1 -0
  119. package/dist/tools/analysis/code-analyzer.js +45 -18
  120. package/dist/tools/analysis/code-analyzer.js.map +1 -1
  121. package/dist/tools/index.js +5 -0
  122. package/dist/tools/index.js.map +1 -1
  123. package/dist/tools/mcp/index.js +84 -0
  124. package/dist/tools/mcp/index.js.map +1 -0
  125. package/dist/tools/mcp/mcp-client.js +194 -0
  126. package/dist/tools/mcp/mcp-client.js.map +1 -0
  127. package/dist/tools/sandbox.js +126 -0
  128. package/dist/tools/sandbox.js.map +1 -0
  129. package/dist/tools/shell/exec.js +72 -3
  130. package/dist/tools/shell/exec.js.map +1 -1
  131. package/dist/tools/shell/run-shell.tool.js +37 -7
  132. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  133. package/dist/tools/skills/load-skill.tool.js +36 -0
  134. package/dist/tools/skills/load-skill.tool.js.map +1 -0
  135. package/dist/tools/tool.interface.js.map +1 -1
  136. package/dist/tools/tool.registry.js +69 -1
  137. package/dist/tools/tool.registry.js.map +1 -1
  138. package/dist/tools/web/web.tool.js +139 -0
  139. package/dist/tools/web/web.tool.js.map +1 -0
  140. package/dist/web/auth.js +178 -3
  141. package/dist/web/auth.js.map +1 -1
  142. package/dist/web/channels.js +171 -0
  143. package/dist/web/channels.js.map +1 -0
  144. package/dist/web/public/css/style.css +1546 -0
  145. package/dist/web/public/index.html +804 -37
  146. package/dist/web/public/js/api.js +309 -0
  147. package/dist/web/public/js/app.js +1472 -0
  148. package/dist/web/public/js/ui.js +832 -0
  149. package/dist/web/public/js/utils.js +170 -0
  150. package/dist/web/server.js +937 -11
  151. package/dist/web/server.js.map +1 -1
  152. package/dist/web/task-queue.js +470 -0
  153. package/dist/web/task-queue.js.map +1 -0
  154. package/dist/web/web-config.js +143 -0
  155. package/dist/web/web-config.js.map +1 -0
  156. package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +299 -0
  157. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +554 -0
  158. package/docs/Deployment_Guide_EN.md +288 -0
  159. package/docs/SELF-EVOLVE-GUIDE.md +313 -0
  160. package/docs/Technical_Manual_EN.md +216 -0
  161. package/docs/User_Manual_EN.md +314 -0
  162. package/docs/error-codes.md +198 -0
  163. package/docs/screenshots/cli-demo.png +0 -0
  164. package/docs/screenshots/feature-comparison.png +0 -0
  165. package/docs/screenshots/web-console.png +0 -0
  166. package/docs/self-evolve-implementation.md +165 -0
  167. package/docs/self-evolve.md +166 -0
  168. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -614
  169. package/docs//344/274/201/344/270/232/351/203/250/347/275/262/344/270/216/345/220/210/350/247/204.md +267 -267
  170. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +318 -358
  171. package/docs//345/270/270/350/247/201/351/227/256/351/242/230/344/270/216/346/225/205/351/232/234/346/216/222/346/237/245.md +130 -130
  172. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +216 -303
  173. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -238
  174. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -196
  175. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -165
  176. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +288 -0
  177. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -127
  178. package/docs//351/241/265/351/235/242/345/212/237/350/203/275/345/244/215/347/233/230/344/270/216/345/206/222/347/203/237/346/265/213/350/257/225/346/212/245/345/221/212.html +117 -0
  179. package/package.json +108 -109
  180. package/tool-schema.json +117 -46
@@ -0,0 +1,1546 @@
1
+ :root {
2
+ --bg: #f5f7fa;
3
+ --card: #ffffff;
4
+ --ink: #1f2933;
5
+ --ink-2: #475569;
6
+ --muted: #6b7785;
7
+ --brand: #2563eb;
8
+ --brand-soft: #eff4ff;
9
+ --ok: #16a34a;
10
+ --err: #dc2626;
11
+ --warn: #d97706;
12
+ --border: #e3e8ef;
13
+ --line: #e3e8ef;
14
+ --sidebar-width: 56px;
15
+ --topbar-height: 48px;
16
+ }
17
+ .dark {
18
+ --bg: #0f172a;
19
+ --card: #1e293b;
20
+ --ink: #f1f5f9;
21
+ --ink-2: #cbd5e1;
22
+ --muted: #94a3b8;
23
+ --brand: #3b82f6;
24
+ --brand-soft: #1e3a8a;
25
+ --border: #334155;
26
+ --line: #334155;
27
+ }
28
+ * { box-sizing: border-box; }
29
+ body {
30
+ margin: 0;
31
+ font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif;
32
+ background: var(--bg);
33
+ color: var(--ink);
34
+ height: 100vh;
35
+ overflow: hidden;
36
+ }
37
+
38
+ /* ========== 登录遮罩 ========== */
39
+ #loginOverlay {
40
+ position: fixed; inset: 0; background: var(--bg); z-index: 50;
41
+ display: flex; align-items: center; justify-content: center;
42
+ }
43
+ #loginOverlay .login-card {
44
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
45
+ padding: 32px; width: 360px; box-shadow: 0 10px 30px rgba(31,41,51,0.08);
46
+ }
47
+ #loginOverlay h2 { margin: 0 0 4px; font-size: 20px; }
48
+ #loginOverlay p { margin: 0 0 20px; color: var(--muted); font-size: 13px; }
49
+ #loginOverlay input {
50
+ width: 100%; border: 1px solid var(--border); border-radius: 10px;
51
+ padding: 10px 12px; font-size: 14px; margin-bottom: 12px; font-family: inherit;
52
+ background: var(--card); color: var(--ink);
53
+ }
54
+ #loginOverlay button {
55
+ width: 100%; border: none; background: var(--brand); color: #fff;
56
+ border-radius: 10px; padding: 10px; font-size: 14px; cursor: pointer;
57
+ }
58
+ #loginOverlay .login-status { font-size: 13px; margin-top: 10px; min-height: 18px; }
59
+ #loginOverlay .login-status.err { color: var(--err); }
60
+
61
+ /* ========== 主布局 ========== */
62
+ .app-layout {
63
+ display: flex;
64
+ flex-direction: column;
65
+ height: 100vh;
66
+ display: none;
67
+ }
68
+ .app-layout.show { display: flex; }
69
+
70
+ /* ========== 顶部导航栏 ========== */
71
+ .topbar {
72
+ height: var(--topbar-height);
73
+ background: var(--card);
74
+ border-bottom: 1px solid var(--border);
75
+ display: flex;
76
+ align-items: center;
77
+ padding: 0 16px;
78
+ gap: 12px;
79
+ flex-shrink: 0;
80
+ }
81
+ .topbar-brand {
82
+ font-weight: 700;
83
+ font-size: 15px;
84
+ color: var(--brand);
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 8px;
88
+ }
89
+ .topbar-brand .logo {
90
+ width: 28px;
91
+ height: 28px;
92
+ background: var(--brand);
93
+ color: #fff;
94
+ border-radius: 8px;
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: center;
98
+ font-size: 14px;
99
+ }
100
+ .topbar-nav {
101
+ display: flex;
102
+ gap: 4px;
103
+ margin-left: 24px;
104
+ }
105
+ .topbar-nav-item {
106
+ padding: 6px 12px;
107
+ border-radius: 8px;
108
+ font-size: 13px;
109
+ color: var(--ink-2);
110
+ cursor: pointer;
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 6px;
114
+ transition: all 0.15s;
115
+ }
116
+ .topbar-nav-item:hover {
117
+ background: var(--bg);
118
+ color: var(--ink);
119
+ }
120
+ .topbar-nav-item.active {
121
+ background: var(--brand-soft);
122
+ color: var(--brand);
123
+ font-weight: 600;
124
+ }
125
+ .topbar-spacer { flex: 1; }
126
+ .topbar-user {
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 10px;
130
+ padding: 6px 10px;
131
+ border-radius: 10px;
132
+ cursor: pointer;
133
+ transition: background 0.15s;
134
+ }
135
+ .topbar-user:hover { background: var(--bg); }
136
+ .topbar-avatar {
137
+ width: 32px;
138
+ height: 32px;
139
+ background: var(--brand-soft);
140
+ border-radius: 50%;
141
+ display: flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ font-size: 16px;
145
+ }
146
+ .topbar-phone { font-size: 13px; font-weight: 500; color: var(--ink); }
147
+ .lang-switcher { display: flex; align-items: center; gap: 2px; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
148
+ .lang-btn { padding: 4px 10px; font-size: 12px; cursor: pointer; border: none; background: transparent; color: var(--ink-2); font-weight: 500; transition: all 0.15s; }
149
+ .lang-btn.active { background: var(--brand); color: #fff; }
150
+ .lang-btn:hover:not(.active) { background: var(--bg); }
151
+
152
+ /* ========== 主体内容区 ========== */
153
+ /* overflow 必须为 hidden:约束内部 .messages / .sidebar 各自滚动,
154
+ 原生 <select> 弹层由浏览器绘制在顶层,不受此裁剪影响。 */
155
+ .main-area {
156
+ flex: 1;
157
+ display: flex;
158
+ min-height: 0;
159
+ overflow: hidden;
160
+ }
161
+
162
+ /* ========== 左侧侧边栏 ========== */
163
+ .sidebar {
164
+ width: 200px;
165
+ background: var(--card);
166
+ border-right: 1px solid var(--border);
167
+ display: flex;
168
+ flex-direction: column;
169
+ padding: 12px 8px;
170
+ gap: 2px;
171
+ flex-shrink: 0;
172
+ overflow-y: auto;
173
+ }
174
+ .sidebar-section {
175
+ margin-bottom: 8px;
176
+ padding-bottom: 8px;
177
+ border-bottom: 1px solid var(--border);
178
+ }
179
+ .sidebar-section-title {
180
+ font-size: 11px;
181
+ color: var(--muted);
182
+ text-transform: uppercase;
183
+ letter-spacing: 0.5px;
184
+ padding: 4px 8px;
185
+ margin-bottom: 4px;
186
+ }
187
+ .sidebar-icon {
188
+ width: 100%;
189
+ height: 36px;
190
+ border-radius: 8px;
191
+ display: flex;
192
+ align-items: center;
193
+ gap: 10px;
194
+ padding: 0 8px;
195
+ cursor: pointer;
196
+ color: var(--ink-2);
197
+ transition: all 0.15s;
198
+ position: relative;
199
+ font-size: 13px;
200
+ }
201
+ .sidebar-icon .icon {
202
+ font-size: 16px;
203
+ width: 20px;
204
+ text-align: center;
205
+ flex-shrink: 0;
206
+ }
207
+ .sidebar-icon .label {
208
+ flex: 1;
209
+ white-space: nowrap;
210
+ overflow: hidden;
211
+ text-overflow: ellipsis;
212
+ }
213
+ .sidebar-icon .badge {
214
+ font-size: 10px;
215
+ padding: 2px 6px;
216
+ border-radius: 10px;
217
+ background: var(--brand-soft);
218
+ color: var(--brand);
219
+ font-weight: 600;
220
+ flex-shrink: 0;
221
+ }
222
+ .sidebar-icon:hover {
223
+ background: var(--bg);
224
+ color: var(--ink);
225
+ }
226
+ .sidebar-icon.active {
227
+ background: var(--brand-soft);
228
+ color: var(--brand);
229
+ font-weight: 600;
230
+ }
231
+ .sidebar-icon.active::before {
232
+ content: '';
233
+ position: absolute;
234
+ left: 0;
235
+ top: 50%;
236
+ transform: translateY(-50%);
237
+ width: 3px;
238
+ height: 20px;
239
+ background: var(--brand);
240
+ border-radius: 0 2px 2px 0;
241
+ }
242
+ .sidebar-spacer { flex: 1; }
243
+ .sidebar-pin {
244
+ font-size: 10px;
245
+ color: var(--warn);
246
+ flex-shrink: 0;
247
+ }
248
+ .task-item {
249
+ display: flex;
250
+ align-items: center;
251
+ gap: 8px;
252
+ padding: 8px;
253
+ border-radius: 6px;
254
+ cursor: pointer;
255
+ font-size: 12px;
256
+ transition: background 0.15s;
257
+ }
258
+ .task-item:hover { background: var(--bg); }
259
+ .task-item.active { background: var(--brand-soft); }
260
+ .task-item .task-icon { font-size: 14px; }
261
+ .task-item .task-title {
262
+ flex: 1;
263
+ white-space: nowrap;
264
+ overflow: hidden;
265
+ text-overflow: ellipsis;
266
+ color: var(--ink-2);
267
+ }
268
+ .task-item.active .task-title { color: var(--brand); }
269
+ .task-item .task-actions {
270
+ display: none;
271
+ gap: 4px;
272
+ font-size: 11px;
273
+ }
274
+ .task-item:hover .task-actions { display: flex; }
275
+ .task-item .task-actions button {
276
+ padding: 2px 4px;
277
+ border: none;
278
+ background: transparent;
279
+ cursor: pointer;
280
+ border-radius: 4px;
281
+ font-size: 10px;
282
+ }
283
+ .task-item .task-actions button:hover { background: var(--border); }
284
+ .task-item .task-actions .delete-btn:hover { background: #fee2e2; color: var(--err); }
285
+ .task-pinned { color: var(--warn); }
286
+
287
+ /* ========== 中间对话区 ========== */
288
+ .chat-area {
289
+ flex: 1;
290
+ display: flex;
291
+ flex-direction: column;
292
+ min-width: 0;
293
+ background: var(--bg);
294
+ }
295
+
296
+ /* ========== 任务上下文头部 ========== */
297
+ .task-context-header {
298
+ display: flex;
299
+ align-items: center;
300
+ gap: 12px;
301
+ padding: 12px 16px;
302
+ background: var(--card);
303
+ border-bottom: 1px solid var(--border);
304
+ flex-shrink: 0;
305
+ }
306
+ .tch-left { flex: 1; min-width: 0; }
307
+ .tch-title { font-size: 15px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
308
+ .tch-sub { font-size: 12px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
309
+ .tch-right { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
310
+ .tch-time { font-size: 12px; color: var(--muted); }
311
+
312
+ /* ========== 思维链路线程 ========== */
313
+ .messages { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; padding: 16px; padding-right: 4px; }
314
+ .step { max-width: 92%; font-size: 13.5px; line-height: 1.6; word-break: break-word; }
315
+ .step.created {
316
+ align-self: stretch; background: var(--bg); border: 1px dashed var(--border);
317
+ border-radius: 10px; padding: 8px 12px; color: var(--muted); font-size: 12.5px;
318
+ }
319
+ .step.reasoning {
320
+ align-self: flex-start; background: var(--card); border: 1px solid var(--border);
321
+ border-left: 3px solid var(--brand); border-radius: 10px; padding: 10px 14px;
322
+ white-space: pre-wrap; color: var(--ink-2);
323
+ }
324
+ .step.reasoning .reasoning-head { font-size: 11px; color: var(--brand); font-weight: 600; margin-bottom: 4px; display: flex; align-items: center; gap: 6px; }
325
+ .step.toolcall {
326
+ align-self: flex-start; background: #fffbeb; border: 1px solid #fde68a;
327
+ border-radius: 10px; padding: 8px 12px; color: #92400e; font-size: 12.5px;
328
+ }
329
+ .dark .step.toolcall { background: #3a2f12; color: #fcd34d; border-color: #5b4a1f; }
330
+ .step.toolcall .tc-name { font-weight: 600; }
331
+ .step.toolcall .tc-args {
332
+ color: var(--muted); font-size: 12px; margin-top: 2px; white-space: pre-wrap; word-break: break-word;
333
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
334
+ }
335
+ .step.result {
336
+ align-self: flex-start; background: var(--card); border: 1px solid var(--border);
337
+ border-radius: 10px; padding: 8px 12px; color: var(--ink-2); font-size: 12.5px; max-width: 92%;
338
+ }
339
+ .step.result .res-head { font-weight: 600; display: flex; align-items: center; gap: 6px; }
340
+ .step.result.ok .res-head { color: var(--ok); }
341
+ .step.result.fail .res-head { color: var(--err); }
342
+ .step.result .res-out {
343
+ margin-top: 4px; white-space: pre-wrap; word-break: break-word; max-height: 160px; overflow-y: auto;
344
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; color: var(--muted);
345
+ }
346
+ .step.note { align-self: stretch; background: var(--bg); border-radius: 8px; padding: 6px 12px; color: var(--muted); font-size: 12px; }
347
+ /* 对话流与思维链路分隔标题 */
348
+ .conv-divider {
349
+ align-self: stretch; text-align: center; font-size: 11px; color: var(--muted);
350
+ border-top: 1px solid var(--line); padding-top: 8px; margin-top: 4px;
351
+ }
352
+ .step.final {
353
+ align-self: flex-end; background: var(--ok); color: #fff; border-radius: 12px;
354
+ padding: 12px 16px; white-space: pre-wrap; word-break: break-word; max-width: 92%;
355
+ position: relative;
356
+ }
357
+ .step.final .final-head { font-size: 11px; opacity: 0.85; margin-bottom: 4px; font-weight: 600; }
358
+ .step.final .final-actions {
359
+ position: absolute; top: 8px; right: 8px; display: flex; gap: 4px;
360
+ opacity: 0.85; transition: opacity 0.2s;
361
+ background: rgba(0,0,0,0.18); border-radius: 8px; padding: 2px 4px;
362
+ }
363
+ .step.final:hover .final-actions { opacity: 1; background: rgba(0,0,0,0.32); }
364
+ .step.final .final-actions button {
365
+ background: transparent; border: none; color: #fff;
366
+ border-radius: 4px; padding: 3px 7px; font-size: 11px; cursor: pointer;
367
+ transition: background 0.15s;
368
+ }
369
+ .step.final .final-actions button:hover { background: rgba(255,255,255,0.28); }
370
+ .step.error {
371
+ align-self: flex-end; background: var(--err); color: #fff; border-radius: 12px;
372
+ padding: 12px 16px; white-space: pre-wrap; word-break: break-word; max-width: 92%;
373
+ }
374
+
375
+ /* 对话消息区 */
376
+ .conv {
377
+ flex: 1;
378
+ display: flex;
379
+ flex-direction: column;
380
+ padding: 16px;
381
+ gap: 12px;
382
+ overflow: hidden;
383
+ }
384
+ .messages {
385
+ flex: 1;
386
+ overflow-y: auto;
387
+ display: flex;
388
+ flex-direction: column;
389
+ gap: 10px;
390
+ padding-right: 4px;
391
+ }
392
+ .msg {
393
+ padding: 10px 14px;
394
+ border-radius: 12px;
395
+ font-size: 13.5px;
396
+ line-height: 1.6;
397
+ max-width: 85%;
398
+ white-space: pre-wrap;
399
+ word-break: break-word;
400
+ }
401
+ .msg.user {
402
+ background: var(--brand-soft);
403
+ align-self: flex-end;
404
+ }
405
+ .msg.assistant {
406
+ background: var(--card);
407
+ border: 1px solid var(--border);
408
+ align-self: flex-start;
409
+ }
410
+ /* ========== 思考过程气泡(Cursor 风格) ========== */
411
+ .msg.assistant.thinking-msg {
412
+ background: var(--card);
413
+ border: 1px solid var(--border);
414
+ border-left: 3px solid var(--brand);
415
+ position: relative;
416
+ padding: 10px 12px;
417
+ }
418
+ .thinking-header {
419
+ display: flex;
420
+ align-items: center;
421
+ gap: 6px;
422
+ cursor: pointer;
423
+ user-select: none;
424
+ padding: 2px 0;
425
+ border-radius: 4px;
426
+ transition: background 0.15s;
427
+ }
428
+ .thinking-header:hover {
429
+ background: var(--brand-soft);
430
+ }
431
+ .thinking-arrow {
432
+ font-size: 10px;
433
+ color: var(--ink-2);
434
+ transition: transform 0.2s;
435
+ flex-shrink: 0;
436
+ width: 14px;
437
+ text-align: center;
438
+ }
439
+ .thinking-label {
440
+ font-size: 12px;
441
+ font-weight: 600;
442
+ color: var(--ink);
443
+ flex-shrink: 0;
444
+ }
445
+ .thinking-summary {
446
+ font-size: 11px;
447
+ color: var(--muted);
448
+ overflow: hidden;
449
+ text-overflow: ellipsis;
450
+ white-space: nowrap;
451
+ }
452
+ .thinking-body {
453
+ margin-top: 8px;
454
+ border-top: 1px solid var(--line);
455
+ padding-top: 6px;
456
+ }
457
+ .thinking-step {
458
+ display: flex;
459
+ align-items: flex-start;
460
+ gap: 6px;
461
+ padding: 3px 0;
462
+ font-size: 12px;
463
+ color: var(--ink-2);
464
+ line-height: 1.5;
465
+ }
466
+ .thinking-step-icon {
467
+ flex-shrink: 0;
468
+ width: 16px;
469
+ text-align: center;
470
+ font-size: 11px;
471
+ }
472
+ .thinking-step-text {
473
+ flex: 1;
474
+ word-break: break-word;
475
+ }
476
+ .thinking-step-text code {
477
+ font-size: 11px;
478
+ background: var(--brand-soft);
479
+ padding: 1px 4px;
480
+ border-radius: 3px;
481
+ color: var(--brand);
482
+ }
483
+ .thinking-step-detail {
484
+ font-size: 11px;
485
+ color: var(--muted);
486
+ cursor: pointer;
487
+ margin-left: 22px;
488
+ padding: 1px 6px;
489
+ border-radius: 3px;
490
+ background: var(--bg);
491
+ display: inline-block;
492
+ }
493
+ .thinking-step-detail:hover {
494
+ background: var(--brand-soft);
495
+ }
496
+ .thinking-args {
497
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
498
+ font-size: 11px;
499
+ color: var(--muted);
500
+ margin: 4px 0 4px 22px;
501
+ padding: 6px 8px;
502
+ background: var(--bg);
503
+ border-radius: 4px;
504
+ overflow-x: auto;
505
+ white-space: pre-wrap;
506
+ word-break: break-all;
507
+ display: none;
508
+ }
509
+ .thinking-args.show {
510
+ display: block;
511
+ }
512
+ .thinking-reply {
513
+ font-size: 13px;
514
+ line-height: 1.7;
515
+ color: var(--ink);
516
+ margin-top: 8px;
517
+ padding-top: 8px;
518
+ border-top: 1px solid var(--line);
519
+ }
520
+ /* 思考中状态指示 */
521
+ .thinking-indicator {
522
+ display: flex;
523
+ align-items: center;
524
+ gap: 8px;
525
+ padding: 4px 0;
526
+ font-size: 12px;
527
+ color: var(--ink-2);
528
+ }
529
+ @keyframes pulse-dot {
530
+ 0%, 100% { opacity: 1; }
531
+ 50% { opacity: 0.3; }
532
+ }
533
+ .thinking-indicator .dot {
534
+ width: 6px;
535
+ height: 6px;
536
+ border-radius: 50%;
537
+ background: var(--brand);
538
+ animation: pulse-dot 1.2s infinite;
539
+ }
540
+ .thinking-indicator .dot:nth-child(2) { animation-delay: 0.2s; }
541
+ .thinking-indicator .dot:nth-child(3) { animation-delay: 0.4s; }
542
+ .dark .msg.assistant { background: #1e293b; }
543
+ .msg.sys {
544
+ background: #f1f5f9;
545
+ align-self: flex-start;
546
+ color: var(--ink-2);
547
+ }
548
+ .dark .msg.sys { background: #334155; }
549
+ .msg .artifact { color: var(--brand); text-decoration: underline; cursor: pointer; }
550
+ /* 内部执行过程:默认折叠,避免"一直都在调用/验证"的噪声;点击展开查看思考与工具调用 */
551
+ .proc-details {
552
+ align-self: stretch; margin-top: 6px; border-top: 1px dashed var(--line);
553
+ padding: 8px 0 2px; display: flex; flex-direction: column; gap: 8px;
554
+ }
555
+ .proc-summary {
556
+ cursor: pointer; font-size: 12px; color: var(--muted); user-select: none;
557
+ padding: 4px 6px; border-radius: 6px; background: var(--card);
558
+ border: 1px solid var(--border); width: fit-content;
559
+ }
560
+ .proc-summary:hover { color: var(--brand); border-color: var(--brand); }
561
+ .proc-details[open] .proc-summary { color: var(--brand); margin-bottom: 6px; }
562
+ .final-msg { border-left: 3px solid var(--ok); align-self: flex-start; }
563
+ .error-msg { border-left: 3px solid var(--err); align-self: flex-start; color: var(--err); }
564
+ .msg .artifact:hover { opacity: 0.8; }
565
+
566
+ /* 输入栏 */
567
+ .input-area {
568
+ padding: 0 16px 16px;
569
+ flex-shrink: 0;
570
+ }
571
+ .input-bar {
572
+ border: 1px solid var(--border);
573
+ border-radius: 14px;
574
+ padding: 12px;
575
+ background: var(--card);
576
+ box-shadow: 0 4px 12px rgba(0,0,0,0.04);
577
+ }
578
+ .input-bar textarea {
579
+ width: 100%;
580
+ border: none;
581
+ margin: 0;
582
+ min-height: 60px;
583
+ resize: none;
584
+ background: transparent;
585
+ color: var(--ink);
586
+ font-size: 14px;
587
+ font-family: inherit;
588
+ }
589
+ .input-bar textarea:focus { outline: none; }
590
+ .input-toolbar {
591
+ display: flex;
592
+ align-items: center;
593
+ gap: 8px;
594
+ margin-top: 10px;
595
+ flex-wrap: wrap;
596
+ }
597
+ .input-toolbar .spacer { flex: 1; }
598
+ .pill {
599
+ border: 1px solid var(--border);
600
+ border-radius: 8px;
601
+ padding: 5px 10px;
602
+ font-size: 12.5px;
603
+ background: var(--card);
604
+ color: var(--ink-2);
605
+ cursor: pointer;
606
+ user-select: none;
607
+ }
608
+ .pill:hover { border-color: var(--brand); }
609
+ .voice-badge { display: inline-flex; align-items: center; gap: 6px; color: var(--err); font-size: 12px; }
610
+
611
+ /* 工作区条 */
612
+ .workspace-bar {
613
+ display: flex;
614
+ align-items: center;
615
+ gap: 8px;
616
+ padding: 8px 0;
617
+ font-size: 13px;
618
+ color: var(--muted);
619
+ }
620
+ .wb-select {
621
+ display: flex;
622
+ align-items: center;
623
+ gap: 6px;
624
+ cursor: pointer;
625
+ padding: 5px 10px;
626
+ border-radius: 8px;
627
+ background: var(--bg);
628
+ border: 1px solid var(--border);
629
+ font-size: 13px;
630
+ color: var(--ink);
631
+ max-width: 320px;
632
+ transition: border-color 0.15s;
633
+ }
634
+ .wb-select:hover { border-color: var(--brand); }
635
+ .wb-icon { font-size: 15px; }
636
+ .wb-label {
637
+ flex: 1;
638
+ white-space: nowrap;
639
+ overflow: hidden;
640
+ text-overflow: ellipsis;
641
+ }
642
+ .wb-arrow { font-size: 10px; color: var(--muted); }
643
+ .wb-perm {
644
+ display: flex;
645
+ align-items: center;
646
+ gap: 5px;
647
+ cursor: pointer;
648
+ padding: 5px 10px;
649
+ border-radius: 8px;
650
+ background: var(--bg);
651
+ border: 1px solid var(--border);
652
+ font-size: 13px;
653
+ color: var(--ink);
654
+ transition: border-color 0.15s;
655
+ }
656
+ .wb-perm:hover { border-color: var(--brand); }
657
+
658
+ /* 通话栏 */
659
+ .call-bar {
660
+ display: flex;
661
+ align-items: center;
662
+ gap: 10px;
663
+ padding: 10px 0;
664
+ border-top: 1px solid var(--border);
665
+ margin-top: 8px;
666
+ }
667
+ .call-hint { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; }
668
+ .call-btn {
669
+ border: 1px solid var(--border);
670
+ background: var(--brand-soft);
671
+ color: var(--brand);
672
+ border-radius: 8px;
673
+ padding: 7px 12px;
674
+ cursor: pointer;
675
+ font-size: 13px;
676
+ font-weight: 600;
677
+ }
678
+ .call-btn:hover { filter: brightness(0.97); }
679
+ .call-btn.hangup { background: #fee2e2; color: var(--err); border-color: #fecaca; }
680
+ .call-status { font-size: 12px; color: var(--muted); margin-left: auto; }
681
+
682
+ /* 底部工具栏 */
683
+ .chat-footbar {
684
+ display: flex;
685
+ align-items: center;
686
+ justify-content: space-between;
687
+ padding: 8px 16px;
688
+ background: var(--card);
689
+ border-top: 1px solid var(--border);
690
+ font-size: 13px;
691
+ }
692
+ .model-label { font-size: 13px; color: var(--muted); }
693
+ .model-select {
694
+ padding: 6px 10px;
695
+ border: 1px solid var(--border);
696
+ border-radius: 8px;
697
+ background: var(--card);
698
+ color: var(--ink);
699
+ font-size: 13px;
700
+ }
701
+ .ghost-btn {
702
+ border: 1px solid var(--border);
703
+ background: var(--card);
704
+ color: var(--ink-2);
705
+ border-radius: 8px;
706
+ padding: 6px 9px;
707
+ cursor: pointer;
708
+ font-size: 14px;
709
+ }
710
+ .ghost-btn:hover { background: var(--brand-soft); }
711
+
712
+ /* 新建任务按钮(侧边栏) */
713
+ .new-task-btn {
714
+ border: 1px solid var(--border);
715
+ background: var(--brand);
716
+ color: #fff;
717
+ border-radius: 8px;
718
+ padding: 3px 8px;
719
+ cursor: pointer;
720
+ font-size: 11px;
721
+ font-weight: 600;
722
+ line-height: 1.6;
723
+ }
724
+ .new-task-btn:hover { opacity: 0.88; }
725
+
726
+ /* 新建对话任务弹窗 */
727
+ .nt-form { display: flex; flex-direction: column; gap: 12px; margin-top: 4px; }
728
+ .nt-label { font-size: 12.5px; font-weight: 600; color: var(--ink-2); display: block; margin-bottom: 4px; }
729
+ .nt-form textarea, .nt-form select {
730
+ width: 100%; box-sizing: border-box; padding: 8px 10px; font-size: 13px;
731
+ border: 1px solid var(--border); border-radius: 10px; background: var(--bg);
732
+ color: var(--ink); resize: vertical; font-family: inherit;
733
+ }
734
+ .nt-form select { cursor: pointer; }
735
+ .nt-row { display: flex; gap: 12px; }
736
+ .nt-row > div { flex: 1; }
737
+ .nt-hint { font-size: 12px; color: var(--muted); }
738
+
739
+ /* ========== 右侧面板 ========== */
740
+ .right-panel {
741
+ width: 320px;
742
+ background: var(--card);
743
+ border-left: 1px solid var(--border);
744
+ display: flex;
745
+ flex-direction: column;
746
+ flex-shrink: 0;
747
+ overflow: hidden;
748
+ }
749
+ .right-panel.collapsed { width: 0; border: none; }
750
+ .right-tabs {
751
+ display: flex;
752
+ gap: 4px;
753
+ padding: 12px 12px 0;
754
+ border-bottom: 1px solid var(--line);
755
+ }
756
+ .right-tab {
757
+ padding: 8px 14px;
758
+ font-size: 13px;
759
+ color: var(--muted);
760
+ cursor: pointer;
761
+ border-bottom: 2px solid transparent;
762
+ }
763
+ .right-tab.active { color: var(--brand); border-bottom-color: var(--brand); font-weight: 600; }
764
+ .right-body { flex: 1; overflow-y: auto; padding: 12px; }
765
+ .preview-panel { display: none; }
766
+ .preview-panel.active { display: block; }
767
+ .preview-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; color: var(--ink); }
768
+ .preview-content {
769
+ background: var(--bg);
770
+ border: 1px solid var(--border);
771
+ border-radius: 10px;
772
+ padding: 12px;
773
+ font-size: 12.5px;
774
+ overflow-x: auto;
775
+ }
776
+ .preview-content pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
777
+
778
+ /* 任务详情 */
779
+ .detail-ops {
780
+ display: grid;
781
+ grid-template-columns: 1fr 1fr;
782
+ gap: 8px;
783
+ margin-bottom: 14px;
784
+ }
785
+ .detail-ops .secondary {
786
+ border: 1px solid var(--border);
787
+ background: var(--brand-soft);
788
+ color: var(--brand);
789
+ border-radius: 8px;
790
+ padding: 7px 11px;
791
+ cursor: pointer;
792
+ font-size: 12.5px;
793
+ font-weight: 600;
794
+ }
795
+ .detail-ops .secondary:hover { filter: brightness(0.97); }
796
+ .artifact-list { display: flex; flex-direction: column; gap: 4px; }
797
+ .artifact-file {
798
+ padding: 6px 8px;
799
+ border: 1px solid var(--border);
800
+ border-radius: 6px;
801
+ font-size: 12.5px;
802
+ color: var(--ink-2);
803
+ cursor: pointer;
804
+ background: var(--bg);
805
+ }
806
+ .artifact-file:hover { background: var(--brand-soft); color: var(--brand); }
807
+
808
+ /* ========== 功能页面 ========== */
809
+ .page-view {
810
+ flex: 1;
811
+ display: none;
812
+ flex-direction: column;
813
+ padding: 24px;
814
+ overflow-y: auto;
815
+ }
816
+ .page-view.active { display: flex; }
817
+ .page-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; }
818
+ .page-head h2 { margin: 0; font-size: 20px; }
819
+ .page-head .sub { color: var(--muted); font-size: 13px; margin-top: 4px; }
820
+ .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
821
+ .tile {
822
+ border: 1px solid var(--border);
823
+ border-radius: 12px;
824
+ padding: 16px;
825
+ cursor: pointer;
826
+ background: var(--card);
827
+ transition: all 0.15s;
828
+ }
829
+ .tile:hover { border-color: var(--brand); box-shadow: 0 6px 18px rgba(37,99,235,0.12); }
830
+ .tile .icon { font-size: 24px; }
831
+ .tile .title { font-weight: 600; margin: 8px 0 4px; font-size: 14px; }
832
+ .tile .desc { color: var(--muted); font-size: 12px; line-height: 1.5; }
833
+ .tile .ops { display: flex; gap: 6px; margin-top: 12px; }
834
+ .tile .ops button { padding: 6px 12px; font-size: 12px; flex: 1; }
835
+
836
+ /* ========== 产品发布故事页面 ========== */
837
+ .release-container { max-width: 900px; margin: 0 auto; }
838
+ .release-hero {
839
+ text-align: center;
840
+ padding: 48px 24px;
841
+ background: linear-gradient(135deg, var(--brand-soft) 0%, rgba(37,99,235,0.08) 100%);
842
+ border-radius: 20px;
843
+ margin-bottom: 40px;
844
+ }
845
+ .release-badge {
846
+ display: inline-block;
847
+ padding: 6px 16px;
848
+ background: var(--brand);
849
+ color: #fff;
850
+ border-radius: 20px;
851
+ font-size: 13px;
852
+ font-weight: 600;
853
+ margin-bottom: 16px;
854
+ }
855
+ .release-title {
856
+ font-size: 48px;
857
+ font-weight: 800;
858
+ margin: 0 0 12px;
859
+ background: linear-gradient(135deg, var(--brand), #6366f1);
860
+ -webkit-background-clip: text;
861
+ -webkit-text-fill-color: transparent;
862
+ background-clip: text;
863
+ }
864
+ .release-subtitle {
865
+ font-size: 18px;
866
+ color: var(--ink-2);
867
+ margin: 0 0 8px;
868
+ }
869
+ .release-tagline {
870
+ font-size: 16px;
871
+ color: var(--muted);
872
+ font-style: italic;
873
+ margin: 16px 0 32px;
874
+ }
875
+ .release-stats {
876
+ display: flex;
877
+ justify-content: center;
878
+ gap: 32px;
879
+ flex-wrap: wrap;
880
+ }
881
+ .stat-item {
882
+ text-align: center;
883
+ }
884
+ .stat-num {
885
+ display: block;
886
+ font-size: 28px;
887
+ font-weight: 700;
888
+ color: var(--brand);
889
+ }
890
+ .stat-label {
891
+ font-size: 12px;
892
+ color: var(--muted);
893
+ }
894
+ .section-title {
895
+ font-size: 28px;
896
+ font-weight: 700;
897
+ margin: 48px 0 24px;
898
+ text-align: center;
899
+ }
900
+ .release-timeline { margin-bottom: 48px; }
901
+ .timeline {
902
+ position: relative;
903
+ padding-left: 40px;
904
+ }
905
+ .timeline::before {
906
+ content: '';
907
+ position: absolute;
908
+ left: 15px;
909
+ top: 0;
910
+ bottom: 0;
911
+ width: 2px;
912
+ background: linear-gradient(to bottom, var(--brand), var(--brand-soft));
913
+ }
914
+ .timeline-item {
915
+ position: relative;
916
+ margin-bottom: 32px;
917
+ }
918
+ .timeline-dot {
919
+ position: absolute;
920
+ left: -32px;
921
+ top: 4px;
922
+ width: 12px;
923
+ height: 12px;
924
+ border-radius: 50%;
925
+ background: var(--brand-soft);
926
+ border: 2px solid var(--brand);
927
+ }
928
+ .timeline-dot.active {
929
+ background: var(--brand);
930
+ box-shadow: 0 0 0 4px rgba(37,99,235,0.2);
931
+ }
932
+ .timeline-date {
933
+ font-size: 13px;
934
+ color: var(--brand);
935
+ font-weight: 600;
936
+ margin-bottom: 4px;
937
+ }
938
+ .timeline-content h3 {
939
+ margin: 0 0 8px;
940
+ font-size: 18px;
941
+ }
942
+ .timeline-content p {
943
+ color: var(--ink-2);
944
+ line-height: 1.6;
945
+ margin: 0 0 8px;
946
+ }
947
+ .timeline-quote {
948
+ font-style: italic;
949
+ color: var(--muted);
950
+ border-left: 3px solid var(--brand-soft);
951
+ padding-left: 12px;
952
+ margin: 12px 0;
953
+ }
954
+ .timeline-tags { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
955
+ .tag {
956
+ padding: 4px 10px;
957
+ background: var(--bg);
958
+ border: 1px solid var(--border);
959
+ border-radius: 12px;
960
+ font-size: 11px;
961
+ color: var(--muted);
962
+ }
963
+ .release-team { margin-bottom: 48px; }
964
+ .team-grid {
965
+ display: grid;
966
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
967
+ gap: 20px;
968
+ }
969
+ .team-card {
970
+ text-align: center;
971
+ padding: 24px;
972
+ background: var(--card);
973
+ border: 1px solid var(--border);
974
+ border-radius: 16px;
975
+ }
976
+ .team-avatar { font-size: 48px; margin-bottom: 12px; }
977
+ .team-card h3 { margin: 0 0 8px; font-size: 16px; }
978
+ .team-card p { color: var(--ink-2); font-size: 13px; line-height: 1.5; margin: 0 0 12px; }
979
+ .team-role {
980
+ font-size: 12px;
981
+ color: var(--brand);
982
+ font-weight: 600;
983
+ }
984
+ .release-challenges { margin-bottom: 48px; }
985
+ .challenges-list { display: flex; flex-direction: column; gap: 16px; }
986
+ .challenge-item {
987
+ display: flex;
988
+ gap: 16px;
989
+ padding: 20px;
990
+ background: var(--card);
991
+ border: 1px solid var(--border);
992
+ border-radius: 12px;
993
+ }
994
+ .challenge-icon { font-size: 28px; flex-shrink: 0; }
995
+ .challenge-item h4 { margin: 0 0 4px; font-size: 15px; }
996
+ .challenge-item p { color: var(--ink-2); font-size: 13px; margin: 0; }
997
+ .release-features { margin-bottom: 48px; }
998
+ .features-grid {
999
+ display: grid;
1000
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1001
+ gap: 16px;
1002
+ }
1003
+ .feature-card {
1004
+ text-align: center;
1005
+ padding: 24px 16px;
1006
+ background: var(--card);
1007
+ border: 1px solid var(--border);
1008
+ border-radius: 12px;
1009
+ transition: all 0.15s;
1010
+ }
1011
+ .feature-card:hover {
1012
+ border-color: var(--brand);
1013
+ transform: translateY(-2px);
1014
+ box-shadow: 0 8px 24px rgba(37,99,235,0.12);
1015
+ }
1016
+ .feature-icon { font-size: 32px; margin-bottom: 12px; }
1017
+ .feature-card h4 { margin: 0 0 6px; font-size: 14px; }
1018
+ .feature-card p { color: var(--muted); font-size: 12px; margin: 0; }
1019
+ .release-quote {
1020
+ text-align: center;
1021
+ padding: 40px 24px;
1022
+ background: linear-gradient(135deg, var(--brand-soft), rgba(99,102,241,0.1));
1023
+ border-radius: 16px;
1024
+ margin-bottom: 48px;
1025
+ }
1026
+ .release-quote blockquote {
1027
+ font-size: 20px;
1028
+ font-style: italic;
1029
+ color: var(--ink);
1030
+ margin: 0 0 16px;
1031
+ line-height: 1.6;
1032
+ }
1033
+ .release-quote cite {
1034
+ font-size: 14px;
1035
+ color: var(--muted);
1036
+ }
1037
+ .release-cta {
1038
+ text-align: center;
1039
+ padding: 48px 24px;
1040
+ background: var(--card);
1041
+ border: 1px solid var(--border);
1042
+ border-radius: 20px;
1043
+ }
1044
+ .release-cta h2 { margin: 0 0 24px; font-size: 28px; }
1045
+ .cta-buttons { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; margin-bottom: 20px; }
1046
+ .cta-btn {
1047
+ display: inline-block;
1048
+ padding: 12px 28px;
1049
+ border-radius: 10px;
1050
+ font-size: 15px;
1051
+ font-weight: 600;
1052
+ text-decoration: none;
1053
+ transition: all 0.15s;
1054
+ }
1055
+ .cta-btn.primary {
1056
+ background: var(--brand);
1057
+ color: #fff;
1058
+ }
1059
+ .cta-btn.primary:hover { filter: brightness(1.1); transform: translateY(-1px); }
1060
+ .cta-btn.secondary {
1061
+ background: transparent;
1062
+ color: var(--brand);
1063
+ border: 2px solid var(--brand);
1064
+ }
1065
+ .cta-btn.secondary:hover { background: var(--brand-soft); }
1066
+ .cta-sub { color: var(--muted); font-size: 13px; }
1067
+
1068
+ /* ========== 通用样式 ========== */
1069
+ .card {
1070
+ background: var(--card);
1071
+ border: 1px solid var(--border);
1072
+ border-radius: 16px;
1073
+ padding: 20px;
1074
+ box-shadow: 0 8px 24px rgba(31,41,51,0.06);
1075
+ }
1076
+ label { font-size: 13px; color: var(--muted); display: block; margin-bottom: 6px; }
1077
+ input[type="text"], textarea, select {
1078
+ width: 100%;
1079
+ border: 1px solid var(--border);
1080
+ border-radius: 10px;
1081
+ padding: 10px 12px;
1082
+ font-size: 14px;
1083
+ font-family: inherit;
1084
+ margin-bottom: 12px;
1085
+ background: var(--card);
1086
+ color: var(--ink);
1087
+ }
1088
+ textarea { min-height: 80px; resize: vertical; }
1089
+ button {
1090
+ border: none;
1091
+ background: var(--brand);
1092
+ color: #fff;
1093
+ border-radius: 10px;
1094
+ padding: 9px 16px;
1095
+ font-size: 14px;
1096
+ cursor: pointer;
1097
+ }
1098
+ button:hover { filter: brightness(1.05); }
1099
+ button.secondary { background: #fff; color: var(--ink); border: 1px solid var(--border); }
1100
+ button.ghost { background: transparent; color: var(--ink-2); border: 1px solid var(--border); }
1101
+ button.danger { background: var(--err); }
1102
+ button:disabled { opacity: 0.5; cursor: not-allowed; }
1103
+ .row { display: flex; gap: 8px; }
1104
+ .row > * { flex: 1; }
1105
+ .muted { color: var(--muted); font-size: 12.5px; }
1106
+ .empty { color: var(--muted); font-size: 13px; text-align: center; padding: 18px; }
1107
+ .badge { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; }
1108
+ .badge.queued { background: #eef2f7; color: var(--muted); }
1109
+ .badge.running { background: var(--brand-soft); color: var(--brand); }
1110
+ .badge.done { background: #f0fdf4; color: var(--ok); }
1111
+ .badge.failed { background: #fef2f2; color: var(--err); }
1112
+
1113
+ /* ========== 模态框 ========== */
1114
+ .mask {
1115
+ position: fixed;
1116
+ inset: 0;
1117
+ background: rgba(15,23,42,0.45);
1118
+ z-index: 60;
1119
+ display: none;
1120
+ align-items: center;
1121
+ justify-content: center;
1122
+ }
1123
+ .mask.show { display: flex; }
1124
+ .modal {
1125
+ background: var(--card);
1126
+ border-radius: 16px;
1127
+ padding: 24px;
1128
+ width: 520px;
1129
+ max-width: 92vw;
1130
+ max-height: 88vh;
1131
+ overflow-y: auto;
1132
+ box-shadow: 0 20px 60px rgba(0,0,0,0.25);
1133
+ }
1134
+ .modal h3 { margin: 0 0 6px; font-size: 18px; }
1135
+ .modal .hint { color: var(--muted); font-size: 12.5px; margin: 0 0 16px; }
1136
+ .modal .footer { display: flex; gap: 8px; justify-content: flex-end; margin-top: 16px; }
1137
+ .close-x { float: right; cursor: pointer; color: var(--muted); font-size: 18px; }
1138
+
1139
+ /* ========== 下拉菜单 ========== */
1140
+ .dropdown { position: relative; }
1141
+ .dropdown-menu {
1142
+ position: absolute;
1143
+ bottom: 100%;
1144
+ left: 0;
1145
+ margin-bottom: 6px;
1146
+ background: var(--card);
1147
+ border: 1px solid var(--border);
1148
+ border-radius: 12px;
1149
+ box-shadow: 0 10px 30px rgba(0,0,0,0.12);
1150
+ min-width: 180px;
1151
+ display: none;
1152
+ z-index: 55;
1153
+ padding: 6px 0;
1154
+ }
1155
+ .dropdown-menu.show { display: block; }
1156
+ .dropdown-item { padding: 9px 14px; font-size: 13px; color: var(--ink-2); cursor: pointer; display: flex; align-items: center; gap: 8px; }
1157
+ .dropdown-item:hover { background: var(--bg); }
1158
+ .dropdown-divider { height: 1px; background: var(--line); margin: 6px 0; }
1159
+
1160
+ /* ========== 权限窗口 ========== */
1161
+ .perm-section { margin-bottom: 14px; }
1162
+ .perm-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; }
1163
+ .perm-row { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; font-size: 13px; }
1164
+ .perm-row input[type="checkbox"] { width: auto; margin: 0; }
1165
+ .perm-row label { margin: 0; color: var(--ink-2); }
1166
+
1167
+ /* ========== 智能体选择 ========== */
1168
+ .agent-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
1169
+ .agent-card { border: 1px solid var(--border); border-radius: 12px; padding: 14px; text-align: center; cursor: pointer; }
1170
+ .agent-card:hover, .agent-card.selected { border-color: var(--brand); background: var(--brand-soft); }
1171
+ .agent-card .icon { font-size: 24px; }
1172
+ .agent-card .title { font-size: 13px; font-weight: 600; margin-top: 6px; }
1173
+
1174
+ /* ========== 大模型管理 ========== */
1175
+ .model-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; max-height: 200px; overflow-y: auto; }
1176
+ .model-item {
1177
+ border: 1px solid var(--border);
1178
+ border-radius: 10px;
1179
+ padding: 10px 12px;
1180
+ display: flex;
1181
+ align-items: center;
1182
+ gap: 10px;
1183
+ background: var(--bg);
1184
+ }
1185
+ .model-item .mi-name { font-weight: 600; color: var(--ink); font-size: 13px; }
1186
+ .model-item .mi-base { font-size: 11px; color: var(--muted); word-break: break-all; }
1187
+ .model-item .mi-default { font-size: 11px; color: var(--ok); border: 1px solid #bbf7d0; background: #f0fdf4; border-radius: 6px; padding: 1px 6px; }
1188
+ .model-item .mi-actions { margin-left: auto; display: flex; gap: 6px; }
1189
+ .model-item .mi-actions button {
1190
+ border: 1px solid var(--border);
1191
+ background: var(--card);
1192
+ color: var(--ink-2);
1193
+ border-radius: 6px;
1194
+ padding: 4px 8px;
1195
+ cursor: pointer;
1196
+ font-size: 12px;
1197
+ }
1198
+ .model-item .mi-actions button:hover { background: var(--brand-soft); }
1199
+ .model-item .mi-actions button.danger { color: var(--err); }
1200
+ .model-form { border-top: 1px solid var(--line); padding-top: 14px; }
1201
+ .form-row { display: flex; gap: 10px; }
1202
+ .form-row .form-field { flex: 1; }
1203
+ .form-field { margin-bottom: 10px; }
1204
+ .form-field label { font-size: 12px; color: var(--muted); display: block; margin-bottom: 5px; }
1205
+ .form-field input {
1206
+ width: 100%;
1207
+ padding: 8px 10px;
1208
+ border: 1px solid var(--border);
1209
+ border-radius: 8px;
1210
+ background: var(--card);
1211
+ color: var(--ink);
1212
+ font-size: 13px;
1213
+ box-sizing: border-box;
1214
+ margin: 0;
1215
+ }
1216
+ .form-actions { display: flex; align-items: center; gap: 10px; margin-top: 4px; }
1217
+ .model-form-msg { font-size: 12px; color: var(--ok); }
1218
+ .model-form-msg.err { color: var(--err); }
1219
+ .primary { background: var(--brand); color: #fff; border: none; border-radius: 8px; padding: 8px 16px; cursor: pointer; font-size: 13px; font-weight: 600; }
1220
+ .ghost { background: var(--card); color: var(--ink-2); border: 1px solid var(--border); border-radius: 8px; padding: 8px 16px; cursor: pointer; font-size: 13px; }
1221
+ .primary.sm, .ghost.sm { padding: 5px 12px; font-size: 12px; }
1222
+
1223
+ /* ========== 设置面板 ========== */
1224
+ .settings-layout { display: flex; gap: 0; min-height: 360px; }
1225
+ .settings-nav { flex: 0 0 130px; border-right: 1px solid var(--line); padding-right: 8px; }
1226
+ .settings-cat { padding: 9px 10px; border-radius: 8px; cursor: pointer; font-size: 13px; color: var(--ink-2); }
1227
+ .settings-cat:hover { background: var(--bg); }
1228
+ .settings-cat.active { background: var(--brand-soft); color: var(--brand); font-weight: 600; }
1229
+ .settings-body { flex: 1; padding: 4px 4px 4px 16px; overflow-y: auto; }
1230
+ .settings-item {
1231
+ display: flex;
1232
+ align-items: center;
1233
+ gap: 12px;
1234
+ padding: 12px;
1235
+ border: 1px solid var(--border);
1236
+ border-radius: 10px;
1237
+ margin-bottom: 10px;
1238
+ cursor: pointer;
1239
+ background: var(--card);
1240
+ }
1241
+ .settings-item:hover { background: var(--brand-soft); }
1242
+ .settings-item .si-icon { font-size: 18px; }
1243
+ .settings-item .si-main { flex: 1; }
1244
+ .settings-item .si-title { font-weight: 600; font-size: 13.5px; color: var(--ink); }
1245
+ .settings-item .si-desc { font-size: 12px; color: var(--muted); }
1246
+ .settings-item .si-arrow { color: var(--muted); }
1247
+
1248
+ /* ========== 设置·大模型管理(简洁卡片风) ========== */
1249
+ .model-manage { margin-top: 4px; }
1250
+ .mm-list { display: flex; flex-direction: column; gap: 8px; }
1251
+ .mm-empty {
1252
+ padding: 28px 16px;
1253
+ text-align: center;
1254
+ color: var(--muted);
1255
+ font-size: 13px;
1256
+ background: var(--bg);
1257
+ border: 1px dashed var(--border);
1258
+ border-radius: 10px;
1259
+ }
1260
+ .mm-empty .mm-empty-icon { font-size: 28px; margin-bottom: 6px; opacity: 0.6; }
1261
+ .mm-empty .mm-empty-hint { font-size: 12px; margin-top: 4px; color: var(--muted); }
1262
+ .mm-card {
1263
+ display: flex;
1264
+ flex-direction: column;
1265
+ gap: 6px;
1266
+ padding: 12px 14px;
1267
+ border: 1px solid var(--border);
1268
+ border-radius: 10px;
1269
+ background: var(--card);
1270
+ transition: border-color 0.15s;
1271
+ }
1272
+ .mm-card:hover { border-color: var(--brand); }
1273
+ .mm-card-head { display: flex; align-items: center; gap: 8px; }
1274
+ .mm-card-name { font-weight: 600; font-size: 14px; color: var(--ink); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1275
+ .mm-default-tag {
1276
+ font-size: 11px;
1277
+ padding: 1px 7px;
1278
+ border-radius: 99px;
1279
+ background: var(--brand-soft);
1280
+ color: var(--brand);
1281
+ font-weight: 500;
1282
+ flex: 0 0 auto;
1283
+ }
1284
+ .mm-card-url {
1285
+ font-size: 12px;
1286
+ color: var(--muted);
1287
+ word-break: break-all;
1288
+ display: flex;
1289
+ align-items: center;
1290
+ gap: 4px;
1291
+ }
1292
+ .mm-card-url::before { content: '🔗'; font-size: 11px; opacity: 0.7; }
1293
+ .mm-card-meta { font-size: 11px; color: var(--muted); }
1294
+ .mm-card-actions {
1295
+ display: flex;
1296
+ gap: 4px;
1297
+ justify-content: flex-end;
1298
+ margin-top: 2px;
1299
+ border-top: 1px solid var(--line);
1300
+ padding-top: 8px;
1301
+ }
1302
+ .mm-act {
1303
+ font-size: 12px;
1304
+ padding: 4px 10px;
1305
+ border-radius: 6px;
1306
+ background: transparent;
1307
+ border: 1px solid var(--border);
1308
+ color: var(--ink-2);
1309
+ cursor: pointer;
1310
+ transition: all 0.15s;
1311
+ }
1312
+ .mm-act:hover { background: var(--bg); color: var(--ink); }
1313
+ .mm-act-primary { color: var(--brand); border-color: var(--brand-soft); }
1314
+ .mm-act-primary:hover { background: var(--brand-soft); }
1315
+ .mm-act-danger { color: var(--muted); }
1316
+ .mm-act-danger:hover { color: var(--err); background: transparent; }
1317
+ /* 分隔 */
1318
+ .mm-divider {
1319
+ display: flex;
1320
+ align-items: center;
1321
+ gap: 8px;
1322
+ margin: 16px 0 10px;
1323
+ font-size: 12px;
1324
+ color: var(--muted);
1325
+ }
1326
+ .mm-divider::before, .mm-divider::after {
1327
+ content: '';
1328
+ flex: 1;
1329
+ height: 1px;
1330
+ background: var(--line);
1331
+ }
1332
+ /* 表单 */
1333
+ .mm-form {
1334
+ display: flex;
1335
+ flex-direction: column;
1336
+ gap: 10px;
1337
+ padding: 14px;
1338
+ border: 1px solid var(--border);
1339
+ border-radius: 10px;
1340
+ background: var(--bg);
1341
+ }
1342
+ .mm-form-title { font-size: 13px; font-weight: 600; color: var(--ink); margin-bottom: 2px; }
1343
+ .mm-form input, .mm-form textarea {
1344
+ margin: 0;
1345
+ padding: 8px 10px;
1346
+ font-size: 13px;
1347
+ border: 1px solid var(--border);
1348
+ border-radius: 8px;
1349
+ background: var(--card);
1350
+ transition: border-color 0.15s;
1351
+ }
1352
+ .mm-form input:focus, .mm-form textarea:focus {
1353
+ outline: none;
1354
+ border-color: var(--brand);
1355
+ }
1356
+ .mm-form textarea { resize: vertical; min-height: 56px; font-family: inherit; }
1357
+ .mm-form-actions { display: flex; align-items: center; gap: 8px; margin-top: 2px; }
1358
+ .mm-form-actions .mm-form-msg { font-size: 12px; color: var(--muted); margin-left: auto; }
1359
+ .mm-form-actions .mm-form-msg.err { color: var(--err); }
1360
+
1361
+ /* ========== 底部上拉菜单 ========== */
1362
+ .bottom-sheet-mask {
1363
+ position: fixed;
1364
+ inset: 0;
1365
+ background: rgba(15,23,42,0.35);
1366
+ z-index: 70;
1367
+ display: none;
1368
+ flex-direction: column;
1369
+ justify-content: flex-end;
1370
+ }
1371
+ .bottom-sheet-mask.show { display: flex; }
1372
+ .bottom-sheet {
1373
+ background: var(--card);
1374
+ border-radius: 20px 20px 0 0;
1375
+ max-height: 80vh;
1376
+ overflow-y: auto;
1377
+ padding: 16px 0;
1378
+ box-shadow: 0 -10px 40px rgba(0,0,0,0.15);
1379
+ transform: translateY(100%);
1380
+ transition: transform 0.25s ease;
1381
+ }
1382
+ .bottom-sheet-mask.show .bottom-sheet { transform: translateY(0); }
1383
+ .sheet-header { padding: 8px 20px 16px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--line); margin-bottom: 6px; }
1384
+ .sheet-item { padding: 12px 20px; display: flex; align-items: center; gap: 12px; cursor: pointer; font-size: 14px; color: var(--ink-2); }
1385
+ .sheet-item:hover { background: var(--bg); }
1386
+ .sheet-item .icon { width: 22px; text-align: center; }
1387
+ .sheet-item .right { margin-left: auto; font-size: 12px; color: var(--muted); }
1388
+
1389
+ /* ========== 工作区 ========== */
1390
+ .workspace-box { border: 1px solid var(--border); border-radius: 10px; padding: 10px; background: var(--bg); }
1391
+ .workspace-cwd { font-size: 12px; color: var(--ink-2); word-break: break-all; margin-bottom: 8px; }
1392
+ .workspace-input { display: flex; gap: 6px; }
1393
+ .workspace-input input { flex: 1; margin: 0; font-size: 12px; padding: 6px 8px; }
1394
+ .workspace-input button { padding: 6px 10px; font-size: 12px; }
1395
+ .file-tree { margin-top: 8px; display: flex; flex-direction: column; gap: 2px; max-height: 220px; overflow-y: auto; }
1396
+ .file-item { padding: 5px 8px; border-radius: 6px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 6px; color: var(--ink-2); }
1397
+ .file-item:hover { background: var(--brand-soft); }
1398
+ .file-item.dir { font-weight: 500; }
1399
+ .file-item.drive-switcher { flex-direction: column; align-items: flex-start; padding: 8px; background: var(--bg); border: 1px dashed var(--border); }
1400
+ .drive-option { padding: 3px 10px; margin-top: 4px; border-radius: 4px; font-size: 11px; cursor: pointer; color: var(--ink-2); }
1401
+ .drive-option:hover { background: var(--brand-soft); color: var(--brand); }
1402
+
1403
+ /* ========== 文件芯片 ========== */
1404
+ .file-chip { display: inline-flex; align-items: center; gap: 6px; background: var(--brand-soft); color: var(--brand); padding: 4px 8px; border-radius: 6px; font-size: 12px; cursor: pointer; }
1405
+ .file-chip:hover { opacity: 0.85; }
1406
+ /* 输入区·待发送附件暂存(点发送时统一上传给 AI) */
1407
+ .staged-area {
1408
+ display: none;
1409
+ flex-wrap: wrap;
1410
+ gap: 6px;
1411
+ padding: 0 0 8px 0;
1412
+ border-bottom: 1px dashed var(--border);
1413
+ margin-bottom: 8px;
1414
+ }
1415
+ .staged-area.show { display: flex; }
1416
+ .staged-chip {
1417
+ display: inline-flex;
1418
+ align-items: center;
1419
+ gap: 6px;
1420
+ padding: 4px 4px 4px 8px;
1421
+ background: var(--brand-soft);
1422
+ color: var(--brand);
1423
+ border-radius: 6px;
1424
+ font-size: 12px;
1425
+ max-width: 240px;
1426
+ }
1427
+ .staged-chip .staged-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; }
1428
+ .staged-chip .staged-size { color: var(--muted); font-size: 11px; }
1429
+ .staged-chip .staged-remove {
1430
+ display: inline-flex;
1431
+ align-items: center;
1432
+ justify-content: center;
1433
+ width: 18px;
1434
+ height: 18px;
1435
+ border-radius: 50%;
1436
+ background: transparent;
1437
+ border: none;
1438
+ color: var(--brand);
1439
+ cursor: pointer;
1440
+ font-size: 14px;
1441
+ line-height: 1;
1442
+ padding: 0;
1443
+ }
1444
+ .staged-chip .staged-remove:hover { background: rgba(0,0,0,.08); }
1445
+ .staged-hint {
1446
+ font-size: 11px;
1447
+ color: var(--muted);
1448
+ align-self: center;
1449
+ margin-left: 4px;
1450
+ }
1451
+
1452
+ /* ========== 截图遮罩 ========== */
1453
+ .crop-overlay { position: fixed; inset: 0; z-index: 9999; background: rgba(0,0,0,0.35); cursor: crosshair; }
1454
+ .crop-tip { position: fixed; top: 16px; left: 50%; transform: translateX(-50%); background: rgba(0,0,0,0.7); color: #fff; padding: 6px 14px; border-radius: 20px; font-size: 13px; pointer-events: none; }
1455
+ .crop-selection { position: fixed; border: 2px dashed #fff; background: rgba(255,255,255,0.12); box-shadow: 0 0 0 9999px rgba(0,0,0,0.25); pointer-events: none; }
1456
+
1457
+ /* ========== Toast ========== */
1458
+ .toast {
1459
+ position: fixed;
1460
+ bottom: 24px;
1461
+ left: 50%;
1462
+ transform: translateX(-50%);
1463
+ background: #1f2933;
1464
+ color: #fff;
1465
+ padding: 10px 18px;
1466
+ border-radius: 10px;
1467
+ font-size: 13px;
1468
+ z-index: 80;
1469
+ opacity: 0;
1470
+ transition: 0.25s;
1471
+ pointer-events: none;
1472
+ }
1473
+ .toast.show { opacity: 1; }
1474
+
1475
+ /* ========== 隐藏文件输入 ========== */
1476
+ input[type="file"] { display: none; }
1477
+
1478
+ /* ========== 记忆系统 ========== */
1479
+ .stat-card { text-align: center; padding: 16px; }
1480
+ .stat-label { font-size: 12px; color: var(--muted); margin-bottom: 8px; }
1481
+ .stat-value { font-size: 24px; font-weight: 700; color: var(--brand); }
1482
+ .stat-date { font-size: 13px; color: var(--ink-2); font-weight: 400; }
1483
+ .memory-content { max-height: 60vh; overflow-y: auto; white-space: pre-wrap; font-family: "SF Mono", Monaco, monospace; font-size: 12.5px; line-height: 1.7; }
1484
+ .memory-content h1, .memory-content h2, .memory-content h3 { color: var(--brand); margin-top: 0; }
1485
+ .memory-content pre { background: var(--bg); padding: 12px; border-radius: 8px; overflow-x: auto; }
1486
+ .memory-content code { background: var(--bg); padding: 2px 6px; border-radius: 4px; font-size: 12px; }
1487
+
1488
+ /* ========== 欢迎引导弹窗 ========== */
1489
+ #welcomeGuideModal .modal { width: 480px; }
1490
+ .welcome-guide-header { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
1491
+ .welcome-guide-header .icon { font-size: 32px; }
1492
+ .welcome-guide-header h3 { margin: 0; font-size: 18px; }
1493
+ .welcome-guide-header p { margin: 4px 0 0; font-size: 12px; color: var(--muted); }
1494
+ .welcome-task-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
1495
+ .welcome-task-item {
1496
+ display: flex;
1497
+ align-items: center;
1498
+ gap: 12px;
1499
+ padding: 12px;
1500
+ border: 1px solid var(--border);
1501
+ border-radius: 10px;
1502
+ background: var(--bg);
1503
+ cursor: pointer;
1504
+ transition: all 0.15s;
1505
+ }
1506
+ .welcome-task-item:hover {
1507
+ border-color: var(--brand);
1508
+ background: var(--brand-soft);
1509
+ }
1510
+ .welcome-task-index {
1511
+ width: 28px;
1512
+ height: 28px;
1513
+ border-radius: 50%;
1514
+ background: var(--brand);
1515
+ color: #fff;
1516
+ display: flex;
1517
+ align-items: center;
1518
+ justify-content: center;
1519
+ font-size: 13px;
1520
+ font-weight: 700;
1521
+ flex-shrink: 0;
1522
+ }
1523
+ .welcome-task-content { flex: 1; min-width: 0; }
1524
+ .welcome-task-title { font-size: 13px; font-weight: 600; color: var(--ink); }
1525
+ .welcome-task-desc { font-size: 11px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1526
+ .welcome-task-run {
1527
+ padding: 4px 10px;
1528
+ border: 1px solid var(--brand);
1529
+ background: transparent;
1530
+ color: var(--brand);
1531
+ border-radius: 6px;
1532
+ font-size: 11px;
1533
+ cursor: pointer;
1534
+ flex-shrink: 0;
1535
+ transition: all 0.15s;
1536
+ }
1537
+ .welcome-task-run:hover {
1538
+ background: var(--brand);
1539
+ color: #fff;
1540
+ }
1541
+ .empty-welcome {
1542
+ text-align: center;
1543
+ padding: 20px;
1544
+ color: var(--muted);
1545
+ font-size: 13px;
1546
+ }