@ai-devkit/agent-manager 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/dist/AgentManager.d.ts +3 -3
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +80 -79
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +413 -388
  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/CopilotAdapter.test.js +254 -248
  12. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
  14. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
  15. package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
  16. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
  17. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +169 -169
  18. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
  19. package/dist/__tests__/capacity/codex.test.js +93 -93
  20. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  21. package/dist/__tests__/capacity/index.test.js +17 -17
  22. package/dist/__tests__/capacity/index.test.js.map +1 -1
  23. package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
  24. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
  25. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
  26. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
  27. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
  28. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
  29. package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
  30. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
  31. package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
  32. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
  33. package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
  34. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  35. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
  36. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  37. package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
  38. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  39. package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
  40. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  41. package/dist/__tests__/print/DurableAgent.test.js +9 -9
  42. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  43. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
  44. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
  45. package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
  46. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  47. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
  48. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
  49. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
  50. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
  51. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
  52. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
  53. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
  54. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
  55. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
  56. package/dist/__tests__/providers/codex/CodexSessionParser.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 +301 -0
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -0
  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/HerdrAgentRuntime.test.js +452 -0
  80. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
  81. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
  82. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
  83. package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
  84. package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
  85. package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
  86. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  87. package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
  88. package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
  89. package/dist/__tests__/utils/AgentRegistry.test.js +335 -217
  90. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  91. package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
  92. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/utils/agent-requests.test.js +43 -43
  94. package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
  95. package/dist/__tests__/utils/agents.test.js +17 -17
  96. package/dist/__tests__/utils/agents.test.js.map +1 -1
  97. package/dist/__tests__/utils/matching.test.js +92 -92
  98. package/dist/__tests__/utils/matching.test.js.map +1 -1
  99. package/dist/__tests__/utils/process.test.js +108 -108
  100. package/dist/__tests__/utils/process.test.js.map +1 -1
  101. package/dist/__tests__/utils/session.test.js +53 -53
  102. package/dist/__tests__/utils/session.test.js.map +1 -1
  103. package/dist/adapters/AgentAdapter.d.ts +2 -2
  104. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  105. package/dist/adapters/AgentAdapter.js +1 -1
  106. package/dist/adapters/AgentAdapter.js.map +1 -1
  107. package/dist/adapters/CopilotAdapter.d.ts +2 -2
  108. package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
  109. package/dist/adapters/CopilotAdapter.js +51 -51
  110. package/dist/adapters/CopilotAdapter.js.map +1 -1
  111. package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
  112. package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
  113. package/dist/adapters/GeminiCliAdapter.js +86 -86
  114. package/dist/adapters/GeminiCliAdapter.js.map +1 -1
  115. package/dist/adapters/GrokCliAdapter.d.ts +1 -1
  116. package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
  117. package/dist/adapters/GrokCliAdapter.js +80 -80
  118. package/dist/adapters/GrokCliAdapter.js.map +1 -1
  119. package/dist/adapters/OpenCodeAdapter.d.ts +1 -1
  120. package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
  121. package/dist/adapters/OpenCodeAdapter.js +37 -36
  122. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  123. package/dist/adapters/index.d.ts +9 -9
  124. package/dist/adapters/index.d.ts.map +1 -1
  125. package/dist/adapters/index.js +8 -8
  126. package/dist/adapters/index.js.map +1 -1
  127. package/dist/capacity/codex.d.ts +3 -3
  128. package/dist/capacity/codex.d.ts.map +1 -1
  129. package/dist/capacity/codex.js +57 -57
  130. package/dist/capacity/codex.js.map +1 -1
  131. package/dist/capacity/index.d.ts +3 -3
  132. package/dist/capacity/index.d.ts.map +1 -1
  133. package/dist/capacity/index.js +8 -8
  134. package/dist/capacity/index.js.map +1 -1
  135. package/dist/capacity/types.d.ts +1 -1
  136. package/dist/capacity/types.js.map +1 -1
  137. package/dist/database/connection.d.ts +1 -1
  138. package/dist/database/connection.d.ts.map +1 -1
  139. package/dist/database/connection.js +15 -15
  140. package/dist/database/connection.js.map +1 -1
  141. package/dist/database/index.d.ts +3 -3
  142. package/dist/database/index.d.ts.map +1 -1
  143. package/dist/database/index.js +2 -2
  144. package/dist/database/index.js.map +1 -1
  145. package/dist/database/migrations/005_agent_runtime.sql +2 -0
  146. package/dist/database/schema.d.ts +1 -1
  147. package/dist/database/schema.d.ts.map +1 -1
  148. package/dist/database/schema.js +7 -7
  149. package/dist/database/schema.js.map +1 -1
  150. package/dist/durable/DurableAgent.d.ts +9 -9
  151. package/dist/durable/DurableAgent.d.ts.map +1 -1
  152. package/dist/durable/DurableAgent.js +16 -16
  153. package/dist/durable/DurableAgent.js.map +1 -1
  154. package/dist/durable/DurableAgentRepository.d.ts +4 -4
  155. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  156. package/dist/durable/DurableAgentRepository.js +49 -48
  157. package/dist/durable/DurableAgentRepository.js.map +1 -1
  158. package/dist/durable/process.d.ts +1 -1
  159. package/dist/durable/process.d.ts.map +1 -1
  160. package/dist/durable/process.js +14 -14
  161. package/dist/durable/process.js.map +1 -1
  162. package/dist/durable/run.d.ts +2 -2
  163. package/dist/durable/run.d.ts.map +1 -1
  164. package/dist/durable/run.js +6 -6
  165. package/dist/durable/run.js.map +1 -1
  166. package/dist/durable/utils.d.ts +1 -1
  167. package/dist/durable/utils.d.ts.map +1 -1
  168. package/dist/durable/utils.js +4 -4
  169. package/dist/durable/utils.js.map +1 -1
  170. package/dist/index.d.ts +46 -41
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +27 -25
  173. package/dist/index.js.map +1 -1
  174. package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
  175. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
  176. package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
  177. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
  178. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
  179. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  180. package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
  181. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  182. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
  183. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  184. package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
  185. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  186. package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
  187. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
  188. package/dist/providers/claude/ClaudeSessionParser.js +99 -99
  189. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
  190. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  191. package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
  192. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
  193. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
  194. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  195. package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
  196. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
  197. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
  198. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  199. package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
  200. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
  201. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
  202. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  203. package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
  204. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
  205. package/dist/providers/codex/CodexAdapter.d.ts +27 -0
  206. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
  207. package/dist/providers/codex/CodexAdapter.js +162 -0
  208. package/dist/providers/codex/CodexAdapter.js.map +1 -0
  209. package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
  210. package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
  211. package/dist/providers/codex/CodexAgentMapper.js +35 -0
  212. package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
  213. package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
  214. package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
  215. package/dist/providers/codex/CodexSessionLocator.js +207 -0
  216. package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
  217. package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
  218. package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
  219. package/dist/providers/codex/CodexSessionMapping.js +68 -0
  220. package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
  221. package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
  222. package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
  223. package/dist/providers/codex/CodexSessionParser.js +262 -0
  224. package/dist/providers/codex/CodexSessionParser.js.map +1 -0
  225. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
  226. package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
  227. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
  228. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
  229. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  230. package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
  231. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
  232. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
  233. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  234. package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
  235. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
  236. package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
  237. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
  238. package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
  239. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
  240. package/dist/providers/pi/PiAdapter.d.ts +28 -0
  241. package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
  242. package/dist/providers/pi/PiAdapter.js +153 -0
  243. package/dist/providers/pi/PiAdapter.js.map +1 -0
  244. package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
  245. package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
  246. package/dist/providers/pi/PiAgentMapper.js +37 -0
  247. package/dist/providers/pi/PiAgentMapper.js.map +1 -0
  248. package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
  249. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
  250. package/dist/providers/pi/PiSessionLocator.js +79 -0
  251. package/dist/providers/pi/PiSessionLocator.js.map +1 -0
  252. package/dist/providers/pi/PiSessionParser.d.ts +36 -0
  253. package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
  254. package/dist/providers/pi/PiSessionParser.js +191 -0
  255. package/dist/providers/pi/PiSessionParser.js.map +1 -0
  256. package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
  257. package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
  258. package/dist/providers/pi/PiSessionTracker.js +69 -0
  259. package/dist/providers/pi/PiSessionTracker.js.map +1 -0
  260. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
  261. package/dist/providers/pi/durable/PiCliProbe.js +15 -15
  262. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
  263. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
  264. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  265. package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
  266. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
  267. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  268. package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
  269. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
  270. package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
  271. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
  272. package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
  273. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
  274. package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
  275. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
  276. package/dist/providers/pi/durable/PiStreamParser.js +16 -16
  277. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
  278. package/dist/readiness/AgentReadiness.d.ts +67 -0
  279. package/dist/readiness/AgentReadiness.d.ts.map +1 -0
  280. package/dist/readiness/AgentReadiness.js +614 -0
  281. package/dist/readiness/AgentReadiness.js.map +1 -0
  282. package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
  283. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
  284. package/dist/runtime/ManagedAgentRuntime.js +156 -0
  285. package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
  286. package/dist/runtime/RuntimeFactory.d.ts +4 -0
  287. package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
  288. package/dist/runtime/RuntimeFactory.js +11 -0
  289. package/dist/runtime/RuntimeFactory.js.map +1 -0
  290. package/dist/runtime/errors.d.ts +27 -0
  291. package/dist/runtime/errors.d.ts.map +1 -0
  292. package/dist/runtime/errors.js +42 -0
  293. package/dist/runtime/errors.js.map +1 -0
  294. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +31 -0
  295. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
  296. package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -0
  297. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
  298. package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
  299. package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
  300. package/dist/runtime/herdr/HerdrCliClient.js +60 -0
  301. package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
  302. package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
  303. package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
  304. package/dist/runtime/herdr/HerdrErrors.js +10 -0
  305. package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
  306. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +14 -0
  307. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
  308. package/dist/runtime/herdr/HerdrResponseParsers.js +96 -0
  309. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
  310. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
  311. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
  312. package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
  313. package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
  314. package/dist/runtime/tmux/PidPolling.d.ts +5 -0
  315. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
  316. package/dist/runtime/tmux/PidPolling.js +24 -0
  317. package/dist/runtime/tmux/PidPolling.js.map +1 -0
  318. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
  319. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
  320. package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
  321. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
  322. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
  323. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
  324. package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
  325. package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
  326. package/dist/runtime/types.d.ts +54 -0
  327. package/dist/runtime/types.d.ts.map +1 -0
  328. package/dist/runtime/types.js +3 -0
  329. package/dist/runtime/types.js.map +1 -0
  330. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  331. package/dist/terminal/TerminalFocusManager.js +50 -50
  332. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  333. package/dist/terminal/TmuxManager.d.ts.map +1 -1
  334. package/dist/terminal/TmuxManager.js +47 -47
  335. package/dist/terminal/TmuxManager.js.map +1 -1
  336. package/dist/terminal/TtyWriter.d.ts +1 -1
  337. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  338. package/dist/terminal/TtyWriter.js +89 -89
  339. package/dist/terminal/TtyWriter.js.map +1 -1
  340. package/dist/terminal/index.d.ts +4 -4
  341. package/dist/terminal/index.js +3 -3
  342. package/dist/terminal/index.js.map +1 -1
  343. package/dist/utils/AgentRegistry.d.ts +10 -2
  344. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  345. package/dist/utils/AgentRegistry.js +57 -24
  346. package/dist/utils/AgentRegistry.js.map +1 -1
  347. package/dist/utils/agent-requests.d.ts.map +1 -1
  348. package/dist/utils/agent-requests.js +5 -5
  349. package/dist/utils/agent-requests.js.map +1 -1
  350. package/dist/utils/agents.d.ts +2 -2
  351. package/dist/utils/agents.d.ts.map +1 -1
  352. package/dist/utils/agents.js +15 -15
  353. package/dist/utils/agents.js.map +1 -1
  354. package/dist/utils/applescript.js +1 -1
  355. package/dist/utils/applescript.js.map +1 -1
  356. package/dist/utils/index.d.ts +6 -6
  357. package/dist/utils/index.d.ts.map +1 -1
  358. package/dist/utils/index.js +4 -4
  359. package/dist/utils/index.js.map +1 -1
  360. package/dist/utils/matching.d.ts +2 -2
  361. package/dist/utils/matching.d.ts.map +1 -1
  362. package/dist/utils/matching.js +4 -4
  363. package/dist/utils/matching.js.map +1 -1
  364. package/dist/utils/process.d.ts +1 -1
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +74 -74
  367. package/dist/utils/process.js.map +1 -1
  368. package/dist/utils/session.d.ts +1 -1
  369. package/dist/utils/session.d.ts.map +1 -1
  370. package/dist/utils/session.js +7 -7
  371. package/dist/utils/session.js.map +1 -1
  372. package/dist/utils/sortAgents.d.ts +2 -2
  373. package/dist/utils/sortAgents.d.ts.map +1 -1
  374. package/dist/utils/sortAgents.js +5 -5
  375. package/dist/utils/sortAgents.js.map +1 -1
  376. package/package.json +18 -19
  377. package/src/AgentManager.ts +283 -281
  378. package/src/__tests__/AgentManager.test.ts +917 -907
  379. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
  380. package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
  381. package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
  382. package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
  383. package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
  384. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -455
  385. package/src/__tests__/capacity/codex.test.ts +178 -91
  386. package/src/__tests__/capacity/index.test.ts +27 -18
  387. package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
  388. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
  389. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
  390. package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
  391. package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
  392. package/src/__tests__/fixtures/fake-claude.cjs +20 -13
  393. package/src/__tests__/fixtures/fake-codex.cjs +41 -30
  394. package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
  395. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
  396. package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
  397. package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
  398. package/src/__tests__/print/DurableAgent.test.ts +19 -16
  399. package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
  400. package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
  401. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
  402. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
  403. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
  404. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
  405. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
  406. package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
  407. package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
  408. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
  409. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
  410. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
  411. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
  412. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
  413. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
  414. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
  415. package/src/__tests__/readiness/AgentReadiness.test.ts +242 -0
  416. package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
  417. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -0
  418. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
  419. package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
  420. package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
  421. package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
  422. package/src/__tests__/utils/AgentRegistry.test.ts +506 -402
  423. package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
  424. package/src/__tests__/utils/agent-requests.test.ts +76 -56
  425. package/src/__tests__/utils/agents.test.ts +20 -20
  426. package/src/__tests__/utils/matching.test.ts +206 -171
  427. package/src/__tests__/utils/process.test.ts +276 -262
  428. package/src/__tests__/utils/session.test.ts +133 -139
  429. package/src/adapters/AgentAdapter.ts +134 -126
  430. package/src/adapters/CopilotAdapter.ts +405 -395
  431. package/src/adapters/GeminiCliAdapter.ts +598 -600
  432. package/src/adapters/GrokCliAdapter.ts +353 -342
  433. package/src/adapters/OpenCodeAdapter.ts +285 -259
  434. package/src/adapters/index.ts +15 -9
  435. package/src/capacity/codex.ts +137 -84
  436. package/src/capacity/index.ts +18 -13
  437. package/src/capacity/types.ts +1 -1
  438. package/src/database/connection.ts +73 -68
  439. package/src/database/index.ts +6 -6
  440. package/src/database/migrations/005_agent_runtime.sql +2 -0
  441. package/src/database/schema.ts +40 -38
  442. package/src/durable/DurableAgent.ts +85 -85
  443. package/src/durable/DurableAgentRepository.ts +409 -260
  444. package/src/durable/process.ts +22 -21
  445. package/src/durable/run.ts +61 -51
  446. package/src/durable/utils.ts +46 -41
  447. package/src/index.ts +145 -86
  448. package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
  449. package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
  450. package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
  451. package/src/providers/claude/ClaudeSessionParser.ts +322 -338
  452. package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
  453. package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
  454. package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
  455. package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
  456. package/src/providers/codex/CodexAdapter.ts +205 -0
  457. package/src/providers/codex/CodexAgentMapper.ts +35 -0
  458. package/src/providers/codex/CodexSessionLocator.ts +279 -0
  459. package/src/providers/codex/CodexSessionMapping.ts +89 -0
  460. package/src/providers/codex/CodexSessionParser.ts +385 -0
  461. package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
  462. package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
  463. package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
  464. package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
  465. package/src/providers/pi/PiAdapter.ts +183 -0
  466. package/src/providers/pi/PiAgentMapper.ts +36 -0
  467. package/src/providers/pi/PiSessionLocator.ts +95 -0
  468. package/src/providers/pi/PiSessionParser.ts +284 -0
  469. package/src/providers/pi/PiSessionTracker.ts +87 -0
  470. package/src/providers/pi/durable/PiCliProbe.ts +42 -34
  471. package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
  472. package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
  473. package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
  474. package/src/providers/pi/durable/PiStreamParser.ts +82 -72
  475. package/src/readiness/AgentReadiness.ts +727 -0
  476. package/src/runtime/ManagedAgentRuntime.ts +266 -0
  477. package/src/runtime/RuntimeFactory.ts +13 -0
  478. package/src/runtime/errors.ts +50 -0
  479. package/src/runtime/herdr/HerdrAgentRuntime.ts +190 -0
  480. package/src/runtime/herdr/HerdrCliClient.ts +78 -0
  481. package/src/runtime/herdr/HerdrErrors.ts +9 -0
  482. package/src/runtime/herdr/HerdrResponseParsers.ts +76 -0
  483. package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
  484. package/src/runtime/tmux/PidPolling.ts +34 -0
  485. package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
  486. package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
  487. package/src/runtime/types.ts +56 -0
  488. package/src/terminal/TerminalFocusManager.ts +215 -212
  489. package/src/terminal/TmuxManager.ts +99 -92
  490. package/src/terminal/TtyWriter.ts +203 -194
  491. package/src/terminal/index.ts +4 -4
  492. package/src/utils/AgentRegistry.ts +299 -238
  493. package/src/utils/agent-requests.ts +16 -16
  494. package/src/utils/agents.ts +41 -38
  495. package/src/utils/applescript.ts +4 -4
  496. package/src/utils/index.ts +12 -6
  497. package/src/utils/matching.ts +43 -43
  498. package/src/utils/process.ts +261 -258
  499. package/src/utils/session.ts +66 -66
  500. package/src/utils/sortAgents.ts +35 -33
  501. package/tsconfig.json +2 -8
  502. package/vitest.config.ts +16 -16
  503. package/.eslintrc.json +0 -31
  504. package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
  505. package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
  506. package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
  507. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
  508. package/dist/adapters/CodexAdapter.d.ts +0 -109
  509. package/dist/adapters/CodexAdapter.d.ts.map +0 -1
  510. package/dist/adapters/CodexAdapter.js +0 -710
  511. package/dist/adapters/CodexAdapter.js.map +0 -1
  512. package/dist/adapters/PiAdapter.d.ts +0 -63
  513. package/dist/adapters/PiAdapter.d.ts.map +0 -1
  514. package/dist/adapters/PiAdapter.js +0 -453
  515. package/dist/adapters/PiAdapter.js.map +0 -1
  516. package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
  517. package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
  518. package/src/adapters/CodexAdapter.ts +0 -923
  519. 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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"}