@ai-devkit/agent-manager 0.32.0 → 0.33.1

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 (572) hide show
  1. package/dist/AgentManager.d.ts +13 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +116 -84
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +623 -391
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
  8. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
  9. package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
  10. package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
  11. package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
  12. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +170 -169
  14. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
  15. package/dist/__tests__/capacity/codex.test.js +93 -93
  16. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  17. package/dist/__tests__/capacity/index.test.js +17 -17
  18. package/dist/__tests__/capacity/index.test.js.map +1 -1
  19. package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
  20. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
  21. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
  22. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
  23. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
  24. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
  25. package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
  26. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
  27. package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
  28. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
  29. package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
  30. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  31. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
  32. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  33. package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
  34. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  35. package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
  36. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  37. package/dist/__tests__/print/DurableAgent.test.js +9 -9
  38. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  39. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
  40. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
  41. package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
  42. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  43. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
  44. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
  45. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
  46. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
  47. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
  48. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
  49. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
  50. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
  51. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
  52. package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
  53. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +641 -0
  54. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +1 -0
  55. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +1398 -0
  56. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +1 -0
  57. package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
  58. package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
  59. package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
  60. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
  61. package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
  62. package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
  63. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
  64. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
  65. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
  66. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  67. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
  68. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
  69. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
  70. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
  71. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
  72. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
  73. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
  74. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
  75. package/dist/__tests__/readiness/AgentReadiness.test.js +134 -134
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  77. package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
  78. package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
  79. package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js +164 -0
  80. package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js.map +1 -0
  81. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +488 -0
  82. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
  83. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
  84. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
  85. package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
  86. package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
  87. package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
  88. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  89. package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
  90. package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
  91. package/dist/__tests__/utils/AgentRegistry.test.js +343 -218
  92. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  93. package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
  94. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  95. package/dist/__tests__/utils/agent-requests.test.js +43 -43
  96. package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
  97. package/dist/__tests__/utils/agents.test.js +17 -17
  98. package/dist/__tests__/utils/agents.test.js.map +1 -1
  99. package/dist/__tests__/utils/matching.test.js +92 -92
  100. package/dist/__tests__/utils/matching.test.js.map +1 -1
  101. package/dist/__tests__/utils/process.test.js +108 -108
  102. package/dist/__tests__/utils/process.test.js.map +1 -1
  103. package/dist/__tests__/utils/session.test.js +53 -53
  104. package/dist/__tests__/utils/session.test.js.map +1 -1
  105. package/dist/adapters/AgentAdapter.d.ts +2 -2
  106. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  107. package/dist/adapters/AgentAdapter.js +1 -1
  108. package/dist/adapters/AgentAdapter.js.map +1 -1
  109. package/dist/adapters/GrokCliAdapter.d.ts +1 -1
  110. package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
  111. package/dist/adapters/GrokCliAdapter.js +80 -80
  112. package/dist/adapters/GrokCliAdapter.js.map +1 -1
  113. package/dist/adapters/OpenCodeAdapter.d.ts +2 -1
  114. package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
  115. package/dist/adapters/OpenCodeAdapter.js +41 -37
  116. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  117. package/dist/adapters/index.d.ts +9 -9
  118. package/dist/adapters/index.d.ts.map +1 -1
  119. package/dist/adapters/index.js +8 -8
  120. package/dist/adapters/index.js.map +1 -1
  121. package/dist/capacity/codex.d.ts +3 -3
  122. package/dist/capacity/codex.d.ts.map +1 -1
  123. package/dist/capacity/codex.js +57 -57
  124. package/dist/capacity/codex.js.map +1 -1
  125. package/dist/capacity/index.d.ts +3 -3
  126. package/dist/capacity/index.d.ts.map +1 -1
  127. package/dist/capacity/index.js +8 -8
  128. package/dist/capacity/index.js.map +1 -1
  129. package/dist/capacity/types.d.ts +1 -1
  130. package/dist/capacity/types.js.map +1 -1
  131. package/dist/database/connection.d.ts +1 -1
  132. package/dist/database/connection.d.ts.map +1 -1
  133. package/dist/database/connection.js +15 -15
  134. package/dist/database/connection.js.map +1 -1
  135. package/dist/database/index.d.ts +3 -3
  136. package/dist/database/index.d.ts.map +1 -1
  137. package/dist/database/index.js +2 -2
  138. package/dist/database/index.js.map +1 -1
  139. package/dist/database/migrations/005_agent_runtime.sql +2 -0
  140. package/dist/database/schema.d.ts +1 -1
  141. package/dist/database/schema.d.ts.map +1 -1
  142. package/dist/database/schema.js +7 -7
  143. package/dist/database/schema.js.map +1 -1
  144. package/dist/durable/DurableAgent.d.ts +9 -9
  145. package/dist/durable/DurableAgent.d.ts.map +1 -1
  146. package/dist/durable/DurableAgent.js +16 -16
  147. package/dist/durable/DurableAgent.js.map +1 -1
  148. package/dist/durable/DurableAgentRepository.d.ts +4 -4
  149. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  150. package/dist/durable/DurableAgentRepository.js +49 -48
  151. package/dist/durable/DurableAgentRepository.js.map +1 -1
  152. package/dist/durable/process.d.ts +1 -1
  153. package/dist/durable/process.d.ts.map +1 -1
  154. package/dist/durable/process.js +14 -14
  155. package/dist/durable/process.js.map +1 -1
  156. package/dist/durable/run.d.ts +2 -2
  157. package/dist/durable/run.d.ts.map +1 -1
  158. package/dist/durable/run.js +6 -6
  159. package/dist/durable/run.js.map +1 -1
  160. package/dist/durable/utils.d.ts +1 -1
  161. package/dist/durable/utils.d.ts.map +1 -1
  162. package/dist/durable/utils.js +4 -4
  163. package/dist/durable/utils.js.map +1 -1
  164. package/dist/index.d.ts +48 -43
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +28 -26
  167. package/dist/index.js.map +1 -1
  168. package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
  169. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
  170. package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
  171. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
  172. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
  173. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  174. package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
  175. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  176. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
  177. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  178. package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
  179. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  180. package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
  181. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
  182. package/dist/providers/claude/ClaudeSessionParser.js +99 -99
  183. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
  184. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  185. package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
  186. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
  187. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
  188. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  189. package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
  190. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
  191. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
  192. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  193. package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
  194. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
  195. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
  196. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  197. package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
  198. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
  199. package/dist/providers/codex/CodexAdapter.d.ts +27 -0
  200. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
  201. package/dist/providers/codex/CodexAdapter.js +162 -0
  202. package/dist/providers/codex/CodexAdapter.js.map +1 -0
  203. package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
  204. package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
  205. package/dist/providers/codex/CodexAgentMapper.js +35 -0
  206. package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
  207. package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
  208. package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
  209. package/dist/providers/codex/CodexSessionLocator.js +207 -0
  210. package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
  211. package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
  212. package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
  213. package/dist/providers/codex/CodexSessionMapping.js +68 -0
  214. package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
  215. package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
  216. package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
  217. package/dist/providers/codex/CodexSessionParser.js +262 -0
  218. package/dist/providers/codex/CodexSessionParser.js.map +1 -0
  219. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
  220. package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
  221. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
  222. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
  223. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  224. package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
  225. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
  226. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
  227. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  228. package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
  229. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
  230. package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
  231. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
  232. package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
  233. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
  234. package/dist/{adapters → providers/copilot}/CopilotAdapter.d.ts +11 -25
  235. package/dist/providers/copilot/CopilotAdapter.d.ts.map +1 -0
  236. package/dist/providers/copilot/CopilotAdapter.js +108 -0
  237. package/dist/providers/copilot/CopilotAdapter.js.map +1 -0
  238. package/dist/providers/copilot/CopilotAgentMapper.d.ts +9 -0
  239. package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +1 -0
  240. package/dist/providers/copilot/CopilotAgentMapper.js +37 -0
  241. package/dist/providers/copilot/CopilotAgentMapper.js.map +1 -0
  242. package/dist/providers/copilot/CopilotSessionLocator.d.ts +19 -0
  243. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +1 -0
  244. package/dist/providers/copilot/CopilotSessionLocator.js +41 -0
  245. package/dist/providers/copilot/CopilotSessionLocator.js.map +1 -0
  246. package/dist/providers/copilot/CopilotSessionParser.d.ts +30 -0
  247. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +1 -0
  248. package/dist/providers/copilot/CopilotSessionParser.js +181 -0
  249. package/dist/providers/copilot/CopilotSessionParser.js.map +1 -0
  250. package/dist/providers/gemini/GeminiAgentMapper.d.ts +9 -0
  251. package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +1 -0
  252. package/dist/providers/gemini/GeminiAgentMapper.js +37 -0
  253. package/dist/providers/gemini/GeminiAgentMapper.js.map +1 -0
  254. package/dist/providers/gemini/GeminiCliAdapter.d.ts +52 -0
  255. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +1 -0
  256. package/dist/providers/gemini/GeminiCliAdapter.js +188 -0
  257. package/dist/providers/gemini/GeminiCliAdapter.js.map +1 -0
  258. package/dist/providers/gemini/GeminiSessionLocator.d.ts +30 -0
  259. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +1 -0
  260. package/dist/providers/gemini/GeminiSessionLocator.js +142 -0
  261. package/dist/providers/gemini/GeminiSessionLocator.js.map +1 -0
  262. package/dist/providers/gemini/GeminiSessionParser.d.ts +94 -0
  263. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +1 -0
  264. package/dist/providers/gemini/GeminiSessionParser.js +166 -0
  265. package/dist/providers/gemini/GeminiSessionParser.js.map +1 -0
  266. package/dist/providers/pi/PiAdapter.d.ts +28 -0
  267. package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
  268. package/dist/providers/pi/PiAdapter.js +153 -0
  269. package/dist/providers/pi/PiAdapter.js.map +1 -0
  270. package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
  271. package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
  272. package/dist/providers/pi/PiAgentMapper.js +37 -0
  273. package/dist/providers/pi/PiAgentMapper.js.map +1 -0
  274. package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
  275. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
  276. package/dist/providers/pi/PiSessionLocator.js +79 -0
  277. package/dist/providers/pi/PiSessionLocator.js.map +1 -0
  278. package/dist/providers/pi/PiSessionParser.d.ts +36 -0
  279. package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
  280. package/dist/providers/pi/PiSessionParser.js +191 -0
  281. package/dist/providers/pi/PiSessionParser.js.map +1 -0
  282. package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
  283. package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
  284. package/dist/providers/pi/PiSessionTracker.js +69 -0
  285. package/dist/providers/pi/PiSessionTracker.js.map +1 -0
  286. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
  287. package/dist/providers/pi/durable/PiCliProbe.js +15 -15
  288. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
  289. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
  290. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  291. package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
  292. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
  293. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  294. package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
  295. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
  296. package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
  297. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
  298. package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
  299. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
  300. package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
  301. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
  302. package/dist/providers/pi/durable/PiStreamParser.js +16 -16
  303. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
  304. package/dist/readiness/AgentReadiness.d.ts +6 -6
  305. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  306. package/dist/readiness/AgentReadiness.js +130 -130
  307. package/dist/readiness/AgentReadiness.js.map +1 -1
  308. package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
  309. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
  310. package/dist/runtime/ManagedAgentRuntime.js +156 -0
  311. package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
  312. package/dist/runtime/RuntimeFactory.d.ts +4 -0
  313. package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
  314. package/dist/runtime/RuntimeFactory.js +11 -0
  315. package/dist/runtime/RuntimeFactory.js.map +1 -0
  316. package/dist/runtime/errors.d.ts +27 -0
  317. package/dist/runtime/errors.d.ts.map +1 -0
  318. package/dist/runtime/errors.js +42 -0
  319. package/dist/runtime/errors.js.map +1 -0
  320. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts +18 -0
  321. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -0
  322. package/dist/runtime/herdr/HerdrAgentDiscovery.js +183 -0
  323. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -0
  324. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +36 -0
  325. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
  326. package/dist/runtime/herdr/HerdrAgentRuntime.js +202 -0
  327. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
  328. package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
  329. package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
  330. package/dist/runtime/herdr/HerdrCliClient.js +60 -0
  331. package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
  332. package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
  333. package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
  334. package/dist/runtime/herdr/HerdrErrors.js +10 -0
  335. package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
  336. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +16 -0
  337. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
  338. package/dist/runtime/herdr/HerdrResponseParsers.js +107 -0
  339. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
  340. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
  341. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
  342. package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
  343. package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
  344. package/dist/runtime/tmux/PidPolling.d.ts +5 -0
  345. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
  346. package/dist/runtime/tmux/PidPolling.js +24 -0
  347. package/dist/runtime/tmux/PidPolling.js.map +1 -0
  348. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
  349. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
  350. package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
  351. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
  352. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
  353. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
  354. package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
  355. package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
  356. package/dist/runtime/types.d.ts +54 -0
  357. package/dist/runtime/types.d.ts.map +1 -0
  358. package/dist/runtime/types.js +3 -0
  359. package/dist/runtime/types.js.map +1 -0
  360. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  361. package/dist/terminal/TerminalFocusManager.js +50 -50
  362. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  363. package/dist/terminal/TmuxManager.d.ts.map +1 -1
  364. package/dist/terminal/TmuxManager.js +47 -47
  365. package/dist/terminal/TmuxManager.js.map +1 -1
  366. package/dist/terminal/TtyWriter.d.ts +1 -1
  367. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  368. package/dist/terminal/TtyWriter.js +89 -89
  369. package/dist/terminal/TtyWriter.js.map +1 -1
  370. package/dist/terminal/index.d.ts +4 -4
  371. package/dist/terminal/index.js +3 -3
  372. package/dist/terminal/index.js.map +1 -1
  373. package/dist/utils/AgentRegistry.d.ts +10 -2
  374. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  375. package/dist/utils/AgentRegistry.js +59 -26
  376. package/dist/utils/AgentRegistry.js.map +1 -1
  377. package/dist/utils/agent-requests.d.ts.map +1 -1
  378. package/dist/utils/agent-requests.js +5 -5
  379. package/dist/utils/agent-requests.js.map +1 -1
  380. package/dist/utils/agents.d.ts +2 -2
  381. package/dist/utils/agents.d.ts.map +1 -1
  382. package/dist/utils/agents.js +15 -15
  383. package/dist/utils/agents.js.map +1 -1
  384. package/dist/utils/applescript.js +1 -1
  385. package/dist/utils/applescript.js.map +1 -1
  386. package/dist/utils/index.d.ts +6 -6
  387. package/dist/utils/index.d.ts.map +1 -1
  388. package/dist/utils/index.js +4 -4
  389. package/dist/utils/index.js.map +1 -1
  390. package/dist/utils/matching.d.ts +2 -2
  391. package/dist/utils/matching.d.ts.map +1 -1
  392. package/dist/utils/matching.js +4 -4
  393. package/dist/utils/matching.js.map +1 -1
  394. package/dist/utils/process.d.ts +1 -1
  395. package/dist/utils/process.d.ts.map +1 -1
  396. package/dist/utils/process.js +74 -74
  397. package/dist/utils/process.js.map +1 -1
  398. package/dist/utils/session.d.ts +1 -1
  399. package/dist/utils/session.d.ts.map +1 -1
  400. package/dist/utils/session.js +7 -7
  401. package/dist/utils/session.js.map +1 -1
  402. package/dist/utils/sortAgents.d.ts +2 -2
  403. package/dist/utils/sortAgents.d.ts.map +1 -1
  404. package/dist/utils/sortAgents.js +5 -5
  405. package/dist/utils/sortAgents.js.map +1 -1
  406. package/package.json +18 -19
  407. package/src/AgentManager.ts +338 -274
  408. package/src/__tests__/AgentManager.test.ts +1143 -907
  409. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
  410. package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
  411. package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
  412. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +511 -455
  413. package/src/__tests__/capacity/codex.test.ts +178 -91
  414. package/src/__tests__/capacity/index.test.ts +27 -18
  415. package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
  416. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
  417. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
  418. package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
  419. package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
  420. package/src/__tests__/fixtures/fake-claude.cjs +20 -13
  421. package/src/__tests__/fixtures/fake-codex.cjs +41 -30
  422. package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
  423. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
  424. package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
  425. package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
  426. package/src/__tests__/print/DurableAgent.test.ts +19 -16
  427. package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
  428. package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
  429. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
  430. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
  431. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
  432. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
  433. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
  434. package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +602 -0
  435. package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +1299 -0
  436. package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
  437. package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
  438. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
  439. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
  440. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
  441. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
  442. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
  443. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
  444. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
  445. package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
  446. package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
  447. package/src/__tests__/runtime/HerdrAgentDiscovery.test.ts +131 -0
  448. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +377 -0
  449. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
  450. package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
  451. package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
  452. package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
  453. package/src/__tests__/utils/AgentRegistry.test.ts +516 -402
  454. package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
  455. package/src/__tests__/utils/agent-requests.test.ts +76 -56
  456. package/src/__tests__/utils/agents.test.ts +20 -20
  457. package/src/__tests__/utils/matching.test.ts +206 -171
  458. package/src/__tests__/utils/process.test.ts +276 -262
  459. package/src/__tests__/utils/session.test.ts +133 -139
  460. package/src/adapters/AgentAdapter.ts +134 -126
  461. package/src/adapters/GrokCliAdapter.ts +353 -342
  462. package/src/adapters/OpenCodeAdapter.ts +289 -259
  463. package/src/adapters/index.ts +15 -9
  464. package/src/capacity/codex.ts +137 -84
  465. package/src/capacity/index.ts +18 -13
  466. package/src/capacity/types.ts +1 -1
  467. package/src/database/connection.ts +73 -68
  468. package/src/database/index.ts +6 -6
  469. package/src/database/migrations/005_agent_runtime.sql +2 -0
  470. package/src/database/schema.ts +40 -38
  471. package/src/durable/DurableAgent.ts +85 -85
  472. package/src/durable/DurableAgentRepository.ts +409 -260
  473. package/src/durable/process.ts +22 -21
  474. package/src/durable/run.ts +61 -51
  475. package/src/durable/utils.ts +46 -41
  476. package/src/index.ts +151 -103
  477. package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
  478. package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
  479. package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
  480. package/src/providers/claude/ClaudeSessionParser.ts +322 -338
  481. package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
  482. package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
  483. package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
  484. package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
  485. package/src/providers/codex/CodexAdapter.ts +205 -0
  486. package/src/providers/codex/CodexAgentMapper.ts +35 -0
  487. package/src/providers/codex/CodexSessionLocator.ts +279 -0
  488. package/src/providers/codex/CodexSessionMapping.ts +89 -0
  489. package/src/providers/codex/CodexSessionParser.ts +385 -0
  490. package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
  491. package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
  492. package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
  493. package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
  494. package/src/providers/copilot/CopilotAdapter.ts +145 -0
  495. package/src/providers/copilot/CopilotAgentMapper.ts +36 -0
  496. package/src/providers/copilot/CopilotSessionLocator.ts +57 -0
  497. package/src/providers/copilot/CopilotSessionParser.ts +289 -0
  498. package/src/providers/gemini/GeminiAgentMapper.ts +36 -0
  499. package/src/providers/gemini/GeminiCliAdapter.ts +266 -0
  500. package/src/providers/gemini/GeminiSessionLocator.ts +183 -0
  501. package/src/providers/gemini/GeminiSessionParser.ts +271 -0
  502. package/src/providers/pi/PiAdapter.ts +183 -0
  503. package/src/providers/pi/PiAgentMapper.ts +36 -0
  504. package/src/providers/pi/PiSessionLocator.ts +95 -0
  505. package/src/providers/pi/PiSessionParser.ts +284 -0
  506. package/src/providers/pi/PiSessionTracker.ts +87 -0
  507. package/src/providers/pi/durable/PiCliProbe.ts +42 -34
  508. package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
  509. package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
  510. package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
  511. package/src/providers/pi/durable/PiStreamParser.ts +82 -72
  512. package/src/readiness/AgentReadiness.ts +585 -513
  513. package/src/runtime/ManagedAgentRuntime.ts +266 -0
  514. package/src/runtime/RuntimeFactory.ts +13 -0
  515. package/src/runtime/errors.ts +50 -0
  516. package/src/runtime/herdr/HerdrAgentDiscovery.ts +178 -0
  517. package/src/runtime/herdr/HerdrAgentRuntime.ts +216 -0
  518. package/src/runtime/herdr/HerdrCliClient.ts +78 -0
  519. package/src/runtime/herdr/HerdrErrors.ts +9 -0
  520. package/src/runtime/herdr/HerdrResponseParsers.ts +86 -0
  521. package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
  522. package/src/runtime/tmux/PidPolling.ts +34 -0
  523. package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
  524. package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
  525. package/src/runtime/types.ts +56 -0
  526. package/src/terminal/TerminalFocusManager.ts +215 -212
  527. package/src/terminal/TmuxManager.ts +99 -92
  528. package/src/terminal/TtyWriter.ts +203 -194
  529. package/src/terminal/index.ts +4 -4
  530. package/src/utils/AgentRegistry.ts +301 -238
  531. package/src/utils/agent-requests.ts +16 -16
  532. package/src/utils/agents.ts +41 -38
  533. package/src/utils/applescript.ts +4 -4
  534. package/src/utils/index.ts +12 -6
  535. package/src/utils/matching.ts +43 -43
  536. package/src/utils/process.ts +261 -258
  537. package/src/utils/session.ts +66 -66
  538. package/src/utils/sortAgents.ts +35 -33
  539. package/tsconfig.json +2 -8
  540. package/vitest.config.ts +16 -16
  541. package/.eslintrc.json +0 -31
  542. package/dist/__tests__/adapters/CopilotAdapter.test.js +0 -630
  543. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +0 -1
  544. package/dist/__tests__/adapters/GeminiCliAdapter.test.js +0 -1384
  545. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +0 -1
  546. package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
  547. package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
  548. package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
  549. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
  550. package/dist/adapters/CodexAdapter.d.ts +0 -109
  551. package/dist/adapters/CodexAdapter.d.ts.map +0 -1
  552. package/dist/adapters/CodexAdapter.js +0 -710
  553. package/dist/adapters/CodexAdapter.js.map +0 -1
  554. package/dist/adapters/CopilotAdapter.d.ts.map +0 -1
  555. package/dist/adapters/CopilotAdapter.js +0 -329
  556. package/dist/adapters/CopilotAdapter.js.map +0 -1
  557. package/dist/adapters/GeminiCliAdapter.d.ts +0 -98
  558. package/dist/adapters/GeminiCliAdapter.d.ts.map +0 -1
  559. package/dist/adapters/GeminiCliAdapter.js +0 -513
  560. package/dist/adapters/GeminiCliAdapter.js.map +0 -1
  561. package/dist/adapters/PiAdapter.d.ts +0 -63
  562. package/dist/adapters/PiAdapter.d.ts.map +0 -1
  563. package/dist/adapters/PiAdapter.js +0 -453
  564. package/dist/adapters/PiAdapter.js.map +0 -1
  565. package/src/__tests__/adapters/CopilotAdapter.test.ts +0 -510
  566. package/src/__tests__/adapters/GeminiCliAdapter.test.ts +0 -1259
  567. package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
  568. package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
  569. package/src/adapters/CodexAdapter.ts +0 -923
  570. package/src/adapters/CopilotAdapter.ts +0 -473
  571. package/src/adapters/GeminiCliAdapter.ts +0 -701
  572. package/src/adapters/PiAdapter.ts +0 -598
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/adapters/PiAdapter.test.ts"],"sourcesContent":["/**\n * Tests for PiAdapter\n */\n\nimport type { MockedFunction } from 'vitest';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport { PiAdapter } from '../../adapters/PiAdapter.js';\nimport type { ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { AgentRegistry } from '../../utils/AgentRegistry.js';\nimport { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from '../../utils/process.js';\nimport { matchProcessesToSessions, generateAgentName } 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/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 mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<typeof matchProcessesToSessions>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe('PiAdapter', () => {\n let adapter: PiAdapter;\n let tmpHome: string;\n let sessionsDir: string;\n\n beforeEach(() => {\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'pi-adapter-test-'));\n process.env.HOME = tmpHome;\n sessionsDir = path.join(tmpHome, '.pi', 'agent', 'sessions');\n fs.mkdirSync(sessionsDir, { recursive: true });\n\n adapter = new PiAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n\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 mockedMatchProcessesToSessions.mockReturnValue([]);\n mockedGenerateAgentName.mockImplementation((cwd: string, pid: number) => {\n const folder = path.basename(cwd) || 'unknown';\n return `${folder} (${pid})`;\n });\n });\n\n afterEach(() => {\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n it('exposes pi type', () => {\n expect(adapter.type).toBe('pi');\n });\n\n it('identifies Pi commands without matching unrelated paths', () => {\n expect(adapter.canHandle({ pid: 1, command: 'pi', cwd: '/repo', tty: 'ttys001' })).toBe(true);\n expect(adapter.canHandle({ pid: 2, command: '/usr/local/bin/PI --model x', cwd: '/repo', tty: 'ttys002' })).toBe(true);\n expect(adapter.canHandle({ pid: 3, command: 'node /opt/pi/bin/pi.js', cwd: '/repo', tty: 'ttys003' })).toBe(true);\n expect(adapter.canHandle({ pid: 4, command: 'node /repo/feature-pi-adapter/script.js', cwd: '/repo', tty: 'ttys004' })).toBe(false);\n expect(adapter.canHandle({ pid: 5, command: 'C:\\\\tools\\\\node.exe C:\\\\lib\\\\pi.js', cwd: '/repo', tty: 'ttys005' })).toBe(true);\n });\n\n it('rejects foreign executables from a hand-built snapshot context', async () => {\n const foreign: ProcessInfo = {\n pid: 6,\n command: 'claude --resume /Users/x/repos/pi/session.jsonl',\n cwd: '/repo',\n tty: 'ttys006',\n };\n\n expect(await adapter.detectAgents({ processes: [foreign] })).toEqual([]);\n });\n\n it('maps a running Pi process to the tracker session for its PID', async () => {\n const cwd = '/repo/project-a';\n const proc = makeProcess({ pid: 101, cwd });\n const sessionFile = writePiSession(cwd, [\n { type: 'session_meta', timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-101', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'implement Pi adapter' },\n { role: 'assistant', timestamp: new Date().toISOString(), content: 'working on it' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 101: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 101,\n projectPath: cwd,\n sessionId: 'sess-101',\n summary: 'implement Pi adapter',\n status: AgentStatus.WAITING,\n sessionFilePath: sessionFile,\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it('truncates long user prompts in detected agent summaries', async () => {\n const cwd = '/repo/project-long-summary';\n const proc = makeProcess({ pid: 112, cwd });\n const longPrompt = 'x'.repeat(140);\n const sessionFile = writePiSession(cwd, [\n { type: 'session', timestamp: '2026-06-10T08:58:20.754Z', id: 'sess-long', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: longPrompt },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 112: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0].summary).toHaveLength(120);\n expect(agents[0].summary.endsWith('...')).toBe(true);\n });\n\n it('uses the filename session id fallback and reports running when the latest message is from the user', async () => {\n const cwd = '/repo/project-filename-fallback';\n const proc = makeProcess({ pid: 113, cwd });\n const sessionFile = writePiSessionWithFileName(cwd, 'plain-session.jsonl', [\n { role: 'user', timestamp: new Date().toISOString(), content: 'still working' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 113: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0]).toMatchObject({\n sessionId: 'plain-session',\n summary: 'still working',\n status: AgentStatus.RUNNING,\n });\n });\n\n it('falls back to legacy matching when sessions.json is missing', async () => {\n const cwd = '/repo/project-b';\n const proc = makeProcess({ pid: 202, cwd });\n const sessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-202' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'fallback matching please' },\n ]);\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-202',\n filePath: sessionFile,\n projectDir: path.dirname(sessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 202,\n projectPath: cwd,\n sessionId: 'sess-202',\n summary: 'fallback matching please',\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledWith(\n [proc],\n expect.arrayContaining([\n expect.objectContaining({ filePath: sessionFile, resolvedCwd: cwd }),\n ]),\n );\n });\n\n it('ignores malformed tracker metadata and still falls back to legacy matching', async () => {\n const cwd = '/repo/project-c';\n const proc = makeProcess({ pid: 303, cwd });\n const sessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-303', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'recover from bad tracker' },\n ]);\n fs.writeFileSync(path.join(tmpHome, '.pi', 'agent', 'sessions.json'), '{bad json');\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-303',\n filePath: sessionFile,\n projectDir: path.dirname(sessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe('sess-303');\n });\n\n it('falls back to legacy matching when a trusted tracker session is unparseable', async () => {\n const cwd = '/repo/project-bad-tracker-session';\n const proc = makeProcess({ pid: 304, cwd });\n const badSessionFile = writePiSessionWithFileName(cwd, 'bad.jsonl', ['{not json']);\n const fallbackSessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-304', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'fallback after bad tracker session' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 304: badSessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-304',\n filePath: fallbackSessionFile,\n projectDir: path.dirname(fallbackSessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n sessionId: 'sess-304',\n summary: 'fallback after bad tracker session',\n sessionFilePath: fallbackSessionFile,\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalled();\n });\n\n it('does not trust tracker paths outside the Pi sessions directory', async () => {\n const cwd = '/repo/project-d';\n const proc = makeProcess({ pid: 404, cwd });\n const outside = path.join(tmpHome, 'outside.jsonl');\n fs.writeFileSync(outside, JSON.stringify({ role: 'user', content: 'nope' }));\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 404: outside }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 404,\n sessionId: 'pid-404',\n summary: 'Pi process running',\n });\n });\n\n it('returns a process-only agent when no session can be matched', async () => {\n const proc = makeProcess({ pid: 505, cwd: '/repo/project-e' });\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n status: AgentStatus.RUNNING,\n pid: 505,\n projectPath: '/repo/project-e',\n sessionId: 'pid-505',\n summary: 'Pi process running',\n });\n });\n\n it('reads user and assistant conversation messages from JSONL', () => {\n const cwd = '/repo/project-f';\n const sessionFile = writePiSession(cwd, [\n { role: 'system', timestamp: '2026-06-10T08:58:20.000Z', content: 'hidden' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'hello pi' },\n { type: 'assistant', timestamp: '2026-06-10T08:58:22.000Z', message: { content: 'hello human' } },\n '{not json',\n ]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'hello pi', timestamp: '2026-06-10T08:58:21.000Z' },\n { role: 'assistant', content: 'hello human', timestamp: '2026-06-10T08:58:22.000Z' },\n ]);\n });\n\n it('includes system entries only in verbose conversation mode', () => {\n const cwd = '/repo/project-verbose';\n const sessionFile = writePiSession(cwd, [\n { role: 'system', timestamp: '2026-06-10T08:58:20.000Z', content: 'model changed' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'visible' },\n ]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'visible', timestamp: '2026-06-10T08:58:21.000Z' },\n ]);\n expect(adapter.getConversation(sessionFile, { verbose: true })).toEqual([\n { role: 'system', content: 'model changed', timestamp: '2026-06-10T08:58:20.000Z' },\n { role: 'user', content: 'visible', timestamp: '2026-06-10T08:58:21.000Z' },\n ]);\n });\n\n it('reads real Pi message entries with nested role and text parts', async () => {\n const cwd = '/repo/project-real';\n const proc = makeProcess({ pid: 606, cwd });\n const sessionFile = writePiSession(cwd, [\n { type: 'session', version: 3, id: 'sess-real', timestamp: '2026-06-10T13:27:17.581Z', cwd },\n { type: 'model_change', id: 'model-1', timestamp: '2026-06-10T13:27:17.655Z', modelId: 'claude-sonnet-4-6' },\n {\n type: 'message',\n id: 'msg-user',\n timestamp: '2026-06-10T13:27:37.975Z',\n message: {\n role: 'user',\n content: [{ type: 'text', text: 'hello' }],\n timestamp: 1781098057974,\n },\n },\n {\n type: 'message',\n id: 'msg-assistant',\n timestamp: '2026-06-10T13:27:40.161Z',\n message: {\n role: 'assistant',\n content: [{ type: 'text', text: 'Hello! How can I help you today?' }],\n provider: 'anthropic',\n model: 'claude-sonnet-4-6',\n timestamp: 1781098058012,\n },\n },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 606: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'hello', timestamp: '2026-06-10T13:27:37.975Z' },\n { role: 'assistant', content: 'Hello! How can I help you today?', timestamp: '2026-06-10T13:27:40.161Z' },\n ]);\n\n const agents = await adapter.detectAgents();\n expect(agents[0]).toMatchObject({\n sessionId: 'sess-real',\n summary: 'hello',\n lastActive: new Date('2026-06-10T13:27:40.161Z'),\n });\n });\n\n it('lists historical sessions and applies cwd filtering', async () => {\n const matchingCwd = '/repo/project-g';\n const otherCwd = '/repo/project-h';\n const matchingSession = writePiSession(matchingCwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-g', cwd: matchingCwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'first matching message' },\n ]);\n writePiSession(otherCwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-h', cwd: otherCwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'other message' },\n ]);\n\n const sessions = await adapter.listSessions({ cwd: matchingCwd });\n\n expect(sessions).toEqual([\n expect.objectContaining({\n type: 'pi',\n sessionId: 'sess-g',\n cwd: matchingCwd,\n firstUserMessage: 'first matching message',\n sessionFilePath: matchingSession,\n }),\n ]);\n });\n\n function makeProcess(overrides: Partial<ProcessInfo>): ProcessInfo {\n return {\n pid: 1,\n command: 'pi',\n cwd: '/repo',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T08:58:20.000Z'),\n ...overrides,\n };\n }\n\n function writePiSession(cwd: string, entries: Array<Record<string, unknown> | string>): string {\n const projectDir = path.join(sessionsDir, encodeProjectDir(cwd));\n fs.mkdirSync(projectDir, { recursive: true });\n const sessionId = entries\n .map((entry) => typeof entry === 'string' ? undefined : entry.sessionId)\n .find((value): value is string => typeof value === 'string') ?? cryptoRandomSessionId();\n const filePath = path.join(projectDir, `2026-06-10T08-58-20-754Z_${sessionId}.jsonl`);\n fs.writeFileSync(\n filePath,\n entries.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry)).join('\\n'),\n );\n return filePath;\n }\n\n function writePiSessionWithFileName(cwd: string, fileName: string, entries: Array<Record<string, unknown> | string>): string {\n const projectDir = path.join(sessionsDir, encodeProjectDir(cwd));\n fs.mkdirSync(projectDir, { recursive: true });\n const filePath = path.join(projectDir, fileName);\n fs.writeFileSync(\n filePath,\n entries.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry)).join('\\n'),\n );\n return filePath;\n }\n\n function encodeProjectDir(cwd: string): string {\n return cwd.replace(/\\//g, '-').replace(/^-?/, '--') + '--';\n }\n\n function cryptoRandomSessionId(): string {\n return `019eb0c1-06d2-71ed-90ee-${Math.random().toString(16).slice(2, 14).padEnd(12, '0')}`;\n }\n});\n"],"names":["fs","os","path","PiAdapter","AgentStatus","AgentRegistry","listAgentProcesses","enrichProcesses","captureProcessSnapshot","matchProcessesToSessions","generateAgentName","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","adapter","tmpHome","sessionsDir","beforeEach","mkdtempSync","join","tmpdir","process","env","HOME","mkdirSync","recursive","mockReset","mockImplementation","procs","names","flatMap","name","mockReturnValue","cwd","pid","folder","basename","afterEach","rmSync","force","it","expect","type","toBe","canHandle","command","tty","foreign","detectAgents","processes","toEqual","proc","makeProcess","sessionFile","writePiSession","timestamp","sessionId","role","content","Date","toISOString","writeFileSync","JSON","stringify","agents","toHaveLength","toMatchObject","projectPath","summary","status","WAITING","sessionFilePath","not","toHaveBeenCalled","longPrompt","repeat","id","endsWith","writePiSessionWithFileName","RUNNING","session","filePath","projectDir","dirname","birthtimeMs","now","resolvedCwd","deltaMs","toHaveBeenCalledWith","arrayContaining","objectContaining","badSessionFile","fallbackSessionFile","outside","message","getConversation","verbose","version","modelId","text","provider","model","lastActive","matchingCwd","otherCwd","matchingSession","sessions","listSessions","firstUserMessage","overrides","startTime","entries","encodeProjectDir","map","entry","undefined","find","value","cryptoRandomSessionId","fileName","replace","Math","random","toString","slice","padEnd"],"mappings":"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"}
@@ -1,128 +0,0 @@
1
- import fs from 'fs';
2
- import os from 'os';
3
- import path from 'path';
4
- import Database from 'better-sqlite3';
5
- import { afterEach, describe, expect, it } from 'vitest';
6
- import { DatabaseConnection } from '../../database/connection.js';
7
- import { getSchemaVersion } from '../../database/schema.js';
8
- const roots = [];
9
- afterEach(()=>{
10
- for (const root of roots.splice(0))fs.rmSync(root, {
11
- recursive: true,
12
- force: true
13
- });
14
- });
15
- function dbPath() {
16
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-db-'));
17
- roots.push(root);
18
- return path.join(root, 'state', 'agents.db');
19
- }
20
- describe('durable agents schema', ()=>{
21
- it('migrates to version 4 with durable constraints and indexes', ()=>{
22
- const connection = new DatabaseConnection({
23
- dbPath: dbPath()
24
- });
25
- expect(getSchemaVersion(connection)).toBe(4);
26
- const table = connection.queryOne("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'durable_agents'");
27
- expect(table?.sql).toContain("DEFAULT 'durable'");
28
- expect(table?.sql).toContain("state IN ('ready','running','degraded')");
29
- expect(connection.query("SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = 'durable_agents'").map(({ name })=>name)).toEqual(expect.arrayContaining([
30
- 'idx_durable_agents_state',
31
- 'idx_durable_agents_list'
32
- ]));
33
- connection.close();
34
- });
35
- it('upgrades a version 3 database to nullable, unique provider sessions', ()=>{
36
- const file = dbPath();
37
- fs.mkdirSync(path.dirname(file), {
38
- recursive: true
39
- });
40
- const raw = new Database(file);
41
- raw.exec(`
42
- CREATE TABLE durable_agents (
43
- id TEXT PRIMARY KEY,
44
- provider_session_id TEXT NOT NULL UNIQUE
45
- );
46
- INSERT INTO durable_agents (id, provider_session_id) VALUES ('existing', 'existing-session');
47
- PRAGMA user_version = 3;
48
- `);
49
- raw.close();
50
- const connection = new DatabaseConnection({
51
- dbPath: file
52
- });
53
- expect(getSchemaVersion(connection)).toBe(4);
54
- expect(()=>connection.execute('INSERT INTO durable_agents (id, provider_session_id) VALUES (?, NULL)', [
55
- 'codex'
56
- ])).not.toThrow();
57
- expect(()=>connection.execute('INSERT INTO durable_agents (id, provider_session_id) VALUES (?, ?)', [
58
- 'duplicate',
59
- 'existing-session'
60
- ])).toThrow(/UNIQUE/i);
61
- connection.close();
62
- });
63
- it('enforces case-insensitive names and active-run consistency but permits new providers', ()=>{
64
- const connection = new DatabaseConnection({
65
- dbPath: dbPath()
66
- });
67
- const insert = (name, provider, state = 'ready')=>connection.execute(`
68
- INSERT INTO durable_agents (
69
- id, name, provider, mode, cwd, provider_session_id, state, session_health,
70
- created_at, updated_at
71
- ) VALUES (?, ?, ?, 'durable', '/tmp', ?, ?, 'uninitialized', ?, ?)
72
- `, [
73
- crypto.randomUUID(),
74
- name,
75
- provider,
76
- crypto.randomUUID(),
77
- state,
78
- new Date().toISOString(),
79
- new Date().toISOString()
80
- ]);
81
- expect(()=>insert('Alpha', 'future-provider')).not.toThrow();
82
- expect(()=>insert('alpha', 'claude')).toThrow(/UNIQUE/i);
83
- expect(()=>insert('Broken', 'claude', 'running')).toThrow(/CHECK/i);
84
- connection.close();
85
- });
86
- });
87
- describe('readonly DatabaseConnection', ()=>{
88
- it('opens an already migrated database without changing it', ()=>{
89
- const file = dbPath();
90
- const writable = new DatabaseConnection({
91
- dbPath: file
92
- });
93
- writable.close();
94
- const before = fs.statSync(file).mtimeMs;
95
- const readonly = new DatabaseConnection({
96
- dbPath: file,
97
- readonly: true
98
- });
99
- expect(readonly.queryOne('PRAGMA user_version')?.user_version).toBe(4);
100
- readonly.close();
101
- expect(fs.statSync(file).mtimeMs).toBe(before);
102
- });
103
- it('does not create a missing database or migrate an old one', ()=>{
104
- const missing = dbPath();
105
- expect(()=>new DatabaseConnection({
106
- dbPath: missing,
107
- readonly: true
108
- })).toThrow(/readonly.*exist/i);
109
- expect(fs.existsSync(missing)).toBe(false);
110
- fs.mkdirSync(path.dirname(missing), {
111
- recursive: true
112
- });
113
- const raw = new Database(missing);
114
- raw.pragma('user_version = 2');
115
- raw.close();
116
- expect(()=>new DatabaseConnection({
117
- dbPath: missing,
118
- readonly: true
119
- })).toThrow(/schema version 3/i);
120
- expect(new Database(missing, {
121
- readonly: true
122
- }).pragma('user_version', {
123
- simple: true
124
- })).toBe(2);
125
- });
126
- });
127
-
128
- //# sourceMappingURL=DurableAgentsDatabase.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/database/DurableAgentsDatabase.test.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport Database from 'better-sqlite3';\nimport { afterEach, describe, expect, it } from 'vitest';\nimport { DatabaseConnection } from '../../database/connection.js';\nimport { getSchemaVersion } from '../../database/schema.js';\n\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\nfunction dbPath(): string {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-db-'));\n roots.push(root);\n return path.join(root, 'state', 'agents.db');\n}\n\ndescribe('durable agents schema', () => {\n it('migrates to version 4 with durable constraints and indexes', () => {\n const connection = new DatabaseConnection({ dbPath: dbPath() });\n expect(getSchemaVersion(connection)).toBe(4);\n const table = connection.queryOne<{ sql: string }>(\n \"SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'durable_agents'\",\n );\n expect(table?.sql).toContain(\"DEFAULT 'durable'\");\n expect(table?.sql).toContain(\"state IN ('ready','running','degraded')\");\n expect(connection.query<{ name: string }>(\n \"SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = 'durable_agents'\",\n ).map(({ name }) => name)).toEqual(expect.arrayContaining([\n 'idx_durable_agents_state', 'idx_durable_agents_list',\n ]));\n connection.close();\n });\n\n it('upgrades a version 3 database to nullable, unique provider sessions', () => {\n const file = dbPath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const raw = new Database(file);\n raw.exec(`\n CREATE TABLE durable_agents (\n id TEXT PRIMARY KEY,\n provider_session_id TEXT NOT NULL UNIQUE\n );\n INSERT INTO durable_agents (id, provider_session_id) VALUES ('existing', 'existing-session');\n PRAGMA user_version = 3;\n `);\n raw.close();\n\n const connection = new DatabaseConnection({ dbPath: file });\n expect(getSchemaVersion(connection)).toBe(4);\n expect(() => connection.execute(\n 'INSERT INTO durable_agents (id, provider_session_id) VALUES (?, NULL)', ['codex'],\n )).not.toThrow();\n expect(() => connection.execute(\n 'INSERT INTO durable_agents (id, provider_session_id) VALUES (?, ?)', ['duplicate', 'existing-session'],\n )).toThrow(/UNIQUE/i);\n connection.close();\n });\n\n it('enforces case-insensitive names and active-run consistency but permits new providers', () => {\n const connection = new DatabaseConnection({ dbPath: dbPath() });\n const insert = (name: string, provider: string, state = 'ready') => connection.execute(`\n INSERT INTO durable_agents (\n id, name, provider, mode, cwd, provider_session_id, state, session_health,\n created_at, updated_at\n ) VALUES (?, ?, ?, 'durable', '/tmp', ?, ?, 'uninitialized', ?, ?)\n `, [crypto.randomUUID(), name, provider, crypto.randomUUID(), state, new Date().toISOString(), new Date().toISOString()]);\n expect(() => insert('Alpha', 'future-provider')).not.toThrow();\n expect(() => insert('alpha', 'claude')).toThrow(/UNIQUE/i);\n expect(() => insert('Broken', 'claude', 'running')).toThrow(/CHECK/i);\n connection.close();\n });\n});\n\ndescribe('readonly DatabaseConnection', () => {\n it('opens an already migrated database without changing it', () => {\n const file = dbPath();\n const writable = new DatabaseConnection({ dbPath: file });\n writable.close();\n const before = fs.statSync(file).mtimeMs;\n const readonly = new DatabaseConnection({ dbPath: file, readonly: true });\n expect(readonly.queryOne<{ user_version: number }>('PRAGMA user_version')?.user_version).toBe(4);\n readonly.close();\n expect(fs.statSync(file).mtimeMs).toBe(before);\n });\n\n it('does not create a missing database or migrate an old one', () => {\n const missing = dbPath();\n expect(() => new DatabaseConnection({ dbPath: missing, readonly: true })).toThrow(/readonly.*exist/i);\n expect(fs.existsSync(missing)).toBe(false);\n\n fs.mkdirSync(path.dirname(missing), { recursive: true });\n const raw = new Database(missing);\n raw.pragma('user_version = 2');\n raw.close();\n expect(() => new DatabaseConnection({ dbPath: missing, readonly: true })).toThrow(/schema version 3/i);\n expect(new Database(missing, { readonly: true }).pragma('user_version', { simple: true })).toBe(2);\n });\n});\n"],"names":["fs","os","path","Database","afterEach","describe","expect","it","DatabaseConnection","getSchemaVersion","roots","root","splice","rmSync","recursive","force","dbPath","mkdtempSync","join","tmpdir","push","connection","toBe","table","queryOne","sql","toContain","query","map","name","toEqual","arrayContaining","close","file","mkdirSync","dirname","raw","exec","execute","not","toThrow","insert","provider","state","crypto","randomUUID","Date","toISOString","writable","before","statSync","mtimeMs","readonly","user_version","missing","existsSync","pragma","simple"],"mappings":"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"}
@@ -1,109 +0,0 @@
1
- /**
2
- * Codex Adapter
3
- *
4
- * Detects running Codex agents by:
5
- * 1. Filtering Codex processes from a shared asynchronous process snapshot
6
- * 2. Using snapshot CWD and start-time enrichment
7
- * 3. Matching exact PID-to-session metadata from ~/.codex/ai-devkit/sessions.json
8
- * 4. Discovering session files from ~/.codex/sessions/YYYY/MM/DD/ via shared batchGetSessionFileBirthtimes()
9
- * 5. Setting resolvedCwd from session_meta first line
10
- * 6. Matching sessions to processes via shared matchProcessesToSessions()
11
- * 7. Extracting summary from last event entry in session JSONL
12
- */
13
- import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from './AgentAdapter.js';
14
- import { AgentRegistry } from '../utils/AgentRegistry.js';
15
- export declare class CodexAdapter implements AgentAdapter {
16
- readonly type: "codex";
17
- readonly processNames: readonly ["codex"];
18
- private static readonly IDLE_THRESHOLD_MINUTES;
19
- /** Include session files around process start day to recover long-lived processes. */
20
- private static readonly PROCESS_START_DAY_WINDOW_DAYS;
21
- private codexSessionsDir;
22
- private sessionMappingPath;
23
- private registry;
24
- constructor(registry?: AgentRegistry);
25
- canHandle(processInfo: ProcessInfo): boolean;
26
- /**
27
- * Detect running Codex agents
28
- */
29
- detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
30
- private mapSessionMappingMatches;
31
- private matchFromSessionMapping;
32
- private readSessionMapping;
33
- private toPid;
34
- private isTrustedSessionPath;
35
- private tryRegistryCache;
36
- /**
37
- * Match processes via `codex resume <uuid>` in their command line.
38
- * Resumed sessions predate the process, so birth-time proximity cannot
39
- * reliably pair them with the running PID.
40
- */
41
- private tryResumeMatching;
42
- private extractResumeSessionId;
43
- private findSessionFileById;
44
- private getCandidateSessionFiles;
45
- private mapDirectMatches;
46
- /**
47
- * Discover session files for the given processes.
48
- *
49
- * Uses process start times to determine which YYYY/MM/DD date directories
50
- * to scan (±1 day window), then batches stat calls across all directories.
51
- * Reads each file once and caches content for later parsing by parseSession().
52
- * Sets resolvedCwd from session_meta first line.
53
- */
54
- private discoverSessions;
55
- /**
56
- * Determine which date directories to scan based on process start times.
57
- * Returns only directories that actually exist.
58
- */
59
- private getDateDirs;
60
- private getDateDirsAroundDate;
61
- private toSessionDayKey;
62
- private tryParseUuidV7Date;
63
- /**
64
- * Parse session file content into CodexSession.
65
- * Uses cached content if available, otherwise reads from disk.
66
- */
67
- private parseSession;
68
- private mapSessionToAgent;
69
- private mapProcessOnlyAgent;
70
- private findLastEventEntry;
71
- private parseTimestamp;
72
- private parseMetaTimestampMs;
73
- private determineStatus;
74
- private extractSummary;
75
- private normalizedPayloadType;
76
- private extractEntryText;
77
- private truncate;
78
- private isCodexExecutable;
79
- /**
80
- * Read the full conversation from a Codex session JSONL file.
81
- *
82
- * Codex entries use either legacy payload.message fields or current
83
- * response_item/event_msg content arrays.
84
- */
85
- getConversation(sessionFilePath: string, options?: {
86
- verbose?: boolean;
87
- }): ConversationMessage[];
88
- private toConversationMessage;
89
- private mapCodexRole;
90
- private mapCodexItemRole;
91
- private mirroredMessageKey;
92
- private extractContentText;
93
- listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
94
- /**
95
- * Walk every YYYY/MM/DD directory under `codexSessionsDir` and return
96
- * absolute paths of `.jsonl` files. Tolerates malformed layouts
97
- * (skips entries that aren't directories at the expected depth).
98
- */
99
- private collectAllSessionFiles;
100
- private collectSessionFilesInDateDirs;
101
- /**
102
- * Read a Codex session JSONL file and produce a {@link SessionSummary}.
103
- * Returns null when the file is unreadable, has no `session_meta`, or
104
- * lacks a session id.
105
- */
106
- private fileToSessionSummary;
107
- private isSyntheticUserMessage;
108
- }
109
- //# sourceMappingURL=CodexAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodexAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/CodexAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EACR,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA4D1D,qBAAa,YAAa,YAAW,YAAY;IAC7C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,YAAY,qBAAsB;IAE3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IACnD,sFAAsF;IACtF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAK;IAE1D,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,QAAQ,GAAE,aAAuC;IAO7D,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C;;OAEG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAqDzE,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,uBAAuB;IAuB/B,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,gBAAgB;IAiCxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,gBAAgB;IAgBxB;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;;OAGG;IACH,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,kBAAkB;IAW1B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAwDpB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,iBAAiB;IAKzB;;;;;OAKG;IACH,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IA8ChG,OAAO,CAAC,qBAAqB;IAwC7B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kBAAkB;IAYpB,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBzE;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,6BAA6B;IAarC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA8D5B,OAAO,CAAC,sBAAsB;CAGjC"}