pi-web-ui 0.94.1 → 0.96.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 (100) hide show
  1. package/CHANGELOG.md +91 -2
  2. package/README.md +5 -6
  3. package/README.zh-CN.md +4 -5
  4. package/bin/pi-web-ui.mjs +910 -237
  5. package/dist/server/agent-service.js +2655 -231
  6. package/dist/server/approval-rules.js +596 -0
  7. package/dist/server/attachment-store.js +129 -0
  8. package/dist/server/attachments.js +92 -174
  9. package/dist/server/bg-servers.js +45 -7
  10. package/dist/server/claim-files-tool.js +4 -8
  11. package/dist/server/claim-store.js +4 -2
  12. package/dist/server/client-state.js +67 -14
  13. package/dist/server/compact-context-tool.js +126 -0
  14. package/dist/server/composer-drafts.js +9 -0
  15. package/dist/server/context-budget.js +317 -0
  16. package/dist/server/control-socket.js +57 -28
  17. package/dist/server/conversation-read-tool.js +7 -17
  18. package/dist/server/dangling-tools.js +229 -0
  19. package/dist/server/delegate-task.js +25 -28
  20. package/dist/server/dsh/dsh-agent-service.js +69 -66
  21. package/dist/server/edit-soft-tool.js +84 -16
  22. package/dist/server/eval-tool.js +588 -0
  23. package/dist/server/file-archives.js +16 -5
  24. package/dist/server/files-service.js +65 -18
  25. package/dist/server/goal-service.js +371 -77
  26. package/dist/server/hashline-engine.js +703 -0
  27. package/dist/server/host-guard.js +94 -0
  28. package/dist/server/host-metrics.js +26 -2
  29. package/dist/server/i18n.js +3 -3
  30. package/dist/server/index.js +456 -80
  31. package/dist/server/lsp-tool.js +1371 -0
  32. package/dist/server/mcp-bridge.js +47 -3
  33. package/dist/server/model-admin.js +112 -32
  34. package/dist/server/office-parse.js +375 -0
  35. package/dist/server/patch-tool.js +85 -0
  36. package/dist/server/permission-preset.js +25 -0
  37. package/dist/server/plan-manager.js +114 -0
  38. package/dist/server/plugin-api-catalog.js +296 -0
  39. package/dist/server/plugin-catalog-sync.js +36 -19
  40. package/dist/server/plugin-catalog.js +11 -4
  41. package/dist/server/plugin-facilities.js +92 -21
  42. package/dist/server/plugin-install-spec.js +196 -0
  43. package/dist/server/plugin-installer.js +73 -0
  44. package/dist/server/plugin-llm.js +71 -65
  45. package/dist/server/plugin-manifest-validate.js +305 -0
  46. package/dist/server/plugin-project.js +117 -13
  47. package/dist/server/plugin-tool-guard.js +120 -0
  48. package/dist/server/plugin-updater.js +115 -12
  49. package/dist/server/plugins.js +950 -205
  50. package/dist/server/present-files-tool.js +9 -12
  51. package/dist/server/process-utils.js +16 -6
  52. package/dist/server/prompt-composer.js +9 -0
  53. package/dist/server/protocol-version.js +1 -1
  54. package/dist/server/read-tool.js +69 -30
  55. package/dist/server/resolve-global-sdk.js +30 -16
  56. package/dist/server/schedule-agent-tool.js +12 -15
  57. package/dist/server/scheduler-tasks.js +6 -0
  58. package/dist/server/sdk-origin.js +18 -2
  59. package/dist/server/serialize.js +111 -14
  60. package/dist/server/settings-service.js +112 -3
  61. package/dist/server/skill-tool.js +5 -7
  62. package/dist/server/subagent-templates.js +51 -0
  63. package/dist/server/subagents.js +83 -66
  64. package/dist/server/terminals.js +248 -81
  65. package/dist/server/tool-approval.js +84 -0
  66. package/dist/server/tool-manager.js +237 -12
  67. package/dist/server/tool-overrides.js +59 -0
  68. package/dist/server/update-check.js +28 -1
  69. package/dist/server/uploads.js +17 -2
  70. package/dist/server/wait-subscription-scan.js +18 -21
  71. package/dist/server/workspace-snapshot.js +113 -0
  72. package/dist/server/ws-client-id.js +29 -0
  73. package/dist/server/ws-pending-queue.js +60 -0
  74. package/extensions/webui.ts +60 -2
  75. package/package.json +5 -3
  76. package/plugin-sdk/README.md +25 -0
  77. package/plugin-sdk/index.d.ts +31 -38
  78. package/plugin-sdk/index.mjs +35 -19
  79. package/plugins/catalog.json +40 -0
  80. package/themes/aetheris.css +457 -0
  81. package/themes/ayu-light.css +6 -6
  82. package/themes/catppuccin-latte.css +6 -6
  83. package/themes/claude-code-dark.css +144 -0
  84. package/themes/codex.css +6 -6
  85. package/themes/everforest-light.css +6 -6
  86. package/themes/geist.css +6 -6
  87. package/themes/gruvbox-light.css +6 -6
  88. package/themes/kanagawa-lotus.css +6 -6
  89. package/themes/rose-pine-dawn.css +6 -6
  90. package/themes/solarized-light.css +6 -6
  91. package/themes/vs-code-dark.css +146 -0
  92. package/themes/zhupi-dark.css +658 -0
  93. package/themes/zhupi.css +711 -0
  94. package/web/dist/assets/{TerminalPanel-MVoxpJOA.js → TerminalPanel-DDChcYOh.js} +1 -1
  95. package/web/dist/assets/index-Do9RgJC3.js +366 -0
  96. package/web/dist/assets/index-DryOsILO.css +1 -0
  97. package/web/dist/assets/{markdown-eUQn_o9D.js → markdown-DXwnfD9T.js} +1 -1
  98. package/web/dist/index.html +3 -3
  99. package/web/dist/assets/index-B3S9MxnN.css +0 -1
  100. package/web/dist/assets/index-DVLrHI2E.js +0 -364
@@ -0,0 +1,711 @@
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 */
158
+ .topbar .chip,
159
+ .topbar .tb-tab,
160
+ .topbar .panel-toggle,
161
+ .topbar .plugin-topbar-item {
162
+ background: transparent !important;
163
+ border: 1px solid transparent !important;
164
+ border-radius: 3px !important;
165
+ box-shadow: none !important;
166
+ transition:
167
+ border-color 0.15s ease,
168
+ color 0.15s ease !important;
169
+ }
170
+
171
+ .topbar .chip:hover,
172
+ .topbar .tb-tab:hover,
173
+ .topbar .panel-toggle:hover,
174
+ .topbar .plugin-topbar-item:hover {
175
+ border-color: var(--border) !important;
176
+ background: transparent !important;
177
+ }
178
+
179
+ /* ---- 2. 消息区:左缘墨线活动脊 + 文档化排版 ----
180
+ * 列缘这条线让给脊线与输入框边框:脊线(虚线针脚)与输入框左边框同一条
181
+ * 像素线,历史虚下来、接到输入框变实,像「线活了起来」;消息正文整体
182
+ * 右移 23px 挂在轨上,不贴线。仅桌面(≥641px,与 qn-rail 断点一致)启用;
183
+ * 手机上无脊线、保持原生内缩。注意 background-position 的百分比按
184
+ * 「容器宽-图宽」解析,与 padding 不同,偏移公式不要互相套用。 */
185
+ @media (min-width: 641px) {
186
+ .messages {
187
+ padding-inline: max(0px, calc(var(--chat-inset) + 23px - var(--msgs-gutter, 0px))) !important;
188
+ background-image: linear-gradient(to bottom, rgba(38, 34, 24, 0.22) 40%, transparent 0);
189
+ background-repeat: repeat-y;
190
+ background-size: 1px 7px;
191
+ background-position: calc(var(--chat-inset) - 0.5px) top;
192
+ }
193
+ }
194
+
195
+ .msg {
196
+ position: relative;
197
+ padding: 2px 0 10px;
198
+ }
199
+
200
+ /* 操作按钮:行内簇已提升为基线默认(.chead-actions,随消息悬停显隐、
201
+ 与行内复制按钮并排),主题里不再需要任何覆盖。 */
202
+
203
+ /* 兜底路径(用户消息 / 纯文本回复,无 head 可宿主):底部操作行改为悬停
204
+ 浮牌,钉在消息右上角的空纸面上 */
205
+ .msg-actions {
206
+ position: absolute;
207
+ top: 0;
208
+ right: 0;
209
+ margin: 0;
210
+ z-index: 2;
211
+ padding: 2px;
212
+ background: var(--menu-bg) !important;
213
+ border: 1px solid var(--border) !important;
214
+ border-radius: 4px !important;
215
+ box-shadow: 0 4px 14px -4px rgba(38, 34, 24, 0.35) !important;
216
+ opacity: 0;
217
+ pointer-events: none;
218
+ transition:
219
+ opacity 0.12s ease,
220
+ pointer-events 0.12s ease;
221
+ }
222
+
223
+ .msg:hover .msg-actions,
224
+ .msg-actions.has-open-dropdown,
225
+ .msg-actions:focus-within {
226
+ opacity: 1;
227
+ pointer-events: auto;
228
+ }
229
+
230
+ /* 角色行:书目式小标 */
231
+ .msg-meta {
232
+ margin-bottom: 4px;
233
+ }
234
+
235
+ /* head 行左右内边距归零:折叠三角贴齐列左缘(文字同一条线),右侧复制
236
+ * 按钮贴右缘——head 无边框后,钮与缘之间不能悬空。三角形 28px 盒内 16px
237
+ * 图标居中内缩 6px,用负外边距做光学对齐。 */
238
+ .chead {
239
+ padding-left: 0;
240
+ padding-right: 0;
241
+ }
242
+
243
+ .chead-toggle {
244
+ margin-left: -6px;
245
+ }
246
+
247
+ /* 正文块上的单一复制键同样去重:消息复制已在 head 行的操作簇里 */
248
+ .msg-text-copy {
249
+ display: none !important;
250
+ }
251
+
252
+ /* head 悬浮不再出现底色块:纸面保持完全平整(键盘 focus 的 outline 保留,
253
+ * 只服务键盘导航) */
254
+ div.chead[role="button"]:hover,
255
+ .chead-toggle:hover {
256
+ background: transparent !important;
257
+ }
258
+
259
+ .msg-role {
260
+ font-size: 10.5px;
261
+ font-weight: 600;
262
+ letter-spacing: 0.18em;
263
+ color: var(--text-faint);
264
+ }
265
+
266
+ .msg-time {
267
+ font-family: var(--mono);
268
+ font-size: 10.5px;
269
+ }
270
+
271
+ /* ---- 3. 用户输入:去气泡,「起手式,稿纸批注体 ---- */
272
+ .msg-user .msg-body {
273
+ position: relative;
274
+ background: transparent !important;
275
+ border: none !important;
276
+ border-radius: 0 !important;
277
+ padding: 0 0 0 1.5em !important;
278
+ font-family: var(--serif);
279
+ font-size: 15.5px;
280
+ font-weight: 600;
281
+ line-height: 1.8;
282
+ color: var(--text);
283
+ }
284
+
285
+ .msg-user .msg-body::before {
286
+ content: "「";
287
+ position: absolute;
288
+ left: 0;
289
+ top: -0.12em;
290
+ font-family: var(--serif);
291
+ font-size: 1.3em;
292
+ font-weight: 700;
293
+ color: var(--accent);
294
+ line-height: 1;
295
+ }
296
+
297
+ /* ---- 4. 助手正文:衬线文档体,直接是书页 ---- */
298
+ .msg-assistant .msg-text {
299
+ font-family: var(--serif);
300
+ font-size: 15px;
301
+ line-height: 1.85;
302
+ color: var(--text);
303
+ }
304
+
305
+ .msg-assistant .msg-text p:first-child {
306
+ margin-top: 0;
307
+ }
308
+
309
+ .msg-assistant .msg-text h1,
310
+ .msg-assistant .msg-text h2,
311
+ .msg-assistant .msg-text h3,
312
+ .msg-assistant .msg-text h4 {
313
+ font-family: var(--serif);
314
+ font-weight: 700;
315
+ color: var(--md-strong);
316
+ letter-spacing: 0.02em;
317
+ }
318
+
319
+ .msg-assistant .msg-text blockquote {
320
+ border-left: 2px solid var(--accent-soft);
321
+ font-style: normal;
322
+ color: var(--text-dim);
323
+ }
324
+
325
+ .msg-assistant .msg-text a {
326
+ color: var(--link);
327
+ text-decoration: underline dotted;
328
+ text-decoration-color: rgba(191, 59, 31, 0.45);
329
+ text-underline-offset: 3px;
330
+ }
331
+
332
+ .msg-assistant .msg-text hr {
333
+ border: none;
334
+ border-top: 1px dotted var(--border);
335
+ }
336
+
337
+ .msg-assistant .msg-text code {
338
+ background: #ece4d0;
339
+ color: #6b3a1f;
340
+ border-radius: 2px;
341
+ padding: 1px 5px;
342
+ }
343
+
344
+ /* ---- 5. 工具调用 = 台账行:无框无底,点线引导符填空 ---- */
345
+ .toolcall {
346
+ margin: 1px 0 !important;
347
+ border: none !important;
348
+ border-radius: 0 !important;
349
+ background: transparent !important;
350
+ box-shadow: none !important;
351
+ overflow: visible !important;
352
+ }
353
+
354
+ .toolcall-head {
355
+ display: flex;
356
+ align-items: center;
357
+ min-height: 24px;
358
+ padding: 2px 0;
359
+ font-family: var(--mono);
360
+ font-size: 12px;
361
+ }
362
+
363
+ .toolcall-name {
364
+ font-family: var(--mono) !important;
365
+ font-weight: 500 !important;
366
+ font-size: 12px !important;
367
+ letter-spacing: 0.02em;
368
+ color: var(--text-dim) !important;
369
+ }
370
+
371
+ /* 点线引导符:账本目录式填空,落在名字与状态之间 */
372
+ .toolcall .toolcall-spacer {
373
+ border-bottom: 1px dotted #c9bfa8;
374
+ height: 0.7em;
375
+ margin: 0 10px;
376
+ }
377
+
378
+ .toolcall-status {
379
+ color: var(--text-faint) !important;
380
+ }
381
+
382
+ .toolcall.run .toolcall-name {
383
+ color: var(--accent) !important;
384
+ }
385
+
386
+ .toolcall.run .toolcall-status {
387
+ color: var(--accent) !important;
388
+ }
389
+
390
+ .toolcall.run .toolcall-head {
391
+ background: transparent;
392
+ border-left: none;
393
+ }
394
+
395
+ .toolcall.ok .toolcall-status {
396
+ color: var(--green) !important;
397
+ }
398
+
399
+ .toolcall.err .toolcall-status {
400
+ color: var(--red) !important;
401
+ }
402
+
403
+ .toolcall.err .toolcall-name {
404
+ color: var(--red) !important;
405
+ }
406
+
407
+ /* 展开的参数/输出:并入台账,无框零内边距平面文本(--code-border/--code-pad
408
+ 已按全透明主题机制置 transparent/0,连带 .termline 一并生效) */
409
+ .toolcall-args pre,
410
+ .toolcall-output pre {
411
+ background: transparent !important;
412
+ border: none !important;
413
+ border-radius: 0 !important;
414
+ padding: 0 !important;
415
+ }
416
+
417
+ /* 工具卡体:去掉分隔线与内边距,参数/输出与卡头同距平铺 */
418
+ .toolcall-body {
419
+ border-top: none !important;
420
+ padding: 0 0 6px !important;
421
+ }
422
+
423
+ /* 卡内重复的终端图标只剩噪音(卡头已有工具图标),参照全透明主题隐藏 */
424
+ .termline-icon {
425
+ display: none;
426
+ }
427
+
428
+ .toolcall-output-label {
429
+ margin-top: 6px;
430
+ }
431
+
432
+ .toolcall-kill {
433
+ border-radius: 3px;
434
+ }
435
+
436
+ /* ---- 6. 思考流 = 脚注:※ 起手,淡墨小字 ---- */
437
+ .thinking {
438
+ margin: 4px 0 !important;
439
+ border: none !important;
440
+ border-radius: 0 !important;
441
+ background: transparent !important;
442
+ box-shadow: none !important;
443
+ }
444
+
445
+ .thinking-head {
446
+ font-size: 12px;
447
+ color: var(--text-faint);
448
+ }
449
+
450
+ .thinking-icon {
451
+ color: var(--text-faint) !important;
452
+ }
453
+
454
+ .thinking-body {
455
+ border-top: none !important;
456
+ font-style: normal !important;
457
+ font-size: 12.5px !important;
458
+ color: var(--text-dim) !important;
459
+ background: transparent;
460
+ position: relative;
461
+ padding: 2px 14px 2px 1.6em !important;
462
+ }
463
+
464
+ .thinking-body::before {
465
+ content: "※";
466
+ position: absolute;
467
+ left: 0;
468
+ top: 2px;
469
+ color: var(--text-faint);
470
+ }
471
+
472
+ .thinking-live .thinking-toggle,
473
+ .thinking-live-label {
474
+ color: var(--accent) !important;
475
+ }
476
+
477
+ /* ---- 7. 折叠摘要行 / 排队提示:并入台账体系 ---- */
478
+ .msg-collapsed {
479
+ background: transparent !important;
480
+ border: none !important;
481
+ border-bottom: 1px dotted var(--border-soft) !important;
482
+ border-radius: 0 !important;
483
+ box-shadow: none !important;
484
+ }
485
+
486
+ .msg-error {
487
+ background: var(--red-soft) !important;
488
+ border: none !important;
489
+ border-left: 3px solid var(--red) !important;
490
+ border-radius: 0 !important;
491
+ font-family: var(--serif);
492
+ }
493
+
494
+ /* ---- 8. 输入区 = 命令栏:与其他主题同构——只动颜色不动几何,
495
+ 朱笔以 inset 阴影画在边框内侧,外缘与消息列/chips 恒对齐 ---- */
496
+ .inputbar {
497
+ background: transparent !important;
498
+ }
499
+
500
+ .inputbox {
501
+ background: var(--inputbox-bg) !important;
502
+ border: 1px solid var(--border) !important;
503
+ border-radius: 3px !important;
504
+ box-shadow: inset 3px 0 0 0 rgba(191, 59, 31, 0.35) !important;
505
+ transition:
506
+ border-color 0.2s ease,
507
+ box-shadow 0.2s ease !important;
508
+ }
509
+
510
+ .inputbox:focus-within {
511
+ border-color: var(--accent) !important;
512
+ box-shadow: inset 3px 0 0 0 var(--accent) !important;
513
+ }
514
+
515
+ .btn.send {
516
+ background: var(--send-blue) !important;
517
+ color: #f6f2e9 !important;
518
+ border-radius: 3px !important;
519
+ box-shadow: none !important;
520
+ font-weight: 600;
521
+ }
522
+
523
+ .btn.send:hover {
524
+ background: var(--send-blue-hover) !important;
525
+ }
526
+
527
+ .btn.stop {
528
+ background: var(--stop-red) !important;
529
+ color: #f6f2e9 !important;
530
+ border-radius: 3px !important;
531
+ }
532
+
533
+ /* ---- 9. 底栏 / 状态栏:hairline 收边 ---- */
534
+ .statusbar {
535
+ background: var(--statusbar-bg) !important;
536
+ border-top: 1px solid var(--border-soft) !important;
537
+ box-shadow: none !important;
538
+ }
539
+
540
+ .goalbar {
541
+ background: transparent !important;
542
+ border-top: 1px solid var(--border-soft) !important;
543
+ box-shadow: none !important;
544
+ }
545
+
546
+ /* ---- 10. 左右面板:素纸文件栏 ----
547
+ * 激活态不做红洗(accent-soft 洗在纸上是一块脏粉),改为中性墨面 5% +
548
+ * 左缘 2px 朱标;圆角统一 8px。 */
549
+ .panel {
550
+ background: var(--panel-bg) !important;
551
+ border-color: var(--border-soft) !important;
552
+ }
553
+
554
+ .session-item,
555
+ .project-item,
556
+ .file-item,
557
+ .scm-file {
558
+ border-radius: 8px;
559
+ }
560
+
561
+ .session-item.active,
562
+ .project-item.active {
563
+ background: rgba(38, 34, 24, 0.05);
564
+ border: none;
565
+ box-shadow: inset 2px 0 0 var(--accent);
566
+ }
567
+
568
+ .session-item.active {
569
+ padding: 8px 10px;
570
+ }
571
+
572
+ .project-item.active {
573
+ padding: 7px 10px;
574
+ }
575
+
576
+ /* ---- 11. 代码块与终端:纸凹版 + 暖墨终端 ---- */
577
+ .codeblock {
578
+ background: var(--code-bg) !important;
579
+ border: 1px solid var(--border-soft) !important;
580
+ border-radius: 3px !important;
581
+ box-shadow: none !important;
582
+ }
583
+
584
+ .codeblock pre,
585
+ .msg-text pre {
586
+ background: var(--code-bg) !important;
587
+ color: var(--code-text) !important;
588
+ }
589
+
590
+ /* ---- 11b. 语法高亮适配纸面(全局捆绑的是 github-dark,必须整套覆盖)---- */
591
+ .hljs {
592
+ color: #33301f;
593
+ background: transparent !important;
594
+ }
595
+
596
+ .hljs-comment,
597
+ .hljs-quote {
598
+ color: #948b78;
599
+ }
600
+
601
+ .hljs-keyword,
602
+ .hljs-selector-tag,
603
+ .hljs-doctag,
604
+ .hljs-formula {
605
+ color: #a03618;
606
+ }
607
+
608
+ .hljs-string,
609
+ .hljs-regexp {
610
+ color: #3f6c4f;
611
+ }
612
+
613
+ .hljs-number,
614
+ .hljs-literal {
615
+ color: #8a5c1e;
616
+ }
617
+
618
+ .hljs-title,
619
+ .hljs-title.function_,
620
+ .hljs-section {
621
+ color: #6b3fa0;
622
+ }
623
+
624
+ .hljs-attr,
625
+ .hljs-attribute,
626
+ .hljs-variable,
627
+ .hljs-template-variable,
628
+ .hljs-type,
629
+ .hljs-name {
630
+ color: #8a4a2e;
631
+ }
632
+
633
+ .hljs-built_in {
634
+ color: #2f5f8a;
635
+ }
636
+
637
+ .hljs-deletion {
638
+ color: #7a2718;
639
+ background: rgba(194, 64, 42, 0.12);
640
+ }
641
+
642
+ .hljs-addition {
643
+ color: #2f6b4f;
644
+ background: rgba(61, 122, 85, 0.14);
645
+ }
646
+
647
+ /* ---- 12. 弹层与菜单:纸面实底 + hairline,方角家族 ---- */
648
+ .modal,
649
+ .tool-info-modal,
650
+ .settings-modal,
651
+ .model-modal,
652
+ .tpl-modal,
653
+ .dd-menu,
654
+ .dialog-inline {
655
+ border-radius: 4px !important;
656
+ border: 1px solid var(--border) !important;
657
+ box-shadow:
658
+ 0 1px 2px rgba(38, 34, 24, 0.06),
659
+ 0 16px 40px -12px rgba(38, 34, 24, 0.25) !important;
660
+ }
661
+
662
+ .dd-menu,
663
+ .dropdown {
664
+ background: var(--menu-bg) !important;
665
+ border: 1px solid var(--border) !important;
666
+ border-radius: 4px !important;
667
+ box-shadow: 0 12px 32px -8px rgba(38, 34, 24, 0.28) !important;
668
+ }
669
+
670
+ .dd-item:hover,
671
+ .dd-all-item:hover {
672
+ background: var(--accent-soft) !important;
673
+ }
674
+
675
+ /* ---- 13. chips / 徽标:账目标签体 ---- */
676
+ .chip {
677
+ background: var(--chip-bg) !important;
678
+ border: 1px solid var(--border-soft) !important;
679
+ border-radius: 2px !important;
680
+ box-shadow: none !important;
681
+ font-family: var(--mono);
682
+ font-size: 11px;
683
+ }
684
+
685
+ /* ---- 14. 滚动条:细墨线 ---- */
686
+ ::-webkit-scrollbar {
687
+ width: 6px;
688
+ height: 6px;
689
+ }
690
+
691
+ ::-webkit-scrollbar-track {
692
+ background: transparent;
693
+ }
694
+
695
+ ::-webkit-scrollbar-thumb {
696
+ background: var(--scroll-thumb);
697
+ border-radius: 0;
698
+ }
699
+
700
+ ::-webkit-scrollbar-thumb:hover {
701
+ background: var(--scroll-thumb-hover);
702
+ }
703
+
704
+ /* ---- 15. 通知条:hairline 左线式 ---- */
705
+ .notice-err,
706
+ .notice-warn,
707
+ .notice-info {
708
+ border-radius: 0 !important;
709
+ border-width: 1px !important;
710
+ border-left-width: 3px !important;
711
+ }