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,771 @@
1
+ /* theme-name: 朱批 */
2
+ /* theme-name-en: Vermilion Manuscript */
3
+ /* theme-group: builtin */
4
+ :root {
5
+ color-scheme: light;
6
+ --bg: #f5f1e8;
7
+ --bg-elev: #f0ebdf;
8
+ --bg-elev2: #fbf8f1;
9
+ --bg-elev3: rgba(38, 34, 24, 0.05);
10
+ --border: #dad2c0;
11
+ --border-soft: #e6dfcf;
12
+ --text: #262218;
13
+ --text-dim: #6e6656;
14
+ --text-faint: #9a9078;
15
+ --accent: #bf3b1f;
16
+ --accent-soft: rgba(191, 59, 31, 0.1);
17
+ --green: #3d7a55;
18
+ --green-soft: rgba(61, 122, 85, 0.12);
19
+ --red: #c2402a;
20
+ --red-soft: rgba(194, 64, 42, 0.1);
21
+ --amber: #a8722a;
22
+ --blue: #3a5fa0;
23
+ --blue-soft: rgba(58, 95, 160, 0.12);
24
+ --term-bg: #2a2620;
25
+ --term-fg: #e8e2d4;
26
+ --term-cursor: #d95a35;
27
+ --term-cursor-accent: #2a2620;
28
+ --term-selection: rgba(217, 90, 53, 0.35);
29
+ --term-black: #2a2620;
30
+ --term-red: #d95a35;
31
+ --term-green: #7ba05b;
32
+ --term-yellow: #d9a441;
33
+ --term-blue: #7a97c2;
34
+ --term-magenta: #b07da8;
35
+ --term-cyan: #6aa8a0;
36
+ --term-white: #e8e2d4;
37
+ --term-bright-black: #8a8272;
38
+ --term-bright-red: #e87350;
39
+ --term-bright-green: #97bd77;
40
+ --term-bright-yellow: #e8bb5f;
41
+ --term-bright-blue: #96b1d8;
42
+ --term-bright-magenta: #c99cc2;
43
+ --term-bright-cyan: #86c2ba;
44
+ --term-bright-white: #fffdf7;
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: #fffdf7;
52
+ --code-bg: #efe9db;
53
+ --code-text: #33301f;
54
+ --code-border: transparent;
55
+ --code-pad: 0;
56
+ --card-body-pad: 4px 14px 12px;
57
+ --err-text: #a03618;
58
+ --red-text: #a03618;
59
+ --amber-text: #8a5c1e;
60
+ --info-blue: #3a5fa0;
61
+ --link: #a03618;
62
+ --link-hover: #bf3b1f;
63
+ --link-soft: #e8c9b8;
64
+ --md-strong: #1a160e;
65
+ --skill-blue: #3a5fa0;
66
+ --plugin-purple: #7a5296;
67
+ --auth-green: #3d7a55;
68
+ --scroll-thumb: rgba(38, 34, 24, 0.18);
69
+ --scroll-thumb-hover: rgba(191, 59, 31, 0.4);
70
+ --notice-err-bg: #f5e0d8;
71
+ --notice-warn-bg: #f2e8d4;
72
+ --notice-info-bg: #e2e8ef;
73
+ --notice-err-border: #c2402a;
74
+ --notice-warn-border: #a8722a;
75
+ --notice-info-border: #3a5fa0;
76
+ --send-blue: #bf3b1f;
77
+ --send-blue-hover: #a53118;
78
+ --stop-red: #c2402a;
79
+ --stop-red-hover: #a03618;
80
+ --brand-grad-a: #bf3b1f;
81
+ --brand-grad-b: #a8722a;
82
+ --on-amber: #fffdf7;
83
+ --search-active-fg: #fffdf7;
84
+ --switch-knob: #fffdf7;
85
+ --sunken-bg: rgba(38, 34, 24, 0.06);
86
+ --glow-015: rgba(38, 34, 24, 0.015);
87
+ --glow-025: rgba(38, 34, 24, 0.025);
88
+ --glow-03: rgba(38, 34, 24, 0.03);
89
+ --glow-04: rgba(38, 34, 24, 0.04);
90
+ --glow-05: rgba(38, 34, 24, 0.05);
91
+ --glow-12: rgba(38, 34, 24, 0.12);
92
+ --glow-18: rgba(38, 34, 24, 0.18);
93
+ --glow-22: rgba(38, 34, 24, 0.22);
94
+ --glow-38: rgba(38, 34, 24, 0.38);
95
+ --control-fg: #6e6656;
96
+ --control-bg: #fbf8f1;
97
+ --control-border: #dad2c0;
98
+ --bg-image: none;
99
+ --bg-image-dim: 0.85;
100
+ --bg-image-blur: 0px;
101
+ --wallpaper-panel-alpha: 100%;
102
+ --topbar-bg: #f5f1e8;
103
+ --statusbar-bg: #f5f1e8;
104
+ --panel-bg: #f0ebdf;
105
+ --card-bg: #fbf8f1;
106
+ --chip-bg: #f0ebdf;
107
+ --msgs-bg: #f5f1e8;
108
+ --inputbox-bg: #fbf8f1;
109
+ --menu-bg: #fffdf7;
110
+ }
111
+
112
+ /* =========================================================================
113
+ 朱批 · Vermilion Manuscript
114
+ 整个界面从「聊天气泡」重构成「一张被 AI 做批注的稿纸」:
115
+ · 无气泡、无头像 —— 人机内容同处一条全宽文档流
116
+ · 工具调用 = 台账行(等宽小字 + 点线引导符)
117
+ · 思考流 = 脚注体(※ 起手)
118
+ · 左缘 1px 墨线活动脊贯穿消息区
119
+ · 输入框 = 命令栏,左缘一抹朱笔
120
+ · 色彩只有语义:墨、淡墨、朱(唯一强调)、印绿
121
+ ========================================================================= */
122
+
123
+ /* ---- 0. 稿纸底色:旧纸的暗角与天头微光,纯渐变无图 ---- */
124
+ body,
125
+ .app-root {
126
+ background-color: var(--bg);
127
+ background-image:
128
+ radial-gradient(ellipse 90% 55% at 50% -8%, rgba(255, 253, 247, 0.85) 0%, rgba(255, 253, 247, 0) 70%),
129
+ radial-gradient(ellipse 100% 70% at 108% 112%, rgba(166, 140, 100, 0.1) 0%, rgba(166, 140, 100, 0) 70%);
130
+ background-attachment: fixed;
131
+ }
132
+
133
+ ::selection {
134
+ background: rgba(191, 59, 31, 0.18);
135
+ }
136
+
137
+ /* ---- 1. 顶栏隐形化:无底色层次,只一条 hairline,印章品牌 ---- */
138
+ .topbar {
139
+ background: var(--topbar-bg) !important;
140
+ border-bottom: 1px solid var(--border-soft) !important;
141
+ box-shadow: none !important;
142
+ }
143
+
144
+ .brand-logo {
145
+ background: var(--accent) !important;
146
+ color: #f6f2e9 !important;
147
+ border-radius: 2px !important;
148
+ box-shadow: none !important;
149
+ }
150
+
151
+ .brand-name {
152
+ font-family: var(--serif);
153
+ font-weight: 700;
154
+ letter-spacing: 0.06em;
155
+ }
156
+
157
+ /* 顶栏控件全部素色化:无底无框,hover 才现 hairline。兜底所有 button /
158
+ * [role=button]——不管类名是谁(基线 chip / 插件注入 / capsule 等),顶栏里
159
+ * 一律裸图标,dropdown 触发器不许再带盒子。 */
160
+ .topbar button,
161
+ .topbar [role="button"],
162
+ .topbar a.chip,
163
+ .topbar .chip {
164
+ background: transparent !important;
165
+ border: 1px solid transparent !important;
166
+ border-radius: 3px !important;
167
+ box-shadow: none !important;
168
+ transition:
169
+ border-color 0.15s ease,
170
+ color 0.15s ease !important;
171
+ }
172
+
173
+ .topbar button:hover,
174
+ .topbar [role="button"]:hover,
175
+ .topbar a.chip:hover,
176
+ .topbar .chip:hover {
177
+ border-color: var(--border) !important;
178
+ background: transparent !important;
179
+ }
180
+
181
+ .topbar .dropdown {
182
+ background: transparent !important;
183
+ border: none !important;
184
+ box-shadow: none !important;
185
+ }
186
+
187
+ /* ---- 2. 消息区:左缘墨线活动脊 + 文档化排版 ----
188
+ * 列缘这条线让给脊线与输入框边框:脊线(虚线针脚)与输入框左边框同一条
189
+ * 像素线,历史虚下来、接到输入框变实,像「线活了起来」;消息正文整体
190
+ * 右移 23px 挂在轨上,不贴线。仅桌面(≥641px,与 qn-rail 断点一致)启用;
191
+ * 手机上无脊线、保持原生内缩。注意 background-position 的百分比按
192
+ * 「容器宽-图宽」解析,与 padding 不同,偏移公式不要互相套用。 */
193
+ @media (min-width: 641px) {
194
+ .messages {
195
+ padding-inline: max(0px, calc(var(--chat-inset) + 23px - var(--msgs-gutter, 0px))) !important;
196
+ background-image: linear-gradient(to bottom, rgba(38, 34, 24, 0.22) 40%, transparent 0);
197
+ background-repeat: repeat-y;
198
+ background-size: 1px 7px;
199
+ background-position: calc(var(--chat-inset) - 0.5px) top;
200
+ }
201
+ }
202
+
203
+ .msg {
204
+ position: relative;
205
+ padding: 2px 0 10px;
206
+ }
207
+
208
+ /* 操作按钮:行内簇已提升为基线默认(.chead-actions,随消息悬停显隐、
209
+ 与行内复制按钮并排),主题里不再需要任何覆盖。 */
210
+
211
+ /* 兜底路径(用户消息 / 纯文本回复,无 head 可宿主):底部操作行改为悬停
212
+ 浮牌,钉在消息右上角的空纸面上 */
213
+ .msg-actions {
214
+ position: absolute;
215
+ top: 0;
216
+ right: 0;
217
+ margin: 0;
218
+ z-index: 2;
219
+ padding: 2px;
220
+ background: var(--menu-bg) !important;
221
+ border: 1px solid var(--border) !important;
222
+ border-radius: 4px !important;
223
+ box-shadow: 0 4px 14px -4px rgba(38, 34, 24, 0.35) !important;
224
+ opacity: 0;
225
+ pointer-events: none;
226
+ transition:
227
+ opacity 0.12s ease,
228
+ pointer-events 0.12s ease;
229
+ }
230
+
231
+ .msg:hover .msg-actions,
232
+ .msg-actions.has-open-dropdown,
233
+ .msg-actions:focus-within {
234
+ opacity: 1;
235
+ pointer-events: auto;
236
+ }
237
+
238
+ /* 角色行:书目式小标 */
239
+ .msg-meta {
240
+ margin-bottom: 4px;
241
+ }
242
+
243
+ /* head 行左右内边距归零:折叠三角贴齐列左缘(文字同一条线),右侧复制
244
+ * 按钮贴右缘——head 无边框后,钮与缘之间不能悬空。三角形 28px 盒内 16px
245
+ * 图标居中内缩 6px,用负外边距做光学对齐。 */
246
+ .chead {
247
+ padding-left: 0;
248
+ padding-right: 0;
249
+ }
250
+
251
+ .chead-toggle {
252
+ margin-left: -6px;
253
+ }
254
+
255
+ /* 正文块上的单一复制键同样去重:消息复制已在 head 行的操作簇里 */
256
+ .msg-text-copy {
257
+ display: none !important;
258
+ }
259
+
260
+ /* head 悬浮不再出现底色块:纸面保持完全平整(键盘 focus 的 outline 保留,
261
+ * 只服务键盘导航) */
262
+ div.chead[role="button"]:hover,
263
+ .chead-toggle:hover {
264
+ background: transparent !important;
265
+ }
266
+
267
+ .msg-role {
268
+ font-size: 10.5px;
269
+ font-weight: 600;
270
+ letter-spacing: 0.18em;
271
+ color: var(--text-faint);
272
+ }
273
+
274
+ .msg-time {
275
+ font-family: var(--mono);
276
+ font-size: 10.5px;
277
+ }
278
+
279
+ /* ---- 3. 用户输入:去气泡,「起手式,稿纸批注体 ---- */
280
+ .msg-user .msg-body {
281
+ position: relative;
282
+ background: transparent !important;
283
+ border: none !important;
284
+ border-radius: 0 !important;
285
+ padding: 0 0 0 1.5em !important;
286
+ font-family: var(--serif);
287
+ font-size: 15.5px;
288
+ font-weight: 600;
289
+ line-height: 1.8;
290
+ color: var(--text);
291
+ }
292
+
293
+ .msg-user .msg-body::before {
294
+ content: "「";
295
+ position: absolute;
296
+ left: 0;
297
+ top: -0.12em;
298
+ font-family: var(--serif);
299
+ font-size: 1.3em;
300
+ font-weight: 700;
301
+ color: var(--accent);
302
+ line-height: 1;
303
+ }
304
+
305
+ /* ---- 4. 助手正文:衬线文档体,直接是书页 ---- */
306
+ .msg-assistant .msg-text {
307
+ font-family: var(--serif);
308
+ font-size: 15px;
309
+ line-height: 1.85;
310
+ color: var(--text);
311
+ }
312
+
313
+ .msg-assistant .msg-text p:first-child {
314
+ margin-top: 0;
315
+ }
316
+
317
+ .msg-assistant .msg-text h1,
318
+ .msg-assistant .msg-text h2,
319
+ .msg-assistant .msg-text h3,
320
+ .msg-assistant .msg-text h4 {
321
+ font-family: var(--serif);
322
+ font-weight: 700;
323
+ color: var(--md-strong);
324
+ letter-spacing: 0.02em;
325
+ }
326
+
327
+ .msg-assistant .msg-text blockquote {
328
+ border-left: 2px solid var(--accent-soft);
329
+ font-style: normal;
330
+ color: var(--text-dim);
331
+ }
332
+
333
+ .msg-assistant .msg-text a {
334
+ color: var(--link);
335
+ text-decoration: underline dotted;
336
+ text-decoration-color: rgba(191, 59, 31, 0.45);
337
+ text-underline-offset: 3px;
338
+ }
339
+
340
+ .msg-assistant .msg-text hr {
341
+ border: none;
342
+ border-top: 1px dotted var(--border);
343
+ }
344
+
345
+ .msg-assistant .msg-text code {
346
+ background: #ece4d0;
347
+ color: #6b3a1f;
348
+ border-radius: 2px;
349
+ padding: 1px 5px;
350
+ }
351
+
352
+ /* ---- 5. 工具调用 = 台账行:无框无底,点线引导符填空 ---- */
353
+ .toolcall {
354
+ margin: 1px 0 !important;
355
+ border: none !important;
356
+ border-radius: 0 !important;
357
+ background: transparent !important;
358
+ box-shadow: none !important;
359
+ overflow: visible !important;
360
+ }
361
+
362
+ .toolcall-head {
363
+ display: flex;
364
+ align-items: center;
365
+ min-height: 24px;
366
+ padding: 2px 0;
367
+ font-family: var(--mono);
368
+ font-size: 12px;
369
+ }
370
+
371
+ .toolcall-name {
372
+ font-family: var(--mono) !important;
373
+ font-weight: 500 !important;
374
+ font-size: 12px !important;
375
+ letter-spacing: 0.02em;
376
+ color: var(--text-dim) !important;
377
+ }
378
+
379
+ /* 点线引导符:账本目录式填空,落在名字与状态之间 */
380
+ .toolcall .toolcall-spacer {
381
+ border-bottom: 1px dotted #c9bfa8;
382
+ height: 0.7em;
383
+ margin: 0 10px;
384
+ }
385
+
386
+ .toolcall-status {
387
+ color: var(--text-faint) !important;
388
+ }
389
+
390
+ .toolcall.run .toolcall-name {
391
+ color: var(--accent) !important;
392
+ }
393
+
394
+ .toolcall.run .toolcall-status {
395
+ color: var(--accent) !important;
396
+ }
397
+
398
+ .toolcall.run .toolcall-head {
399
+ background: transparent;
400
+ border-left: none;
401
+ }
402
+
403
+ .toolcall.ok .toolcall-status {
404
+ color: var(--green) !important;
405
+ }
406
+
407
+ .toolcall.err .toolcall-status {
408
+ color: var(--red) !important;
409
+ }
410
+
411
+ .toolcall.err .toolcall-name {
412
+ color: var(--red) !important;
413
+ }
414
+
415
+ /* 展开的参数/输出:并入台账,无框零内边距平面文本(--code-border/--code-pad
416
+ 已按全透明主题机制置 transparent/0,连带 .termline 一并生效) */
417
+ .toolcall-args pre,
418
+ .toolcall-output pre {
419
+ background: transparent !important;
420
+ border: none !important;
421
+ border-radius: 0 !important;
422
+ padding: 0 !important;
423
+ }
424
+
425
+ /* 工具卡体:去掉分隔线与内边距,参数/输出与卡头同距平铺 */
426
+ .toolcall-body {
427
+ border-top: none !important;
428
+ padding: 0 0 6px !important;
429
+ }
430
+
431
+ /* 卡内重复的终端图标只剩噪音(卡头已有工具图标),参照全透明主题隐藏 */
432
+ .termline-icon {
433
+ display: none;
434
+ }
435
+
436
+ .toolcall-output-label {
437
+ margin-top: 6px;
438
+ }
439
+
440
+ .toolcall-kill {
441
+ border-radius: 3px;
442
+ }
443
+
444
+ /* ---- 6. 思考流 = 脚注:※ 起手,淡墨小字 ---- */
445
+ .thinking {
446
+ margin: 4px 0 !important;
447
+ border: none !important;
448
+ border-radius: 0 !important;
449
+ background: transparent !important;
450
+ box-shadow: none !important;
451
+ }
452
+
453
+ .thinking-head {
454
+ font-size: 12px;
455
+ color: var(--text-faint);
456
+ }
457
+
458
+ .thinking-icon {
459
+ color: var(--text-faint) !important;
460
+ }
461
+
462
+ .thinking-body {
463
+ border-top: none !important;
464
+ font-style: normal !important;
465
+ font-size: 12.5px !important;
466
+ color: var(--text-dim) !important;
467
+ background: transparent;
468
+ position: relative;
469
+ padding: 2px 14px 2px 1.6em !important;
470
+ }
471
+
472
+ .thinking-body::before {
473
+ content: "※";
474
+ position: absolute;
475
+ left: 0;
476
+ top: 2px;
477
+ color: var(--text-faint);
478
+ }
479
+
480
+ .thinking-live .thinking-toggle,
481
+ .thinking-live-label {
482
+ color: var(--accent) !important;
483
+ }
484
+
485
+ /* ---- 7. 折叠摘要行 / 排队提示:并入台账体系 ---- */
486
+ .msg-collapsed {
487
+ background: transparent !important;
488
+ border: none !important;
489
+ border-bottom: 1px dotted var(--border-soft) !important;
490
+ border-radius: 0 !important;
491
+ box-shadow: none !important;
492
+ padding-left: 0 !important;
493
+ padding-right: 0 !important;
494
+ }
495
+
496
+ .msg-collapsed-action::before {
497
+ margin-left: 0 !important;
498
+ }
499
+
500
+ .msg-error {
501
+ background: var(--red-soft) !important;
502
+ border: none !important;
503
+ border-left: 3px solid var(--red) !important;
504
+ border-radius: 0 !important;
505
+ font-family: var(--serif);
506
+ }
507
+
508
+ /* ---- 8. 输入区 = 命令栏:与其他主题同构——只动颜色不动几何,
509
+ 朱笔以 inset 阴影画在边框内侧,外缘与消息列/chips 恒对齐 ---- */
510
+ .inputbar {
511
+ background: transparent !important;
512
+ }
513
+
514
+ .inputbox {
515
+ background: var(--inputbox-bg) !important;
516
+ border: none !important;
517
+ border-radius: 3px !important;
518
+ box-shadow: inset 3px 0 0 0 rgba(191, 59, 31, 0.35) !important;
519
+ transition:
520
+ border-color 0.2s ease,
521
+ box-shadow 0.2s ease !important;
522
+ }
523
+
524
+ .inputbox:focus-within {
525
+ border: none !important;
526
+ box-shadow: inset 3px 0 0 0 var(--accent) !important;
527
+ }
528
+
529
+ .btn.send {
530
+ background: var(--send-blue) !important;
531
+ color: #f6f2e9 !important;
532
+ border-radius: 50% !important;
533
+ box-shadow: none !important;
534
+ font-weight: 600;
535
+ }
536
+
537
+ .btn.send:hover {
538
+ background: var(--send-blue-hover) !important;
539
+ }
540
+
541
+ .btn.stop {
542
+ background: var(--stop-red) !important;
543
+ color: #f6f2e9 !important;
544
+ border-radius: 50% !important;
545
+ }
546
+
547
+ /* 输入框底部模型选择、思考强度、预设等按钮:去边框、透明底,hover 现 hairline */
548
+ .composer-tools {
549
+ border-top: none !important;
550
+ }
551
+
552
+ .composer-tools .chip,
553
+ .composer-tools .capsule-segment {
554
+ font-size: 13px !important;
555
+ padding: 4px 10px !important;
556
+ gap: 6px !important;
557
+ background: transparent !important;
558
+ border: 1px solid transparent !important;
559
+ box-shadow: none !important;
560
+ border-radius: 3px !important;
561
+ transition:
562
+ border-color 0.15s ease,
563
+ background 0.15s ease !important;
564
+ }
565
+
566
+ .composer-tools .model-thinking-capsule {
567
+ background: transparent !important;
568
+ border: none !important;
569
+ box-shadow: none !important;
570
+ padding: 0 !important;
571
+ }
572
+
573
+ .composer-tools .model-thinking-capsule .capsule-divider {
574
+ display: none !important;
575
+ }
576
+
577
+ .composer-tools .chip:hover,
578
+ .composer-tools .capsule-segment:hover {
579
+ border-color: var(--border) !important;
580
+ background: transparent !important;
581
+ }
582
+
583
+ .composer-tools-left {
584
+ gap: 6px !important;
585
+ }
586
+
587
+ .composer-tools .chip-model,
588
+ .composer-tools .chip-sub,
589
+ .composer-tools .capsule-model-name,
590
+ .composer-tools .capsule-thinking-text {
591
+ font-size: 12.5px !important;
592
+ }
593
+
594
+ /* ---- 9. 底栏 / 状态栏:hairline 收边 ---- */
595
+ .statusbar {
596
+ background: var(--statusbar-bg) !important;
597
+ border-top: 1px solid var(--border-soft) !important;
598
+ box-shadow: none !important;
599
+ }
600
+
601
+ .goalbar {
602
+ background: transparent !important;
603
+ border-top: 1px solid var(--border-soft) !important;
604
+ box-shadow: none !important;
605
+ }
606
+
607
+ /* ---- 10. 左右面板:素纸文件栏 ----
608
+ * 激活态不做红洗(accent-soft 洗在纸上是一块脏粉),改为中性墨面 5% +
609
+ * 左缘 2px 朱标;圆角统一 8px。 */
610
+ .panel {
611
+ background: var(--panel-bg) !important;
612
+ border-color: var(--border-soft) !important;
613
+ }
614
+
615
+ .session-item,
616
+ .project-item,
617
+ .file-item,
618
+ .scm-file {
619
+ border-radius: 8px;
620
+ }
621
+
622
+ .session-item.active,
623
+ .project-item.active {
624
+ background: rgba(38, 34, 24, 0.05);
625
+ border: none;
626
+ box-shadow: inset 2px 0 0 var(--accent);
627
+ }
628
+
629
+ .session-item.active {
630
+ padding: 8px 10px;
631
+ }
632
+
633
+ .project-item.active {
634
+ padding: 7px 10px;
635
+ }
636
+
637
+ /* ---- 11. 代码块与终端:纸凹版 + 暖墨终端 ---- */
638
+ .codeblock {
639
+ background: var(--code-bg) !important;
640
+ border: 1px solid var(--border-soft) !important;
641
+ border-radius: 3px !important;
642
+ box-shadow: none !important;
643
+ }
644
+
645
+ .codeblock pre,
646
+ .msg-text pre {
647
+ background: var(--code-bg) !important;
648
+ color: var(--code-text) !important;
649
+ }
650
+
651
+ /* ---- 11b. 语法高亮适配纸面(全局捆绑的是 github-dark,必须整套覆盖)---- */
652
+ .hljs {
653
+ color: #33301f;
654
+ background: transparent !important;
655
+ }
656
+
657
+ .hljs-comment,
658
+ .hljs-quote {
659
+ color: #948b78;
660
+ }
661
+
662
+ .hljs-keyword,
663
+ .hljs-selector-tag,
664
+ .hljs-doctag,
665
+ .hljs-formula {
666
+ color: #a03618;
667
+ }
668
+
669
+ .hljs-string,
670
+ .hljs-regexp {
671
+ color: #3f6c4f;
672
+ }
673
+
674
+ .hljs-number,
675
+ .hljs-literal {
676
+ color: #8a5c1e;
677
+ }
678
+
679
+ .hljs-title,
680
+ .hljs-title.function_,
681
+ .hljs-section {
682
+ color: #6b3fa0;
683
+ }
684
+
685
+ .hljs-attr,
686
+ .hljs-attribute,
687
+ .hljs-variable,
688
+ .hljs-template-variable,
689
+ .hljs-type,
690
+ .hljs-name {
691
+ color: #8a4a2e;
692
+ }
693
+
694
+ .hljs-built_in {
695
+ color: #2f5f8a;
696
+ }
697
+
698
+ .hljs-deletion {
699
+ color: #7a2718;
700
+ background: rgba(194, 64, 42, 0.12);
701
+ }
702
+
703
+ .hljs-addition {
704
+ color: #2f6b4f;
705
+ background: rgba(61, 122, 85, 0.14);
706
+ }
707
+
708
+ /* ---- 12. 弹层与菜单:纸面实底 + hairline,方角家族 ---- */
709
+ .modal,
710
+ .tool-info-modal,
711
+ .settings-modal,
712
+ .model-modal,
713
+ .tpl-modal,
714
+ .dd-menu,
715
+ .dialog-inline {
716
+ border-radius: 4px !important;
717
+ border: 1px solid var(--border) !important;
718
+ box-shadow:
719
+ 0 1px 2px rgba(38, 34, 24, 0.06),
720
+ 0 16px 40px -12px rgba(38, 34, 24, 0.25) !important;
721
+ }
722
+
723
+ .dd-menu {
724
+ background: var(--menu-bg) !important;
725
+ border: 1px solid var(--border) !important;
726
+ border-radius: 4px !important;
727
+ box-shadow: 0 12px 32px -8px rgba(38, 34, 24, 0.28) !important;
728
+ }
729
+
730
+ .dd-item:hover,
731
+ .dd-all-item:hover {
732
+ background: var(--accent-soft) !important;
733
+ }
734
+
735
+ /* ---- 13. chips / 徽标:账目标签体 ---- */
736
+ .chip {
737
+ background: var(--chip-bg) !important;
738
+ border: 1px solid var(--border-soft) !important;
739
+ border-radius: 2px !important;
740
+ box-shadow: none !important;
741
+ font-family: var(--mono);
742
+ font-size: 11px;
743
+ }
744
+
745
+ /* ---- 14. 滚动条:细墨线 ---- */
746
+ ::-webkit-scrollbar {
747
+ width: 6px;
748
+ height: 6px;
749
+ }
750
+
751
+ ::-webkit-scrollbar-track {
752
+ background: transparent;
753
+ }
754
+
755
+ ::-webkit-scrollbar-thumb {
756
+ background: var(--scroll-thumb);
757
+ border-radius: 0;
758
+ }
759
+
760
+ ::-webkit-scrollbar-thumb:hover {
761
+ background: var(--scroll-thumb-hover);
762
+ }
763
+
764
+ /* ---- 15. 通知条:hairline 左线式 ---- */
765
+ .notice-err,
766
+ .notice-warn,
767
+ .notice-info {
768
+ border-radius: 0 !important;
769
+ border-width: 1px !important;
770
+ border-left-width: 3px !important;
771
+ }