@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,8 +1,8 @@
1
- import { execFile } from 'child_process';
2
- import { promisify } from 'util';
3
- import type { TerminalLocation } from './TerminalFocusManager.js';
4
- import { TerminalType } from './TerminalFocusManager.js';
5
- import { escapeAppleScript } from '../utils/applescript.js';
1
+ import { execFile } from "child_process";
2
+ import { promisify } from "util";
3
+ import type { TerminalLocation } from "./TerminalFocusManager.js";
4
+ import { TerminalType } from "./TerminalFocusManager.js";
5
+ import { escapeAppleScript } from "../utils/applescript.js";
6
6
 
7
7
  const execFileAsync = promisify(execFile);
8
8
 
@@ -10,101 +10,99 @@ const execFileAsync = promisify(execFile);
10
10
  * Carriage return byte (0x0d). Sent as a fixed discrete argv element with
11
11
  * `--no-paste` to deliver Enter literally (shell equivalent: $'\x0d').
12
12
  */
13
- const CARRIAGE_RETURN = '\x0d';
13
+ const CARRIAGE_RETURN = "\x0d";
14
14
 
15
15
  /**
16
16
  * Escape byte (0x1b). Recognized by `sendKey` and translated to the
17
17
  * backend-native representation (`Escape` for tmux, `key code 53` for
18
18
  * AppleScript, the literal byte for WezTerm).
19
19
  */
20
- const ESCAPE_BYTE = '\x1b';
20
+ const ESCAPE_BYTE = "\x1b";
21
21
 
22
22
  export class TtyWriter {
23
- /**
24
- * Send a message as keyboard input to a terminal session.
25
- *
26
- * Dispatches to the correct mechanism based on terminal type:
27
- * - tmux: `tmux send-keys`
28
- * - iTerm2: Two separate AppleScript `write text` calls (text then newline)
29
- * - Terminal.app: Two separate AppleScript `do script` calls (text then newline)
30
- *
31
- * All AppleScript is executed via `execFile('osascript', ['-e', script])`
32
- * to avoid shell interpolation and command injection.
33
- *
34
- * @param location Terminal location from TerminalFocusManager.findTerminal()
35
- * @param message Text to send
36
- * @throws Error if terminal type is unsupported or send fails
37
- */
38
- static async send(location: TerminalLocation, message: string): Promise<void> {
39
- switch (location.type) {
40
- case TerminalType.TMUX:
41
- return TtyWriter.sendViaTmux(location.identifier, message);
42
- case TerminalType.WEZTERM:
43
- return TtyWriter.sendViaWezterm(location.identifier, message);
44
- case TerminalType.ITERM2:
45
- return TtyWriter.sendViaITerm2(location.tty, message);
46
- case TerminalType.TERMINAL_APP:
47
- return TtyWriter.sendViaTerminalApp(location.tty, message);
48
- default:
49
- throw new Error(
50
- `Cannot send input: unsupported terminal type "${location.type}". ` +
51
- 'Supported: tmux, WezTerm, iTerm2, Terminal.app.'
52
- );
53
- }
23
+ /**
24
+ * Send a message as keyboard input to a terminal session.
25
+ *
26
+ * Dispatches to the correct mechanism based on terminal type:
27
+ * - tmux: `tmux send-keys`
28
+ * - iTerm2: Two separate AppleScript `write text` calls (text then newline)
29
+ * - Terminal.app: Two separate AppleScript `do script` calls (text then newline)
30
+ *
31
+ * All AppleScript is executed via `execFile('osascript', ['-e', script])`
32
+ * to avoid shell interpolation and command injection.
33
+ *
34
+ * @param location Terminal location from TerminalFocusManager.findTerminal()
35
+ * @param message Text to send
36
+ * @throws Error if terminal type is unsupported or send fails
37
+ */
38
+ static async send(location: TerminalLocation, message: string): Promise<void> {
39
+ switch (location.type) {
40
+ case TerminalType.TMUX:
41
+ return TtyWriter.sendViaTmux(location.identifier, message);
42
+ case TerminalType.WEZTERM:
43
+ return TtyWriter.sendViaWezterm(location.identifier, message);
44
+ case TerminalType.ITERM2:
45
+ return TtyWriter.sendViaITerm2(location.tty, message);
46
+ case TerminalType.TERMINAL_APP:
47
+ return TtyWriter.sendViaTerminalApp(location.tty, message);
48
+ default:
49
+ throw new Error(
50
+ `Cannot send input: unsupported terminal type "${location.type}". ` +
51
+ "Supported: tmux, WezTerm, iTerm2, Terminal.app.",
52
+ );
54
53
  }
54
+ }
55
55
 
56
- /**
57
- * Send a single raw key (e.g. "1", "Enter", "Up") to the terminal as a
58
- * keystroke — bypassing bracketed paste and without auto-appending Enter.
59
- *
60
- * Use this when the target TUI distinguishes between typed text and raw
61
- * keypresses (e.g. an `AskUserQuestion` picker that selects on digit-key
62
- * press, not on a pasted digit followed by Enter).
63
- *
64
- * - tmux: `tmux send-keys -t <id> <key>` — direct keystroke, no paste buffer.
65
- * - WezTerm: `wezterm cli send-text --pane-id <id> --no-paste <key>`.
66
- * - iTerm2 / Terminal.app: AppleScript via System Events. Requires
67
- * Accessibility permissions.
68
- */
69
- static async sendKey(location: TerminalLocation, key: string): Promise<void> {
70
- switch (location.type) {
71
- case TerminalType.TMUX:
72
- return TtyWriter.sendKeyViaTmux(location.identifier, key);
73
- case TerminalType.WEZTERM:
74
- return TtyWriter.sendKeyViaWezterm(location.identifier, key);
75
- case TerminalType.ITERM2:
76
- return TtyWriter.sendKeyViaITerm2(location.tty, key);
77
- case TerminalType.TERMINAL_APP:
78
- return TtyWriter.sendKeyViaTerminalApp(location.tty, key);
79
- default:
80
- throw new Error(
81
- `Cannot send key: unsupported terminal type "${location.type}". ` +
82
- 'Supported: tmux, WezTerm, iTerm2, Terminal.app.'
83
- );
84
- }
56
+ /**
57
+ * Send a single raw key (e.g. "1", "Enter", "Up") to the terminal as a
58
+ * keystroke — bypassing bracketed paste and without auto-appending Enter.
59
+ *
60
+ * Use this when the target TUI distinguishes between typed text and raw
61
+ * keypresses (e.g. an `AskUserQuestion` picker that selects on digit-key
62
+ * press, not on a pasted digit followed by Enter).
63
+ *
64
+ * - tmux: `tmux send-keys -t <id> <key>` — direct keystroke, no paste buffer.
65
+ * - WezTerm: `wezterm cli send-text --pane-id <id> --no-paste <key>`.
66
+ * - iTerm2 / Terminal.app: AppleScript via System Events. Requires
67
+ * Accessibility permissions.
68
+ */
69
+ static async sendKey(location: TerminalLocation, key: string): Promise<void> {
70
+ switch (location.type) {
71
+ case TerminalType.TMUX:
72
+ return TtyWriter.sendKeyViaTmux(location.identifier, key);
73
+ case TerminalType.WEZTERM:
74
+ return TtyWriter.sendKeyViaWezterm(location.identifier, key);
75
+ case TerminalType.ITERM2:
76
+ return TtyWriter.sendKeyViaITerm2(location.tty, key);
77
+ case TerminalType.TERMINAL_APP:
78
+ return TtyWriter.sendKeyViaTerminalApp(location.tty, key);
79
+ default:
80
+ throw new Error(
81
+ `Cannot send key: unsupported terminal type "${location.type}". ` +
82
+ "Supported: tmux, WezTerm, iTerm2, Terminal.app.",
83
+ );
85
84
  }
85
+ }
86
86
 
87
- private static async sendKeyViaTmux(identifier: string, key: string): Promise<void> {
88
- // tmux send-keys interprets named keys (Enter, Up, Escape, ...) and
89
- // passes literals through. No bracketed paste, no auto-Enter.
90
- const arg = key === ESCAPE_BYTE ? 'Escape' : key;
91
- await execFileAsync('tmux', ['send-keys', '-t', identifier, arg]);
92
- }
87
+ private static async sendKeyViaTmux(identifier: string, key: string): Promise<void> {
88
+ // tmux send-keys interprets named keys (Enter, Up, Escape, ...) and
89
+ // passes literals through. No bracketed paste, no auto-Enter.
90
+ const arg = key === ESCAPE_BYTE ? "Escape" : key;
91
+ await execFileAsync("tmux", ["send-keys", "-t", identifier, arg]);
92
+ }
93
93
 
94
- private static async sendKeyViaWezterm(paneId: string, key: string): Promise<void> {
95
- // --no-paste delivers the key bytes literally outside bracketed-paste
96
- // markers; the TUI sees a raw keystroke. For Esc (`\x1b`), wezterm
97
- // accepts the byte directly.
98
- await execFileAsync('wezterm', [
99
- 'cli', 'send-text', '--pane-id', paneId, '--no-paste', key,
100
- ]);
101
- }
94
+ private static async sendKeyViaWezterm(paneId: string, key: string): Promise<void> {
95
+ // --no-paste delivers the key bytes literally outside bracketed-paste
96
+ // markers; the TUI sees a raw keystroke. For Esc (`\x1b`), wezterm
97
+ // accepts the byte directly.
98
+ await execFileAsync("wezterm", ["cli", "send-text", "--pane-id", paneId, "--no-paste", key]);
99
+ }
102
100
 
103
- private static async sendKeyViaITerm2(tty: string, key: string): Promise<void> {
104
- // Focus the target session, then press the key via System Events so the
105
- // inner TUI sees a raw keystroke (not a bracketed-paste text run).
106
- const action = appleScriptKeyAction(key);
107
- const script = `
101
+ private static async sendKeyViaITerm2(tty: string, key: string): Promise<void> {
102
+ // Focus the target session, then press the key via System Events so the
103
+ // inner TUI sees a raw keystroke (not a bracketed-paste text run).
104
+ const action = appleScriptKeyAction(key);
105
+ const script = `
108
106
  tell application "iTerm"
109
107
  set targetSession to missing value
110
108
  repeat with w in windows
@@ -128,15 +126,15 @@ end tell
128
126
  tell application "System Events" to ${action}
129
127
  return "ok"`;
130
128
 
131
- const { stdout } = await execFileAsync('osascript', ['-e', script]);
132
- if (stdout.trim() !== 'ok') {
133
- throw new Error(`iTerm2 session not found for TTY ${tty}`);
134
- }
129
+ const { stdout } = await execFileAsync("osascript", ["-e", script]);
130
+ if (stdout.trim() !== "ok") {
131
+ throw new Error(`iTerm2 session not found for TTY ${tty}`);
135
132
  }
133
+ }
136
134
 
137
- private static async sendKeyViaTerminalApp(tty: string, key: string): Promise<void> {
138
- const action = appleScriptKeyAction(key);
139
- const script = `
135
+ private static async sendKeyViaTerminalApp(tty: string, key: string): Promise<void> {
136
+ const action = appleScriptKeyAction(key);
137
+ const script = `
140
138
  tell application "Terminal"
141
139
  set targetTab to missing value
142
140
  set targetWindow to missing value
@@ -159,70 +157,81 @@ end tell
159
157
  tell application "System Events" to ${action}
160
158
  return "ok"`;
161
159
 
162
- const { stdout } = await execFileAsync('osascript', ['-e', script]);
163
- if (stdout.trim() !== 'ok') {
164
- throw new Error(`Terminal.app tab not found for TTY ${tty}`);
165
- }
160
+ const { stdout } = await execFileAsync("osascript", ["-e", script]);
161
+ if (stdout.trim() !== "ok") {
162
+ throw new Error(`Terminal.app tab not found for TTY ${tty}`);
166
163
  }
164
+ }
167
165
 
168
- private static async sendViaWezterm(paneId: string, message: string): Promise<void> {
169
- // Two explicit CLI calls, mirroring the text-then-Enter convention used
170
- // by tmux / iTerm2 / Terminal.app so a bracketed-paste-aware TUI still
171
- // sees Enter as a submit.
172
- //
173
- // Step 1 (text): write the message to stdin so prompt contents are not
174
- // exposed through process arguments. execFile still spawns wezterm
175
- // directly (no shell), so shell metacharacters remain inert.
176
- // Step 2 (Enter): pass a fixed carriage return (0x0d) as a discrete
177
- // argv element (the JS char '\x0d') with --no-paste, so the CR is
178
- // delivered literally rather than wrapped in paste brackets. The
179
- // equivalent shell command is:
180
- // wezterm cli send-text --pane-id <id> --no-paste $'\x0d'
181
- // (ANSI-C quoting, note the leading $).
182
- await TtyWriter.execFileWithInput('wezterm', [
183
- 'cli', 'send-text', '--pane-id', paneId,
184
- ], message);
185
- await new Promise((resolve) => setTimeout(resolve, 150));
186
- await execFileAsync('wezterm', [
187
- 'cli', 'send-text', '--pane-id', paneId, '--no-paste', CARRIAGE_RETURN,
188
- ]);
189
- }
166
+ private static async sendViaWezterm(paneId: string, message: string): Promise<void> {
167
+ // Two explicit CLI calls, mirroring the text-then-Enter convention used
168
+ // by tmux / iTerm2 / Terminal.app so a bracketed-paste-aware TUI still
169
+ // sees Enter as a submit.
170
+ //
171
+ // Step 1 (text): write the message to stdin so prompt contents are not
172
+ // exposed through process arguments. execFile still spawns wezterm
173
+ // directly (no shell), so shell metacharacters remain inert.
174
+ // Step 2 (Enter): pass a fixed carriage return (0x0d) as a discrete
175
+ // argv element (the JS char '\x0d') with --no-paste, so the CR is
176
+ // delivered literally rather than wrapped in paste brackets. The
177
+ // equivalent shell command is:
178
+ // wezterm cli send-text --pane-id <id> --no-paste $'\x0d'
179
+ // (ANSI-C quoting, note the leading $).
180
+ await TtyWriter.execFileWithInput(
181
+ "wezterm",
182
+ ["cli", "send-text", "--pane-id", paneId],
183
+ message,
184
+ );
185
+ await new Promise((resolve) => setTimeout(resolve, 150));
186
+ await execFileAsync("wezterm", [
187
+ "cli",
188
+ "send-text",
189
+ "--pane-id",
190
+ paneId,
191
+ "--no-paste",
192
+ CARRIAGE_RETURN,
193
+ ]);
194
+ }
190
195
 
191
- private static async sendViaTmux(identifier: string, message: string): Promise<void> {
192
- // Paste the message body using tmux bracketed paste, then send Enter as
193
- // a separate key so the inner TUI treats it as submission rather than
194
- // pasted content.
195
- const bufferName = `ai-devkit-send-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
196
- await TtyWriter.execFileWithInput('tmux', ['load-buffer', '-b', bufferName, '-'], message);
197
- await execFileAsync('tmux', ['paste-buffer', '-t', identifier, '-b', bufferName, '-p', '-d']);
198
- await new Promise((resolve) => setTimeout(resolve, 150));
199
- await execFileAsync('tmux', ['send-keys', '-t', identifier, 'Enter']);
200
- }
196
+ private static async sendViaTmux(identifier: string, message: string): Promise<void> {
197
+ // Paste the message body using tmux bracketed paste, then send Enter as
198
+ // a separate key so the inner TUI treats it as submission rather than
199
+ // pasted content.
200
+ const bufferName = `ai-devkit-send-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
201
+ await TtyWriter.execFileWithInput("tmux", ["load-buffer", "-b", bufferName, "-"], message);
202
+ await execFileAsync("tmux", ["paste-buffer", "-t", identifier, "-b", bufferName, "-p", "-d"]);
203
+ await new Promise((resolve) => setTimeout(resolve, 150));
204
+ await execFileAsync("tmux", ["send-keys", "-t", identifier, "Enter"]);
205
+ }
201
206
 
202
- private static async execFileWithInput(command: string, args: string[], input: string): Promise<void> {
203
- await new Promise<void>((resolve, reject) => {
204
- const child = execFile(command, args, (error) => {
205
- if (error) {
206
- reject(error);
207
- return;
208
- }
209
- resolve();
210
- });
211
- if (!child.stdin) {
212
- reject(new Error(`Cannot write stdin to ${command}`));
213
- return;
214
- }
215
- child.stdin.end(input);
216
- });
217
- }
207
+ private static async execFileWithInput(
208
+ command: string,
209
+ args: string[],
210
+ input: string,
211
+ ): Promise<void> {
212
+ await new Promise<void>((resolve, reject) => {
213
+ const child = execFile(command, args, (error) => {
214
+ if (error) {
215
+ reject(error);
216
+ return;
217
+ }
218
+ resolve();
219
+ });
220
+ if (!child.stdin) {
221
+ reject(new Error(`Cannot write stdin to ${command}`));
222
+ return;
223
+ }
224
+ child.stdin.end(input);
225
+ });
226
+ }
218
227
 
219
- /**
220
- * Build an AppleScript that finds an iTerm2 session by TTY and runs a
221
- * command against it. The `sessionCommand` is inserted inside a
222
- * `tell targetSession` block.
223
- */
224
- private static iterm2SessionScript(tty: string, sessionCommand: string): string {
225
- return `
228
+ /**
229
+ * Build an AppleScript that finds an iTerm2 session by TTY and runs a
230
+ * command against it. The `sessionCommand` is inserted inside a
231
+ * `tell targetSession` block.
232
+ */
233
+ private static iterm2SessionScript(tty: string, sessionCommand: string): string {
234
+ return `
226
235
  tell application "iTerm"
227
236
  set targetSession to missing value
228
237
  repeat with w in windows
@@ -241,41 +250,41 @@ tell application "iTerm"
241
250
  tell targetSession to ${sessionCommand}
242
251
  end tell
243
252
  return "ok"`;
244
- }
253
+ }
245
254
 
246
- private static async sendViaITerm2(tty: string, message: string): Promise<void> {
247
- const escaped = escapeAppleScript(message);
248
- // Send text and Enter as two separate write text calls so the newline
249
- // is delivered outside the bracketed paste sequence of the message body.
250
- // iTerm2 appends the newline after the paste-end marker (\e[201~), so
251
- // the inner TUI (Claude Code, Codex) sees it as a real submit action.
252
- const textScript = TtyWriter.iterm2SessionScript(tty, `write text "${escaped}" newline no`);
255
+ private static async sendViaITerm2(tty: string, message: string): Promise<void> {
256
+ const escaped = escapeAppleScript(message);
257
+ // Send text and Enter as two separate write text calls so the newline
258
+ // is delivered outside the bracketed paste sequence of the message body.
259
+ // iTerm2 appends the newline after the paste-end marker (\e[201~), so
260
+ // the inner TUI (Claude Code, Codex) sees it as a real submit action.
261
+ const textScript = TtyWriter.iterm2SessionScript(tty, `write text "${escaped}" newline no`);
253
262
 
254
- const { stdout: textResult } = await execFileAsync('osascript', ['-e', textScript]);
255
- if (textResult.trim() !== 'ok') {
256
- throw new Error(`iTerm2 session not found for TTY ${tty}`);
257
- }
263
+ const { stdout: textResult } = await execFileAsync("osascript", ["-e", textScript]);
264
+ if (textResult.trim() !== "ok") {
265
+ throw new Error(`iTerm2 session not found for TTY ${tty}`);
266
+ }
258
267
 
259
- // Wait for the paste to complete before sending Enter separately
260
- await new Promise((resolve) => setTimeout(resolve, 150));
268
+ // Wait for the paste to complete before sending Enter separately
269
+ await new Promise((resolve) => setTimeout(resolve, 150));
261
270
 
262
- const enterScript = TtyWriter.iterm2SessionScript(tty, 'write text "" newline yes');
263
- const { stdout: enterResult } = await execFileAsync('osascript', ['-e', enterScript]);
264
- if (enterResult.trim() !== 'ok') {
265
- throw new Error(`iTerm2 session disappeared before Enter could be sent for TTY ${tty}`);
266
- }
271
+ const enterScript = TtyWriter.iterm2SessionScript(tty, 'write text "" newline yes');
272
+ const { stdout: enterResult } = await execFileAsync("osascript", ["-e", enterScript]);
273
+ if (enterResult.trim() !== "ok") {
274
+ throw new Error(`iTerm2 session disappeared before Enter could be sent for TTY ${tty}`);
267
275
  }
276
+ }
268
277
 
269
- private static async sendViaTerminalApp(tty: string, message: string): Promise<void> {
270
- const escaped = escapeAppleScript(message);
271
- // Use Terminal.app's `do script` to send text to the correct tab by TTY.
272
- // We avoid System Events `keystroke` + `key code 36` because it requires
273
- // accessibility permissions and unreliably delivers the Return key.
274
- //
275
- // `do script` with `in` targets a specific tab without opening a new one.
276
- // We send text and Enter as two separate calls so the newline arrives
277
- // outside of bracketed paste mode — same pattern as iTerm2 and tmux.
278
- const textScript = `
278
+ private static async sendViaTerminalApp(tty: string, message: string): Promise<void> {
279
+ const escaped = escapeAppleScript(message);
280
+ // Use Terminal.app's `do script` to send text to the correct tab by TTY.
281
+ // We avoid System Events `keystroke` + `key code 36` because it requires
282
+ // accessibility permissions and unreliably delivers the Return key.
283
+ //
284
+ // `do script` with `in` targets a specific tab without opening a new one.
285
+ // We send text and Enter as two separate calls so the newline arrives
286
+ // outside of bracketed paste mode — same pattern as iTerm2 and tmux.
287
+ const textScript = `
279
288
  tell application "Terminal"
280
289
  set targetTab to missing value
281
290
  repeat with w in windows
@@ -293,15 +302,15 @@ tell application "Terminal"
293
302
  end tell
294
303
  return "ok"`;
295
304
 
296
- const { stdout: textResult } = await execFileAsync('osascript', ['-e', textScript]);
297
- if (textResult.trim() !== 'ok') {
298
- throw new Error(`Terminal.app tab not found for TTY ${tty}`);
299
- }
305
+ const { stdout: textResult } = await execFileAsync("osascript", ["-e", textScript]);
306
+ if (textResult.trim() !== "ok") {
307
+ throw new Error(`Terminal.app tab not found for TTY ${tty}`);
308
+ }
300
309
 
301
- // Wait for the text to be delivered before sending Enter
302
- await new Promise((resolve) => setTimeout(resolve, 150));
310
+ // Wait for the text to be delivered before sending Enter
311
+ await new Promise((resolve) => setTimeout(resolve, 150));
303
312
 
304
- const enterScript = `
313
+ const enterScript = `
305
314
  tell application "Terminal"
306
315
  set targetTab to missing value
307
316
  repeat with w in windows
@@ -319,11 +328,11 @@ tell application "Terminal"
319
328
  end tell
320
329
  return "ok"`;
321
330
 
322
- const { stdout: enterResult } = await execFileAsync('osascript', ['-e', enterScript]);
323
- if (enterResult.trim() !== 'ok') {
324
- throw new Error(`Terminal.app tab disappeared before Enter could be sent for TTY ${tty}`);
325
- }
331
+ const { stdout: enterResult } = await execFileAsync("osascript", ["-e", enterScript]);
332
+ if (enterResult.trim() !== "ok") {
333
+ throw new Error(`Terminal.app tab disappeared before Enter could be sent for TTY ${tty}`);
326
334
  }
335
+ }
327
336
  }
328
337
 
329
338
  /**
@@ -332,6 +341,6 @@ return "ok"`;
332
341
  * mappings here as new special keys are needed.
333
342
  */
334
343
  function appleScriptKeyAction(key: string): string {
335
- if (key === ESCAPE_BYTE) return 'key code 53';
336
- return `keystroke "${escapeAppleScript(key)}"`;
344
+ if (key === ESCAPE_BYTE) return "key code 53";
345
+ return `keystroke "${escapeAppleScript(key)}"`;
337
346
  }
@@ -1,4 +1,4 @@
1
- export { TerminalFocusManager } from './TerminalFocusManager.js';
2
- export { TerminalType } from './TerminalFocusManager.js';
3
- export type { TerminalLocation } from './TerminalFocusManager.js';
4
- export { TtyWriter } from './TtyWriter.js';
1
+ export { TerminalFocusManager } from "./TerminalFocusManager.js";
2
+ export { TerminalType } from "./TerminalFocusManager.js";
3
+ export type { TerminalLocation } from "./TerminalFocusManager.js";
4
+ export { TtyWriter } from "./TtyWriter.js";