feat(workbench): integrate runtime data and map tooling

This commit is contained in:
2026-09-22 10:45:46 +08:00
parent bf44cc0f25
commit bebcf2a06c
163 changed files with 15642 additions and 1312 deletions
@@ -1,4 +1,6 @@
export const ARTIFACT_PANE_MIN_WIDTH = 640;
import type { FeatureCollection, Geometry } from "geojson";
export const ARTIFACT_PANE_MIN_WIDTH = 600;
export const ARTIFACT_MAP_SPLIT_MIN_WIDTH = ARTIFACT_PANE_MIN_WIDTH * 2 + 1;
export type ArtifactType = "diagnosis" | "simulation" | "metric_analysis";
@@ -80,6 +82,7 @@ export type AnalysisArtifactAction = {
export type AnalysisArtifact = {
id: string;
origin?: "agent" | "backend" | "demo";
type: ArtifactType;
lifecycle: ArtifactLifecycle;
revision: number;
@@ -92,6 +95,7 @@ export type AnalysisArtifact = {
analyticalTimeRange: { start: string; end: string };
preferredView: ArtifactViewMode;
mapRelation: ArtifactMapRelation;
spatialOverlay?: FeatureCollection<Geometry>;
blocks: AnalysisBlock[];
sources: string[];
limitations: string[];
@@ -128,6 +132,17 @@ export function openPendingArtifact(state: ArtifactWorkspaceState): ArtifactWork
};
}
export function openAnalysisArtifact(
state: ArtifactWorkspaceState,
artifact: AnalysisArtifact
): ArtifactWorkspaceState {
return {
pendingArtifact: null,
activeArtifact: artifact,
requestedView: getPreferredArtifactView(artifact)
};
}
export function collapseActiveArtifact(state: ArtifactWorkspaceState): ArtifactWorkspaceState {
if (!state.activeArtifact) return state;
return {
@@ -162,7 +177,7 @@ export function resolveWorkbenchSurfaceMode(
const artifact = state.activeArtifact;
if (!artifact) return "default";
if (state.requestedView === "map_only") return "map_only";
if (artifact.mapRelation === "none" || state.requestedView === "focus") return "focus";
if (state.requestedView === "focus") return "focus";
return businessWorkspaceWidth >= ARTIFACT_MAP_SPLIT_MIN_WIDTH ? "map_split" : "focus";
}