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,658 @@
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 */
153
+ .topbar .chip,
154
+ .topbar .tb-tab,
155
+ .topbar .panel-toggle,
156
+ .topbar .plugin-topbar-item {
157
+ background: transparent !important;
158
+ border: 1px solid transparent !important;
159
+ border-radius: 3px !important;
160
+ box-shadow: none !important;
161
+ transition:
162
+ border-color 0.15s ease,
163
+ color 0.15s ease !important;
164
+ }
165
+
166
+ .topbar .chip:hover,
167
+ .topbar .tb-tab:hover,
168
+ .topbar .panel-toggle:hover,
169
+ .topbar .plugin-topbar-item:hover {
170
+ border-color: var(--border) !important;
171
+ background: transparent !important;
172
+ }
173
+
174
+ /* ---- 2. 消息区:左缘墨线活动脊 + 文档化排版 ----
175
+ * 列缘这条线让给脊线与输入框边框:脊线(虚线针脚)与输入框左边框同一条
176
+ * 像素线,历史虚下来、接到输入框变实;消息正文整体右移 23px 挂在轨上。
177
+ * 仅桌面(≥641px)启用;手机保持原生内缩。 */
178
+ @media (min-width: 641px) {
179
+ .messages {
180
+ padding-inline: max(0px, calc(var(--chat-inset) + 23px - var(--msgs-gutter, 0px))) !important;
181
+ background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.14) 40%, transparent 0);
182
+ background-repeat: repeat-y;
183
+ background-size: 1px 7px;
184
+ background-position: calc(var(--chat-inset) - 0.5px) top;
185
+ }
186
+ }
187
+
188
+ .msg {
189
+ position: relative;
190
+ padding: 2px 0 10px;
191
+ }
192
+
193
+ /* 操作按钮:行内簇已提升为基线默认(.chead-actions,随消息悬停显隐、
194
+ 与行内复制按钮并排),主题里不再需要任何覆盖。 */
195
+
196
+ /* 兜底路径(用户消息 / 纯文本回复,无 head 可宿主):底部操作行改为悬停
197
+ 浮牌,钉在消息右上角的空纸面上 */
198
+ .msg-actions {
199
+ position: absolute;
200
+ top: 0;
201
+ right: 0;
202
+ margin: 0;
203
+ z-index: 2;
204
+ padding: 2px;
205
+ background: var(--menu-bg) !important;
206
+ border: 1px solid var(--border) !important;
207
+ border-radius: 4px !important;
208
+ box-shadow: 0 4px 14px -4px rgba(0, 0, 0, 0.5) !important;
209
+ opacity: 0;
210
+ pointer-events: none;
211
+ transition:
212
+ opacity 0.12s ease,
213
+ pointer-events 0.12s ease;
214
+ }
215
+
216
+ .msg:hover .msg-actions,
217
+ .msg-actions.has-open-dropdown,
218
+ .msg-actions:focus-within {
219
+ opacity: 1;
220
+ pointer-events: auto;
221
+ }
222
+
223
+ /* 角色行:书目式小标 */
224
+ .msg-meta {
225
+ margin-bottom: 4px;
226
+ }
227
+
228
+ /* head 行左右内边距归零:折叠三角贴齐列左缘(文字同一条线),右侧复制
229
+ * 按钮贴右缘——head 无边框后,钮与缘之间不能悬空。三角形 28px 盒内 16px
230
+ * 图标居中内缩 6px,用负外边距做光学对齐。 */
231
+ .chead {
232
+ padding-left: 0;
233
+ padding-right: 0;
234
+ }
235
+
236
+ .chead-toggle {
237
+ margin-left: -6px;
238
+ }
239
+
240
+ /* 正文块上的单一复制键同样去重:消息复制已在 head 行的操作簇里 */
241
+ .msg-text-copy {
242
+ display: none !important;
243
+ }
244
+
245
+ /* head 悬浮不再出现底色块:纸面保持完全平整(键盘 focus 的 outline 保留,
246
+ * 只服务键盘导航) */
247
+ div.chead[role="button"]:hover,
248
+ .chead-toggle:hover {
249
+ background: transparent !important;
250
+ }
251
+
252
+ .msg-role {
253
+ font-size: 10.5px;
254
+ font-weight: 600;
255
+ letter-spacing: 0.18em;
256
+ color: var(--text-faint);
257
+ }
258
+
259
+ .msg-time {
260
+ font-family: var(--mono);
261
+ font-size: 10.5px;
262
+ }
263
+
264
+ /* ---- 3. 用户输入:去气泡,「起手式,夜纸批注体 ---- */
265
+ .msg-user .msg-body {
266
+ position: relative;
267
+ background: transparent !important;
268
+ border: none !important;
269
+ border-radius: 0 !important;
270
+ padding: 0 0 0 1.5em !important;
271
+ font-family: var(--serif);
272
+ font-size: 15.5px;
273
+ font-weight: 600;
274
+ line-height: 1.8;
275
+ color: var(--text);
276
+ }
277
+
278
+ .msg-user .msg-body::before {
279
+ content: "「";
280
+ position: absolute;
281
+ left: 0;
282
+ top: -0.12em;
283
+ font-family: var(--serif);
284
+ font-size: 1.3em;
285
+ font-weight: 700;
286
+ color: var(--accent);
287
+ line-height: 1;
288
+ }
289
+
290
+ /* ---- 4. 助手正文:衬线文档体 ---- */
291
+ .msg-assistant .msg-text {
292
+ font-family: var(--serif);
293
+ font-size: 15px;
294
+ line-height: 1.85;
295
+ color: var(--text);
296
+ }
297
+
298
+ .msg-assistant .msg-text p:first-child {
299
+ margin-top: 0;
300
+ }
301
+
302
+ .msg-assistant .msg-text h1,
303
+ .msg-assistant .msg-text h2,
304
+ .msg-assistant .msg-text h3,
305
+ .msg-assistant .msg-text h4 {
306
+ font-family: var(--serif);
307
+ font-weight: 700;
308
+ color: var(--md-strong);
309
+ letter-spacing: 0.02em;
310
+ }
311
+
312
+ .msg-assistant .msg-text blockquote {
313
+ border-left: 2px solid var(--accent-soft);
314
+ font-style: normal;
315
+ color: var(--text-dim);
316
+ }
317
+
318
+ .msg-assistant .msg-text a {
319
+ color: var(--link);
320
+ text-decoration: underline dotted;
321
+ text-decoration-color: rgba(224, 90, 53, 0.5);
322
+ text-underline-offset: 3px;
323
+ }
324
+
325
+ .msg-assistant .msg-text hr {
326
+ border: none;
327
+ border-top: 1px dotted var(--border);
328
+ }
329
+
330
+ .msg-assistant .msg-text code {
331
+ background: #2a2a2a;
332
+ color: #e5957a;
333
+ border-radius: 2px;
334
+ padding: 1px 5px;
335
+ }
336
+
337
+ /* ---- 5. 工具调用 = 台账行:无框无底,点线引导符填空 ---- */
338
+ .toolcall {
339
+ margin: 1px 0 !important;
340
+ border: none !important;
341
+ border-radius: 0 !important;
342
+ background: transparent !important;
343
+ box-shadow: none !important;
344
+ overflow: visible !important;
345
+ }
346
+
347
+ .toolcall-head {
348
+ display: flex;
349
+ align-items: center;
350
+ min-height: 24px;
351
+ padding: 2px 0;
352
+ font-family: var(--mono);
353
+ font-size: 12px;
354
+ }
355
+
356
+ .toolcall-name {
357
+ font-family: var(--mono) !important;
358
+ font-weight: 500 !important;
359
+ font-size: 12px !important;
360
+ letter-spacing: 0.02em;
361
+ color: var(--text-dim) !important;
362
+ }
363
+
364
+ /* 点线引导符:账本目录式填空 */
365
+ .toolcall .toolcall-spacer {
366
+ border-bottom: 1px dotted #3f3f3f;
367
+ height: 0.7em;
368
+ margin: 0 10px;
369
+ }
370
+
371
+ .toolcall-status {
372
+ color: var(--text-faint) !important;
373
+ }
374
+
375
+ .toolcall.run .toolcall-name {
376
+ color: var(--accent) !important;
377
+ }
378
+
379
+ .toolcall.run .toolcall-status {
380
+ color: var(--accent) !important;
381
+ }
382
+
383
+ .toolcall.ok .toolcall-status {
384
+ color: var(--green) !important;
385
+ }
386
+
387
+ .toolcall.err .toolcall-status {
388
+ color: var(--red) !important;
389
+ }
390
+
391
+ .toolcall.err .toolcall-name {
392
+ color: var(--red) !important;
393
+ }
394
+
395
+ /* 展开的参数/输出:并入台账,无框零内边距平面文本(--code-border/--code-pad
396
+ 已按全透明主题机制置 transparent/0,连带 .termline 一并生效) */
397
+ .toolcall-args pre,
398
+ .toolcall-output pre {
399
+ background: transparent !important;
400
+ border: none !important;
401
+ border-radius: 0 !important;
402
+ padding: 0 !important;
403
+ }
404
+
405
+ /* 工具卡体:去掉分隔线与内边距,参数/输出与卡头同距平铺 */
406
+ .toolcall-body {
407
+ border-top: none !important;
408
+ padding: 0 0 6px !important;
409
+ }
410
+
411
+ /* 卡内重复的终端图标只剩噪音(卡头已有工具图标),参照全透明主题隐藏 */
412
+ .termline-icon {
413
+ display: none;
414
+ }
415
+
416
+ .toolcall-output-label {
417
+ margin-top: 6px;
418
+ }
419
+
420
+ .toolcall-kill {
421
+ border-radius: 3px;
422
+ }
423
+
424
+ /* ---- 6. 思考流 = 脚注:※ 起手,淡墨小字 ---- */
425
+ .thinking {
426
+ margin: 4px 0 !important;
427
+ border: none !important;
428
+ border-radius: 0 !important;
429
+ background: transparent !important;
430
+ box-shadow: none !important;
431
+ }
432
+
433
+ .thinking-head {
434
+ font-size: 12px;
435
+ color: var(--text-faint);
436
+ }
437
+
438
+ .thinking-icon {
439
+ color: var(--text-faint) !important;
440
+ }
441
+
442
+ .thinking-body {
443
+ border-top: none !important;
444
+ font-style: normal !important;
445
+ font-size: 12.5px !important;
446
+ color: var(--text-dim) !important;
447
+ background: transparent;
448
+ position: relative;
449
+ padding: 2px 14px 2px 1.6em !important;
450
+ }
451
+
452
+ .thinking-body::before {
453
+ content: "※";
454
+ position: absolute;
455
+ left: 0;
456
+ top: 2px;
457
+ color: var(--text-faint);
458
+ }
459
+
460
+ .thinking-live .thinking-toggle,
461
+ .thinking-live-label {
462
+ color: var(--accent) !important;
463
+ }
464
+
465
+ /* ---- 7. 折叠摘要行 / 报错:并入台账体系 ---- */
466
+ .msg-collapsed {
467
+ background: transparent !important;
468
+ border: none !important;
469
+ border-bottom: 1px dotted var(--border-soft) !important;
470
+ border-radius: 0 !important;
471
+ box-shadow: none !important;
472
+ }
473
+
474
+ .msg-error {
475
+ background: var(--red-soft) !important;
476
+ border: none !important;
477
+ border-left: 3px solid var(--red) !important;
478
+ border-radius: 0 !important;
479
+ font-family: var(--serif);
480
+ }
481
+
482
+ /* ---- 8. 输入区 = 命令栏:与其他主题同构——只动颜色不动几何,
483
+ 朱笔以 inset 阴影画在边框内侧,外缘与脊线恒对齐 ---- */
484
+ .inputbar {
485
+ background: transparent !important;
486
+ }
487
+
488
+ .inputbox {
489
+ background: var(--inputbox-bg) !important;
490
+ border: 1px solid var(--border) !important;
491
+ border-radius: 3px !important;
492
+ box-shadow: inset 3px 0 0 0 rgba(224, 90, 53, 0.4) !important;
493
+ transition:
494
+ border-color 0.2s ease,
495
+ box-shadow 0.2s ease !important;
496
+ }
497
+
498
+ .inputbox:focus-within {
499
+ border-color: var(--accent) !important;
500
+ box-shadow: inset 3px 0 0 0 var(--accent) !important;
501
+ }
502
+
503
+ .btn.send {
504
+ background: var(--send-blue) !important;
505
+ color: #131313 !important;
506
+ border-radius: 3px !important;
507
+ box-shadow: none !important;
508
+ font-weight: 600;
509
+ }
510
+
511
+ .btn.send:hover {
512
+ background: var(--send-blue-hover) !important;
513
+ }
514
+
515
+ .btn.stop {
516
+ background: var(--stop-red) !important;
517
+ color: #131313 !important;
518
+ border-radius: 3px !important;
519
+ }
520
+
521
+ /* ---- 9. 底栏 / 状态栏:hairline 收边 ---- */
522
+ .statusbar {
523
+ background: var(--statusbar-bg) !important;
524
+ border-top: 1px solid var(--border-soft) !important;
525
+ box-shadow: none !important;
526
+ }
527
+
528
+ .goalbar {
529
+ background: transparent !important;
530
+ border-top: 1px solid var(--border-soft) !important;
531
+ box-shadow: none !important;
532
+ }
533
+
534
+ /* ---- 10. 左右面板:素纸文件栏 ----
535
+ * 激活态不做红洗(accent-soft 洗在墨底上是一块脏褐),改为中性纸面 7% +
536
+ * 左缘 2px 朱标;圆角统一 8px。 */
537
+ .panel {
538
+ background: var(--panel-bg) !important;
539
+ border-color: var(--border-soft) !important;
540
+ }
541
+
542
+ .session-item,
543
+ .project-item,
544
+ .file-item,
545
+ .scm-file {
546
+ border-radius: 8px;
547
+ }
548
+
549
+ .session-item.active,
550
+ .project-item.active {
551
+ background: rgba(255, 255, 255, 0.07);
552
+ border: none;
553
+ box-shadow: inset 2px 0 0 var(--accent);
554
+ }
555
+
556
+ .session-item.active {
557
+ padding: 8px 10px;
558
+ }
559
+
560
+ .project-item.active {
561
+ padding: 7px 10px;
562
+ }
563
+
564
+ /* ---- 11. 代码块:墨面凹版 ---- */
565
+ .codeblock {
566
+ background: var(--code-bg) !important;
567
+ border: 1px solid var(--border-soft) !important;
568
+ border-radius: 3px !important;
569
+ box-shadow: none !important;
570
+ }
571
+
572
+ .codeblock pre,
573
+ .msg-text pre {
574
+ background: var(--code-bg) !important;
575
+ color: var(--code-text) !important;
576
+ }
577
+
578
+ /* ---- 11b. 语法高亮去蓝底,转暖墨 ---- */
579
+ .hljs {
580
+ color: #d8d0bd;
581
+ background: transparent !important;
582
+ }
583
+
584
+ .hljs-deletion {
585
+ color: #f0a896;
586
+ background: rgba(224, 106, 80, 0.16);
587
+ }
588
+
589
+ .hljs-addition {
590
+ color: #a8d4a8;
591
+ background: rgba(111, 174, 127, 0.16);
592
+ }
593
+
594
+ /* ---- 12. 弹层与菜单:实底 + hairline,方角家族 ---- */
595
+ .modal,
596
+ .tool-info-modal,
597
+ .settings-modal,
598
+ .model-modal,
599
+ .tpl-modal,
600
+ .dd-menu,
601
+ .dialog-inline {
602
+ border-radius: 4px !important;
603
+ border: 1px solid var(--border) !important;
604
+ box-shadow:
605
+ 0 1px 2px rgba(0, 0, 0, 0.3),
606
+ 0 16px 40px -12px rgba(0, 0, 0, 0.55) !important;
607
+ }
608
+
609
+ .dd-menu,
610
+ .dropdown {
611
+ background: var(--menu-bg) !important;
612
+ border: 1px solid var(--border) !important;
613
+ border-radius: 4px !important;
614
+ box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.6) !important;
615
+ }
616
+
617
+ .dd-item:hover,
618
+ .dd-all-item:hover {
619
+ background: var(--accent-soft) !important;
620
+ }
621
+
622
+ /* ---- 13. chips / 徽标:账目标签体 ---- */
623
+ .chip {
624
+ background: var(--chip-bg) !important;
625
+ border: 1px solid var(--border-soft) !important;
626
+ border-radius: 2px !important;
627
+ box-shadow: none !important;
628
+ font-family: var(--mono);
629
+ font-size: 11px;
630
+ }
631
+
632
+ /* ---- 14. 滚动条:细墨线 ---- */
633
+ ::-webkit-scrollbar {
634
+ width: 6px;
635
+ height: 6px;
636
+ }
637
+
638
+ ::-webkit-scrollbar-track {
639
+ background: transparent;
640
+ }
641
+
642
+ ::-webkit-scrollbar-thumb {
643
+ background: var(--scroll-thumb);
644
+ border-radius: 0;
645
+ }
646
+
647
+ ::-webkit-scrollbar-thumb:hover {
648
+ background: var(--scroll-thumb-hover);
649
+ }
650
+
651
+ /* ---- 15. 通知条:hairline 左线式 ---- */
652
+ .notice-err,
653
+ .notice-warn,
654
+ .notice-info {
655
+ border-radius: 0 !important;
656
+ border-width: 1px !important;
657
+ border-left-width: 3px !important;
658
+ }