mingdao-harness 0.6.24 → 0.6.25
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/package.json +1 -1
- package/src/web/app.js +96 -26
- package/src/web/index.html +69 -29
package/package.json
CHANGED
package/src/web/app.js
CHANGED
|
@@ -314,6 +314,41 @@ function writeSideNavCollapsed(storage, collapsed) {
|
|
|
314
314
|
try { if (storage) storage.setItem(SIDE_NAV_STORAGE_KEY, collapsed ? '1' : '0'); } catch {}
|
|
315
315
|
return !!collapsed;
|
|
316
316
|
}
|
|
317
|
+
|
|
318
|
+
// —— §3.90:「最近会话」整块可折叠(标题与计数常驻,只藏列表),偏好记 localStorage ——
|
|
319
|
+
const RECENT_STORAGE_KEY = 'mingdao-recent-collapsed';
|
|
320
|
+
let recentCollapsed = false;
|
|
321
|
+
/** @param {any} storage */
|
|
322
|
+
function recentCollapsedPref(storage) {
|
|
323
|
+
try { return !!storage && storage.getItem(RECENT_STORAGE_KEY) === '1'; } catch { return false; }
|
|
324
|
+
}
|
|
325
|
+
/** @param {any} storage @param {boolean} collapsed */
|
|
326
|
+
function writeRecentCollapsed(storage, collapsed) {
|
|
327
|
+
try { if (storage) storage.setItem(RECENT_STORAGE_KEY, collapsed ? '1' : '0'); } catch {}
|
|
328
|
+
return !!collapsed;
|
|
329
|
+
}
|
|
330
|
+
/** @param {number} n 当前会话条数(只显示数字,标题「最近会话」始终可见) */
|
|
331
|
+
function updateRecentCount(n) {
|
|
332
|
+
const el = $('#sideNavRecentCount');
|
|
333
|
+
if (el) el.textContent = String(Math.max(0, Number(n) || 0));
|
|
334
|
+
}
|
|
335
|
+
/** @param {boolean} collapsed 折叠只切 #sideNavSessions.hidden,不销毁列表节点 */
|
|
336
|
+
function syncRecentCollapsed(collapsed) {
|
|
337
|
+
const box = $('#sideNavSessions');
|
|
338
|
+
if (box) box.hidden = !!collapsed;
|
|
339
|
+
const btn = $('#sideNavRecentToggle');
|
|
340
|
+
if (btn) {
|
|
341
|
+
btn.setAttribute('aria-expanded', String(!collapsed));
|
|
342
|
+
btn.title = collapsed ? '展开最近会话' : '折叠最近会话';
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
function toggleRecentSessions() {
|
|
346
|
+
recentCollapsed = !recentCollapsed;
|
|
347
|
+
let storage = null;
|
|
348
|
+
try { storage = window.localStorage; } catch {}
|
|
349
|
+
writeRecentCollapsed(storage, recentCollapsed);
|
|
350
|
+
syncRecentCollapsed(recentCollapsed);
|
|
351
|
+
}
|
|
317
352
|
/** 三档断点:≥1180 三栏 / 900–1180 左栏自动折叠 / <900 抽屉。 */
|
|
318
353
|
function sideNavBreakpoint(width) {
|
|
319
354
|
const w = Number(width) || 0;
|
|
@@ -456,10 +491,13 @@ function initSideNav() {
|
|
|
456
491
|
let storage = null;
|
|
457
492
|
try { storage = window.localStorage; } catch {}
|
|
458
493
|
sideNavUserCollapsed = sideNavCollapsedPref(storage);
|
|
494
|
+
recentCollapsed = recentCollapsedPref(storage);
|
|
459
495
|
const newBtn = $('#sideNavNew');
|
|
460
496
|
if (newBtn) newBtn.onclick = () => { const b = $('#newChat'); if (b) b.click(); };
|
|
461
497
|
const collapse = $('#sideNavCollapse');
|
|
462
498
|
if (collapse) collapse.onclick = toggleSideNav;
|
|
499
|
+
const recentToggle = $('#sideNavRecentToggle');
|
|
500
|
+
if (recentToggle) recentToggle.onclick = toggleRecentSessions;
|
|
463
501
|
const rail = $('#sideNavRailBtn');
|
|
464
502
|
if (rail) rail.onclick = toggleSideNav;
|
|
465
503
|
const ws = $('#sideNavWs');
|
|
@@ -478,7 +516,9 @@ function initSideNav() {
|
|
|
478
516
|
try { main.click(); } catch {}
|
|
479
517
|
};
|
|
480
518
|
syncSideNavWorkspace();
|
|
481
|
-
renderSideNavSessions($('#sideNavSessions'), sessionsGroupedCache, currentSession, pickSessionFromSideNav);
|
|
519
|
+
const recentN = renderSideNavSessions($('#sideNavSessions'), sessionsGroupedCache, currentSession, pickSessionFromSideNav);
|
|
520
|
+
updateRecentCount(recentN);
|
|
521
|
+
syncRecentCollapsed(recentCollapsed);
|
|
482
522
|
applySideNavLayout();
|
|
483
523
|
}
|
|
484
524
|
// ==== /v0.6.24 §3.88 ====
|
|
@@ -1545,6 +1585,51 @@ for (const key of RAIL_TABS) {
|
|
|
1545
1585
|
}
|
|
1546
1586
|
setRailTab('trace');
|
|
1547
1587
|
|
|
1588
|
+
// ==== v0.6.25 §3.90:右栏「概览」(会话配置 + 本轮数据)可折叠 ====
|
|
1589
|
+
// 默认折叠,折叠时只显示一行摘要(模型 · 权限 · 阶段 · 工具数);偏好记 localStorage。
|
|
1590
|
+
// 展开后的字段与数据来源不变:仍由 renderRunPanel() 写 #rpModel/#rpPerm/六个 data-rk。
|
|
1591
|
+
const RP_OVERVIEW_STORAGE_KEY = 'mingdao-rp-overview-expanded';
|
|
1592
|
+
let rpOverviewExpanded = false;
|
|
1593
|
+
/** @param {any} storage */
|
|
1594
|
+
function rpOverviewPref(storage) {
|
|
1595
|
+
try { return !!storage && storage.getItem(RP_OVERVIEW_STORAGE_KEY) === '1'; } catch { return false; }
|
|
1596
|
+
}
|
|
1597
|
+
/** @param {any} storage @param {boolean} expanded */
|
|
1598
|
+
function writeRpOverview(storage, expanded) {
|
|
1599
|
+
try { if (storage) storage.setItem(RP_OVERVIEW_STORAGE_KEY, expanded ? '1' : '0'); } catch {}
|
|
1600
|
+
return !!expanded;
|
|
1601
|
+
}
|
|
1602
|
+
/** 折叠时的一行摘要:完全复用 runPanelView() 的字段,不另算数据。 */
|
|
1603
|
+
function rpOverviewSummary(v) {
|
|
1604
|
+
const x = v || {};
|
|
1605
|
+
return [x.model || x.modelLabel, x.permission, x.phase, x.tools].filter((s) => s != null && s !== '').join(' · ') || '—';
|
|
1606
|
+
}
|
|
1607
|
+
/** @param {boolean} expanded 只切 hidden/aria,不销毁字段节点(id 与数据来源不变) */
|
|
1608
|
+
function syncRpOverview(expanded) {
|
|
1609
|
+
rpOverviewExpanded = !!expanded;
|
|
1610
|
+
const body = $('#rpOverviewBody');
|
|
1611
|
+
if (body) body.hidden = !rpOverviewExpanded;
|
|
1612
|
+
const head = $('#rpOverviewHead');
|
|
1613
|
+
if (head) {
|
|
1614
|
+
head.setAttribute('aria-expanded', String(rpOverviewExpanded));
|
|
1615
|
+
head.title = rpOverviewExpanded ? '折叠概览' : '展开概览(会话配置 + 本轮数据)';
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
function toggleRpOverview() {
|
|
1619
|
+
let storage = null;
|
|
1620
|
+
try { storage = window.localStorage; } catch {}
|
|
1621
|
+
writeRpOverview(storage, !rpOverviewExpanded);
|
|
1622
|
+
syncRpOverview(!rpOverviewExpanded);
|
|
1623
|
+
}
|
|
1624
|
+
function initRpOverview() {
|
|
1625
|
+
let storage = null;
|
|
1626
|
+
try { storage = window.localStorage; } catch {}
|
|
1627
|
+
const head = $('#rpOverviewHead');
|
|
1628
|
+
if (head) head.onclick = toggleRpOverview;
|
|
1629
|
+
syncRpOverview(rpOverviewPref(storage));
|
|
1630
|
+
}
|
|
1631
|
+
initRpOverview();
|
|
1632
|
+
|
|
1548
1633
|
// —— 工具时间线 DOM:一张卡 + 可复用行(开始/完成不换节点) ——
|
|
1549
1634
|
function toolStepNode(step) {
|
|
1550
1635
|
const li = document.createElement('li'); li.className = step.liClass;
|
|
@@ -1696,6 +1781,8 @@ function renderRunPanel() {
|
|
|
1696
1781
|
set('#rpPreset', v.preset);
|
|
1697
1782
|
set('#rpPerm', v.permission);
|
|
1698
1783
|
set('#rpPermSrc', '来源:' + v.permissionSource + '(' + v.permissionSourceLabel + ')');
|
|
1784
|
+
// §3.90:折叠概览的一行摘要与展开后的字段同源(同一个 v,不同展示)。
|
|
1785
|
+
set('#rpOverviewSum', rpOverviewSummary(v));
|
|
1699
1786
|
const total = Number(runState.contextTotal) || 0;
|
|
1700
1787
|
const used = Math.max(0, Number(runState.contextUsed) || 0);
|
|
1701
1788
|
const pct = total ? Math.min(100, Math.round((used / total) * 100)) : 0;
|
|
@@ -2374,8 +2461,7 @@ function openTraj(msg){
|
|
|
2374
2461
|
// 点击标题定位到聊天中的对应工具卡
|
|
2375
2462
|
list.appendChild(div);
|
|
2376
2463
|
}
|
|
2377
|
-
// §3.82
|
|
2378
|
-
$('#trajRailBtn').classList.add('on');
|
|
2464
|
+
// §3.82:轨迹详情在右栏「轨迹」标签;§3.90 起窄条不再有 🧭 入口,旧面板渲染保留但不再挂可见入口。
|
|
2379
2465
|
activateRailTab('trace');
|
|
2380
2466
|
}
|
|
2381
2467
|
// 面板布局同步:§3.82 起轨迹/子代理/任务/仪表盘都在右栏标签页内,
|
|
@@ -2390,19 +2476,8 @@ function syncPanelLayout(){
|
|
|
2390
2476
|
// §3.73:窄屏右栏收起时,轨迹/子Agent 在对话流末尾显示;右栏(抽屉)一开就让位。
|
|
2391
2477
|
syncTraceDock();
|
|
2392
2478
|
}
|
|
2393
|
-
$('#tjClose').onclick=()=>{ setRunPanel(false);
|
|
2394
|
-
|
|
2395
|
-
// §3.82:轨迹入口 = 打开右栏并切到「轨迹」标签(没有轨迹时也切过去,显示空态)。
|
|
2396
|
-
const m=lastMsgWithTraj();
|
|
2397
|
-
if(m && m._traj && m._traj.length){ openTraj(m); return; }
|
|
2398
|
-
$('#trajRailBtn').classList.add('on');
|
|
2399
|
-
activateRailTab('trace');
|
|
2400
|
-
};
|
|
2401
|
-
function lastMsgWithTraj(){
|
|
2402
|
-
const msgs=[...document.querySelectorAll('#chat .msg-ai')].reverse();
|
|
2403
|
-
for(const m of msgs){ if(m._traj && m._traj.length) return m; }
|
|
2404
|
-
return msgs.length ? msgs[0] : null;
|
|
2405
|
-
}
|
|
2479
|
+
$('#tjClose').onclick=()=>{ setRunPanel(false); };
|
|
2480
|
+
// §3.90:窄条 🧭 入口已删除(与右栏「轨迹」标签重复);轨迹只在右栏标签可达。
|
|
2406
2481
|
function renderSubPanel(){
|
|
2407
2482
|
const count=sessionSubs.length;
|
|
2408
2483
|
const badge=$('#subBadge'); if(badge){ badge.style.display=count>0?'':'none'; badge.textContent=count>99?'99+':String(count); }
|
|
@@ -2422,14 +2497,8 @@ function renderSubPanel(){
|
|
|
2422
2497
|
}
|
|
2423
2498
|
if(!count) list.innerHTML='<div class="empty" style="color:var(--faint);font-size:12px;padding:10px">本会话还没有子 Agent(task 工具会派生子 Agent)</div>';
|
|
2424
2499
|
}
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
renderSubPanel();
|
|
2428
|
-
activateRailTab('sub');
|
|
2429
|
-
$('#subRailBtn').classList.add('on');
|
|
2430
|
-
};
|
|
2431
|
-
$('#subRailBtn').onclick=toggleSubPanel;
|
|
2432
|
-
$('#sbClose').onclick=()=>{ setRunPanel(false); $('#subRailBtn').classList.remove('on'); };
|
|
2500
|
+
// §3.90:窄条 🤖 入口已删除(与右栏「子Agent」标签重复);子Agent 只在右栏标签可达。
|
|
2501
|
+
$('#sbClose').onclick=()=>{ setRunPanel(false); };
|
|
2433
2502
|
// —— 任务面板(多会话并行) ——
|
|
2434
2503
|
function setBtn(){
|
|
2435
2504
|
// §138:停止点击后立刻有可见反馈(「停止中…」+ 禁用防连点),回合真正收尾后由 finally 复位。
|
|
@@ -2541,8 +2610,9 @@ async function refreshSessions(q){
|
|
|
2541
2610
|
for(const s of g.items){ const o=document.createElement('option'); o.value=s.file; o.textContent=s.label; og.appendChild(o); }
|
|
2542
2611
|
sel.appendChild(og);
|
|
2543
2612
|
}
|
|
2544
|
-
// §3.88
|
|
2545
|
-
renderSideNavSessions($('#sideNavSessions'), sessionsGroupedCache, currentSession, pickSessionFromSideNav);
|
|
2613
|
+
// §3.88:左栏只读同一份分组缓存(不额外请求/不轮询);§3.90 同步折叠标题上的会话数
|
|
2614
|
+
const recentN = renderSideNavSessions($('#sideNavSessions'), sessionsGroupedCache, currentSession, pickSessionFromSideNav);
|
|
2615
|
+
updateRecentCount(recentN);
|
|
2546
2616
|
if(currentSession&&!q) sel.value=currentSession;
|
|
2547
2617
|
renderCrumb();
|
|
2548
2618
|
}
|
package/src/web/index.html
CHANGED
|
@@ -596,6 +596,18 @@ body.run-open #sessSheet{right:318px}
|
|
|
596
596
|
四个面板本体搬进标签页后不再 fixed(覆盖既有 #tasksPanel/#dashPanel 的定位,宽度跟随右栏)。 */
|
|
597
597
|
.rp-top{flex:none;padding:10px 12px 0}
|
|
598
598
|
.rp-top .rp-sec{margin-bottom:8px}
|
|
599
|
+
/* §3.90:概览(会话配置 + 本轮数据)收进标签栏下方的可折叠区块;默认折叠只留一行摘要。
|
|
600
|
+
展开后内容仍是原来的字段与 id(renderRunPanel 的写入点一个没改)。 */
|
|
601
|
+
.rp-overview{flex:none;margin:0 12px 8px;border:1px solid var(--border);border-radius:9px;background:var(--bg3);overflow:hidden}
|
|
602
|
+
#runPanel [role="tablist"]{margin-top:8px}
|
|
603
|
+
#rpOverviewHead{display:flex;align-items:center;gap:5px;width:100%;min-width:0;border:0;background:transparent;color:var(--dim);font:inherit;font-size:11.5px;text-align:left;padding:6px 7px;cursor:pointer}
|
|
604
|
+
#rpOverviewHead:hover{color:var(--text)}
|
|
605
|
+
.rp-ov-title{flex:none;font-weight:600;color:var(--text);white-space:nowrap}
|
|
606
|
+
.rp-ov-sum{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;color:var(--dim)}
|
|
607
|
+
.rp-ov-tri{flex:none;width:0;height:0;border-top:4px solid currentColor;border-left:3px solid transparent;border-right:3px solid transparent;transition:transform .15s}
|
|
608
|
+
#rpOverviewHead[aria-expanded="false"] .rp-ov-tri{transform:rotate(-90deg)}
|
|
609
|
+
#rpOverviewBody{padding:8px;border-top:1px solid var(--border);max-height:46vh;overflow-y:auto;overscroll-behavior:contain}
|
|
610
|
+
#rpOverviewBody[hidden]{display:none}
|
|
599
611
|
/* §3.83:四个标签统一成设计稿 `.seg` 分段控件观感(外框 bg3 + padding 3 / 圆角 9,
|
|
600
612
|
内按钮 26px 高 / 圆角 6;选中态 panel 底 + text 字 + 600 字重)。只改样式,切换逻辑不动。 */
|
|
601
613
|
.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}
|
|
@@ -659,6 +671,17 @@ body.run-open #sessSheet{right:318px}
|
|
|
659
671
|
#sideNavWs{flex:1;min-width:0;max-width:none;background:var(--bg3);border:1px solid var(--border);border-radius:8px;padding:5px 6px;font-size:12px}
|
|
660
672
|
#sideNavWsIcon{display:none;align-items:center;justify-content:center;width:36px;height:30px;padding:0;border-radius:8px;background:var(--bg3);font-size:14px;line-height:1}
|
|
661
673
|
#sideNav .sn-sec-title{flex:none;font-size:10.5px;color:var(--dim);letter-spacing:.05em;padding:2px 6px;white-space:nowrap}
|
|
674
|
+
/* §3.90:「最近会话」标题变成折叠开关;折叠后标题与计数仍在,只藏列表项。 */
|
|
675
|
+
#sideNav button.sn-sec-title{display:flex;align-items:center;gap:6px;width:100%;min-width:0;border:0;border-radius:6px;background:transparent;font-family:inherit;font-weight:600;cursor:pointer;text-align:left}
|
|
676
|
+
#sideNav button.sn-sec-title:hover{color:var(--text);background:var(--bg3)}
|
|
677
|
+
.sn-sec-chev{flex:none;width:10px;font-size:9px;line-height:1;color:var(--faint);transition:transform .15s}
|
|
678
|
+
#sideNavRecentToggle[aria-expanded="false"] .sn-sec-chev{transform:rotate(-90deg)}
|
|
679
|
+
.sn-sec-label{flex:none;white-space:nowrap}
|
|
680
|
+
.sn-sec-count{margin-left:auto;flex:none;min-width:16px;text-align:right;font-size:10px;font-weight:400;color:var(--faint);font-variant-numeric:tabular-nums}
|
|
681
|
+
/* 侧栏收成 48px 图标列时,标题/计数不参与(与既有 .sn-sec-title 的隐藏口径一致)。 */
|
|
682
|
+
body.side-collapsed #sideNav #sideNavRecentToggle,
|
|
683
|
+
body.side-mid #sideNav #sideNavRecentToggle{display:none}
|
|
684
|
+
#sideNavSessions[hidden]{display:none}
|
|
662
685
|
#sideNavSessions{display:flex;flex-direction:column;gap:1px;min-width:0}
|
|
663
686
|
#sideNavSessions .sn-group{font-size:10.5px;line-height:1.6;color:var(--dim);padding:7px 6px 2px;letter-spacing:.02em;white-space:nowrap}
|
|
664
687
|
#sideNavSessions .sn-item{display:flex;align-items:center;gap:8px;width:100%;min-width:0;padding:6px 8px;border:0;border-radius:8px;background:transparent;color:var(--dim);text-align:left;font-size:12.5px;line-height:1.5;cursor:pointer}
|
|
@@ -722,15 +745,19 @@ body.side-collapsed #sideNavSessions .sn-item.on,body.side-mid #sideNavSessions
|
|
|
722
745
|
<input id="sessionSearch" placeholder="搜索会话…" title="关键词检索历史会话">
|
|
723
746
|
<select id="sessions" title="历史会话"><option value="">历史会话</option></select>
|
|
724
747
|
<button id="tasksBtn" title="任务面板">任务</button><button id="sessMgrBtn" title="管理会话(重命名/删除)">✎</button>
|
|
725
|
-
|
|
748
|
+
<!-- v0.6.25 §3.90:顶栏「新对话」与左侧栏 #sideNavNew 重复,可视入口只留左侧。
|
|
749
|
+
保留 hidden 兼容节点:id/处理器语义不变(左侧按钮与 ⌘K 仍点它),只是不可见。 -->
|
|
750
|
+
<span id="newChatCompat" hidden><button id="newChat">新对话</button></span>
|
|
726
751
|
</div>
|
|
727
752
|
</header>
|
|
728
753
|
<div id="trajRail">
|
|
729
|
-
<button class="rail-btn" id="trajRailBtn" title="轨迹(点击查看详情)">🧭</button>
|
|
730
|
-
<button class="rail-btn" id="subRailBtn" title="子 Agent">🤖<span class="rail-badge" id="subBadge" style="display:none"></span></button>
|
|
731
754
|
<!-- §3.88:<900 时左栏收成抽屉,这个窄条图标负责打开/关闭(≥900 隐藏)。 -->
|
|
732
755
|
<button class="rail-btn" id="sideNavRailBtn" title="会话侧栏(打开/关闭)">☰</button>
|
|
733
756
|
</div>
|
|
757
|
+
<!-- v0.6.25 §3.90:旧窄条 🧭/🤖 与右栏四标签重复,已从可见窄条移除;轨迹/子Agent 只在
|
|
758
|
+
右栏「轨迹」「子Agent」标签可达。下面两个隐藏兼容节点不渲染、不绑定点击,仅让既有
|
|
759
|
+
class 清理与历史回归脚本保持空引用安全(#newChatCompat 同理)。 -->
|
|
760
|
+
<span id="legacyRailCompat" hidden aria-hidden="true"><span id="trajRailBtn"></span><span id="subRailBtn"></span></span>
|
|
734
761
|
<!-- v0.6.24 §3.88 左侧栏:设计稿三栏的会话列。只新增;顶栏既有入口一个不删。
|
|
735
762
|
数据复用 refreshSessions() 的 sessionsGroupedCache;切换走 #sessions change;
|
|
736
763
|
工作空间镜像 #wsSel(原控件保留在顶栏原位);新建对话复用 #newChat handler。 -->
|
|
@@ -746,7 +773,9 @@ body.side-collapsed #sideNavSessions .sn-item.on,body.side-mid #sideNavSessions
|
|
|
746
773
|
<select id="sideNavWs" title="工作空间(与顶栏 #wsSel 同源,切换走同一个 handler)"></select>
|
|
747
774
|
</div>
|
|
748
775
|
<button id="sideNavWsIcon" type="button" title="工作空间" aria-label="工作空间">📁</button>
|
|
749
|
-
<
|
|
776
|
+
<button id="sideNavRecentToggle" type="button" class="sn-sec-title" aria-expanded="true" aria-controls="sideNavSessions" title="折叠最近会话">
|
|
777
|
+
<span class="sn-sec-chev" aria-hidden="true">▾</span><span class="sn-sec-label">最近会话</span><span class="sn-sec-count" id="sideNavRecentCount" title="当前会话数">0</span>
|
|
778
|
+
</button>
|
|
750
779
|
<div id="sideNavSessions" role="list" aria-label="会话列表"></div>
|
|
751
780
|
</div>
|
|
752
781
|
</aside>
|
|
@@ -821,37 +850,48 @@ body.side-collapsed #sideNavSessions .sn-item.on,body.side-mid #sideNavSessions
|
|
|
821
850
|
≥1180 默认展开并推开正文;<1180 收起为顶栏「运行」chip,点开是覆盖式抽屉。无新增轮询。 -->
|
|
822
851
|
<aside id="runPanel" aria-label="本轮运行" hidden>
|
|
823
852
|
<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>
|
|
824
|
-
<!-- §3.82
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
<dt>模型</dt><dd><span id="rpModel">—</span><span class="rp-src" id="rpModelSrc">设置</span></dd>
|
|
830
|
-
<dt>API id</dt><dd><span class="rp-id" id="rpModelId">—</span></dd>
|
|
831
|
-
<dt>预设</dt><dd><span id="rpPreset">无预设</span><span class="rp-src">本轮</span></dd>
|
|
832
|
-
<dt>权限</dt><dd><span id="rpPerm">—</span><span class="rp-src" id="rpPermSrc">—</span></dd>
|
|
833
|
-
</dl>
|
|
834
|
-
</section>
|
|
835
|
-
<section class="rp-sec">
|
|
836
|
-
<div class="rp-sec-title">本轮数据<span class="line"></span></div>
|
|
837
|
-
<div class="rp-metrics">
|
|
838
|
-
<div class="rp-metric"><span class="l">阶段</span><span class="v" data-rk="phase" id="rpPhase">空闲</span></div>
|
|
839
|
-
<div class="rp-metric"><span class="l">首帧 TTFT</span><span class="v" data-rk="ttft" id="rpTtft">—</span></div>
|
|
840
|
-
<div class="rp-metric"><span class="l">吞吐</span><span class="v" data-rk="tps"><span id="rpTps">—</span><small>tok/s</small></span></div>
|
|
841
|
-
<div class="rp-metric"><span class="l">工具步数</span><span class="v" data-rk="tools" id="rpTools">0</span></div>
|
|
842
|
-
<div class="rp-metric"><span class="l">本轮用时</span><span class="v" id="rpTime">—</span></div>
|
|
843
|
-
<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>
|
|
844
|
-
<div class="rp-metric wide"><span class="l">本轮费用(估算)</span><span class="v" data-rk="cost" id="rpCost">—</span></div>
|
|
845
|
-
</div>
|
|
846
|
-
</section>
|
|
847
|
-
</div>
|
|
848
|
-
<!-- §3.82 第二步:四个标签。只切 display(railTabDisplay),节点不销毁、id 不变。 -->
|
|
853
|
+
<!-- §3.82:空结构占位(hidden)。真实的「会话配置 + 本轮数据」按 §3.90 收进下方可折叠
|
|
854
|
+
「概览」区块;这里保留旧锚点,避免历史回归脚本对 rp-top 位置的断言失效。 -->
|
|
855
|
+
<div class="rp-top" hidden aria-hidden="true"></div>
|
|
856
|
+
<!-- §3.82 第二步:四个标签。只切 display(railTabDisplay),节点不销毁、id 不变。
|
|
857
|
+
§3.90:标签栏上移到「本轮运行」标题行之下,内容区因此拿到更大高度。 -->
|
|
849
858
|
<div class="rp-tabs" role="tablist" aria-label="右栏标签">
|
|
850
859
|
<button id="rtTrace" type="button" role="tab" data-tab="trace" aria-selected="true" aria-controls="tabTrace" class="seg on">轨迹</button>
|
|
851
860
|
<button id="rtSub" type="button" role="tab" data-tab="sub" aria-selected="false" aria-controls="tabSub" class="seg">子Agent</button>
|
|
852
861
|
<button id="rtTasks" type="button" role="tab" data-tab="tasks" aria-selected="false" aria-controls="tabTasks" class="seg">任务</button>
|
|
853
862
|
<button id="rtDash" type="button" role="tab" data-tab="dash" aria-selected="false" aria-controls="tabDash" class="seg">仪表盘</button>
|
|
854
863
|
</div>
|
|
864
|
+
<!-- §3.90:概览默认折叠,折叠时只显示一行摘要;展开后字段与数据来源与旧 rp-top 完全一致。 -->
|
|
865
|
+
<section id="rpOverview" class="rp-overview" aria-label="概览">
|
|
866
|
+
<button id="rpOverviewHead" type="button" aria-expanded="false" aria-controls="rpOverviewBody" title="展开概览(会话配置 + 本轮数据)">
|
|
867
|
+
<span class="rp-ov-title">概览</span>
|
|
868
|
+
<span id="rpOverviewSum" class="rp-ov-sum">—</span>
|
|
869
|
+
<span class="rp-ov-tri" aria-hidden="true"></span>
|
|
870
|
+
</button>
|
|
871
|
+
<div id="rpOverviewBody" hidden>
|
|
872
|
+
<section class="rp-sec">
|
|
873
|
+
<div class="rp-sec-title">会话配置<span class="line"></span></div>
|
|
874
|
+
<dl class="rp-kv">
|
|
875
|
+
<dt>模型</dt><dd><span id="rpModel">—</span><span class="rp-src" id="rpModelSrc">设置</span></dd>
|
|
876
|
+
<dt>API id</dt><dd><span class="rp-id" id="rpModelId">—</span></dd>
|
|
877
|
+
<dt>预设</dt><dd><span id="rpPreset">无预设</span><span class="rp-src">本轮</span></dd>
|
|
878
|
+
<dt>权限</dt><dd><span id="rpPerm">—</span><span class="rp-src" id="rpPermSrc">—</span></dd>
|
|
879
|
+
</dl>
|
|
880
|
+
</section>
|
|
881
|
+
<section class="rp-sec">
|
|
882
|
+
<div class="rp-sec-title">本轮数据<span class="line"></span></div>
|
|
883
|
+
<div class="rp-metrics">
|
|
884
|
+
<div class="rp-metric"><span class="l">阶段</span><span class="v" data-rk="phase" id="rpPhase">空闲</span></div>
|
|
885
|
+
<div class="rp-metric"><span class="l">首帧 TTFT</span><span class="v" data-rk="ttft" id="rpTtft">—</span></div>
|
|
886
|
+
<div class="rp-metric"><span class="l">吞吐</span><span class="v" data-rk="tps"><span id="rpTps">—</span><small>tok/s</small></span></div>
|
|
887
|
+
<div class="rp-metric"><span class="l">工具步数</span><span class="v" data-rk="tools" id="rpTools">0</span></div>
|
|
888
|
+
<div class="rp-metric"><span class="l">本轮用时</span><span class="v" id="rpTime">—</span></div>
|
|
889
|
+
<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>
|
|
890
|
+
<div class="rp-metric wide"><span class="l">本轮费用(估算)</span><span class="v" data-rk="cost" id="rpCost">—</span></div>
|
|
891
|
+
</div>
|
|
892
|
+
</section>
|
|
893
|
+
</div>
|
|
894
|
+
</section>
|
|
855
895
|
<div class="rp-tabbody">
|
|
856
896
|
<section id="tabTrace" class="rp-tab" role="tabpanel" aria-labelledby="rtTrace" data-tab="trace">
|
|
857
897
|
<!-- §3.73:轨迹折叠区(renderTracePanels 写入 #rpTraceList,不在这里重写)。 -->
|