{"version":3,"file":"agent-session-memory-snapshot.test.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-memory-snapshot.test.ts"],"names":[],"mappings":"","sourcesContent":["import { Agent } from \"@apholdings/jensen-agent-core\";\nimport { describe, expect, it } from \"vitest\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { SESSION_MEMORY_CUSTOM_TYPE } from \"./memory.js\";\nimport { buildStructuredMemoryCompareData, buildStructuredMemoryHistoryData } from \"./memory-snapshot-contract.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nfunction createSession(sessionManager = SessionManager.inMemory(\"/tmp/project\")): AgentSession {\n\tconst settingsManager = SettingsManager.inMemory();\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\tcwd: \"/tmp/project\",\n\t\tagentDir: \"/tmp/agent\",\n\t\tsettingsManager,\n\t});\n\tconst authStorage = AuthStorage.create(\"/tmp/agent/auth.json\");\n\tconst modelRegistry = new ModelRegistry(authStorage);\n\tconst agent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tthinkingLevel: \"off\",\n\t\t\ttools: [],\n\t\t},\n\t});\n\n\treturn new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd: \"/tmp/project\",\n\t\tresourceLoader,\n\t\tmodelRegistry,\n\t});\n}\n\ndescribe(\"AgentSession structured memory snapshot consumer\", () => {\n\tit(\"reuses the shared structured history payload for SDK callers\", () => {\n\t\tconst sessionManager = SessionManager.inMemory(\"/tmp/project\");\n\t\tsessionManager.appendCustomEntry(SESSION_MEMORY_CUSTOM_TYPE, [\n\t\t\t{ key: \"alpha\", value: \"first\", timestamp: \"2026-04-01T10:00:00.000Z\" },\n\t\t]);\n\t\tsessionManager.appendCustomEntry(SESSION_MEMORY_CUSTOM_TYPE, [\n\t\t\t{ key: \"alpha\", value: \"second\", timestamp: \"2026-04-01T12:00:00.000Z\" },\n\t\t]);\n\t\tconst session = createSession(sessionManager);\n\n\t\texpect(session.getStructuredMemoryHistory()).toEqual(buildStructuredMemoryHistoryData(session));\n\t});\n\n\tit(\"reuses the shared compare payload for explicit same-snapshot SDK comparisons\", () => {\n\t\tconst sessionManager = SessionManager.inMemory(\"/tmp/project\");\n\t\tconst snapshotId = sessionManager.appendCustomEntry(SESSION_MEMORY_CUSTOM_TYPE, [\n\t\t\t{ key: \"alpha\", value: \"first\", timestamp: \"2026-04-01T10:00:00.000Z\" },\n\t\t]);\n\t\tconst session = createSession(sessionManager);\n\n\t\tconst data = session.compareMemorySnapshots({\n\t\t\tbaseline: snapshotId,\n\t\t\ttarget: `[${snapshotId.slice(0, 8)}]`,\n\t\t});\n\n\t\texpect(data).toEqual(\n\t\t\tbuildStructuredMemoryCompareData(session, {\n\t\t\t\tbaseline: snapshotId,\n\t\t\t\ttarget: `[${snapshotId.slice(0, 8)}]`,\n\t\t\t}),\n\t\t);\n\t\texpect(data.status).toBe(\"ok\");\n\t\tif (data.status === \"ok\") {\n\t\t\texpect(data.compareMode).toBe(\"explicit\");\n\t\t\texpect(data.sameSnapshot).toBe(true);\n\t\t}\n\t});\n\n\tit(\"returns empty_history and initial_snapshot through the AgentSession API\", () => {\n\t\tconst session = createSession();\n\n\t\texpect(session.compareMemorySnapshots()).toEqual({\n\t\t\tbranchScope: \"current\",\n\t\t\thistoryModel: \"snapshot\",\n\t\t\tstatus: \"empty_history\",\n\t\t\tsnapshotCount: 0,\n\t\t});\n\n\t\tsession.setMemoryItem(\"project.goal\", \"document same-process memory automation\");\n\t\tconst initial = session.compareMemorySnapshots();\n\t\texpect(initial.status).toBe(\"initial_snapshot\");\n\t\tif (initial.status === \"initial_snapshot\") {\n\t\t\texpect(initial.target.itemCount).toBe(1);\n\t\t\texpect(initial.diff.isInitialSnapshot).toBe(true);\n\t\t}\n\t});\n\n\tit(\"surfaces selector_resolution_failed through the AgentSession API\", () => {\n\t\tconst session = createSession();\n\t\tsession.setMemoryItem(\"project.goal\", \"first\");\n\t\tsession.setMemoryItem(\"project.goal\", \"second\");\n\n\t\tconst history = session.getStructuredMemoryHistory();\n\t\tconst target = history.snapshots[history.snapshots.length - 1]!.entryId;\n\t\tconst failed = session.compareMemorySnapshots({\n\t\t\tbaseline: \"missing-selector\",\n\t\t\ttarget,\n\t\t});\n\n\t\texpect(failed.status).toBe(\"selector_resolution_failed\");\n\t\tif (failed.status === \"selector_resolution_failed\") {\n\t\t\texpect(failed.issues).toEqual([\n\t\t\t\t{\n\t\t\t\t\tlabel: \"baseline\",\n\t\t\t\t\tinput: \"missing-selector\",\n\t\t\t\t\tmatchedInput: \"missing-selector\",\n\t\t\t\t\terror: \"not_found\",\n\t\t\t\t\tcandidates: [],\n\t\t\t\t},\n\t\t\t]);\n\t\t}\n\t});\n\n\tit(\"rejects partial explicit selector input like the RPC command contract\", () => {\n\t\tconst session = createSession();\n\t\texpect(() => session.compareMemorySnapshots({ baseline: \"only-one\" })).toThrow(\n\t\t\t\"Provide both baseline and target selectors, or neither for adjacent comparison.\",\n\t\t);\n\t});\n});\n"]}