@ai-devkit/agent-manager 0.34.0 → 0.36.0

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.
Files changed (211) hide show
  1. package/dist/AgentManager.d.ts +2 -0
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +25 -0
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +74 -0
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/AntigravityCliAdapter.test.js +381 -0
  8. package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +1 -0
  9. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +28 -0
  10. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
  11. package/dist/__tests__/adapters/CodexAdapter.test.js +7 -0
  12. package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/KiroAdapter.test.js +607 -0
  14. package/dist/__tests__/adapters/KiroAdapter.test.js.map +1 -0
  15. package/dist/__tests__/capacity/claude.test.js +485 -0
  16. package/dist/__tests__/capacity/claude.test.js.map +1 -0
  17. package/dist/__tests__/capacity/openai.test.js +672 -0
  18. package/dist/__tests__/capacity/openai.test.js.map +1 -0
  19. package/dist/__tests__/capacity/wham.test.js +144 -0
  20. package/dist/__tests__/capacity/wham.test.js.map +1 -0
  21. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +18 -0
  22. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +1 -1
  23. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +36 -0
  24. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +1 -1
  25. package/dist/__tests__/providers/grok/GrokAgentMapper.test.js +56 -0
  26. package/dist/__tests__/providers/grok/GrokAgentMapper.test.js.map +1 -0
  27. package/dist/__tests__/{adapters → providers/grok}/GrokCliAdapter.test.js +19 -6
  28. package/dist/__tests__/providers/grok/GrokCliAdapter.test.js.map +1 -0
  29. package/dist/__tests__/providers/grok/GrokSessionLocator.test.js +133 -0
  30. package/dist/__tests__/providers/grok/GrokSessionLocator.test.js.map +1 -0
  31. package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js +24 -0
  32. package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js.map +1 -1
  33. package/dist/__tests__/providers/pi/PiAdapter.test.js +30 -0
  34. package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -1
  35. package/dist/__tests__/utils/agents.test.js +6 -0
  36. package/dist/__tests__/utils/agents.test.js.map +1 -1
  37. package/dist/__tests__/utils/session.test.js +18 -1
  38. package/dist/__tests__/utils/session.test.js.map +1 -1
  39. package/dist/adapters/AgentAdapter.d.ts +9 -1
  40. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  41. package/dist/adapters/AgentAdapter.js.map +1 -1
  42. package/dist/adapters/AntigravityCliAdapter.d.ts +57 -0
  43. package/dist/adapters/AntigravityCliAdapter.d.ts.map +1 -0
  44. package/dist/adapters/AntigravityCliAdapter.js +273 -0
  45. package/dist/adapters/AntigravityCliAdapter.js.map +1 -0
  46. package/dist/adapters/KiroAdapter.d.ts +46 -0
  47. package/dist/adapters/KiroAdapter.d.ts.map +1 -0
  48. package/dist/adapters/KiroAdapter.js +344 -0
  49. package/dist/adapters/KiroAdapter.js.map +1 -0
  50. package/dist/adapters/index.d.ts +3 -1
  51. package/dist/adapters/index.d.ts.map +1 -1
  52. package/dist/adapters/index.js +3 -1
  53. package/dist/adapters/index.js.map +1 -1
  54. package/dist/capacity/claude.d.ts +17 -0
  55. package/dist/capacity/claude.d.ts.map +1 -0
  56. package/dist/capacity/claude.js +271 -0
  57. package/dist/capacity/claude.js.map +1 -0
  58. package/dist/capacity/codex.d.ts +1 -2
  59. package/dist/capacity/codex.d.ts.map +1 -1
  60. package/dist/capacity/codex.js +5 -47
  61. package/dist/capacity/codex.js.map +1 -1
  62. package/dist/capacity/index.d.ts +11 -0
  63. package/dist/capacity/index.d.ts.map +1 -1
  64. package/dist/capacity/index.js +17 -0
  65. package/dist/capacity/index.js.map +1 -1
  66. package/dist/capacity/openai.d.ts +48 -0
  67. package/dist/capacity/openai.d.ts.map +1 -0
  68. package/dist/capacity/openai.js +312 -0
  69. package/dist/capacity/openai.js.map +1 -0
  70. package/dist/capacity/wham.d.ts +16 -0
  71. package/dist/capacity/wham.d.ts.map +1 -0
  72. package/dist/capacity/wham.js +66 -0
  73. package/dist/capacity/wham.js.map +1 -0
  74. package/dist/index.d.ts +5 -3
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +4 -2
  77. package/dist/index.js.map +1 -1
  78. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +2 -0
  79. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  80. package/dist/providers/claude/ClaudeCodeAdapter.js +22 -19
  81. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  82. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -0
  83. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  84. package/dist/providers/claude/ClaudeSessionLocator.js +18 -1
  85. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  86. package/dist/providers/codex/CodexAdapter.d.ts +1 -0
  87. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -1
  88. package/dist/providers/codex/CodexAdapter.js +8 -0
  89. package/dist/providers/codex/CodexAdapter.js.map +1 -1
  90. package/dist/providers/copilot/CopilotAdapter.d.ts +2 -0
  91. package/dist/providers/copilot/CopilotAdapter.d.ts.map +1 -1
  92. package/dist/providers/copilot/CopilotAdapter.js +24 -9
  93. package/dist/providers/copilot/CopilotAdapter.js.map +1 -1
  94. package/dist/providers/copilot/CopilotSessionLocator.d.ts +1 -0
  95. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +1 -1
  96. package/dist/providers/copilot/CopilotSessionLocator.js +9 -1
  97. package/dist/providers/copilot/CopilotSessionLocator.js.map +1 -1
  98. package/dist/providers/gemini/GeminiCliAdapter.d.ts +1 -0
  99. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +1 -1
  100. package/dist/providers/gemini/GeminiCliAdapter.js +9 -0
  101. package/dist/providers/gemini/GeminiCliAdapter.js.map +1 -1
  102. package/dist/providers/grok/GrokAgentMapper.d.ts +14 -0
  103. package/dist/providers/grok/GrokAgentMapper.d.ts.map +1 -0
  104. package/dist/providers/grok/GrokAgentMapper.js +36 -0
  105. package/dist/providers/grok/GrokAgentMapper.js.map +1 -0
  106. package/dist/providers/grok/GrokCliAdapter.d.ts +36 -0
  107. package/dist/providers/grok/GrokCliAdapter.d.ts.map +1 -0
  108. package/dist/providers/grok/GrokCliAdapter.js +98 -0
  109. package/dist/providers/grok/GrokCliAdapter.js.map +1 -0
  110. package/dist/providers/grok/GrokSessionLocator.d.ts +62 -0
  111. package/dist/providers/grok/GrokSessionLocator.d.ts.map +1 -0
  112. package/dist/providers/grok/GrokSessionLocator.js +140 -0
  113. package/dist/providers/grok/GrokSessionLocator.js.map +1 -0
  114. package/dist/providers/grok/GrokSessionParser.d.ts +54 -0
  115. package/dist/providers/grok/GrokSessionParser.d.ts.map +1 -0
  116. package/dist/providers/grok/GrokSessionParser.js +122 -0
  117. package/dist/providers/grok/GrokSessionParser.js.map +1 -0
  118. package/dist/providers/opencode/OpenCodeAdapter.d.ts +1 -0
  119. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +1 -1
  120. package/dist/providers/opencode/OpenCodeAdapter.js +3 -0
  121. package/dist/providers/opencode/OpenCodeAdapter.js.map +1 -1
  122. package/dist/providers/opencode/OpenCodeSessionLocator.d.ts +2 -0
  123. package/dist/providers/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  124. package/dist/providers/opencode/OpenCodeSessionLocator.js +31 -12
  125. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +1 -1
  126. package/dist/providers/pi/PiAdapter.d.ts +1 -0
  127. package/dist/providers/pi/PiAdapter.d.ts.map +1 -1
  128. package/dist/providers/pi/PiAdapter.js +10 -0
  129. package/dist/providers/pi/PiAdapter.js.map +1 -1
  130. package/dist/providers/pi/PiSessionLocator.d.ts +1 -0
  131. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -1
  132. package/dist/providers/pi/PiSessionLocator.js +8 -1
  133. package/dist/providers/pi/PiSessionLocator.js.map +1 -1
  134. package/dist/readiness/AgentReadiness.d.ts +1 -1
  135. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  136. package/dist/readiness/AgentReadiness.js.map +1 -1
  137. package/dist/runtime/ManagedAgentRuntime.js +3 -1
  138. package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
  139. package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
  140. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
  141. package/dist/utils/agents.d.ts +1 -1
  142. package/dist/utils/agents.d.ts.map +1 -1
  143. package/dist/utils/agents.js +11 -0
  144. package/dist/utils/agents.js.map +1 -1
  145. package/dist/utils/session.d.ts +2 -0
  146. package/dist/utils/session.d.ts.map +1 -1
  147. package/dist/utils/session.js +3 -0
  148. package/dist/utils/session.js.map +1 -1
  149. package/package.json +1 -1
  150. package/src/AgentManager.ts +34 -0
  151. package/src/__tests__/AgentManager.test.ts +60 -0
  152. package/src/__tests__/adapters/AntigravityCliAdapter.test.ts +324 -0
  153. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +23 -0
  154. package/src/__tests__/adapters/CodexAdapter.test.ts +7 -0
  155. package/src/__tests__/adapters/KiroAdapter.test.ts +534 -0
  156. package/src/__tests__/capacity/claude.test.ts +467 -0
  157. package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
  158. package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
  159. package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
  160. package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
  161. package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
  162. package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
  163. package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
  164. package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
  165. package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
  166. package/src/__tests__/capacity/openai.test.ts +570 -0
  167. package/src/__tests__/capacity/wham.test.ts +104 -0
  168. package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +12 -0
  169. package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +21 -0
  170. package/src/__tests__/providers/grok/GrokAgentMapper.test.ts +57 -0
  171. package/src/__tests__/{adapters → providers/grok}/GrokCliAdapter.test.ts +18 -9
  172. package/src/__tests__/providers/grok/GrokSessionLocator.test.ts +106 -0
  173. package/src/__tests__/providers/opencode/OpenCodeAdapter.test.ts +18 -0
  174. package/src/__tests__/providers/pi/PiAdapter.test.ts +15 -0
  175. package/src/__tests__/utils/agents.test.ts +7 -0
  176. package/src/__tests__/utils/session.test.ts +11 -1
  177. package/src/adapters/AgentAdapter.ts +11 -0
  178. package/src/adapters/AntigravityCliAdapter.ts +356 -0
  179. package/src/adapters/KiroAdapter.ts +456 -0
  180. package/src/adapters/index.ts +3 -1
  181. package/src/capacity/claude.ts +313 -0
  182. package/src/capacity/codex.ts +25 -134
  183. package/src/capacity/index.ts +33 -4
  184. package/src/capacity/openai.ts +361 -0
  185. package/src/capacity/wham.ts +84 -0
  186. package/src/index.ts +11 -2
  187. package/src/providers/claude/ClaudeCodeAdapter.ts +28 -23
  188. package/src/providers/claude/ClaudeSessionLocator.ts +20 -0
  189. package/src/providers/codex/CodexAdapter.ts +8 -0
  190. package/src/providers/copilot/CopilotAdapter.ts +26 -10
  191. package/src/providers/copilot/CopilotSessionLocator.ts +7 -1
  192. package/src/providers/gemini/GeminiCliAdapter.ts +8 -0
  193. package/src/providers/grok/GrokAgentMapper.ts +41 -0
  194. package/src/providers/grok/GrokCliAdapter.ts +125 -0
  195. package/src/providers/grok/GrokSessionLocator.ts +179 -0
  196. package/src/providers/grok/GrokSessionParser.ts +166 -0
  197. package/src/providers/opencode/OpenCodeAdapter.ts +4 -0
  198. package/src/providers/opencode/OpenCodeSessionLocator.ts +43 -15
  199. package/src/providers/pi/PiAdapter.ts +12 -0
  200. package/src/providers/pi/PiSessionLocator.ts +16 -1
  201. package/src/readiness/AgentReadiness.ts +4 -1
  202. package/src/runtime/ManagedAgentRuntime.ts +2 -0
  203. package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
  204. package/src/utils/agents.ts +11 -1
  205. package/src/utils/session.ts +11 -0
  206. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +0 -1
  207. package/dist/adapters/GrokCliAdapter.d.ts +0 -80
  208. package/dist/adapters/GrokCliAdapter.d.ts.map +0 -1
  209. package/dist/adapters/GrokCliAdapter.js +0 -310
  210. package/dist/adapters/GrokCliAdapter.js.map +0 -1
  211. package/src/adapters/GrokCliAdapter.ts +0 -408
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__tests__/adapters/CodexAdapter.test.ts"],"sourcesContent":["import type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { CodexAdapter } from \"../../providers/codex/CodexAdapter.js\";\nimport { AgentStatus, type ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentRegistry, type RegistryEntry } from \"../../utils/AgentRegistry.js\";\nimport { batchGetSessionFileBirthtimes, type SessionFile } from \"../../utils/session.js\";\nimport {\n captureProcessSnapshot,\n enrichProcesses,\n listAgentProcesses,\n} from \"../../utils/process.js\";\nimport {\n generateAgentName,\n matchProcessesToSessions,\n type MatchResult,\n} from \"../../utils/matching.js\";\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(\n \"../../utils/session\",\n )) 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<\n typeof captureProcessSnapshot\n>;\nconst mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<\n typeof batchGetSessionFileBirthtimes\n>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<\n typeof matchProcessesToSessions\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe(\"CodexAdapter\", () => {\n let originalHome: string | undefined;\n let tmpHome: string;\n let adapter: CodexAdapter;\n\n beforeEach(() => {\n originalHome = process.env.HOME;\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-adapter-\"));\n process.env.HOME = tmpHome;\n\n adapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, \"agents.json\")));\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedBatchGetSessionFileBirthtimes.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n\n mockedEnrichProcesses.mockImplementation((processes) => processes);\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation(\n (cwd, pid) => `${path.basename(cwd) || \"unknown\"} (${pid})`,\n );\n });\n\n afterEach(() => {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n it(\"exposes codex type and handles Codex executable names only\", () => {\n expect(adapter.type).toBe(\"codex\");\n expect(adapter.canHandle({ pid: 1, command: \"codex\", cwd: \"/repo\", tty: \"ttys001\" })).toBe(\n true,\n );\n expect(\n adapter.canHandle({\n pid: 2,\n command: \"/usr/local/bin/CODEX --sandbox workspace-write\",\n cwd: \"/repo\",\n tty: \"ttys002\",\n }),\n ).toBe(true);\n expect(\n adapter.canHandle({ pid: 3, command: \"node app.js\", cwd: \"/repo\", tty: \"ttys003\" }),\n ).toBe(false);\n expect(\n adapter.canHandle({\n pid: 4,\n command: \"node /worktrees/feature-codex-adapter-agent-manager-package/server.js\",\n cwd: \"/repo\",\n tty: \"ttys004\",\n }),\n ).toBe(false);\n });\n\n it(\"returns no agents when no Codex process is running\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n await expect(adapter.detectAgents()).resolves.toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith(\"codex\");\n });\n\n it(\"returns process-only agents when no session files are discovered\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"codex\", cwd: \"/repo-a\", tty: \"ttys001\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n\n await expect(adapter.detectAgents()).resolves.toMatchObject([\n {\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\n it(\"maps a running Codex process through legacy session matching\", async () => {\n const processInfo: ProcessInfo = {\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 const { sessionFile, dateDir } = writeSession(\"sess-abc\", \"/repo-a\", [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"token_count\", message: \"Implement adapter flow\" },\n },\n ]);\n const candidate: SessionFile = {\n sessionId: \"sess-abc\",\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date(\"2026-03-18T15:00:05Z\").getTime(),\n resolvedCwd: \"\",\n };\n const matches: MatchResult[] = [\n { process: processInfo, session: { ...candidate, resolvedCwd: \"/repo-a\" }, deltaMs: 5000 },\n ];\n\n mockedListAgentProcesses.mockReturnValue([processInfo]);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([candidate]);\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\n it(\"maps resumed sessions directly by id\", async () => {\n const sessionId = \"019eabed-4079-7071-9531-b853ddd9914e\";\n const processInfo: ProcessInfo = {\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 const { sessionFile } = writeSession(\n sessionId,\n \"/repo-a\",\n [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"resumed codex conversation\" },\n },\n ],\n \"2026/06/09\",\n );\n\n mockedListAgentProcesses.mockReturnValue([processInfo]);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).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 summary: \"resumed codex conversation\",\n });\n });\n\n it(\"uses hook session mapping before a stale registry entry for the same pid\", async () => {\n const registry = new AgentRegistry(path.join(tmpHome, \"agents.json\"));\n const staleSession = path.join(tmpHome, \"stale.jsonl\");\n fs.writeFileSync(\n staleSession,\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"stale\", timestamp: new Date().toISOString(), cwd: \"/repo-stale\" },\n }),\n JSON.stringify({\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"stale\" },\n }),\n ].join(\"\\n\"),\n );\n registry.register(registryEntry({ sessionFilePath: staleSession }));\n\n const mappedAdapter = new CodexAdapter(registry);\n const { sessionFile } = writeSession(\n \"current\",\n \"/repo-current\",\n [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"Hello from current mapping\" },\n },\n ],\n \"2026/06/26\",\n );\n fs.mkdirSync(path.join(tmpHome, \".codex\", \"ai-devkit\"), { recursive: true });\n fs.writeFileSync(\n path.join(tmpHome, \".codex\", \"ai-devkit\", \"sessions.json\"),\n JSON.stringify({ 100: sessionFile }),\n );\n\n mockedListAgentProcesses.mockReturnValue([\n { pid: 100, command: \"codex\", cwd: \"/repo-current\", tty: \"ttys001\", startTime: new Date() },\n ]);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 100,\n sessionId: \"current\",\n sessionFilePath: sessionFile,\n summary: \"Hello from current mapping\",\n });\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it(\"uses a valid registry cache entry before scanning sessions\", async () => {\n const registry = new AgentRegistry(path.join(tmpHome, \"agents.json\"));\n const { sessionFile } = writeSession(\"cached\", \"/repo-a\", [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"token_count\", message: \"Hello from cache\" },\n },\n ]);\n registry.register(registryEntry({ sessionId: \"cached\", sessionFilePath: sessionFile }));\n\n const cachedAdapter = new CodexAdapter(registry);\n mockedListAgentProcesses.mockReturnValue([\n { pid: 100, command: \"codex\", cwd: \"/repo-a\", tty: \"ttys001\", startTime: new Date() },\n ]);\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: \"cached\",\n sessionFilePath: sessionFile,\n summary: \"Hello from cache\",\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n });\n\n it(\"delegates conversation parsing and historical session listing\", async () => {\n const { sessionFile } = writeSession(\n \"listed\",\n \"/repo\",\n [\n {\n type: \"event\",\n timestamp: \"2025-01-01T00:00:01Z\",\n payload: { type: \"user_message\", message: \"first user\" },\n },\n {\n type: \"event\",\n timestamp: \"2025-01-01T00:00:02Z\",\n payload: { type: \"agent_message\", message: \"answer\" },\n },\n ],\n \"2025/01/01\",\n );\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: \"user\", content: \"first user\", timestamp: \"2025-01-01T00:00:01Z\" },\n { role: \"assistant\", content: \"answer\", timestamp: \"2025-01-01T00:00:02Z\" },\n ]);\n await expect(adapter.listSessions({ cwd: \"/repo\" })).resolves.toMatchObject([\n {\n type: \"codex\",\n sessionId: \"listed\",\n cwd: \"/repo\",\n firstUserMessage: \"first user\",\n sessionFilePath: sessionFile,\n },\n ]);\n });\n\n function writeSession(\n sessionId: string,\n cwd: string,\n entries: object[],\n day = \"2026/03/18\",\n ): { sessionFile: string; dateDir: string } {\n const dateDir = path.join(tmpHome, \".codex\", \"sessions\", ...day.split(\"/\"));\n fs.mkdirSync(dateDir, { recursive: true });\n const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n sessionFile,\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: sessionId, timestamp: \"2026-03-18T15:00:00Z\", cwd },\n }),\n ...entries.map((entry) => JSON.stringify(entry)),\n ].join(\"\\n\"),\n );\n return { sessionFile, dateDir };\n }\n\n function registryEntry(overrides: Partial<RegistryEntry> = {}): RegistryEntry {\n return {\n name: \"codex-100\",\n type: \"codex\",\n pid: 100,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/repo-a\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"cached\",\n sessionFilePath: \"\",\n ...overrides,\n };\n }\n});\n"],"names":["fs","os","path","CodexAdapter","AgentStatus","AgentRegistry","batchGetSessionFileBirthtimes","captureProcessSnapshot","enrichProcesses","listAgentProcesses","generateAgentName","matchProcessesToSessions","vi","mock","importOriginal","actual","fn","importActual","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedBatchGetSessionFileBirthtimes","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","originalHome","tmpHome","adapter","beforeEach","process","env","HOME","mkdtempSync","join","tmpdir","mockReset","mockImplementation","processes","names","flatMap","name","cwd","pid","basename","afterEach","rmSync","recursive","force","it","expect","type","toBe","canHandle","command","tty","mockReturnValue","detectAgents","resolves","toEqual","toHaveBeenCalledWith","toMatchObject","status","RUNNING","projectPath","sessionId","summary","processInfo","startTime","Date","sessionFile","dateDir","writeSession","timestamp","toISOString","payload","message","candidate","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","matches","session","deltaMs","agents","toHaveLength","not","toHaveBeenCalled","sessionFilePath","registry","staleSession","writeFileSync","JSON","stringify","id","register","registryEntry","mappedAdapter","mkdirSync","cachedAdapter","getConversation","role","content","listSessions","firstUserMessage","entries","day","split","map","entry","overrides","runtime","runtimeRef","startedAt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/__tests__/adapters/CodexAdapter.test.ts"],"sourcesContent":["import type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { CodexAdapter } from \"../../providers/codex/CodexAdapter.js\";\nimport { AgentStatus, type ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentRegistry, type RegistryEntry } from \"../../utils/AgentRegistry.js\";\nimport { batchGetSessionFileBirthtimes, type SessionFile } from \"../../utils/session.js\";\nimport {\n captureProcessSnapshot,\n enrichProcesses,\n listAgentProcesses,\n} from \"../../utils/process.js\";\nimport {\n generateAgentName,\n matchProcessesToSessions,\n type MatchResult,\n} from \"../../utils/matching.js\";\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(\n \"../../utils/session\",\n )) 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<\n typeof captureProcessSnapshot\n>;\nconst mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<\n typeof batchGetSessionFileBirthtimes\n>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<\n typeof matchProcessesToSessions\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe(\"CodexAdapter\", () => {\n let originalHome: string | undefined;\n let tmpHome: string;\n let adapter: CodexAdapter;\n\n beforeEach(() => {\n originalHome = process.env.HOME;\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-adapter-\"));\n process.env.HOME = tmpHome;\n\n adapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, \"agents.json\")));\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedBatchGetSessionFileBirthtimes.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n\n mockedEnrichProcesses.mockImplementation((processes) => processes);\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation(\n (cwd, pid) => `${path.basename(cwd) || \"unknown\"} (${pid})`,\n );\n });\n\n afterEach(() => {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n it(\"exposes codex type and handles Codex executable names only\", () => {\n expect(adapter.type).toBe(\"codex\");\n expect(adapter.canHandle({ pid: 1, command: \"codex\", cwd: \"/repo\", tty: \"ttys001\" })).toBe(\n true,\n );\n expect(\n adapter.canHandle({\n pid: 2,\n command: \"/usr/local/bin/CODEX --sandbox workspace-write\",\n cwd: \"/repo\",\n tty: \"ttys002\",\n }),\n ).toBe(true);\n expect(\n adapter.canHandle({ pid: 3, command: \"node app.js\", cwd: \"/repo\", tty: \"ttys003\" }),\n ).toBe(false);\n expect(\n adapter.canHandle({\n pid: 4,\n command: \"node /worktrees/feature-codex-adapter-agent-manager-package/server.js\",\n cwd: \"/repo\",\n tty: \"ttys004\",\n }),\n ).toBe(false);\n });\n\n it(\"returns no agents when no Codex process is running\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n await expect(adapter.detectAgents()).resolves.toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith(\"codex\");\n });\n\n it(\"returns process-only agents when no session files are discovered\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"codex\", cwd: \"/repo-a\", tty: \"ttys001\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n\n await expect(adapter.detectAgents()).resolves.toMatchObject([\n {\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\n it(\"maps a running Codex process through legacy session matching\", async () => {\n const processInfo: ProcessInfo = {\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 const { sessionFile, dateDir } = writeSession(\"sess-abc\", \"/repo-a\", [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"token_count\", message: \"Implement adapter flow\" },\n },\n ]);\n const candidate: SessionFile = {\n sessionId: \"sess-abc\",\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date(\"2026-03-18T15:00:05Z\").getTime(),\n resolvedCwd: \"\",\n };\n const matches: MatchResult[] = [\n { process: processInfo, session: { ...candidate, resolvedCwd: \"/repo-a\" }, deltaMs: 5000 },\n ];\n\n mockedListAgentProcesses.mockReturnValue([processInfo]);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([candidate]);\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\n it(\"maps resumed sessions directly by id\", async () => {\n const sessionId = \"019eabed-4079-7071-9531-b853ddd9914e\";\n const processInfo: ProcessInfo = {\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 const { sessionFile } = writeSession(\n sessionId,\n \"/repo-a\",\n [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"resumed codex conversation\" },\n },\n ],\n \"2026/06/09\",\n );\n\n mockedListAgentProcesses.mockReturnValue([processInfo]);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).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 summary: \"resumed codex conversation\",\n });\n });\n\n it(\"uses hook session mapping before a stale registry entry for the same pid\", async () => {\n const registry = new AgentRegistry(path.join(tmpHome, \"agents.json\"));\n const staleSession = path.join(tmpHome, \"stale.jsonl\");\n fs.writeFileSync(\n staleSession,\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"stale\", timestamp: new Date().toISOString(), cwd: \"/repo-stale\" },\n }),\n JSON.stringify({\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"stale\" },\n }),\n ].join(\"\\n\"),\n );\n registry.register(registryEntry({ sessionFilePath: staleSession }));\n\n const mappedAdapter = new CodexAdapter(registry);\n const { sessionFile } = writeSession(\n \"current\",\n \"/repo-current\",\n [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"Hello from current mapping\" },\n },\n ],\n \"2026/06/26\",\n );\n fs.mkdirSync(path.join(tmpHome, \".codex\", \"ai-devkit\"), { recursive: true });\n fs.writeFileSync(\n path.join(tmpHome, \".codex\", \"ai-devkit\", \"sessions.json\"),\n JSON.stringify({ 100: sessionFile }),\n );\n\n mockedListAgentProcesses.mockReturnValue([\n { pid: 100, command: \"codex\", cwd: \"/repo-current\", tty: \"ttys001\", startTime: new Date() },\n ]);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 100,\n sessionId: \"current\",\n sessionFilePath: sessionFile,\n summary: \"Hello from current mapping\",\n });\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it(\"uses a valid registry cache entry before scanning sessions\", async () => {\n const registry = new AgentRegistry(path.join(tmpHome, \"agents.json\"));\n const { sessionFile } = writeSession(\"cached\", \"/repo-a\", [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"token_count\", message: \"Hello from cache\" },\n },\n ]);\n registry.register(registryEntry({ sessionId: \"cached\", sessionFilePath: sessionFile }));\n\n const cachedAdapter = new CodexAdapter(registry);\n mockedListAgentProcesses.mockReturnValue([\n { pid: 100, command: \"codex\", cwd: \"/repo-a\", tty: \"ttys001\", startTime: new Date() },\n ]);\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: \"cached\",\n sessionFilePath: sessionFile,\n summary: \"Hello from cache\",\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n });\n\n it(\"delegates conversation parsing and historical session listing\", async () => {\n const { sessionFile } = writeSession(\n \"listed\",\n \"/repo\",\n [\n {\n type: \"event\",\n timestamp: \"2025-01-01T00:00:01Z\",\n payload: { type: \"user_message\", message: \"first user\" },\n },\n {\n type: \"event\",\n timestamp: \"2025-01-01T00:00:02Z\",\n payload: { type: \"agent_message\", message: \"answer\" },\n },\n ],\n \"2025/01/01\",\n );\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: \"user\", content: \"first user\", timestamp: \"2025-01-01T00:00:01Z\" },\n { role: \"assistant\", content: \"answer\", timestamp: \"2025-01-01T00:00:02Z\" },\n ]);\n await expect(adapter.listSessions({ cwd: \"/repo\" })).resolves.toMatchObject([\n {\n type: \"codex\",\n sessionId: \"listed\",\n cwd: \"/repo\",\n firstUserMessage: \"first user\",\n sessionFilePath: sessionFile,\n },\n ]);\n await expect(adapter.findSessionsById(\"listed\")).resolves.toMatchObject([\n {\n type: \"codex\",\n sessionId: \"listed\",\n sessionFilePath: sessionFile,\n },\n ]);\n });\n\n function writeSession(\n sessionId: string,\n cwd: string,\n entries: object[],\n day = \"2026/03/18\",\n ): { sessionFile: string; dateDir: string } {\n const dateDir = path.join(tmpHome, \".codex\", \"sessions\", ...day.split(\"/\"));\n fs.mkdirSync(dateDir, { recursive: true });\n const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n sessionFile,\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: sessionId, timestamp: \"2026-03-18T15:00:00Z\", cwd },\n }),\n ...entries.map((entry) => JSON.stringify(entry)),\n ].join(\"\\n\"),\n );\n return { sessionFile, dateDir };\n }\n\n function registryEntry(overrides: Partial<RegistryEntry> = {}): RegistryEntry {\n return {\n name: \"codex-100\",\n type: \"codex\",\n pid: 100,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/repo-a\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"cached\",\n sessionFilePath: \"\",\n ...overrides,\n };\n }\n});\n"],"names":["fs","os","path","CodexAdapter","AgentStatus","AgentRegistry","batchGetSessionFileBirthtimes","captureProcessSnapshot","enrichProcesses","listAgentProcesses","generateAgentName","matchProcessesToSessions","vi","mock","importOriginal","actual","fn","importActual","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedBatchGetSessionFileBirthtimes","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","originalHome","tmpHome","adapter","beforeEach","process","env","HOME","mkdtempSync","join","tmpdir","mockReset","mockImplementation","processes","names","flatMap","name","cwd","pid","basename","afterEach","rmSync","recursive","force","it","expect","type","toBe","canHandle","command","tty","mockReturnValue","detectAgents","resolves","toEqual","toHaveBeenCalledWith","toMatchObject","status","RUNNING","projectPath","sessionId","summary","processInfo","startTime","Date","sessionFile","dateDir","writeSession","timestamp","toISOString","payload","message","candidate","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","matches","session","deltaMs","agents","toHaveLength","not","toHaveBeenCalled","sessionFilePath","registry","staleSession","writeFileSync","JSON","stringify","id","register","registryEntry","mappedAdapter","mkdirSync","cachedAdapter","getConversation","role","content","listSessions","firstUserMessage","findSessionsById","entries","day","split","map","entry","overrides","runtime","runtimeRef","startedAt"],"mappings":"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"}