61 lines
2.4 KiB
TypeScript
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;
|
|
}
|