Files
cdsl-cad/frontend/src/lib/cad-artifacts.ts
T
2026-08-26 14:13:11 +08:00

61 lines
2.4 KiB
TypeScript

import type { CadResult, TaskRecord } from "./cad-types";
export function encodeArtifactUrl(taskId: string, artifactPath: string) {
const encodedTask = encodeURIComponent(taskId);
const encodedPath = artifactPath.split("/").map(encodeURIComponent).join("/");
return `/api/tasks/${encodedTask}/artifacts/${encodedPath}`;
}
function resultForRevision(task: TaskRecord, revisionId: string, checkpoint: boolean): CadResult | null {
const current = task.revisions.find((revision) => revision.revision_id === revisionId);
if (
!current ||
current.status !== "success" ||
!current.cdsl_path ||
!current.step_path ||
!current.glb_path ||
!current.report_path
) {
return null;
}
return {
taskId: task.task_id,
revisionId: current.revision_id,
cdslPath: current.cdsl_path,
stepPath: current.step_path,
glbPath: current.glb_path,
reportPath: current.report_path,
parametersPath: current.parameters_path,
selectorPath: current.selector_path,
edgesPath: current.edges_path,
topologyPath: current.topology_path,
summary: current.summary || "CDSL CAD model",
referenceIds: current.reference_ids || [],
engine: current.engine || "cdsl_only",
qualityStatus: current.quality_status || "",
qualityPath: current.quality_path,
assumptions: current.generation_assumptions || current.assumptions || [],
warnings: current.warnings || [],
repairAttempts: current.repair_attempts || 0,
snapshotPaths: current.snapshot_manifest_path ? [current.snapshot_manifest_path] : [],
snapshotStatus: current.snapshot_status || "unavailable",
checkpoint,
lifecycle: task.lifecycle || "completed",
};
}
export function activeCheckpointPreview(task: TaskRecord | null): CadResult | null {
if (!task || task.lifecycle !== "running") return null;
const revisionId = task.preview_revision || task.active_revision || task.current_revision;
if (!revisionId) return null;
return resultForRevision(task, revisionId, true);
}
export function latestSuccessfulResult(task: TaskRecord | null): CadResult | null {
if (!task) return null;
const current =
task.revisions.find((revision) => revision.revision_id === (task.published_revision || task.current_revision)) ??
[...task.revisions].reverse().find((revision) => revision.status === "success" && revision.visibility !== "checkpoint");
return current ? resultForRevision(task, current.revision_id, current.visibility === "checkpoint") : null;
}