@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,34 +1,34 @@
1
1
  /**
2
2
  * Tests for utils/matching.ts
3
- */ import { matchProcessesToSessions, generateAgentName } from '../../utils/matching.js';
3
+ */ import { matchProcessesToSessions, generateAgentName } from "../../utils/matching.js";
4
4
  function makeProcess(overrides) {
5
5
  return {
6
- command: 'claude',
7
- cwd: '/projects/my-app',
8
- tty: 'ttys001',
9
- startTime: new Date('2026-03-18T23:18:01.000Z'),
6
+ command: "claude",
7
+ cwd: "/projects/my-app",
8
+ tty: "ttys001",
9
+ startTime: new Date("2026-03-18T23:18:01.000Z"),
10
10
  ...overrides
11
11
  };
12
12
  }
13
13
  function makeSession(overrides) {
14
14
  return {
15
15
  filePath: `/home/.claude/projects/my-app/${overrides.sessionId}.jsonl`,
16
- projectDir: '/home/.claude/projects/my-app',
17
- birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime(),
18
- resolvedCwd: '/projects/my-app',
16
+ projectDir: "/home/.claude/projects/my-app",
17
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime(),
18
+ resolvedCwd: "/projects/my-app",
19
19
  ...overrides
20
20
  };
21
21
  }
22
- describe('matchProcessesToSessions', ()=>{
23
- it('should return empty array when no processes', ()=>{
22
+ describe("matchProcessesToSessions", ()=>{
23
+ it("should return empty array when no processes", ()=>{
24
24
  const sessions = [
25
25
  makeSession({
26
- sessionId: 's1'
26
+ sessionId: "s1"
27
27
  })
28
28
  ];
29
29
  expect(matchProcessesToSessions([], sessions)).toEqual([]);
30
30
  });
31
- it('should return empty array when no sessions', ()=>{
31
+ it("should return empty array when no sessions", ()=>{
32
32
  const processes = [
33
33
  makeProcess({
34
34
  pid: 100
@@ -36,18 +36,18 @@ describe('matchProcessesToSessions', ()=>{
36
36
  ];
37
37
  expect(matchProcessesToSessions(processes, [])).toEqual([]);
38
38
  });
39
- it('should match a single process to closest session', ()=>{
39
+ it("should match a single process to closest session", ()=>{
40
40
  const proc = makeProcess({
41
41
  pid: 100,
42
- startTime: new Date('2026-03-18T23:18:01.000Z')
42
+ startTime: new Date("2026-03-18T23:18:01.000Z")
43
43
  });
44
44
  const s1 = makeSession({
45
- sessionId: 's1',
46
- birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime()
45
+ sessionId: "s1",
46
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime()
47
47
  });
48
48
  const s2 = makeSession({
49
- sessionId: 's2',
50
- birthtimeMs: new Date('2026-03-18T23:20:00.000Z').getTime()
49
+ sessionId: "s2",
50
+ birthtimeMs: new Date("2026-03-18T23:20:00.000Z").getTime()
51
51
  });
52
52
  const results = matchProcessesToSessions([
53
53
  proc
@@ -56,25 +56,25 @@ describe('matchProcessesToSessions', ()=>{
56
56
  s2
57
57
  ]);
58
58
  expect(results).toHaveLength(1);
59
- expect(results[0].session.sessionId).toBe('s1');
59
+ expect(results[0].session.sessionId).toBe("s1");
60
60
  expect(results[0].deltaMs).toBe(43000);
61
61
  });
62
- it('should enforce 1:1 constraint — each process matches only one session', ()=>{
62
+ it("should enforce 1:1 constraint — each process matches only one session", ()=>{
63
63
  const p1 = makeProcess({
64
64
  pid: 100,
65
- startTime: new Date('2026-03-18T23:18:01.000Z')
65
+ startTime: new Date("2026-03-18T23:18:01.000Z")
66
66
  });
67
67
  const p2 = makeProcess({
68
68
  pid: 200,
69
- startTime: new Date('2026-03-18T23:18:30.000Z')
69
+ startTime: new Date("2026-03-18T23:18:30.000Z")
70
70
  });
71
71
  const s1 = makeSession({
72
- sessionId: 's1',
73
- birthtimeMs: new Date('2026-03-18T23:18:10.000Z').getTime()
72
+ sessionId: "s1",
73
+ birthtimeMs: new Date("2026-03-18T23:18:10.000Z").getTime()
74
74
  });
75
75
  const s2 = makeSession({
76
- sessionId: 's2',
77
- birthtimeMs: new Date('2026-03-18T23:18:35.000Z').getTime()
76
+ sessionId: "s2",
77
+ birthtimeMs: new Date("2026-03-18T23:18:35.000Z").getTime()
78
78
  });
79
79
  const results = matchProcessesToSessions([
80
80
  p1,
@@ -91,26 +91,26 @@ describe('matchProcessesToSessions', ()=>{
91
91
  200
92
92
  ]);
93
93
  expect(sids).toEqual([
94
- 's1',
95
- 's2'
94
+ "s1",
95
+ "s2"
96
96
  ]);
97
97
  });
98
- it('should disambiguate multiple processes with same CWD by birthtime', ()=>{
98
+ it("should disambiguate multiple processes with same CWD by birthtime", ()=>{
99
99
  const p1 = makeProcess({
100
100
  pid: 100,
101
- startTime: new Date('2026-03-18T23:18:01.000Z')
101
+ startTime: new Date("2026-03-18T23:18:01.000Z")
102
102
  });
103
103
  const p2 = makeProcess({
104
104
  pid: 200,
105
- startTime: new Date('2026-03-19T08:53:11.000Z')
105
+ startTime: new Date("2026-03-19T08:53:11.000Z")
106
106
  });
107
107
  const s1 = makeSession({
108
- sessionId: 's1',
109
- birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime()
108
+ sessionId: "s1",
109
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime()
110
110
  });
111
111
  const s2 = makeSession({
112
- sessionId: 's2',
113
- birthtimeMs: new Date('2026-03-19T08:55:35.000Z').getTime()
112
+ sessionId: "s2",
113
+ birthtimeMs: new Date("2026-03-19T08:55:35.000Z").getTime()
114
114
  });
115
115
  const results = matchProcessesToSessions([
116
116
  p1,
@@ -122,16 +122,16 @@ describe('matchProcessesToSessions', ()=>{
122
122
  expect(results).toHaveLength(2);
123
123
  const match1 = results.find((r)=>r.process.pid === 100);
124
124
  const match2 = results.find((r)=>r.process.pid === 200);
125
- expect(match1?.session.sessionId).toBe('s1');
126
- expect(match2?.session.sessionId).toBe('s2');
125
+ expect(match1?.session.sessionId).toBe("s1");
126
+ expect(match2?.session.sessionId).toBe("s2");
127
127
  });
128
- it('should exclude processes without startTime', ()=>{
128
+ it("should exclude processes without startTime", ()=>{
129
129
  const proc = makeProcess({
130
130
  pid: 100,
131
131
  startTime: undefined
132
132
  });
133
133
  const session = makeSession({
134
- sessionId: 's1'
134
+ sessionId: "s1"
135
135
  });
136
136
  const results = matchProcessesToSessions([
137
137
  proc
@@ -140,13 +140,13 @@ describe('matchProcessesToSessions', ()=>{
140
140
  ]);
141
141
  expect(results).toEqual([]);
142
142
  });
143
- it('should exclude processes without cwd', ()=>{
143
+ it("should exclude processes without cwd", ()=>{
144
144
  const proc = makeProcess({
145
145
  pid: 100,
146
- cwd: ''
146
+ cwd: ""
147
147
  });
148
148
  const session = makeSession({
149
- sessionId: 's1'
149
+ sessionId: "s1"
150
150
  });
151
151
  const results = matchProcessesToSessions([
152
152
  proc
@@ -155,14 +155,14 @@ describe('matchProcessesToSessions', ()=>{
155
155
  ]);
156
156
  expect(results).toEqual([]);
157
157
  });
158
- it('should not match when CWD does not match resolvedCwd', ()=>{
158
+ it("should not match when CWD does not match resolvedCwd", ()=>{
159
159
  const proc = makeProcess({
160
160
  pid: 100,
161
- cwd: '/projects/app-a'
161
+ cwd: "/projects/app-a"
162
162
  });
163
163
  const session = makeSession({
164
- sessionId: 's1',
165
- resolvedCwd: '/projects/app-b'
164
+ sessionId: "s1",
165
+ resolvedCwd: "/projects/app-b"
166
166
  });
167
167
  const results = matchProcessesToSessions([
168
168
  proc
@@ -171,14 +171,14 @@ describe('matchProcessesToSessions', ()=>{
171
171
  ]);
172
172
  expect(results).toEqual([]);
173
173
  });
174
- it('should not match when delta exceeds 3-minute tolerance', ()=>{
174
+ it("should not match when delta exceeds 3-minute tolerance", ()=>{
175
175
  const proc = makeProcess({
176
176
  pid: 100,
177
- startTime: new Date('2026-03-18T23:18:01.000Z')
177
+ startTime: new Date("2026-03-18T23:18:01.000Z")
178
178
  });
179
179
  const session = makeSession({
180
- sessionId: 's1',
181
- birthtimeMs: new Date('2026-03-18T23:22:00.000Z').getTime()
180
+ sessionId: "s1",
181
+ birthtimeMs: new Date("2026-03-18T23:22:00.000Z").getTime()
182
182
  });
183
183
  const results = matchProcessesToSessions([
184
184
  proc
@@ -187,14 +187,14 @@ describe('matchProcessesToSessions', ()=>{
187
187
  ]);
188
188
  expect(results).toEqual([]);
189
189
  });
190
- it('should match at exactly 3-minute boundary', ()=>{
191
- const startTime = new Date('2026-03-18T23:18:00.000Z');
190
+ it("should match at exactly 3-minute boundary", ()=>{
191
+ const startTime = new Date("2026-03-18T23:18:00.000Z");
192
192
  const proc = makeProcess({
193
193
  pid: 100,
194
194
  startTime
195
195
  });
196
196
  const session = makeSession({
197
- sessionId: 's1',
197
+ sessionId: "s1",
198
198
  birthtimeMs: startTime.getTime() + 180_000
199
199
  });
200
200
  const results = matchProcessesToSessions([
@@ -204,22 +204,22 @@ describe('matchProcessesToSessions', ()=>{
204
204
  ]);
205
205
  expect(results).toHaveLength(1);
206
206
  });
207
- it('should handle more sessions than processes', ()=>{
207
+ it("should handle more sessions than processes", ()=>{
208
208
  const proc = makeProcess({
209
209
  pid: 100,
210
- startTime: new Date('2026-03-18T23:18:01.000Z')
210
+ startTime: new Date("2026-03-18T23:18:01.000Z")
211
211
  });
212
212
  const s1 = makeSession({
213
- sessionId: 's1',
214
- birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime()
213
+ sessionId: "s1",
214
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime()
215
215
  });
216
216
  const s2 = makeSession({
217
- sessionId: 's2',
218
- birthtimeMs: new Date('2026-03-18T23:19:00.000Z').getTime()
217
+ sessionId: "s2",
218
+ birthtimeMs: new Date("2026-03-18T23:19:00.000Z").getTime()
219
219
  });
220
220
  const s3 = makeSession({
221
- sessionId: 's3',
222
- birthtimeMs: new Date('2026-03-18T23:19:30.000Z').getTime()
221
+ sessionId: "s3",
222
+ birthtimeMs: new Date("2026-03-18T23:19:30.000Z").getTime()
223
223
  });
224
224
  const results = matchProcessesToSessions([
225
225
  proc
@@ -229,20 +229,20 @@ describe('matchProcessesToSessions', ()=>{
229
229
  s3
230
230
  ]);
231
231
  expect(results).toHaveLength(1);
232
- expect(results[0].session.sessionId).toBe('s1'); // closest
232
+ expect(results[0].session.sessionId).toBe("s1"); // closest
233
233
  });
234
- it('should handle more processes than sessions', ()=>{
234
+ it("should handle more processes than sessions", ()=>{
235
235
  const p1 = makeProcess({
236
236
  pid: 100,
237
- startTime: new Date('2026-03-18T23:18:01.000Z')
237
+ startTime: new Date("2026-03-18T23:18:01.000Z")
238
238
  });
239
239
  const p2 = makeProcess({
240
240
  pid: 200,
241
- startTime: new Date('2026-03-18T23:20:01.000Z')
241
+ startTime: new Date("2026-03-18T23:20:01.000Z")
242
242
  });
243
243
  const s1 = makeSession({
244
- sessionId: 's1',
245
- birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime()
244
+ sessionId: "s1",
245
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime()
246
246
  });
247
247
  const results = matchProcessesToSessions([
248
248
  p1,
@@ -253,13 +253,13 @@ describe('matchProcessesToSessions', ()=>{
253
253
  expect(results).toHaveLength(1);
254
254
  expect(results[0].process.pid).toBe(100); // closest
255
255
  });
256
- it('should skip sessions with empty resolvedCwd', ()=>{
256
+ it("should skip sessions with empty resolvedCwd", ()=>{
257
257
  const proc = makeProcess({
258
258
  pid: 100
259
259
  });
260
260
  const session = makeSession({
261
- sessionId: 's1',
262
- resolvedCwd: ''
261
+ sessionId: "s1",
262
+ resolvedCwd: ""
263
263
  });
264
264
  const results = matchProcessesToSessions([
265
265
  proc
@@ -268,23 +268,23 @@ describe('matchProcessesToSessions', ()=>{
268
268
  ]);
269
269
  expect(results).toEqual([]);
270
270
  });
271
- it('should prefer best match when greedy ordering matters', ()=>{
271
+ it("should prefer best match when greedy ordering matters", ()=>{
272
272
  // p1 is 10s from s2, p2 is 5s from s2 — p2 should win s2, p1 gets s1
273
273
  const p1 = makeProcess({
274
274
  pid: 100,
275
- startTime: new Date('2026-03-18T23:18:00.000Z')
275
+ startTime: new Date("2026-03-18T23:18:00.000Z")
276
276
  });
277
277
  const p2 = makeProcess({
278
278
  pid: 200,
279
- startTime: new Date('2026-03-18T23:18:25.000Z')
279
+ startTime: new Date("2026-03-18T23:18:25.000Z")
280
280
  });
281
281
  const s1 = makeSession({
282
- sessionId: 's1',
283
- birthtimeMs: new Date('2026-03-18T23:18:08.000Z').getTime()
282
+ sessionId: "s1",
283
+ birthtimeMs: new Date("2026-03-18T23:18:08.000Z").getTime()
284
284
  });
285
285
  const s2 = makeSession({
286
- sessionId: 's2',
287
- birthtimeMs: new Date('2026-03-18T23:18:30.000Z').getTime()
286
+ sessionId: "s2",
287
+ birthtimeMs: new Date("2026-03-18T23:18:30.000Z").getTime()
288
288
  });
289
289
  const results = matchProcessesToSessions([
290
290
  p1,
@@ -296,28 +296,28 @@ describe('matchProcessesToSessions', ()=>{
296
296
  expect(results).toHaveLength(2);
297
297
  const match1 = results.find((r)=>r.process.pid === 200);
298
298
  const match2 = results.find((r)=>r.process.pid === 100);
299
- expect(match1?.session.sessionId).toBe('s2'); // 5s delta
300
- expect(match2?.session.sessionId).toBe('s1'); // 8s delta
299
+ expect(match1?.session.sessionId).toBe("s2"); // 5s delta
300
+ expect(match2?.session.sessionId).toBe("s1"); // 8s delta
301
301
  });
302
302
  });
303
- describe('generateAgentName', ()=>{
304
- it('should return lowercase kebab-case name with pid', ()=>{
305
- expect(generateAgentName('/projects/my-app', 12345)).toBe('my-app-12345');
303
+ describe("generateAgentName", ()=>{
304
+ it("should return lowercase kebab-case name with pid", ()=>{
305
+ expect(generateAgentName("/projects/my-app", 12345)).toBe("my-app-12345");
306
306
  });
307
- it('should handle root path', ()=>{
308
- expect(generateAgentName('/', 100)).toBe('unknown-100');
307
+ it("should handle root path", ()=>{
308
+ expect(generateAgentName("/", 100)).toBe("unknown-100");
309
309
  });
310
- it('should handle empty cwd', ()=>{
311
- expect(generateAgentName('', 100)).toBe('unknown-100');
310
+ it("should handle empty cwd", ()=>{
311
+ expect(generateAgentName("", 100)).toBe("unknown-100");
312
312
  });
313
- it('should handle nested paths', ()=>{
314
- expect(generateAgentName('/home/user/projects/ai-devkit', 78070)).toBe('ai-devkit-78070');
313
+ it("should handle nested paths", ()=>{
314
+ expect(generateAgentName("/home/user/projects/ai-devkit", 78070)).toBe("ai-devkit-78070");
315
315
  });
316
- it('should convert spaces and special chars to kebab-case', ()=>{
317
- expect(generateAgentName('/projects/AI DevKit', 123)).toBe('ai-devkit-123');
316
+ it("should convert spaces and special chars to kebab-case", ()=>{
317
+ expect(generateAgentName("/projects/AI DevKit", 123)).toBe("ai-devkit-123");
318
318
  });
319
- it('should convert uppercase to lowercase', ()=>{
320
- expect(generateAgentName('/projects/MyProject', 456)).toBe('myproject-456');
319
+ it("should convert uppercase to lowercase", ()=>{
320
+ expect(generateAgentName("/projects/MyProject", 456)).toBe("myproject-456");
321
321
  });
322
322
  });
323
323
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__tests__/utils/matching.test.ts"],"sourcesContent":["/**\n * Tests for utils/matching.ts\n */\n\n\nimport { matchProcessesToSessions, generateAgentName } from '../../utils/matching.js';\nimport type { ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport type { SessionFile } from '../../utils/session.js';\n\nfunction makeProcess(overrides: Partial<ProcessInfo> & { pid: number }): ProcessInfo {\n return {\n command: 'claude',\n cwd: '/projects/my-app',\n tty: 'ttys001',\n startTime: new Date('2026-03-18T23:18:01.000Z'),\n ...overrides,\n };\n}\n\nfunction makeSession(overrides: Partial<SessionFile> & { sessionId: string }): SessionFile {\n return {\n filePath: `/home/.claude/projects/my-app/${overrides.sessionId}.jsonl`,\n projectDir: '/home/.claude/projects/my-app',\n birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime(),\n resolvedCwd: '/projects/my-app',\n ...overrides,\n };\n}\n\ndescribe('matchProcessesToSessions', () => {\n it('should return empty array when no processes', () => {\n const sessions = [makeSession({ sessionId: 's1' })];\n expect(matchProcessesToSessions([], sessions)).toEqual([]);\n });\n\n it('should return empty array when no sessions', () => {\n const processes = [makeProcess({ pid: 100 })];\n expect(matchProcessesToSessions(processes, [])).toEqual([]);\n });\n\n it('should match a single process to closest session', () => {\n const proc = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });\n const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime() });\n const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-18T23:20:00.000Z').getTime() });\n\n const results = matchProcessesToSessions([proc], [s1, s2]);\n expect(results).toHaveLength(1);\n expect(results[0].session.sessionId).toBe('s1');\n expect(results[0].deltaMs).toBe(43000);\n });\n\n it('should enforce 1:1 constraint — each process matches only one session', () => {\n const p1 = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });\n const p2 = makeProcess({ pid: 200, startTime: new Date('2026-03-18T23:18:30.000Z') });\n const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:10.000Z').getTime() });\n const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-18T23:18:35.000Z').getTime() });\n\n const results = matchProcessesToSessions([p1, p2], [s1, s2]);\n expect(results).toHaveLength(2);\n\n const pids = results.map(r => r.process.pid).sort();\n const sids = results.map(r => r.session.sessionId).sort();\n expect(pids).toEqual([100, 200]);\n expect(sids).toEqual(['s1', 's2']);\n });\n\n it('should disambiguate multiple processes with same CWD by birthtime', () => {\n const p1 = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });\n const p2 = makeProcess({ pid: 200, startTime: new Date('2026-03-19T08:53:11.000Z') });\n const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime() });\n const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-19T08:55:35.000Z').getTime() });\n\n const results = matchProcessesToSessions([p1, p2], [s1, s2]);\n expect(results).toHaveLength(2);\n\n const match1 = results.find(r => r.process.pid === 100);\n const match2 = results.find(r => r.process.pid === 200);\n expect(match1?.session.sessionId).toBe('s1');\n expect(match2?.session.sessionId).toBe('s2');\n });\n\n it('should exclude processes without startTime', () => {\n const proc = makeProcess({ pid: 100, startTime: undefined });\n const session = makeSession({ sessionId: 's1' });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it('should exclude processes without cwd', () => {\n const proc = makeProcess({ pid: 100, cwd: '' });\n const session = makeSession({ sessionId: 's1' });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it('should not match when CWD does not match resolvedCwd', () => {\n const proc = makeProcess({ pid: 100, cwd: '/projects/app-a' });\n const session = makeSession({ sessionId: 's1', resolvedCwd: '/projects/app-b' });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it('should not match when delta exceeds 3-minute tolerance', () => {\n const proc = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });\n const session = makeSession({\n sessionId: 's1',\n birthtimeMs: new Date('2026-03-18T23:22:00.000Z').getTime(), // ~4 min later\n });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it('should match at exactly 3-minute boundary', () => {\n const startTime = new Date('2026-03-18T23:18:00.000Z');\n const proc = makeProcess({ pid: 100, startTime });\n const session = makeSession({\n sessionId: 's1',\n birthtimeMs: startTime.getTime() + 180_000, // exactly 3 min\n });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toHaveLength(1);\n });\n\n it('should handle more sessions than processes', () => {\n const proc = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });\n const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime() });\n const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-18T23:19:00.000Z').getTime() });\n const s3 = makeSession({ sessionId: 's3', birthtimeMs: new Date('2026-03-18T23:19:30.000Z').getTime() });\n\n const results = matchProcessesToSessions([proc], [s1, s2, s3]);\n expect(results).toHaveLength(1);\n expect(results[0].session.sessionId).toBe('s1'); // closest\n });\n\n it('should handle more processes than sessions', () => {\n const p1 = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });\n const p2 = makeProcess({ pid: 200, startTime: new Date('2026-03-18T23:20:01.000Z') });\n const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime() });\n\n const results = matchProcessesToSessions([p1, p2], [s1]);\n expect(results).toHaveLength(1);\n expect(results[0].process.pid).toBe(100); // closest\n });\n\n it('should skip sessions with empty resolvedCwd', () => {\n const proc = makeProcess({ pid: 100 });\n const session = makeSession({ sessionId: 's1', resolvedCwd: '' });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it('should prefer best match when greedy ordering matters', () => {\n // p1 is 10s from s2, p2 is 5s from s2 — p2 should win s2, p1 gets s1\n const p1 = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:00.000Z') });\n const p2 = makeProcess({ pid: 200, startTime: new Date('2026-03-18T23:18:25.000Z') });\n const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:08.000Z').getTime() });\n const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-18T23:18:30.000Z').getTime() });\n\n const results = matchProcessesToSessions([p1, p2], [s1, s2]);\n expect(results).toHaveLength(2);\n\n const match1 = results.find(r => r.process.pid === 200);\n const match2 = results.find(r => r.process.pid === 100);\n expect(match1?.session.sessionId).toBe('s2'); // 5s delta\n expect(match2?.session.sessionId).toBe('s1'); // 8s delta\n });\n});\n\ndescribe('generateAgentName', () => {\n it('should return lowercase kebab-case name with pid', () => {\n expect(generateAgentName('/projects/my-app', 12345)).toBe('my-app-12345');\n });\n\n it('should handle root path', () => {\n expect(generateAgentName('/', 100)).toBe('unknown-100');\n });\n\n it('should handle empty cwd', () => {\n expect(generateAgentName('', 100)).toBe('unknown-100');\n });\n\n it('should handle nested paths', () => {\n expect(generateAgentName('/home/user/projects/ai-devkit', 78070)).toBe('ai-devkit-78070');\n });\n\n it('should convert spaces and special chars to kebab-case', () => {\n expect(generateAgentName('/projects/AI DevKit', 123)).toBe('ai-devkit-123');\n });\n\n it('should convert uppercase to lowercase', () => {\n expect(generateAgentName('/projects/MyProject', 456)).toBe('myproject-456');\n });\n});\n"],"names":["matchProcessesToSessions","generateAgentName","makeProcess","overrides","command","cwd","tty","startTime","Date","makeSession","filePath","sessionId","projectDir","birthtimeMs","getTime","resolvedCwd","describe","it","sessions","expect","toEqual","processes","pid","proc","s1","s2","results","toHaveLength","session","toBe","deltaMs","p1","p2","pids","map","r","process","sort","sids","match1","find","match2","undefined","s3"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/__tests__/utils/matching.test.ts"],"sourcesContent":["/**\n * Tests for utils/matching.ts\n */\n\nimport { matchProcessesToSessions, generateAgentName } from \"../../utils/matching.js\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport type { SessionFile } from \"../../utils/session.js\";\n\nfunction makeProcess(overrides: Partial<ProcessInfo> & { pid: number }): ProcessInfo {\n return {\n command: \"claude\",\n cwd: \"/projects/my-app\",\n tty: \"ttys001\",\n startTime: new Date(\"2026-03-18T23:18:01.000Z\"),\n ...overrides,\n };\n}\n\nfunction makeSession(overrides: Partial<SessionFile> & { sessionId: string }): SessionFile {\n return {\n filePath: `/home/.claude/projects/my-app/${overrides.sessionId}.jsonl`,\n projectDir: \"/home/.claude/projects/my-app\",\n birthtimeMs: new Date(\"2026-03-18T23:18:44.000Z\").getTime(),\n resolvedCwd: \"/projects/my-app\",\n ...overrides,\n };\n}\n\ndescribe(\"matchProcessesToSessions\", () => {\n it(\"should return empty array when no processes\", () => {\n const sessions = [makeSession({ sessionId: \"s1\" })];\n expect(matchProcessesToSessions([], sessions)).toEqual([]);\n });\n\n it(\"should return empty array when no sessions\", () => {\n const processes = [makeProcess({ pid: 100 })];\n expect(matchProcessesToSessions(processes, [])).toEqual([]);\n });\n\n it(\"should match a single process to closest session\", () => {\n const proc = makeProcess({ pid: 100, startTime: new Date(\"2026-03-18T23:18:01.000Z\") });\n const s1 = makeSession({\n sessionId: \"s1\",\n birthtimeMs: new Date(\"2026-03-18T23:18:44.000Z\").getTime(),\n });\n const s2 = makeSession({\n sessionId: \"s2\",\n birthtimeMs: new Date(\"2026-03-18T23:20:00.000Z\").getTime(),\n });\n\n const results = matchProcessesToSessions([proc], [s1, s2]);\n expect(results).toHaveLength(1);\n expect(results[0].session.sessionId).toBe(\"s1\");\n expect(results[0].deltaMs).toBe(43000);\n });\n\n it(\"should enforce 1:1 constraint — each process matches only one session\", () => {\n const p1 = makeProcess({ pid: 100, startTime: new Date(\"2026-03-18T23:18:01.000Z\") });\n const p2 = makeProcess({ pid: 200, startTime: new Date(\"2026-03-18T23:18:30.000Z\") });\n const s1 = makeSession({\n sessionId: \"s1\",\n birthtimeMs: new Date(\"2026-03-18T23:18:10.000Z\").getTime(),\n });\n const s2 = makeSession({\n sessionId: \"s2\",\n birthtimeMs: new Date(\"2026-03-18T23:18:35.000Z\").getTime(),\n });\n\n const results = matchProcessesToSessions([p1, p2], [s1, s2]);\n expect(results).toHaveLength(2);\n\n const pids = results.map((r) => r.process.pid).sort();\n const sids = results.map((r) => r.session.sessionId).sort();\n expect(pids).toEqual([100, 200]);\n expect(sids).toEqual([\"s1\", \"s2\"]);\n });\n\n it(\"should disambiguate multiple processes with same CWD by birthtime\", () => {\n const p1 = makeProcess({ pid: 100, startTime: new Date(\"2026-03-18T23:18:01.000Z\") });\n const p2 = makeProcess({ pid: 200, startTime: new Date(\"2026-03-19T08:53:11.000Z\") });\n const s1 = makeSession({\n sessionId: \"s1\",\n birthtimeMs: new Date(\"2026-03-18T23:18:44.000Z\").getTime(),\n });\n const s2 = makeSession({\n sessionId: \"s2\",\n birthtimeMs: new Date(\"2026-03-19T08:55:35.000Z\").getTime(),\n });\n\n const results = matchProcessesToSessions([p1, p2], [s1, s2]);\n expect(results).toHaveLength(2);\n\n const match1 = results.find((r) => r.process.pid === 100);\n const match2 = results.find((r) => r.process.pid === 200);\n expect(match1?.session.sessionId).toBe(\"s1\");\n expect(match2?.session.sessionId).toBe(\"s2\");\n });\n\n it(\"should exclude processes without startTime\", () => {\n const proc = makeProcess({ pid: 100, startTime: undefined });\n const session = makeSession({ sessionId: \"s1\" });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it(\"should exclude processes without cwd\", () => {\n const proc = makeProcess({ pid: 100, cwd: \"\" });\n const session = makeSession({ sessionId: \"s1\" });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it(\"should not match when CWD does not match resolvedCwd\", () => {\n const proc = makeProcess({ pid: 100, cwd: \"/projects/app-a\" });\n const session = makeSession({ sessionId: \"s1\", resolvedCwd: \"/projects/app-b\" });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it(\"should not match when delta exceeds 3-minute tolerance\", () => {\n const proc = makeProcess({ pid: 100, startTime: new Date(\"2026-03-18T23:18:01.000Z\") });\n const session = makeSession({\n sessionId: \"s1\",\n birthtimeMs: new Date(\"2026-03-18T23:22:00.000Z\").getTime(), // ~4 min later\n });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it(\"should match at exactly 3-minute boundary\", () => {\n const startTime = new Date(\"2026-03-18T23:18:00.000Z\");\n const proc = makeProcess({ pid: 100, startTime });\n const session = makeSession({\n sessionId: \"s1\",\n birthtimeMs: startTime.getTime() + 180_000, // exactly 3 min\n });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toHaveLength(1);\n });\n\n it(\"should handle more sessions than processes\", () => {\n const proc = makeProcess({ pid: 100, startTime: new Date(\"2026-03-18T23:18:01.000Z\") });\n const s1 = makeSession({\n sessionId: \"s1\",\n birthtimeMs: new Date(\"2026-03-18T23:18:44.000Z\").getTime(),\n });\n const s2 = makeSession({\n sessionId: \"s2\",\n birthtimeMs: new Date(\"2026-03-18T23:19:00.000Z\").getTime(),\n });\n const s3 = makeSession({\n sessionId: \"s3\",\n birthtimeMs: new Date(\"2026-03-18T23:19:30.000Z\").getTime(),\n });\n\n const results = matchProcessesToSessions([proc], [s1, s2, s3]);\n expect(results).toHaveLength(1);\n expect(results[0].session.sessionId).toBe(\"s1\"); // closest\n });\n\n it(\"should handle more processes than sessions\", () => {\n const p1 = makeProcess({ pid: 100, startTime: new Date(\"2026-03-18T23:18:01.000Z\") });\n const p2 = makeProcess({ pid: 200, startTime: new Date(\"2026-03-18T23:20:01.000Z\") });\n const s1 = makeSession({\n sessionId: \"s1\",\n birthtimeMs: new Date(\"2026-03-18T23:18:44.000Z\").getTime(),\n });\n\n const results = matchProcessesToSessions([p1, p2], [s1]);\n expect(results).toHaveLength(1);\n expect(results[0].process.pid).toBe(100); // closest\n });\n\n it(\"should skip sessions with empty resolvedCwd\", () => {\n const proc = makeProcess({ pid: 100 });\n const session = makeSession({ sessionId: \"s1\", resolvedCwd: \"\" });\n\n const results = matchProcessesToSessions([proc], [session]);\n expect(results).toEqual([]);\n });\n\n it(\"should prefer best match when greedy ordering matters\", () => {\n // p1 is 10s from s2, p2 is 5s from s2 — p2 should win s2, p1 gets s1\n const p1 = makeProcess({ pid: 100, startTime: new Date(\"2026-03-18T23:18:00.000Z\") });\n const p2 = makeProcess({ pid: 200, startTime: new Date(\"2026-03-18T23:18:25.000Z\") });\n const s1 = makeSession({\n sessionId: \"s1\",\n birthtimeMs: new Date(\"2026-03-18T23:18:08.000Z\").getTime(),\n });\n const s2 = makeSession({\n sessionId: \"s2\",\n birthtimeMs: new Date(\"2026-03-18T23:18:30.000Z\").getTime(),\n });\n\n const results = matchProcessesToSessions([p1, p2], [s1, s2]);\n expect(results).toHaveLength(2);\n\n const match1 = results.find((r) => r.process.pid === 200);\n const match2 = results.find((r) => r.process.pid === 100);\n expect(match1?.session.sessionId).toBe(\"s2\"); // 5s delta\n expect(match2?.session.sessionId).toBe(\"s1\"); // 8s delta\n });\n});\n\ndescribe(\"generateAgentName\", () => {\n it(\"should return lowercase kebab-case name with pid\", () => {\n expect(generateAgentName(\"/projects/my-app\", 12345)).toBe(\"my-app-12345\");\n });\n\n it(\"should handle root path\", () => {\n expect(generateAgentName(\"/\", 100)).toBe(\"unknown-100\");\n });\n\n it(\"should handle empty cwd\", () => {\n expect(generateAgentName(\"\", 100)).toBe(\"unknown-100\");\n });\n\n it(\"should handle nested paths\", () => {\n expect(generateAgentName(\"/home/user/projects/ai-devkit\", 78070)).toBe(\"ai-devkit-78070\");\n });\n\n it(\"should convert spaces and special chars to kebab-case\", () => {\n expect(generateAgentName(\"/projects/AI DevKit\", 123)).toBe(\"ai-devkit-123\");\n });\n\n it(\"should convert uppercase to lowercase\", () => {\n expect(generateAgentName(\"/projects/MyProject\", 456)).toBe(\"myproject-456\");\n });\n});\n"],"names":["matchProcessesToSessions","generateAgentName","makeProcess","overrides","command","cwd","tty","startTime","Date","makeSession","filePath","sessionId","projectDir","birthtimeMs","getTime","resolvedCwd","describe","it","sessions","expect","toEqual","processes","pid","proc","s1","s2","results","toHaveLength","session","toBe","deltaMs","p1","p2","pids","map","r","process","sort","sids","match1","find","match2","undefined","s3"],"mappings":"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"}