pi-web-ui 0.95.0 → 0.96.1

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 (75) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/bin/pi-web-ui.mjs +159 -31
  3. package/dist/server/agent-service.js +880 -240
  4. package/dist/server/approval-rules.js +56 -10
  5. package/dist/server/attachment-store.js +21 -4
  6. package/dist/server/attachments.js +30 -3
  7. package/dist/server/bg-servers.js +45 -7
  8. package/dist/server/claim-files-tool.js +4 -8
  9. package/dist/server/claim-store.js +4 -2
  10. package/dist/server/client-state.js +63 -14
  11. package/dist/server/compact-context-tool.js +6 -5
  12. package/dist/server/composer-drafts.js +9 -0
  13. package/dist/server/control-socket.js +57 -28
  14. package/dist/server/conversation-read-tool.js +7 -17
  15. package/dist/server/dangling-tools.js +72 -5
  16. package/dist/server/delegate-task.js +25 -28
  17. package/dist/server/dsh/dsh-agent-service.js +19 -6
  18. package/dist/server/edit-soft-tool.js +14 -11
  19. package/dist/server/eval-tool.js +67 -14
  20. package/dist/server/file-archives.js +16 -5
  21. package/dist/server/files-service.js +30 -11
  22. package/dist/server/goal-service.js +141 -19
  23. package/dist/server/hashline-engine.js +59 -21
  24. package/dist/server/host-guard.js +94 -0
  25. package/dist/server/i18n.js +3 -3
  26. package/dist/server/index.js +331 -78
  27. package/dist/server/lsp-tool.js +752 -60
  28. package/dist/server/mcp-bridge.js +47 -3
  29. package/dist/server/model-admin.js +94 -34
  30. package/dist/server/office-parse.js +96 -30
  31. package/dist/server/patch-tool.js +9 -15
  32. package/dist/server/permission-preset.js +25 -0
  33. package/dist/server/plan-manager.js +11 -1
  34. package/dist/server/plugin-catalog-sync.js +36 -19
  35. package/dist/server/plugin-catalog.js +11 -4
  36. package/dist/server/plugin-facilities.js +92 -21
  37. package/dist/server/plugin-installer.js +30 -0
  38. package/dist/server/plugin-llm.js +71 -65
  39. package/dist/server/plugin-project.js +70 -2
  40. package/dist/server/plugin-updater.js +115 -12
  41. package/dist/server/plugins.js +205 -44
  42. package/dist/server/present-files-tool.js +9 -12
  43. package/dist/server/process-utils.js +4 -0
  44. package/dist/server/prompt-composer.js +9 -0
  45. package/dist/server/protocol-version.js +1 -1
  46. package/dist/server/read-tool.js +69 -30
  47. package/dist/server/resolve-global-sdk.js +30 -16
  48. package/dist/server/schedule-agent-tool.js +12 -15
  49. package/dist/server/sdk-origin.js +18 -2
  50. package/dist/server/serialize.js +108 -21
  51. package/dist/server/settings-service.js +4 -2
  52. package/dist/server/skill-tool.js +5 -7
  53. package/dist/server/subagent-templates.js +51 -0
  54. package/dist/server/subagents.js +48 -72
  55. package/dist/server/terminals.js +181 -69
  56. package/dist/server/tool-manager.js +24 -7
  57. package/dist/server/tool-overrides.js +59 -0
  58. package/dist/server/update-check.js +28 -1
  59. package/dist/server/uploads.js +17 -2
  60. package/dist/server/wait-subscription-scan.js +18 -21
  61. package/dist/server/ws-client-id.js +29 -0
  62. package/dist/server/ws-pending-queue.js +60 -0
  63. package/extensions/webui.ts +60 -2
  64. package/package.json +4 -2
  65. package/plugins/catalog.json +20 -0
  66. package/themes/aetheris.css +457 -0
  67. package/themes/zhupi-dark.css +718 -0
  68. package/themes/zhupi.css +771 -0
  69. package/web/dist/assets/{TerminalPanel-DlGBF2MD.js → TerminalPanel-O3GyFIGG.js} +1 -1
  70. package/web/dist/assets/index-B7Zp23Vc.css +1 -0
  71. package/web/dist/assets/index-ByfoaDwp.js +366 -0
  72. package/web/dist/assets/{markdown-eUQn_o9D.js → markdown-DXwnfD9T.js} +1 -1
  73. package/web/dist/index.html +3 -3
  74. package/web/dist/assets/index-BXnCQL9p.js +0 -364
  75. package/web/dist/assets/index-RpIGFyi_.css +0 -1
@@ -0,0 +1,718 @@
1
+ /* theme-name: 朱批·夜 */
2
+ /* theme-name-en: Vermilion Night */
3
+ /* theme-group: builtin */
4
+ :root {
5
+ color-scheme: dark;
6
+ --bg: #131313;
7
+ --bg-elev: #1e1e1e;
8
+ --bg-elev2: #262626;
9
+ --bg-elev3: rgba(255, 255, 255, 0.06);
10
+ --border: #333333;
11
+ --border-soft: #2b2b2b;
12
+ --text: #eaeaea;
13
+ --text-dim: #a0a0a0;
14
+ --text-faint: #6e6e6e;
15
+ --accent: #e05a35;
16
+ --accent-soft: rgba(224, 90, 53, 0.14);
17
+ --green: #64a874;
18
+ --green-soft: rgba(100, 168, 116, 0.14);
19
+ --red: #e0654e;
20
+ --red-soft: rgba(224, 101, 78, 0.14);
21
+ --amber: #d4a24a;
22
+ --blue: #7a9cc9;
23
+ --blue-soft: rgba(122, 156, 201, 0.14);
24
+ --term-bg: #0f0f0f;
25
+ --term-fg: #eaeaea;
26
+ --term-cursor: #e05a35;
27
+ --term-cursor-accent: #0f0f0f;
28
+ --term-selection: rgba(224, 90, 53, 0.35);
29
+ --term-black: #262626;
30
+ --term-red: #e0654e;
31
+ --term-green: #7ab88a;
32
+ --term-yellow: #d4a24a;
33
+ --term-blue: #85a8d8;
34
+ --term-magenta: #bd8fb8;
35
+ --term-cyan: #6fb5ad;
36
+ --term-white: #eaeaea;
37
+ --term-bright-black: #6e6e6e;
38
+ --term-bright-red: #ef7a60;
39
+ --term-bright-green: #8fc99e;
40
+ --term-bright-yellow: #e3b45c;
41
+ --term-bright-blue: #9db8e2;
42
+ --term-bright-magenta: #cf9fc9;
43
+ --term-bright-cyan: #85c4bc;
44
+ --term-bright-white: #ffffff;
45
+ --mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
46
+ --serif: "Noto Serif SC", "Source Han Serif SC", "Songti SC", STSong, SimSun, Georgia, "Times New Roman", serif;
47
+ --mermaid-font-size: 12px;
48
+ --sans:
49
+ -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Roboto,
50
+ Helvetica, Arial, sans-serif;
51
+ --tooltip-bg: #2a2a2a;
52
+ --code-bg: #0f0f0f;
53
+ --code-text: #d6d6d6;
54
+ --code-border: transparent;
55
+ --code-pad: 0;
56
+ --card-body-pad: 4px 14px 12px;
57
+ --err-text: #ef8270;
58
+ --red-text: #ef8270;
59
+ --amber-text: #e3b45c;
60
+ --info-blue: #85a8d8;
61
+ --link: #e58a67;
62
+ --link-hover: #ef9c7e;
63
+ --link-soft: #5a3020;
64
+ --md-strong: #f2f2f2;
65
+ --skill-blue: #85a8d8;
66
+ --plugin-purple: #b394cc;
67
+ --auth-green: #8fc99e;
68
+ --scroll-thumb: rgba(255, 255, 255, 0.14);
69
+ --scroll-thumb-hover: rgba(224, 90, 53, 0.45);
70
+ --notice-err-bg: #33231f;
71
+ --notice-warn-bg: #322a1c;
72
+ --notice-info-bg: #20262e;
73
+ --notice-err-border: #e0654e;
74
+ --notice-warn-border: #d4a24a;
75
+ --notice-info-border: #7a9cc2;
76
+ --send-blue: #e05a35;
77
+ --send-blue-hover: #ef6f48;
78
+ --stop-red: #c2402a;
79
+ --stop-red-hover: #e05a35;
80
+ --brand-grad-a: #e05a35;
81
+ --brand-grad-b: #d4a24a;
82
+ --on-amber: #131313;
83
+ --search-active-fg: #131313;
84
+ --switch-knob: #eaeaea;
85
+ --sunken-bg: rgba(0, 0, 0, 0.25);
86
+ --glow-015: rgba(255, 255, 255, 0.015);
87
+ --glow-025: rgba(255, 255, 255, 0.025);
88
+ --glow-03: rgba(255, 255, 255, 0.03);
89
+ --glow-04: rgba(255, 255, 255, 0.04);
90
+ --glow-05: rgba(255, 255, 255, 0.05);
91
+ --glow-12: rgba(255, 255, 255, 0.12);
92
+ --glow-18: rgba(255, 255, 255, 0.18);
93
+ --glow-22: rgba(255, 255, 255, 0.22);
94
+ --glow-38: rgba(255, 255, 255, 0.38);
95
+ --control-fg: #a0a0a0;
96
+ --control-bg: #262626;
97
+ --control-border: #333333;
98
+ --bg-image: none;
99
+ --bg-image-dim: 0.85;
100
+ --bg-image-blur: 0px;
101
+ --wallpaper-panel-alpha: 100%;
102
+ --topbar-bg: #131313;
103
+ --statusbar-bg: #131313;
104
+ --panel-bg: #222222;
105
+ --card-bg: #262626;
106
+ --chip-bg: #1e1e1e;
107
+ --msgs-bg: #131313;
108
+ --inputbox-bg: #1e1e1e;
109
+ --menu-bg: #2a2a2a;
110
+ }
111
+
112
+ /* =========================================================================
113
+ 朱批·夜 · Vermilion Night
114
+ 「朱批」的暖墨夜用版:同一套稿纸排版语言(无气泡 / 台账行 / ※脚注 /
115
+ 命令栏),色板换成深暖墨底 + 纸色文字,朱红提亮保对比。
116
+ ========================================================================= */
117
+
118
+ /* ---- 0. 夜纸底色:墨面的天头微光与角落沉暗 ---- */
119
+ body,
120
+ .app-root {
121
+ background-color: var(--bg);
122
+ background-image:
123
+ radial-gradient(ellipse 90% 55% at 50% -8%, rgba(255, 255, 255, 0.04) 0%, rgba(255, 255, 255, 0) 70%),
124
+ radial-gradient(ellipse 100% 70% at 108% 112%, rgba(0, 0, 0, 0.35) 0%, rgba(0, 0, 0, 0) 70%);
125
+ background-attachment: fixed;
126
+ }
127
+
128
+ ::selection {
129
+ background: rgba(224, 90, 53, 0.32);
130
+ }
131
+
132
+ /* ---- 1. 顶栏隐形化:无底色层次,只一条 hairline,印章品牌 ---- */
133
+ .topbar {
134
+ background: var(--topbar-bg) !important;
135
+ border-bottom: 1px solid var(--border-soft) !important;
136
+ box-shadow: none !important;
137
+ }
138
+
139
+ .brand-logo {
140
+ background: var(--accent) !important;
141
+ color: #131313 !important;
142
+ border-radius: 2px !important;
143
+ box-shadow: none !important;
144
+ }
145
+
146
+ .brand-name {
147
+ font-family: var(--serif);
148
+ font-weight: 700;
149
+ letter-spacing: 0.06em;
150
+ }
151
+
152
+ /* 顶栏控件全部素色化:无底无框,hover 才现 hairline。兜底所有 button /
153
+ * [role=button]——不管类名是谁(基线 chip / 插件注入 / capsule 等),顶栏里
154
+ * 一律裸图标,dropdown 触发器不许再带盒子。 */
155
+ .topbar button,
156
+ .topbar [role="button"],
157
+ .topbar a.chip,
158
+ .topbar .chip {
159
+ background: transparent !important;
160
+ border: 1px solid transparent !important;
161
+ border-radius: 3px !important;
162
+ box-shadow: none !important;
163
+ transition:
164
+ border-color 0.15s ease,
165
+ color 0.15s ease !important;
166
+ }
167
+
168
+ .topbar button:hover,
169
+ .topbar [role="button"]:hover,
170
+ .topbar a.chip:hover,
171
+ .topbar .chip:hover {
172
+ border-color: var(--border) !important;
173
+ background: transparent !important;
174
+ }
175
+
176
+ .topbar .dropdown {
177
+ background: transparent !important;
178
+ border: none !important;
179
+ box-shadow: none !important;
180
+ }
181
+
182
+ /* ---- 2. 消息区:左缘墨线活动脊 + 文档化排版 ----
183
+ * 列缘这条线让给脊线与输入框边框:脊线(虚线针脚)与输入框左边框同一条
184
+ * 像素线,历史虚下来、接到输入框变实;消息正文整体右移 23px 挂在轨上。
185
+ * 仅桌面(≥641px)启用;手机保持原生内缩。 */
186
+ @media (min-width: 641px) {
187
+ .messages {
188
+ padding-inline: max(0px, calc(var(--chat-inset) + 23px - var(--msgs-gutter, 0px))) !important;
189
+ background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.14) 40%, transparent 0);
190
+ background-repeat: repeat-y;
191
+ background-size: 1px 7px;
192
+ background-position: calc(var(--chat-inset) - 0.5px) top;
193
+ }
194
+ }
195
+
196
+ .msg {
197
+ position: relative;
198
+ padding: 2px 0 10px;
199
+ }
200
+
201
+ /* 操作按钮:行内簇已提升为基线默认(.chead-actions,随消息悬停显隐、
202
+ 与行内复制按钮并排),主题里不再需要任何覆盖。 */
203
+
204
+ /* 兜底路径(用户消息 / 纯文本回复,无 head 可宿主):底部操作行改为悬停
205
+ 浮牌,钉在消息右上角的空纸面上 */
206
+ .msg-actions {
207
+ position: absolute;
208
+ top: 0;
209
+ right: 0;
210
+ margin: 0;
211
+ z-index: 2;
212
+ padding: 2px;
213
+ background: var(--menu-bg) !important;
214
+ border: 1px solid var(--border) !important;
215
+ border-radius: 4px !important;
216
+ box-shadow: 0 4px 14px -4px rgba(0, 0, 0, 0.5) !important;
217
+ opacity: 0;
218
+ pointer-events: none;
219
+ transition:
220
+ opacity 0.12s ease,
221
+ pointer-events 0.12s ease;
222
+ }
223
+
224
+ .msg:hover .msg-actions,
225
+ .msg-actions.has-open-dropdown,
226
+ .msg-actions:focus-within {
227
+ opacity: 1;
228
+ pointer-events: auto;
229
+ }
230
+
231
+ /* 角色行:书目式小标 */
232
+ .msg-meta {
233
+ margin-bottom: 4px;
234
+ }
235
+
236
+ /* head 行左右内边距归零:折叠三角贴齐列左缘(文字同一条线),右侧复制
237
+ * 按钮贴右缘——head 无边框后,钮与缘之间不能悬空。三角形 28px 盒内 16px
238
+ * 图标居中内缩 6px,用负外边距做光学对齐。 */
239
+ .chead {
240
+ padding-left: 0;
241
+ padding-right: 0;
242
+ }
243
+
244
+ .chead-toggle {
245
+ margin-left: -6px;
246
+ }
247
+
248
+ /* 正文块上的单一复制键同样去重:消息复制已在 head 行的操作簇里 */
249
+ .msg-text-copy {
250
+ display: none !important;
251
+ }
252
+
253
+ /* head 悬浮不再出现底色块:纸面保持完全平整(键盘 focus 的 outline 保留,
254
+ * 只服务键盘导航) */
255
+ div.chead[role="button"]:hover,
256
+ .chead-toggle:hover {
257
+ background: transparent !important;
258
+ }
259
+
260
+ .msg-role {
261
+ font-size: 10.5px;
262
+ font-weight: 600;
263
+ letter-spacing: 0.18em;
264
+ color: var(--text-faint);
265
+ }
266
+
267
+ .msg-time {
268
+ font-family: var(--mono);
269
+ font-size: 10.5px;
270
+ }
271
+
272
+ /* ---- 3. 用户输入:去气泡,「起手式,夜纸批注体 ---- */
273
+ .msg-user .msg-body {
274
+ position: relative;
275
+ background: transparent !important;
276
+ border: none !important;
277
+ border-radius: 0 !important;
278
+ padding: 0 0 0 1.5em !important;
279
+ font-family: var(--serif);
280
+ font-size: 15.5px;
281
+ font-weight: 600;
282
+ line-height: 1.8;
283
+ color: var(--text);
284
+ }
285
+
286
+ .msg-user .msg-body::before {
287
+ content: "「";
288
+ position: absolute;
289
+ left: 0;
290
+ top: -0.12em;
291
+ font-family: var(--serif);
292
+ font-size: 1.3em;
293
+ font-weight: 700;
294
+ color: var(--accent);
295
+ line-height: 1;
296
+ }
297
+
298
+ /* ---- 4. 助手正文:衬线文档体 ---- */
299
+ .msg-assistant .msg-text {
300
+ font-family: var(--serif);
301
+ font-size: 15px;
302
+ line-height: 1.85;
303
+ color: var(--text);
304
+ }
305
+
306
+ .msg-assistant .msg-text p:first-child {
307
+ margin-top: 0;
308
+ }
309
+
310
+ .msg-assistant .msg-text h1,
311
+ .msg-assistant .msg-text h2,
312
+ .msg-assistant .msg-text h3,
313
+ .msg-assistant .msg-text h4 {
314
+ font-family: var(--serif);
315
+ font-weight: 700;
316
+ color: var(--md-strong);
317
+ letter-spacing: 0.02em;
318
+ }
319
+
320
+ .msg-assistant .msg-text blockquote {
321
+ border-left: 2px solid var(--accent-soft);
322
+ font-style: normal;
323
+ color: var(--text-dim);
324
+ }
325
+
326
+ .msg-assistant .msg-text a {
327
+ color: var(--link);
328
+ text-decoration: underline dotted;
329
+ text-decoration-color: rgba(224, 90, 53, 0.5);
330
+ text-underline-offset: 3px;
331
+ }
332
+
333
+ .msg-assistant .msg-text hr {
334
+ border: none;
335
+ border-top: 1px dotted var(--border);
336
+ }
337
+
338
+ .msg-assistant .msg-text code {
339
+ background: #2a2a2a;
340
+ color: #e5957a;
341
+ border-radius: 2px;
342
+ padding: 1px 5px;
343
+ }
344
+
345
+ /* ---- 5. 工具调用 = 台账行:无框无底,点线引导符填空 ---- */
346
+ .toolcall {
347
+ margin: 1px 0 !important;
348
+ border: none !important;
349
+ border-radius: 0 !important;
350
+ background: transparent !important;
351
+ box-shadow: none !important;
352
+ overflow: visible !important;
353
+ }
354
+
355
+ .toolcall-head {
356
+ display: flex;
357
+ align-items: center;
358
+ min-height: 24px;
359
+ padding: 2px 0;
360
+ font-family: var(--mono);
361
+ font-size: 12px;
362
+ }
363
+
364
+ .toolcall-name {
365
+ font-family: var(--mono) !important;
366
+ font-weight: 500 !important;
367
+ font-size: 12px !important;
368
+ letter-spacing: 0.02em;
369
+ color: var(--text-dim) !important;
370
+ }
371
+
372
+ /* 点线引导符:账本目录式填空 */
373
+ .toolcall .toolcall-spacer {
374
+ border-bottom: 1px dotted #3f3f3f;
375
+ height: 0.7em;
376
+ margin: 0 10px;
377
+ }
378
+
379
+ .toolcall-status {
380
+ color: var(--text-faint) !important;
381
+ }
382
+
383
+ .toolcall.run .toolcall-name {
384
+ color: var(--accent) !important;
385
+ }
386
+
387
+ .toolcall.run .toolcall-status {
388
+ color: var(--accent) !important;
389
+ }
390
+
391
+ .toolcall.ok .toolcall-status {
392
+ color: var(--green) !important;
393
+ }
394
+
395
+ .toolcall.err .toolcall-status {
396
+ color: var(--red) !important;
397
+ }
398
+
399
+ .toolcall.err .toolcall-name {
400
+ color: var(--red) !important;
401
+ }
402
+
403
+ /* 展开的参数/输出:并入台账,无框零内边距平面文本(--code-border/--code-pad
404
+ 已按全透明主题机制置 transparent/0,连带 .termline 一并生效) */
405
+ .toolcall-args pre,
406
+ .toolcall-output pre {
407
+ background: transparent !important;
408
+ border: none !important;
409
+ border-radius: 0 !important;
410
+ padding: 0 !important;
411
+ }
412
+
413
+ /* 工具卡体:去掉分隔线与内边距,参数/输出与卡头同距平铺 */
414
+ .toolcall-body {
415
+ border-top: none !important;
416
+ padding: 0 0 6px !important;
417
+ }
418
+
419
+ /* 卡内重复的终端图标只剩噪音(卡头已有工具图标),参照全透明主题隐藏 */
420
+ .termline-icon {
421
+ display: none;
422
+ }
423
+
424
+ .toolcall-output-label {
425
+ margin-top: 6px;
426
+ }
427
+
428
+ .toolcall-kill {
429
+ border-radius: 3px;
430
+ }
431
+
432
+ /* ---- 6. 思考流 = 脚注:※ 起手,淡墨小字 ---- */
433
+ .thinking {
434
+ margin: 4px 0 !important;
435
+ border: none !important;
436
+ border-radius: 0 !important;
437
+ background: transparent !important;
438
+ box-shadow: none !important;
439
+ }
440
+
441
+ .thinking-head {
442
+ font-size: 12px;
443
+ color: var(--text-faint);
444
+ }
445
+
446
+ .thinking-icon {
447
+ color: var(--text-faint) !important;
448
+ }
449
+
450
+ .thinking-body {
451
+ border-top: none !important;
452
+ font-style: normal !important;
453
+ font-size: 12.5px !important;
454
+ color: var(--text-dim) !important;
455
+ background: transparent;
456
+ position: relative;
457
+ padding: 2px 14px 2px 1.6em !important;
458
+ }
459
+
460
+ .thinking-body::before {
461
+ content: "※";
462
+ position: absolute;
463
+ left: 0;
464
+ top: 2px;
465
+ color: var(--text-faint);
466
+ }
467
+
468
+ .thinking-live .thinking-toggle,
469
+ .thinking-live-label {
470
+ color: var(--accent) !important;
471
+ }
472
+
473
+ /* ---- 7. 折叠摘要行 / 报错:并入台账体系 ---- */
474
+ .msg-collapsed {
475
+ background: transparent !important;
476
+ border: none !important;
477
+ border-bottom: 1px dotted var(--border-soft) !important;
478
+ border-radius: 0 !important;
479
+ box-shadow: none !important;
480
+ padding-left: 0 !important;
481
+ padding-right: 0 !important;
482
+ }
483
+
484
+ .msg-collapsed-action::before {
485
+ margin-left: 0 !important;
486
+ }
487
+
488
+ .msg-error {
489
+ background: var(--red-soft) !important;
490
+ border: none !important;
491
+ border-left: 3px solid var(--red) !important;
492
+ border-radius: 0 !important;
493
+ font-family: var(--serif);
494
+ }
495
+
496
+ /* ---- 8. 输入区 = 命令栏:与其他主题同构——只动颜色不动几何,
497
+ 朱笔以 inset 阴影画在边框内侧,外缘与脊线恒对齐 ---- */
498
+ .inputbar {
499
+ background: transparent !important;
500
+ }
501
+
502
+ .inputbox {
503
+ background: var(--inputbox-bg) !important;
504
+ border: none !important;
505
+ border-radius: 3px !important;
506
+ box-shadow: inset 3px 0 0 0 rgba(224, 90, 53, 0.4) !important;
507
+ transition:
508
+ border-color 0.2s ease,
509
+ box-shadow 0.2s ease !important;
510
+ }
511
+
512
+ .inputbox:focus-within {
513
+ border: none !important;
514
+ box-shadow: inset 3px 0 0 0 var(--accent) !important;
515
+ }
516
+
517
+ .btn.send {
518
+ background: var(--send-blue) !important;
519
+ color: #131313 !important;
520
+ border-radius: 50% !important;
521
+ box-shadow: none !important;
522
+ font-weight: 600;
523
+ }
524
+
525
+ .btn.send:hover {
526
+ background: var(--send-blue-hover) !important;
527
+ }
528
+
529
+ .btn.stop {
530
+ background: var(--stop-red) !important;
531
+ color: #131313 !important;
532
+ border-radius: 50% !important;
533
+ }
534
+
535
+ /* 输入框底部模型选择、思考强度、预设等按钮:去边框、透明底,hover 现 hairline */
536
+ .composer-tools {
537
+ border-top: none !important;
538
+ }
539
+
540
+ .composer-tools .chip,
541
+ .composer-tools .capsule-segment {
542
+ font-size: 13px !important;
543
+ padding: 4px 10px !important;
544
+ gap: 6px !important;
545
+ background: transparent !important;
546
+ border: 1px solid transparent !important;
547
+ box-shadow: none !important;
548
+ border-radius: 3px !important;
549
+ transition:
550
+ border-color 0.15s ease,
551
+ background 0.15s ease !important;
552
+ }
553
+
554
+ .composer-tools .model-thinking-capsule {
555
+ background: transparent !important;
556
+ border: none !important;
557
+ box-shadow: none !important;
558
+ padding: 0 !important;
559
+ }
560
+
561
+ .composer-tools .model-thinking-capsule .capsule-divider {
562
+ display: none !important;
563
+ }
564
+
565
+ .composer-tools .chip:hover,
566
+ .composer-tools .capsule-segment:hover {
567
+ border-color: var(--border) !important;
568
+ background: transparent !important;
569
+ }
570
+
571
+ .composer-tools-left {
572
+ gap: 6px !important;
573
+ }
574
+
575
+ .composer-tools .chip-model,
576
+ .composer-tools .chip-sub,
577
+ .composer-tools .capsule-model-name,
578
+ .composer-tools .capsule-thinking-text {
579
+ font-size: 12.5px !important;
580
+ }
581
+
582
+ /* ---- 9. 底栏 / 状态栏:hairline 收边 ---- */
583
+ .statusbar {
584
+ background: var(--statusbar-bg) !important;
585
+ border-top: 1px solid var(--border-soft) !important;
586
+ box-shadow: none !important;
587
+ }
588
+
589
+ .goalbar {
590
+ background: transparent !important;
591
+ border-top: 1px solid var(--border-soft) !important;
592
+ box-shadow: none !important;
593
+ }
594
+
595
+ /* ---- 10. 左右面板:素纸文件栏 ----
596
+ * 激活态不做红洗(accent-soft 洗在墨底上是一块脏褐),改为中性纸面 7% +
597
+ * 左缘 2px 朱标;圆角统一 8px。 */
598
+ .panel {
599
+ background: var(--panel-bg) !important;
600
+ border-color: var(--border-soft) !important;
601
+ }
602
+
603
+ .session-item,
604
+ .project-item,
605
+ .file-item,
606
+ .scm-file {
607
+ border-radius: 8px;
608
+ }
609
+
610
+ .session-item.active,
611
+ .project-item.active {
612
+ background: rgba(255, 255, 255, 0.07);
613
+ border: none;
614
+ box-shadow: inset 2px 0 0 var(--accent);
615
+ }
616
+
617
+ .session-item.active {
618
+ padding: 8px 10px;
619
+ }
620
+
621
+ .project-item.active {
622
+ padding: 7px 10px;
623
+ }
624
+
625
+ /* ---- 11. 代码块:墨面凹版 ---- */
626
+ .codeblock {
627
+ background: var(--code-bg) !important;
628
+ border: 1px solid var(--border-soft) !important;
629
+ border-radius: 3px !important;
630
+ box-shadow: none !important;
631
+ }
632
+
633
+ .codeblock pre,
634
+ .msg-text pre {
635
+ background: var(--code-bg) !important;
636
+ color: var(--code-text) !important;
637
+ }
638
+
639
+ /* ---- 11b. 语法高亮去蓝底,转暖墨 ---- */
640
+ .hljs {
641
+ color: #d8d0bd;
642
+ background: transparent !important;
643
+ }
644
+
645
+ .hljs-deletion {
646
+ color: #f0a896;
647
+ background: rgba(224, 106, 80, 0.16);
648
+ }
649
+
650
+ .hljs-addition {
651
+ color: #a8d4a8;
652
+ background: rgba(111, 174, 127, 0.16);
653
+ }
654
+
655
+ /* ---- 12. 弹层与菜单:实底 + hairline,方角家族 ---- */
656
+ .modal,
657
+ .tool-info-modal,
658
+ .settings-modal,
659
+ .model-modal,
660
+ .tpl-modal,
661
+ .dd-menu,
662
+ .dialog-inline {
663
+ border-radius: 4px !important;
664
+ border: 1px solid var(--border) !important;
665
+ box-shadow:
666
+ 0 1px 2px rgba(0, 0, 0, 0.3),
667
+ 0 16px 40px -12px rgba(0, 0, 0, 0.55) !important;
668
+ }
669
+
670
+ .dd-menu {
671
+ background: var(--menu-bg) !important;
672
+ border: 1px solid var(--border) !important;
673
+ border-radius: 4px !important;
674
+ box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.6) !important;
675
+ }
676
+
677
+ .dd-item:hover,
678
+ .dd-all-item:hover {
679
+ background: var(--accent-soft) !important;
680
+ }
681
+
682
+ /* ---- 13. chips / 徽标:账目标签体 ---- */
683
+ .chip {
684
+ background: var(--chip-bg) !important;
685
+ border: 1px solid var(--border-soft) !important;
686
+ border-radius: 2px !important;
687
+ box-shadow: none !important;
688
+ font-family: var(--mono);
689
+ font-size: 11px;
690
+ }
691
+
692
+ /* ---- 14. 滚动条:细墨线 ---- */
693
+ ::-webkit-scrollbar {
694
+ width: 6px;
695
+ height: 6px;
696
+ }
697
+
698
+ ::-webkit-scrollbar-track {
699
+ background: transparent;
700
+ }
701
+
702
+ ::-webkit-scrollbar-thumb {
703
+ background: var(--scroll-thumb);
704
+ border-radius: 0;
705
+ }
706
+
707
+ ::-webkit-scrollbar-thumb:hover {
708
+ background: var(--scroll-thumb-hover);
709
+ }
710
+
711
+ /* ---- 15. 通知条:hairline 左线式 ---- */
712
+ .notice-err,
713
+ .notice-warn,
714
+ .notice-info {
715
+ border-radius: 0 !important;
716
+ border-width: 1px !important;
717
+ border-left-width: 3px !important;
718
+ }