@ai-devkit/agent-manager 0.26.1 → 0.26.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +5 -2
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +21 -4
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +184 -0
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +13 -4
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js +13 -4
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CopilotAdapter.test.js +7 -2
- package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js +18 -5
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GrokCliAdapter.test.js +7 -2
- package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js +13 -4
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/PiAdapter.test.js +32 -4
- package/dist/__tests__/adapters/PiAdapter.test.js.map +1 -1
- package/dist/__tests__/utils/AgentRegistry.test.js +68 -46
- package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
- package/dist/__tests__/utils/process.test.js +90 -2
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +9 -3
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/adapters/ClaudeCodeAdapter.d.ts +5 -4
- package/dist/adapters/ClaudeCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/ClaudeCodeAdapter.js +11 -7
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/CodexAdapter.d.ts +5 -4
- package/dist/adapters/CodexAdapter.d.ts.map +1 -1
- package/dist/adapters/CodexAdapter.js +11 -7
- package/dist/adapters/CodexAdapter.js.map +1 -1
- package/dist/adapters/CopilotAdapter.d.ts +5 -4
- package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
- package/dist/adapters/CopilotAdapter.js +11 -7
- package/dist/adapters/CopilotAdapter.js.map +1 -1
- package/dist/adapters/GeminiCliAdapter.d.ts +6 -5
- package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GeminiCliAdapter.js +12 -8
- package/dist/adapters/GeminiCliAdapter.js.map +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts +3 -2
- package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GrokCliAdapter.js +10 -6
- package/dist/adapters/GrokCliAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts +5 -4
- package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +11 -7
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/PiAdapter.d.ts +3 -2
- package/dist/adapters/PiAdapter.d.ts.map +1 -1
- package/dist/adapters/PiAdapter.js +12 -9
- package/dist/adapters/PiAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/database/connection.d.ts +22 -0
- package/dist/database/connection.d.ts.map +1 -0
- package/dist/database/connection.js +58 -0
- package/dist/database/connection.js.map +1 -0
- package/dist/database/index.d.ts +4 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +4 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/migrations/001_initial.sql +12 -0
- package/dist/database/schema.d.ts +4 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +47 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/AgentRegistry.d.ts +7 -3
- package/dist/utils/AgentRegistry.d.ts.map +1 -1
- package/dist/utils/AgentRegistry.js +108 -57
- package/dist/utils/AgentRegistry.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/process.d.ts +9 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +155 -10
- package/dist/utils/process.js.map +1 -1
- package/package.json +2 -2
- package/src/AgentManager.ts +28 -4
- package/src/__tests__/AgentManager.test.ts +126 -0
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +16 -5
- package/src/__tests__/adapters/CodexAdapter.test.ts +16 -5
- package/src/__tests__/adapters/CopilotAdapter.test.ts +8 -1
- package/src/__tests__/adapters/GeminiCliAdapter.test.ts +20 -4
- package/src/__tests__/adapters/GrokCliAdapter.test.ts +8 -1
- package/src/__tests__/adapters/OpenCodeAdapter.test.ts +16 -5
- package/src/__tests__/adapters/PiAdapter.test.ts +28 -5
- package/src/__tests__/utils/AgentRegistry.test.ts +48 -40
- package/src/__tests__/utils/process.test.ts +72 -1
- package/src/adapters/AgentAdapter.ts +11 -3
- package/src/adapters/ClaudeCodeAdapter.ts +10 -7
- package/src/adapters/CodexAdapter.ts +10 -7
- package/src/adapters/CopilotAdapter.ts +16 -7
- package/src/adapters/GeminiCliAdapter.ts +17 -8
- package/src/adapters/GrokCliAdapter.ts +9 -6
- package/src/adapters/OpenCodeAdapter.ts +10 -7
- package/src/adapters/PiAdapter.ts +10 -9
- package/src/adapters/index.ts +1 -1
- package/src/database/connection.ts +74 -0
- package/src/database/index.ts +7 -0
- package/src/database/migrations/001_initial.sql +12 -0
- package/src/database/schema.ts +62 -0
- package/src/index.ts +2 -0
- package/src/utils/AgentRegistry.ts +109 -49
- package/src/utils/index.ts +1 -1
- package/src/utils/process.ts +160 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/__tests__/adapters/CodexAdapter.test.ts"],"sourcesContent":["/**\n * Tests for CodexAdapter\n */\n\nimport type { MockedFunction } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { CodexAdapter } from '../../adapters/CodexAdapter.js';\nimport type { ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { AgentRegistry, type RegistryEntry } from '../../utils/AgentRegistry.js';\nimport { listAgentProcesses, enrichProcesses } from '../../utils/process.js';\nimport { batchGetSessionFileBirthtimes } from '../../utils/session.js';\nimport type { SessionFile } from '../../utils/session.js';\nimport { matchProcessesToSessions, generateAgentName } from '../../utils/matching.js';\nimport type { MatchResult } from '../../utils/matching.js';\nimport * as os from 'os';\n\nvi.mock('../../utils/process.js', () => ({\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n}));\n\nvi.mock('../../utils/session.js', async () => {\n const actual = await vi.importActual('../../utils/session') as typeof import('../../utils/session');\n return {\n ...actual,\n batchGetSessionFileBirthtimes: vi.fn(),\n };\n});\n\nvi.mock('../../utils/matching.js', () => ({\n matchProcessesToSessions: vi.fn(),\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<typeof batchGetSessionFileBirthtimes>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<typeof matchProcessesToSessions>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe('CodexAdapter', () => {\n let adapter: CodexAdapter;\n\n beforeEach(() => {\n adapter = new CodexAdapter();\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedBatchGetSessionFileBirthtimes.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n // Default: enrichProcesses returns what it receives\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Default: generateAgentName returns \"folder (pid)\"\n mockedGenerateAgentName.mockImplementation((cwd, pid) => {\n const folder = path.basename(cwd) || 'unknown';\n return `${folder} (${pid})`;\n });\n });\n\n describe('initialization', () => {\n it('should expose codex type', () => {\n expect(adapter.type).toBe('codex');\n });\n });\n\n describe('canHandle', () => {\n it('should return true for codex commands', () => {\n expect(adapter.canHandle({ pid: 1, command: 'codex', cwd: '/repo', tty: 'ttys001' })).toBe(true);\n });\n\n it('should return true for codex with full path (case-insensitive)', () => {\n expect(adapter.canHandle({\n pid: 2,\n command: '/usr/local/bin/CODEX --sandbox workspace-write',\n cwd: '/repo',\n tty: 'ttys002',\n })).toBe(true);\n });\n\n it('should return false for non-codex processes', () => {\n expect(adapter.canHandle({ pid: 3, command: 'node app.js', cwd: '/repo', tty: 'ttys003' })).toBe(false);\n });\n\n it('should return false for processes with \"codex\" only in path arguments', () => {\n expect(adapter.canHandle({\n pid: 4,\n command: 'node /worktrees/feature-codex-adapter-agent-manager-package/node_modules/nx/src/daemon/server/start.js',\n cwd: '/repo',\n tty: 'ttys004',\n })).toBe(false);\n });\n });\n\n describe('detectAgents', () => {\n async function useRealSessionMatcher(): Promise<void> {\n const actualMatching = await vi.importActual<typeof import('../../utils/matching.js')>('../../utils/matching.js');\n mockedMatchProcessesToSessions.mockImplementation(actualMatching.matchProcessesToSessions);\n }\n\n it('should return empty list when no codex process is running', async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n expect(agents).toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith('codex');\n });\n\n it('should return process-only agents when no sessions discovered', async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001' },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // No sessions dir → discoverSessions returns []\n (adapter as any).codexSessionsDir = '/nonexistent/sessions';\n\n const agents = await adapter.detectAgents();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n status: AgentStatus.RUNNING,\n pid: 100,\n projectPath: '/repo-a',\n sessionId: 'pid-100',\n summary: 'Codex process running',\n });\n });\n\n it('should detect agents with matched sessions', async () => {\n const processes: ProcessInfo[] = [\n {\n pid: 100,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-03-18T15:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // Set up sessions dir with date directory\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n // Create session file with recent timestamps so status isn't idle\n const now = new Date();\n const recentTs = now.toISOString();\n const sessionFile = path.join(dateDir, 'sess-abc.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-abc', timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'Implement adapter flow' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n\n const sessionFiles: SessionFile[] = [\n {\n sessionId: 'sess-abc',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-03-18T15:00:05Z').getTime(),\n resolvedCwd: '',\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(sessionFiles);\n\n const matches: MatchResult[] = [\n {\n process: processes[0],\n session: { ...sessionFiles[0], resolvedCwd: '/repo-a' },\n deltaMs: 5000,\n },\n ];\n mockedMatchProcessesToSessions.mockReturnValue(matches);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n status: AgentStatus.RUNNING,\n pid: 100,\n projectPath: '/repo-a',\n sessionId: 'sess-abc',\n summary: 'Implement adapter flow',\n });\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match when session_meta timestamp and file birthtime both align with process start', async () => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const sessionTimestamp = '2026-03-18T15:00:05.000Z';\n const processes: ProcessInfo[] = [\n {\n pid: 101,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-aligned.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-aligned', timestamp: sessionTimestamp, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: sessionTimestamp, payload: { type: 'token_count', message: 'Aligned session' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-aligned',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date(sessionTimestamp).getTime(),\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 101,\n sessionId: 'sess-aligned',\n summary: 'Aligned session',\n });\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match late-created session files using session_meta timestamp', async () => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const sessionTimestamp = '2026-03-18T15:00:10.000Z';\n const lateBirthtime = new Date('2026-03-18T15:05:30.000Z').getTime();\n const processes: ProcessInfo[] = [\n {\n pid: 102,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-late.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-late', timestamp: sessionTimestamp, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: sessionTimestamp, payload: { type: 'token_count', message: 'Late file session' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-late',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: lateBirthtime,\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 102,\n sessionId: 'sess-late',\n summary: 'Late file session',\n });\n expect(mockedMatchProcessesToSessions.mock.calls[0][1][0].birthtimeMs).toBe(new Date(sessionTimestamp).getTime());\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it.each<[string, string | undefined]>([\n ['missing', undefined],\n ['invalid', 'not-a-date'],\n ])('should fall back to file birthtime when session_meta timestamp is %s', async (_label, metaTimestamp) => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const fileBirthtime = new Date('2026-03-18T15:00:20.000Z').getTime();\n const processes: ProcessInfo[] = [\n {\n pid: 103,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const payload: { id: string; cwd: string; timestamp?: string } = { id: `sess-${_label}`, cwd: '/repo-a' };\n if (metaTimestamp !== undefined) {\n payload.timestamp = metaTimestamp;\n }\n\n const sessionFile = path.join(dateDir, `sess-${_label}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:00:30.000Z', payload: { type: 'token_count', message: `${_label} timestamp session` } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: `sess-${_label}`,\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: fileBirthtime,\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe(`sess-${_label}`);\n expect(mockedMatchProcessesToSessions.mock.calls[0][1][0].birthtimeMs).toBe(fileBirthtime);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should fall back to process-only for unmatched processes', async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n { pid: 200, command: 'codex', cwd: '/repo-b', tty: 'ttys002', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const now = new Date();\n const dateDir = path.join(\n sessionsDir,\n String(now.getFullYear()),\n String(now.getMonth() + 1).padStart(2, '0'),\n String(now.getDate()).padStart(2, '0'),\n );\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'only-session.jsonl');\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'only-session', timestamp: now.toISOString(), cwd: '/repo-a' } }),\n );\n\n (adapter as any).codexSessionsDir = sessionsDir;\n\n const sessionFiles: SessionFile[] = [\n {\n sessionId: 'only-session',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: Date.now(),\n resolvedCwd: '',\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(sessionFiles);\n\n // Only process 100 matches\n const matches: MatchResult[] = [\n {\n process: processes[0],\n session: { ...sessionFiles[0], resolvedCwd: '/repo-a' },\n deltaMs: 5000,\n },\n ];\n mockedMatchProcessesToSessions.mockReturnValue(matches);\n\n const agents = await adapter.detectAgents();\n expect(agents).toHaveLength(2);\n\n const matched = agents.find((a) => a.pid === 100);\n const unmatched = agents.find((a) => a.pid === 200);\n expect(matched?.sessionId).toBe('only-session');\n expect(unmatched?.sessionId).toBe('pid-200');\n expect(unmatched?.status).toBe(AgentStatus.RUNNING);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match resumed sessions by id even when the JSONL predates the process', async () => {\n const sessionId = '019eabed-4079-7071-9531-b853ddd9914e';\n const processes: ProcessInfo[] = [\n {\n pid: 88018,\n command: `codex resume ${sessionId}`,\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T12:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '09');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const recentTs = new Date().toISOString();\n const sessionFile = path.join(dateDir, `rollout-2026-06-09T12-28-33-${sessionId}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: sessionId, timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'resumed codex conversation' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n const collectAllSpy = vi.spyOn(adapter as any, 'collectAllSessionFiles');\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(collectAllSpy).not.toHaveBeenCalled();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 88018,\n sessionId,\n projectPath: '/repo-a',\n sessionFilePath: sessionFile,\n });\n expect(agents[0].summary).toBe('resumed codex conversation');\n } finally {\n collectAllSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should fall back to all session files for non-time-sortable resume ids', async () => {\n const sessionId = 'aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee';\n const processes: ProcessInfo[] = [\n {\n pid: 88020,\n command: `codex resume ${sessionId}`,\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T12:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-v4-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '01', '02');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const recentTs = new Date().toISOString();\n const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: sessionId, timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'legacy id conversation' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n const collectAllSpy = vi.spyOn(adapter as any, 'collectAllSessionFiles');\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(collectAllSpy).toHaveBeenCalledOnce();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 88020,\n sessionId,\n sessionFilePath: sessionFile,\n });\n } finally {\n collectAllSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should fall back to process-only when a resumed session becomes unreadable after direct matching', async () => {\n const sessionId = '019eabed-4079-7071-9531-b853ddd9914e';\n const processes: ProcessInfo[] = [\n {\n pid: 88019,\n command: `codex resume ${sessionId}`,\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T12:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-gone-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '09');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, `rollout-2026-06-09T12-28-33-${sessionId}.jsonl`);\n\n (adapter as any).codexSessionsDir = sessionsDir;\n const findSpy = vi.spyOn(adapter as any, 'findSessionFileById').mockReturnValue({\n sessionId,\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: Date.now(),\n resolvedCwd: '/repo-a',\n });\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 88019,\n sessionId: 'pid-88019',\n projectPath: '/repo-a',\n });\n expect(agents[0].sessionFilePath).toBeUndefined();\n } finally {\n findSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should map a running Codex process from the hook session mapping', async () => {\n const originalHome = process.env.HOME;\n const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-mapping-'));\n process.env.HOME = tmpHome;\n\n try {\n const mappedAdapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n const sessionsDir = path.join(tmpHome, '.codex', 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '26');\n const mappingPath = path.join(tmpHome, '.codex', 'ai-devkit', 'sessions.json');\n const sessionFile = path.join(dateDir, 'rollout-2026-06-26T09-56-12-sess-mapped.jsonl');\n const recentTs = new Date().toISOString();\n\n fs.mkdirSync(dateDir, { recursive: true });\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-mapped', timestamp: recentTs, cwd: '/repo-mapped' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'mapped conversation' } }),\n ].join('\\n'));\n fs.writeFileSync(mappingPath, JSON.stringify({ 5151: sessionFile }));\n\n const processes: ProcessInfo[] = [\n {\n pid: 5151,\n command: 'codex',\n cwd: '/repo-mapped',\n tty: 'ttys001',\n startTime: new Date('2026-06-26T09:56:12.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 5151,\n sessionId: 'sess-mapped',\n projectPath: '/repo-mapped',\n summary: 'mapped conversation',\n sessionFilePath: sessionFile,\n });\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n } finally {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n }\n });\n\n it('should fall back to legacy matching when mapped session file cannot be parsed', async () => {\n const originalHome = process.env.HOME;\n const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-mapping-fallback-'));\n process.env.HOME = tmpHome;\n\n try {\n const mappedAdapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n const sessionsDir = path.join(tmpHome, '.codex', 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '26');\n const mappingPath = path.join(tmpHome, '.codex', 'ai-devkit', 'sessions.json');\n const badSessionFile = path.join(dateDir, 'bad.jsonl');\n const fallbackSessionFile = path.join(dateDir, 'fallback.jsonl');\n const recentTs = new Date().toISOString();\n\n fs.mkdirSync(dateDir, { recursive: true });\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(badSessionFile, '{not-json');\n fs.writeFileSync(fallbackSessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-fallback', timestamp: recentTs, cwd: '/repo-fallback' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'fallback conversation' } }),\n ].join('\\n'));\n fs.writeFileSync(mappingPath, JSON.stringify({ 6161: badSessionFile }));\n\n const processes: ProcessInfo[] = [\n {\n pid: 6161,\n command: 'codex',\n cwd: '/repo-fallback',\n tty: 'ttys001',\n startTime: new Date('2026-06-26T09:56:12.000Z'),\n },\n ];\n const fallbackSession: SessionFile = {\n sessionId: 'sess-fallback',\n filePath: fallbackSessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-06-26T09:56:15.000Z').getTime(),\n resolvedCwd: '',\n };\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([fallbackSession]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: processes[0],\n session: { ...fallbackSession, resolvedCwd: '/repo-fallback' },\n deltaMs: 3000,\n },\n ]);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 6161,\n sessionId: 'sess-fallback',\n summary: 'fallback conversation',\n sessionFilePath: fallbackSessionFile,\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledWith(\n [processes[0]],\n expect.arrayContaining([expect.objectContaining({ filePath: fallbackSessionFile })]),\n );\n } finally {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n }\n });\n });\n\n describe('detectAgents — registry cache short-circuit', () => {\n let tmpDir: string;\n let regPath: string;\n let registry: AgentRegistry;\n let cachedAdapter: CodexAdapter;\n let sessionFilePath: string;\n\n function registerEntry(over: Partial<RegistryEntry> = {}): void {\n registry.register({\n name: 'codex-100',\n type: 'codex',\n pid: 100,\n tmuxSession: '',\n cwd: '/repo-a',\n startedAt: '2026-05-30T00:00:00.000Z',\n sessionId: 'sess-cached',\n sessionFilePath,\n ...over,\n });\n }\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-cache-'));\n regPath = path.join(tmpDir, 'agents.json');\n registry = new AgentRegistry(regPath);\n cachedAdapter = new CodexAdapter(registry);\n\n const recentTs = new Date().toISOString();\n sessionFilePath = path.join(tmpDir, 'sess-cached.jsonl');\n fs.writeFileSync(sessionFilePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-cached', timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'Hello from cache' } }),\n ].join('\\n'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('short-circuits matching when registry has a valid entry', async () => {\n registerEntry();\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 100,\n sessionId: 'sess-cached',\n sessionFilePath,\n summary: 'Hello from cache',\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n });\n\n it('falls through when no registry entry exists for the pid', async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n });\n\n it('falls through when registry entry type does not match', async () => {\n registerEntry({ type: 'claude' });\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it('falls through when the cached session file no longer exists', async () => {\n registerEntry({ sessionFilePath: path.join(tmpDir, 'deleted.jsonl') });\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n });\n });\n\n describe('discoverSessions', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should return empty when sessions dir does not exist', () => {\n (adapter as any).codexSessionsDir = path.join(tmpDir, 'nonexistent');\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const { sessions } = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date() },\n ]);\n expect(sessions).toEqual([]);\n });\n\n it('should scan date directories based on process start times', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n // Create date dir for 2026-03-18\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n // Create session file with meta\n const sessionFile = path.join(dateDir, 'sess1.jsonl');\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess1', cwd: '/repo-a' } }),\n );\n\n const mockFiles: SessionFile[] = [\n {\n sessionId: 'sess1',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: 1710800324000,\n resolvedCwd: '',\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(mockFiles);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo-a', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n const { sessions, contentCache } = discoverSessions(processes);\n expect(sessions).toHaveLength(1);\n expect(sessions[0].resolvedCwd).toBe('/repo-a');\n expect(contentCache.has(sessionFile)).toBe(true);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n });\n\n it('should scan ±1 day window around process start time', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n // Create date dirs for 17, 18, 19\n for (const day of ['17', '18', '19']) {\n fs.mkdirSync(path.join(sessionsDir, '2026', '03', day), { recursive: true });\n }\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n discoverSessions(processes);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n // Should scan all 3 date dirs\n const dirs = mockedBatchGetSessionFileBirthtimes.mock.calls[0][0] as string[];\n expect(dirs).toHaveLength(3);\n });\n\n it('should handle session files without session_meta', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'bad.jsonl');\n fs.writeFileSync(sessionFile, JSON.stringify({ type: 'event', payload: {} }));\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n { sessionId: 'bad', filePath: sessionFile, projectDir: dateDir, birthtimeMs: 1710800324000, resolvedCwd: '' },\n ]);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n const { sessions } = discoverSessions(processes);\n expect(sessions[0].resolvedCwd).toBe('');\n });\n\n it('should use session_meta timestamp as the matching birthtime when valid', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-meta-time.jsonl');\n const metaTimestamp = '2026-03-18T15:00:05.000Z';\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-meta-time', timestamp: metaTimestamp, cwd: '/repo-a' } }),\n );\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-meta-time',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-03-18T15:05:30.000Z').getTime(),\n resolvedCwd: '',\n },\n ]);\n\n const { sessions } = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo-a', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ]);\n\n expect(sessions[0].resolvedCwd).toBe('/repo-a');\n expect(sessions[0].birthtimeMs).toBe(new Date(metaTimestamp).getTime());\n });\n\n it('should tolerate malformed session_meta and unreadable files', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const malformedFile = path.join(dateDir, 'malformed.jsonl');\n const missingFile = path.join(dateDir, 'missing.jsonl');\n fs.writeFileSync(malformedFile, '{not valid json');\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'malformed',\n filePath: malformedFile,\n projectDir: dateDir,\n birthtimeMs: 1710800324000,\n resolvedCwd: '',\n },\n {\n sessionId: 'missing',\n filePath: missingFile,\n projectDir: dateDir,\n birthtimeMs: 1710800325000,\n resolvedCwd: '',\n },\n ]);\n\n const result = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ]);\n\n expect(result.sessions).toHaveLength(2);\n expect(result.sessions[0].resolvedCwd).toBe('');\n expect(result.sessions[1].resolvedCwd).toBe('');\n expect(result.contentCache.has(malformedFile)).toBe(true);\n expect(result.contentCache.has(missingFile)).toBe(false);\n });\n });\n\n describe('findSessionFileById', () => {\n let tmpDir: string;\n let sessionsDir: string;\n const sessionId = 'aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee';\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-find-'));\n sessionsDir = path.join(tmpDir, 'sessions');\n fs.mkdirSync(path.join(sessionsDir, '2026', '03', '18'), { recursive: true });\n (adapter as any).codexSessionsDir = sessionsDir;\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeResumeSession(timestamp?: string): string {\n const filePath = path.join(sessionsDir, '2026', '03', '18', `${sessionId}.jsonl`);\n const payload: { id: string; cwd: string; timestamp?: string } = { id: sessionId, cwd: '/repo-a' };\n if (timestamp !== undefined) {\n payload.timestamp = timestamp;\n }\n fs.writeFileSync(filePath, JSON.stringify({ type: 'session_meta', payload }));\n return filePath;\n }\n\n it('should return session_meta timestamp as birthtimeMs when valid', () => {\n const metaTimestamp = '2026-03-18T15:00:05.000Z';\n writeResumeSession(metaTimestamp);\n const findSessionFileById = (adapter as any).findSessionFileById.bind(adapter);\n\n const session = findSessionFileById(sessionId);\n\n expect(session).toMatchObject({\n sessionId,\n resolvedCwd: '/repo-a',\n birthtimeMs: new Date(metaTimestamp).getTime(),\n });\n });\n\n it.each<[string, string | undefined]>([\n ['missing', undefined],\n ['invalid', 'not-a-date'],\n ])('should fall back to stat birthtimeMs when session_meta timestamp is %s', (_label, metaTimestamp) => {\n const sessionFile = writeResumeSession(metaTimestamp);\n const stat = fs.statSync(sessionFile);\n const findSessionFileById = (adapter as any).findSessionFileById.bind(adapter);\n\n const session = findSessionFileById(sessionId);\n\n expect(session).not.toBeNull();\n expect(session.birthtimeMs).toBe(stat.birthtimeMs);\n });\n });\n\n describe('helper methods', () => {\n describe('determineStatus', () => {\n it('should return \"waiting\" for agent_message events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'agent_message',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"waiting\" for task_complete events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'task_complete',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"waiting\" for turn_aborted events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'turn_aborted',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"running\" for active events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'token_count',\n })).toBe(AgentStatus.RUNNING);\n });\n\n it('should return \"idle\" when session exceeds threshold', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(Date.now() - 10 * 60 * 1000),\n lastPayloadType: 'token_count',\n })).toBe(AgentStatus.IDLE);\n });\n });\n\n describe('parseSession', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should parse session file with meta and events', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'session.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-1', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_reasoning', message: 'Working on feature' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session).toMatchObject({\n sessionId: 'sess-1',\n projectPath: '/repo',\n summary: 'Working on feature',\n lastPayloadType: 'agent_reasoning',\n });\n expect(session.sessionStart.toISOString()).toBe('2026-03-18T15:00:00.000Z');\n });\n\n it('should parse from cached content without reading disk', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const content = [\n JSON.stringify({ type: 'session_meta', payload: { id: 'cached-1', timestamp: '2026-03-18T15:00:00Z', cwd: '/cached' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: 'Cached result' } }),\n ].join('\\n');\n\n const session = parseSession(content, '/nonexistent/path.jsonl');\n expect(session).toMatchObject({\n sessionId: 'cached-1',\n projectPath: '/cached',\n summary: 'Cached result',\n });\n });\n\n it('should return null for non-existent file', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n expect(parseSession(undefined, path.join(tmpDir, 'nonexistent.jsonl'))).toBeNull();\n });\n\n it('should return null when first line is not session_meta', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'bad.jsonl');\n fs.writeFileSync(filePath, JSON.stringify({ type: 'event', payload: {} }));\n expect(parseSession(undefined, filePath)).toBeNull();\n });\n\n it('should return null when session_meta has no id', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'no-id.jsonl');\n fs.writeFileSync(filePath, JSON.stringify({ type: 'session_meta', payload: { cwd: '/repo' } }));\n expect(parseSession(undefined, filePath)).toBeNull();\n });\n\n it('should extract summary from last event message', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'summary.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-2', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_reasoning', message: 'First message' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:02:00Z', payload: { type: 'agent_message', message: 'Last message' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Last message');\n });\n\n it('should extract summary from current Codex response_item messages', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'response-item-summary.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-ri', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({\n type: 'response_item',\n timestamp: '2026-03-18T15:01:00Z',\n payload: {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'Parsed from current schema' }],\n },\n }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Parsed from current schema');\n expect(session.lastPayloadType).toBe('agent_message');\n });\n\n it('should treat completed Codex AgentMessage events as waiting for list status', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n const filePath = path.join(tmpDir, 'agent-message-status.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-am', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({\n type: 'event_msg',\n timestamp: new Date().toISOString(),\n payload: {\n type: 'item_completed',\n item: {\n type: 'AgentMessage',\n content: [{ type: 'Text', text: 'Waiting for the user now' }],\n },\n },\n }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Waiting for the user now');\n expect(session.lastPayloadType).toBe('agent_message');\n expect(determineStatus(session)).toBe(AgentStatus.WAITING);\n });\n\n it('should handle malformed JSON lines gracefully', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'malformed.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-m', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n 'not valid json',\n '{\"incomplete\": true',\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: 'Valid message' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session).not.toBeNull();\n expect(session.sessionId).toBe('sess-m');\n expect(session.summary).toBe('Valid message');\n });\n\n it('should default summary when no messages found', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'no-msg.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-3', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'token_count' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Codex session active');\n });\n\n it('should return null for empty content', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n expect(parseSession('', '/fake/path.jsonl')).toBeNull();\n expect(parseSession(' \\n \\n ', '/fake/path.jsonl')).toBeNull();\n });\n\n it('should truncate long summary to 120 chars', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const longMsg = 'A'.repeat(200);\n const content = [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-t', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: longMsg } }),\n ].join('\\n');\n\n const session = parseSession(content, '/fake/path.jsonl');\n expect(session.summary).toHaveLength(120);\n expect(session.summary.endsWith('...')).toBe(true);\n });\n });\n });\n\n describe('getConversation', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-conv-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeJsonl(lines: object[]): string {\n const filePath = path.join(tmpDir, 'session.jsonl');\n fs.writeFileSync(filePath, lines.map(l => JSON.stringify(l)).join('\\n'));\n return filePath;\n }\n\n it('should parse user and agent messages', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Fix the bug' } },\n { type: 'event', timestamp: '2026-03-27T10:00:05Z', payload: { type: 'agent_message', message: 'I found the issue' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n expect(messages[0]).toEqual({ role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' });\n expect(messages[1]).toEqual({ role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' });\n });\n\n it('should parse Codex response_item message records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:01Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: 'Fix the bug' }],\n },\n },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'I found the issue' }],\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n expect(messages[0]).toEqual({ role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' });\n expect(messages[1]).toEqual({ role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' });\n });\n\n it('should parse completed Codex AgentMessage event records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'item_completed',\n item: {\n type: 'AgentMessage',\n content: [{ type: 'Text', text: 'I found the issue' }],\n },\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([\n { role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' },\n ]);\n });\n\n it('should not duplicate mirrored current Codex message records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:01Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: 'Fix the bug' }],\n internal_chat_message_metadata_passthrough: { turn_id: 'turn-1' },\n },\n },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:01.001Z',\n payload: {\n type: 'item_completed',\n turn_id: 'turn-1',\n item: {\n type: 'UserMessage',\n content: [{ type: 'text', text: 'Fix the bug' }],\n },\n },\n },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'item_completed',\n turn_id: 'turn-1',\n item: {\n type: 'AgentMessage',\n id: 'msg-1',\n content: [{ type: 'Text', text: 'I found the issue' }],\n },\n },\n },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:05.005Z',\n payload: {\n type: 'message',\n id: 'msg-1',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'I found the issue' }],\n internal_chat_message_metadata_passthrough: { turn_id: 'turn-1' },\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([\n { role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' },\n { role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05.005Z' },\n ]);\n });\n\n it('should skip session_meta entry', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('user');\n });\n\n it('should map task_complete to assistant role', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:05Z', payload: { type: 'task_complete', message: 'Task finished successfully' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('assistant');\n expect(messages[0].content).toBe('Task finished successfully');\n });\n\n it('should skip non-conversation types in default mode', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'exec_command', message: 'Running npm test' } },\n { type: 'event', timestamp: '2026-03-27T10:00:03Z', payload: { type: 'agent_message', message: 'Done' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n });\n\n it('should include non-conversation types as system in verbose mode', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'exec_command', message: 'Running npm test' } },\n ]);\n\n const messages = adapter.getConversation(filePath, { verbose: true });\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('system');\n expect(messages[0].content).toBe('Running npm test');\n });\n\n it('should handle malformed JSON lines gracefully', () => {\n const filePath = path.join(tmpDir, 'malformed.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } }),\n 'invalid json line',\n JSON.stringify({ type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } }),\n ].join('\\n'));\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n });\n\n it('should return empty array for missing file', () => {\n const messages = adapter.getConversation('/nonexistent/path.jsonl');\n expect(messages).toEqual([]);\n });\n\n it('should return empty array for empty file', () => {\n const filePath = path.join(tmpDir, 'empty.jsonl');\n fs.writeFileSync(filePath, '');\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([]);\n });\n\n it('should skip entries with empty payload message', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: '' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'agent_message', message: 'Response' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].content).toBe('Response');\n });\n });\n\n describe('listSessions', () => {\n let tmpDir: string;\n let sessionsDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-list-'));\n sessionsDir = path.join(tmpDir, 'sessions');\n fs.mkdirSync(sessionsDir, { recursive: true });\n (adapter as any).codexSessionsDir = sessionsDir;\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeCodexSession(dateDir: string, sessionId: string, lines: object[]): string {\n fs.mkdirSync(dateDir, { recursive: true });\n const filePath = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(filePath, lines.map((l) => JSON.stringify(l)).join('\\n'));\n return filePath;\n }\n\n it('returns empty when sessions dir does not exist', async () => {\n fs.rmSync(sessionsDir, { recursive: true, force: true });\n const result = await adapter.listSessions();\n expect(result).toEqual([]);\n });\n\n it('walks every YYYY/MM/DD dir and returns all sessions', async () => {\n const dayA = path.join(sessionsDir, '2025', '01', '01');\n const dayB = path.join(sessionsDir, '2025', '02', '03');\n writeCodexSession(dayA, 'sess-a', [\n { type: 'session_meta', payload: { id: 'sess-a', cwd: '/repo-a', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'msg-a' } },\n ]);\n writeCodexSession(dayB, 'sess-b', [\n { type: 'session_meta', payload: { id: 'sess-b', cwd: '/repo-b', timestamp: '2025-02-03T00:00:00Z' } },\n { type: 'event', timestamp: '2025-02-03T00:00:01Z', payload: { type: 'user_message', message: 'msg-b' } },\n ]);\n\n const result = await adapter.listSessions();\n\n expect(result).toHaveLength(2);\n const byId = Object.fromEntries(result.map((r) => [r.sessionId, r]));\n expect(byId['sess-a']).toMatchObject({\n type: 'codex',\n cwd: '/repo-a',\n firstUserMessage: 'msg-a',\n });\n expect(byId['sess-b']).toMatchObject({\n type: 'codex',\n cwd: '/repo-b',\n firstUserMessage: 'msg-b',\n });\n });\n\n it('applies strict-equality cwd filter against session_meta cwd', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 'keep', [\n { type: 'session_meta', payload: { id: 'keep', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'yes' } },\n ]);\n writeCodexSession(day, 'drop', [\n { type: 'session_meta', payload: { id: 'drop', cwd: '/other', timestamp: '2025-01-01T00:01:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:01:01Z', payload: { type: 'user_message', message: 'no' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe('keep');\n });\n\n it('skips files without a session_meta first line', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 'bad', [\n { type: 'event', timestamp: '2025-01-01T00:00:00Z', payload: { type: 'user_message', message: 'orphan' } },\n ]);\n writeCodexSession(day, 'good', [\n { type: 'session_meta', payload: { id: 'good', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'ok' } },\n ]);\n\n const result = await adapter.listSessions();\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe('good');\n });\n\n it('captures the first user_message as firstUserMessage', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 's', [\n { type: 'session_meta', payload: { id: 's', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'agent_message', message: 'preamble' } },\n { type: 'event', timestamp: '2025-01-01T00:00:02Z', payload: { type: 'user_message', message: 'first user' } },\n { type: 'event', timestamp: '2025-01-01T00:00:03Z', payload: { type: 'user_message', message: 'second user' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe('first user');\n });\n\n it('returns empty firstUserMessage when no user_message exists', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 's', [\n { type: 'session_meta', payload: { id: 's', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'agent_message', message: 'agent only' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe('');\n });\n });\n});\n"],"names":["fs","path","CodexAdapter","AgentStatus","AgentRegistry","listAgentProcesses","enrichProcesses","batchGetSessionFileBirthtimes","matchProcessesToSessions","generateAgentName","os","vi","mock","fn","actual","importActual","mockedListAgentProcesses","mockedEnrichProcesses","mockedBatchGetSessionFileBirthtimes","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","adapter","beforeEach","mockReset","mockImplementation","procs","cwd","pid","folder","basename","it","expect","type","toBe","canHandle","command","tty","useRealSessionMatcher","actualMatching","mockReturnValue","agents","detectAgents","toEqual","toHaveBeenCalledWith","processes","codexSessionsDir","toHaveLength","toMatchObject","status","RUNNING","projectPath","sessionId","summary","startTime","Date","tmpDir","mkdtempSync","join","tmpdir","sessionsDir","dateDir","mkdirSync","recursive","now","recentTs","toISOString","sessionFile","writeFileSync","JSON","stringify","payload","id","timestamp","message","sessionFiles","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","matches","process","session","deltaMs","rmSync","force","processStart","sessionTimestamp","lateBirthtime","calls","each","undefined","_label","metaTimestamp","fileBirthtime","String","getFullYear","getMonth","padStart","getDate","matched","find","a","unmatched","collectAllSpy","spyOn","not","toHaveBeenCalled","sessionFilePath","mockRestore","toHaveBeenCalledOnce","findSpy","toBeUndefined","originalHome","env","HOME","tmpHome","mappedAdapter","mappingPath","dirname","badSessionFile","fallbackSessionFile","fallbackSession","arrayContaining","objectContaining","regPath","registry","cachedAdapter","registerEntry","over","register","name","tmuxSession","startedAt","afterEach","discoverSessions","bind","sessions","mockFiles","contentCache","has","toHaveBeenCalledTimes","day","dirs","malformedFile","missingFile","result","writeResumeSession","findSessionFileById","stat","statSync","toBeNull","determineStatus","lastActive","lastPayloadType","WAITING","IDLE","parseSession","sessionStart","content","role","text","item","longMsg","repeat","endsWith","writeJsonl","lines","map","l","messages","getConversation","internal_chat_message_metadata_passthrough","turn_id","verbose","writeCodexSession","listSessions","dayA","dayB","byId","Object","fromEntries","r","firstUserMessage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/adapters/CodexAdapter.test.ts"],"sourcesContent":["/**\n * Tests for CodexAdapter\n */\n\nimport type { MockedFunction } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { CodexAdapter } from '../../adapters/CodexAdapter.js';\nimport type { ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { AgentRegistry, type RegistryEntry } from '../../utils/AgentRegistry.js';\nimport { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from '../../utils/process.js';\nimport { batchGetSessionFileBirthtimes } from '../../utils/session.js';\nimport type { SessionFile } from '../../utils/session.js';\nimport { matchProcessesToSessions, generateAgentName } from '../../utils/matching.js';\nimport type { MatchResult } from '../../utils/matching.js';\nimport * as os from 'os';\n\nvi.mock('../../utils/process.js', async (importOriginal) => {\n const actual = await importOriginal() as typeof import('../../utils/process.js');\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock('../../utils/session.js', async () => {\n const actual = await vi.importActual('../../utils/session') as typeof import('../../utils/session');\n return {\n ...actual,\n batchGetSessionFileBirthtimes: vi.fn(),\n };\n});\n\nvi.mock('../../utils/matching.js', () => ({\n matchProcessesToSessions: vi.fn(),\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<typeof captureProcessSnapshot>;\nconst mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<typeof batchGetSessionFileBirthtimes>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<typeof matchProcessesToSessions>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe('CodexAdapter', () => {\n let adapter: CodexAdapter;\n\n beforeEach(() => {\n adapter = new CodexAdapter();\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedBatchGetSessionFileBirthtimes.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n // Default: enrichProcesses returns what it receives\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) => (\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name)))\n ));\n // Default: generateAgentName returns \"folder (pid)\"\n mockedGenerateAgentName.mockImplementation((cwd, pid) => {\n const folder = path.basename(cwd) || 'unknown';\n return `${folder} (${pid})`;\n });\n });\n\n describe('initialization', () => {\n it('should expose codex type', () => {\n expect(adapter.type).toBe('codex');\n });\n });\n\n describe('canHandle', () => {\n it('should return true for codex commands', () => {\n expect(adapter.canHandle({ pid: 1, command: 'codex', cwd: '/repo', tty: 'ttys001' })).toBe(true);\n });\n\n it('should return true for codex with full path (case-insensitive)', () => {\n expect(adapter.canHandle({\n pid: 2,\n command: '/usr/local/bin/CODEX --sandbox workspace-write',\n cwd: '/repo',\n tty: 'ttys002',\n })).toBe(true);\n });\n\n it('should return false for non-codex processes', () => {\n expect(adapter.canHandle({ pid: 3, command: 'node app.js', cwd: '/repo', tty: 'ttys003' })).toBe(false);\n });\n\n it('should return false for processes with \"codex\" only in path arguments', () => {\n expect(adapter.canHandle({\n pid: 4,\n command: 'node /worktrees/feature-codex-adapter-agent-manager-package/node_modules/nx/src/daemon/server/start.js',\n cwd: '/repo',\n tty: 'ttys004',\n })).toBe(false);\n });\n });\n\n describe('detectAgents', () => {\n async function useRealSessionMatcher(): Promise<void> {\n const actualMatching = await vi.importActual<typeof import('../../utils/matching.js')>('../../utils/matching.js');\n mockedMatchProcessesToSessions.mockImplementation(actualMatching.matchProcessesToSessions);\n }\n\n it('should return empty list when no codex process is running', async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n expect(agents).toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith('codex');\n });\n\n it('should return process-only agents when no sessions discovered', async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001' },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // No sessions dir → discoverSessions returns []\n (adapter as any).codexSessionsDir = '/nonexistent/sessions';\n\n const agents = await adapter.detectAgents();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n status: AgentStatus.RUNNING,\n pid: 100,\n projectPath: '/repo-a',\n sessionId: 'pid-100',\n summary: 'Codex process running',\n });\n });\n\n it('should detect agents with matched sessions', async () => {\n const processes: ProcessInfo[] = [\n {\n pid: 100,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-03-18T15:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // Set up sessions dir with date directory\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n // Create session file with recent timestamps so status isn't idle\n const now = new Date();\n const recentTs = now.toISOString();\n const sessionFile = path.join(dateDir, 'sess-abc.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-abc', timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'Implement adapter flow' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n\n const sessionFiles: SessionFile[] = [\n {\n sessionId: 'sess-abc',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-03-18T15:00:05Z').getTime(),\n resolvedCwd: '',\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(sessionFiles);\n\n const matches: MatchResult[] = [\n {\n process: processes[0],\n session: { ...sessionFiles[0], resolvedCwd: '/repo-a' },\n deltaMs: 5000,\n },\n ];\n mockedMatchProcessesToSessions.mockReturnValue(matches);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n status: AgentStatus.RUNNING,\n pid: 100,\n projectPath: '/repo-a',\n sessionId: 'sess-abc',\n summary: 'Implement adapter flow',\n });\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match when session_meta timestamp and file birthtime both align with process start', async () => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const sessionTimestamp = '2026-03-18T15:00:05.000Z';\n const processes: ProcessInfo[] = [\n {\n pid: 101,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-aligned.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-aligned', timestamp: sessionTimestamp, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: sessionTimestamp, payload: { type: 'token_count', message: 'Aligned session' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-aligned',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date(sessionTimestamp).getTime(),\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 101,\n sessionId: 'sess-aligned',\n summary: 'Aligned session',\n });\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match late-created session files using session_meta timestamp', async () => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const sessionTimestamp = '2026-03-18T15:00:10.000Z';\n const lateBirthtime = new Date('2026-03-18T15:05:30.000Z').getTime();\n const processes: ProcessInfo[] = [\n {\n pid: 102,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-late.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-late', timestamp: sessionTimestamp, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: sessionTimestamp, payload: { type: 'token_count', message: 'Late file session' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-late',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: lateBirthtime,\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 102,\n sessionId: 'sess-late',\n summary: 'Late file session',\n });\n expect(mockedMatchProcessesToSessions.mock.calls[0][1][0].birthtimeMs).toBe(new Date(sessionTimestamp).getTime());\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it.each<[string, string | undefined]>([\n ['missing', undefined],\n ['invalid', 'not-a-date'],\n ])('should fall back to file birthtime when session_meta timestamp is %s', async (_label, metaTimestamp) => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const fileBirthtime = new Date('2026-03-18T15:00:20.000Z').getTime();\n const processes: ProcessInfo[] = [\n {\n pid: 103,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const payload: { id: string; cwd: string; timestamp?: string } = { id: `sess-${_label}`, cwd: '/repo-a' };\n if (metaTimestamp !== undefined) {\n payload.timestamp = metaTimestamp;\n }\n\n const sessionFile = path.join(dateDir, `sess-${_label}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:00:30.000Z', payload: { type: 'token_count', message: `${_label} timestamp session` } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: `sess-${_label}`,\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: fileBirthtime,\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe(`sess-${_label}`);\n expect(mockedMatchProcessesToSessions.mock.calls[0][1][0].birthtimeMs).toBe(fileBirthtime);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should fall back to process-only for unmatched processes', async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n { pid: 200, command: 'codex', cwd: '/repo-b', tty: 'ttys002', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const now = new Date();\n const dateDir = path.join(\n sessionsDir,\n String(now.getFullYear()),\n String(now.getMonth() + 1).padStart(2, '0'),\n String(now.getDate()).padStart(2, '0'),\n );\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'only-session.jsonl');\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'only-session', timestamp: now.toISOString(), cwd: '/repo-a' } }),\n );\n\n (adapter as any).codexSessionsDir = sessionsDir;\n\n const sessionFiles: SessionFile[] = [\n {\n sessionId: 'only-session',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: Date.now(),\n resolvedCwd: '',\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(sessionFiles);\n\n // Only process 100 matches\n const matches: MatchResult[] = [\n {\n process: processes[0],\n session: { ...sessionFiles[0], resolvedCwd: '/repo-a' },\n deltaMs: 5000,\n },\n ];\n mockedMatchProcessesToSessions.mockReturnValue(matches);\n\n const agents = await adapter.detectAgents();\n expect(agents).toHaveLength(2);\n\n const matched = agents.find((a) => a.pid === 100);\n const unmatched = agents.find((a) => a.pid === 200);\n expect(matched?.sessionId).toBe('only-session');\n expect(unmatched?.sessionId).toBe('pid-200');\n expect(unmatched?.status).toBe(AgentStatus.RUNNING);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match resumed sessions by id even when the JSONL predates the process', async () => {\n const sessionId = '019eabed-4079-7071-9531-b853ddd9914e';\n const processes: ProcessInfo[] = [\n {\n pid: 88018,\n command: `codex resume ${sessionId}`,\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T12:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '09');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const recentTs = new Date().toISOString();\n const sessionFile = path.join(dateDir, `rollout-2026-06-09T12-28-33-${sessionId}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: sessionId, timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'resumed codex conversation' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n const collectAllSpy = vi.spyOn(adapter as any, 'collectAllSessionFiles');\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(collectAllSpy).not.toHaveBeenCalled();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 88018,\n sessionId,\n projectPath: '/repo-a',\n sessionFilePath: sessionFile,\n });\n expect(agents[0].summary).toBe('resumed codex conversation');\n } finally {\n collectAllSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should fall back to all session files for non-time-sortable resume ids', async () => {\n const sessionId = 'aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee';\n const processes: ProcessInfo[] = [\n {\n pid: 88020,\n command: `codex resume ${sessionId}`,\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T12:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-v4-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '01', '02');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const recentTs = new Date().toISOString();\n const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: sessionId, timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'legacy id conversation' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n const collectAllSpy = vi.spyOn(adapter as any, 'collectAllSessionFiles');\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(collectAllSpy).toHaveBeenCalledOnce();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 88020,\n sessionId,\n sessionFilePath: sessionFile,\n });\n } finally {\n collectAllSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should fall back to process-only when a resumed session becomes unreadable after direct matching', async () => {\n const sessionId = '019eabed-4079-7071-9531-b853ddd9914e';\n const processes: ProcessInfo[] = [\n {\n pid: 88019,\n command: `codex resume ${sessionId}`,\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T12:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-gone-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '09');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, `rollout-2026-06-09T12-28-33-${sessionId}.jsonl`);\n\n (adapter as any).codexSessionsDir = sessionsDir;\n const findSpy = vi.spyOn(adapter as any, 'findSessionFileById').mockReturnValue({\n sessionId,\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: Date.now(),\n resolvedCwd: '/repo-a',\n });\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 88019,\n sessionId: 'pid-88019',\n projectPath: '/repo-a',\n });\n expect(agents[0].sessionFilePath).toBeUndefined();\n } finally {\n findSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should map a running Codex process from the hook session mapping', async () => {\n const originalHome = process.env.HOME;\n const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-mapping-'));\n process.env.HOME = tmpHome;\n\n try {\n const mappedAdapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n const sessionsDir = path.join(tmpHome, '.codex', 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '26');\n const mappingPath = path.join(tmpHome, '.codex', 'ai-devkit', 'sessions.json');\n const sessionFile = path.join(dateDir, 'rollout-2026-06-26T09-56-12-sess-mapped.jsonl');\n const recentTs = new Date().toISOString();\n\n fs.mkdirSync(dateDir, { recursive: true });\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-mapped', timestamp: recentTs, cwd: '/repo-mapped' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'mapped conversation' } }),\n ].join('\\n'));\n fs.writeFileSync(mappingPath, JSON.stringify({ 5151: sessionFile }));\n\n const processes: ProcessInfo[] = [\n {\n pid: 5151,\n command: 'codex',\n cwd: '/repo-mapped',\n tty: 'ttys001',\n startTime: new Date('2026-06-26T09:56:12.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 5151,\n sessionId: 'sess-mapped',\n projectPath: '/repo-mapped',\n summary: 'mapped conversation',\n sessionFilePath: sessionFile,\n });\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n } finally {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n }\n });\n\n it('should fall back to legacy matching when mapped session file cannot be parsed', async () => {\n const originalHome = process.env.HOME;\n const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-mapping-fallback-'));\n process.env.HOME = tmpHome;\n\n try {\n const mappedAdapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n const sessionsDir = path.join(tmpHome, '.codex', 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '26');\n const mappingPath = path.join(tmpHome, '.codex', 'ai-devkit', 'sessions.json');\n const badSessionFile = path.join(dateDir, 'bad.jsonl');\n const fallbackSessionFile = path.join(dateDir, 'fallback.jsonl');\n const recentTs = new Date().toISOString();\n\n fs.mkdirSync(dateDir, { recursive: true });\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(badSessionFile, '{not-json');\n fs.writeFileSync(fallbackSessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-fallback', timestamp: recentTs, cwd: '/repo-fallback' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'fallback conversation' } }),\n ].join('\\n'));\n fs.writeFileSync(mappingPath, JSON.stringify({ 6161: badSessionFile }));\n\n const processes: ProcessInfo[] = [\n {\n pid: 6161,\n command: 'codex',\n cwd: '/repo-fallback',\n tty: 'ttys001',\n startTime: new Date('2026-06-26T09:56:12.000Z'),\n },\n ];\n const fallbackSession: SessionFile = {\n sessionId: 'sess-fallback',\n filePath: fallbackSessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-06-26T09:56:15.000Z').getTime(),\n resolvedCwd: '',\n };\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([fallbackSession]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: processes[0],\n session: { ...fallbackSession, resolvedCwd: '/repo-fallback' },\n deltaMs: 3000,\n },\n ]);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 6161,\n sessionId: 'sess-fallback',\n summary: 'fallback conversation',\n sessionFilePath: fallbackSessionFile,\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledWith(\n [processes[0]],\n expect.arrayContaining([expect.objectContaining({ filePath: fallbackSessionFile })]),\n );\n } finally {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n }\n });\n });\n\n describe('detectAgents — registry cache short-circuit', () => {\n let tmpDir: string;\n let regPath: string;\n let registry: AgentRegistry;\n let cachedAdapter: CodexAdapter;\n let sessionFilePath: string;\n\n function registerEntry(over: Partial<RegistryEntry> = {}): void {\n registry.register({\n name: 'codex-100',\n type: 'codex',\n pid: 100,\n tmuxSession: '',\n cwd: '/repo-a',\n startedAt: '2026-05-30T00:00:00.000Z',\n sessionId: 'sess-cached',\n sessionFilePath,\n ...over,\n });\n }\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-cache-'));\n regPath = path.join(tmpDir, 'agents.json');\n registry = new AgentRegistry(regPath);\n cachedAdapter = new CodexAdapter(registry);\n\n const recentTs = new Date().toISOString();\n sessionFilePath = path.join(tmpDir, 'sess-cached.jsonl');\n fs.writeFileSync(sessionFilePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-cached', timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'Hello from cache' } }),\n ].join('\\n'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('short-circuits matching when registry has a valid entry', async () => {\n registerEntry();\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 100,\n sessionId: 'sess-cached',\n sessionFilePath,\n summary: 'Hello from cache',\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n });\n\n it('falls through when no registry entry exists for the pid', async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n });\n\n it('falls through when registry entry type does not match', async () => {\n registerEntry({ type: 'claude' });\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it('falls through when the cached session file no longer exists', async () => {\n registerEntry({ sessionFilePath: path.join(tmpDir, 'deleted.jsonl') });\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n });\n });\n\n describe('discoverSessions', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should return empty when sessions dir does not exist', () => {\n (adapter as any).codexSessionsDir = path.join(tmpDir, 'nonexistent');\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const { sessions } = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date() },\n ]);\n expect(sessions).toEqual([]);\n });\n\n it('should scan date directories based on process start times', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n // Create date dir for 2026-03-18\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n // Create session file with meta\n const sessionFile = path.join(dateDir, 'sess1.jsonl');\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess1', cwd: '/repo-a' } }),\n );\n\n const mockFiles: SessionFile[] = [\n {\n sessionId: 'sess1',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: 1710800324000,\n resolvedCwd: '',\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(mockFiles);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo-a', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n const { sessions, contentCache } = discoverSessions(processes);\n expect(sessions).toHaveLength(1);\n expect(sessions[0].resolvedCwd).toBe('/repo-a');\n expect(contentCache.has(sessionFile)).toBe(true);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n });\n\n it('should scan ±1 day window around process start time', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n // Create date dirs for 17, 18, 19\n for (const day of ['17', '18', '19']) {\n fs.mkdirSync(path.join(sessionsDir, '2026', '03', day), { recursive: true });\n }\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n discoverSessions(processes);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n // Should scan all 3 date dirs\n const dirs = mockedBatchGetSessionFileBirthtimes.mock.calls[0][0] as string[];\n expect(dirs).toHaveLength(3);\n });\n\n it('should handle session files without session_meta', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'bad.jsonl');\n fs.writeFileSync(sessionFile, JSON.stringify({ type: 'event', payload: {} }));\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n { sessionId: 'bad', filePath: sessionFile, projectDir: dateDir, birthtimeMs: 1710800324000, resolvedCwd: '' },\n ]);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n const { sessions } = discoverSessions(processes);\n expect(sessions[0].resolvedCwd).toBe('');\n });\n\n it('should use session_meta timestamp as the matching birthtime when valid', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-meta-time.jsonl');\n const metaTimestamp = '2026-03-18T15:00:05.000Z';\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-meta-time', timestamp: metaTimestamp, cwd: '/repo-a' } }),\n );\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-meta-time',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-03-18T15:05:30.000Z').getTime(),\n resolvedCwd: '',\n },\n ]);\n\n const { sessions } = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo-a', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ]);\n\n expect(sessions[0].resolvedCwd).toBe('/repo-a');\n expect(sessions[0].birthtimeMs).toBe(new Date(metaTimestamp).getTime());\n });\n\n it('should tolerate malformed session_meta and unreadable files', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const malformedFile = path.join(dateDir, 'malformed.jsonl');\n const missingFile = path.join(dateDir, 'missing.jsonl');\n fs.writeFileSync(malformedFile, '{not valid json');\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'malformed',\n filePath: malformedFile,\n projectDir: dateDir,\n birthtimeMs: 1710800324000,\n resolvedCwd: '',\n },\n {\n sessionId: 'missing',\n filePath: missingFile,\n projectDir: dateDir,\n birthtimeMs: 1710800325000,\n resolvedCwd: '',\n },\n ]);\n\n const result = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ]);\n\n expect(result.sessions).toHaveLength(2);\n expect(result.sessions[0].resolvedCwd).toBe('');\n expect(result.sessions[1].resolvedCwd).toBe('');\n expect(result.contentCache.has(malformedFile)).toBe(true);\n expect(result.contentCache.has(missingFile)).toBe(false);\n });\n });\n\n describe('findSessionFileById', () => {\n let tmpDir: string;\n let sessionsDir: string;\n const sessionId = 'aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee';\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-find-'));\n sessionsDir = path.join(tmpDir, 'sessions');\n fs.mkdirSync(path.join(sessionsDir, '2026', '03', '18'), { recursive: true });\n (adapter as any).codexSessionsDir = sessionsDir;\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeResumeSession(timestamp?: string): string {\n const filePath = path.join(sessionsDir, '2026', '03', '18', `${sessionId}.jsonl`);\n const payload: { id: string; cwd: string; timestamp?: string } = { id: sessionId, cwd: '/repo-a' };\n if (timestamp !== undefined) {\n payload.timestamp = timestamp;\n }\n fs.writeFileSync(filePath, JSON.stringify({ type: 'session_meta', payload }));\n return filePath;\n }\n\n it('should return session_meta timestamp as birthtimeMs when valid', () => {\n const metaTimestamp = '2026-03-18T15:00:05.000Z';\n writeResumeSession(metaTimestamp);\n const findSessionFileById = (adapter as any).findSessionFileById.bind(adapter);\n\n const session = findSessionFileById(sessionId);\n\n expect(session).toMatchObject({\n sessionId,\n resolvedCwd: '/repo-a',\n birthtimeMs: new Date(metaTimestamp).getTime(),\n });\n });\n\n it.each<[string, string | undefined]>([\n ['missing', undefined],\n ['invalid', 'not-a-date'],\n ])('should fall back to stat birthtimeMs when session_meta timestamp is %s', (_label, metaTimestamp) => {\n const sessionFile = writeResumeSession(metaTimestamp);\n const stat = fs.statSync(sessionFile);\n const findSessionFileById = (adapter as any).findSessionFileById.bind(adapter);\n\n const session = findSessionFileById(sessionId);\n\n expect(session).not.toBeNull();\n expect(session.birthtimeMs).toBe(stat.birthtimeMs);\n });\n });\n\n describe('helper methods', () => {\n describe('determineStatus', () => {\n it('should return \"waiting\" for agent_message events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'agent_message',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"waiting\" for task_complete events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'task_complete',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"waiting\" for turn_aborted events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'turn_aborted',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"running\" for active events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'token_count',\n })).toBe(AgentStatus.RUNNING);\n });\n\n it('should return \"idle\" when session exceeds threshold', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(Date.now() - 10 * 60 * 1000),\n lastPayloadType: 'token_count',\n })).toBe(AgentStatus.IDLE);\n });\n });\n\n describe('parseSession', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should parse session file with meta and events', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'session.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-1', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_reasoning', message: 'Working on feature' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session).toMatchObject({\n sessionId: 'sess-1',\n projectPath: '/repo',\n summary: 'Working on feature',\n lastPayloadType: 'agent_reasoning',\n });\n expect(session.sessionStart.toISOString()).toBe('2026-03-18T15:00:00.000Z');\n });\n\n it('should parse from cached content without reading disk', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const content = [\n JSON.stringify({ type: 'session_meta', payload: { id: 'cached-1', timestamp: '2026-03-18T15:00:00Z', cwd: '/cached' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: 'Cached result' } }),\n ].join('\\n');\n\n const session = parseSession(content, '/nonexistent/path.jsonl');\n expect(session).toMatchObject({\n sessionId: 'cached-1',\n projectPath: '/cached',\n summary: 'Cached result',\n });\n });\n\n it('should return null for non-existent file', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n expect(parseSession(undefined, path.join(tmpDir, 'nonexistent.jsonl'))).toBeNull();\n });\n\n it('should return null when first line is not session_meta', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'bad.jsonl');\n fs.writeFileSync(filePath, JSON.stringify({ type: 'event', payload: {} }));\n expect(parseSession(undefined, filePath)).toBeNull();\n });\n\n it('should return null when session_meta has no id', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'no-id.jsonl');\n fs.writeFileSync(filePath, JSON.stringify({ type: 'session_meta', payload: { cwd: '/repo' } }));\n expect(parseSession(undefined, filePath)).toBeNull();\n });\n\n it('should extract summary from last event message', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'summary.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-2', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_reasoning', message: 'First message' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:02:00Z', payload: { type: 'agent_message', message: 'Last message' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Last message');\n });\n\n it('should extract summary from current Codex response_item messages', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'response-item-summary.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-ri', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({\n type: 'response_item',\n timestamp: '2026-03-18T15:01:00Z',\n payload: {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'Parsed from current schema' }],\n },\n }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Parsed from current schema');\n expect(session.lastPayloadType).toBe('agent_message');\n });\n\n it('should treat completed Codex AgentMessage events as waiting for list status', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n const filePath = path.join(tmpDir, 'agent-message-status.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-am', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({\n type: 'event_msg',\n timestamp: new Date().toISOString(),\n payload: {\n type: 'item_completed',\n item: {\n type: 'AgentMessage',\n content: [{ type: 'Text', text: 'Waiting for the user now' }],\n },\n },\n }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Waiting for the user now');\n expect(session.lastPayloadType).toBe('agent_message');\n expect(determineStatus(session)).toBe(AgentStatus.WAITING);\n });\n\n it('should handle malformed JSON lines gracefully', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'malformed.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-m', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n 'not valid json',\n '{\"incomplete\": true',\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: 'Valid message' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session).not.toBeNull();\n expect(session.sessionId).toBe('sess-m');\n expect(session.summary).toBe('Valid message');\n });\n\n it('should default summary when no messages found', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'no-msg.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-3', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'token_count' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Codex session active');\n });\n\n it('should return null for empty content', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n expect(parseSession('', '/fake/path.jsonl')).toBeNull();\n expect(parseSession(' \\n \\n ', '/fake/path.jsonl')).toBeNull();\n });\n\n it('should truncate long summary to 120 chars', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const longMsg = 'A'.repeat(200);\n const content = [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-t', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: longMsg } }),\n ].join('\\n');\n\n const session = parseSession(content, '/fake/path.jsonl');\n expect(session.summary).toHaveLength(120);\n expect(session.summary.endsWith('...')).toBe(true);\n });\n });\n });\n\n describe('getConversation', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-conv-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeJsonl(lines: object[]): string {\n const filePath = path.join(tmpDir, 'session.jsonl');\n fs.writeFileSync(filePath, lines.map(l => JSON.stringify(l)).join('\\n'));\n return filePath;\n }\n\n it('should parse user and agent messages', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Fix the bug' } },\n { type: 'event', timestamp: '2026-03-27T10:00:05Z', payload: { type: 'agent_message', message: 'I found the issue' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n expect(messages[0]).toEqual({ role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' });\n expect(messages[1]).toEqual({ role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' });\n });\n\n it('should parse Codex response_item message records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:01Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: 'Fix the bug' }],\n },\n },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'I found the issue' }],\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n expect(messages[0]).toEqual({ role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' });\n expect(messages[1]).toEqual({ role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' });\n });\n\n it('should parse completed Codex AgentMessage event records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'item_completed',\n item: {\n type: 'AgentMessage',\n content: [{ type: 'Text', text: 'I found the issue' }],\n },\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([\n { role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' },\n ]);\n });\n\n it('should not duplicate mirrored current Codex message records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:01Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: 'Fix the bug' }],\n internal_chat_message_metadata_passthrough: { turn_id: 'turn-1' },\n },\n },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:01.001Z',\n payload: {\n type: 'item_completed',\n turn_id: 'turn-1',\n item: {\n type: 'UserMessage',\n content: [{ type: 'text', text: 'Fix the bug' }],\n },\n },\n },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'item_completed',\n turn_id: 'turn-1',\n item: {\n type: 'AgentMessage',\n id: 'msg-1',\n content: [{ type: 'Text', text: 'I found the issue' }],\n },\n },\n },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:05.005Z',\n payload: {\n type: 'message',\n id: 'msg-1',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'I found the issue' }],\n internal_chat_message_metadata_passthrough: { turn_id: 'turn-1' },\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([\n { role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' },\n { role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05.005Z' },\n ]);\n });\n\n it('should skip session_meta entry', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('user');\n });\n\n it('should map task_complete to assistant role', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:05Z', payload: { type: 'task_complete', message: 'Task finished successfully' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('assistant');\n expect(messages[0].content).toBe('Task finished successfully');\n });\n\n it('should skip non-conversation types in default mode', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'exec_command', message: 'Running npm test' } },\n { type: 'event', timestamp: '2026-03-27T10:00:03Z', payload: { type: 'agent_message', message: 'Done' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n });\n\n it('should include non-conversation types as system in verbose mode', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'exec_command', message: 'Running npm test' } },\n ]);\n\n const messages = adapter.getConversation(filePath, { verbose: true });\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('system');\n expect(messages[0].content).toBe('Running npm test');\n });\n\n it('should handle malformed JSON lines gracefully', () => {\n const filePath = path.join(tmpDir, 'malformed.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } }),\n 'invalid json line',\n JSON.stringify({ type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } }),\n ].join('\\n'));\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n });\n\n it('should return empty array for missing file', () => {\n const messages = adapter.getConversation('/nonexistent/path.jsonl');\n expect(messages).toEqual([]);\n });\n\n it('should return empty array for empty file', () => {\n const filePath = path.join(tmpDir, 'empty.jsonl');\n fs.writeFileSync(filePath, '');\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([]);\n });\n\n it('should skip entries with empty payload message', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: '' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'agent_message', message: 'Response' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].content).toBe('Response');\n });\n });\n\n describe('listSessions', () => {\n let tmpDir: string;\n let sessionsDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-list-'));\n sessionsDir = path.join(tmpDir, 'sessions');\n fs.mkdirSync(sessionsDir, { recursive: true });\n (adapter as any).codexSessionsDir = sessionsDir;\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeCodexSession(dateDir: string, sessionId: string, lines: object[]): string {\n fs.mkdirSync(dateDir, { recursive: true });\n const filePath = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(filePath, lines.map((l) => JSON.stringify(l)).join('\\n'));\n return filePath;\n }\n\n it('returns empty when sessions dir does not exist', async () => {\n fs.rmSync(sessionsDir, { recursive: true, force: true });\n const result = await adapter.listSessions();\n expect(result).toEqual([]);\n });\n\n it('walks every YYYY/MM/DD dir and returns all sessions', async () => {\n const dayA = path.join(sessionsDir, '2025', '01', '01');\n const dayB = path.join(sessionsDir, '2025', '02', '03');\n writeCodexSession(dayA, 'sess-a', [\n { type: 'session_meta', payload: { id: 'sess-a', cwd: '/repo-a', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'msg-a' } },\n ]);\n writeCodexSession(dayB, 'sess-b', [\n { type: 'session_meta', payload: { id: 'sess-b', cwd: '/repo-b', timestamp: '2025-02-03T00:00:00Z' } },\n { type: 'event', timestamp: '2025-02-03T00:00:01Z', payload: { type: 'user_message', message: 'msg-b' } },\n ]);\n\n const result = await adapter.listSessions();\n\n expect(result).toHaveLength(2);\n const byId = Object.fromEntries(result.map((r) => [r.sessionId, r]));\n expect(byId['sess-a']).toMatchObject({\n type: 'codex',\n cwd: '/repo-a',\n firstUserMessage: 'msg-a',\n });\n expect(byId['sess-b']).toMatchObject({\n type: 'codex',\n cwd: '/repo-b',\n firstUserMessage: 'msg-b',\n });\n });\n\n it('applies strict-equality cwd filter against session_meta cwd', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 'keep', [\n { type: 'session_meta', payload: { id: 'keep', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'yes' } },\n ]);\n writeCodexSession(day, 'drop', [\n { type: 'session_meta', payload: { id: 'drop', cwd: '/other', timestamp: '2025-01-01T00:01:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:01:01Z', payload: { type: 'user_message', message: 'no' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe('keep');\n });\n\n it('skips files without a session_meta first line', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 'bad', [\n { type: 'event', timestamp: '2025-01-01T00:00:00Z', payload: { type: 'user_message', message: 'orphan' } },\n ]);\n writeCodexSession(day, 'good', [\n { type: 'session_meta', payload: { id: 'good', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'ok' } },\n ]);\n\n const result = await adapter.listSessions();\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe('good');\n });\n\n it('captures the first user_message as firstUserMessage', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 's', [\n { type: 'session_meta', payload: { id: 's', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'agent_message', message: 'preamble' } },\n { type: 'event', timestamp: '2025-01-01T00:00:02Z', payload: { type: 'user_message', message: 'first user' } },\n { type: 'event', timestamp: '2025-01-01T00:00:03Z', payload: { type: 'user_message', message: 'second user' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe('first user');\n });\n\n it('returns empty firstUserMessage when no user_message exists', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 's', [\n { type: 'session_meta', payload: { id: 's', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'agent_message', message: 'agent only' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe('');\n });\n });\n});\n"],"names":["fs","path","CodexAdapter","AgentStatus","AgentRegistry","listAgentProcesses","enrichProcesses","captureProcessSnapshot","batchGetSessionFileBirthtimes","matchProcessesToSessions","generateAgentName","os","vi","mock","importOriginal","actual","fn","importActual","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedBatchGetSessionFileBirthtimes","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","adapter","beforeEach","mockReset","mockImplementation","procs","names","flatMap","name","cwd","pid","folder","basename","it","expect","type","toBe","canHandle","command","tty","useRealSessionMatcher","actualMatching","mockReturnValue","agents","detectAgents","toEqual","toHaveBeenCalledWith","processes","codexSessionsDir","toHaveLength","toMatchObject","status","RUNNING","projectPath","sessionId","summary","startTime","Date","tmpDir","mkdtempSync","join","tmpdir","sessionsDir","dateDir","mkdirSync","recursive","now","recentTs","toISOString","sessionFile","writeFileSync","JSON","stringify","payload","id","timestamp","message","sessionFiles","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","matches","process","session","deltaMs","rmSync","force","processStart","sessionTimestamp","lateBirthtime","calls","each","undefined","_label","metaTimestamp","fileBirthtime","String","getFullYear","getMonth","padStart","getDate","matched","find","a","unmatched","collectAllSpy","spyOn","not","toHaveBeenCalled","sessionFilePath","mockRestore","toHaveBeenCalledOnce","findSpy","toBeUndefined","originalHome","env","HOME","tmpHome","mappedAdapter","mappingPath","dirname","badSessionFile","fallbackSessionFile","fallbackSession","arrayContaining","objectContaining","regPath","registry","cachedAdapter","registerEntry","over","register","tmuxSession","startedAt","afterEach","discoverSessions","bind","sessions","mockFiles","contentCache","has","toHaveBeenCalledTimes","day","dirs","malformedFile","missingFile","result","writeResumeSession","findSessionFileById","stat","statSync","toBeNull","determineStatus","lastActive","lastPayloadType","WAITING","IDLE","parseSession","sessionStart","content","role","text","item","longMsg","repeat","endsWith","writeJsonl","lines","map","l","messages","getConversation","internal_chat_message_metadata_passthrough","turn_id","verbose","writeCodexSession","listSessions","dayA","dayB","byId","Object","fromEntries","r","firstUserMessage"],"mappings":"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"}
|