diff --git a/server/finding_report.go b/server/finding_report.go index 6a66c86..ca7ef81 100644 --- a/server/finding_report.go +++ b/server/finding_report.go @@ -69,6 +69,7 @@ func (s *Server) generateFindingReport(w http.ResponseWriter, r *http.Request) { ) writeJSON(w, http.StatusAccepted, map[string]any{ "queued": true, + "agent_key": "reporter", "finding_id": f.ID, "finding_node_id": *f.NodeID, }) diff --git a/web/src/app/(main)/function/findings/detail/page.tsx b/web/src/app/(main)/function/findings/detail/page.tsx index bbd241c..5c065ec 100644 --- a/web/src/app/(main)/function/findings/detail/page.tsx +++ b/web/src/app/(main)/function/findings/detail/page.tsx @@ -255,6 +255,7 @@ function FindingDetailInner() { size="sm" onClick={() => void generateReport()} disabled={reportGenerating} + title="由报告撰写 Agent 生成,不使用 Auto Agent" > {reportGenerating ? ( diff --git a/web/src/app/(main)/function/tasks/detail/_tabs/coverage-graph-tab.tsx b/web/src/app/(main)/function/tasks/detail/_tabs/coverage-graph-tab.tsx index b6c2a14..019c96b 100644 --- a/web/src/app/(main)/function/tasks/detail/_tabs/coverage-graph-tab.tsx +++ b/web/src/app/(main)/function/tasks/detail/_tabs/coverage-graph-tab.tsx @@ -350,6 +350,12 @@ function toG6Nodes( }); } +function networkWorldHeight(renderNodes: RenderNode[]): number { + const counts: Record = { internet: 0, boundary: 0, internal: 0 }; + for (const node of renderNodes) counts[node.fold ? "boundary" : zoneOf(node.node)] += 1; + return Math.max(760, Math.max(counts.internet, counts.boundary, counts.internal, 1) * 42); +} + // G6 的类型把自定义字段归在 data 下,但官方 force 示例(及运行时)按顶层读 d.。 // 回调形参用 unknown 满足 G6 签名,内部用 nd() 强转回我们的顶层结构。 const nd = (d: unknown) => d as G6NodeDatum; @@ -727,6 +733,7 @@ function GraphInner({ taskId, coverageEnabled = true }: { taskId: string; covera () => renderEdges.filter((edge) => displayNodeKeys.has(edge.src) && displayNodeKeys.has(edge.dst)), [displayNodeKeys, renderEdges], ); + const worldHeight = React.useMemo(() => networkWorldHeight(displayNodes), [displayNodes]); // 结构签名:只在可见节点/边集合变化时重建图 + 重跑布局,避免无谓抖动。 const sig = React.useMemo( @@ -900,8 +907,9 @@ function GraphInner({ taskId, coverageEnabled = true }: { taskId: string; covera {viewMode === "network" ? (
- ))} -
-
- {(Object.keys(zoneMeta) as Zone[]).map((zone) => ( -
-
{zoneMeta[zone].label}
-
{zoneMeta[zone].description}
+ > +
+
{zoneMeta[zone].label}
+
{zoneMeta[zone].description}
+
))}
diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index 65914bc..7b32275 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -715,7 +715,7 @@ export const api = { `/exploration/findings/${id}${contextTaskId ? `?context_task=${encodeURIComponent(contextTaskId)}` : ""}`, ), generateFindingReport: (id: string) => - post<{ queued: boolean; finding_id: number; finding_node_id: number }>( + post<{ queued: boolean; agent_key: "reporter"; finding_id: number; finding_node_id: number }>( `/exploration/findings/${encodeURIComponent(id)}/generate-report`, {}, ),