mingdao-harness 0.6.19 → 0.6.21
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/docs/DEVELOPER.md +12 -0
- package/package.json +1 -1
- package/src/web/app.js +116 -799
- package/src/web/index.html +293 -1099
package/src/web/index.html
CHANGED
|
@@ -65,14 +65,35 @@ header{min-height:52px;display:flex;align-items:center;gap:10px;padding:8px 12px
|
|
|
65
65
|
header .logo{font-weight:700;font-size:16px;color:var(--accent);letter-spacing:.5px;flex:none}
|
|
66
66
|
header .logo span{color:var(--text)}
|
|
67
67
|
header .badge{font-size:12px;color:var(--dim);background:var(--bg3);border:1px solid var(--border);padding:2px 10px;border-radius:20px;flex:none;overflow:hidden;text-overflow:ellipsis;max-width:180px}
|
|
68
|
+
/* §3.83:crumb 是左半区唯一会随会话名变长的项;限到 120px,避免会话名一长就把右半区的
|
|
69
|
+
「历史会话」再次挤出 1000px 视口(完整标题仍在 title 里,内容不丢)。 */
|
|
70
|
+
#crumb{max-width:120px}
|
|
68
71
|
header button{white-space:nowrap;flex:none}
|
|
69
72
|
header select{flex:none}
|
|
73
|
+
/* §3.83 顶栏 1000px 不裁切:右半区控件(费用 / 搜索会话 / 历史会话 / 任务 / 会话管理 / 新对话)
|
|
74
|
+
收进一个可横向滚动的容器(min-width:0 才允许收缩);宽屏由容器内的 .spacer 把控件推到最右,
|
|
75
|
+
窄屏从「费用 + 搜索会话 + 历史会话」开始露出,其余控件在同一容器里横向滚动触达——
|
|
76
|
+
不再整条顶栏溢出到屏幕外。 */
|
|
77
|
+
header .hdr-right{display:flex;align-items:center;gap:8px;flex:1 1 auto;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:var(--border) transparent}
|
|
78
|
+
header .hdr-right::-webkit-scrollbar{height:4px}
|
|
79
|
+
header .hdr-right::-webkit-scrollbar-thumb{background:var(--border);border:0;border-radius:2px}
|
|
80
|
+
header .hdr-right::-webkit-scrollbar-track{background:transparent}
|
|
70
81
|
#sessionSearch{flex:1 1 auto;min-width:70px;max-width:220px;background:var(--bg3);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 12px;font-size:13px}
|
|
71
82
|
#modelSel{max-width:170px;min-width:0}
|
|
72
83
|
#presetSel{max-width:140px;min-width:0}
|
|
73
84
|
#permSel{max-width:150px;min-width:0}
|
|
74
85
|
#sessions{max-width:150px;min-width:0}
|
|
75
|
-
#wsSel{max-width:
|
|
86
|
+
#wsSel{max-width:110px;min-width:64px}
|
|
87
|
+
/* §3.83 1000px:诊断徽标(≤900 本就隐藏)让位给「费用 + 搜索 + 历史会话」;顶栏 gap 10→6,
|
|
88
|
+
右半区容器因此拿到约 322px(费用 122 + 搜索 70 + 历史会话 98),三者完整可见。 */
|
|
89
|
+
@media (max-width:1100px){
|
|
90
|
+
header{gap:6px;padding:8px}
|
|
91
|
+
header .hdr-right{gap:8px}
|
|
92
|
+
#envBadge{display:none!important}
|
|
93
|
+
#wsSel{max-width:120px}
|
|
94
|
+
#sessionSearch{min-width:70px;max-width:120px}
|
|
95
|
+
#sessions{max-width:110px}
|
|
96
|
+
}
|
|
76
97
|
@media (max-width:860px){main{padding:14px 0 8px}#chat{padding:0 10px}#envBadge{display:none!important}#sessionSearch{max-width:110px}#modelSel{max-width:110px}#permSel{max-width:120px}#sessions{max-width:110px}#wsSel{max-width:96px}header{gap:6px;padding:8px 8px}header .logo span{display:none}}
|
|
77
98
|
#sessionSearch:focus{outline:none;border-color:var(--accent2)}
|
|
78
99
|
#tasksPanel{position:fixed;right:0;top:52px;bottom:0;width:280px;background:var(--bg2);border-left:1px solid var(--border);z-index:40;display:flex;flex-direction:column}
|
|
@@ -96,7 +117,7 @@ header select{flex:none}
|
|
|
96
117
|
#trajRail{position:fixed;left:0;top:52px;bottom:0;width:42px;background:var(--bg2);border-right:1px solid var(--border);z-index:35;display:flex;flex-direction:column;align-items:center;padding-top:10px;gap:10px}
|
|
97
118
|
#trajRail .rail-btn{width:34px;height:34px;border-radius:10px;border:1px solid var(--border);background:var(--bg3);cursor:pointer;font-size:15px;display:flex;align-items:center;justify-content:center}
|
|
98
119
|
#trajRail .rail-btn:hover{border-color:var(--accent2);color:var(--accent2)}
|
|
99
|
-
#trajRail .rail-btn.on{background:linear-gradient(135deg,var(--accent),var(--accent2));color
|
|
120
|
+
#trajRail .rail-btn.on{background:linear-gradient(135deg,var(--accent),var(--accent2));color:#06121a;border:none}
|
|
100
121
|
#trajRail .rail-btn{position:relative}
|
|
101
122
|
#trajRail .rail-badge{position:absolute;top:-4px;right:-4px;min-width:14px;height:14px;padding:0 3px;border-radius:8px;background:var(--err);color:#fff;font-size:9.5px;line-height:14px;text-align:center;font-weight:700}
|
|
102
123
|
#subPanel{position:fixed;right:0;top:52px;bottom:0;width:320px;background:var(--bg2);border-left:1px solid var(--border);z-index:40;display:flex;flex-direction:column}
|
|
@@ -106,12 +127,12 @@ header select{flex:none}
|
|
|
106
127
|
.sb-item{padding:8px 10px;border:1px solid var(--border);border-radius:10px;margin-bottom:8px;font-size:12.5px;background:var(--bg3);cursor:pointer}
|
|
107
128
|
.sb-item:hover{border-color:var(--accent2)}
|
|
108
129
|
.sb-item .sb-q{color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
109
|
-
.sb-item .sb-meta{color:var(--
|
|
130
|
+
.sb-item .sb-meta{color:var(--faint);font-size:11.5px;margin-top:3px}
|
|
110
131
|
.sb-item .sb-body{display:none;color:var(--dim);font-size:11.5px;margin-top:6px;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow-y:auto;border-top:1px dashed var(--border);padding-top:6px}
|
|
111
132
|
.sb-item.open .sb-body{display:block}
|
|
112
133
|
|
|
113
134
|
/* 消息顶部轨迹行(DeepSeek-Harness 式:每轮可回溯步骤与子代理) */
|
|
114
|
-
.msg-meta{display:flex;gap:8px;align-items:center;font-size:11.5px;color:var(--
|
|
135
|
+
.msg-meta{display:flex;gap:8px;align-items:center;font-size:11.5px;color:var(--faint);padding:0 2px 4px}
|
|
115
136
|
.trajBtn{cursor:pointer;background:var(--bg3);border:1px solid var(--border);color:var(--dim);border-radius:20px;padding:2px 10px;font-size:11.5px}
|
|
116
137
|
.trajBtn:hover{color:var(--text);border-color:var(--accent2)}
|
|
117
138
|
/* 轨迹面板(与任务面板互斥展示):置于聊天窗口左侧(DSH 式侧栏) */
|
|
@@ -124,17 +145,17 @@ header select{flex:none}
|
|
|
124
145
|
.tj-item{padding:6px 10px;border:1px solid var(--border);border-radius:8px;margin-bottom:6px;font-size:12.5px;background:var(--bg3);cursor:pointer}
|
|
125
146
|
.tj-item:hover{border-color:var(--accent2)}
|
|
126
147
|
.tj-item .tj-head{all:unset;display:flex;gap:6px;align-items:center;font-size:12.5px;color:var(--text);cursor:pointer;padding:0;border:none;margin:0}
|
|
127
|
-
.tj-item .tj-args{color:var(--
|
|
148
|
+
.tj-item .tj-args{color:var(--faint);font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
|
|
128
149
|
.tj-item .tj-body{display:none;color:var(--dim);font-size:11.5px;margin-top:6px;white-space:pre-wrap;word-break:break-word;max-height:220px;overflow-y:auto;border-top:1px dashed var(--border);padding-top:6px}
|
|
129
150
|
.tj-item.open .tj-body{display:block}
|
|
130
151
|
.tj-item.tj-sub{border-color:var(--accent2)}
|
|
131
152
|
.tj-item.tj-sub .tj-head{color:var(--accent2)}
|
|
132
153
|
.tp-head{padding:12px 14px;font-size:14px;font-weight:600;border-bottom:1px solid var(--border);color:var(--accent2)}
|
|
133
|
-
.tp-head span{color:var(--
|
|
154
|
+
.tp-head span{color:var(--faint);font-weight:400;font-size:12px}
|
|
134
155
|
#tpList{flex:1;overflow-y:auto;padding:8px}
|
|
135
156
|
.tp-item{padding:8px 10px;border:1px solid var(--border);border-radius:8px;margin-bottom:8px;font-size:12.5px;background:var(--bg3)}
|
|
136
157
|
.tp-item .tp-title{color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
137
|
-
.tp-item .tp-meta{color:var(--
|
|
158
|
+
.tp-item .tp-meta{color:var(--faint);font-size:11.5px;margin-top:3px;display:flex;gap:6px;align-items:center}
|
|
138
159
|
.tp-dot{width:8px;height:8px;border-radius:50%;display:inline-block}
|
|
139
160
|
.tp-run{background:var(--accent);animation:blink 1.2s infinite}
|
|
140
161
|
.tp-done{background:var(--accent2)}
|
|
@@ -177,7 +198,7 @@ main{flex:1;overflow-y:auto;padding:18px 0 12px;min-width:0}
|
|
|
177
198
|
.msg-ai .content a{color:var(--accent2)}
|
|
178
199
|
.msg-ai .content .hl-kw{color:#7aa2f7;font-weight:600}.hl-s{color:#9ece6a}.hl-n{color:#e0af68}.hl-c{color:#565f6e;font-style:italic}.hl-f{color:#7dcfff}
|
|
179
200
|
.reasoning{margin:6px 0;border:1px dashed var(--border);border-radius:10px;background:var(--bg2)}
|
|
180
|
-
.reasoning summary{cursor:pointer;color:var(--
|
|
201
|
+
.reasoning summary{cursor:pointer;color:var(--faint);font-size:12.5px;padding:6px 12px;list-style:none}
|
|
181
202
|
.reasoning summary:after{content:"(点击展开)";margin-left:6px}
|
|
182
203
|
.reasoning[open] summary:after{content:""}
|
|
183
204
|
.reasoning summary.live{color:var(--accent2)}
|
|
@@ -209,8 +230,8 @@ main{flex:1;overflow-y:auto;padding:18px 0 12px;min-width:0}
|
|
|
209
230
|
.todo li{padding:4px 0;color:var(--dim);display:flex;gap:8px}
|
|
210
231
|
.todo li.done{color:var(--faint);text-decoration:line-through}
|
|
211
232
|
.todo li.doing{color:var(--accent2)}
|
|
212
|
-
.usage{font-size:12px;color:var(--
|
|
213
|
-
.banner{text-align:center;color:var(--
|
|
233
|
+
.usage{font-size:12px;color:var(--faint);border-top:1px dashed var(--border);padding-top:6px}
|
|
234
|
+
.banner{text-align:center;color:var(--faint);font-size:12.5px}
|
|
214
235
|
.banner-warn{background:rgba(245,158,11,.08);border:1px solid rgba(245,158,11,.35);color:var(--warn);border-radius:12px;padding:8px 14px;text-align:left}
|
|
215
236
|
.errline{color:var(--err);background:rgba(229,83,75,.08);border:1px solid rgba(229,83,75,.3);border-radius:10px;padding:10px 14px;font-size:13.5px}
|
|
216
237
|
/* P0-3 错误折叠卡(v0.6.18 §3.68):首行摘要 + 处置建议独立成行 + 上游原文默认折叠(<pre> 保留换行)+ 复制。
|
|
@@ -229,13 +250,13 @@ main{flex:1;overflow-y:auto;padding:18px 0 12px;min-width:0}
|
|
|
229
250
|
输入区 / 停止按钮 / 滚动全程可用。三档动作:本次放行 / 拒绝 / 始终允许本会话。 */
|
|
230
251
|
.perm-card{max-width:min(760px,94%);margin:8px auto;background:rgba(245,158,11,.07);border:1px solid rgba(245,158,11,.38);border-left:3px solid var(--warn);border-radius:10px;padding:10px 14px;display:flex;flex-direction:column;gap:8px;font-size:13px}
|
|
231
252
|
.perm-card .perm-head{display:flex;align-items:center;gap:8px;color:var(--warn);font-weight:600;flex-wrap:wrap}
|
|
232
|
-
.perm-card .perm-head .perm-scope{margin-left:auto;font-weight:400;font-size:11.5px;color:var(--
|
|
253
|
+
.perm-card .perm-head .perm-scope{margin-left:auto;font-weight:400;font-size:11.5px;color:var(--faint);white-space:nowrap}
|
|
233
254
|
.perm-card .perm-q{color:var(--text);white-space:pre-wrap;word-break:break-word;font-size:13.5px;line-height:1.65}
|
|
234
255
|
.perm-card .perm-acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
|
|
235
256
|
.perm-card .perm-acts button{font-size:12.5px;padding:4px 10px}
|
|
236
257
|
.perm-card .perm-acts .perm-always{border-color:var(--warn);color:var(--warn)}
|
|
237
|
-
.perm-card .perm-note{font-size:11.5px;color:var(--
|
|
238
|
-
.perm-card .perm-count{font-size:11.5px;color:var(--
|
|
258
|
+
.perm-card .perm-note{font-size:11.5px;color:var(--faint);white-space:normal;line-height:1.6}
|
|
259
|
+
.perm-card .perm-count{font-size:11.5px;color:var(--faint);font-variant-numeric:tabular-nums}
|
|
239
260
|
.perm-card.perm-timeout{opacity:.72}
|
|
240
261
|
footer{flex:none;border-top:1px solid var(--border);background:var(--bg2);padding:12px 18px}
|
|
241
262
|
#composer{max-width:860px;margin:0 auto;display:flex;gap:10px;align-items:flex-end}
|
|
@@ -245,8 +266,8 @@ footer{flex:none;border-top:1px solid var(--border);background:var(--bg2);paddin
|
|
|
245
266
|
#composer #presetSel{max-width:130px;min-width:76px;flex:none;padding:8px 8px;font-size:12px}
|
|
246
267
|
#input{flex:1;background:var(--bg3);border:1px solid var(--border);border-radius:12px;color:var(--text);padding:10px 14px;font:14px/1.6 inherit;resize:none;min-height:44px;max-height:200px;min-width:0}
|
|
247
268
|
#input:focus{outline:none;border-color:var(--accent2)}
|
|
248
|
-
#hint{font-size:11.5px;color:var(--
|
|
249
|
-
#statusBar{font-size:11.5px;color:var(--
|
|
269
|
+
#hint{font-size:11.5px;color:var(--faint);margin-top:6px;max-width:860px;margin-left:auto;margin-right:auto}
|
|
270
|
+
#statusBar{font-size:11.5px;color:var(--faint);margin-top:2px;max-width:860px;margin-left:auto;margin-right:auto;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
250
271
|
@media (max-width:560px){footer{padding:10px 8px}#composer{gap:6px}#composer #permSel{min-width:52px;padding:8px 4px}#composer #reasoningSel{min-width:44px;padding:8px 4px}#composer #modelSel{min-width:72px;padding:8px 4px}#composer #presetSel{min-width:64px;max-width:88px;padding:8px 4px}#attachBtn{padding:10px 9px}}
|
|
251
272
|
.modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.55);display:flex;align-items:center;justify-content:center;z-index:50}
|
|
252
273
|
.modal{background:var(--panel);border:1px solid var(--border);border-radius:14px;width:min(520px,92vw);padding:18px;max-height:88vh;overflow-y:auto}
|
|
@@ -257,7 +278,7 @@ footer{flex:none;border-top:1px solid var(--border);background:var(--bg2);paddin
|
|
|
257
278
|
.cfg-nav{width:152px;flex-shrink:0;background:var(--bg2);border-right:1px solid var(--border);padding:8px 6px;display:flex;flex-direction:column;gap:2px;overflow-y:auto}
|
|
258
279
|
.cfg-nav-btn{display:flex;align-items:center;gap:8px;width:100%;text-align:left;padding:8px 10px;font-size:13px;color:var(--dim);background:transparent;border:none;border-radius:8px;cursor:pointer;white-space:nowrap}
|
|
259
280
|
.cfg-nav-btn:hover{background:var(--bg3);color:var(--text)}
|
|
260
|
-
.cfg-nav-btn.active{background:linear-gradient(135deg,var(--accent),var(--accent2));color
|
|
281
|
+
.cfg-nav-btn.active{background:linear-gradient(135deg,var(--accent),var(--accent2));color:#06121a;font-weight:600}
|
|
261
282
|
.cfg-panels{flex:1;min-width:0;overflow-y:auto;padding:6px 16px 14px}
|
|
262
283
|
.cfg-panel{display:none}
|
|
263
284
|
.cfg-panel.active{display:block}
|
|
@@ -269,12 +290,12 @@ footer{flex:none;border-top:1px solid var(--border);background:var(--bg2);paddin
|
|
|
269
290
|
.cfg-row{margin:12px 0}
|
|
270
291
|
.cfg-row label{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--text)}
|
|
271
292
|
.cfg-row select,.cfg-row input[type=number]{background:var(--bg3);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 10px;font-size:13px}
|
|
272
|
-
.cfg-hint{font-size:12px;color:var(--
|
|
293
|
+
.cfg-hint{font-size:12px;color:var(--faint);margin-top:4px}
|
|
273
294
|
.modal .row{display:flex;gap:10px;justify-content:flex-end}
|
|
274
295
|
.dir-entry{padding:6px 10px;border-radius:6px;cursor:pointer;font-size:13.5px;word-break:break-all}
|
|
275
296
|
.dir-entry:hover{background:var(--bg3)}
|
|
276
297
|
.spinner{display:inline-block;width:14px;height:14px;border:2px solid var(--accent);border-top-color:transparent;border-radius:50%;animation:spin .8s linear infinite;vertical-align:-2px}
|
|
277
|
-
#scrollBottomBtn{position:fixed;right:26px;bottom:118px;width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,var(--accent),var(--accent2));color
|
|
298
|
+
#scrollBottomBtn{position:fixed;right:26px;bottom:118px;width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,var(--accent),var(--accent2));color:#06121a;font-size:20px;font-weight:800;border:none;cursor:pointer;box-shadow:0 4px 16px rgba(0,0,0,.45);z-index:30;display:none;align-items:center;justify-content:center}
|
|
278
299
|
@keyframes spin{to{transform:rotate(360deg)}}
|
|
279
300
|
/* ============================================================================
|
|
280
301
|
P1(v0.6.19 §3.70)界面改造:工具时间线 / 命令面板 / 快捷键表 /
|
|
@@ -294,7 +315,7 @@ footer{flex:none;border-top:1px solid var(--border);background:var(--bg2);paddin
|
|
|
294
315
|
.toolcard-head{display:flex;align-items:center;gap:8px;padding:7px 12px;background:var(--bg3);font-size:12.5px;color:var(--dim)}
|
|
295
316
|
.toolcard-head b{color:var(--text);font-weight:600}
|
|
296
317
|
.toolcard-head .tl-count{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
297
|
-
.toolcard-head .tl-sum{margin-left:auto;color:var(--
|
|
318
|
+
.toolcard-head .tl-sum{margin-left:auto;color:var(--faint);font-size:11.5px;font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
298
319
|
.toolcard-head .tl-toggle{border:1px solid var(--border);background:transparent;color:var(--dim);border-radius:6px;padding:1px 7px;font-size:11px;flex:none}
|
|
299
320
|
.toolcard.collapsed .tl-steps,.toolcard.collapsed .tl-more{display:none}
|
|
300
321
|
.toolcard.has-fail{border-color:rgba(242,90,90,.4)}
|
|
@@ -305,19 +326,19 @@ footer{flex:none;border-top:1px solid var(--border);background:var(--bg2);paddin
|
|
|
305
326
|
.tl-row{display:grid;grid-template-columns:20px 16px 64px minmax(0,1fr) 54px 10px;align-items:center;gap:7px;width:100%;padding:5px 12px;background:transparent;border:0;color:var(--dim);text-align:left;font-size:12.5px}
|
|
306
327
|
.tl-row:hover{background:var(--bg3)}
|
|
307
328
|
.tl-step.fail .tl-row .tl-tool{color:var(--err)}
|
|
308
|
-
.tl-row .tl-no{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;color:var(--
|
|
309
|
-
.tl-row .tl-st{font-size:12px;text-align:center;color:var(--
|
|
329
|
+
.tl-row .tl-no{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;color:var(--faint);font-variant-numeric:tabular-nums}
|
|
330
|
+
.tl-row .tl-st{font-size:12px;text-align:center;color:var(--faint)}
|
|
310
331
|
.tl-row .tl-st.ok{color:var(--accent)}
|
|
311
332
|
.tl-row .tl-st.bad{color:var(--err)}
|
|
312
333
|
.tl-row .tl-tool{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;color:var(--accent2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
313
334
|
.tl-row .tl-args{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dim);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px}
|
|
314
|
-
.tl-row .tl-dur{text-align:right;color:var(--
|
|
335
|
+
.tl-row .tl-dur{text-align:right;color:var(--faint);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;font-variant-numeric:tabular-nums}
|
|
315
336
|
.tl-row .tl-tri{width:0;height:0;border-left:4px solid currentColor;border-top:3px solid transparent;border-bottom:3px solid transparent;color:var(--faint);transition:transform .15s}
|
|
316
337
|
.tl-step.open .tl-row .tl-tri{transform:rotate(90deg)}
|
|
317
|
-
.tl-res{padding:0 12px 5px 138px;font-size:11.5px;line-height:1.5;color:var(--
|
|
338
|
+
.tl-res{padding:0 12px 5px 138px;font-size:11.5px;line-height:1.5;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
318
339
|
.tl-step.fail .tl-res{color:var(--err)}
|
|
319
340
|
.tl-out{padding:0 12px 9px 138px}
|
|
320
|
-
.tl-out-meta{font-size:11px;color:var(--
|
|
341
|
+
.tl-out-meta{font-size:11px;color:var(--faint);margin:2px 0 4px;font-variant-numeric:tabular-nums}
|
|
321
342
|
.tl-args-full{margin:2px 0 5px;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11.5px;line-height:1.55;color:var(--dim);white-space:pre-wrap;word-break:break-word;background:var(--code);border:1px solid var(--border);border-radius:8px;padding:6px 9px;max-height:150px;overflow:auto}
|
|
322
343
|
.tl-out pre{margin:0;padding:7px 9px;background:var(--code);border:1px solid var(--border);border-radius:8px;max-height:190px;overflow:auto;font:11.5px/1.55 ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--dim);white-space:pre-wrap;word-break:break-word}
|
|
323
344
|
.tl-out-more{margin-top:4px;padding:1px 8px;font-size:11px}
|
|
@@ -331,19 +352,19 @@ footer{flex:none;border-top:1px solid var(--border);background:var(--bg2);paddin
|
|
|
331
352
|
.palette{width:min(600px,94vw);background:var(--panel);border:1px solid var(--border);border-radius:14px;box-shadow:0 16px 48px rgba(0,0,0,.5);overflow:hidden;display:flex;flex-direction:column;max-height:70vh}
|
|
332
353
|
.palette-input{display:flex;align-items:center;gap:8px;padding:11px 13px;border-bottom:1px solid var(--border);flex:none;color:var(--faint)}
|
|
333
354
|
.palette-input input{flex:1;min-width:0;background:transparent;border:0;outline:none;color:var(--text);font-size:15px}
|
|
334
|
-
.palette-input input::placeholder{color:var(--
|
|
355
|
+
.palette-input input::placeholder{color:var(--faint)}
|
|
335
356
|
.palette-list{overflow-y:auto;padding:6px;min-height:0}
|
|
336
|
-
.pgroup-label{font-size:10.5px;letter-spacing:.5px;color:var(--
|
|
357
|
+
.pgroup-label{font-size:10.5px;letter-spacing:.5px;color:var(--faint);padding:7px 9px 3px;text-transform:uppercase}
|
|
337
358
|
.pitem{display:flex;align-items:center;gap:9px;width:100%;padding:7px 9px;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--dim);text-align:left;font-size:13px}
|
|
338
359
|
.pitem .label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
339
360
|
.pitem .label b{color:var(--text);font-weight:600}
|
|
340
|
-
.pitem .hint{font-size:11px;color:var(--
|
|
341
|
-
.pitem .scope{font-size:10px;color:var(--
|
|
361
|
+
.pitem .hint{font-size:11px;color:var(--faint);white-space:nowrap;max-width:190px;overflow:hidden;text-overflow:ellipsis}
|
|
362
|
+
.pitem .scope{font-size:10px;color:var(--faint);border:1px solid var(--border);border-radius:999px;padding:0 5px;line-height:15px;white-space:nowrap}
|
|
342
363
|
.pitem[aria-selected="true"]{background:var(--bg3);border-color:var(--border);color:var(--text);box-shadow:inset 2px 0 0 var(--accent2)}
|
|
343
|
-
.palette-foot{border-top:1px solid var(--border);padding:7px 12px;display:flex;align-items:center;gap:10px;font-size:11px;color:var(--
|
|
364
|
+
.palette-foot{border-top:1px solid var(--border);padding:7px 12px;display:flex;align-items:center;gap:10px;font-size:11px;color:var(--faint);flex:none;flex-wrap:wrap}
|
|
344
365
|
.palette-foot .kbd{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:10.5px;border:1px solid var(--border);border-radius:5px;padding:0 5px;line-height:16px;background:var(--bg2)}
|
|
345
366
|
.palette-foot .grow{flex:1}
|
|
346
|
-
.palette-empty{padding:26px 16px;text-align:center;color:var(--
|
|
367
|
+
.palette-empty{padding:26px 16px;text-align:center;color:var(--faint);font-size:13px}
|
|
347
368
|
|
|
348
369
|
/* —— 快捷键表 —— */
|
|
349
370
|
.shortcut-sheet{width:min(560px,94vw);background:var(--panel);border:1px solid var(--border);border-radius:14px;box-shadow:0 16px 48px rgba(0,0,0,.5);overflow:hidden}
|
|
@@ -353,7 +374,7 @@ footer{flex:none;border-top:1px solid var(--border);background:var(--bg2);paddin
|
|
|
353
374
|
.shortcut-row{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--dim)}
|
|
354
375
|
.shortcut-row .grow{flex:1}
|
|
355
376
|
.shortcut-row .kbd{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:10.5px;border:1px solid var(--border);border-radius:5px;padding:0 5px;line-height:16px;background:var(--bg2);color:var(--dim);white-space:nowrap}
|
|
356
|
-
.shortcut-note{grid-column:1/-1;font-size:11.5px;color:var(--
|
|
377
|
+
.shortcut-note{grid-column:1/-1;font-size:11.5px;color:var(--faint);border-top:1px solid var(--border);padding-top:9px}
|
|
357
378
|
|
|
358
379
|
/* —— 右侧「本轮运行」面板 —— */
|
|
359
380
|
#runPanel{position:fixed;right:0;top:52px;bottom:0;width:300px;background:var(--bg2);border-left:1px solid var(--border);z-index:36;display:flex;flex-direction:column;box-shadow:-8px 0 24px rgba(0,0,0,.18)}
|
|
@@ -361,28 +382,28 @@ body.run-open{padding-right:300px}
|
|
|
361
382
|
body.run-open #scrollBottomBtn{right:326px}
|
|
362
383
|
.rp-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--border);font-size:13px;font-weight:600;color:var(--text);flex:none}
|
|
363
384
|
.rp-head .rp-live{width:7px;height:7px;border-radius:50%;background:var(--accent2)}
|
|
364
|
-
.rp-head .rp-sub{font-size:11px;color:var(--
|
|
385
|
+
.rp-head .rp-sub{font-size:11px;color:var(--faint);font-weight:400}
|
|
365
386
|
.rp-head button{margin-left:auto;padding:1px 8px;font-size:11px}
|
|
366
387
|
.rp-body{flex:1;overflow-y:auto;padding:10px 12px;min-height:0}
|
|
367
388
|
.rp-sec{margin-bottom:12px}
|
|
368
389
|
.rp-sec:last-child{margin-bottom:0}
|
|
369
|
-
.rp-sec-title{font-size:10.5px;letter-spacing:.5px;color:var(--
|
|
390
|
+
.rp-sec-title{font-size:10.5px;letter-spacing:.5px;color:var(--faint);text-transform:uppercase;margin-bottom:6px;display:flex;align-items:center;gap:6px}
|
|
370
391
|
.rp-sec-title .line{flex:1;height:1px;background:var(--border)}
|
|
371
392
|
.rp-kv{display:grid;grid-template-columns:58px minmax(0,1fr);gap:5px 8px;font-size:12.5px;align-items:baseline;margin:0}
|
|
372
|
-
.rp-kv dt{color:var(--
|
|
393
|
+
.rp-kv dt{color:var(--faint)}
|
|
373
394
|
.rp-kv dd{margin:0;color:var(--text);min-width:0;display:flex;align-items:center;gap:5px;flex-wrap:wrap;word-break:break-word}
|
|
374
|
-
.rp-kv .rp-src{font-size:10px;color:var(--
|
|
395
|
+
.rp-kv .rp-src{font-size:10px;color:var(--faint);border:1px solid var(--border);border-radius:999px;padding:0 5px;line-height:16px;white-space:nowrap}
|
|
375
396
|
.rp-kv .rp-id{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;color:var(--dim)}
|
|
376
397
|
.rp-metrics{display:grid;grid-template-columns:1fr 1fr;gap:6px}
|
|
377
398
|
.rp-metric{border:1px solid var(--border);border-radius:8px;background:var(--bg3);padding:6px 8px;display:flex;flex-direction:column;gap:1px;min-width:0}
|
|
378
|
-
.rp-metric .l{font-size:10.5px;color:var(--
|
|
399
|
+
.rp-metric .l{font-size:10.5px;color:var(--faint)}
|
|
379
400
|
.rp-metric .v{font-size:14px;font-weight:650;font-variant-numeric:tabular-nums;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
380
|
-
.rp-metric .v small{font-size:10px;font-weight:400;color:var(--
|
|
401
|
+
.rp-metric .v small{font-size:10px;font-weight:400;color:var(--faint);margin-left:2px}
|
|
381
402
|
.rp-metric.wide{grid-column:1/-1}
|
|
382
403
|
.rp-ctxbar{height:5px;border-radius:3px;background:var(--bg2);overflow:hidden;margin-top:5px}
|
|
383
404
|
.rp-ctxbar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--accent2),var(--accent));border-radius:3px}
|
|
384
405
|
.rp-foot{border-top:1px solid var(--border);padding:8px 12px;display:flex;gap:6px;align-items:center;flex:none}
|
|
385
|
-
.rp-foot .grow{flex:1;font-size:11px;color:var(--
|
|
406
|
+
.rp-foot .grow{flex:1;font-size:11px;color:var(--faint)}
|
|
386
407
|
#rpStop{color:var(--err);border-color:rgba(242,90,90,.45);background:transparent;padding:4px 10px;font-size:12px}
|
|
387
408
|
#rpStop[disabled]{opacity:.45}
|
|
388
409
|
#rpCompact{padding:4px 10px;font-size:12px}
|
|
@@ -392,9 +413,9 @@ body.run-open #scrollBottomBtn{right:326px}
|
|
|
392
413
|
.trace-summary{border:1px solid var(--border);background:var(--bg3);color:var(--dim);border-radius:999px;padding:2px 11px;font-size:11.5px;cursor:pointer;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
393
414
|
.trace-summary:hover{border-color:var(--accent2);color:var(--text)}
|
|
394
415
|
.trace-row.has-fail .trace-summary{border-color:rgba(242,90,90,.45);color:var(--err)}
|
|
395
|
-
.rp-fold-head{width:100%;border:0;background:transparent;padding:0 0 6px;margin:0;cursor:pointer;font:inherit;font-size:10.5px;letter-spacing:.5px;color:var(--
|
|
416
|
+
.rp-fold-head{width:100%;border:0;background:transparent;padding:0 0 6px;margin:0;cursor:pointer;font:inherit;font-size:10.5px;letter-spacing:.5px;color:var(--faint);text-transform:uppercase;display:flex;align-items:center;gap:6px}
|
|
396
417
|
.rp-fold-head:hover{color:var(--text)}
|
|
397
|
-
.rp-fold-head .rp-fold-meta{margin-left:auto;font-size:10px;letter-spacing:0;text-transform:none;color:var(--
|
|
418
|
+
.rp-fold-head .rp-fold-meta{margin-left:auto;font-size:10px;letter-spacing:0;text-transform:none;color:var(--faint)}
|
|
398
419
|
.rp-fold-tri{width:0;height:0;border-top:4px solid currentColor;border-left:3px solid transparent;border-right:3px solid transparent;transition:transform .15s}
|
|
399
420
|
.rp-fold-head[aria-expanded="false"] .rp-fold-tri{transform:rotate(-90deg)}
|
|
400
421
|
.tr-round{border:1px solid var(--border);border-radius:8px;background:var(--bg3);margin-bottom:6px;overflow:hidden}
|
|
@@ -402,7 +423,7 @@ body.run-open #scrollBottomBtn{right:326px}
|
|
|
402
423
|
.tr-round.has-fail{border-color:rgba(242,90,90,.35)}
|
|
403
424
|
.tr-round-head{display:flex;align-items:center;gap:6px;width:100%;padding:5px 8px;border:0;background:transparent;color:var(--dim);text-align:left;font-size:11.5px}
|
|
404
425
|
.tr-round-head:hover{background:var(--bg2);color:var(--text)}
|
|
405
|
-
.tr-round-no{flex:none;color:var(--
|
|
426
|
+
.tr-round-no{flex:none;color:var(--faint);font-size:10.5px;font-variant-numeric:tabular-nums}
|
|
406
427
|
.tr-round-sum{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
407
428
|
.tr-round.has-fail .tr-round-sum{color:var(--err)}
|
|
408
429
|
.tr-round-body{display:none;border-top:1px dashed var(--border)}
|
|
@@ -412,32 +433,32 @@ body.run-open #scrollBottomBtn{right:326px}
|
|
|
412
433
|
.tr-round-body .tl-row .tl-args{font-size:11.5px}
|
|
413
434
|
.tr-round-body .tl-res{padding:0 8px 4px 86px;font-size:11px}
|
|
414
435
|
.tr-round-body .tl-out{padding:0 8px 8px 86px}
|
|
415
|
-
.tr-empty{padding:7px 9px;color:var(--
|
|
436
|
+
.tr-empty{padding:7px 9px;color:var(--faint);font-size:11.5px}
|
|
416
437
|
.tr-sub{border:1px solid var(--border);border-radius:8px;background:var(--bg3);margin-bottom:6px;overflow:hidden}
|
|
417
438
|
.tr-sub:last-child{margin-bottom:0}
|
|
418
439
|
.tr-sub.failed{border-color:rgba(242,90,90,.35)}
|
|
419
440
|
.tr-sub-head{display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px;width:100%;padding:5px 8px;border:0;background:transparent;color:var(--dim);text-align:left;font-size:11.5px}
|
|
420
441
|
.tr-sub-head:hover{background:var(--bg2);color:var(--text)}
|
|
421
442
|
.tr-sub-name{min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);font-weight:600}
|
|
422
|
-
.tr-sub-meta{font-size:10.5px;color:var(--
|
|
423
|
-
.tr-sub-state{margin-left:auto;font-size:10.5px;border:1px solid var(--border);border-radius:999px;padding:0 5px;line-height:15px;color:var(--
|
|
443
|
+
.tr-sub-meta{font-size:10.5px;color:var(--faint);white-space:nowrap}
|
|
444
|
+
.tr-sub-state{margin-left:auto;font-size:10.5px;border:1px solid var(--border);border-radius:999px;padding:0 5px;line-height:15px;color:var(--faint);white-space:nowrap}
|
|
424
445
|
.tr-sub-state.run{color:var(--accent2);border-color:rgba(55,196,210,.4)}
|
|
425
446
|
.tr-sub-state.ok{color:var(--accent)}
|
|
426
447
|
.tr-sub-state.bad{color:var(--err);border-color:rgba(242,90,90,.4)}
|
|
427
448
|
.tr-sub-body{display:none;border-top:1px dashed var(--border);padding:6px 8px;font-size:11.5px;color:var(--dim);line-height:1.6}
|
|
428
449
|
.tr-sub.open .tr-sub-body{display:block}
|
|
429
450
|
.tr-sub-q{color:var(--text);word-break:break-word}
|
|
430
|
-
.tr-sub-stats{margin-top:3px;color:var(--
|
|
431
|
-
.tr-sub-rl{margin-top:5px;color:var(--
|
|
432
|
-
.tr-sub-wait{color:var(--
|
|
451
|
+
.tr-sub-stats{margin-top:3px;color:var(--faint);font-size:10.5px}
|
|
452
|
+
.tr-sub-rl{margin-top:5px;color:var(--faint);font-size:10.5px}
|
|
453
|
+
.tr-sub-wait{color:var(--faint);font-size:11px;padding:2px 0}
|
|
433
454
|
#traceDock{margin:10px auto 4px;max-width:760px;border:1px solid var(--border);border-radius:12px;background:var(--bg2);overflow:hidden}
|
|
434
455
|
#tdToggle{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:0;background:transparent;color:var(--text);font:inherit;font-size:12.5px;font-weight:600;text-align:left;cursor:pointer}
|
|
435
456
|
#tdToggle:hover{background:var(--bg3)}
|
|
436
|
-
.td-meta{margin-left:auto;font-size:10.5px;font-weight:400;color:var(--
|
|
457
|
+
.td-meta{margin-left:auto;font-size:10.5px;font-weight:400;color:var(--faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
437
458
|
#tdBody{border-top:1px solid var(--border);padding:8px 12px 10px}
|
|
438
459
|
.td-fold{margin-bottom:10px}
|
|
439
460
|
.td-fold:last-child{margin-bottom:0}
|
|
440
|
-
.td-fold-head{width:100%;display:flex;align-items:center;gap:8px;border:0;background:transparent;padding:0 0 6px;color:var(--
|
|
461
|
+
.td-fold-head{width:100%;display:flex;align-items:center;gap:8px;border:0;background:transparent;padding:0 0 6px;color:var(--faint);font:inherit;font-size:10.5px;letter-spacing:.5px;text-transform:uppercase;cursor:pointer}
|
|
441
462
|
.td-fold-head:hover{color:var(--text)}
|
|
442
463
|
.td-fold-head .td-fold-meta{margin-left:auto;font-size:10px;letter-spacing:0;text-transform:none}
|
|
443
464
|
.td-fold-body .tr-round-body .tl-row{grid-template-columns:20px 16px 64px minmax(0,1fr) 54px 10px;gap:7px;padding:5px 12px;font-size:12.5px}
|
|
@@ -450,29 +471,31 @@ body.run-open #scrollBottomBtn{right:326px}
|
|
|
450
471
|
body.run-drawer #runPanel{display:flex;top:52px;width:300px;max-width:92vw;z-index:60;box-shadow:-12px 0 32px rgba(0,0,0,.4)}
|
|
451
472
|
}
|
|
452
473
|
|
|
453
|
-
/* —— 会话设置弹层(收编模型 / 预设 / 权限三件套)——
|
|
454
|
-
|
|
474
|
+
/* —— 会话设置弹层(收编模型 / 预设 / 权限三件套)——
|
|
475
|
+
§3.83:间距按设计稿 .popover 对齐(head/body 11px 13px、field label 5px、
|
|
476
|
+
effective 13px/11px + 8px 10px、foot 9px 13px);圆角保持设计稿 14px(sheet)/8px(effective)。 */
|
|
477
|
+
#sessSheet{position:fixed;right:18px;bottom:110px;width:min(400px,calc(100vw - 24px));max-height:min(72vh,560px);background:var(--panel);border:1px solid var(--border);border-radius:14px;box-shadow:0 16px 48px rgba(0,0,0,.5);z-index:70;display:flex;flex-direction:column;overflow:hidden}
|
|
455
478
|
body.run-open #sessSheet{right:318px}
|
|
456
479
|
@media (max-width:1180px){body.run-open #sessSheet{right:18px}}
|
|
457
|
-
.ss-head{display:flex;align-items:center;gap:8px;padding:
|
|
458
|
-
.ss-head .ss-sub{font-size:11px;color:var(--
|
|
480
|
+
.ss-head{display:flex;align-items:center;gap:8px;padding:11px 13px;border-bottom:1px solid var(--border);font-size:13px;font-weight:600;color:var(--text);flex:none}
|
|
481
|
+
.ss-head .ss-sub{font-size:11px;color:var(--faint);font-weight:400}
|
|
459
482
|
.ss-head button{margin-left:auto;padding:1px 8px;font-size:11px}
|
|
460
|
-
.ss-body{padding:
|
|
483
|
+
.ss-body{padding:11px 13px;overflow-y:auto;min-height:0}
|
|
461
484
|
.ss-field{margin-bottom:12px}
|
|
462
485
|
.ss-field:last-child{margin-bottom:0}
|
|
463
|
-
.ss-field>label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--dim);margin-bottom:
|
|
464
|
-
.ss-field .ss-scope{margin-left:auto;font-size:10px;color:var(--
|
|
486
|
+
.ss-field>label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--dim);margin-bottom:5px}
|
|
487
|
+
.ss-field .ss-scope{margin-left:auto;font-size:10px;color:var(--faint);border:1px solid var(--border);border-radius:999px;padding:0 6px;line-height:16px}
|
|
465
488
|
.ss-field select{width:100%;background:var(--bg3);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 8px;font-size:13px}
|
|
466
|
-
.ss-src{font-size:11px;color:var(--
|
|
489
|
+
.ss-src{font-size:11px;color:var(--faint);margin-top:4px;line-height:1.55;word-break:break-word}
|
|
467
490
|
.ss-src b{color:var(--dim);font-weight:600}
|
|
468
491
|
.ss-src code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px}
|
|
469
492
|
.ss-seg{display:flex;gap:4px;background:var(--bg3);border:1px solid var(--border);border-radius:9px;padding:3px}
|
|
470
493
|
.ss-seg button{flex:1;height:26px;border:0;border-radius:6px;background:transparent;color:var(--dim);font-size:12px}
|
|
471
494
|
.ss-seg button.on{background:var(--panel);color:var(--text);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,.18)}
|
|
472
|
-
.ss-effective{margin:0
|
|
495
|
+
.ss-effective{margin:0 13px 11px;padding:8px 10px;border:1px dashed var(--border);border-radius:8px;font-size:11.5px;color:var(--dim);line-height:1.65}
|
|
473
496
|
.ss-effective b{color:var(--text)}
|
|
474
|
-
.ss-foot{display:flex;align-items:center;gap:8px;padding:
|
|
475
|
-
.ss-foot .grow{flex:1;font-size:11px;color:var(--
|
|
497
|
+
.ss-foot{display:flex;align-items:center;gap:8px;padding:9px 13px;border-top:1px solid var(--border)}
|
|
498
|
+
.ss-foot .grow{flex:1;font-size:11px;color:var(--faint)}
|
|
476
499
|
#sessSettingsBtn{max-width:230px;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
477
500
|
#sessSettingsBtn b{overflow:hidden;text-overflow:ellipsis}
|
|
478
501
|
#sessSettingsBtn .sep{color:var(--faint)}
|
|
@@ -480,16 +503,16 @@ body.run-open #sessSheet{right:318px}
|
|
|
480
503
|
/* —— 空态三步引导 —— */
|
|
481
504
|
#emptyState{max-width:720px;margin:18px auto 6px;padding:0 18px;display:flex;flex-direction:column;gap:12px;color:var(--text)}
|
|
482
505
|
#emptyState h2{font-size:20px;margin:0;font-weight:700}
|
|
483
|
-
#emptyState .es-lead{font-size:12.5px;color:var(--
|
|
506
|
+
#emptyState .es-lead{font-size:12.5px;color:var(--faint);margin:0}
|
|
484
507
|
.empty-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
|
|
485
508
|
.empty-step{display:flex;align-items:center;gap:10px;border:1px solid var(--border);border-radius:10px;background:var(--bg2);padding:9px 12px}
|
|
486
509
|
.empty-step .es-no{width:22px;height:22px;border-radius:50%;background:var(--bg3);color:var(--dim);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex:none}
|
|
487
|
-
.empty-step.done .es-no{background:linear-gradient(135deg,var(--accent),var(--accent2));color
|
|
510
|
+
.empty-step.done .es-no{background:linear-gradient(135deg,var(--accent),var(--accent2));color:#06121a}
|
|
488
511
|
.empty-step .es-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
|
|
489
512
|
.empty-step .es-main b{font-size:13px;color:var(--text)}
|
|
490
|
-
.empty-step .es-main span{font-size:11.5px;color:var(--
|
|
513
|
+
.empty-step .es-main span{font-size:11.5px;color:var(--faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
491
514
|
.empty-step .es-act{padding:3px 9px;font-size:11.5px;flex:none}
|
|
492
|
-
.empty-step .es-state{font-size:11px;color:var(--
|
|
515
|
+
.empty-step .es-state{font-size:11px;color:var(--faint);flex:none;min-width:32px;text-align:right}
|
|
493
516
|
.empty-step.done .es-state{color:var(--accent)}
|
|
494
517
|
.empty-examples{display:flex;flex-wrap:wrap;gap:7px}
|
|
495
518
|
.empty-examples .es-ex{border:1px solid var(--border);background:var(--bg2);color:var(--dim);border-radius:999px;padding:5px 11px;font-size:12px;text-align:left;max-width:100%}
|
|
@@ -499,7 +522,7 @@ body.run-open #sessSheet{right:318px}
|
|
|
499
522
|
.cfg-search{display:flex;gap:8px;align-items:center;margin:0 0 8px;flex:none}
|
|
500
523
|
.cfg-search input{flex:1;min-width:0;background:var(--bg3);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:7px 10px;font-size:13px}
|
|
501
524
|
.cfg-search input:focus{outline:none;border-color:var(--accent2)}
|
|
502
|
-
.cfg-search .cfg-search-count{font-size:11.5px;color:var(--
|
|
525
|
+
.cfg-search .cfg-search-count{font-size:11.5px;color:var(--faint);white-space:nowrap}
|
|
503
526
|
.cfg-nav-btn[data-group].no-hit{opacity:.45}
|
|
504
527
|
.cfg-row[hidden],.cfg-searchable[hidden],.cfg-hint[hidden]{display:none!important}
|
|
505
528
|
.cfg-row.search-hit,.cfg-searchable.search-hit{outline:1px solid var(--accent2);outline-offset:2px;border-radius:8px}
|
|
@@ -507,10 +530,10 @@ body.run-open #sessSheet{right:318px}
|
|
|
507
530
|
/* —— 诊断 / 日志路径 —— */
|
|
508
531
|
.diag-modal{width:min(560px,94vw)}
|
|
509
532
|
.diag-row{display:flex;align-items:flex-start;gap:8px;border-bottom:1px solid var(--border);padding:7px 0;font-size:12.5px}
|
|
510
|
-
.diag-row .diag-k{width:92px;flex:none;color:var(--
|
|
533
|
+
.diag-row .diag-k{width:92px;flex:none;color:var(--faint)}
|
|
511
534
|
.diag-row .diag-v{flex:1;min-width:0;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11.5px;word-break:break-all;color:var(--text)}
|
|
512
535
|
.diag-row button{flex:none;padding:1px 8px;font-size:11px}
|
|
513
|
-
.diag-note{font-size:11.5px;color:var(--
|
|
536
|
+
.diag-note{font-size:11.5px;color:var(--faint);margin-top:8px;line-height:1.6}
|
|
514
537
|
|
|
515
538
|
/* —— 窄屏断点:<1180 右栏收起;<900 侧栏(图标轨/次要控件)收起 —— */
|
|
516
539
|
@media (max-width:1180px){
|
|
@@ -535,18 +558,18 @@ body.run-open #sessSheet{right:318px}
|
|
|
535
558
|
/* —— 省钱仪表盘(v0.3.1 顶部入口,真·仪表盘) —— */
|
|
536
559
|
#dashPanel{position:fixed;right:0;top:52px;bottom:0;width:400px;max-width:94vw;background:var(--bg2);border-left:1px solid var(--border);z-index:45;display:flex;flex-direction:column;box-shadow:-8px 0 32px rgba(0,0,0,.4)}
|
|
537
560
|
.dash-head{padding:12px 14px;font-size:14px;font-weight:700;color:var(--accent);border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}
|
|
538
|
-
.dash-head .dash-sub{font-size:11.5px;color:var(--
|
|
561
|
+
.dash-head .dash-sub{font-size:11.5px;color:var(--faint);font-weight:400}
|
|
539
562
|
.dash-head button{margin-left:auto;padding:2px 8px;font-size:12px}
|
|
540
563
|
.dash-body{flex:1;overflow-y:auto;padding:14px}
|
|
541
564
|
.dash-kpi{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px}
|
|
542
565
|
.kpi{background:var(--bg3);border:1px solid var(--border);border-radius:10px;padding:10px 12px;display:flex;flex-direction:column;gap:2px}
|
|
543
|
-
.kpi-l{font-size:11px;color:var(--
|
|
566
|
+
.kpi-l{font-size:11px;color:var(--faint)}
|
|
544
567
|
.kpi-v{font-size:17px;font-weight:700;font-variant-numeric:tabular-nums}
|
|
545
568
|
.dash-gauge-wrap{position:relative;width:120px;margin:4px auto 14px;text-align:center}
|
|
546
569
|
.gauge-label{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:0}
|
|
547
570
|
.gauge-label b{font-size:20px;color:var(--accent2)}
|
|
548
|
-
.gauge-label span{font-size:10.5px;color:var(--
|
|
549
|
-
.dash-sec{font-size:11.5px;color:var(--
|
|
571
|
+
.gauge-label span{font-size:10.5px;color:var(--faint)}
|
|
572
|
+
.dash-sec{font-size:11.5px;color:var(--faint);margin:12px 0 6px;border-top:1px dashed var(--border);padding-top:10px}
|
|
550
573
|
.dash-sec:first-of-type{border-top:none;padding-top:0}
|
|
551
574
|
.dash-chart{background:var(--bg3);border:1px solid var(--border);border-radius:10px;padding:8px}
|
|
552
575
|
.dash-bars{display:flex;flex-direction:column;gap:6px}
|
|
@@ -560,845 +583,85 @@ body.run-open #sessSheet{right:318px}
|
|
|
560
583
|
.dr{display:flex;justify-content:space-between;background:var(--bg3);border:1px solid var(--border);border-radius:8px;padding:5px 10px}
|
|
561
584
|
.dr .m{color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:50%}
|
|
562
585
|
.dr .p{color:var(--accent2);font-variant-numeric:tabular-nums}
|
|
563
|
-
.dr .c{color:var(--
|
|
586
|
+
.dr .c{color:var(--faint);font-variant-numeric:tabular-nums}
|
|
564
587
|
.badge-btn:hover{border-color:var(--accent2);color:var(--accent2)}
|
|
565
|
-
/*
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
.
|
|
570
|
-
.
|
|
571
|
-
|
|
572
|
-
.
|
|
573
|
-
.
|
|
574
|
-
.
|
|
575
|
-
.
|
|
576
|
-
.
|
|
577
|
-
|
|
578
|
-
.
|
|
579
|
-
|
|
580
|
-
.danger-note{font-size:11.5px;color:var(--dim);line-height:1.6;margin:0 0 12px;border-left:3px solid var(--warn);padding-left:8px}
|
|
581
|
-
#dangerOk{background:var(--err);color:#fff;border:none}
|
|
582
|
-
.sr-only{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
|
583
|
-
|
|
584
|
-
/* ============================================================================
|
|
585
|
-
§3.78 布局骨架:照 docs/design/ui-preview.html 逐条搬运(只做颜色变量映射)
|
|
586
|
-
· 令牌:设计稿 --surface-* / --line / --t* → 既有 --bg/--bg2/--panel/--bg3/--border/--text/--dim/--faint;
|
|
587
|
-
设计稿有、既有变量没有的(--line-strong/--ok/--tint-*/--sh-*/--scroll*)在下方 :root 照抄数值。
|
|
588
|
-
· 规则体:下面的布局/组件规则来自设计稿 <style>,数值一字未改;颜色经上面的别名变量仍落到既有变量。
|
|
589
|
-
· 适配层在块尾:只处理"旧 id 规则与新 class 规则打架"(#runPanel/#composer/#runStrip 等),
|
|
590
|
-
数值同样取自设计稿,不自己调。
|
|
591
|
-
============================================================================ */
|
|
592
|
-
:root{
|
|
593
|
-
/* 颜色别名:设计稿变量 → 既有变量(明暗两套都由既有变量自己切换) */
|
|
594
|
-
--surface-0:var(--bg); --surface-1:var(--bg2); --surface-2:var(--panel); --surface-3:var(--bg3);
|
|
595
|
-
--line:var(--border); --t1:var(--text); --t2:var(--dim); --t3:var(--faint);
|
|
596
|
-
--accent-2:var(--accent2); --user-bubble:var(--user); --code-bg:var(--code);
|
|
597
|
-
/* 设计稿规则体里的裸色值(无既有变量可映射,照抄数值):强调渐变上的文字 / 主按钮 */
|
|
598
|
-
--on-accent:#06121a;
|
|
599
|
-
--btn-primary-bg:#F9FAFB; --btn-primary-fg:#0F1115;
|
|
600
|
-
/* 设计稿有、既有变量没有的:照抄数值(来源:ui-preview.html §0,暗色) */
|
|
601
|
-
--line-strong:rgba(255,255,255,.18);
|
|
602
|
-
--ok:#3ddc97;
|
|
603
|
-
--tint-warn:rgba(245,158,11,.08); --tint-err:rgba(242,90,90,.08); --tint-ok:rgba(61,220,151,.08);
|
|
604
|
-
--sh-panel:0 8px 24px rgba(0,0,0,.35); --sh-overlay:0 16px 48px rgba(0,0,0,.55);
|
|
605
|
-
--scroll:#3C3C3D; --scroll-hover:#545557;
|
|
606
|
-
/* 字号 / 间距 / 圆角 / 动效令牌:照抄数值(来源:ui-preview.html §0) */
|
|
607
|
-
--fs-caption:12px; --fs-meta:13px; --fs-body:14px; --fs-body-lg:16px; --fs-title:20px;
|
|
608
|
-
--sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:24px; --sp-6:32px;
|
|
609
|
-
--r-chip:6px; --r-card:10px; --r-field:12px; --r-sheet:14px; --r-pill:999px;
|
|
610
|
-
--dur-fast:150ms; --dur-slow:200ms; --ease:cubic-bezier(.2,.8,.2,1);
|
|
611
|
-
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
|
|
612
|
-
--mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;
|
|
613
|
-
}
|
|
614
|
-
:root[data-theme="light"]{
|
|
615
|
-
/* 照抄数值(来源:ui-preview.html §0,亮色) */
|
|
616
|
-
--line-strong:#D4D4D8;
|
|
617
|
-
--ok:#0E9F6E;
|
|
618
|
-
--tint-warn:rgba(180,83,9,.07); --tint-err:rgba(220,38,38,.06); --tint-ok:rgba(14,159,110,.08);
|
|
619
|
-
--sh-panel:0 8px 24px rgba(24,24,27,.10); --sh-overlay:0 16px 48px rgba(24,24,27,.18);
|
|
620
|
-
--scroll:#D4D4D8; --scroll-hover:#A1A1AA;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
/* ===================== 以下规则体原样来自设计稿 ===================== */
|
|
624
|
-
/* ============================================================
|
|
625
|
-
0. 设计令牌:暗色沿用产品现有取值(src/web/index.html:12-21),
|
|
626
|
-
亮色为同一语言的另一套映射;不新造色相。
|
|
627
|
-
============================================================ */
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
*{box-sizing:border-box}
|
|
632
|
-
*::-webkit-scrollbar{width:10px;height:10px}
|
|
633
|
-
*::-webkit-scrollbar-thumb{background:var(--scroll);border-radius:6px;border:2px solid transparent;background-clip:content-box}
|
|
634
|
-
*::-webkit-scrollbar-thumb:hover{background:var(--scroll-hover);border:2px solid transparent;background-clip:content-box}
|
|
635
|
-
*::-webkit-scrollbar-track{background:transparent}
|
|
636
|
-
html,body{height:100%}
|
|
637
|
-
body{
|
|
638
|
-
margin:0;background:var(--surface-0);color:var(--t1);
|
|
639
|
-
font:var(--fs-body)/1.65 var(--sans);
|
|
640
|
-
overflow:hidden;-webkit-font-smoothing:antialiased;
|
|
641
|
-
}
|
|
642
|
-
button,input,select,textarea{font-family:inherit}
|
|
643
|
-
button{cursor:pointer}
|
|
644
|
-
a{color:var(--accent-2)}
|
|
645
|
-
:focus-visible{outline:2px solid var(--accent-2);outline-offset:2px;border-radius:var(--r-chip)}
|
|
646
|
-
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
|
|
647
|
-
|
|
648
|
-
/* ============================================================
|
|
649
|
-
1. 三列布局:顶栏 / 左栏会话 / 主区对话 / 右栏本轮运行
|
|
650
|
-
============================================================ */
|
|
651
|
-
.app{
|
|
652
|
-
height:100vh;display:grid;
|
|
653
|
-
grid-template-columns:264px minmax(0,1fr) 300px;
|
|
654
|
-
grid-template-rows:48px minmax(0,1fr) auto;
|
|
655
|
-
grid-template-areas:"top top top" "side main run" "side foot run";
|
|
656
|
-
transition:grid-template-columns var(--dur-slow) var(--ease);
|
|
657
|
-
}
|
|
658
|
-
body.run-collapsed .app{grid-template-columns:264px minmax(0,1fr) 0px}
|
|
659
|
-
body.run-collapsed .runpanel{border-left:0}
|
|
588
|
+
/* —— §3.82 右栏四标签(轨迹 / 子Agent / 任务 / 仪表盘)——
|
|
589
|
+
只新增标签栏/标签页容器样式;#runPanel 宽度、body.run-open 推开量、顶栏与网格均不动。
|
|
590
|
+
四个面板本体搬进标签页后不再 fixed(覆盖既有 #tasksPanel/#dashPanel 的定位,宽度跟随右栏)。 */
|
|
591
|
+
.rp-top{flex:none;padding:10px 12px 0}
|
|
592
|
+
.rp-top .rp-sec{margin-bottom:8px}
|
|
593
|
+
/* §3.83:四个标签统一成设计稿 `.seg` 分段控件观感(外框 bg3 + padding 3 / 圆角 9,
|
|
594
|
+
内按钮 26px 高 / 圆角 6;选中态 panel 底 + text 字 + 600 字重)。只改样式,切换逻辑不动。 */
|
|
595
|
+
.rp-tabs{display:flex;gap:4px;padding:3px;margin:0 12px 8px;flex:none;background:var(--bg3);border:1px solid var(--border);border-radius:9px}
|
|
596
|
+
.rp-tabs .seg{flex:1;min-width:0;height:26px;padding:0 4px;border:0;border-radius:6px;background:transparent;color:var(--dim);font-size:12px;white-space:nowrap;cursor:pointer}
|
|
597
|
+
.rp-tabs .seg:hover{color:var(--text)}
|
|
598
|
+
.rp-tabs .seg.on{background:var(--panel);color:var(--text);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,.18)}
|
|
599
|
+
.rp-tabbody{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}
|
|
600
|
+
.rp-tab{flex:1;min-height:0;display:flex;flex-direction:column;overflow-y:auto;padding:10px 12px}
|
|
601
|
+
.rp-tab.rp-tab-flush{padding:0;overflow:hidden}
|
|
602
|
+
#runPanel #tasksPanel,#runPanel #dashPanel{position:static;right:auto;top:auto;bottom:auto;width:auto;max-width:none;height:auto;border-left:0;z-index:auto;box-shadow:none;background:transparent;flex:1;min-height:0;overflow:hidden}
|
|
660
603
|
|
|
661
|
-
/*
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
.
|
|
668
|
-
.
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
.
|
|
673
|
-
.
|
|
674
|
-
.
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
.
|
|
679
|
-
.
|
|
680
|
-
.
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
.
|
|
686
|
-
.
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
.
|
|
693
|
-
.
|
|
694
|
-
.kbtn .kbd{margin-left:2px}
|
|
695
|
-
.kbtn.icon{width:30px;padding:0;justify-content:center}
|
|
696
|
-
.run-chip{display:none}
|
|
697
|
-
body.run-collapsed .run-chip{display:inline-flex}
|
|
698
|
-
.run-chip .dot{width:7px;height:7px;border-radius:50%;background:var(--warn)}
|
|
699
|
-
.kbd{
|
|
700
|
-
display:inline-block;font-family:var(--mono);font-size:10.5px;line-height:16px;
|
|
701
|
-
padding:0 5px;border-radius:5px;border:1px solid var(--line-strong);
|
|
702
|
-
background:var(--surface-2);color:var(--t2);
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
/* ---------- 左栏:会话 ---------- */
|
|
706
|
-
.sidebar{
|
|
707
|
-
grid-area:side;background:var(--surface-1);border-right:1px solid var(--line);
|
|
708
|
-
display:flex;flex-direction:column;min-height:0;min-width:0;
|
|
709
|
-
}
|
|
710
|
-
.ws-row{
|
|
711
|
-
display:flex;align-items:center;gap:8px;margin:var(--sp-3) var(--sp-3) var(--sp-2);
|
|
712
|
-
padding:7px 9px;border:1px solid var(--line);border-radius:var(--r-field);
|
|
713
|
-
background:var(--surface-2);cursor:pointer;transition:border-color var(--dur-fast);
|
|
714
|
-
}
|
|
715
|
-
.ws-row:hover{border-color:var(--accent-2)}
|
|
716
|
-
.ws-row .ico{width:16px;height:16px;color:var(--accent-2);flex:none}
|
|
717
|
-
.ws-row .name{flex:1;min-width:0;font-size:var(--fs-meta);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
718
|
-
.ws-row .chev{color:var(--t3);flex:none}
|
|
719
|
-
.side-search{position:relative;margin:0 var(--sp-3) var(--sp-2)}
|
|
720
|
-
.side-search svg{position:absolute;left:9px;top:8px;width:14px;height:14px;color:var(--t3)}
|
|
721
|
-
.side-search input{
|
|
722
|
-
width:100%;height:32px;padding:0 10px 0 30px;background:var(--surface-2);color:var(--t1);
|
|
723
|
-
border:1px solid var(--line);border-radius:var(--r-field);font-size:var(--fs-meta);
|
|
724
|
-
}
|
|
725
|
-
.side-search input::placeholder{color:var(--t3)}
|
|
726
|
-
.side-search input:focus{border-color:var(--accent-2);outline:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent-2) 30%,transparent)}
|
|
727
|
-
.new-chat{
|
|
728
|
-
margin:0 var(--sp-3) var(--sp-2);height:34px;display:flex;align-items:center;justify-content:center;gap:6px;
|
|
729
|
-
background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--accent);
|
|
730
|
-
border:1px solid color-mix(in srgb,var(--accent) 35%,transparent);
|
|
731
|
-
border-radius:var(--r-field);font-size:var(--fs-meta);font-weight:600;
|
|
732
|
-
transition:background var(--dur-fast);
|
|
733
|
-
}
|
|
734
|
-
.new-chat:hover{background:color-mix(in srgb,var(--accent) 22%,transparent)}
|
|
735
|
-
.new-chat svg{width:14px;height:14px}
|
|
736
|
-
.session-scroll{flex:1;overflow-y:auto;padding:0 var(--sp-2) var(--sp-3);min-height:0}
|
|
737
|
-
.group-label{
|
|
738
|
-
font-size:11px;letter-spacing:.4px;color:var(--t3);text-transform:uppercase;
|
|
739
|
-
padding:10px 10px 4px;
|
|
740
|
-
}
|
|
741
|
-
.sess{
|
|
742
|
-
display:block;width:100%;text-align:left;padding:7px 10px;border-radius:9px;border:1px solid transparent;
|
|
743
|
-
background:transparent;color:var(--t2);margin-bottom:1px;
|
|
744
|
-
}
|
|
745
|
-
.sess:hover{background:var(--surface-2);color:var(--t1)}
|
|
746
|
-
.sess.active{
|
|
747
|
-
background:var(--surface-2);color:var(--t1);border-color:var(--line);
|
|
748
|
-
box-shadow:inset 2px 0 0 var(--accent);
|
|
749
|
-
}
|
|
750
|
-
.sess .abbr{display:none}
|
|
751
|
-
.sess .t{font-size:var(--fs-meta);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
752
|
-
.sess .m{font-size:11px;color:var(--t3);margin-top:2px;display:flex;gap:6px;align-items:center}
|
|
753
|
-
.sess .m .dot{width:5px;height:5px;border-radius:50%;background:var(--t3)}
|
|
754
|
-
.sess.active .m .dot{background:var(--accent)}
|
|
755
|
-
.side-foot{
|
|
756
|
-
border-top:1px solid var(--line);padding:8px 10px;display:flex;align-items:center;gap:8px;
|
|
757
|
-
font-size:11.5px;color:var(--t3);
|
|
758
|
-
}
|
|
759
|
-
.side-foot .avatar{
|
|
760
|
-
width:22px;height:22px;border-radius:50%;background:var(--surface-3);display:grid;place-items:center;
|
|
761
|
-
color:var(--t2);font-size:11px;font-weight:700;flex:none;
|
|
762
|
-
}
|
|
763
|
-
.side-foot .grow{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
764
|
-
|
|
765
|
-
/* ---------- 主区:对话流 ---------- */
|
|
766
|
-
.main{
|
|
767
|
-
grid-area:main;min-width:0;min-height:0;overflow-y:auto;scroll-behavior:smooth;
|
|
768
|
-
background:var(--surface-0);position:relative;
|
|
769
|
-
}
|
|
770
|
-
.stream{max-width:820px;margin:0 auto;padding:12px 20px 12px}
|
|
771
|
-
.divider{
|
|
772
|
-
display:flex;align-items:center;gap:10px;margin:2px 0 12px;
|
|
773
|
-
font-size:11.5px;color:var(--t3);
|
|
774
|
-
}
|
|
775
|
-
.divider::before,.divider::after{content:"";height:1px;background:var(--line);flex:1}
|
|
776
|
-
|
|
777
|
-
/* 消息 */
|
|
778
|
-
.msg-user{display:flex;flex-direction:column;align-items:flex-end;margin:0 0 14px}
|
|
779
|
-
.msg-user .who{font-size:11.5px;color:var(--t3);margin:0 4px 4px}
|
|
780
|
-
.bubble{
|
|
781
|
-
background:var(--user-bubble);border:1px solid var(--line);border-radius:16px 16px 4px 16px;
|
|
782
|
-
padding:10px 15px;max-width:min(560px,88%);font-size:var(--fs-body-lg);line-height:1.6;
|
|
783
|
-
white-space:pre-wrap;word-break:break-word;
|
|
784
|
-
}
|
|
785
|
-
.turn{display:flex;flex-direction:column;gap:8px;margin:0 0 16px}
|
|
786
|
-
.turn-head{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--t3)}
|
|
787
|
-
.turn-head .ai-dot{
|
|
788
|
-
width:18px;height:18px;border-radius:50%;display:grid;place-items:center;flex:none;
|
|
789
|
-
background:linear-gradient(135deg,var(--accent),var(--accent-2));color:var(--on-accent);font-size:10px;font-weight:800;
|
|
790
|
-
}
|
|
791
|
-
.turn-head b{color:var(--t2);font-weight:600}
|
|
792
|
-
.chip{
|
|
793
|
-
display:inline-flex;align-items:center;gap:5px;height:21px;padding:0 7px;border-radius:var(--r-pill);
|
|
794
|
-
border:1px solid var(--line);background:var(--surface-2);color:var(--t2);font-size:11px;white-space:nowrap;
|
|
795
|
-
}
|
|
796
|
-
.chip.mono{font-family:var(--mono);font-size:10.5px}
|
|
797
|
-
.chip.warn{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 40%,transparent);background:var(--tint-warn)}
|
|
798
|
-
.chip.err{color:var(--err);border-color:color-mix(in srgb,var(--err) 40%,transparent);background:var(--tint-err)}
|
|
799
|
-
.chip.ok{color:var(--ok);border-color:color-mix(in srgb,var(--ok) 35%,transparent);background:var(--tint-ok)}
|
|
800
|
-
|
|
801
|
-
/* 正文排版 */
|
|
802
|
-
.content{font-size:var(--fs-body);line-height:1.75;color:var(--t1);max-width:100%}
|
|
803
|
-
.content p{margin:0 0 10px}
|
|
804
|
-
.content p:last-child{margin-bottom:0}
|
|
805
|
-
.content ul{margin:0 0 10px;padding-left:20px}
|
|
806
|
-
.content li{margin:3px 0}
|
|
807
|
-
.content li::marker{color:var(--accent-2)}
|
|
808
|
-
.content code{
|
|
809
|
-
font-family:var(--mono);font-size:12.5px;background:var(--surface-2);border:1px solid var(--line);
|
|
810
|
-
border-radius:5px;padding:1px 5px;
|
|
811
|
-
}
|
|
812
|
-
.content .inline-k{color:var(--accent-2)}
|
|
813
|
-
.deliver{
|
|
814
|
-
display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid var(--line);
|
|
815
|
-
border-left:3px solid var(--accent);border-radius:var(--r-card);background:var(--surface-2);
|
|
816
|
-
font-size:var(--fs-meta);color:var(--t2);
|
|
817
|
-
}
|
|
818
|
-
.deliver svg{width:14px;height:14px;color:var(--accent);flex:none}
|
|
819
|
-
.deliver code{font-family:var(--mono);font-size:12px;color:var(--t1);margin-left:4px}
|
|
820
|
-
|
|
821
|
-
/* 折叠(思考 / 原文) */
|
|
822
|
-
details.fold{border:1px dashed var(--line);border-radius:var(--r-card);background:var(--surface-1)}
|
|
823
|
-
details.fold>summary{
|
|
824
|
-
list-style:none;cursor:pointer;padding:6px 12px;font-size:var(--fs-meta);color:var(--t2);
|
|
825
|
-
display:flex;align-items:center;gap:8px;
|
|
826
|
-
}
|
|
827
|
-
details.fold>summary::-webkit-details-marker{display:none}
|
|
828
|
-
details.fold>summary .tri{
|
|
829
|
-
width:0;height:0;border-left:5px solid currentColor;border-top:4px solid transparent;border-bottom:4px solid transparent;
|
|
830
|
-
transition:transform var(--dur-fast) var(--ease);color:var(--t3);flex:none;
|
|
831
|
-
}
|
|
832
|
-
details.fold[open]>summary .tri{transform:rotate(90deg)}
|
|
833
|
-
details.fold>summary .sum-meta{margin-left:auto;color:var(--t3);font-size:11.5px}
|
|
834
|
-
details.fold .fold-body{padding:8px 12px 11px;border-top:1px solid var(--line);color:var(--t2);font-size:var(--fs-meta);line-height:1.7}
|
|
835
|
-
details.fold .fold-body p{margin:0 0 6px}
|
|
836
|
-
details.fold .fold-body p:last-child{margin:0}
|
|
837
|
-
|
|
838
|
-
/* 工具时间线卡片 */
|
|
839
|
-
.toolcard{
|
|
840
|
-
border:1px solid var(--line);border-radius:var(--r-card);background:var(--surface-1);overflow:hidden;
|
|
841
|
-
}
|
|
842
|
-
.toolcard-head{
|
|
843
|
-
display:flex;align-items:center;gap:9px;padding:7px 12px;background:var(--surface-2);
|
|
844
|
-
font-size:var(--fs-meta);color:var(--t2);
|
|
845
|
-
}
|
|
846
|
-
.toolcard-head .tl-ico{width:15px;height:15px;color:var(--accent-2);flex:none}
|
|
847
|
-
.toolcard-head b{color:var(--t1);font-weight:600}
|
|
848
|
-
.toolcard-head .sep{color:var(--t3)}
|
|
849
|
-
.toolcard-head .sum{margin-left:auto;color:var(--t3);font-size:11.5px;font-variant-numeric:tabular-nums}
|
|
850
|
-
.iconbtn{
|
|
851
|
-
width:24px;height:24px;display:grid;place-items:center;border:1px solid transparent;border-radius:var(--r-chip);
|
|
852
|
-
background:transparent;color:var(--t3);
|
|
853
|
-
}
|
|
854
|
-
.iconbtn:hover{background:var(--surface-3);color:var(--t1)}
|
|
855
|
-
.iconbtn svg{width:13px;height:13px;transition:transform var(--dur-fast) var(--ease)}
|
|
856
|
-
.toolcard.collapsed .iconbtn svg{transform:rotate(-90deg)}
|
|
857
|
-
.toolcard.collapsed .steps,.toolcard.collapsed .more{display:none}
|
|
858
|
-
.steps{list-style:none;margin:0;padding:0}
|
|
859
|
-
.step{border-top:1px solid var(--line)}
|
|
860
|
-
.step:first-child{border-top:0}
|
|
861
|
-
.step-row{
|
|
862
|
-
display:grid;grid-template-columns:20px 20px 62px minmax(0,1fr) 52px 12px;align-items:center;gap:8px;
|
|
863
|
-
width:100%;padding:3px 12px;background:transparent;border:0;color:var(--t2);text-align:left;
|
|
864
|
-
font-size:var(--fs-meta);transition:background var(--dur-fast);
|
|
865
|
-
}
|
|
866
|
-
.step-row:hover{background:var(--surface-2)}
|
|
867
|
-
.step-row .st{width:16px;height:16px;display:grid;place-items:center;flex:none}
|
|
868
|
-
.step-row .st svg{width:13px;height:13px}
|
|
869
|
-
.step-row .st.ok{color:var(--ok)}
|
|
870
|
-
.step-row .st.bad{color:var(--err)}
|
|
871
|
-
.step-row .no{font-family:var(--mono);font-size:11px;color:var(--t3);font-variant-numeric:tabular-nums}
|
|
872
|
-
.step-row .tool{font-family:var(--mono);font-size:12px;color:var(--accent-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
873
|
-
.step-row .args{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--t2);font-family:var(--mono);font-size:12px}
|
|
874
|
-
.step-row .dur{text-align:right;color:var(--t3);font-family:var(--mono);font-size:11px;font-variant-numeric:tabular-nums}
|
|
875
|
-
.step-row .tri{width:0;height:0;border-left:4px solid currentColor;border-top:3px solid transparent;border-bottom:3px solid transparent;color:var(--t3);transition:transform var(--dur-fast) var(--ease)}
|
|
876
|
-
.step.open .step-row .tri{transform:rotate(90deg)}
|
|
877
|
-
.step.fail{box-shadow:inset 3px 0 0 var(--err);background:var(--tint-err)}
|
|
878
|
-
.step.fail .tool{color:var(--err)}
|
|
879
|
-
.step-out{display:none;padding:0 12px 10px 138px}
|
|
880
|
-
.step.open .step-out{display:block}
|
|
881
|
-
.step-out pre{
|
|
882
|
-
margin:0;padding:8px 10px;background:var(--code-bg);border:1px solid var(--line);
|
|
883
|
-
border-radius:8px;max-height:190px;overflow:auto;
|
|
884
|
-
font-family:var(--mono);font-size:12px;line-height:1.55;color:var(--t2);white-space:pre-wrap;word-break:break-word;
|
|
885
|
-
}
|
|
886
|
-
.step-out .bad-line{color:var(--err)}
|
|
887
|
-
.more{
|
|
888
|
-
display:block;width:100%;padding:6px 12px;border:0;border-top:1px solid var(--line);
|
|
889
|
-
background:transparent;color:var(--t3);font-size:11.5px;text-align:center;
|
|
890
|
-
}
|
|
891
|
-
.more:hover{background:var(--surface-2);color:var(--t1)}
|
|
892
|
-
.more[hidden]{display:none}
|
|
893
|
-
|
|
894
|
-
/* 内联权限确认 */
|
|
895
|
-
.permcard{
|
|
896
|
-
border:1px solid color-mix(in srgb,var(--warn) 45%,var(--line));
|
|
897
|
-
border-left:3px solid var(--warn);border-radius:var(--r-card);
|
|
898
|
-
background:var(--tint-warn);padding:9px 12px;display:flex;flex-direction:column;gap:7px;
|
|
899
|
-
}
|
|
900
|
-
.permcard-head{display:flex;align-items:center;gap:8px;font-size:var(--fs-meta);color:var(--warn);font-weight:600}
|
|
901
|
-
.permcard-head svg{width:15px;height:15px;flex:none}
|
|
902
|
-
.permcard-head .scope{margin-left:auto;font-weight:400;color:var(--t3);font-size:11.5px;font-variant-numeric:tabular-nums}
|
|
903
|
-
.permcard .cmd{
|
|
904
|
-
font-family:var(--mono);font-size:12.5px;color:var(--t1);background:var(--code-bg);
|
|
905
|
-
border:1px solid var(--line);border-radius:8px;padding:7px 10px;overflow-x:auto;white-space:pre;
|
|
906
|
-
}
|
|
907
|
-
.permcard .why{font-size:var(--fs-meta);color:var(--t2);display:flex;gap:6px;align-items:flex-start}
|
|
908
|
-
.permcard .why svg{width:13px;height:13px;margin-top:3px;color:var(--t3);flex:none}
|
|
909
|
-
.permcard .acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
|
|
910
|
-
.btn{
|
|
911
|
-
height:30px;padding:0 12px;border-radius:9px;border:1px solid var(--line);
|
|
912
|
-
background:var(--surface-2);color:var(--t1);font-size:var(--fs-meta);
|
|
913
|
-
display:inline-flex;align-items:center;gap:6px;transition:background var(--dur-fast),border-color var(--dur-fast);
|
|
914
|
-
}
|
|
915
|
-
.btn:hover{border-color:var(--accent-2)}
|
|
916
|
-
.btn svg{width:13px;height:13px}
|
|
917
|
-
.btn.primary{background:var(--t1);color:var(--surface-0);border-color:transparent;font-weight:600}
|
|
918
|
-
:root[data-theme="dark"] .btn.primary{background:var(--btn-primary-bg);color:var(--btn-primary-fg)}
|
|
919
|
-
.btn.primary:hover{opacity:.9}
|
|
920
|
-
.btn.danger{background:transparent;color:var(--err);border-color:color-mix(in srgb,var(--err) 45%,transparent)}
|
|
921
|
-
.btn.danger:hover{background:var(--tint-err)}
|
|
922
|
-
.btn.ghost{background:transparent}
|
|
923
|
-
.btn.small{height:26px;padding:0 9px;font-size:12px}
|
|
924
|
-
.btn[disabled]{opacity:.5;cursor:not-allowed}
|
|
925
|
-
.perm-resolved{
|
|
926
|
-
display:none;align-items:center;gap:7px;font-size:var(--fs-meta);color:var(--t2);
|
|
927
|
-
padding:9px 12px;border:1px solid var(--line);border-radius:var(--r-card);background:var(--surface-2);
|
|
928
|
-
}
|
|
929
|
-
.perm-resolved svg{width:14px;height:14px;flex:none}
|
|
930
|
-
.perm-resolved.show{display:flex}
|
|
931
|
-
.perm-resolved.deny svg{color:var(--err)}
|
|
932
|
-
.perm-resolved.allow svg{color:var(--ok)}
|
|
933
|
-
.perm-more{display:none;margin-top:8px;font-size:11.5px;color:var(--t3)}
|
|
934
|
-
.perm-more.show{display:block}
|
|
935
|
-
|
|
936
|
-
/* 错误卡 */
|
|
937
|
-
.err-card{
|
|
938
|
-
border:1px solid color-mix(in srgb,var(--err) 38%,var(--line));
|
|
939
|
-
border-left:3px solid var(--err);border-radius:var(--r-card);
|
|
940
|
-
background:var(--tint-err);padding:9px 12px;display:flex;flex-direction:column;gap:7px;
|
|
941
|
-
}
|
|
942
|
-
.err-head{display:flex;align-items:center;gap:8px;font-size:var(--fs-meta);font-weight:600;color:var(--err);flex-wrap:wrap}
|
|
943
|
-
.err-head svg{width:15px;height:15px;flex:none}
|
|
944
|
-
.err-head .tag{font-weight:500;color:var(--t2);border:1px solid var(--line);background:var(--surface-2);border-radius:var(--r-pill);padding:0 7px;font-size:10.5px;line-height:18px}
|
|
945
|
-
.err-head .retry-note{margin-left:auto;font-weight:400;font-size:11.5px;color:var(--t3)}
|
|
946
|
-
.err-hint{font-size:var(--fs-meta);line-height:1.7;color:var(--t1);white-space:pre-line;margin:0}
|
|
947
|
-
.err-hint .lead{color:var(--t2)}
|
|
948
|
-
details.raw{border-top:0;padding-top:0;min-width:0;flex:1}
|
|
949
|
-
.err-foot{display:flex;align-items:center;gap:10px;border-top:1px dashed var(--line);padding-top:7px;flex-wrap:wrap}
|
|
950
|
-
.err-foot .err-acts{margin-left:auto;padding-top:0}
|
|
951
|
-
details.raw>summary{
|
|
952
|
-
list-style:none;cursor:pointer;font-size:11.5px;color:var(--t3);display:flex;align-items:center;gap:6px;
|
|
953
|
-
}
|
|
954
|
-
details.raw>summary::-webkit-details-marker{display:none}
|
|
955
|
-
details.raw>summary .tri{width:0;height:0;border-left:4px solid currentColor;border-top:3px solid transparent;border-bottom:3px solid transparent;transition:transform var(--dur-fast) var(--ease)}
|
|
956
|
-
details.raw[open]>summary .tri{transform:rotate(90deg)}
|
|
957
|
-
details.raw pre{
|
|
958
|
-
margin:7px 0 0;padding:8px 10px;max-height:170px;overflow:auto;background:var(--code-bg);
|
|
959
|
-
border:1px solid var(--line);border-radius:8px;font-family:var(--mono);font-size:11.5px;
|
|
960
|
-
line-height:1.55;color:var(--t2);white-space:pre-wrap;word-break:break-word;
|
|
961
|
-
}
|
|
962
|
-
.err-acts{display:flex;gap:8px;flex-wrap:wrap}
|
|
963
|
-
|
|
964
|
-
/* ---------- 底部:运行状态条 + 输入区 ---------- */
|
|
965
|
-
.foot{
|
|
966
|
-
grid-area:foot;background:var(--surface-1);border-top:1px solid var(--line);
|
|
967
|
-
padding:8px 20px 12px;
|
|
968
|
-
}
|
|
969
|
-
.foot-inner{max-width:820px;margin:0 auto}
|
|
970
|
-
.runstrip{
|
|
971
|
-
display:flex;align-items:center;gap:10px;min-height:26px;margin-bottom:8px;
|
|
972
|
-
font-size:var(--fs-caption);color:var(--t2);font-variant-numeric:tabular-nums;white-space:nowrap;
|
|
973
|
-
overflow:hidden;
|
|
974
|
-
}
|
|
975
|
-
.runstrip .phase{display:inline-flex;align-items:center;gap:6px;color:var(--t1);font-weight:600;flex:none}
|
|
976
|
-
.runstrip .pdot{width:7px;height:7px;border-radius:50%;background:var(--accent-2);flex:none}
|
|
977
|
-
.runstrip .pdot.acting{background:var(--accent)}
|
|
978
|
-
.runstrip .pdot.wait{background:var(--warn);animation:pulse 1.6s infinite}
|
|
979
|
-
.runstrip .pdot.stop{background:var(--t3);animation:none}
|
|
980
|
-
.runstrip .pdot.idle{background:var(--t3)}
|
|
981
|
-
.runstrip .metric{color:var(--t2);overflow:hidden;text-overflow:ellipsis}
|
|
982
|
-
.runstrip .metric b{color:var(--t1);font-weight:600}
|
|
983
|
-
.runstrip .sep{color:var(--t3);opacity:.7;flex:none}
|
|
984
|
-
.runstrip .ctx{display:inline-flex;align-items:center;gap:5px;flex:none}
|
|
985
|
-
.runstrip .bar{width:44px;height:4px;border-radius:2px;background:var(--surface-3);overflow:hidden;display:inline-block}
|
|
986
|
-
.runstrip .bar i{display:block;height:100%;width:62%;background:var(--accent-2);border-radius:2px}
|
|
987
|
-
.runstrip .grow{flex:1;min-width:8px}
|
|
988
|
-
.stopbtn{
|
|
989
|
-
flex:none;display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 10px;
|
|
990
|
-
border-radius:8px;border:1px solid color-mix(in srgb,var(--err) 45%,transparent);
|
|
991
|
-
background:transparent;color:var(--err);font-size:12px;
|
|
992
|
-
}
|
|
993
|
-
.stopbtn:hover{background:var(--tint-err)}
|
|
994
|
-
.stopbtn svg{width:11px;height:11px}
|
|
995
|
-
.stopbtn[disabled]{opacity:.45;cursor:not-allowed}
|
|
996
|
-
.composer{display:flex;gap:8px;align-items:flex-end}
|
|
997
|
-
.attach{
|
|
998
|
-
width:38px;height:38px;flex:none;display:grid;place-items:center;border-radius:10px;
|
|
999
|
-
background:var(--surface-3);border:1px solid var(--line);color:var(--t2);
|
|
1000
|
-
}
|
|
1001
|
-
.attach:hover{border-color:var(--accent-2);color:var(--t1)}
|
|
1002
|
-
.attach svg{width:16px;height:16px}
|
|
1003
|
-
.input-wrap{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}
|
|
1004
|
-
#input{
|
|
1005
|
-
width:100%;min-height:40px;max-height:160px;resize:none;overflow-y:auto;
|
|
1006
|
-
background:var(--surface-3);color:var(--t1);border:1px solid var(--line);
|
|
1007
|
-
border-radius:var(--r-field);padding:9px 12px;font-size:var(--fs-body);line-height:1.55;
|
|
1008
|
-
}
|
|
1009
|
-
#input::placeholder{color:var(--t3)}
|
|
1010
|
-
#input:focus{outline:none;border-color:var(--accent-2);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent-2) 28%,transparent)}
|
|
1011
|
-
.input-meta{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--t3);padding:0 2px}
|
|
1012
|
-
.input-meta .grow{flex:1}
|
|
1013
|
-
.settings-btn{
|
|
1014
|
-
height:38px;flex:none;display:inline-flex;align-items:center;gap:7px;padding:0 11px;
|
|
1015
|
-
background:var(--surface-2);color:var(--t2);border:1px solid var(--line);border-radius:10px;
|
|
1016
|
-
font-size:12.5px;white-space:nowrap;max-width:250px;
|
|
1017
|
-
}
|
|
1018
|
-
.settings-btn:hover{border-color:var(--accent-2);color:var(--t1)}
|
|
1019
|
-
.settings-btn b{color:var(--t1);font-weight:600;overflow:hidden;text-overflow:ellipsis}
|
|
1020
|
-
.settings-btn .sep{color:var(--t3)}
|
|
1021
|
-
.settings-btn svg{width:14px;height:14px;flex:none}
|
|
1022
|
-
.send{
|
|
1023
|
-
height:38px;flex:none;min-width:74px;padding:0 16px;border:0;border-radius:10px;
|
|
1024
|
-
background:var(--t1);color:var(--surface-0);font-weight:600;font-size:var(--fs-meta);
|
|
1025
|
-
}
|
|
1026
|
-
:root[data-theme="dark"] .send{background:var(--btn-primary-bg);color:var(--btn-primary-fg)}
|
|
1027
|
-
.send:hover{opacity:.9}
|
|
1028
|
-
|
|
1029
|
-
/* ---------- 右栏:本轮运行 ---------- */
|
|
1030
|
-
.runpanel{
|
|
1031
|
-
grid-area:run;background:var(--surface-1);border-left:1px solid var(--line);
|
|
1032
|
-
display:flex;flex-direction:column;min-height:0;min-width:0;overflow:hidden;
|
|
1033
|
-
transition:opacity var(--dur-slow) var(--ease);
|
|
1034
|
-
}
|
|
1035
|
-
body.run-collapsed .runpanel{opacity:0;pointer-events:none}
|
|
1036
|
-
.runpanel-head{
|
|
1037
|
-
display:flex;align-items:center;gap:8px;padding:11px 13px;border-bottom:1px solid var(--line);
|
|
1038
|
-
font-size:var(--fs-meta);font-weight:600;color:var(--t1);flex:none;
|
|
1039
|
-
}
|
|
1040
|
-
.runpanel-head .live{
|
|
1041
|
-
width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 18%,transparent);
|
|
1042
|
-
}
|
|
1043
|
-
.runpanel-head .sub{font-size:11px;color:var(--t3);font-weight:400}
|
|
1044
|
-
.runpanel-head .iconbtn{margin-left:auto}
|
|
1045
|
-
.runpanel-body{flex:1;overflow-y:auto;padding:11px 13px 14px;min-height:0}
|
|
1046
|
-
.rsec{margin-bottom:var(--sp-4)}
|
|
1047
|
-
.rsec:last-child{margin-bottom:0}
|
|
1048
|
-
.rsec-title{
|
|
1049
|
-
font-size:10.5px;letter-spacing:.5px;color:var(--t3);text-transform:uppercase;
|
|
1050
|
-
margin-bottom:7px;display:flex;align-items:center;gap:6px;
|
|
1051
|
-
}
|
|
1052
|
-
.rsec-title .line{flex:1;height:1px;background:var(--line)}
|
|
1053
|
-
.kv{display:grid;grid-template-columns:56px minmax(0,1fr);gap:5px 8px;font-size:12.5px;align-items:baseline}
|
|
1054
|
-
.kv dt{color:var(--t3)}
|
|
1055
|
-
.kv dd{margin:0;color:var(--t1);min-width:0;display:flex;align-items:center;gap:5px;flex-wrap:wrap}
|
|
1056
|
-
.kv dd .src{
|
|
1057
|
-
font-size:10px;color:var(--t3);border:1px solid var(--line);border-radius:var(--r-pill);
|
|
1058
|
-
padding:0 5px;line-height:16px;white-space:nowrap;
|
|
1059
|
-
}
|
|
1060
|
-
.kv dd .edit{margin-left:auto;font-size:11px;color:var(--accent-2);background:none;border:0;padding:0}
|
|
1061
|
-
.kv dd .edit:hover{text-decoration:underline}
|
|
1062
|
-
.metrics{display:grid;grid-template-columns:1fr 1fr;gap:7px}
|
|
1063
|
-
.metric-box{
|
|
1064
|
-
border:1px solid var(--line);border-radius:9px;background:var(--surface-2);padding:7px 9px;
|
|
1065
|
-
display:flex;flex-direction:column;gap:1px;
|
|
1066
|
-
}
|
|
1067
|
-
.metric-box .l{font-size:10.5px;color:var(--t3)}
|
|
1068
|
-
.metric-box .v{font-size:15px;font-weight:650;font-variant-numeric:tabular-nums;color:var(--t1)}
|
|
1069
|
-
.metric-box .v small{font-size:10.5px;font-weight:400;color:var(--t3);margin-left:2px}
|
|
1070
|
-
.metric-box.wide{grid-column:1/-1}
|
|
1071
|
-
.ctxbar{height:5px;border-radius:3px;background:var(--surface-3);overflow:hidden;margin-top:5px}
|
|
1072
|
-
.ctxbar i{display:block;height:100%;width:62%;background:linear-gradient(90deg,var(--accent-2),var(--accent));border-radius:3px}
|
|
1073
|
-
.ctx-legend{display:flex;justify-content:space-between;font-size:10.5px;color:var(--t3);margin-top:3px;font-variant-numeric:tabular-nums}
|
|
1074
|
-
.run-link{
|
|
1075
|
-
display:flex;align-items:center;gap:7px;width:100%;padding:7px 9px;border:1px solid var(--line);
|
|
1076
|
-
border-radius:9px;background:transparent;color:var(--t2);font-size:12.5px;margin-top:6px;text-align:left;
|
|
1077
|
-
}
|
|
1078
|
-
.run-link:hover{border-color:var(--accent-2);color:var(--t1)}
|
|
1079
|
-
.run-link svg{width:13px;height:13px;color:var(--t3);flex:none}
|
|
1080
|
-
.run-link .grow{flex:1}
|
|
1081
|
-
.run-foot{
|
|
1082
|
-
border-top:1px solid var(--line);padding:8px 13px;font-size:11px;color:var(--t3);
|
|
1083
|
-
display:flex;align-items:center;gap:6px;flex:none;
|
|
1084
|
-
}
|
|
1085
|
-
.run-foot .grow{flex:1}
|
|
1086
|
-
|
|
1087
|
-
/* ============================================================
|
|
1088
|
-
2. 浮层:命令面板 / 会话设置 / 快捷键表 / toast
|
|
1089
|
-
============================================================ */
|
|
1090
|
-
.mask{
|
|
1091
|
-
position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:80;
|
|
1092
|
-
display:flex;align-items:flex-start;justify-content:center;
|
|
1093
|
-
}
|
|
1094
|
-
:root[data-theme="light"] .mask{background:rgba(24,24,27,.28)}
|
|
1095
|
-
.mask[hidden]{display:none}
|
|
1096
|
-
.mask.center{align-items:center}
|
|
1097
|
-
.palette{
|
|
1098
|
-
width:min(600px,92vw);margin-top:12vh;background:var(--surface-2);
|
|
1099
|
-
border:1px solid var(--line-strong);border-radius:var(--r-sheet);box-shadow:var(--sh-overlay);
|
|
1100
|
-
overflow:hidden;display:flex;flex-direction:column;max-height:66vh;
|
|
1101
|
-
}
|
|
1102
|
-
.palette-input{
|
|
1103
|
-
display:flex;align-items:center;gap:9px;padding:12px 14px;border-bottom:1px solid var(--line);flex:none;
|
|
1104
|
-
}
|
|
1105
|
-
.palette-input svg{width:17px;height:17px;color:var(--t3);flex:none}
|
|
1106
|
-
.palette-input input{
|
|
1107
|
-
flex:1;min-width:0;background:transparent;border:0;outline:none;color:var(--t1);
|
|
1108
|
-
font-size:15px;
|
|
1109
|
-
}
|
|
1110
|
-
.palette-input input::placeholder{color:var(--t3)}
|
|
1111
|
-
.palette-input .kbd{flex:none}
|
|
1112
|
-
.palette-list{overflow-y:auto;padding:6px;min-height:0}
|
|
1113
|
-
.pgroup{padding:4px 4px 2px}
|
|
1114
|
-
.pgroup-label{font-size:10.5px;letter-spacing:.5px;color:var(--t3);padding:6px 9px 3px;text-transform:uppercase}
|
|
1115
|
-
.pitem{
|
|
1116
|
-
display:flex;align-items:center;gap:9px;width:100%;padding:7px 9px;border:1px solid transparent;
|
|
1117
|
-
border-radius:8px;background:transparent;color:var(--t2);text-align:left;font-size:var(--fs-meta);
|
|
1118
|
-
}
|
|
1119
|
-
.pitem svg{width:14px;height:14px;color:var(--t3);flex:none}
|
|
1120
|
-
.pitem .label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
1121
|
-
.pitem .label b{color:var(--t1);font-weight:600}
|
|
1122
|
-
.pitem .hint{font-size:11px;color:var(--t3);white-space:nowrap}
|
|
1123
|
-
.pitem .scope{
|
|
1124
|
-
font-size:10px;color:var(--t3);border:1px solid var(--line);border-radius:var(--r-pill);
|
|
1125
|
-
padding:0 5px;line-height:15px;white-space:nowrap;
|
|
1126
|
-
}
|
|
1127
|
-
.pitem[aria-selected="true"]{background:var(--surface-3);border-color:var(--line);color:var(--t1);box-shadow:inset 2px 0 0 var(--accent-2)}
|
|
1128
|
-
.pitem[aria-selected="true"] svg{color:var(--accent-2)}
|
|
1129
|
-
.palette-foot{
|
|
1130
|
-
border-top:1px solid var(--line);padding:7px 12px;display:flex;align-items:center;gap:12px;
|
|
1131
|
-
font-size:11px;color:var(--t3);flex:none;flex-wrap:wrap;
|
|
1132
|
-
}
|
|
1133
|
-
.palette-foot .grow{flex:1}
|
|
1134
|
-
.palette-empty{padding:26px 16px;text-align:center;color:var(--t3);font-size:var(--fs-meta)}
|
|
1135
|
-
|
|
1136
|
-
/* 会话设置 popover */
|
|
1137
|
-
.popover{
|
|
1138
|
-
position:fixed;right:320px;bottom:96px;width:400px;max-width:calc(100vw - 32px);
|
|
1139
|
-
background:var(--surface-2);border:1px solid var(--line-strong);border-radius:var(--r-sheet);
|
|
1140
|
-
box-shadow:var(--sh-overlay);z-index:70;overflow:hidden;
|
|
1141
|
-
}
|
|
1142
|
-
body.run-collapsed .popover{right:24px}
|
|
1143
|
-
.popover[hidden]{display:none}
|
|
1144
|
-
.pop-head{display:flex;align-items:center;gap:8px;padding:11px 13px;border-bottom:1px solid var(--line);font-size:var(--fs-meta);font-weight:600}
|
|
1145
|
-
.pop-head .sub{margin-left:auto;font-size:11px;color:var(--t3);font-weight:400}
|
|
1146
|
-
.pop-body{padding:11px 13px;max-height:min(62vh,470px);overflow-y:auto}
|
|
1147
|
-
.field{margin-bottom:12px}
|
|
1148
|
-
.field:last-child{margin-bottom:0}
|
|
1149
|
-
.field label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--t2);margin-bottom:5px}
|
|
1150
|
-
.field label .scope{
|
|
1151
|
-
margin-left:auto;font-size:10px;color:var(--t3);border:1px solid var(--line);
|
|
1152
|
-
border-radius:var(--r-pill);padding:0 6px;line-height:16px;
|
|
1153
|
-
}
|
|
1154
|
-
.field select{
|
|
1155
|
-
width:100%;height:32px;padding:0 8px;background:var(--surface-3);color:var(--t1);
|
|
1156
|
-
border:1px solid var(--line);border-radius:8px;font-size:var(--fs-meta);
|
|
1157
|
-
}
|
|
1158
|
-
.field select:focus{border-color:var(--accent-2);outline:none}
|
|
1159
|
-
.field .src-line{font-size:11px;color:var(--t3);margin-top:4px;display:flex;gap:5px;align-items:center}
|
|
1160
|
-
.field .src-line svg{width:11px;height:11px;flex:none}
|
|
1161
|
-
.seg{display:flex;gap:4px;background:var(--surface-3);border:1px solid var(--line);border-radius:9px;padding:3px}
|
|
1162
|
-
.seg button{
|
|
1163
|
-
flex:1;height:26px;border:0;border-radius:6px;background:transparent;color:var(--t2);font-size:12px;
|
|
1164
|
-
}
|
|
1165
|
-
.seg button.on{background:var(--surface-2);color:var(--t1);box-shadow:0 1px 3px rgba(0,0,0,.18);font-weight:600}
|
|
1166
|
-
.field .inline-chk{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--t3);margin-top:6px}
|
|
1167
|
-
.field .inline-chk input{accent-color:var(--accent-2)}
|
|
1168
|
-
.pop-effective{
|
|
1169
|
-
margin:0 13px 11px;padding:8px 10px;border:1px dashed var(--line);border-radius:8px;
|
|
1170
|
-
font-size:11.5px;color:var(--t2);line-height:1.65;
|
|
1171
|
-
}
|
|
1172
|
-
.pop-effective b{color:var(--t1)}
|
|
1173
|
-
.pop-foot{display:flex;align-items:center;gap:8px;padding:9px 13px;border-top:1px solid var(--line)}
|
|
1174
|
-
.pop-foot .grow{flex:1;font-size:11px;color:var(--t3)}
|
|
1175
|
-
|
|
1176
|
-
/* 快捷键表 */
|
|
1177
|
-
.sheet{
|
|
1178
|
-
width:min(560px,92vw);background:var(--surface-2);border:1px solid var(--line-strong);
|
|
1179
|
-
border-radius:var(--r-sheet);box-shadow:var(--sh-overlay);overflow:hidden;margin:auto;
|
|
1180
|
-
}
|
|
1181
|
-
.sheet-head{display:flex;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--line);font-weight:600}
|
|
1182
|
-
.sheet-head .iconbtn{margin-left:auto}
|
|
1183
|
-
.sheet-body{padding:12px 14px;display:grid;grid-template-columns:1fr 1fr;gap:8px 18px}
|
|
1184
|
-
.sheet-row{display:flex;align-items:center;gap:8px;font-size:var(--fs-meta);color:var(--t2)}
|
|
1185
|
-
.sheet-row .grow{flex:1}
|
|
1186
|
-
.sheet-row .kbd{font-size:10.5px}
|
|
1187
|
-
.sheet-note{grid-column:1/-1;font-size:11.5px;color:var(--t3);border-top:1px solid var(--line);padding-top:9px;margin-top:3px}
|
|
1188
|
-
|
|
1189
|
-
/* toast */
|
|
1190
|
-
#toastWrap{position:fixed;left:50%;top:60px;transform:translateX(-50%);z-index:120;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}
|
|
1191
|
-
.toast{
|
|
1192
|
-
pointer-events:none;background:var(--surface-3);color:var(--t1);border:1px solid var(--line-strong);
|
|
1193
|
-
border-radius:var(--r-pill);padding:7px 14px;font-size:12.5px;box-shadow:var(--sh-panel);
|
|
1194
|
-
opacity:0;transform:translateY(-6px);transition:opacity var(--dur-slow),transform var(--dur-slow);
|
|
1195
|
-
max-width:min(560px,90vw);text-align:center;
|
|
1196
|
-
}
|
|
1197
|
-
.toast.show{opacity:1;transform:translateY(0)}
|
|
1198
|
-
.toast.warn{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 40%,var(--line))}
|
|
1199
|
-
|
|
1200
|
-
@keyframes pulse{50%{opacity:.4}}
|
|
1201
|
-
@keyframes blink{50%{opacity:.35}}
|
|
1202
|
-
.caret{display:inline-block;width:7px;height:15px;background:var(--accent-2);vertical-align:-2px;margin-left:2px;animation:blink 1.1s infinite;border-radius:1px}
|
|
1203
|
-
|
|
1204
|
-
/* ============================================================
|
|
1205
|
-
3. 响应式:1180 收右栏 / 900 侧栏图标化
|
|
1206
|
-
============================================================ */
|
|
1207
|
-
@media (max-width:1180px){
|
|
1208
|
-
.app{grid-template-columns:232px minmax(0,1fr) 0px}
|
|
1209
|
-
.runpanel{border-left:0;opacity:0;pointer-events:none}
|
|
1210
|
-
.run-chip{display:inline-flex}
|
|
1211
|
-
.popover{right:24px}
|
|
1212
|
-
.stream,.foot-inner{max-width:760px}
|
|
1213
|
-
/* 窄屏:右栏变成覆盖式抽屉,不挤压正文 */
|
|
1214
|
-
body.run-drawer .runpanel{
|
|
1215
|
-
position:fixed;right:0;top:48px;bottom:0;width:300px;opacity:1;pointer-events:auto;
|
|
1216
|
-
border-left:1px solid var(--line);z-index:60;box-shadow:var(--sh-panel);
|
|
1217
|
-
background:var(--surface-1);transition:none;
|
|
1218
|
-
}
|
|
1219
|
-
body.run-drawer .runpanel-head{background:var(--surface-1)}
|
|
1220
|
-
body.run-drawer .runpanel-head .iconbtn svg{transform:rotate(180deg)}
|
|
1221
|
-
}
|
|
1222
|
-
@media (max-width:980px){
|
|
1223
|
-
.app{grid-template-columns:64px minmax(0,1fr) 0px}
|
|
1224
|
-
.sidebar .ws-row .name,.sidebar .ws-row .chev,.side-search,.new-chat span,.sess .m,.group-label,.side-foot .grow,.side-foot .ver{display:none}
|
|
1225
|
-
.ws-row{justify-content:center;padding:7px 0;margin:10px 8px}
|
|
1226
|
-
.new-chat{margin:0 8px 8px;height:34px}
|
|
1227
|
-
.new-chat svg{margin:0}
|
|
1228
|
-
.session-scroll{padding:0 6px 8px}
|
|
1229
|
-
.sess{padding:8px 0;text-align:center}
|
|
1230
|
-
.sess .t{display:none}
|
|
1231
|
-
.sess .abbr{display:inline-grid;place-items:center;width:26px;height:26px;border-radius:7px;background:var(--surface-3);font-size:11px;color:var(--t2)}
|
|
1232
|
-
.side-foot{justify-content:center;padding:8px 4px}
|
|
1233
|
-
.draft-badge{display:none}
|
|
1234
|
-
.stream{padding:var(--sp-4) var(--sp-3) var(--sp-3)}
|
|
1235
|
-
.foot{padding:8px 12px 10px}
|
|
1236
|
-
.runstrip .metric.optional{display:none}
|
|
1237
|
-
.settings-btn .model-label{max-width:88px}
|
|
1238
|
-
.settings-btn .perm-label,.settings-btn .sep{display:none}
|
|
1239
|
-
}
|
|
1240
|
-
@media (max-width:720px){
|
|
1241
|
-
.topbar{padding:0 10px;gap:6px}
|
|
1242
|
-
.crumb{display:none}
|
|
1243
|
-
.settings-btn{max-width:150px}
|
|
1244
|
-
.bubble{max-width:100%}
|
|
1245
|
-
}
|
|
1246
|
-
@media (prefers-reduced-motion:reduce){
|
|
1247
|
-
*{animation:none!important;transition:none!important;scroll-behavior:auto!important}
|
|
1248
|
-
}
|
|
1249
|
-
|
|
1250
|
-
/* ===================== 适配层(旧 id 规则 → 新 class 骨架) ===================== */
|
|
1251
|
-
/* 页面骨架:旧 body 是 flex 列、header/main/footer 是老布局;这里让 .app 的 grid 生效。 */
|
|
1252
|
-
html,body{height:100%}
|
|
1253
|
-
body{display:block;overflow:hidden;padding:0;transition:none}
|
|
1254
|
-
header.topbar{min-height:0;overflow:visible;white-space:normal;flex-wrap:nowrap;padding:0 var(--sp-4);gap:var(--sp-3)}
|
|
1255
|
-
main.main{padding:0;overflow-y:auto;min-width:0}
|
|
1256
|
-
#chat{max-width:none;margin:0;padding:0}
|
|
1257
|
-
#composer{max-width:none;margin:0;gap:var(--sp-2)}
|
|
1258
|
-
#runStrip{gap:10px;min-height:26px;margin:0 0 var(--sp-2);padding:0;background:transparent;border:0;border-radius:0;font-size:var(--fs-caption);flex-wrap:nowrap;white-space:nowrap;overflow:hidden;max-width:none}
|
|
1259
|
-
#statusBar{margin-top:2px;max-width:none}
|
|
1260
|
-
#hint{max-width:none}
|
|
1261
|
-
/* 旧"推开内容区"的 body padding 全部作废:三栏由 grid 负责 */
|
|
1262
|
-
body.traj-open,body.sub-open,body.tasks-open,body.dash-open,body.run-open{padding:0}
|
|
1263
|
-
/* 右栏:旧 #runPanel 是 fixed 抽屉;宽屏时它必须回到 grid 的 run 区 */
|
|
1264
|
-
#runPanel{position:static;right:auto;top:auto;bottom:auto;width:auto;z-index:auto;box-shadow:none;grid-area:run;border-left:1px solid var(--line);background:var(--surface-1)}
|
|
1265
|
-
/* 四个原并列面板:搬进右栏标签页后不再 fixed,铺满标签面板 */
|
|
1266
|
-
#runPanel #trajPanel,#runPanel #subPanel,#runPanel #tasksPanel,#runPanel #dashPanel{position:static;left:auto;right:auto;top:auto;bottom:auto;width:auto;max-width:none;z-index:auto;border:0;box-shadow:none;background:transparent;min-height:0}
|
|
1267
|
-
#runPanel #dashPanel .dash-head,#runPanel #trajPanel .tj-head,#runPanel #subPanel .sb-head,#runPanel #tasksPanel .tp-head{display:none}
|
|
1268
|
-
#runPanel #tjClose,#runPanel #sbClose,#runPanel #tpClose,#runPanel #dashClose{display:none}
|
|
1269
|
-
#runPanel #dashPanel .dash-body{padding:0}
|
|
1270
|
-
#trajRail{display:none}
|
|
1271
|
-
/* 消息气泡:设计稿选择器 .bubble,但产品 DOM 是 .msg-user>.bubble;逐字复制设计稿 declare */
|
|
1272
|
-
.msg-user .bubble{background:var(--user-bubble);border:1px solid var(--line);border-radius:16px 16px 4px 16px;padding:10px 15px;max-width:min(560px,88%);font-size:var(--fs-body-lg);line-height:1.6;white-space:pre-wrap;word-break:break-word}
|
|
1273
|
-
/* 会话设置浮层:设计稿 .popover 定位(右栏 300px + 20px) */
|
|
1274
|
-
#sessSheet{right:320px;bottom:96px;width:400px;max-width:calc(100vw - 32px)}
|
|
1275
|
-
body.run-open #sessSheet{right:320px}
|
|
1276
|
-
body:not(.run-open) #sessSheet{right:24px}
|
|
1277
|
-
/* 底部状态条:设计稿 .runstrip 的六项/分隔符(id 规则会压过 class,逐字复制关键项) */
|
|
1278
|
-
#runStrip .metric,#runStrip .rs-field{color:var(--t2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
1279
|
-
#runStrip .sep{color:var(--t3);opacity:.7;flex:none}
|
|
1280
|
-
#runStrip .grow{flex:1;min-width:8px}
|
|
1281
|
-
#runStrip .bar{width:44px;height:4px;border-radius:2px;background:var(--surface-3);overflow:hidden;display:inline-block;vertical-align:1px}
|
|
1282
|
-
#runStrip .bar i{display:block;height:100%;width:0;background:var(--accent2);border-radius:2px;transition:width var(--dur-fast) var(--ease)}
|
|
1283
|
-
/* 右栏标签页:复用设计稿 .seg 的外观(segmented control),只补面板容器 */
|
|
1284
|
-
.run-tabs{margin:0 0 var(--sp-3)}
|
|
1285
|
-
.run-tabs button{font-size:var(--fs-caption)}
|
|
1286
|
-
.run-tabpanels{display:flex;flex-direction:column;min-height:0;flex:1}
|
|
1287
|
-
.run-tabpanel{flex:1;min-height:0;overflow-y:auto;padding:0 0 var(--sp-2)}
|
|
1288
|
-
.run-tabpanel-head{display:flex;align-items:center;gap:8px;font-size:var(--fs-meta);color:var(--t2);padding:0 0 var(--sp-2)}
|
|
1289
|
-
.run-tabpanel-head .grow{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
1290
|
-
.run-legacy{border:1px dashed var(--line);border-radius:var(--r-card);margin-top:var(--sp-3);padding:6px 10px;background:var(--surface-1)}
|
|
1291
|
-
.run-legacy>summary{cursor:pointer;list-style:none;font-size:var(--fs-caption);color:var(--t3)}
|
|
1292
|
-
.run-legacy>summary::-webkit-details-marker{display:none}
|
|
1293
|
-
.run-legacy[open]>summary{color:var(--t2);margin-bottom:4px}
|
|
1294
|
-
#tjList,#sbList{max-height:42vh;overflow-y:auto}
|
|
1295
|
-
/* 顶栏:设计稿没有的窄屏侧栏抽屉开关(<900 才出现) */
|
|
1296
|
-
.side-toggle{display:none}
|
|
1297
|
-
.draft-badge[hidden]{display:none}
|
|
1298
|
-
/* 会话列表滚动区:空态 */
|
|
1299
|
-
.sess-empty{padding:10px;color:var(--dim);font-size:var(--fs-meta)}
|
|
1300
|
-
/* 侧栏工作空间:设计稿 .ws-row 里是按钮;产品是原生 select,铺满并去掉边框 */
|
|
1301
|
-
.ws-row select{flex:1;min-width:0;background:transparent;border:0;color:var(--text);font-size:var(--fs-meta);font-weight:600;padding:0;height:auto;appearance:none;-webkit-appearance:none;cursor:pointer}
|
|
1302
|
-
.ws-row select:focus{outline:none;border-color:var(--accent2)}
|
|
1303
|
-
/* 侧栏底部:环境徽章/费用/管理/主题(设计稿 .side-foot 语义) */
|
|
1304
|
-
.side-foot{min-width:0}
|
|
1305
|
-
.side-foot #envBadge{font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:110px;background:transparent;border:0;padding:0;color:var(--t3)}
|
|
1306
|
-
.side-foot #costBadge{font-size:11px;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}
|
|
1307
|
-
.side-foot .iconbtn{width:24px;height:24px;padding:0;border:1px solid transparent;background:transparent;color:var(--t3)}
|
|
1308
|
-
/* 消息里的设计稿 turn-head(助手/模型 chip) */
|
|
1309
|
-
.msg-ai .turn-head .chip.mono{font-family:var(--mono);font-size:10.5px}
|
|
1310
|
-
/* 设计稿 .cmd(权限确认里的命令/问题正文) */
|
|
1311
|
-
.perm-card .cmd{font-family:var(--mono);font-size:12.5px;color:var(--text);background:var(--code-bg);border:1px solid var(--line);border-radius:8px;padding:7px 10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word}
|
|
1312
|
-
/* 设计稿 .field(会话设置里的三件套) */
|
|
1313
|
-
.ss-field.field{margin-bottom:12px}
|
|
1314
|
-
/* 设计稿 .edit(右栏会话配置的「改」) */
|
|
1315
|
-
.rp-kv .edit{margin-left:auto;font-size:11px;color:var(--accent2);background:none;border:0;padding:0;cursor:pointer}
|
|
1316
|
-
.rp-kv .edit:hover{text-decoration:underline}
|
|
1317
|
-
/* 设计稿 .ai-dot / .avatar 已由规则体覆盖;这里只保证尺寸在既有结构里不被压扁 */
|
|
1318
|
-
.turn-head{flex-wrap:wrap}
|
|
1319
|
-
/* 断点:<1180 右栏变覆盖式抽屉;<900 侧栏变抽屉(任务要求的抽屉语义;设计稿在 980 把侧栏图标化,
|
|
1320
|
-
两者都保留左侧可达性,这里按任务要求实现抽屉,差异登记在 §3.78) */
|
|
1321
|
-
@media (max-width:1180px){
|
|
1322
|
-
#runPanel{position:fixed;top:48px;right:0;bottom:0;width:300px;max-width:92vw;z-index:60;display:none;box-shadow:var(--sh-panel)}
|
|
1323
|
-
body.run-drawer #runPanel{display:flex}
|
|
1324
|
-
#sessSheet,body.run-open #sessSheet{right:24px}
|
|
1325
|
-
}
|
|
1326
|
-
@media (max-width:900px){
|
|
1327
|
-
#runPanel{width:300px}
|
|
1328
|
-
.sidebar{position:fixed;left:0;top:48px;bottom:0;width:264px;z-index:61;transform:translateX(-100%);transition:transform var(--dur-slow) var(--ease);box-shadow:12px 0 32px rgba(0,0,0,.4)}
|
|
1329
|
-
body.side-drawer .sidebar{transform:none}
|
|
1330
|
-
.side-toggle{display:inline-flex}
|
|
1331
|
-
body:not(.side-drawer) .sidebar{pointer-events:none}
|
|
1332
|
-
body.side-drawer .sidebar{pointer-events:auto}
|
|
1333
|
-
}
|
|
1334
|
-
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important;scroll-behavior:auto!important}}
|
|
1335
|
-
|
|
1336
|
-
/* ===================== §3.78 适配层(续):标签页滚动 / 运行 chip / 单列断点 ===================== */
|
|
1337
|
-
/* 右栏内部:指标固定、标签页内容各自滚动(设计稿 .runpanel-body 本身是滚动容器) */
|
|
1338
|
-
#runPanel .runpanel-body{display:flex;flex-direction:column;overflow:hidden}
|
|
1339
|
-
#runPanel .run-tabpanels{flex:1;min-height:0;display:flex;flex-direction:column}
|
|
1340
|
-
#runPanel .run-tabpanel{flex:1;min-height:0;overflow-y:auto;padding:0}
|
|
1341
|
-
.run-tabs{flex:none}
|
|
1342
|
-
/* 顶栏「运行」chip:右栏收起时出现(设计稿 body.run-collapsed .run-chip;产品判据是 body:not(.run-open)) */
|
|
1343
|
-
#runChip{display:none}
|
|
1344
|
-
body:not(.run-open) #runChip{display:inline-flex}
|
|
1345
|
-
/* <900:单列 + 侧栏抽屉(任务要求"侧栏变抽屉";设计稿在 980 把侧栏图标化,差异登记 §3.78) */
|
|
1346
|
-
@media (max-width:900px){
|
|
1347
|
-
.app{grid-template-columns:minmax(0,1fr);grid-template-areas:"top" "main" "foot"}
|
|
1348
|
-
}
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
/* —— §3.78 无障碍覆盖:--faint 在 --bg3/--panel 上只有 3.26/3.76:1(低于 4.5:1),
|
|
1352
|
-
承载信息的次要文本改用 --dim(在 --bg3 5.67:1 / --panel 6.53:1);--faint 仅留装饰(分隔符/三角/占位)。
|
|
1353
|
-
这是对设计稿 --t3 用法的**有意偏离**,逐条登记在 §3.78。 —— */
|
|
1354
|
-
.sess .m,.kv dt,.kv .src,.rsec-title,.metric-box .l,.metric-box .v small,.runpanel-head .sub,.run-foot,.side-foot,.side-foot .grow{color:var(--dim)}
|
|
1355
|
-
.sess .m .dot{background:var(--dim)}
|
|
1356
|
-
.palette-foot,.palette-empty,.pgroup-label,.pitem .hint,.pitem .scope{color:var(--dim)}
|
|
1357
|
-
/* 子Agent 计数徽章:原来绝对定位挂在左侧图标轨,现在挂在标签页按钮里 */
|
|
1358
|
-
#subBadge{position:static;display:inline-block;margin-left:4px;min-width:16px;height:16px;padding:0 4px;border-radius:8px;background:var(--err);color:#fff;font-size:9.5px;line-height:16px;text-align:center;font-weight:700;vertical-align:1px}
|
|
1359
|
-
@media (min-width:1181px){
|
|
1360
|
-
body.rail-collapsed .app{grid-template-columns:264px minmax(0,1fr) 0px}
|
|
1361
|
-
}
|
|
604
|
+
/* —— §3.83 对比度:承载信息的次要文本从 --faint 提到 --dim ——
|
|
605
|
+
只改下列选择器的 color,**不动** :root 里的 --faint/--dim 取值(避免全局漂移);
|
|
606
|
+
WCAG 对比度(暗色 #81858C→#ADB2B8):bg 4.92→8.54、bg2 4.64→8.06、
|
|
607
|
+
panel 3.76→6.53、bg3 3.26→5.67。覆盖:消息元信息/用量、提示条、任务与子Agent状态、
|
|
608
|
+
轨迹轮次与计数、工具耗时与输出计数、来源/作用域胶囊、rp-foot 说明、空态说明、底部累计状态。 */
|
|
609
|
+
.msg-meta,
|
|
610
|
+
.usage,
|
|
611
|
+
.banner:not(.banner-warn),
|
|
612
|
+
#hint,
|
|
613
|
+
#statusBar,
|
|
614
|
+
.sb-item .sb-meta,
|
|
615
|
+
.tp-item .tp-meta,
|
|
616
|
+
.tl-row .tl-dur,
|
|
617
|
+
.tl-out-meta,
|
|
618
|
+
.tl-more,
|
|
619
|
+
.tr-round-no,
|
|
620
|
+
.tr-sub-meta,
|
|
621
|
+
.tr-sub-stats,
|
|
622
|
+
.tr-sub-wait,
|
|
623
|
+
.tr-sub-state,
|
|
624
|
+
.rp-fold-meta,
|
|
625
|
+
.td-fold-meta,
|
|
626
|
+
.td-meta,
|
|
627
|
+
.rp-kv .rp-src,
|
|
628
|
+
.rp-foot .grow,
|
|
629
|
+
.ss-src,
|
|
630
|
+
.ss-field .ss-scope,
|
|
631
|
+
.dash-head .dash-sub,
|
|
632
|
+
.dr .c,
|
|
633
|
+
.tr-empty,
|
|
634
|
+
#emptyState .es-lead,
|
|
635
|
+
.empty-step .es-main span,
|
|
636
|
+
.empty-step .es-state{color:var(--dim)}
|
|
1362
637
|
</style>
|
|
1363
638
|
</head>
|
|
1364
639
|
<body>
|
|
1365
|
-
<
|
|
1366
|
-
<
|
|
1367
|
-
|
|
1368
|
-
<
|
|
1369
|
-
<div class="crumb" title="当前工作空间 › 当前会话"><span id="crumbWs">工作空间</span><span class="sep">›</span><b id="crumbSession">新对话</b></div>
|
|
1370
|
-
<span class="draft-badge" id="draftBadge" hidden>草稿 · 未发送</span>
|
|
640
|
+
<header>
|
|
641
|
+
<div class="logo">MingDao <span>Harness</span></div>
|
|
642
|
+
<!-- v0.6.21 小步重排(§3.81):顶栏只保留「我在哪」的当前位置;模型/预设/权限只在 #sessSheet 里改。 -->
|
|
643
|
+
<span id="crumb" class="badge" title="当前工作空间 › 当前会话"><span id="crumbWs">工作空间</span><span aria-hidden="true"> › </span><b id="crumbSession">新对话</b></span>
|
|
1371
644
|
<span id="cfgMsg" class="badge" style="display:none"></span>
|
|
1372
|
-
<
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
645
|
+
<button id="paletteBtn" title="搜索或运行命令(⌘K / Ctrl+K)" aria-haspopup="dialog">⌘K <span class="palette-label">搜索或运行</span></button>
|
|
646
|
+
<button id="cfgBtn" title="设置">⚙</button>
|
|
647
|
+
<button id="runChip" title="本轮运行面板(窄屏以抽屉展开)" aria-expanded="false">运行</button>
|
|
648
|
+
<button id="themeBtn" title="切换明暗主题(跟随系统时由系统偏好决定)" aria-label="切换明暗主题">🌙</button>
|
|
649
|
+
<select id="wsSel" title="工作空间(切换 / 新建,目录自动创建)"></select>
|
|
650
|
+
<span class="badge" id="envBadge"></span>
|
|
651
|
+
<div class="hdr-right">
|
|
652
|
+
<div class="spacer"></div>
|
|
653
|
+
<span class="badge badge-btn" id="costBadge" title="省钱仪表盘(点击展开)" style="cursor:pointer">📊 —</span>
|
|
654
|
+
<input id="sessionSearch" placeholder="搜索会话…" title="关键词检索历史会话">
|
|
655
|
+
<select id="sessions" title="历史会话"><option value="">历史会话</option></select>
|
|
656
|
+
<button id="tasksBtn" title="任务面板">任务</button><button id="sessMgrBtn" title="管理会话(重命名/删除)">✎</button>
|
|
657
|
+
<button id="newChat">新对话</button>
|
|
1376
658
|
</div>
|
|
1377
659
|
</header>
|
|
1378
|
-
<
|
|
1379
|
-
<
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
</div>
|
|
1384
|
-
<div class="side-search">
|
|
1385
|
-
<span aria-hidden="true">🔎</span>
|
|
1386
|
-
<input id="sessionSearch" type="search" placeholder="搜索会话…" aria-label="搜索会话" data-i18n-placeholder="header.searchPlaceholder" data-i18n-title="header.searchTitle">
|
|
1387
|
-
</div>
|
|
1388
|
-
<button class="new-chat" id="newChat" type="button" data-i18n="header.newChat">+ 新对话</button>
|
|
1389
|
-
<nav class="session-scroll" id="sessionNav" aria-label="会话列表"></nav>
|
|
1390
|
-
<select id="sessions" title="历史会话" data-i18n-title="header.sessions" hidden aria-hidden="true"><option value="">历史会话</option></select>
|
|
1391
|
-
<div class="side-foot">
|
|
1392
|
-
<span class="avatar" aria-hidden="true">M</span>
|
|
1393
|
-
<span class="grow" id="envBadge"></span>
|
|
1394
|
-
<span class="ver" id="costBadge" title="省钱仪表盘(点击展开)" data-i18n-title="header.costTitle" style="cursor:pointer">📊 —</span>
|
|
1395
|
-
<button id="sessMgrBtn" class="iconbtn" type="button" title="管理会话(重命名/删除)" aria-label="管理会话" data-i18n-title="header.sessMgrTitle" data-i18n-aria-label="header.sessMgrTitle">✎</button>
|
|
1396
|
-
<button id="themeBtn" class="iconbtn" type="button" title="切换明暗主题" aria-label="切换明暗主题" data-i18n-title="header.theme" data-i18n-aria-label="header.theme">🌙</button>
|
|
1397
|
-
</div>
|
|
1398
|
-
</aside>
|
|
1399
|
-
<main class="main">
|
|
1400
|
-
<!-- 主区(标签 <main>):三栏的中间列;对话流与末尾轨迹区块都必须在它里面 -->
|
|
1401
|
-
<div class="stream">
|
|
660
|
+
<div id="trajRail">
|
|
661
|
+
<button class="rail-btn" id="trajRailBtn" title="轨迹(点击查看详情)">🧭</button>
|
|
662
|
+
<button class="rail-btn" id="subRailBtn" title="子 Agent">🤖<span class="rail-badge" id="subBadge" style="display:none"></span></button>
|
|
663
|
+
</div>
|
|
664
|
+
<main>
|
|
1402
665
|
<!-- P1-6 空态三步引导(v0.6.19 §3.70):无会话 / 无消息时显示;示例任务只填入输入框,不自动发送。 -->
|
|
1403
666
|
<div id="emptyState" hidden>
|
|
1404
667
|
<h2>开始第一轮</h2>
|
|
@@ -1422,115 +685,120 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1422
685
|
<div id="tdBody">
|
|
1423
686
|
<section class="td-fold">
|
|
1424
687
|
<button class="td-fold-head" type="button" data-fold="trace" aria-controls="tdTraceFoldBody" aria-expanded="true">轨迹<span class="td-fold-meta" id="tdTraceMeta">—</span></button>
|
|
1425
|
-
<div id="tdTraceFoldBody"><div id="tdTraceList"
|
|
688
|
+
<div id="tdTraceFoldBody"><div id="tdTraceList"></div></div>
|
|
1426
689
|
</section>
|
|
1427
690
|
<section class="td-fold">
|
|
1428
691
|
<button class="td-fold-head" type="button" data-fold="subs" aria-controls="tdSubFoldBody" aria-expanded="true">子Agent<span class="td-fold-meta" id="tdSubMeta">—</span></button>
|
|
1429
|
-
<div id="tdSubFoldBody"><div id="tdSubList"
|
|
692
|
+
<div id="tdSubFoldBody"><div id="tdSubList"></div></div>
|
|
1430
693
|
</section>
|
|
1431
694
|
</div>
|
|
1432
695
|
</section>
|
|
1433
|
-
</div>
|
|
1434
696
|
</main>
|
|
1435
|
-
<footer
|
|
1436
|
-
<div class="foot-inner">
|
|
697
|
+
<footer>
|
|
1437
698
|
<!-- P0-1 常驻运行状态条(v0.6.18 §3.68):唯一刷新出口 renderWorkStatus()。
|
|
1438
699
|
六个 data-k 字段是 smoke §148 的结构锚点:phase / ttft / tps / ctx / tools / cost。
|
|
1439
700
|
数据只来自既有 SSE progress·usage·done 事件与 /api/state(不新增每帧轮询)。 -->
|
|
1440
|
-
<div id="runStrip" class="
|
|
1441
|
-
<span class="rs-phase
|
|
1442
|
-
<span class="sep" aria-hidden="true">·</span>
|
|
701
|
+
<div id="runStrip" class="run-strip" role="status" aria-live="polite" aria-atomic="true">
|
|
702
|
+
<span class="rs-phase" data-k="phase"><span class="rs-dot" aria-hidden="true"></span><b id="rsPhase">空闲</b></span>
|
|
703
|
+
<span class="rs-sep" aria-hidden="true">·</span>
|
|
1443
704
|
<span class="rs-field" data-k="ttft">首帧 <b id="rsTtft">—</b></span>
|
|
1444
|
-
<span class="sep" aria-hidden="true">·</span>
|
|
1445
|
-
<span class="rs-field
|
|
1446
|
-
<span class="sep" aria-hidden="true">·</span>
|
|
1447
|
-
<span class="rs-field
|
|
1448
|
-
<span class="sep" aria-hidden="true">·</span>
|
|
1449
|
-
<span class="rs-field
|
|
1450
|
-
<span class="sep" aria-hidden="true">·</span>
|
|
1451
|
-
<span class="rs-field
|
|
705
|
+
<span class="rs-sep" aria-hidden="true">·</span>
|
|
706
|
+
<span class="rs-field" data-k="tps">吞吐 <b id="rsTps">—</b> tok/s</span>
|
|
707
|
+
<span class="rs-sep" aria-hidden="true">·</span>
|
|
708
|
+
<span class="rs-field" data-k="ctx">上下文 <b id="rsCtx">—</b></span>
|
|
709
|
+
<span class="rs-sep" aria-hidden="true">·</span>
|
|
710
|
+
<span class="rs-field" data-k="tools">工具 <b id="rsTools">0 次工具调用</b></span>
|
|
711
|
+
<span class="rs-sep" aria-hidden="true">·</span>
|
|
712
|
+
<span class="rs-field" data-k="cost">本轮费用 <b id="rsCost">—</b></span>
|
|
1452
713
|
<span class="rs-detail" id="rsDetail"></span>
|
|
1453
714
|
<span class="rs-bg" id="rsBg" style="display:none"></span>
|
|
1454
|
-
<span class="grow"></span>
|
|
1455
|
-
<button class="stopbtn" id="stripStop" type="button" disabled title="停止本轮">■ 停止</button>
|
|
1456
715
|
</div>
|
|
1457
716
|
<input type="file" id="fileInput" accept="image/png,image/jpeg,image/gif,image/webp,.txt,.md,.json,.js,.py,.log,.csv,.html,.css" multiple style="display:none">
|
|
1458
717
|
<div id="attachList" style="display:none"></div>
|
|
1459
|
-
<div id="composer"
|
|
1460
|
-
<button id="attachBtn"
|
|
1461
|
-
<
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
<button id="
|
|
1467
|
-
<button id="sendBtn" class="send primary" type="button" data-i18n="footer.send">发送</button>
|
|
718
|
+
<div id="composer">
|
|
719
|
+
<button id="attachBtn" title="上传图片或文本文件(图片需支持视觉的模型)">📎</button>
|
|
720
|
+
<textarea id="input" rows="1" placeholder="输入任务…(Enter 发送,Shift+Enter 换行)"></textarea>
|
|
721
|
+
<!-- P1-5 会话设置弹层(v0.6.19 §3.70):模型 / 预设 / 权限三件套收进同一个 popover,
|
|
722
|
+
按钮上直接印当前生效的模型与权限(用户一眼知道"东西没丢")。原三个 select 保留在弹层内
|
|
723
|
+
(send()/init() 仍按既有 id 读取),不再占输入区。 -->
|
|
724
|
+
<button id="sessSettingsBtn" title="会话设置:模型 / 预设 / 权限(含生效值与来源)" aria-haspopup="dialog" aria-expanded="false"><b id="chipModel">模型</b><span class="sep">·</span><span id="chipPerm">权限</span></button>
|
|
725
|
+
<button id="sendBtn" class="primary">发送</button>
|
|
1468
726
|
</div>
|
|
1469
|
-
<div id="hint"><span id="hintText">工具执行与权限确认会实时展示;生成中(含等待权限确认时)可点「■ 停止」立即中断。</span><label style="margin-left:12px;cursor:pointer;user-select:none"><input type="checkbox" id="journalChk" style="vertical-align:-2px;margin:0 4px 0 0"
|
|
727
|
+
<div id="hint"><span id="hintText">工具执行与权限确认会实时展示;生成中(含等待权限确认时)可点「■ 停止」立即中断。</span><label style="margin-left:12px;cursor:pointer;user-select:none"><input type="checkbox" id="journalChk" style="vertical-align:-2px;margin:0 4px 0 0">📌 带上文(最近会话日志,默认关=新会话全新开始)</label></div>
|
|
1470
728
|
<div id="statusBar" title="累计使用统计(轮次/步数/LLM 与工具时长/首 token/吞吐/缓存命中/输入输出 tokens)"></div>
|
|
1471
|
-
</div>
|
|
1472
729
|
</footer>
|
|
1473
730
|
|
|
1474
731
|
<!-- P1-4 右栏「本轮运行」(v0.6.19 §3.70):与底部状态条**同源**(runPanelView → runStripView → runState),
|
|
1475
732
|
≥1180 默认展开并推开正文;<1180 收起为顶栏「运行」chip,点开是覆盖式抽屉。无新增轮询。 -->
|
|
1476
|
-
<aside id="runPanel"
|
|
1477
|
-
<div class="
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
<
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
<dt>模型</dt><dd><span id="rpModel">—</span><span class="src" id="rpModelSrc">来源:设置</span><button class="edit" type="button" data-open-settings>改</button></dd>
|
|
1488
|
-
<dt>API id</dt><dd><span class="chip mono" id="rpModelId">—</span></dd>
|
|
1489
|
-
<dt>预设</dt><dd><span id="rpPreset">无预设</span><span class="src">本轮</span><button class="edit" type="button" data-open-settings>改</button></dd>
|
|
1490
|
-
<dt>权限</dt><dd><span id="rpPerm">—</span><span class="src" id="rpPermSrc">—</span><button class="edit" type="button" data-open-settings>改</button></dd>
|
|
733
|
+
<aside id="runPanel" aria-label="本轮运行" hidden>
|
|
734
|
+
<div class="rp-head"><span class="rp-live" aria-hidden="true"></span><span>本轮运行</span><span class="rp-sub">指标口径:本轮(非累计)</span><button id="rpCollapse" type="button" title="收起右栏">收起</button></div>
|
|
735
|
+
<!-- §3.82:状态条(阶段/首帧/吞吐/工具数/上下文/费用)留在顶部,不随标签切换。 -->
|
|
736
|
+
<div class="rp-top">
|
|
737
|
+
<section class="rp-sec">
|
|
738
|
+
<div class="rp-sec-title">会话配置<span class="line"></span></div>
|
|
739
|
+
<dl class="rp-kv">
|
|
740
|
+
<dt>模型</dt><dd><span id="rpModel">—</span><span class="rp-src" id="rpModelSrc">设置</span></dd>
|
|
741
|
+
<dt>API id</dt><dd><span class="rp-id" id="rpModelId">—</span></dd>
|
|
742
|
+
<dt>预设</dt><dd><span id="rpPreset">无预设</span><span class="rp-src">本轮</span></dd>
|
|
743
|
+
<dt>权限</dt><dd><span id="rpPerm">—</span><span class="rp-src" id="rpPermSrc">—</span></dd>
|
|
1491
744
|
</dl>
|
|
1492
745
|
</section>
|
|
1493
|
-
<section class="
|
|
1494
|
-
<div class="
|
|
1495
|
-
<div class="metrics">
|
|
1496
|
-
<div class="metric
|
|
1497
|
-
<div class="metric
|
|
1498
|
-
<div class="metric
|
|
1499
|
-
<div class="metric
|
|
1500
|
-
<div class="metric
|
|
1501
|
-
<div class="metric
|
|
1502
|
-
<div class="metric
|
|
746
|
+
<section class="rp-sec">
|
|
747
|
+
<div class="rp-sec-title">本轮数据<span class="line"></span></div>
|
|
748
|
+
<div class="rp-metrics">
|
|
749
|
+
<div class="rp-metric"><span class="l">阶段</span><span class="v" data-rk="phase" id="rpPhase">空闲</span></div>
|
|
750
|
+
<div class="rp-metric"><span class="l">首帧 TTFT</span><span class="v" data-rk="ttft" id="rpTtft">—</span></div>
|
|
751
|
+
<div class="rp-metric"><span class="l">吞吐</span><span class="v" data-rk="tps"><span id="rpTps">—</span><small>tok/s</small></span></div>
|
|
752
|
+
<div class="rp-metric"><span class="l">工具步数</span><span class="v" data-rk="tools" id="rpTools">0</span></div>
|
|
753
|
+
<div class="rp-metric"><span class="l">本轮用时</span><span class="v" id="rpTime">—</span></div>
|
|
754
|
+
<div class="rp-metric wide"><span class="l">上下文占用</span><span class="v" data-rk="ctx" id="rpCtx">—</span><div class="rp-ctxbar"><i id="rpCtxBar"></i></div></div>
|
|
755
|
+
<div class="rp-metric wide"><span class="l">本轮费用(估算)</span><span class="v" data-rk="cost" id="rpCost">—</span></div>
|
|
1503
756
|
</div>
|
|
1504
757
|
</section>
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
<
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
<
|
|
758
|
+
</div>
|
|
759
|
+
<!-- §3.82 第二步:四个标签。只切 display(railTabDisplay),节点不销毁、id 不变。 -->
|
|
760
|
+
<div class="rp-tabs" role="tablist" aria-label="右栏标签">
|
|
761
|
+
<button id="rtTrace" type="button" role="tab" data-tab="trace" aria-selected="true" aria-controls="tabTrace" class="seg on">轨迹</button>
|
|
762
|
+
<button id="rtSub" type="button" role="tab" data-tab="sub" aria-selected="false" aria-controls="tabSub" class="seg">子Agent</button>
|
|
763
|
+
<button id="rtTasks" type="button" role="tab" data-tab="tasks" aria-selected="false" aria-controls="tabTasks" class="seg">任务</button>
|
|
764
|
+
<button id="rtDash" type="button" role="tab" data-tab="dash" aria-selected="false" aria-controls="tabDash" class="seg">仪表盘</button>
|
|
765
|
+
</div>
|
|
766
|
+
<div class="rp-tabbody">
|
|
767
|
+
<section id="tabTrace" class="rp-tab" role="tabpanel" aria-labelledby="rtTrace" data-tab="trace">
|
|
768
|
+
<!-- §3.73:轨迹折叠区(renderTracePanels 写入 #rpTraceList,不在这里重写)。 -->
|
|
769
|
+
<section class="rp-sec" id="rpTraceSec">
|
|
770
|
+
<button class="rp-sec-title rp-fold-head" type="button" data-fold="trace" aria-controls="rpTraceFoldBody" aria-expanded="true">轨迹<span class="rp-fold-meta" id="rpTraceMeta">—</span><span class="line"></span><span class="rp-fold-tri" aria-hidden="true"></span></button>
|
|
771
|
+
<div id="rpTraceFoldBody"><div id="rpTraceList" class="tr-list"></div></div>
|
|
772
|
+
</section>
|
|
773
|
+
<!-- 旧轨迹面板随标签搬入(id/子节点原样保留,openTraj 仍写 #tjList);默认收起,避免与上面的轮次列表重复。 -->
|
|
774
|
+
<aside id="trajPanel" style="display:none">
|
|
775
|
+
<div class="tj-head">🧭 任务轨迹<span id="tjSummary" style="font-size:11.5px;color:var(--faint);font-weight:400"></span><button id="tjClose">关闭</button></div>
|
|
776
|
+
<div id="tjList"></div>
|
|
1519
777
|
</aside>
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
778
|
+
</section>
|
|
779
|
+
<section id="tabSub" class="rp-tab" role="tabpanel" aria-labelledby="rtSub" data-tab="sub" style="display:none">
|
|
780
|
+
<!-- §3.73:子Agent 折叠区(renderTracePanels 写入 #rpSubList)。 -->
|
|
781
|
+
<section class="rp-sec" id="rpSubSec">
|
|
782
|
+
<button class="rp-sec-title rp-fold-head" type="button" data-fold="subs" aria-controls="rpSubFoldBody" aria-expanded="true">子Agent<span class="rp-fold-meta" id="rpSubMeta">—</span><span class="line"></span><span class="rp-fold-tri" aria-hidden="true"></span></button>
|
|
783
|
+
<div id="rpSubFoldBody"><div id="rpSubList" class="tr-list"></div></div>
|
|
784
|
+
</section>
|
|
785
|
+
<!-- 旧子Agent 面板随标签搬入(id/子节点原样保留);默认收起。 -->
|
|
786
|
+
<aside id="subPanel" style="display:none">
|
|
787
|
+
<div class="sb-head">🤖 子 Agent<span id="sbCount" style="font-size:11.5px;color:var(--faint);font-weight:400"></span><button id="sbClose">关闭</button></div>
|
|
788
|
+
<div id="sbList"></div>
|
|
1527
789
|
</aside>
|
|
1528
|
-
|
|
1529
|
-
|
|
790
|
+
</section>
|
|
791
|
+
<section id="tabTasks" class="rp-tab rp-tab-flush" role="tabpanel" aria-labelledby="rtTasks" data-tab="tasks" style="display:none">
|
|
792
|
+
<!-- 任务面板:原 <aside id="tasksPanel"> 整体搬入(#tpList/#tpCount 不动),宽度改为跟随右栏。 -->
|
|
793
|
+
<aside id="tasksPanel" style="display:none">
|
|
794
|
+
<div class="tp-head">任务面板 <span id="tpCount"></span><button id="tpClose" style="float:right">✕</button></div>
|
|
1530
795
|
<div id="tpList"></div>
|
|
1531
796
|
</aside>
|
|
1532
|
-
|
|
1533
|
-
|
|
797
|
+
</section>
|
|
798
|
+
<section id="tabDash" class="rp-tab rp-tab-flush" role="tabpanel" aria-labelledby="rtDash" data-tab="dash" style="display:none">
|
|
799
|
+
<!-- 省钱仪表盘:原 <aside id="dashPanel"> 整体搬入(KPI/趋势/Top 全部保留),宽度改为跟随右栏。 -->
|
|
800
|
+
<aside id="dashPanel" style="display:none">
|
|
801
|
+
<div class="dash-head">📊 省钱仪表盘 <span class="dash-sub">费用 · 命中 · 节省</span><button id="dashClose">✕</button></div>
|
|
1534
802
|
<div class="dash-body">
|
|
1535
803
|
<div class="dash-kpi">
|
|
1536
804
|
<div class="kpi"><span class="kpi-l">今日费用</span><span class="kpi-v" id="kpiToday">—</span></div>
|
|
@@ -1552,36 +820,34 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1552
820
|
<div id="dashRecent" class="dash-recent"></div>
|
|
1553
821
|
</div>
|
|
1554
822
|
</aside>
|
|
1555
|
-
</
|
|
823
|
+
</section>
|
|
1556
824
|
</div>
|
|
1557
|
-
<div class="
|
|
825
|
+
<div class="rp-foot"><span class="grow" id="rpFootNote">停止与压缩:与状态条同一条停止出口</span><button id="rpCompact" type="button" hidden title="后端有 /compact 时才显示">压缩上下文</button><button id="rpStop" type="button" disabled>■ 停止</button></div>
|
|
1558
826
|
</aside>
|
|
1559
|
-
</div>
|
|
1560
|
-
|
|
1561
827
|
|
|
1562
828
|
<!-- P1-5 会话设置弹层 -->
|
|
1563
|
-
<div id="sessSheet"
|
|
1564
|
-
<div class="ss-head"
|
|
829
|
+
<div id="sessSheet" role="dialog" aria-modal="false" aria-label="会话设置" hidden>
|
|
830
|
+
<div class="ss-head">⚙ 会话设置<span class="ss-sub">模型 / 预设 / 权限</span><button id="ssClose" type="button">关闭</button></div>
|
|
1565
831
|
<div class="ss-body">
|
|
1566
|
-
<div class="ss-field
|
|
1567
|
-
<label for="modelSel"
|
|
832
|
+
<div class="ss-field">
|
|
833
|
+
<label for="modelSel">模型<span class="ss-scope">全局 · 下一轮生效</span></label>
|
|
1568
834
|
<select id="modelSel" title="切换模型"></select>
|
|
1569
835
|
<div class="ss-src"><b id="ssModelLabel">—</b><br><span id="ssModelId">API id: —</span><br><span id="ssModelSrc">来源:设置 › 模型与密钥 · 写入 config.json,下一轮生效</span></div>
|
|
1570
|
-
<div class="ss-src" id="ssModelAliasHint" hidden
|
|
836
|
+
<div class="ss-src" id="ssModelAliasHint" hidden>显示名来自 config.modelLabels,请求使用 API id。</div>
|
|
1571
837
|
</div>
|
|
1572
|
-
<div class="ss-field
|
|
1573
|
-
<label for="presetSel"
|
|
838
|
+
<div class="ss-field">
|
|
839
|
+
<label for="presetSel">预设<span class="ss-scope">仅下一轮</span></label>
|
|
1574
840
|
<select id="presetSel" title="智能体预设:一键切换工具白名单/权限/参数组合(选「无预设」恢复默认)"><option value="">无预设</option></select>
|
|
1575
|
-
<div class="ss-src"
|
|
841
|
+
<div class="ss-src" id="ssPresetSrc">当前:无预设 · 来源:你的选择 · 仅下一轮(工具白名单 / 参数);不改变权限来源。</div>
|
|
1576
842
|
</div>
|
|
1577
|
-
<div class="ss-field
|
|
1578
|
-
<label
|
|
843
|
+
<div class="ss-field">
|
|
844
|
+
<label>权限<span class="ss-scope">全局 + 本轮</span></label>
|
|
1579
845
|
<select id="permSel" title="权限模式:询问=写文件/执行命令前先确认(推荐) · 自动=全部直接放行 · 只读=禁止修改与执行。此处选择随每条消息一起发送,优先于预设声明的权限(预设只能收紧、不能提权)">
|
|
1580
846
|
<option value="ask">询问</option>
|
|
1581
847
|
<option value="auto">自动</option>
|
|
1582
848
|
<option value="readonly">只读</option>
|
|
1583
849
|
</select>
|
|
1584
|
-
<div class="ss-seg
|
|
850
|
+
<div class="ss-seg" id="ssPermSeg" role="group" aria-label="权限模式">
|
|
1585
851
|
<button type="button" data-perm="ask">询问</button>
|
|
1586
852
|
<button type="button" data-perm="auto">自动</button>
|
|
1587
853
|
<button type="button" data-perm="readonly">只读</button>
|
|
@@ -1589,7 +855,7 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1589
855
|
<div class="ss-src" id="ssPermSrc">permission=ask(来源:default)</div>
|
|
1590
856
|
</div>
|
|
1591
857
|
<div class="ss-field" id="ssReasoningField" hidden>
|
|
1592
|
-
<label for="reasoningSel"
|
|
858
|
+
<label for="reasoningSel">推理等级<span class="ss-scope">全局</span></label>
|
|
1593
859
|
<select id="reasoningSel" title="思考模式(推理等级):关=不推理省 token · 低 · 高(默认)· 最高=最强推理">
|
|
1594
860
|
<option value="off">关</option>
|
|
1595
861
|
<option value="low">低</option>
|
|
@@ -1599,26 +865,26 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1599
865
|
</div>
|
|
1600
866
|
</div>
|
|
1601
867
|
<div class="ss-effective" id="ssEffective">本轮实际生效:—</div>
|
|
1602
|
-
<div class="ss-foot"><span class="grow"
|
|
868
|
+
<div class="ss-foot"><span class="grow">每项右侧标了作用域;模型/预设/权限都只在这里改</span><button id="ssDone" type="button" class="primary">完成</button></div>
|
|
1603
869
|
</div>
|
|
1604
870
|
|
|
1605
871
|
<!-- P1-2 命令面板(⌘K / Ctrl+K) -->
|
|
1606
|
-
<div class="overlay
|
|
1607
|
-
<div class="palette" role="dialog" aria-modal="true" aria-label="命令面板"
|
|
872
|
+
<div class="overlay" id="paletteMask" hidden>
|
|
873
|
+
<div class="palette" role="dialog" aria-modal="true" aria-label="命令面板">
|
|
1608
874
|
<div class="palette-input">
|
|
1609
875
|
<span aria-hidden="true">🔎</span>
|
|
1610
|
-
<input id="paletteInput" type="text" placeholder="搜索会话、工作空间、模型、预设、权限、设置项…"
|
|
876
|
+
<input id="paletteInput" type="text" placeholder="搜索会话、工作空间、模型、预设、权限、设置项…" role="combobox" aria-expanded="true" aria-controls="paletteList" aria-activedescendant="" autocomplete="off">
|
|
1611
877
|
<span class="kbd">Esc</span>
|
|
1612
878
|
</div>
|
|
1613
879
|
<div class="palette-list" id="paletteList" role="listbox" aria-label="命令"></div>
|
|
1614
|
-
<div class="palette-foot"><span><span class="kbd">↑</span><span class="kbd">↓</span>
|
|
880
|
+
<div class="palette-foot"><span><span class="kbd">↑</span><span class="kbd">↓</span> 选择</span><span><span class="kbd">↵</span> 执行</span><span><span class="kbd">esc</span> 关闭</span><span class="grow"></span><span>作用域标签 = 改动影响范围</span></div>
|
|
1615
881
|
</div>
|
|
1616
882
|
</div>
|
|
1617
883
|
|
|
1618
884
|
<!-- P1-3 快捷键表(⌘/ / Ctrl+/):只列**真实实现**的快捷键 -->
|
|
1619
|
-
<div class="overlay
|
|
1620
|
-
<div class="shortcut-sheet
|
|
1621
|
-
<div class="shortcut-head">⌨️ 键盘快捷键<span style="font-size:11px;color:var(--
|
|
885
|
+
<div class="overlay center" id="shortcutMask" hidden>
|
|
886
|
+
<div class="shortcut-sheet" role="dialog" aria-modal="true" aria-label="键盘快捷键">
|
|
887
|
+
<div class="shortcut-head">⌨️ 键盘快捷键<span style="font-size:11px;color:var(--faint);font-weight:400">(只列已实现项)</span><button id="shortcutClose" type="button">关闭</button></div>
|
|
1622
888
|
<div class="shortcut-rows">
|
|
1623
889
|
<div class="shortcut-row" data-shortcut="⌘K"><span class="kbd">⌘K / Ctrl+K</span><span class="grow">命令面板(搜索 / 切换 / 执行)</span></div>
|
|
1624
890
|
<div class="shortcut-row" data-shortcut="⌘/"><span class="kbd">⌘/ / Ctrl+/</span><span class="grow">打开本表</span></div>
|
|
@@ -1642,17 +908,6 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1642
908
|
</div>
|
|
1643
909
|
</div>
|
|
1644
910
|
|
|
1645
|
-
<!-- P2-2 危险操作二次确认(v0.6.19 §3.76):说明后果 + 必须点「确认」;回车不确认,Esc 取消。
|
|
1646
|
-
role/aria-modal 由 installDialog 补齐;初始焦点落在「取消」(避免误按回车执行)。 -->
|
|
1647
|
-
<div class="overlay center" id="dangerMask" hidden>
|
|
1648
|
-
<div class="modal danger-modal" id="dangerDialog" role="dialog" aria-modal="true" aria-labelledby="dangerTitle" aria-describedby="dangerBody">
|
|
1649
|
-
<h3 id="dangerTitle" data-i18n="danger.title">确认危险操作</h3>
|
|
1650
|
-
<div class="danger-body" id="dangerBody"></div>
|
|
1651
|
-
<p class="danger-note" id="dangerNote" data-i18n="danger.note">需要点击「确认」才会执行;按回车不会确认,Esc 取消。</p>
|
|
1652
|
-
<div class="row"><button id="dangerCancel" type="button" data-i18n="danger.cancel">取消</button><button id="dangerOk" type="button" class="danger" data-i18n="danger.confirm">确认</button></div>
|
|
1653
|
-
</div>
|
|
1654
|
-
</div>
|
|
1655
|
-
|
|
1656
911
|
<div id="modalRoot"></div>
|
|
1657
912
|
<div id="sessModal" class="modal-mask" style="display:none">
|
|
1658
913
|
<div class="modal">
|
|
@@ -1663,23 +918,22 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1663
918
|
</div>
|
|
1664
919
|
<div id="cfgModal" class="modal-mask" style="display:none">
|
|
1665
920
|
<div class="modal cfg-modal">
|
|
1666
|
-
<h3
|
|
921
|
+
<h3>⚙ 设置</h3>
|
|
1667
922
|
<!-- P1-7 设置分组 + 搜索(v0.6.19 §3.70):按用户任务分组;输入关键字按标题/说明/placeholder 过滤,
|
|
1668
923
|
不匹配的 .cfg-row 带 hidden 属性;命中项高亮。 -->
|
|
1669
|
-
<div class="cfg-search"><input id="cfgSearch" placeholder="搜索设置项(标题 / 关键字,如 沙箱、超时、Key)…"
|
|
1670
|
-
<div class="cfg-hint" data-i18n="settings.defaultSource">默认值来自 config.js 内置默认表(/api/state.defaults 只读透出)</div>
|
|
924
|
+
<div class="cfg-search"><input id="cfgSearch" placeholder="搜索设置项(标题 / 关键字,如 沙箱、超时、Key)…" aria-label="搜索设置项" autocomplete="off"><span class="cfg-search-count" id="cfgSearchCount"></span></div>
|
|
1671
925
|
<div class="cfg-body">
|
|
1672
926
|
<nav class="cfg-nav">
|
|
1673
|
-
<button class="cfg-nav-btn active" data-panel="models" data-group="model"
|
|
1674
|
-
<button class="cfg-nav-btn" data-panel="runtime" data-group="runtime"
|
|
1675
|
-
<button class="cfg-nav-btn" data-panel="permissions" data-group="permission"
|
|
1676
|
-
<button class="cfg-nav-btn" data-panel="appearance" data-group="appearance"
|
|
1677
|
-
<button class="cfg-nav-btn" data-panel="workspace" data-group="workspace"
|
|
1678
|
-
<button class="cfg-nav-btn" data-panel="schedule" data-group="automation"
|
|
1679
|
-
<button class="cfg-nav-btn" data-panel="sync" data-group="sync"
|
|
1680
|
-
<button class="cfg-nav-btn" data-panel="memory" data-group="memory"
|
|
1681
|
-
<button class="cfg-nav-btn" data-panel="mcp" data-group="ecosystem"
|
|
1682
|
-
<button class="cfg-nav-btn" data-panel="skills" data-group="ecosystem"
|
|
927
|
+
<button class="cfg-nav-btn active" data-panel="models" data-group="model">🔌 模型与端点</button>
|
|
928
|
+
<button class="cfg-nav-btn" data-panel="runtime" data-group="runtime">⏱️ 运行与超时</button>
|
|
929
|
+
<button class="cfg-nav-btn" data-panel="permissions" data-group="permission">🛡️ 权限与沙箱</button>
|
|
930
|
+
<button class="cfg-nav-btn" data-panel="appearance" data-group="appearance">🎨 外观</button>
|
|
931
|
+
<button class="cfg-nav-btn" data-panel="workspace" data-group="workspace">📁 工作空间</button>
|
|
932
|
+
<button class="cfg-nav-btn" data-panel="schedule" data-group="automation">⏰ 调度队列</button>
|
|
933
|
+
<button class="cfg-nav-btn" data-panel="sync" data-group="sync">☁️ 云同步与协作</button>
|
|
934
|
+
<button class="cfg-nav-btn" data-panel="memory" data-group="memory">🧠 长期记忆</button>
|
|
935
|
+
<button class="cfg-nav-btn" data-panel="mcp" data-group="ecosystem">🔌 MCP 生态</button>
|
|
936
|
+
<button class="cfg-nav-btn" data-panel="skills" data-group="ecosystem">🧩 技能库</button>
|
|
1683
937
|
</nav>
|
|
1684
938
|
<div class="cfg-panels">
|
|
1685
939
|
<section class="cfg-panel active" data-panel="models">
|
|
@@ -1731,98 +985,40 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1731
985
|
</section>
|
|
1732
986
|
<section class="cfg-panel" data-panel="permissions">
|
|
1733
987
|
<h4 style="margin:4px 0;color:var(--accent2)">权限与沙箱</h4>
|
|
1734
|
-
<div class="cfg-row" data-
|
|
988
|
+
<div class="cfg-row" data-kw="权限 permission ask auto readonly 沙箱 sandbox 隔离"><label>权限模式(写文件 / 执行命令前是否确认)</label>
|
|
1735
989
|
<div class="cfg-hint">权限模式在 <b>⚙ 会话设置</b>(输入区右侧)里切换,含生效值与来源;此处只控制沙箱。</div>
|
|
1736
|
-
<div class="cfg-cols" data-cols="permission">
|
|
1737
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colDefault">默认</span><span class="cfg-default">ask</span></div>
|
|
1738
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1739
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1740
|
-
</div>
|
|
1741
990
|
</div>
|
|
1742
|
-
<div class="cfg-row" data-
|
|
991
|
+
<div class="cfg-row" data-kw="沙箱 sandbox 隔离 bash 只读 断网"><label>沙箱模式(bash 执行隔离)</label>
|
|
1743
992
|
<select id="sbxSel">
|
|
1744
993
|
<option value="off">off — 直接执行</option>
|
|
1745
994
|
<option value="readonly">readonly — 全盘只读(/tmp 可写)</option>
|
|
1746
995
|
<option value="safe">safe — 只读 + 断网(最安全)</option>
|
|
1747
996
|
</select>
|
|
1748
997
|
<div class="cfg-hint" id="sbxHint"></div>
|
|
1749
|
-
<div class="cfg-cols" data-cols="sandbox">
|
|
1750
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colDefault">默认</span><span class="cfg-default">off</span></div>
|
|
1751
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1752
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1753
|
-
</div>
|
|
1754
998
|
</div>
|
|
1755
999
|
</section>
|
|
1756
1000
|
<section class="cfg-panel" data-panel="runtime">
|
|
1757
1001
|
<h4 style="margin:4px 0;color:var(--accent2)">运行与超时</h4>
|
|
1758
|
-
<div class="cfg-row" data-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1762
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1763
|
-
</div>
|
|
1764
|
-
</div>
|
|
1765
|
-
<div class="cfg-row" data-setting="contextBudget" data-kw="上下文预算 context budget tokens 窗口"><label>上下文预算 tokens <input type="number" id="budgetInput" min="1000" step="1000"></label>
|
|
1766
|
-
<div class="cfg-cols" data-cols="contextBudget">
|
|
1767
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colDefault">默认</span><span class="cfg-default">128000</span></div>
|
|
1768
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1769
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1770
|
-
</div>
|
|
1771
|
-
</div>
|
|
1772
|
-
<div class="cfg-row" data-setting="timeout" data-kw="超时 timeout 首帧 first token 流式空闲 stream idle 总量 total 秒" style="display:flex;gap:6px;flex-wrap:wrap;align-items:flex-end">
|
|
1002
|
+
<div class="cfg-row" data-kw="路由 routing 模型 router planner executor"><label><input type="checkbox" id="routeChk"> 自动模型路由(规划→pro / 执行→flash)</label></div>
|
|
1003
|
+
<div class="cfg-row" data-kw="上下文预算 context budget tokens 窗口"><label>上下文预算 tokens <input type="number" id="budgetInput" min="1000" step="1000"></label></div>
|
|
1004
|
+
<div class="cfg-row" data-kw="超时 timeout 首帧 first token 流式空闲 stream idle 总量 total 秒" style="display:flex;gap:6px;flex-wrap:wrap;align-items:flex-end">
|
|
1773
1005
|
<label style="font-size:12px">首 token 等待(秒)<input type="number" id="toFirstToken" min="0" step="10" placeholder="自动"></label>
|
|
1774
1006
|
<label style="font-size:12px">流式空闲(秒)<input type="number" id="toStreamIdle" min="0" step="10" placeholder="自动"></label>
|
|
1775
1007
|
<label style="font-size:12px">总量(秒)<input type="number" id="toTotal" min="0" step="10" placeholder="自动"></label>
|
|
1776
|
-
<div class="cfg-cols" data-cols="timeout" style="flex-basis:100%">
|
|
1777
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colDefault">默认</span><span class="cfg-default">自适应(留空)</span></div>
|
|
1778
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1779
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1780
|
-
</div>
|
|
1781
1008
|
</div>
|
|
1782
1009
|
<div class="cfg-hint" data-kw="超时 timeout 自适应 本地模型 首 token">留空 = 自适应:本地模型自动给更长首 token 等待(慢 prefill 不被误杀)。仅在默认值仍不够/过松时手填。</div>
|
|
1783
|
-
<div class="cfg-row" data-
|
|
1784
|
-
|
|
1785
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colDefault">默认</span><span class="cfg-default">关</span></div>
|
|
1786
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1787
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1788
|
-
</div>
|
|
1789
|
-
</div>
|
|
1790
|
-
<div class="cfg-row" data-setting="notify" data-kw="通知 notify 桌面 完成 失败"><label><input type="checkbox" id="notifyChk"> 后台任务完成/失败时桌面通知</label>
|
|
1791
|
-
<div class="cfg-cols" data-cols="notify">
|
|
1792
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colDefault">默认</span><span class="cfg-default">开</span></div>
|
|
1793
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1794
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1795
|
-
</div>
|
|
1796
|
-
</div>
|
|
1010
|
+
<div class="cfg-row" data-kw="开机自启 autostart 启动"><label><input type="checkbox" id="autoStartChk"> 开机自启(登录后自动启动服务器)</label></div>
|
|
1011
|
+
<div class="cfg-row" data-kw="通知 notify 桌面 完成 失败"><label><input type="checkbox" id="notifyChk"> 后台任务完成/失败时桌面通知</label></div>
|
|
1797
1012
|
</section>
|
|
1798
1013
|
<section class="cfg-panel" data-panel="appearance">
|
|
1799
1014
|
<h4 style="margin:4px 0;color:var(--accent2)">外观</h4>
|
|
1800
|
-
<div class="cfg-row" data-
|
|
1015
|
+
<div class="cfg-row" data-kw="主题 theme 明暗 dark light 系统 prefers-color-scheme 外观"><label>明暗主题</label>
|
|
1801
1016
|
<select id="themeSel">
|
|
1802
1017
|
<option value="system">跟随系统(prefers-color-scheme)</option>
|
|
1803
1018
|
<option value="dark">暗色</option>
|
|
1804
1019
|
<option value="light">亮色</option>
|
|
1805
1020
|
</select>
|
|
1806
1021
|
<div class="cfg-hint">偏好写入浏览器 localStorage(mingdao-theme);选「跟随系统」时随系统明暗实时切换。</div>
|
|
1807
|
-
<div class="cfg-cols" data-cols="theme">
|
|
1808
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colDefault">默认</span><span class="cfg-default">system</span></div>
|
|
1809
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1810
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1811
|
-
</div>
|
|
1812
|
-
</div>
|
|
1813
|
-
<!-- P2-4(v0.6.19 §3.76):界面语言。默认跟随 navigator.language,localStorage 覆盖。 -->
|
|
1814
|
-
<div class="cfg-row" data-setting="language" data-kw="语言 language i18n 中文 english 界面"><label data-i18n="settings.language">界面语言</label>
|
|
1815
|
-
<select id="langSel">
|
|
1816
|
-
<option value="auto" data-i18n="settings.langAuto">跟随系统</option>
|
|
1817
|
-
<option value="zh" data-i18n="settings.langZh">中文</option>
|
|
1818
|
-
<option value="en" data-i18n="settings.langEn">English</option>
|
|
1819
|
-
</select>
|
|
1820
|
-
<div class="cfg-hint" data-i18n="settings.languageHint">默认跟随系统语言(navigator.language);选择后写入 localStorage(mingdao-lang)。只影响界面文案,不改日志与错误原文。</div>
|
|
1821
|
-
<div class="cfg-cols" data-cols="language">
|
|
1822
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colDefault">默认</span><span class="cfg-default">auto</span></div>
|
|
1823
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colCurrent">当前</span><span class="cfg-current">—</span></div>
|
|
1824
|
-
<div class="cfg-col"><span class="cfg-col-k" data-i18n="settings.colImpact">影响</span><span class="cfg-impact">—</span></div>
|
|
1825
|
-
</div>
|
|
1826
1022
|
</div>
|
|
1827
1023
|
<div class="cfg-row" data-kw="快捷键 keyboard shortcut ⌘K 命令面板"><label>快捷键</label>
|
|
1828
1024
|
<div class="cfg-hint">⌘K / Ctrl+K 命令面板 · ⌘/ / Ctrl+/ 快捷键表 · Esc 分层关闭 / 停止本轮。答"实际实现了哪些"以快捷键表为准。</div>
|
|
@@ -1864,7 +1060,7 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1864
1060
|
<hr style="border:none;border-top:1px solid var(--border);margin:14px 0 8px">
|
|
1865
1061
|
<h4 style="margin:4px 0;color:var(--accent2)">长期记忆(注入每次会话的偏好/约定)</h4>
|
|
1866
1062
|
<textarea id="memArea" rows="5" placeholder="例如:所有文档用中文;提交信息用约定式提交…" style="width:100%;background:var(--bg3);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 10px;font-size:12.5px;resize:vertical"></textarea>
|
|
1867
|
-
<div class="row" style="justify-content:flex-start"><button id="memSave">保存记忆</button><button id="memDedupe">去重合并</button><
|
|
1063
|
+
<div class="row" style="justify-content:flex-start"><button id="memSave">保存记忆</button><button id="memDedupe">去重合并</button><span id="memMsg" style="font-size:12px;color:var(--faint)"></span></div>
|
|
1868
1064
|
</section>
|
|
1869
1065
|
|
|
1870
1066
|
<section class="cfg-panel" data-panel="mcp">
|
|
@@ -1885,7 +1081,7 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1885
1081
|
</section>
|
|
1886
1082
|
</div>
|
|
1887
1083
|
</div>
|
|
1888
|
-
<div class="row" style="margin-top:12px"><button id="
|
|
1084
|
+
<div class="row" style="margin-top:12px"><button id="cfgCancel">取消</button><button class="primary" id="cfgSave">保存</button></div>
|
|
1889
1085
|
</div>
|
|
1890
1086
|
</div>
|
|
1891
1087
|
<!-- 回到底部悬浮按钮(参照 DeepSeek-Harness:上滚时出现,点击回到最新消息) -->
|
|
@@ -1904,8 +1100,6 @@ body:not(.run-open) #runChip{display:inline-flex}
|
|
|
1904
1100
|
</div>
|
|
1905
1101
|
</div>
|
|
1906
1102
|
</div>
|
|
1907
|
-
<!-- P2-3 读屏播报:内容只在状态变化时由 updateLiveRegion() 写入(同一状态重复渲染不更新)。 -->
|
|
1908
|
-
<div id="a11yLive" class="sr-only" role="status" aria-live="polite" aria-atomic="true"></div>
|
|
1909
1103
|
<script type="module" src="/app.js"></script>
|
|
1910
1104
|
</body>
|
|
1911
1105
|
</html>
|