import assert from "node:assert/strict"; import { MemoryStorage, WorkspaceJournal } from "../workspace/journal.mjs"; import { verifyOfflinePackage } from "../workspace/migration.mjs"; import { ProjectWorkflow } from "../app/project-workflow.mjs"; import { ReplayTimeline } from "./replay.mjs"; import { createCheckpoint, recoverSimulation } from "../workspace/recovery.mjs"; const contextId = "linuxcnc-2.10.0-pre0-wasm-m1-py-c1"; const storage = new MemoryStorage(); const journal = new WorkspaceJournal(storage, { projectId: "faults" }); journal.prepare("op-1", [{ path: "config/main.ini", data: "[EMC]\n" }]); journal.commit("op-1"); const half = new MemoryStorage(Object.fromEntries(storage.entries())); const halfJournal = new WorkspaceJournal(half, { projectId: "faults" }); halfJournal.prepare("op-half", [{ path: "programs/main.ngc", data: "G0 X1\n" }]); assert.equal(halfJournal.recover().half_commits.length, 1); const timeline = new ReplayTimeline(); timeline.appendEvent(1, 0, "SESSION_READY", {}); timeline.checkpoint(1, 0, { tick: 0 }); const checkpoint = createCheckpoint({ contextId, timeline, state: { tick: 0 }, operations: [] }); const damaged = structuredClone(checkpoint); damaged.state.tick = 9; assert.equal(recoverSimulation({ checkpoint: damaged }).status, "blocked"); const workflow = new ProjectWorkflow({ contextId, storage: new MemoryStorage(), projectId: "offline" }); workflow.importFiles([{ path: "config/main.ini", data: "[EMC]\n" }]); const pkg = workflow.package({ timeline, checkpoint, committedSeq: 1 }); const offline = workflow.offline(pkg, [{ path: "ui/index.html", data: "
" }]); assert.throws(() => verifyOfflinePackage(offline, { contextId, workspacePackage: pkg, available: [], online: false }), /offline_resource_invalid/); assert.equal(verifyOfflinePackage(offline, { contextId, workspacePackage: pkg, available: [], online: true }).status, "network_required"); console.log("recovery_offline_faults=passed scenarios=5");