pi-web-ui 0.94.0 → 0.95.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.
- package/CHANGELOG.md +62 -0
- package/README.md +5 -6
- package/README.zh-CN.md +4 -5
- package/bin/pi-web-ui.mjs +751 -206
- package/dist/server/agent-service.js +1869 -85
- package/dist/server/approval-rules.js +550 -0
- package/dist/server/attachment-store.js +112 -0
- package/dist/server/attachments.js +62 -171
- package/dist/server/client-state.js +4 -0
- package/dist/server/compact-context-tool.js +125 -0
- package/dist/server/context-budget.js +317 -0
- package/dist/server/dangling-tools.js +162 -0
- package/dist/server/dsh/dsh-agent-service.js +50 -60
- package/dist/server/edit-soft-tool.js +70 -5
- package/dist/server/eval-tool.js +535 -0
- package/dist/server/files-service.js +35 -7
- package/dist/server/goal-service.js +240 -68
- package/dist/server/hashline-engine.js +665 -0
- package/dist/server/host-metrics.js +26 -2
- package/dist/server/http-proxy.js +11 -1
- package/dist/server/index.js +157 -9
- package/dist/server/lsp-tool.js +679 -0
- package/dist/server/model-admin.js +20 -0
- package/dist/server/office-parse.js +309 -0
- package/dist/server/patch-tool.js +91 -0
- package/dist/server/plan-manager.js +104 -0
- package/dist/server/plugin-api-catalog.js +296 -0
- package/dist/server/plugin-install-spec.js +196 -0
- package/dist/server/plugin-installer.js +73 -0
- package/dist/server/plugin-manifest-validate.js +305 -0
- package/dist/server/plugin-project.js +47 -11
- package/dist/server/plugin-tool-guard.js +120 -0
- package/dist/server/plugins.js +745 -161
- package/dist/server/process-utils.js +12 -6
- package/dist/server/scheduler-tasks.js +6 -0
- package/dist/server/serialize.js +13 -3
- package/dist/server/settings-service.js +108 -1
- package/dist/server/subagents.js +41 -0
- package/dist/server/terminals.js +69 -14
- package/dist/server/tool-approval.js +84 -0
- package/dist/server/tool-manager.js +214 -6
- package/dist/server/workspace-snapshot.js +113 -0
- package/package.json +3 -2
- package/plugin-sdk/README.md +25 -0
- package/plugin-sdk/index.d.ts +31 -38
- package/plugin-sdk/index.mjs +35 -19
- package/plugins/catalog.json +20 -0
- package/themes/ayu-light.css +6 -6
- package/themes/catppuccin-latte.css +6 -6
- package/themes/claude-code-dark.css +144 -0
- package/themes/codex.css +6 -6
- package/themes/dark-teal.css +20 -6
- package/themes/everforest-light.css +6 -6
- package/themes/geist.css +6 -6
- package/themes/gruvbox-light.css +6 -6
- package/themes/kanagawa-lotus.css +6 -6
- package/themes/rose-pine-dawn.css +6 -6
- package/themes/solarized-light.css +6 -6
- package/themes/vs-code-dark.css +146 -0
- package/web/dist/assets/{TerminalPanel-B-CMQuzm.js → TerminalPanel-DlGBF2MD.js} +1 -1
- package/web/dist/assets/index-BXnCQL9p.js +364 -0
- package/web/dist/assets/index-RpIGFyi_.css +1 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-18jK6al2.js +0 -364
- package/web/dist/assets/index-B3S9MxnN.css +0 -1
package/plugin-sdk/index.mjs
CHANGED
|
@@ -211,18 +211,20 @@ export function createMockHost(overrides) {
|
|
|
211
211
|
// 订阅类:存 handler + 返回注销函数(调用本身由外层统一记进 calls)。
|
|
212
212
|
// handler 缺省取首参;fs.watch(path, handler) / events.on(topic, handler) /
|
|
213
213
|
// shortcuts.register(key, handler) 这类回调在第二参,用 sub(method, 1)。
|
|
214
|
-
const sub =
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
214
|
+
const sub =
|
|
215
|
+
(method, argIndex = 0) =>
|
|
216
|
+
(...args) => {
|
|
217
|
+
const handler = args[argIndex];
|
|
218
|
+
if (typeof handler === "function") handlersOf(method).push(handler);
|
|
219
|
+
let done = false;
|
|
220
|
+
return () => {
|
|
221
|
+
if (done) return;
|
|
222
|
+
done = true;
|
|
223
|
+
const arr = handlersOf(method);
|
|
224
|
+
const i = arr.indexOf(handler);
|
|
225
|
+
if (i >= 0) arr.splice(i, 1);
|
|
226
|
+
};
|
|
224
227
|
};
|
|
225
|
-
};
|
|
226
228
|
const logImpl = (levelOrArg, ...args) => {
|
|
227
229
|
const levels = ["debug", "info", "warn", "error"];
|
|
228
230
|
const level = levels.includes(levelOrArg) ? levelOrArg : "info";
|
|
@@ -243,12 +245,16 @@ export function createMockHost(overrides) {
|
|
|
243
245
|
try {
|
|
244
246
|
console.error("[mock-host]", text);
|
|
245
247
|
} catch {
|
|
246
|
-
|
|
248
|
+
/* 打印失败不影响单测 */
|
|
247
249
|
}
|
|
248
250
|
}
|
|
249
251
|
};
|
|
250
252
|
const statImpl = (p) => ({
|
|
251
|
-
name:
|
|
253
|
+
name:
|
|
254
|
+
String(p ?? "")
|
|
255
|
+
.split(/[\\/]/)
|
|
256
|
+
.filter(Boolean)
|
|
257
|
+
.pop() ?? "",
|
|
252
258
|
type: "file",
|
|
253
259
|
size: 0,
|
|
254
260
|
mtime: 0,
|
|
@@ -264,6 +270,7 @@ export function createMockHost(overrides) {
|
|
|
264
270
|
const routeStore = [];
|
|
265
271
|
const proxyStore = [];
|
|
266
272
|
const scheduleStore = [];
|
|
273
|
+
const effectStore = [];
|
|
267
274
|
// 注册类:存定义体 + 返回只摘除本次注册的注销函数(与宿主同语义)。
|
|
268
275
|
const remember = (store, entry) => {
|
|
269
276
|
if (entry !== undefined) store.push(entry);
|
|
@@ -283,6 +290,8 @@ export function createMockHost(overrides) {
|
|
|
283
290
|
sendTo: noop,
|
|
284
291
|
onAttach: sub("onAttach"),
|
|
285
292
|
onToolEvent: sub("onToolEvent"),
|
|
293
|
+
onToolPre: sub("onToolPre"),
|
|
294
|
+
onToolPost: sub("onToolPost"),
|
|
286
295
|
onRunEvent: sub("onRunEvent"),
|
|
287
296
|
getActiveConversation: () => null,
|
|
288
297
|
chat: async () => okFalse("chatProvider(无头调用未接入)"),
|
|
@@ -313,8 +322,7 @@ export function createMockHost(overrides) {
|
|
|
313
322
|
const list = Array.isArray(items) ? items : [items];
|
|
314
323
|
const added = [];
|
|
315
324
|
for (const raw of list.slice(0, 32)) {
|
|
316
|
-
const id =
|
|
317
|
-
raw && typeof raw.id === "string" && raw.id ? raw.id : `mock-${++uiAutoId}`;
|
|
325
|
+
const id = raw && typeof raw.id === "string" && raw.id ? raw.id : `mock-${++uiAutoId}`;
|
|
318
326
|
uiItems.set(id, isPlainObject(raw) ? { ...raw, id } : { id });
|
|
319
327
|
added.push(id);
|
|
320
328
|
}
|
|
@@ -421,6 +429,12 @@ export function createMockHost(overrides) {
|
|
|
421
429
|
on: sub("events.on", 1),
|
|
422
430
|
},
|
|
423
431
|
log: logImpl,
|
|
432
|
+
// effect 栈:mock 里只记调用 + 返回可撤函数(真实宿主在反激活时逆序回卷)。
|
|
433
|
+
// 单测里测试 dispose 真跑的写法:拿到 off() 后调它,或断言 host.calls 里有 effect。
|
|
434
|
+
effect: (label, dispose) => {
|
|
435
|
+
const entry = { label, dispose };
|
|
436
|
+
return remember(effectStore, entry);
|
|
437
|
+
},
|
|
424
438
|
// 浏览器桥兼容(client 侧逻辑单测也能用同一个 mock):无注入回退语义。
|
|
425
439
|
dialogs: {
|
|
426
440
|
select: async () => ({ ok: false }),
|
|
@@ -527,10 +541,12 @@ export function createMockHost(overrides) {
|
|
|
527
541
|
}
|
|
528
542
|
}
|
|
529
543
|
// 记录层:所有 host 方法(mock/reset 除外)先记 calls 再委托。
|
|
530
|
-
const record =
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
544
|
+
const record =
|
|
545
|
+
(method, fn) =>
|
|
546
|
+
(...args) => {
|
|
547
|
+
calls.push({ method, args, seq: calls.length });
|
|
548
|
+
return fn(...args);
|
|
549
|
+
};
|
|
534
550
|
for (const [key, value] of Object.entries(host)) {
|
|
535
551
|
if (key === "calls" || key === "logs" || key === "mock" || key === "reset") continue;
|
|
536
552
|
if (typeof value === "function") {
|
package/plugins/catalog.json
CHANGED
|
@@ -109,6 +109,16 @@
|
|
|
109
109
|
"source": "xing-shuyin/pi-web-ui/plugins/notes",
|
|
110
110
|
"homepage": "https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/notes"
|
|
111
111
|
},
|
|
112
|
+
{
|
|
113
|
+
"id": "desktop-use",
|
|
114
|
+
"name": "桌面控制",
|
|
115
|
+
"icon": "🖱️",
|
|
116
|
+
"iconSvg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"7\"/><line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"10\"/></svg>",
|
|
117
|
+
"description": "让 AI 操作 Windows 桌面:按元素名查控件坐标(UI Automation,无需截图)→ 点击 / 输入(含中文粘贴)/ 按键 / 聚焦窗口。输入库缺失时自动安装,卸载时连带删除。",
|
|
118
|
+
"descriptionEn": "Let the AI drive the Windows desktop: find controls by name via UI Automation (no screenshots) → click / type (CJK via paste) / hotkeys / focus windows. The input library auto-installs on activate and is removed with the plugin.",
|
|
119
|
+
"source": "xing-shuyin/pi-web-ui/plugins/desktop-use",
|
|
120
|
+
"homepage": "https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/desktop-use"
|
|
121
|
+
},
|
|
112
122
|
{
|
|
113
123
|
"id": "pi-web-multigit",
|
|
114
124
|
"name": "multi-git",
|
|
@@ -118,5 +128,15 @@
|
|
|
118
128
|
"descriptionEn": "Multi-repo Git overview: changes, diffs, history, branches, stashes, cross-repo search and a timeline for every repository in the workspace, plus a workspace-wide branch view, Fetch/Pull and an optional terminal.",
|
|
119
129
|
"source": "EinErste/pi-web-multigit",
|
|
120
130
|
"homepage": "https://github.com/EinErste/pi-web-multigit"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "reconnect",
|
|
134
|
+
"name": "重连",
|
|
135
|
+
"icon": "🔄",
|
|
136
|
+
"iconSvg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M3 21v-5h5\"/></svg>",
|
|
137
|
+
"description": "断连恢复:查看网页服务与重启守护状态,一键重新连接或重启网页服务(支持单服务/全服务重启,配套可选独立守护进程)。",
|
|
138
|
+
"descriptionEn": "Reconnection & service recovery: inspect web service and companion watchdog health, reconnect or restart services in one click (supports multi-service restarts with companion watchdog).",
|
|
139
|
+
"source": "xieweimo/pi-web-ui-reconnect-watchdog/reconnect-plugin",
|
|
140
|
+
"homepage": "https://github.com/xieweimo/pi-web-ui-reconnect-watchdog"
|
|
121
141
|
}
|
|
122
142
|
]
|
package/themes/ayu-light.css
CHANGED
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #18a97c;
|
|
63
63
|
--scroll-thumb: #d8dade;
|
|
64
64
|
--scroll-thumb-hover: #b9bcc2;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #f29718;
|
|
72
72
|
--send-blue-hover: #e08a0d;
|
|
73
73
|
--stop-red: #ef4444;
|
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #40a02b;
|
|
63
63
|
--scroll-thumb: #ccd0da;
|
|
64
64
|
--scroll-thumb-hover: #bcc0cc;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #1e66f5;
|
|
72
72
|
--send-blue-hover: #7287fd;
|
|
73
73
|
--stop-red: #ef4444;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/* theme-name: Claude Code 暗色 */
|
|
2
|
+
/* theme-name-en: Claude Code Dark */
|
|
3
|
+
/* theme-group: classic */
|
|
4
|
+
:root {
|
|
5
|
+
color-scheme: dark;
|
|
6
|
+
--bg: #191917;
|
|
7
|
+
--bg-elev: #21201d;
|
|
8
|
+
--bg-elev2: #282622;
|
|
9
|
+
--border: #3a3730;
|
|
10
|
+
--border-soft: #2d2b25;
|
|
11
|
+
--text: #f0ede4;
|
|
12
|
+
--text-dim: #b8b3a6;
|
|
13
|
+
--text-faint: #7e7a6e;
|
|
14
|
+
--accent: #cc785c;
|
|
15
|
+
--accent-soft: rgba(204, 120, 92, 0.14);
|
|
16
|
+
--green: #82b573;
|
|
17
|
+
--green-soft: rgba(130, 181, 115, 0.12);
|
|
18
|
+
--red: #e5765a;
|
|
19
|
+
--red-soft: rgba(229, 118, 90, 0.12);
|
|
20
|
+
--amber: #d9a05b;
|
|
21
|
+
--blue: #7da7d9;
|
|
22
|
+
--blue-soft: rgba(125, 167, 217, 0.12);
|
|
23
|
+
--term-bg: #141312;
|
|
24
|
+
--term-fg: #f0ede4;
|
|
25
|
+
--term-cursor: #cc785c;
|
|
26
|
+
--term-cursor-accent: #141312;
|
|
27
|
+
--term-selection: rgba(204, 120, 92, 0.28);
|
|
28
|
+
--term-black: #282622;
|
|
29
|
+
--term-red: #e5765a;
|
|
30
|
+
--term-green: #82b573;
|
|
31
|
+
--term-yellow: #d9a05b;
|
|
32
|
+
--term-blue: #7da7d9;
|
|
33
|
+
--term-magenta: #b48ead;
|
|
34
|
+
--term-cyan: #7fb5b0;
|
|
35
|
+
--term-white: #e3ded2;
|
|
36
|
+
--term-bright-black: #7e7a6e;
|
|
37
|
+
--term-bright-red: #e5765a;
|
|
38
|
+
--term-bright-green: #82b573;
|
|
39
|
+
--term-bright-yellow: #d9a05b;
|
|
40
|
+
--term-bright-blue: #7da7d9;
|
|
41
|
+
--term-bright-magenta: #b48ead;
|
|
42
|
+
--term-bright-cyan: #7fb5b0;
|
|
43
|
+
--term-bright-white: #ffffff;
|
|
44
|
+
--mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
|
|
45
|
+
--mermaid-font-size: 12px;
|
|
46
|
+
--tooltip-bg: #21201d;
|
|
47
|
+
--code-bg: #141312;
|
|
48
|
+
--code-text: #e3ded2;
|
|
49
|
+
--code-border: var(--border-soft);
|
|
50
|
+
--code-pad: 8px 10px;
|
|
51
|
+
--card-body-pad: 4px 14px 12px;
|
|
52
|
+
--err-text: #f0a08c;
|
|
53
|
+
--red-text: #f5b3a3;
|
|
54
|
+
--amber-text: #e8c08a;
|
|
55
|
+
--info-blue: #7da7d9;
|
|
56
|
+
--link: #d98e73;
|
|
57
|
+
--link-hover: #e3a189;
|
|
58
|
+
--link-soft: #e3a189;
|
|
59
|
+
--md-strong: #f0ede4;
|
|
60
|
+
--skill-blue: #7da7d9;
|
|
61
|
+
--plugin-purple: #b48ead;
|
|
62
|
+
--auth-green: #82b573;
|
|
63
|
+
--scroll-thumb: #33302a;
|
|
64
|
+
--scroll-thumb-hover: #454138;
|
|
65
|
+
--notice-err-bg: #3d1f1a;
|
|
66
|
+
--notice-warn-bg: #382c1c;
|
|
67
|
+
--notice-info-bg: #1c2530;
|
|
68
|
+
--notice-err-border: #e5765a;
|
|
69
|
+
--notice-warn-border: #d9a05b;
|
|
70
|
+
--notice-info-border: #7da7d9;
|
|
71
|
+
--send-blue: #cc785c;
|
|
72
|
+
--send-blue-hover: #d98e73;
|
|
73
|
+
--stop-red: #e5765a;
|
|
74
|
+
--stop-red-hover: #d96247;
|
|
75
|
+
--brand-grad-a: #cc785c;
|
|
76
|
+
--brand-grad-b: #d9a05b;
|
|
77
|
+
--on-amber: #1a1a1a;
|
|
78
|
+
--search-active-fg: #191917;
|
|
79
|
+
--switch-knob: #ffffff;
|
|
80
|
+
--bg-elev3: rgba(255, 255, 255, 0.05);
|
|
81
|
+
--sunken-bg: rgba(0, 0, 0, 0.18);
|
|
82
|
+
--glow-015: rgba(255, 255, 255, 0.015);
|
|
83
|
+
--glow-025: rgba(255, 255, 255, 0.025);
|
|
84
|
+
--glow-03: rgba(255, 255, 255, 0.03);
|
|
85
|
+
--glow-04: rgba(255, 255, 255, 0.04);
|
|
86
|
+
--glow-05: rgba(255, 255, 255, 0.05);
|
|
87
|
+
--glow-12: rgba(255, 255, 255, 0.12);
|
|
88
|
+
--glow-18: rgba(255, 255, 255, 0.18);
|
|
89
|
+
--glow-22: rgba(255, 255, 255, 0.22);
|
|
90
|
+
--glow-38: rgba(255, 255, 255, 0.38);
|
|
91
|
+
--control-fg: #b8b3a6;
|
|
92
|
+
--control-bg: #21201d;
|
|
93
|
+
--control-border: #3a3730;
|
|
94
|
+
--bg-image: none;
|
|
95
|
+
--bg-image-dim: 0.78;
|
|
96
|
+
--bg-image-blur: 0px;
|
|
97
|
+
--wallpaper-panel-alpha: 100%;
|
|
98
|
+
--topbar-bg: #21201d;
|
|
99
|
+
--statusbar-bg: #141312;
|
|
100
|
+
--panel-bg: #21201d;
|
|
101
|
+
--card-bg: #21201d;
|
|
102
|
+
--chip-bg: #282622;
|
|
103
|
+
--msgs-bg: #191917;
|
|
104
|
+
--inputbox-bg: #21201d;
|
|
105
|
+
--menu-bg: var(--bg-elev2);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* ---- syntax highlighting (Claude Code Dark) ---- */
|
|
109
|
+
.hljs {
|
|
110
|
+
color: #e3ded2;
|
|
111
|
+
background: #141312;
|
|
112
|
+
}
|
|
113
|
+
.hljs-doctag,
|
|
114
|
+
.hljs-keyword,
|
|
115
|
+
.hljs-meta .hljs-keyword {
|
|
116
|
+
color: #cc785c;
|
|
117
|
+
}
|
|
118
|
+
.hljs-title,
|
|
119
|
+
.hljs-title.class_,
|
|
120
|
+
.hljs-title.function_ {
|
|
121
|
+
color: #d9a05b;
|
|
122
|
+
}
|
|
123
|
+
.hljs-attr,
|
|
124
|
+
.hljs-attribute,
|
|
125
|
+
.hljs-literal,
|
|
126
|
+
.hljs-number {
|
|
127
|
+
color: #e08d5f;
|
|
128
|
+
}
|
|
129
|
+
.hljs-string,
|
|
130
|
+
.hljs-regexp {
|
|
131
|
+
color: #9cbf8a;
|
|
132
|
+
}
|
|
133
|
+
.hljs-built_in,
|
|
134
|
+
.hljs-type {
|
|
135
|
+
color: #7fb5b0;
|
|
136
|
+
}
|
|
137
|
+
.hljs-comment,
|
|
138
|
+
.hljs-code {
|
|
139
|
+
color: #7e7a6e;
|
|
140
|
+
}
|
|
141
|
+
.hljs-tag,
|
|
142
|
+
.hljs-name {
|
|
143
|
+
color: #7da7d9;
|
|
144
|
+
}
|
package/themes/codex.css
CHANGED
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #10a37f;
|
|
63
63
|
--scroll-thumb: #d4d4d8;
|
|
64
64
|
--scroll-thumb-hover: #a1a1aa;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #10a37f;
|
|
72
72
|
--send-blue-hover: #0e8c6d;
|
|
73
73
|
--stop-red: #ef4444;
|
package/themes/dark-teal.css
CHANGED
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
color-scheme: dark;
|
|
5
5
|
--bg: #0a0a0a;
|
|
6
6
|
--bg-elev: #17171c;
|
|
7
|
-
--bg-elev2: #
|
|
7
|
+
--bg-elev2: #222228;
|
|
8
8
|
--border: #26262e;
|
|
9
9
|
--border-soft: #1f1f26;
|
|
10
10
|
--text: #dadada;
|
|
11
|
+
--text-strong: #3c9185; /* 深色主题下,用主题色使粗体更明显 */
|
|
11
12
|
--text-dim: #a8a8b3;
|
|
12
13
|
--text-faint: #6e6e7a;
|
|
13
14
|
--accent: #31ac9d;
|
|
@@ -53,8 +54,8 @@
|
|
|
53
54
|
--notice-info-border: #2dd4bf;
|
|
54
55
|
--send-blue: #0f766e;
|
|
55
56
|
--send-blue-hover: #0b5a54;
|
|
56
|
-
--brand-grad-a: #
|
|
57
|
-
--brand-grad-b: #
|
|
57
|
+
--brand-grad-a: #00ffe7;
|
|
58
|
+
--brand-grad-b: #202020;
|
|
58
59
|
--on-amber: #12121a;
|
|
59
60
|
--search-active-fg: #0f0f12;
|
|
60
61
|
--switch-knob: #f5f5f7;
|
|
@@ -169,12 +170,12 @@
|
|
|
169
170
|
color: #0f0f12;
|
|
170
171
|
}
|
|
171
172
|
|
|
172
|
-
|
|
173
173
|
/* 模板卡悬停阴影 */
|
|
174
174
|
.empty-template:hover {
|
|
175
175
|
box-shadow: 0 8px 22px #5DC7B040;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
/* 描边 */
|
|
178
179
|
/* 内置几处写死的紫描边,换成符合主题的青 */
|
|
179
180
|
.empty-template:hover,
|
|
180
181
|
.empty-template.add:hover,
|
|
@@ -187,7 +188,8 @@
|
|
|
187
188
|
.attach-chip,
|
|
188
189
|
.attachcard-mode.bridged,
|
|
189
190
|
.browser-control-modal .bc-cite,
|
|
190
|
-
.notice-info
|
|
191
|
+
.notice-info,
|
|
192
|
+
.set-catalog-custom {
|
|
191
193
|
border-color: #5DC7B080;
|
|
192
194
|
}
|
|
193
195
|
.chip.newchat {
|
|
@@ -215,6 +217,11 @@
|
|
|
215
217
|
.fp-html-bar {
|
|
216
218
|
background: var(--accent-soft);
|
|
217
219
|
}
|
|
220
|
+
/* 侧栏 Hover */
|
|
221
|
+
.lp-section-title:hover {
|
|
222
|
+
background: var(--chip-bg);
|
|
223
|
+
}
|
|
224
|
+
|
|
218
225
|
|
|
219
226
|
/* 输入框发送\停止按钮阴影 */
|
|
220
227
|
.inputbox .btn.send,
|
|
@@ -228,10 +235,15 @@
|
|
|
228
235
|
box-shadow: 0 8px 22px #5dc7b040;
|
|
229
236
|
}
|
|
230
237
|
|
|
231
|
-
/*
|
|
238
|
+
/* 正文 */
|
|
239
|
+
/* 行内代码更显眼 */
|
|
232
240
|
.msg-text code {
|
|
233
241
|
background: #303038;
|
|
234
242
|
}
|
|
243
|
+
/* 粗体用 --text-strong */
|
|
244
|
+
strong {
|
|
245
|
+
color: var(--text-strong);
|
|
246
|
+
}
|
|
235
247
|
|
|
236
248
|
/* 调整 MD 文件预览样式 */
|
|
237
249
|
.fp-markdown :not(pre)>code,
|
|
@@ -250,3 +262,5 @@
|
|
|
250
262
|
.fp-markdown {
|
|
251
263
|
background: radial-gradient(circle at 10% 0%, #5CCBF60D, transparent 34%), #00000038;
|
|
252
264
|
}
|
|
265
|
+
|
|
266
|
+
|
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #8da101;
|
|
63
63
|
--scroll-thumb: #d8d3bd;
|
|
64
64
|
--scroll-thumb-hover: #bdc3af;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #3a94c5;
|
|
72
72
|
--send-blue-hover: #2e7aa6;
|
|
73
73
|
--stop-red: #ef4444;
|
package/themes/geist.css
CHANGED
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #059669;
|
|
63
63
|
--scroll-thumb: #d4d4d4;
|
|
64
64
|
--scroll-thumb-hover: #a3a3a3;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #000000;
|
|
72
72
|
--send-blue-hover: #333333;
|
|
73
73
|
--stop-red: #ef4444;
|
package/themes/gruvbox-light.css
CHANGED
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #79740e;
|
|
63
63
|
--scroll-thumb: #d5c4a1;
|
|
64
64
|
--scroll-thumb-hover: #bdae93;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #9d0006;
|
|
72
72
|
--send-blue-hover: #af3a03;
|
|
73
73
|
--stop-red: #ef4444;
|
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #6f894e;
|
|
63
63
|
--scroll-thumb: #d5cea3;
|
|
64
64
|
--scroll-thumb-hover: #bfb586;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #4d699b;
|
|
72
72
|
--send-blue-hover: #3d5680;
|
|
73
73
|
--stop-red: #ef4444;
|
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #56949f;
|
|
63
63
|
--scroll-thumb: #e0d8ce;
|
|
64
64
|
--scroll-thumb-hover: #c9bfb2;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #907aa9;
|
|
72
72
|
--send-blue-hover: #79759c;
|
|
73
73
|
--stop-red: #ef4444;
|
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
--auth-green: #859900;
|
|
63
63
|
--scroll-thumb: #d5cbab;
|
|
64
64
|
--scroll-thumb-hover: #b7a982;
|
|
65
|
-
--notice-err-bg:
|
|
66
|
-
--notice-warn-bg:
|
|
67
|
-
--notice-info-bg:
|
|
68
|
-
--notice-err-border:
|
|
69
|
-
--notice-warn-border:
|
|
70
|
-
--notice-info-border:
|
|
65
|
+
--notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
|
|
66
|
+
--notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
|
|
67
|
+
--notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
|
|
68
|
+
--notice-err-border: var(--red);
|
|
69
|
+
--notice-warn-border: var(--amber);
|
|
70
|
+
--notice-info-border: var(--info-blue);
|
|
71
71
|
--send-blue: #268bd2;
|
|
72
72
|
--send-blue-hover: #2aa198;
|
|
73
73
|
--stop-red: #ef4444;
|