@phnx-labs/agents-cli 0.1.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 (486) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/LICENSE +21 -0
  3. package/README.md +537 -0
  4. package/dist/commands/__tests__/sessions.test.d.ts +2 -0
  5. package/dist/commands/__tests__/sessions.test.d.ts.map +1 -0
  6. package/dist/commands/__tests__/sessions.test.js +636 -0
  7. package/dist/commands/__tests__/sessions.test.js.map +1 -0
  8. package/dist/commands/cloud.d.ts +3 -0
  9. package/dist/commands/cloud.d.ts.map +1 -0
  10. package/dist/commands/cloud.js +322 -0
  11. package/dist/commands/cloud.js.map +1 -0
  12. package/dist/commands/commands.d.ts +3 -0
  13. package/dist/commands/commands.d.ts.map +1 -0
  14. package/dist/commands/commands.js +628 -0
  15. package/dist/commands/commands.js.map +1 -0
  16. package/dist/commands/daemon.d.ts +3 -0
  17. package/dist/commands/daemon.d.ts.map +1 -0
  18. package/dist/commands/daemon.js +110 -0
  19. package/dist/commands/daemon.js.map +1 -0
  20. package/dist/commands/drive.d.ts +3 -0
  21. package/dist/commands/drive.d.ts.map +1 -0
  22. package/dist/commands/drive.js +166 -0
  23. package/dist/commands/drive.js.map +1 -0
  24. package/dist/commands/exec.d.ts +3 -0
  25. package/dist/commands/exec.d.ts.map +1 -0
  26. package/dist/commands/exec.js +241 -0
  27. package/dist/commands/exec.js.map +1 -0
  28. package/dist/commands/fork.d.ts +3 -0
  29. package/dist/commands/fork.d.ts.map +1 -0
  30. package/dist/commands/fork.js +139 -0
  31. package/dist/commands/fork.js.map +1 -0
  32. package/dist/commands/hooks.d.ts +3 -0
  33. package/dist/commands/hooks.d.ts.map +1 -0
  34. package/dist/commands/hooks.js +689 -0
  35. package/dist/commands/hooks.js.map +1 -0
  36. package/dist/commands/init.d.ts +6 -0
  37. package/dist/commands/init.d.ts.map +1 -0
  38. package/dist/commands/init.js +127 -0
  39. package/dist/commands/init.js.map +1 -0
  40. package/dist/commands/mcp.d.ts +3 -0
  41. package/dist/commands/mcp.d.ts.map +1 -0
  42. package/dist/commands/mcp.js +581 -0
  43. package/dist/commands/mcp.js.map +1 -0
  44. package/dist/commands/models.d.ts +3 -0
  45. package/dist/commands/models.d.ts.map +1 -0
  46. package/dist/commands/models.js +158 -0
  47. package/dist/commands/models.js.map +1 -0
  48. package/dist/commands/packages.d.ts +3 -0
  49. package/dist/commands/packages.d.ts.map +1 -0
  50. package/dist/commands/packages.js +541 -0
  51. package/dist/commands/packages.js.map +1 -0
  52. package/dist/commands/permissions.d.ts +3 -0
  53. package/dist/commands/permissions.d.ts.map +1 -0
  54. package/dist/commands/permissions.js +723 -0
  55. package/dist/commands/permissions.js.map +1 -0
  56. package/dist/commands/plugins.d.ts +3 -0
  57. package/dist/commands/plugins.d.ts.map +1 -0
  58. package/dist/commands/plugins.js +382 -0
  59. package/dist/commands/plugins.js.map +1 -0
  60. package/dist/commands/profiles.d.ts +3 -0
  61. package/dist/commands/profiles.d.ts.map +1 -0
  62. package/dist/commands/profiles.js +242 -0
  63. package/dist/commands/profiles.js.map +1 -0
  64. package/dist/commands/pty.d.ts +20 -0
  65. package/dist/commands/pty.d.ts.map +1 -0
  66. package/dist/commands/pty.js +389 -0
  67. package/dist/commands/pty.js.map +1 -0
  68. package/dist/commands/pull.d.ts +3 -0
  69. package/dist/commands/pull.d.ts.map +1 -0
  70. package/dist/commands/pull.js +448 -0
  71. package/dist/commands/pull.js.map +1 -0
  72. package/dist/commands/push.d.ts +3 -0
  73. package/dist/commands/push.d.ts.map +1 -0
  74. package/dist/commands/push.js +180 -0
  75. package/dist/commands/push.js.map +1 -0
  76. package/dist/commands/refresh-memory.d.ts +9 -0
  77. package/dist/commands/refresh-memory.d.ts.map +1 -0
  78. package/dist/commands/refresh-memory.js +45 -0
  79. package/dist/commands/refresh-memory.js.map +1 -0
  80. package/dist/commands/resource-view.d.ts +31 -0
  81. package/dist/commands/resource-view.d.ts.map +1 -0
  82. package/dist/commands/resource-view.js +183 -0
  83. package/dist/commands/resource-view.js.map +1 -0
  84. package/dist/commands/routines.d.ts +3 -0
  85. package/dist/commands/routines.d.ts.map +1 -0
  86. package/dist/commands/routines.js +579 -0
  87. package/dist/commands/routines.js.map +1 -0
  88. package/dist/commands/rules.d.ts +3 -0
  89. package/dist/commands/rules.d.ts.map +1 -0
  90. package/dist/commands/rules.js +488 -0
  91. package/dist/commands/rules.js.map +1 -0
  92. package/dist/commands/secrets.d.ts +3 -0
  93. package/dist/commands/secrets.d.ts.map +1 -0
  94. package/dist/commands/secrets.js +339 -0
  95. package/dist/commands/secrets.js.map +1 -0
  96. package/dist/commands/sessions-picker.d.ts +16 -0
  97. package/dist/commands/sessions-picker.d.ts.map +1 -0
  98. package/dist/commands/sessions-picker.js +256 -0
  99. package/dist/commands/sessions-picker.js.map +1 -0
  100. package/dist/commands/sessions.d.ts +16 -0
  101. package/dist/commands/sessions.d.ts.map +1 -0
  102. package/dist/commands/sessions.js +1077 -0
  103. package/dist/commands/sessions.js.map +1 -0
  104. package/dist/commands/skills.d.ts +3 -0
  105. package/dist/commands/skills.d.ts.map +1 -0
  106. package/dist/commands/skills.js +716 -0
  107. package/dist/commands/skills.js.map +1 -0
  108. package/dist/commands/status.d.ts +3 -0
  109. package/dist/commands/status.d.ts.map +1 -0
  110. package/dist/commands/status.js +19 -0
  111. package/dist/commands/status.js.map +1 -0
  112. package/dist/commands/subagents.d.ts +3 -0
  113. package/dist/commands/subagents.d.ts.map +1 -0
  114. package/dist/commands/subagents.js +350 -0
  115. package/dist/commands/subagents.js.map +1 -0
  116. package/dist/commands/sync.d.ts +3 -0
  117. package/dist/commands/sync.d.ts.map +1 -0
  118. package/dist/commands/sync.js +62 -0
  119. package/dist/commands/sync.js.map +1 -0
  120. package/dist/commands/teams-picker.d.ts +14 -0
  121. package/dist/commands/teams-picker.d.ts.map +1 -0
  122. package/dist/commands/teams-picker.js +278 -0
  123. package/dist/commands/teams-picker.js.map +1 -0
  124. package/dist/commands/teams.d.ts +3 -0
  125. package/dist/commands/teams.d.ts.map +1 -0
  126. package/dist/commands/teams.js +917 -0
  127. package/dist/commands/teams.js.map +1 -0
  128. package/dist/commands/utils.d.ts +39 -0
  129. package/dist/commands/utils.d.ts.map +1 -0
  130. package/dist/commands/utils.js +100 -0
  131. package/dist/commands/utils.js.map +1 -0
  132. package/dist/commands/versions.d.ts +3 -0
  133. package/dist/commands/versions.d.ts.map +1 -0
  134. package/dist/commands/versions.js +700 -0
  135. package/dist/commands/versions.js.map +1 -0
  136. package/dist/commands/view.d.ts +8 -0
  137. package/dist/commands/view.d.ts.map +1 -0
  138. package/dist/commands/view.js +626 -0
  139. package/dist/commands/view.js.map +1 -0
  140. package/dist/index.d.ts +3 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +484 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/lib/__tests__/bugfixes.test.d.ts +2 -0
  145. package/dist/lib/__tests__/bugfixes.test.d.ts.map +1 -0
  146. package/dist/lib/__tests__/bugfixes.test.js +192 -0
  147. package/dist/lib/__tests__/bugfixes.test.js.map +1 -0
  148. package/dist/lib/__tests__/exec.test.d.ts +2 -0
  149. package/dist/lib/__tests__/exec.test.d.ts.map +1 -0
  150. package/dist/lib/__tests__/exec.test.js +446 -0
  151. package/dist/lib/__tests__/exec.test.js.map +1 -0
  152. package/dist/lib/__tests__/git-sync.test.d.ts +2 -0
  153. package/dist/lib/__tests__/git-sync.test.d.ts.map +1 -0
  154. package/dist/lib/__tests__/git-sync.test.js +138 -0
  155. package/dist/lib/__tests__/git-sync.test.js.map +1 -0
  156. package/dist/lib/__tests__/hooks.test.d.ts +2 -0
  157. package/dist/lib/__tests__/hooks.test.d.ts.map +1 -0
  158. package/dist/lib/__tests__/hooks.test.js +203 -0
  159. package/dist/lib/__tests__/hooks.test.js.map +1 -0
  160. package/dist/lib/__tests__/memory-compile.test.d.ts +2 -0
  161. package/dist/lib/__tests__/memory-compile.test.d.ts.map +1 -0
  162. package/dist/lib/__tests__/memory-compile.test.js +95 -0
  163. package/dist/lib/__tests__/memory-compile.test.js.map +1 -0
  164. package/dist/lib/__tests__/models.test.d.ts +2 -0
  165. package/dist/lib/__tests__/models.test.d.ts.map +1 -0
  166. package/dist/lib/__tests__/models.test.js +239 -0
  167. package/dist/lib/__tests__/models.test.js.map +1 -0
  168. package/dist/lib/__tests__/rotate.test.d.ts +2 -0
  169. package/dist/lib/__tests__/rotate.test.d.ts.map +1 -0
  170. package/dist/lib/__tests__/rotate.test.js +80 -0
  171. package/dist/lib/__tests__/rotate.test.js.map +1 -0
  172. package/dist/lib/__tests__/secrets-bundles.test.d.ts +2 -0
  173. package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +1 -0
  174. package/dist/lib/__tests__/secrets-bundles.test.js +104 -0
  175. package/dist/lib/__tests__/secrets-bundles.test.js.map +1 -0
  176. package/dist/lib/__tests__/secrets.test.d.ts +2 -0
  177. package/dist/lib/__tests__/secrets.test.d.ts.map +1 -0
  178. package/dist/lib/__tests__/secrets.test.js +90 -0
  179. package/dist/lib/__tests__/secrets.test.js.map +1 -0
  180. package/dist/lib/__tests__/shims.test.d.ts +2 -0
  181. package/dist/lib/__tests__/shims.test.d.ts.map +1 -0
  182. package/dist/lib/__tests__/shims.test.js +39 -0
  183. package/dist/lib/__tests__/shims.test.js.map +1 -0
  184. package/dist/lib/__tests__/usage.test.d.ts +2 -0
  185. package/dist/lib/__tests__/usage.test.d.ts.map +1 -0
  186. package/dist/lib/__tests__/usage.test.js +220 -0
  187. package/dist/lib/__tests__/usage.test.js.map +1 -0
  188. package/dist/lib/__tests__/versions.test.d.ts +2 -0
  189. package/dist/lib/__tests__/versions.test.d.ts.map +1 -0
  190. package/dist/lib/__tests__/versions.test.js +63 -0
  191. package/dist/lib/__tests__/versions.test.js.map +1 -0
  192. package/dist/lib/agents.d.ts +107 -0
  193. package/dist/lib/agents.d.ts.map +1 -0
  194. package/dist/lib/agents.js +1096 -0
  195. package/dist/lib/agents.js.map +1 -0
  196. package/dist/lib/artifact-actions.d.ts +22 -0
  197. package/dist/lib/artifact-actions.d.ts.map +1 -0
  198. package/dist/lib/artifact-actions.js +55 -0
  199. package/dist/lib/artifact-actions.js.map +1 -0
  200. package/dist/lib/cloud/codex.d.ts +19 -0
  201. package/dist/lib/cloud/codex.d.ts.map +1 -0
  202. package/dist/lib/cloud/codex.js +210 -0
  203. package/dist/lib/cloud/codex.js.map +1 -0
  204. package/dist/lib/cloud/factory.d.ts +26 -0
  205. package/dist/lib/cloud/factory.d.ts.map +1 -0
  206. package/dist/lib/cloud/factory.js +37 -0
  207. package/dist/lib/cloud/factory.js.map +1 -0
  208. package/dist/lib/cloud/registry.d.ts +6 -0
  209. package/dist/lib/cloud/registry.d.ts.map +1 -0
  210. package/dist/lib/cloud/registry.js +56 -0
  211. package/dist/lib/cloud/registry.js.map +1 -0
  212. package/dist/lib/cloud/rush.d.ts +15 -0
  213. package/dist/lib/cloud/rush.d.ts.map +1 -0
  214. package/dist/lib/cloud/rush.js +185 -0
  215. package/dist/lib/cloud/rush.js.map +1 -0
  216. package/dist/lib/cloud/store.d.ts +10 -0
  217. package/dist/lib/cloud/store.d.ts.map +1 -0
  218. package/dist/lib/cloud/store.js +96 -0
  219. package/dist/lib/cloud/store.js.map +1 -0
  220. package/dist/lib/cloud/stream.d.ts +18 -0
  221. package/dist/lib/cloud/stream.d.ts.map +1 -0
  222. package/dist/lib/cloud/stream.js +138 -0
  223. package/dist/lib/cloud/stream.js.map +1 -0
  224. package/dist/lib/cloud/types.d.ts +60 -0
  225. package/dist/lib/cloud/types.d.ts.map +1 -0
  226. package/dist/lib/cloud/types.js +2 -0
  227. package/dist/lib/cloud/types.js.map +1 -0
  228. package/dist/lib/commands.d.ts +121 -0
  229. package/dist/lib/commands.d.ts.map +1 -0
  230. package/dist/lib/commands.js +499 -0
  231. package/dist/lib/commands.js.map +1 -0
  232. package/dist/lib/convert.d.ts +11 -0
  233. package/dist/lib/convert.d.ts.map +1 -0
  234. package/dist/lib/convert.js +45 -0
  235. package/dist/lib/convert.js.map +1 -0
  236. package/dist/lib/daemon.d.ts +22 -0
  237. package/dist/lib/daemon.d.ts.map +1 -0
  238. package/dist/lib/daemon.js +311 -0
  239. package/dist/lib/daemon.js.map +1 -0
  240. package/dist/lib/drive-sync.d.ts +28 -0
  241. package/dist/lib/drive-sync.d.ts.map +1 -0
  242. package/dist/lib/drive-sync.js +193 -0
  243. package/dist/lib/drive-sync.js.map +1 -0
  244. package/dist/lib/exec.d.ts +85 -0
  245. package/dist/lib/exec.d.ts.map +1 -0
  246. package/dist/lib/exec.js +423 -0
  247. package/dist/lib/exec.js.map +1 -0
  248. package/dist/lib/factory.d.ts +57 -0
  249. package/dist/lib/factory.d.ts.map +1 -0
  250. package/dist/lib/factory.js +110 -0
  251. package/dist/lib/factory.js.map +1 -0
  252. package/dist/lib/git.d.ts +146 -0
  253. package/dist/lib/git.d.ts.map +1 -0
  254. package/dist/lib/git.js +635 -0
  255. package/dist/lib/git.js.map +1 -0
  256. package/dist/lib/help.d.ts +3 -0
  257. package/dist/lib/help.d.ts.map +1 -0
  258. package/dist/lib/help.js +63 -0
  259. package/dist/lib/help.js.map +1 -0
  260. package/dist/lib/hooks.d.ts +116 -0
  261. package/dist/lib/hooks.d.ts.map +1 -0
  262. package/dist/lib/hooks.js +837 -0
  263. package/dist/lib/hooks.js.map +1 -0
  264. package/dist/lib/manifest.d.ts +8 -0
  265. package/dist/lib/manifest.d.ts.map +1 -0
  266. package/dist/lib/manifest.js +36 -0
  267. package/dist/lib/manifest.js.map +1 -0
  268. package/dist/lib/markdown.d.ts +5 -0
  269. package/dist/lib/markdown.d.ts.map +1 -0
  270. package/dist/lib/markdown.js +11 -0
  271. package/dist/lib/markdown.js.map +1 -0
  272. package/dist/lib/mcp.d.ts +64 -0
  273. package/dist/lib/mcp.d.ts.map +1 -0
  274. package/dist/lib/mcp.js +327 -0
  275. package/dist/lib/mcp.js.map +1 -0
  276. package/dist/lib/memory-compile.d.ts +56 -0
  277. package/dist/lib/memory-compile.d.ts.map +1 -0
  278. package/dist/lib/memory-compile.js +167 -0
  279. package/dist/lib/memory-compile.js.map +1 -0
  280. package/dist/lib/memory.d.ts +56 -0
  281. package/dist/lib/memory.d.ts.map +1 -0
  282. package/dist/lib/memory.js +267 -0
  283. package/dist/lib/memory.js.map +1 -0
  284. package/dist/lib/models.d.ts +91 -0
  285. package/dist/lib/models.d.ts.map +1 -0
  286. package/dist/lib/models.js +706 -0
  287. package/dist/lib/models.js.map +1 -0
  288. package/dist/lib/permissions.d.ts +204 -0
  289. package/dist/lib/permissions.d.ts.map +1 -0
  290. package/dist/lib/permissions.js +1022 -0
  291. package/dist/lib/permissions.js.map +1 -0
  292. package/dist/lib/picker.d.ts +17 -0
  293. package/dist/lib/picker.d.ts.map +1 -0
  294. package/dist/lib/picker.js +95 -0
  295. package/dist/lib/picker.js.map +1 -0
  296. package/dist/lib/plugins.d.ts +73 -0
  297. package/dist/lib/plugins.d.ts.map +1 -0
  298. package/dist/lib/plugins.js +549 -0
  299. package/dist/lib/plugins.js.map +1 -0
  300. package/dist/lib/profiles-keychain.d.ts +3 -0
  301. package/dist/lib/profiles-keychain.d.ts.map +1 -0
  302. package/dist/lib/profiles-keychain.js +10 -0
  303. package/dist/lib/profiles-keychain.js.map +1 -0
  304. package/dist/lib/profiles-presets.d.ts +15 -0
  305. package/dist/lib/profiles-presets.d.ts.map +1 -0
  306. package/dist/lib/profiles-presets.js +95 -0
  307. package/dist/lib/profiles-presets.js.map +1 -0
  308. package/dist/lib/profiles.d.ts +35 -0
  309. package/dist/lib/profiles.d.ts.map +1 -0
  310. package/dist/lib/profiles.js +123 -0
  311. package/dist/lib/profiles.js.map +1 -0
  312. package/dist/lib/pty-client.d.ts +22 -0
  313. package/dist/lib/pty-client.d.ts.map +1 -0
  314. package/dist/lib/pty-client.js +181 -0
  315. package/dist/lib/pty-client.js.map +1 -0
  316. package/dist/lib/pty-server.d.ts +16 -0
  317. package/dist/lib/pty-server.d.ts.map +1 -0
  318. package/dist/lib/pty-server.js +422 -0
  319. package/dist/lib/pty-server.js.map +1 -0
  320. package/dist/lib/registry.d.ts +28 -0
  321. package/dist/lib/registry.d.ts.map +1 -0
  322. package/dist/lib/registry.js +203 -0
  323. package/dist/lib/registry.js.map +1 -0
  324. package/dist/lib/resources.d.ts +50 -0
  325. package/dist/lib/resources.d.ts.map +1 -0
  326. package/dist/lib/resources.js +103 -0
  327. package/dist/lib/resources.js.map +1 -0
  328. package/dist/lib/rotate.d.ts +52 -0
  329. package/dist/lib/rotate.d.ts.map +1 -0
  330. package/dist/lib/rotate.js +87 -0
  331. package/dist/lib/rotate.js.map +1 -0
  332. package/dist/lib/routines.d.ts +70 -0
  333. package/dist/lib/routines.d.ts.map +1 -0
  334. package/dist/lib/routines.js +325 -0
  335. package/dist/lib/routines.js.map +1 -0
  336. package/dist/lib/runner.d.ts +12 -0
  337. package/dist/lib/runner.d.ts.map +1 -0
  338. package/dist/lib/runner.js +311 -0
  339. package/dist/lib/runner.js.map +1 -0
  340. package/dist/lib/sandbox.d.ts +10 -0
  341. package/dist/lib/sandbox.d.ts.map +1 -0
  342. package/dist/lib/sandbox.js +201 -0
  343. package/dist/lib/sandbox.js.map +1 -0
  344. package/dist/lib/scheduler.d.ts +18 -0
  345. package/dist/lib/scheduler.d.ts.map +1 -0
  346. package/dist/lib/scheduler.js +69 -0
  347. package/dist/lib/scheduler.js.map +1 -0
  348. package/dist/lib/secrets-bundles.d.ts +29 -0
  349. package/dist/lib/secrets-bundles.d.ts.map +1 -0
  350. package/dist/lib/secrets-bundles.js +168 -0
  351. package/dist/lib/secrets-bundles.js.map +1 -0
  352. package/dist/lib/secrets.d.ts +27 -0
  353. package/dist/lib/secrets.d.ts.map +1 -0
  354. package/dist/lib/secrets.js +127 -0
  355. package/dist/lib/secrets.js.map +1 -0
  356. package/dist/lib/session/__tests__/db.test.d.ts +2 -0
  357. package/dist/lib/session/__tests__/db.test.d.ts.map +1 -0
  358. package/dist/lib/session/__tests__/db.test.js +54 -0
  359. package/dist/lib/session/__tests__/db.test.js.map +1 -0
  360. package/dist/lib/session/__tests__/discover.test.d.ts +2 -0
  361. package/dist/lib/session/__tests__/discover.test.d.ts.map +1 -0
  362. package/dist/lib/session/__tests__/discover.test.js +63 -0
  363. package/dist/lib/session/__tests__/discover.test.js.map +1 -0
  364. package/dist/lib/session/__tests__/prompt.test.d.ts +2 -0
  365. package/dist/lib/session/__tests__/prompt.test.d.ts.map +1 -0
  366. package/dist/lib/session/__tests__/prompt.test.js +44 -0
  367. package/dist/lib/session/__tests__/prompt.test.js.map +1 -0
  368. package/dist/lib/session/__tests__/render.test.d.ts +2 -0
  369. package/dist/lib/session/__tests__/render.test.d.ts.map +1 -0
  370. package/dist/lib/session/__tests__/render.test.js +602 -0
  371. package/dist/lib/session/__tests__/render.test.js.map +1 -0
  372. package/dist/lib/session/artifacts.d.ts +5 -0
  373. package/dist/lib/session/artifacts.d.ts.map +1 -0
  374. package/dist/lib/session/artifacts.js +75 -0
  375. package/dist/lib/session/artifacts.js.map +1 -0
  376. package/dist/lib/session/db.d.ts +118 -0
  377. package/dist/lib/session/db.d.ts.map +1 -0
  378. package/dist/lib/session/db.js +576 -0
  379. package/dist/lib/session/db.js.map +1 -0
  380. package/dist/lib/session/discover.d.ts +60 -0
  381. package/dist/lib/session/discover.d.ts.map +1 -0
  382. package/dist/lib/session/discover.js +1272 -0
  383. package/dist/lib/session/discover.js.map +1 -0
  384. package/dist/lib/session/parse.d.ts +23 -0
  385. package/dist/lib/session/parse.d.ts.map +1 -0
  386. package/dist/lib/session/parse.js +650 -0
  387. package/dist/lib/session/parse.js.map +1 -0
  388. package/dist/lib/session/prompt.d.ts +4 -0
  389. package/dist/lib/session/prompt.d.ts.map +1 -0
  390. package/dist/lib/session/prompt.js +64 -0
  391. package/dist/lib/session/prompt.js.map +1 -0
  392. package/dist/lib/session/prompt.test.d.ts +2 -0
  393. package/dist/lib/session/prompt.test.d.ts.map +1 -0
  394. package/dist/lib/session/prompt.test.js +57 -0
  395. package/dist/lib/session/prompt.test.js.map +1 -0
  396. package/dist/lib/session/render.d.ts +90 -0
  397. package/dist/lib/session/render.d.ts.map +1 -0
  398. package/dist/lib/session/render.js +778 -0
  399. package/dist/lib/session/render.js.map +1 -0
  400. package/dist/lib/session/team-filter.d.ts +26 -0
  401. package/dist/lib/session/team-filter.d.ts.map +1 -0
  402. package/dist/lib/session/team-filter.js +66 -0
  403. package/dist/lib/session/team-filter.js.map +1 -0
  404. package/dist/lib/session/team-filter.test.d.ts +2 -0
  405. package/dist/lib/session/team-filter.test.d.ts.map +1 -0
  406. package/dist/lib/session/team-filter.test.js +157 -0
  407. package/dist/lib/session/team-filter.test.js.map +1 -0
  408. package/dist/lib/session/types.d.ts +69 -0
  409. package/dist/lib/session/types.d.ts.map +1 -0
  410. package/dist/lib/session/types.js +2 -0
  411. package/dist/lib/session/types.js.map +1 -0
  412. package/dist/lib/shims.d.ts +228 -0
  413. package/dist/lib/shims.d.ts.map +1 -0
  414. package/dist/lib/shims.js +1170 -0
  415. package/dist/lib/shims.js.map +1 -0
  416. package/dist/lib/skills.d.ts +134 -0
  417. package/dist/lib/skills.d.ts.map +1 -0
  418. package/dist/lib/skills.js +783 -0
  419. package/dist/lib/skills.js.map +1 -0
  420. package/dist/lib/state.d.ts +53 -0
  421. package/dist/lib/state.d.ts.map +1 -0
  422. package/dist/lib/state.js +299 -0
  423. package/dist/lib/state.js.map +1 -0
  424. package/dist/lib/subagents.d.ts +75 -0
  425. package/dist/lib/subagents.d.ts.map +1 -0
  426. package/dist/lib/subagents.js +402 -0
  427. package/dist/lib/subagents.js.map +1 -0
  428. package/dist/lib/teams/agents.d.ts +146 -0
  429. package/dist/lib/teams/agents.d.ts.map +1 -0
  430. package/dist/lib/teams/agents.js +1072 -0
  431. package/dist/lib/teams/agents.js.map +1 -0
  432. package/dist/lib/teams/api.d.ts +77 -0
  433. package/dist/lib/teams/api.d.ts.map +1 -0
  434. package/dist/lib/teams/api.js +229 -0
  435. package/dist/lib/teams/api.js.map +1 -0
  436. package/dist/lib/teams/cloud.d.ts +11 -0
  437. package/dist/lib/teams/cloud.d.ts.map +1 -0
  438. package/dist/lib/teams/cloud.js +169 -0
  439. package/dist/lib/teams/cloud.js.map +1 -0
  440. package/dist/lib/teams/debug.d.ts +2 -0
  441. package/dist/lib/teams/debug.d.ts.map +1 -0
  442. package/dist/lib/teams/debug.js +6 -0
  443. package/dist/lib/teams/debug.js.map +1 -0
  444. package/dist/lib/teams/file_ops.d.ts +6 -0
  445. package/dist/lib/teams/file_ops.d.ts.map +1 -0
  446. package/dist/lib/teams/file_ops.js +59 -0
  447. package/dist/lib/teams/file_ops.js.map +1 -0
  448. package/dist/lib/teams/parsers.d.ts +5 -0
  449. package/dist/lib/teams/parsers.d.ts.map +1 -0
  450. package/dist/lib/teams/parsers.js +826 -0
  451. package/dist/lib/teams/parsers.js.map +1 -0
  452. package/dist/lib/teams/persistence.d.ts +28 -0
  453. package/dist/lib/teams/persistence.d.ts.map +1 -0
  454. package/dist/lib/teams/persistence.js +289 -0
  455. package/dist/lib/teams/persistence.js.map +1 -0
  456. package/dist/lib/teams/ralph.d.ts +8 -0
  457. package/dist/lib/teams/ralph.d.ts.map +1 -0
  458. package/dist/lib/teams/ralph.js +59 -0
  459. package/dist/lib/teams/ralph.js.map +1 -0
  460. package/dist/lib/teams/registry.d.ts +11 -0
  461. package/dist/lib/teams/registry.d.ts.map +1 -0
  462. package/dist/lib/teams/registry.js +56 -0
  463. package/dist/lib/teams/registry.js.map +1 -0
  464. package/dist/lib/teams/summarizer.d.ts +58 -0
  465. package/dist/lib/teams/summarizer.d.ts.map +1 -0
  466. package/dist/lib/teams/summarizer.js +766 -0
  467. package/dist/lib/teams/summarizer.js.map +1 -0
  468. package/dist/lib/template.d.ts +24 -0
  469. package/dist/lib/template.d.ts.map +1 -0
  470. package/dist/lib/template.js +57 -0
  471. package/dist/lib/template.js.map +1 -0
  472. package/dist/lib/types.d.ts +282 -0
  473. package/dist/lib/types.d.ts.map +1 -0
  474. package/dist/lib/types.js +18 -0
  475. package/dist/lib/types.js.map +1 -0
  476. package/dist/lib/usage.d.ts +73 -0
  477. package/dist/lib/usage.d.ts.map +1 -0
  478. package/dist/lib/usage.js +623 -0
  479. package/dist/lib/usage.js.map +1 -0
  480. package/dist/lib/versions.d.ts +248 -0
  481. package/dist/lib/versions.d.ts.map +1 -0
  482. package/dist/lib/versions.js +1737 -0
  483. package/dist/lib/versions.js.map +1 -0
  484. package/package.json +82 -0
  485. package/scripts/postinstall.js +72 -0
  486. package/scripts/rebuild-sqlite.sh +46 -0
@@ -0,0 +1,242 @@
1
+ import chalk from 'chalk';
2
+ import * as fs from 'fs';
3
+ import { listProfiles, readProfile, writeProfile, deleteProfile, profileExists, profileFromPreset, getPresetForProfile, } from '../lib/profiles.js';
4
+ import { getPreset, listPresets } from '../lib/profiles-presets.js';
5
+ import { hasKeychainToken, keychainItemName, setKeychainToken, deleteKeychainToken, } from '../lib/profiles-keychain.js';
6
+ import { isInteractiveTerminal } from './utils.js';
7
+ async function promptForSecret(message) {
8
+ if (!isInteractiveTerminal()) {
9
+ throw new Error('A secret is required but the shell is not interactive. Pipe the key via stdin (--key-stdin).');
10
+ }
11
+ const { password } = await import('@inquirer/prompts');
12
+ return await password({ message, mask: true });
13
+ }
14
+ function readStdinSync() {
15
+ const chunks = [];
16
+ const buf = Buffer.alloc(65536);
17
+ while (true) {
18
+ let bytesRead;
19
+ try {
20
+ bytesRead = fs.readSync(0, buf, 0, buf.length, null);
21
+ }
22
+ catch {
23
+ break;
24
+ }
25
+ if (bytesRead === 0)
26
+ break;
27
+ chunks.push(Buffer.from(buf.subarray(0, bytesRead)));
28
+ }
29
+ return Buffer.concat(chunks).toString('utf-8').trim();
30
+ }
31
+ async function ensureProviderToken(provider, signupUrl, fromStdin) {
32
+ const item = keychainItemName(provider);
33
+ if (hasKeychainToken(item)) {
34
+ return;
35
+ }
36
+ let token;
37
+ if (fromStdin) {
38
+ token = readStdinSync();
39
+ if (!token) {
40
+ throw new Error('No key received on stdin.');
41
+ }
42
+ }
43
+ else {
44
+ const hint = signupUrl ? ` (get one at ${signupUrl})` : '';
45
+ token = await promptForSecret(`Enter API key for ${provider}${hint}`);
46
+ }
47
+ setKeychainToken(item, token);
48
+ console.log(chalk.green(`Stored in keychain: ${item}`));
49
+ }
50
+ function renderProfileRow(p) {
51
+ const host = p.host.version ? `${p.host.agent}@${p.host.version}` : p.host.agent;
52
+ const model = p.env.ANTHROPIC_MODEL || p.env.OPENAI_MODEL || p.env.GEMINI_MODEL || '-';
53
+ const provider = p.provider || (p.auth?.keychainItem?.split('.')[1]) || '-';
54
+ return `${chalk.cyan(p.name.padEnd(16))} ${host.padEnd(14)} ${provider.padEnd(12)} ${chalk.gray(model)}`;
55
+ }
56
+ export function registerProfilesCommands(program) {
57
+ const cmd = program
58
+ .command('profiles')
59
+ .description('Named bundles of (host CLI, endpoint, model, auth) — run Kimi/DeepSeek/Qwen/etc through Claude Code without a proxy.')
60
+ .addHelpText('after', `
61
+ A profile pins a host CLI (claude, codex, gemini, ...) to a non-default endpoint
62
+ and model, with a keychain-backed API key. Running 'agents run <profile>' spawns
63
+ the host CLI with the right env vars — no plaintext tokens, no local proxy.
64
+
65
+ Built-in presets (via OpenRouter, one shared key):
66
+ kimi Kimi K2.5 (top HumanEval, reasoning — interactive only)
67
+ kimi-chat Kimi K2 0905 (non-reasoning, print-safe)
68
+ minimax MiniMax M2.5 (top SWE-bench, reasoning)
69
+ glm GLM 5 (top Chatbot Arena among open-weight, reasoning)
70
+ qwen Qwen3 Coder Next (latest coding Qwen, print-safe)
71
+ deepseek DeepSeek Chat V3 (latest non-reasoning chat, print-safe)
72
+
73
+ Run 'agents profiles presets' for the full list with pricing and context sizes.
74
+
75
+ Typical flow:
76
+ agents profiles add kimi # prompts for OpenRouter key, stored in Keychain
77
+ agents run kimi "refactor this" # Claude Code UI, Kimi model responses
78
+ agents profiles add deepseek # reuses OpenRouter key, no re-prompt
79
+
80
+ Managing keys:
81
+ agents profiles login openrouter # rotate the key (shared across openrouter profiles)
82
+ agents profiles logout openrouter # remove from Keychain
83
+
84
+ Custom endpoints — drop a YAML file at ~/.agents/profiles/<name>.yml:
85
+ name: local-llama
86
+ host: { agent: claude }
87
+ env:
88
+ ANTHROPIC_BASE_URL: http://localhost:11434
89
+ ANTHROPIC_MODEL: llama-3.3-70b
90
+ auth:
91
+ envVar: ANTHROPIC_AUTH_TOKEN
92
+ keychainItem: agents-cli.ollama.token
93
+
94
+ Profiles store no secrets — safe to 'agents push' to a shared repo.
95
+ `);
96
+ cmd
97
+ .command('list')
98
+ .alias('ls')
99
+ .description('List configured profiles')
100
+ .action(() => {
101
+ const profiles = listProfiles();
102
+ if (profiles.length === 0) {
103
+ console.log(chalk.gray('No profiles configured.'));
104
+ console.log(chalk.gray('Try: agents profiles add kimi'));
105
+ console.log(chalk.gray(' agents profiles presets'));
106
+ return;
107
+ }
108
+ console.log(chalk.bold(`${'NAME'.padEnd(16)} ${'HOST'.padEnd(14)} ${'PROVIDER'.padEnd(12)} MODEL`));
109
+ for (const p of profiles) {
110
+ console.log(renderProfileRow(p));
111
+ }
112
+ });
113
+ cmd
114
+ .command('presets')
115
+ .description('List built-in presets (OpenRouter + direct providers)')
116
+ .action(() => {
117
+ const presets = listPresets();
118
+ console.log(chalk.bold(`${'NAME'.padEnd(14)} ${'PROVIDER'.padEnd(12)} DESCRIPTION`));
119
+ for (const p of presets) {
120
+ console.log(`${chalk.cyan(p.name.padEnd(14))} ${p.provider.padEnd(12)} ${chalk.gray(p.description)}`);
121
+ }
122
+ });
123
+ cmd
124
+ .command('view <name>')
125
+ .alias('show')
126
+ .description('Show a profile (env, host, auth source, preset link)')
127
+ .action((name) => {
128
+ try {
129
+ const p = readProfile(name);
130
+ console.log(chalk.bold(p.name));
131
+ if (p.description)
132
+ console.log(chalk.gray(p.description));
133
+ console.log();
134
+ console.log(chalk.bold('Host:'), p.host.agent + (p.host.version ? `@${p.host.version}` : ''));
135
+ if (p.provider)
136
+ console.log(chalk.bold('Provider:'), p.provider);
137
+ if (p.preset)
138
+ console.log(chalk.bold('Preset:'), p.preset);
139
+ console.log();
140
+ console.log(chalk.bold('Env:'));
141
+ for (const [k, v] of Object.entries(p.env)) {
142
+ console.log(` ${k}=${v}`);
143
+ }
144
+ if (p.auth) {
145
+ console.log();
146
+ console.log(chalk.bold('Auth:'));
147
+ const tokenStatus = hasKeychainToken(p.auth.keychainItem) ? chalk.green('stored') : chalk.red('missing');
148
+ console.log(` ${p.auth.envVar} <- keychain:${p.auth.keychainItem} (${tokenStatus})`);
149
+ }
150
+ const preset = getPresetForProfile(p);
151
+ if (preset?.signupUrl) {
152
+ console.log();
153
+ console.log(chalk.gray(`Sign up: ${preset.signupUrl}`));
154
+ }
155
+ }
156
+ catch (err) {
157
+ console.error(chalk.red(err.message));
158
+ process.exit(1);
159
+ }
160
+ });
161
+ cmd
162
+ .command('add <name>')
163
+ .description('Add a profile. If <name> matches a built-in preset, the preset is applied. Prompts for API key (once per provider).')
164
+ .option('--preset <preset>', 'Use a named preset (defaults to <name> if a preset by that name exists)')
165
+ .option('--version <version>', 'Pin the host CLI version (e.g., 2.1.113)')
166
+ .option('--key-stdin', 'Read API key from stdin instead of prompting (for scripts/CI)')
167
+ .option('--force', 'Overwrite an existing profile with the same name')
168
+ .action(async (name, opts) => {
169
+ try {
170
+ if (profileExists(name) && !opts.force) {
171
+ console.error(chalk.red(`Profile '${name}' already exists. Use --force to overwrite.`));
172
+ process.exit(1);
173
+ }
174
+ const presetName = opts.preset || name;
175
+ const preset = getPreset(presetName);
176
+ if (!preset) {
177
+ console.error(chalk.red(`No preset '${presetName}'.`));
178
+ console.error(chalk.gray('Available presets: ' + listPresets().map((p) => p.name).join(', ')));
179
+ console.error(chalk.gray('Or pass --preset <name> to pick explicitly.'));
180
+ process.exit(1);
181
+ }
182
+ await ensureProviderToken(preset.provider, preset.signupUrl, opts.keyStdin);
183
+ const profile = profileFromPreset(name, preset, opts.version);
184
+ writeProfile(profile);
185
+ console.log(chalk.green(`Profile '${name}' added.`));
186
+ console.log(chalk.gray(`Try: agents run ${name} "hello"`));
187
+ }
188
+ catch (err) {
189
+ console.error(chalk.red(err.message));
190
+ process.exit(1);
191
+ }
192
+ });
193
+ cmd
194
+ .command('remove <name>')
195
+ .alias('rm')
196
+ .description('Delete a profile (keychain token is kept — use `profiles logout <provider>` to remove)')
197
+ .action((name) => {
198
+ const existed = deleteProfile(name);
199
+ if (!existed) {
200
+ console.error(chalk.red(`Profile '${name}' not found.`));
201
+ process.exit(1);
202
+ }
203
+ console.log(chalk.green(`Profile '${name}' removed.`));
204
+ });
205
+ cmd
206
+ .command('login <provider>')
207
+ .description('Store or rotate the API key for a provider (e.g., openrouter). Shared across profiles using that provider.')
208
+ .option('--key-stdin', 'Read API key from stdin')
209
+ .action(async (provider, opts) => {
210
+ try {
211
+ const item = keychainItemName(provider);
212
+ let token;
213
+ if (opts.keyStdin) {
214
+ token = readStdinSync();
215
+ if (!token)
216
+ throw new Error('No key received on stdin.');
217
+ }
218
+ else {
219
+ token = await promptForSecret(`Enter API key for ${provider}`);
220
+ }
221
+ setKeychainToken(item, token);
222
+ console.log(chalk.green(`Stored in keychain: ${item}`));
223
+ }
224
+ catch (err) {
225
+ console.error(chalk.red(err.message));
226
+ process.exit(1);
227
+ }
228
+ });
229
+ cmd
230
+ .command('logout <provider>')
231
+ .description('Remove a stored provider key from keychain')
232
+ .action((provider) => {
233
+ const item = keychainItemName(provider);
234
+ const existed = deleteKeychainToken(item);
235
+ if (!existed) {
236
+ console.error(chalk.yellow(`No keychain item '${item}' to remove.`));
237
+ process.exit(1);
238
+ }
239
+ console.log(chalk.green(`Removed keychain item: ${item}`));
240
+ });
241
+ }
242
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/commands/profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * PTY Commands
3
+ *
4
+ * CLI commands for managing interactive PTY sessions.
5
+ * Auto-starts the sidecar server on first use.
6
+ *
7
+ * Usage:
8
+ * agents pty start [--rows 24 --cols 120 --shell zsh --cwd /path]
9
+ * agents pty exec <id> <command>
10
+ * agents pty read <id> [--ms 200]
11
+ * agents pty write <id> <input>
12
+ * agents pty screen <id>
13
+ * agents pty signal <id> [INT|TERM|KILL]
14
+ * agents pty list
15
+ * agents pty stop <id>
16
+ * agents pty server [start|stop|status]
17
+ */
18
+ import type { Command } from 'commander';
19
+ export declare function registerPtyCommands(program: Command): void;
20
+ //# sourceMappingURL=pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../src/commands/pty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuX1D"}
@@ -0,0 +1,389 @@
1
+ /**
2
+ * PTY Commands
3
+ *
4
+ * CLI commands for managing interactive PTY sessions.
5
+ * Auto-starts the sidecar server on first use.
6
+ *
7
+ * Usage:
8
+ * agents pty start [--rows 24 --cols 120 --shell zsh --cwd /path]
9
+ * agents pty exec <id> <command>
10
+ * agents pty read <id> [--ms 200]
11
+ * agents pty write <id> <input>
12
+ * agents pty screen <id>
13
+ * agents pty signal <id> [INT|TERM|KILL]
14
+ * agents pty list
15
+ * agents pty stop <id>
16
+ * agents pty server [start|stop|status]
17
+ */
18
+ import chalk from 'chalk';
19
+ import { ptyRequest, unescapeInput } from '../lib/pty-client.js';
20
+ import { isPtyServerRunning, runPtyServer, getPtyPidPath, getPtyLogPath } from '../lib/pty-server.js';
21
+ import * as fs from 'fs';
22
+ export function registerPtyCommands(program) {
23
+ const pty = program
24
+ .command('pty')
25
+ .description('Drive interactive terminal programs from AI agents. Use this for REPLs, TUIs, or anything needing a real terminal.')
26
+ .addHelpText('after', `
27
+ Typical session workflow:
28
+ # Start a new terminal session (returns a session ID)
29
+ SID=$(agents pty start)
30
+
31
+ # Run a command (non-blocking, returns immediately)
32
+ agents pty exec $SID "python3"
33
+
34
+ # Wait a moment, then see what's on screen (clean text, no ANSI)
35
+ sleep 1 && agents pty screen $SID
36
+
37
+ # Send input (supports escape sequences: \\n \\t \\e \\xHH)
38
+ agents pty write $SID "print('hello')\\n"
39
+
40
+ # Read the output again
41
+ agents pty screen $SID
42
+
43
+ # Clean up when done
44
+ agents pty stop $SID
45
+
46
+ Use cases:
47
+ - Drive REPLs (python, node, irb) from agent code
48
+ - Automate TUI programs (npm init, interactive wizards)
49
+ - Test CLI tools that require a real PTY
50
+ - Run the 'agents' CLI itself from another agent
51
+
52
+ The PTY server auto-starts on first use and runs in the background.
53
+ Use 'agents pty server status' to check health.
54
+ `);
55
+ // --- Session lifecycle ---
56
+ pty
57
+ .command('start')
58
+ .description('Start a new PTY session and return its ID. The session persists until you stop it.')
59
+ .option('-r, --rows <n>', 'Terminal height in rows', '24')
60
+ .option('-c, --cols <n>', 'Terminal width in columns', '120')
61
+ .option('-s, --shell <shell>', 'Shell to launch (defaults to $SHELL, e.g., zsh, bash)')
62
+ .option('-d, --cwd <dir>', 'Working directory for the shell')
63
+ .option('--json', 'Output full session metadata as JSON')
64
+ .addHelpText('after', `
65
+ Examples:
66
+ # Start a session and capture its ID
67
+ SID=$(agents pty start)
68
+
69
+ # Start a Python REPL in a specific directory
70
+ agents pty start --shell python3 --cwd /tmp
71
+
72
+ # Start a wider terminal for TUI programs
73
+ agents pty start --cols 160 --rows 40
74
+ `)
75
+ .action(async (opts) => {
76
+ const params = {
77
+ rows: parseInt(opts.rows, 10),
78
+ cols: parseInt(opts.cols, 10),
79
+ };
80
+ if (opts.shell)
81
+ params.shell = opts.shell;
82
+ if (opts.cwd)
83
+ params.cwd = opts.cwd;
84
+ const res = await ptyRequest('start', undefined, params);
85
+ if (!res.ok) {
86
+ console.error(chalk.red(res.error));
87
+ process.exit(1);
88
+ }
89
+ if (opts.json) {
90
+ console.log(JSON.stringify(res));
91
+ }
92
+ else {
93
+ console.log(res.id);
94
+ }
95
+ });
96
+ pty
97
+ .command('exec <id> <command>')
98
+ .description('Send a command to a PTY session. Returns immediately (non-blocking). Use screen or read to see output.')
99
+ .option('--wait <ms>', 'Wait this many milliseconds then return the screen (convenience for quick commands)', '0')
100
+ .option('--json', 'Output as JSON')
101
+ .addHelpText('after', `
102
+ Examples:
103
+ # Run a command and return immediately
104
+ agents pty exec $SID "ls -la"
105
+
106
+ # Run a command and wait 500ms to see output
107
+ agents pty exec $SID "git status" --wait 500
108
+
109
+ # Start a long-running process (returns right away)
110
+ agents pty exec $SID "npm run dev"
111
+ `)
112
+ .action(async (id, command, opts) => {
113
+ const res = await ptyRequest('exec', id, { command });
114
+ if (!res.ok) {
115
+ console.error(chalk.red(res.error));
116
+ process.exit(1);
117
+ }
118
+ const waitMs = parseInt(opts.wait, 10);
119
+ if (waitMs > 0) {
120
+ // Wait then return screen
121
+ await new Promise(r => setTimeout(r, waitMs));
122
+ const screen = await ptyRequest('screen', id);
123
+ if (opts.json) {
124
+ console.log(JSON.stringify(screen));
125
+ }
126
+ else if (screen.ok) {
127
+ console.log(screen.screen);
128
+ }
129
+ }
130
+ else if (opts.json) {
131
+ console.log(JSON.stringify(res));
132
+ }
133
+ });
134
+ pty
135
+ .command('read <id>')
136
+ .description('Read raw output from the PTY (includes ANSI codes). Use screen for clean text instead.')
137
+ .option('-m, --ms <ms>', 'Wait up to this many milliseconds for new output (50-5000)', '200')
138
+ .option('--json', 'Output as JSON')
139
+ .addHelpText('after', `
140
+ Examples:
141
+ # Read pending output (wait up to 200ms)
142
+ agents pty read $SID
143
+
144
+ # Read with longer wait for slow commands
145
+ agents pty read $SID --ms 1000
146
+ `)
147
+ .action(async (id, opts) => {
148
+ const ms = parseInt(opts.ms, 10);
149
+ const res = await ptyRequest('read', id, { ms });
150
+ if (!res.ok) {
151
+ console.error(chalk.red(res.error));
152
+ process.exit(1);
153
+ }
154
+ if (opts.json) {
155
+ console.log(JSON.stringify(res));
156
+ }
157
+ else {
158
+ if (res.output)
159
+ process.stdout.write(res.output);
160
+ }
161
+ });
162
+ pty
163
+ .command('write <id> <input>')
164
+ .description('Send keystrokes to the PTY (like typing into the terminal). Processes escape sequences by default.')
165
+ .option('--raw', 'Send input literally without processing \\n \\t \\e \\xHH escape codes')
166
+ .option('--json', 'Output as JSON')
167
+ .addHelpText('after', `
168
+ Examples:
169
+ # Send Enter key
170
+ agents pty write $SID "\\n"
171
+
172
+ # Type a command and press Enter
173
+ agents pty write $SID "ls -la\\n"
174
+
175
+ # Send Ctrl-C (interrupt signal)
176
+ agents pty write $SID "\\x03"
177
+
178
+ # Send Escape key
179
+ agents pty write $SID "\\e"
180
+
181
+ # Send literal backslash-n (not newline)
182
+ agents pty write $SID "\\\\n" --raw
183
+ `)
184
+ .action(async (id, input, opts) => {
185
+ const processed = opts.raw ? input : unescapeInput(input);
186
+ const res = await ptyRequest('write', id, { input: processed });
187
+ if (!res.ok) {
188
+ console.error(chalk.red(res.error));
189
+ process.exit(1);
190
+ }
191
+ if (opts.json) {
192
+ console.log(JSON.stringify(res));
193
+ }
194
+ });
195
+ pty
196
+ .command('screen <id>')
197
+ .description('Render the terminal screen as clean text (no ANSI codes). This is what a human sees looking at the terminal.')
198
+ .option('--json', 'Output as JSON (includes cursor position and dimensions)')
199
+ .addHelpText('after', `
200
+ Examples:
201
+ # See what's currently on screen
202
+ agents pty screen $SID
203
+
204
+ # Get screen with cursor position as JSON
205
+ agents pty screen $SID --json
206
+
207
+ Use this (not read) when you want clean text for an LLM to parse.
208
+ `)
209
+ .action(async (id, opts) => {
210
+ const res = await ptyRequest('screen', id);
211
+ if (!res.ok) {
212
+ console.error(chalk.red(res.error));
213
+ process.exit(1);
214
+ }
215
+ if (opts.json) {
216
+ console.log(JSON.stringify(res));
217
+ }
218
+ else {
219
+ console.log(res.screen);
220
+ }
221
+ });
222
+ pty
223
+ .command('signal <id> [signal]')
224
+ .description('Send a POSIX signal to the running process. Defaults to INT (Ctrl-C).')
225
+ .addHelpText('after', `
226
+ Examples:
227
+ # Send Ctrl-C (interrupt)
228
+ agents pty signal $SID INT
229
+
230
+ # Terminate gracefully
231
+ agents pty signal $SID TERM
232
+
233
+ # Force kill
234
+ agents pty signal $SID KILL
235
+ `)
236
+ .action(async (id, signal) => {
237
+ const res = await ptyRequest('signal', id, { signal: signal || 'INT' });
238
+ if (!res.ok) {
239
+ console.error(chalk.red(res.error));
240
+ process.exit(1);
241
+ }
242
+ });
243
+ pty
244
+ .command('resize <id>')
245
+ .description('Resize a PTY session')
246
+ .option('-r, --rows <n>', 'Terminal rows')
247
+ .option('-c, --cols <n>', 'Terminal columns')
248
+ .action(async (id, opts) => {
249
+ const params = {};
250
+ if (opts.rows)
251
+ params.rows = parseInt(opts.rows, 10);
252
+ if (opts.cols)
253
+ params.cols = parseInt(opts.cols, 10);
254
+ const res = await ptyRequest('resize', id, params);
255
+ if (!res.ok) {
256
+ console.error(chalk.red(res.error));
257
+ process.exit(1);
258
+ }
259
+ console.log(`${res.cols}x${res.rows}`);
260
+ });
261
+ pty
262
+ .command('stop <id>')
263
+ .description('Stop a PTY session and clean up. The session ID becomes invalid.')
264
+ .addHelpText('after', `
265
+ Example:
266
+ agents pty stop $SID
267
+ `)
268
+ .action(async (id) => {
269
+ const res = await ptyRequest('stop', id);
270
+ if (!res.ok) {
271
+ console.error(chalk.red(res.error));
272
+ process.exit(1);
273
+ }
274
+ });
275
+ // --- Session listing ---
276
+ pty
277
+ .command('list')
278
+ .description('List all active PTY sessions (running or idle).')
279
+ .option('--json', 'Output as JSON')
280
+ .addHelpText('after', `
281
+ Example:
282
+ agents pty list
283
+ `)
284
+ .action(async (opts) => {
285
+ const res = await ptyRequest('list');
286
+ if (!res.ok) {
287
+ console.error(chalk.red(res.error));
288
+ process.exit(1);
289
+ }
290
+ if (opts.json) {
291
+ console.log(JSON.stringify(res.sessions));
292
+ return;
293
+ }
294
+ if (res.sessions.length === 0) {
295
+ console.log(chalk.gray('No active PTY sessions'));
296
+ return;
297
+ }
298
+ for (const s of res.sessions) {
299
+ const age = formatAge(Date.now() - s.started_at);
300
+ const status = s.exited
301
+ ? chalk.red(`exited (${s.exit_code})`)
302
+ : s.app_active
303
+ ? chalk.yellow(`running: ${s.active_command}`)
304
+ : chalk.green('idle');
305
+ console.log(` ${chalk.bold(s.id)} pid=${s.pid} ${s.shell} ${s.cols}x${s.rows} ${age} ${status}`);
306
+ console.log(` ${chalk.gray(s.cwd)}`);
307
+ }
308
+ });
309
+ // --- Server management ---
310
+ const serverCmd = pty
311
+ .command('server')
312
+ .description('Manage the PTY sidecar server (auto-starts on first use, usually you do not need this).');
313
+ serverCmd
314
+ .command('start')
315
+ .description('Start the PTY server manually (auto-starts on first pty command anyway).')
316
+ .action(async () => {
317
+ if (isPtyServerRunning()) {
318
+ const pidPath = getPtyPidPath();
319
+ const pid = fs.existsSync(pidPath) ? fs.readFileSync(pidPath, 'utf-8').trim() : '?';
320
+ console.log(chalk.yellow(`PTY server already running (PID: ${pid})`));
321
+ return;
322
+ }
323
+ // Use ptyRequest which auto-starts the server
324
+ const res = await ptyRequest('ping');
325
+ if (res.ok) {
326
+ console.log(chalk.green(`PTY server started (PID: ${res.pid})`));
327
+ }
328
+ else {
329
+ console.error(chalk.red('Failed to start PTY server'));
330
+ process.exit(1);
331
+ }
332
+ });
333
+ serverCmd
334
+ .command('stop')
335
+ .description('Stop the PTY server and kill all active sessions.')
336
+ .action(async () => {
337
+ if (!isPtyServerRunning()) {
338
+ console.log(chalk.yellow('PTY server is not running'));
339
+ return;
340
+ }
341
+ const pidPath = getPtyPidPath();
342
+ try {
343
+ const pid = parseInt(fs.readFileSync(pidPath, 'utf-8').trim(), 10);
344
+ process.kill(pid, 'SIGTERM');
345
+ console.log(chalk.green('PTY server stopped'));
346
+ }
347
+ catch {
348
+ console.error(chalk.red('Failed to stop PTY server'));
349
+ process.exit(1);
350
+ }
351
+ });
352
+ serverCmd
353
+ .command('status')
354
+ .description('Check if the PTY server is running and how many sessions are active.')
355
+ .action(async () => {
356
+ const running = isPtyServerRunning();
357
+ console.log(` Status: ${running ? chalk.green('running') : chalk.gray('stopped')}`);
358
+ if (running) {
359
+ try {
360
+ const res = await ptyRequest('ping');
361
+ if (res.ok) {
362
+ console.log(` PID: ${res.pid}`);
363
+ console.log(` Sessions: ${res.sessions}`);
364
+ }
365
+ }
366
+ catch { }
367
+ }
368
+ const logPath = getPtyLogPath();
369
+ console.log(` Log: ${logPath}`);
370
+ });
371
+ // Internal: run server in foreground (spawned by auto-start)
372
+ pty
373
+ .command('_server', { hidden: true })
374
+ .description('Run PTY server (internal)')
375
+ .action(async () => {
376
+ await runPtyServer();
377
+ });
378
+ }
379
+ function formatAge(ms) {
380
+ const secs = Math.floor(ms / 1000);
381
+ if (secs < 60)
382
+ return `${secs}s`;
383
+ const mins = Math.floor(secs / 60);
384
+ if (mins < 60)
385
+ return `${mins}m`;
386
+ const hours = Math.floor(mins / 60);
387
+ return `${hours}h ${mins % 60}m`;
388
+ }
389
+ //# sourceMappingURL=pty.js.map