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; }