import { createRunSummary, } from "./run-summary.js"; import { createSessionSnapshotSummary, sessionSnapshotMetadataLogLines, } from "./session-summary.js"; export function selectSessionGcodeProgram({ snapshot = null, defaultFilename, defaultOpfsPath, wasmPath, gcodeFilenameFromProgramPath, }) { const snapshotOpfsPath = snapshot?.payload?.files?.gcode; if (typeof snapshotOpfsPath === "string") { try { return { filename: gcodeFilenameFromProgramPath(snapshotOpfsPath), opfsPath: snapshotOpfsPath, source: "snapshot", wasmPath, }; } catch { // Invalid snapshot program paths fall back to the UI default program. } } return { filename: defaultFilename, opfsPath: defaultOpfsPath, source: "default", wasmPath, }; } export function runSessionContextLogLines(program, snapshot = null, snapshotLabel = null) { const summary = createSessionSnapshotSummary({ metadata: snapshot?.metadata ?? {}, }); return [ `Program: ${program.opfsPath} -> ${program.wasmPath}`, `Program source: ${program.source}`, `Snapshot: ${snapshot ? (snapshotLabel ?? snapshot?.metadata?.snapshotLabel ?? snapshot?.sessionId) : "-"}`, ...sessionSnapshotMetadataLogLines(summary), ]; } export async function runGcodeSessionWorkflow({ interp, loadedSession, snapshot = null, defaultFilename, defaultOpfsPath, wasmPath, gcodeFilenameFromProgramPath, loadGcodeProgram, summarizeRun = () => ({}), snapshotLabel = null, }) { if (!loadedSession) { throw new Error("Load a machine session before running G-code."); } const program = selectSessionGcodeProgram({ snapshot, defaultFilename, defaultOpfsPath, wasmPath, gcodeFilenameFromProgramPath, }); const programText = await loadGcodeProgram(program.filename); interp.writeTextFile(program.wasmPath, programText); const resultText = interp.runFileWithIni(program.wasmPath, loadedSession.ini.wasmPath).trim(); const runResultSummary = summarizeRun(resultText, programText); const { motionSnapshots = [], ...runCounts } = runResultSummary; const summary = createRunSummary( program, { runStatus: "ok", iniWasmPath: loadedSession.ini.wasmPath, snapshotLabel: snapshot ? snapshotLabel : null, ...runCounts, }, snapshot, ); return { program: { ...program, text: programText, }, resultText, motionSnapshots, summary, fields: { sessionGcode: program.opfsPath, runStatus: summary.runStatus, runSource: summary.programSource, runSnapshot: summary.snapshotLabel ?? "-", runWorkflow: summary.workflow ?? "-", runOpfsPath: summary.programOpfsPath, runWasmPath: summary.programWasmPath, }, logLines: [ ...runSessionContextLogLines(program, snapshot, summary.snapshotLabel), `INI: ${loadedSession.ini.wasmPath}`, resultText, ], }; }