| import fs from "node:fs/promises"; |
| import os from "node:os"; |
| import path from "node:path"; |
| import { afterEach, beforeEach, describe, expect, it } from "vitest"; |
| import { queryOmegaDurableMemory, resolveOmegaDurableMemoryFile } from "./durable-memory.js"; |
| import { recordOmegaSessionOutcome } from "./session-context.js"; |
|
|
| describe("omega durable memory", () => { |
| let workspaceRoot = ""; |
| const sessionKey = "agent:tester:main"; |
|
|
| beforeEach(async () => { |
| workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "omega-durable-memory-")); |
| }); |
|
|
| afterEach(async () => { |
| await fs.rm(workspaceRoot, { recursive: true, force: true }); |
| }); |
|
|
| it("admits only verified successes and repeated failures", async () => { |
| await recordOmegaSessionOutcome({ |
| workspaceRoot, |
| sessionKey, |
| task: "Inspect flaky auth retry path", |
| validation: { expectsJson: false, expectedKeys: [], expectedPaths: ["src/auth.ts"] }, |
| outcome: { status: "error", errorKind: "target_not_touched" }, |
| }); |
|
|
| const afterFirstFailure = await queryOmegaDurableMemory({ |
| workspaceRoot, |
| sessionKey, |
| task: "auth retry", |
| expectedPaths: ["src/auth.ts"], |
| }); |
| expect(afterFirstFailure).toHaveLength(0); |
|
|
| await recordOmegaSessionOutcome({ |
| workspaceRoot, |
| sessionKey, |
| task: "Inspect flaky auth retry path", |
| validation: { expectsJson: false, expectedKeys: [], expectedPaths: ["src/auth.ts"] }, |
| outcome: { status: "error", errorKind: "target_not_touched" }, |
| }); |
|
|
| await recordOmegaSessionOutcome({ |
| workspaceRoot, |
| sessionKey, |
| task: "Fix auth retry path", |
| validation: { expectsJson: false, expectedKeys: [], expectedPaths: ["src/auth.ts"] }, |
| outcome: { |
| status: "ok", |
| observedChangedFiles: ["src/auth.ts"], |
| writeOk: true, |
| }, |
| }); |
|
|
| const recalled = await queryOmegaDurableMemory({ |
| workspaceRoot, |
| sessionKey, |
| task: "fix auth retry bug", |
| expectedPaths: ["src/auth.ts"], |
| }); |
|
|
| expect(recalled.map((entry) => entry.kind)).toEqual( |
| expect.arrayContaining(["verified_success", "repeated_failure"]), |
| ); |
| const repeatedFailure = recalled.find((entry) => entry.kind === "repeated_failure"); |
| const verifiedSuccess = recalled.find((entry) => entry.kind === "verified_success"); |
| expect(verifiedSuccess?.targets).toContain("src/auth.ts"); |
| expect(repeatedFailure?.failureCount).toBe(2); |
| }); |
|
|
| it("persists durable memory on disk", async () => { |
| await recordOmegaSessionOutcome({ |
| workspaceRoot, |
| sessionKey, |
| task: "Update session continuity cache", |
| validation: { expectsJson: true, expectedKeys: ["ok"], expectedPaths: [] }, |
| outcome: { status: "ok", structuredOk: true }, |
| }); |
|
|
| const file = resolveOmegaDurableMemoryFile({ workspaceRoot, sessionKey }); |
| const raw = await fs.readFile(file, "utf-8"); |
| expect(raw).toContain("Update session continuity cache"); |
| expect(raw).toContain("verified_success"); |
| }); |
|
|
| it("persists locality telemetry for later routing decisions", async () => { |
| await recordOmegaSessionOutcome({ |
| workspaceRoot, |
| sessionKey, |
| task: "Patch isolated config path", |
| validation: { expectsJson: false, expectedKeys: [], expectedPaths: ["src/config.ts"] }, |
| outcome: { |
| status: "ok", |
| observedChangedFiles: ["src/config.ts"], |
| writeOk: true, |
| localityScore: 1, |
| protectedPreservationRate: 1, |
| }, |
| }); |
|
|
| const recalled = await queryOmegaDurableMemory({ |
| workspaceRoot, |
| sessionKey, |
| task: "patch config", |
| expectedPaths: ["src/config.ts"], |
| }); |
|
|
| expect(recalled[0]).toMatchObject({ |
| localityScore: 1, |
| protectedPreservationRate: 1, |
| }); |
| }); |
| }); |
|
|