diff --git a/web/hwlab-cloud-web/scripts/check.ts b/web/hwlab-cloud-web/scripts/check.ts index 40334ebd..1d84b25c 100644 --- a/web/hwlab-cloud-web/scripts/check.ts +++ b/web/hwlab-cloud-web/scripts/check.ts @@ -97,7 +97,10 @@ assertIncludes(appSource, "for (;;) ", "trace subscription must keep unbounded p assertIncludes(appSource, "/v1/agent/chat/trace/", "trace replay must use Cloud Web same-origin trace API"); assertIncludes(appSource, "/v1/workbench/workspace", "workspace bootstrap must use Cloud Web same-origin workbench API"); assert.doesNotMatch(appSource, /\/auth\/workspace-bootstrap/u, "stale auth workspace bootstrap route must not remain in Cloud Web app source"); -assertIncludes(appSource, "trace-meta-details", "Trace identity and raw-event controls must stay behind a compact details disclosure"); +assert.doesNotMatch(appSource, /trace-meta-details/u, "Trace details must not render a second message-detail exclamation button"); +assertIncludes(appSource, "trace-meta-panel", "Trace identity and raw-event controls must remain in the expanded trace body"); +assertIncludes(appSource, "scrollbar-width: none;", "Platform sidebar must scroll without a visible scrollbar"); +assertIncludes(appSource, "border-collapse: collapse;", "Markdown tables must use GitHub-like bordered table styling"); assertIncludes(appSource, "grid-template-columns: minmax(0, 1fr);", "Trace rows must give the readable body the full content width"); assertIncludes(appSource, "const primaryAction = computed", "Workbench composer must derive a single primary send/cancel/steer action"); assertIncludes(appSource, "primaryAction.value === \"cancel\"", "Composer primary button must switch to cancel while a turn is running and the draft is empty"); diff --git a/web/hwlab-cloud-web/src/components/agent/TraceTimeline.vue b/web/hwlab-cloud-web/src/components/agent/TraceTimeline.vue index 93b759d9..e66694cd 100644 --- a/web/hwlab-cloud-web/src/components/agent/TraceTimeline.vue +++ b/web/hwlab-cloud-web/src/components/agent/TraceTimeline.vue @@ -20,7 +20,6 @@ const noiseCount = computed(() => traceNoiseEventCount(events.value as Record events.value.at(-1) ?? null); const lastReadableRow = computed(() => readableRows.value.at(-1) ?? null); const lastEventLabel = computed(() => firstNonEmptyString(lastReadableRow.value?.header, props.trace?.lastEventLabel, lastEvent.value?.label, lastEvent.value?.type, lastEvent.value?.kind) ?? "未观测"); -const detailTitle = computed(() => props.trace?.traceId ? `运行详情 ${props.trace.traceId}` : "运行详情"); const summaryItems = computed(() => { const agentRun = recordValue(props.trace?.agentRun); return [ @@ -112,27 +111,24 @@ function recordValue(value: unknown): Record | null { +{{ noiseCount }}
-
- ! -
-
-
trace
{{ trace.traceId || "pending" }}
-
rows
{{ readableRows.length }} / {{ eventCount }}
-
hidden
{{ noiseCount }}
-
last
{{ lastEventLabel }}
-
-
- {{ item.label }}{{ item.value }} -
-

当前 result 返回被压缩,已通过 trace replay 入口请求完整事件;完成前不要把压缩窗口当完整 trace。

-

已聚合隐藏 {{ noiseCount }} 条 backend/chunk/token 噪声事件;原始 payload 仍可在原始事件中审计。

-
- - - -
+
+
+
trace
{{ trace.traceId || "pending" }}
+
rows
{{ readableRows.length }} / {{ eventCount }}
+
hidden
{{ noiseCount }}
+
last
{{ lastEventLabel }}
+
+
+ {{ item.label }}{{ item.value }}
-
+

当前 result 返回被压缩,已通过 trace replay 入口请求完整事件;完成前不要把压缩窗口当完整 trace。

+

已聚合隐藏 {{ noiseCount }} 条 backend/chunk/token 噪声事件;原始 payload 仍可在原始事件中审计。

+
+ + + +
+