@mragentix/cli 4.2.37

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 (461) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +772 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +16 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +29 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/agent-session.d.ts +87 -0
  12. package/dist/core/agent-session.d.ts.map +1 -0
  13. package/dist/core/agent-session.js +498 -0
  14. package/dist/core/agent-session.js.map +1 -0
  15. package/dist/core/agents.d.ts +30 -0
  16. package/dist/core/agents.d.ts.map +1 -0
  17. package/dist/core/agents.js +91 -0
  18. package/dist/core/agents.js.map +1 -0
  19. package/dist/core/auth-storage.d.ts +35 -0
  20. package/dist/core/auth-storage.d.ts.map +1 -0
  21. package/dist/core/auth-storage.js +144 -0
  22. package/dist/core/auth-storage.js.map +1 -0
  23. package/dist/core/auto-update.d.ts +8 -0
  24. package/dist/core/auto-update.d.ts.map +1 -0
  25. package/dist/core/auto-update.js +152 -0
  26. package/dist/core/auto-update.js.map +1 -0
  27. package/dist/core/compaction/compactor.d.ts +69 -0
  28. package/dist/core/compaction/compactor.d.ts.map +1 -0
  29. package/dist/core/compaction/compactor.js +405 -0
  30. package/dist/core/compaction/compactor.js.map +1 -0
  31. package/dist/core/compaction/compactor.test.d.ts +2 -0
  32. package/dist/core/compaction/compactor.test.d.ts.map +1 -0
  33. package/dist/core/compaction/compactor.test.js +461 -0
  34. package/dist/core/compaction/compactor.test.js.map +1 -0
  35. package/dist/core/compaction/token-estimator.d.ts +10 -0
  36. package/dist/core/compaction/token-estimator.d.ts.map +1 -0
  37. package/dist/core/compaction/token-estimator.js +75 -0
  38. package/dist/core/compaction/token-estimator.js.map +1 -0
  39. package/dist/core/compaction/token-estimator.test.d.ts +2 -0
  40. package/dist/core/compaction/token-estimator.test.d.ts.map +1 -0
  41. package/dist/core/compaction/token-estimator.test.js +137 -0
  42. package/dist/core/compaction/token-estimator.test.js.map +1 -0
  43. package/dist/core/custom-commands.d.ts +13 -0
  44. package/dist/core/custom-commands.d.ts.map +1 -0
  45. package/dist/core/custom-commands.js +40 -0
  46. package/dist/core/custom-commands.js.map +1 -0
  47. package/dist/core/event-bus.d.ts +95 -0
  48. package/dist/core/event-bus.d.ts.map +1 -0
  49. package/dist/core/event-bus.js +99 -0
  50. package/dist/core/event-bus.js.map +1 -0
  51. package/dist/core/extensions/loader.d.ts +8 -0
  52. package/dist/core/extensions/loader.d.ts.map +1 -0
  53. package/dist/core/extensions/loader.js +48 -0
  54. package/dist/core/extensions/loader.js.map +1 -0
  55. package/dist/core/extensions/types.d.ts +19 -0
  56. package/dist/core/extensions/types.d.ts.map +1 -0
  57. package/dist/core/extensions/types.js +2 -0
  58. package/dist/core/extensions/types.js.map +1 -0
  59. package/dist/core/file-lock.d.ts +6 -0
  60. package/dist/core/file-lock.d.ts.map +1 -0
  61. package/dist/core/file-lock.js +76 -0
  62. package/dist/core/file-lock.js.map +1 -0
  63. package/dist/core/index.d.ts +14 -0
  64. package/dist/core/index.d.ts.map +1 -0
  65. package/dist/core/index.js +13 -0
  66. package/dist/core/index.js.map +1 -0
  67. package/dist/core/logger.d.ts +26 -0
  68. package/dist/core/logger.d.ts.map +1 -0
  69. package/dist/core/logger.js +132 -0
  70. package/dist/core/logger.js.map +1 -0
  71. package/dist/core/mcp/client.d.ts +9 -0
  72. package/dist/core/mcp/client.d.ts.map +1 -0
  73. package/dist/core/mcp/client.js +126 -0
  74. package/dist/core/mcp/client.js.map +1 -0
  75. package/dist/core/mcp/defaults.d.ts +9 -0
  76. package/dist/core/mcp/defaults.d.ts.map +1 -0
  77. package/dist/core/mcp/defaults.js +47 -0
  78. package/dist/core/mcp/defaults.js.map +1 -0
  79. package/dist/core/mcp/index.d.ts +4 -0
  80. package/dist/core/mcp/index.d.ts.map +1 -0
  81. package/dist/core/mcp/index.js +3 -0
  82. package/dist/core/mcp/index.js.map +1 -0
  83. package/dist/core/mcp/types.d.ts +15 -0
  84. package/dist/core/mcp/types.d.ts.map +1 -0
  85. package/dist/core/mcp/types.js +2 -0
  86. package/dist/core/mcp/types.js.map +1 -0
  87. package/dist/core/model-registry.d.ts +25 -0
  88. package/dist/core/model-registry.d.ts.map +1 -0
  89. package/dist/core/model-registry.js +135 -0
  90. package/dist/core/model-registry.js.map +1 -0
  91. package/dist/core/oauth/anthropic.d.ts +4 -0
  92. package/dist/core/oauth/anthropic.d.ts.map +1 -0
  93. package/dist/core/oauth/anthropic.js +75 -0
  94. package/dist/core/oauth/anthropic.js.map +1 -0
  95. package/dist/core/oauth/openai.d.ts +4 -0
  96. package/dist/core/oauth/openai.d.ts.map +1 -0
  97. package/dist/core/oauth/openai.js +186 -0
  98. package/dist/core/oauth/openai.js.map +1 -0
  99. package/dist/core/oauth/pkce.d.ts +5 -0
  100. package/dist/core/oauth/pkce.d.ts.map +1 -0
  101. package/dist/core/oauth/pkce.js +17 -0
  102. package/dist/core/oauth/pkce.js.map +1 -0
  103. package/dist/core/oauth/types.d.ts +12 -0
  104. package/dist/core/oauth/types.d.ts.map +1 -0
  105. package/dist/core/oauth/types.js +2 -0
  106. package/dist/core/oauth/types.js.map +1 -0
  107. package/dist/core/process-manager.d.ts +30 -0
  108. package/dist/core/process-manager.d.ts.map +1 -0
  109. package/dist/core/process-manager.js +130 -0
  110. package/dist/core/process-manager.js.map +1 -0
  111. package/dist/core/prompt-commands.d.ts +14 -0
  112. package/dist/core/prompt-commands.d.ts.map +1 -0
  113. package/dist/core/prompt-commands.js +496 -0
  114. package/dist/core/prompt-commands.js.map +1 -0
  115. package/dist/core/session-manager.d.ts +112 -0
  116. package/dist/core/session-manager.d.ts.map +1 -0
  117. package/dist/core/session-manager.js +326 -0
  118. package/dist/core/session-manager.js.map +1 -0
  119. package/dist/core/settings-manager.d.ts +43 -0
  120. package/dist/core/settings-manager.d.ts.map +1 -0
  121. package/dist/core/settings-manager.js +64 -0
  122. package/dist/core/settings-manager.js.map +1 -0
  123. package/dist/core/skills.d.ts +23 -0
  124. package/dist/core/skills.d.ts.map +1 -0
  125. package/dist/core/skills.js +89 -0
  126. package/dist/core/skills.js.map +1 -0
  127. package/dist/core/slash-commands.d.ts +35 -0
  128. package/dist/core/slash-commands.d.ts.map +1 -0
  129. package/dist/core/slash-commands.js +183 -0
  130. package/dist/core/slash-commands.js.map +1 -0
  131. package/dist/core/telegram.d.ts +94 -0
  132. package/dist/core/telegram.d.ts.map +1 -0
  133. package/dist/core/telegram.js +227 -0
  134. package/dist/core/telegram.js.map +1 -0
  135. package/dist/index.d.ts +10 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +15 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/interactive.d.ts +3 -0
  140. package/dist/interactive.d.ts.map +1 -0
  141. package/dist/interactive.js +173 -0
  142. package/dist/interactive.js.map +1 -0
  143. package/dist/modes/index.d.ts +3 -0
  144. package/dist/modes/index.d.ts.map +1 -0
  145. package/dist/modes/index.js +3 -0
  146. package/dist/modes/index.js.map +1 -0
  147. package/dist/modes/json-mode.d.ts +13 -0
  148. package/dist/modes/json-mode.d.ts.map +1 -0
  149. package/dist/modes/json-mode.js +74 -0
  150. package/dist/modes/json-mode.js.map +1 -0
  151. package/dist/modes/print-mode.d.ts +12 -0
  152. package/dist/modes/print-mode.d.ts.map +1 -0
  153. package/dist/modes/print-mode.js +49 -0
  154. package/dist/modes/print-mode.js.map +1 -0
  155. package/dist/modes/rpc-mode.d.ts +28 -0
  156. package/dist/modes/rpc-mode.d.ts.map +1 -0
  157. package/dist/modes/rpc-mode.js +145 -0
  158. package/dist/modes/rpc-mode.js.map +1 -0
  159. package/dist/modes/serve-mode.d.ts +21 -0
  160. package/dist/modes/serve-mode.d.ts.map +1 -0
  161. package/dist/modes/serve-mode.js +649 -0
  162. package/dist/modes/serve-mode.js.map +1 -0
  163. package/dist/session.d.ts +16 -0
  164. package/dist/session.d.ts.map +1 -0
  165. package/dist/session.js +129 -0
  166. package/dist/session.js.map +1 -0
  167. package/dist/system-prompt.d.ts +6 -0
  168. package/dist/system-prompt.d.ts.map +1 -0
  169. package/dist/system-prompt.js +115 -0
  170. package/dist/system-prompt.js.map +1 -0
  171. package/dist/tools/bash.d.ts +13 -0
  172. package/dist/tools/bash.d.ts.map +1 -0
  173. package/dist/tools/bash.js +165 -0
  174. package/dist/tools/bash.js.map +1 -0
  175. package/dist/tools/edit-diff.d.ts +18 -0
  176. package/dist/tools/edit-diff.d.ts.map +1 -0
  177. package/dist/tools/edit-diff.js +92 -0
  178. package/dist/tools/edit-diff.js.map +1 -0
  179. package/dist/tools/edit.d.ts +11 -0
  180. package/dist/tools/edit.d.ts.map +1 -0
  181. package/dist/tools/edit.js +57 -0
  182. package/dist/tools/edit.js.map +1 -0
  183. package/dist/tools/find.d.ts +9 -0
  184. package/dist/tools/find.d.ts.map +1 -0
  185. package/dist/tools/find.js +59 -0
  186. package/dist/tools/find.js.map +1 -0
  187. package/dist/tools/grep.d.ts +13 -0
  188. package/dist/tools/grep.d.ts.map +1 -0
  189. package/dist/tools/grep.js +121 -0
  190. package/dist/tools/grep.js.map +1 -0
  191. package/dist/tools/index.d.ts +30 -0
  192. package/dist/tools/index.d.ts.map +1 -0
  193. package/dist/tools/index.js +50 -0
  194. package/dist/tools/index.js.map +1 -0
  195. package/dist/tools/ls.d.ts +10 -0
  196. package/dist/tools/ls.d.ts.map +1 -0
  197. package/dist/tools/ls.js +56 -0
  198. package/dist/tools/ls.js.map +1 -0
  199. package/dist/tools/operations.d.ts +39 -0
  200. package/dist/tools/operations.d.ts.map +1 -0
  201. package/dist/tools/operations.js +27 -0
  202. package/dist/tools/operations.js.map +1 -0
  203. package/dist/tools/path-utils.d.ts +7 -0
  204. package/dist/tools/path-utils.d.ts.map +1 -0
  205. package/dist/tools/path-utils.js +27 -0
  206. package/dist/tools/path-utils.js.map +1 -0
  207. package/dist/tools/read.d.ts +12 -0
  208. package/dist/tools/read.d.ts.map +1 -0
  209. package/dist/tools/read.js +113 -0
  210. package/dist/tools/read.js.map +1 -0
  211. package/dist/tools/subagent.d.ts +26 -0
  212. package/dist/tools/subagent.d.ts.map +1 -0
  213. package/dist/tools/subagent.js +210 -0
  214. package/dist/tools/subagent.js.map +1 -0
  215. package/dist/tools/task-output.d.ts +10 -0
  216. package/dist/tools/task-output.d.ts.map +1 -0
  217. package/dist/tools/task-output.js +33 -0
  218. package/dist/tools/task-output.js.map +1 -0
  219. package/dist/tools/task-stop.d.ts +9 -0
  220. package/dist/tools/task-stop.d.ts.map +1 -0
  221. package/dist/tools/task-stop.js +15 -0
  222. package/dist/tools/task-stop.js.map +1 -0
  223. package/dist/tools/tasks.d.ts +16 -0
  224. package/dist/tools/tasks.d.ts.map +1 -0
  225. package/dist/tools/tasks.js +132 -0
  226. package/dist/tools/tasks.js.map +1 -0
  227. package/dist/tools/truncate.d.ts +19 -0
  228. package/dist/tools/truncate.d.ts.map +1 -0
  229. package/dist/tools/truncate.js +59 -0
  230. package/dist/tools/truncate.js.map +1 -0
  231. package/dist/tools/truncate.test.d.ts +2 -0
  232. package/dist/tools/truncate.test.d.ts.map +1 -0
  233. package/dist/tools/truncate.test.js +100 -0
  234. package/dist/tools/truncate.test.js.map +1 -0
  235. package/dist/tools/web-fetch.d.ts +9 -0
  236. package/dist/tools/web-fetch.d.ts.map +1 -0
  237. package/dist/tools/web-fetch.js +97 -0
  238. package/dist/tools/web-fetch.js.map +1 -0
  239. package/dist/tools/write.d.ts +10 -0
  240. package/dist/tools/write.d.ts.map +1 -0
  241. package/dist/tools/write.js +30 -0
  242. package/dist/tools/write.js.map +1 -0
  243. package/dist/tools/write.test.d.ts +2 -0
  244. package/dist/tools/write.test.d.ts.map +1 -0
  245. package/dist/tools/write.test.js +84 -0
  246. package/dist/tools/write.test.js.map +1 -0
  247. package/dist/types.d.ts +36 -0
  248. package/dist/types.d.ts.map +1 -0
  249. package/dist/types.js +2 -0
  250. package/dist/types.js.map +1 -0
  251. package/dist/ui/App.d.ts +148 -0
  252. package/dist/ui/App.d.ts.map +1 -0
  253. package/dist/ui/App.js +1191 -0
  254. package/dist/ui/App.js.map +1 -0
  255. package/dist/ui/components/ActivityIndicator.d.ts +13 -0
  256. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -0
  257. package/dist/ui/components/ActivityIndicator.js +313 -0
  258. package/dist/ui/components/ActivityIndicator.js.map +1 -0
  259. package/dist/ui/components/AnimationContext.d.ts +22 -0
  260. package/dist/ui/components/AnimationContext.d.ts.map +1 -0
  261. package/dist/ui/components/AnimationContext.js +35 -0
  262. package/dist/ui/components/AnimationContext.js.map +1 -0
  263. package/dist/ui/components/AssistantMessage.d.ts +9 -0
  264. package/dist/ui/components/AssistantMessage.d.ts.map +1 -0
  265. package/dist/ui/components/AssistantMessage.js +11 -0
  266. package/dist/ui/components/AssistantMessage.js.map +1 -0
  267. package/dist/ui/components/BackgroundTasksBar.d.ts +15 -0
  268. package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -0
  269. package/dist/ui/components/BackgroundTasksBar.js +74 -0
  270. package/dist/ui/components/BackgroundTasksBar.js.map +1 -0
  271. package/dist/ui/components/Banner.d.ts +11 -0
  272. package/dist/ui/components/Banner.d.ts.map +1 -0
  273. package/dist/ui/components/Banner.js +55 -0
  274. package/dist/ui/components/Banner.js.map +1 -0
  275. package/dist/ui/components/CompactionNotice.d.ts +10 -0
  276. package/dist/ui/components/CompactionNotice.d.ts.map +1 -0
  277. package/dist/ui/components/CompactionNotice.js +27 -0
  278. package/dist/ui/components/CompactionNotice.js.map +1 -0
  279. package/dist/ui/components/DiffView.d.ts +4 -0
  280. package/dist/ui/components/DiffView.d.ts.map +1 -0
  281. package/dist/ui/components/DiffView.js +20 -0
  282. package/dist/ui/components/DiffView.js.map +1 -0
  283. package/dist/ui/components/Footer.d.ts +10 -0
  284. package/dist/ui/components/Footer.d.ts.map +1 -0
  285. package/dist/ui/components/Footer.js +105 -0
  286. package/dist/ui/components/Footer.js.map +1 -0
  287. package/dist/ui/components/InputArea.d.ts +21 -0
  288. package/dist/ui/components/InputArea.d.ts.map +1 -0
  289. package/dist/ui/components/InputArea.js +465 -0
  290. package/dist/ui/components/InputArea.js.map +1 -0
  291. package/dist/ui/components/Markdown.d.ts +9 -0
  292. package/dist/ui/components/Markdown.d.ts.map +1 -0
  293. package/dist/ui/components/Markdown.js +246 -0
  294. package/dist/ui/components/Markdown.js.map +1 -0
  295. package/dist/ui/components/ModelSelector.d.ts +11 -0
  296. package/dist/ui/components/ModelSelector.d.ts.map +1 -0
  297. package/dist/ui/components/ModelSelector.js +20 -0
  298. package/dist/ui/components/ModelSelector.js.map +1 -0
  299. package/dist/ui/components/Overlay.d.ts +8 -0
  300. package/dist/ui/components/Overlay.d.ts.map +1 -0
  301. package/dist/ui/components/Overlay.js +9 -0
  302. package/dist/ui/components/Overlay.js.map +1 -0
  303. package/dist/ui/components/SelectList.d.ts +14 -0
  304. package/dist/ui/components/SelectList.d.ts.map +1 -0
  305. package/dist/ui/components/SelectList.js +46 -0
  306. package/dist/ui/components/SelectList.js.map +1 -0
  307. package/dist/ui/components/ServerToolExecution.d.ts +17 -0
  308. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -0
  309. package/dist/ui/components/ServerToolExecution.js +26 -0
  310. package/dist/ui/components/ServerToolExecution.js.map +1 -0
  311. package/dist/ui/components/SessionSelector.d.ts +9 -0
  312. package/dist/ui/components/SessionSelector.d.ts.map +1 -0
  313. package/dist/ui/components/SessionSelector.js +13 -0
  314. package/dist/ui/components/SessionSelector.js.map +1 -0
  315. package/dist/ui/components/SettingsSelector.d.ts +9 -0
  316. package/dist/ui/components/SettingsSelector.d.ts.map +1 -0
  317. package/dist/ui/components/SettingsSelector.js +13 -0
  318. package/dist/ui/components/SettingsSelector.js.map +1 -0
  319. package/dist/ui/components/SlashCommandMenu.d.ts +15 -0
  320. package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -0
  321. package/dist/ui/components/SlashCommandMenu.js +32 -0
  322. package/dist/ui/components/SlashCommandMenu.js.map +1 -0
  323. package/dist/ui/components/Spinner.d.ts +4 -0
  324. package/dist/ui/components/Spinner.d.ts.map +1 -0
  325. package/dist/ui/components/Spinner.js +13 -0
  326. package/dist/ui/components/Spinner.js.map +1 -0
  327. package/dist/ui/components/StreamingArea.d.ts +10 -0
  328. package/dist/ui/components/StreamingArea.d.ts.map +1 -0
  329. package/dist/ui/components/StreamingArea.js +58 -0
  330. package/dist/ui/components/StreamingArea.js.map +1 -0
  331. package/dist/ui/components/SubAgentPanel.d.ts +21 -0
  332. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -0
  333. package/dist/ui/components/SubAgentPanel.js +71 -0
  334. package/dist/ui/components/SubAgentPanel.js.map +1 -0
  335. package/dist/ui/components/TaskOverlay.d.ts +10 -0
  336. package/dist/ui/components/TaskOverlay.d.ts.map +1 -0
  337. package/dist/ui/components/TaskOverlay.js +263 -0
  338. package/dist/ui/components/TaskOverlay.js.map +1 -0
  339. package/dist/ui/components/ThinkingBlock.d.ts +11 -0
  340. package/dist/ui/components/ThinkingBlock.d.ts.map +1 -0
  341. package/dist/ui/components/ThinkingBlock.js +43 -0
  342. package/dist/ui/components/ThinkingBlock.js.map +1 -0
  343. package/dist/ui/components/ThinkingIndicator.d.ts +6 -0
  344. package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -0
  345. package/dist/ui/components/ThinkingIndicator.js +144 -0
  346. package/dist/ui/components/ThinkingIndicator.js.map +1 -0
  347. package/dist/ui/components/ToolExecution.d.ts +16 -0
  348. package/dist/ui/components/ToolExecution.d.ts.map +1 -0
  349. package/dist/ui/components/ToolExecution.js +490 -0
  350. package/dist/ui/components/ToolExecution.js.map +1 -0
  351. package/dist/ui/components/ToolGroupExecution.d.ts +7 -0
  352. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -0
  353. package/dist/ui/components/ToolGroupExecution.js +115 -0
  354. package/dist/ui/components/ToolGroupExecution.js.map +1 -0
  355. package/dist/ui/components/UserMessage.d.ts +7 -0
  356. package/dist/ui/components/UserMessage.d.ts.map +1 -0
  357. package/dist/ui/components/UserMessage.js +16 -0
  358. package/dist/ui/components/UserMessage.js.map +1 -0
  359. package/dist/ui/components/index.d.ts +15 -0
  360. package/dist/ui/components/index.d.ts.map +1 -0
  361. package/dist/ui/components/index.js +15 -0
  362. package/dist/ui/components/index.js.map +1 -0
  363. package/dist/ui/hooks/useAgentLoop.d.ts +69 -0
  364. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -0
  365. package/dist/ui/hooks/useAgentLoop.js +483 -0
  366. package/dist/ui/hooks/useAgentLoop.js.map +1 -0
  367. package/dist/ui/hooks/useSessionManager.d.ts +13 -0
  368. package/dist/ui/hooks/useSessionManager.d.ts.map +1 -0
  369. package/dist/ui/hooks/useSessionManager.js +43 -0
  370. package/dist/ui/hooks/useSessionManager.js.map +1 -0
  371. package/dist/ui/hooks/useSlashCommands.d.ts +7 -0
  372. package/dist/ui/hooks/useSlashCommands.d.ts.map +1 -0
  373. package/dist/ui/hooks/useSlashCommands.js +11 -0
  374. package/dist/ui/hooks/useSlashCommands.js.map +1 -0
  375. package/dist/ui/hooks/useTerminalSize.d.ts +20 -0
  376. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -0
  377. package/dist/ui/hooks/useTerminalSize.js +55 -0
  378. package/dist/ui/hooks/useTerminalSize.js.map +1 -0
  379. package/dist/ui/hooks/useTerminalTitle.d.ts +3 -0
  380. package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -0
  381. package/dist/ui/hooks/useTerminalTitle.js +41 -0
  382. package/dist/ui/hooks/useTerminalTitle.js.map +1 -0
  383. package/dist/ui/live-item-flush.d.ts +59 -0
  384. package/dist/ui/live-item-flush.d.ts.map +1 -0
  385. package/dist/ui/live-item-flush.js +135 -0
  386. package/dist/ui/live-item-flush.js.map +1 -0
  387. package/dist/ui/live-item-flush.test.d.ts +2 -0
  388. package/dist/ui/live-item-flush.test.d.ts.map +1 -0
  389. package/dist/ui/live-item-flush.test.js +307 -0
  390. package/dist/ui/live-item-flush.test.js.map +1 -0
  391. package/dist/ui/login.d.ts +3 -0
  392. package/dist/ui/login.d.ts.map +1 -0
  393. package/dist/ui/login.js +117 -0
  394. package/dist/ui/login.js.map +1 -0
  395. package/dist/ui/render.d.ts +38 -0
  396. package/dist/ui/render.d.ts.map +1 -0
  397. package/dist/ui/render.js +72 -0
  398. package/dist/ui/render.js.map +1 -0
  399. package/dist/ui/sessions.d.ts +2 -0
  400. package/dist/ui/sessions.d.ts.map +1 -0
  401. package/dist/ui/sessions.js +208 -0
  402. package/dist/ui/sessions.js.map +1 -0
  403. package/dist/ui/spinner-frames.d.ts +3 -0
  404. package/dist/ui/spinner-frames.d.ts.map +1 -0
  405. package/dist/ui/spinner-frames.js +7 -0
  406. package/dist/ui/spinner-frames.js.map +1 -0
  407. package/dist/ui/theme/dark.json +24 -0
  408. package/dist/ui/theme/detect-theme.d.ts +12 -0
  409. package/dist/ui/theme/detect-theme.d.ts.map +1 -0
  410. package/dist/ui/theme/detect-theme.js +152 -0
  411. package/dist/ui/theme/detect-theme.js.map +1 -0
  412. package/dist/ui/theme/light.json +24 -0
  413. package/dist/ui/theme/theme.d.ts +29 -0
  414. package/dist/ui/theme/theme.d.ts.map +1 -0
  415. package/dist/ui/theme/theme.js +11 -0
  416. package/dist/ui/theme/theme.js.map +1 -0
  417. package/dist/ui/utils/highlight.d.ts +8 -0
  418. package/dist/ui/utils/highlight.d.ts.map +1 -0
  419. package/dist/ui/utils/highlight.js +49 -0
  420. package/dist/ui/utils/highlight.js.map +1 -0
  421. package/dist/ui/utils/table-text.d.ts +25 -0
  422. package/dist/ui/utils/table-text.d.ts.map +1 -0
  423. package/dist/ui/utils/table-text.js +78 -0
  424. package/dist/ui/utils/table-text.js.map +1 -0
  425. package/dist/ui/utils/table-text.test.d.ts +2 -0
  426. package/dist/ui/utils/table-text.test.d.ts.map +1 -0
  427. package/dist/ui/utils/table-text.test.js +202 -0
  428. package/dist/ui/utils/table-text.test.js.map +1 -0
  429. package/dist/utils/error-handler.d.ts +5 -0
  430. package/dist/utils/error-handler.d.ts.map +1 -0
  431. package/dist/utils/error-handler.js +120 -0
  432. package/dist/utils/error-handler.js.map +1 -0
  433. package/dist/utils/format.d.ts +21 -0
  434. package/dist/utils/format.d.ts.map +1 -0
  435. package/dist/utils/format.js +120 -0
  436. package/dist/utils/format.js.map +1 -0
  437. package/dist/utils/git.d.ts +2 -0
  438. package/dist/utils/git.d.ts.map +1 -0
  439. package/dist/utils/git.js +13 -0
  440. package/dist/utils/git.js.map +1 -0
  441. package/dist/utils/image.d.ts +30 -0
  442. package/dist/utils/image.d.ts.map +1 -0
  443. package/dist/utils/image.js +231 -0
  444. package/dist/utils/image.js.map +1 -0
  445. package/dist/utils/markdown.d.ts +6 -0
  446. package/dist/utils/markdown.d.ts.map +1 -0
  447. package/dist/utils/markdown.js +25 -0
  448. package/dist/utils/markdown.js.map +1 -0
  449. package/dist/utils/process.d.ts +6 -0
  450. package/dist/utils/process.d.ts.map +1 -0
  451. package/dist/utils/process.js +19 -0
  452. package/dist/utils/process.js.map +1 -0
  453. package/dist/utils/shell.d.ts +3 -0
  454. package/dist/utils/shell.d.ts.map +1 -0
  455. package/dist/utils/shell.js +8 -0
  456. package/dist/utils/shell.js.map +1 -0
  457. package/dist/utils/sound.d.ts +2 -0
  458. package/dist/utils/sound.d.ts.map +1 -0
  459. package/dist/utils/sound.js +11 -0
  460. package/dist/utils/sound.js.map +1 -0
  461. package/package.json +56 -0
package/dist/cli.js ADDED
@@ -0,0 +1,772 @@
1
+ #!/usr/bin/env node
2
+ // Drain performance entries to prevent buffer overflow warning from dependencies
3
+ import { PerformanceObserver, performance } from "node:perf_hooks";
4
+ new PerformanceObserver((list) => {
5
+ for (const entry of list.getEntries()) {
6
+ if (entry.entryType === "measure")
7
+ performance.clearMeasures(entry.name);
8
+ else if (entry.entryType === "mark")
9
+ performance.clearMarks(entry.name);
10
+ }
11
+ }).observe({ entryTypes: ["measure", "mark"] });
12
+ import { parseArgs } from "node:util";
13
+ import fs from "node:fs";
14
+ import readline from "node:readline/promises";
15
+ import { execFile } from "node:child_process";
16
+ import { createRequire } from "node:module";
17
+ import { renderApp } from "./ui/render.js";
18
+ import { runJsonMode } from "./modes/json-mode.js";
19
+ import { runRpcMode } from "./modes/rpc-mode.js";
20
+ import { runServeMode } from "./modes/serve-mode.js";
21
+ import { renderLoginSelector } from "./ui/login.js";
22
+ import { renderSessionSelector } from "./ui/sessions.js";
23
+ import { formatUserError } from "./utils/error-handler.js";
24
+ import { AuthStorage } from "./core/auth-storage.js";
25
+ import { SessionManager } from "./core/session-manager.js";
26
+ import { ensureAppDirs, getAppPaths } from "./config.js";
27
+ import { initLogger, log, closeLogger } from "./core/logger.js";
28
+ import { buildSystemPrompt } from "./system-prompt.js";
29
+ import { createTools } from "./tools/index.js";
30
+ import { shouldCompact, compact } from "./core/compaction/compactor.js";
31
+ import { setEstimatorModel } from "./core/compaction/token-estimator.js";
32
+ import { getContextWindow } from "./core/model-registry.js";
33
+ import { MCPClientManager, getMCPServers } from "./core/mcp/index.js";
34
+ import { discoverAgents } from "./core/agents.js";
35
+ import { loginAnthropic } from "./core/oauth/anthropic.js";
36
+ import { loginOpenAI } from "./core/oauth/openai.js";
37
+ import chalk from "chalk";
38
+ import { checkAndAutoUpdate } from "./core/auto-update.js";
39
+ const _require = createRequire(import.meta.url);
40
+ const CLI_VERSION = _require("../package.json").version;
41
+ function main() {
42
+ // Silent auto-update check (throttled, non-blocking on failure)
43
+ const updateMessage = checkAndAutoUpdate(CLI_VERSION);
44
+ if (updateMessage) {
45
+ console.error(chalk.hex("#60a5fa")(updateMessage));
46
+ }
47
+ // Handle subcommands before parseArgs
48
+ const subcommand = process.argv[2];
49
+ if (subcommand === "login") {
50
+ runLogin().catch((err) => {
51
+ log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
52
+ closeLogger();
53
+ process.stderr.write(formatUserError(err) + "\n");
54
+ process.exit(1);
55
+ });
56
+ return;
57
+ }
58
+ if (subcommand === "logout") {
59
+ runLogout().catch((err) => {
60
+ log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
61
+ closeLogger();
62
+ process.stderr.write(formatUserError(err) + "\n");
63
+ process.exit(1);
64
+ });
65
+ return;
66
+ }
67
+ if (subcommand === "sessions") {
68
+ process.argv.splice(2, 1);
69
+ runSessions().catch((err) => {
70
+ log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
71
+ closeLogger();
72
+ process.stderr.write(formatUserError(err) + "\n");
73
+ process.exit(1);
74
+ });
75
+ return;
76
+ }
77
+ if (subcommand === "telegram") {
78
+ runTelegramSetup().catch((err) => {
79
+ log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
80
+ closeLogger();
81
+ process.stderr.write(formatUserError(err) + "\n");
82
+ process.exit(1);
83
+ });
84
+ return;
85
+ }
86
+ if (subcommand === "serve") {
87
+ process.argv.splice(2, 1);
88
+ runServe().catch((err) => {
89
+ log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
90
+ closeLogger();
91
+ process.stderr.write(formatUserError(err) + "\n");
92
+ process.exit(1);
93
+ });
94
+ return;
95
+ }
96
+ if (subcommand === "continue") {
97
+ // Remove "continue" so parseArgs handles remaining flags
98
+ process.argv.splice(2, 1);
99
+ }
100
+ const { values, positionals } = parseArgs({
101
+ options: {
102
+ version: { type: "boolean", short: "v" },
103
+ json: { type: "boolean" },
104
+ rpc: { type: "boolean" },
105
+ provider: { type: "string" },
106
+ model: { type: "string" },
107
+ "max-turns": { type: "string" },
108
+ "system-prompt": { type: "string" },
109
+ },
110
+ allowPositionals: true,
111
+ strict: true,
112
+ });
113
+ if (values.version) {
114
+ console.log(CLI_VERSION);
115
+ process.exit(0);
116
+ }
117
+ // JSON mode — used by sub-agents
118
+ if (values.json) {
119
+ const message = positionals[0] ?? "";
120
+ const jsonProvider = (values.provider ?? "anthropic");
121
+ const jsonModel = values.model ?? "claude-opus-4-6";
122
+ const maxTurns = values["max-turns"] ? parseInt(values["max-turns"], 10) : undefined;
123
+ const systemPrompt = values["system-prompt"];
124
+ const cwd = process.cwd();
125
+ runJsonMode({
126
+ message,
127
+ provider: jsonProvider,
128
+ model: jsonModel,
129
+ cwd,
130
+ systemPrompt,
131
+ maxTurns,
132
+ }).catch((err) => {
133
+ process.stderr.write(formatUserError(err) + "\n");
134
+ process.exit(1);
135
+ });
136
+ return;
137
+ }
138
+ // RPC mode — headless JSON-over-stdio for IDE integrations
139
+ if (values.rpc) {
140
+ const rpcProvider = (values.provider ?? "anthropic");
141
+ const rpcModel = values.model ?? "claude-opus-4-6";
142
+ const systemPrompt = values["system-prompt"];
143
+ const cwd = process.cwd();
144
+ runRpcMode({
145
+ provider: rpcProvider,
146
+ model: rpcModel,
147
+ cwd,
148
+ systemPrompt,
149
+ }).catch((err) => {
150
+ process.stderr.write(formatUserError(err) + "\n");
151
+ process.exit(1);
152
+ });
153
+ return;
154
+ }
155
+ // Load saved settings for model/provider persistence
156
+ let savedProvider;
157
+ let savedModel;
158
+ let savedThinkingEnabled = false;
159
+ let savedTheme = "auto";
160
+ try {
161
+ const raw = JSON.parse(fs.readFileSync(getAppPaths().settingsFile, "utf-8"));
162
+ if (raw.defaultProvider)
163
+ savedProvider = raw.defaultProvider;
164
+ if (raw.defaultModel)
165
+ savedModel = raw.defaultModel;
166
+ if (raw.thinkingEnabled === true)
167
+ savedThinkingEnabled = true;
168
+ if (raw.theme === "dark" || raw.theme === "light" || raw.theme === "auto")
169
+ savedTheme = raw.theme;
170
+ }
171
+ catch {
172
+ // No settings file or invalid JSON — use defaults
173
+ }
174
+ const provider = savedProvider ?? "anthropic";
175
+ function getHardcodedDefault(p) {
176
+ if (p === "openai")
177
+ return "gpt-5.3-codex";
178
+ if (p === "glm")
179
+ return "glm-5";
180
+ if (p === "moonshot")
181
+ return "kimi-k2.5";
182
+ return "claude-opus-4-6";
183
+ }
184
+ const model = savedModel ?? getHardcodedDefault(provider);
185
+ const thinkingLevel = savedThinkingEnabled ? "medium" : undefined;
186
+ // Interactive mode (Ink TUI)
187
+ const cwd = process.cwd();
188
+ const continueRecent = subcommand === "continue";
189
+ runInkTUI({
190
+ provider,
191
+ model,
192
+ cwd,
193
+ thinkingLevel,
194
+ continueRecent,
195
+ theme: savedTheme,
196
+ }).catch((err) => {
197
+ log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
198
+ closeLogger();
199
+ process.stderr.write(formatUserError(err) + "\n");
200
+ process.exit(1);
201
+ });
202
+ }
203
+ // ── Ink TUI ───────────────────────────────────────────────
204
+ async function runInkTUI(opts) {
205
+ const { provider, model, cwd } = opts;
206
+ // Set model for token estimation accuracy
207
+ setEstimatorModel(model);
208
+ // Resolve auth
209
+ const paths = await ensureAppDirs();
210
+ initLogger(paths.logFile, {
211
+ version: CLI_VERSION,
212
+ provider,
213
+ model,
214
+ thinking: opts.thinkingLevel,
215
+ });
216
+ const authStorage = new AuthStorage(paths.authFile);
217
+ await authStorage.load();
218
+ const creds = await authStorage.resolveCredentials(provider);
219
+ // Detect all logged-in providers and preload their credentials
220
+ const allProviders = ["anthropic", "openai", "glm", "moonshot"];
221
+ const loggedInProviders = [];
222
+ const credentialsByProvider = {};
223
+ for (const p of allProviders) {
224
+ const stored = await authStorage.getCredentials(p);
225
+ if (stored) {
226
+ loggedInProviders.push(p);
227
+ try {
228
+ const resolved = await authStorage.resolveCredentials(p);
229
+ credentialsByProvider[p] = {
230
+ accessToken: resolved.accessToken,
231
+ accountId: resolved.accountId,
232
+ };
233
+ }
234
+ catch {
235
+ // Token refresh failed — still mark as logged in
236
+ }
237
+ }
238
+ }
239
+ // Discover agents and build tools
240
+ const agents = await discoverAgents({
241
+ globalAgentsDir: paths.agentsDir,
242
+ projectDir: cwd,
243
+ });
244
+ // Build system prompt & tools (with sub-agent support)
245
+ const systemPrompt = await buildSystemPrompt(cwd);
246
+ const { tools, processManager } = createTools(cwd, { agents, provider, model });
247
+ // Connect MCP servers
248
+ const mcpManager = new MCPClientManager();
249
+ try {
250
+ const providerApiKey = provider === "glm" ? credentialsByProvider["glm"]?.accessToken : undefined;
251
+ const mcpTools = await mcpManager.connectAll(getMCPServers(provider, providerApiKey));
252
+ tools.push(...mcpTools);
253
+ }
254
+ catch (err) {
255
+ log("WARN", "mcp", `MCP initialization failed: ${err instanceof Error ? err.message : String(err)}`);
256
+ }
257
+ // Kill all background processes on exit (synchronous — catches all exit paths)
258
+ process.on("exit", () => {
259
+ processManager.shutdownAll();
260
+ mcpManager.dispose().catch(() => { });
261
+ });
262
+ // Seed messages with system prompt
263
+ const messages = [{ role: "system", content: systemPrompt }];
264
+ // Session management — create or reuse session file
265
+ const sessionManager = new SessionManager(paths.sessionsDir);
266
+ let sessionPath;
267
+ let initialHistory;
268
+ // Determine which session to resume (explicit path or most recent)
269
+ const resumePath = opts.resumeSessionPath ??
270
+ (opts.continueRecent ? await sessionManager.getMostRecent(cwd) : null);
271
+ if (resumePath) {
272
+ try {
273
+ const loaded = await sessionManager.load(resumePath);
274
+ const loadedMessages = sessionManager.getMessages(loaded.entries);
275
+ if (loadedMessages.length > 0) {
276
+ messages.push(...loadedMessages);
277
+ sessionPath = resumePath;
278
+ log("INFO", "session", `Restored session`, {
279
+ path: resumePath,
280
+ messageCount: String(loadedMessages.length),
281
+ });
282
+ // Auto-compact on load if the restored session exceeds the context window.
283
+ // Without this, huge sessions (1M+ tokens) get loaded into memory and OOM.
284
+ const contextWindow = getContextWindow(model);
285
+ if (shouldCompact(messages, contextWindow, 0.8)) {
286
+ log("INFO", "session", `Restored session exceeds context — auto-compacting`);
287
+ const compacted = await compact(messages, {
288
+ provider,
289
+ model,
290
+ apiKey: creds.accessToken,
291
+ contextWindow,
292
+ });
293
+ // Replace messages array contents with compacted messages
294
+ messages.length = 0;
295
+ messages.push(...compacted.messages);
296
+ log("INFO", "session", `Auto-compaction complete`, {
297
+ before: String(compacted.result.originalCount),
298
+ after: String(compacted.result.newCount),
299
+ });
300
+ }
301
+ initialHistory = messagesToHistoryItems(loadedMessages);
302
+ initialHistory.push({
303
+ kind: "info",
304
+ text: `↻ Restored session (${loadedMessages.length} messages)`,
305
+ id: `restore-info`,
306
+ });
307
+ }
308
+ }
309
+ catch {
310
+ // Session file corrupt or missing — start fresh
311
+ }
312
+ }
313
+ // Create a new session file if we didn't reuse one
314
+ if (!sessionPath) {
315
+ const session = await sessionManager.create(cwd, provider, model);
316
+ sessionPath = session.path;
317
+ log("INFO", "session", `New session created`, { path: sessionPath });
318
+ }
319
+ await renderApp({
320
+ provider,
321
+ model,
322
+ tools,
323
+ webSearch: true,
324
+ messages,
325
+ version: CLI_VERSION,
326
+ maxTokens: 16384,
327
+ thinking: opts.thinkingLevel,
328
+ apiKey: creds.accessToken,
329
+ accountId: creds.accountId,
330
+ cwd,
331
+ theme: opts.theme,
332
+ loggedInProviders,
333
+ credentialsByProvider,
334
+ initialHistory,
335
+ sessionsDir: paths.sessionsDir,
336
+ sessionPath,
337
+ processManager,
338
+ settingsFile: paths.settingsFile,
339
+ mcpManager,
340
+ authStorage,
341
+ });
342
+ closeLogger();
343
+ }
344
+ // ── Login ──────────────────────────────────────────────────
345
+ async function runLogin() {
346
+ process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
347
+ const paths = await ensureAppDirs();
348
+ initLogger(paths.logFile, { version: CLI_VERSION });
349
+ log("INFO", "auth", "Login flow started");
350
+ const authStorage = new AuthStorage();
351
+ await authStorage.load();
352
+ // Phase 1: Ink-based provider selector
353
+ const provider = await renderLoginSelector(CLI_VERSION);
354
+ if (!provider) {
355
+ console.log(chalk.hex("#6b7280")("Login cancelled."));
356
+ return;
357
+ }
358
+ console.log(chalk.hex("#60a5fa").bold("\nLogging in to ") +
359
+ chalk.hex("#a78bfa")(displayName(provider)) +
360
+ chalk.hex("#60a5fa").bold("...\n"));
361
+ // Phase 2: OAuth flow (readline needed for Anthropic code paste)
362
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
363
+ try {
364
+ const callbacks = {
365
+ onOpenUrl: (url) => {
366
+ console.log(chalk.hex("#60a5fa").bold("Opening browser..."));
367
+ openBrowser(url);
368
+ console.log(chalk.hex("#6b7280")("\nIf the browser didn't open, visit:\n") +
369
+ chalk.hex("#6b7280")(url) +
370
+ "\n");
371
+ },
372
+ onPromptCode: async (message) => {
373
+ return rl.question(message + " ");
374
+ },
375
+ onStatus: (message) => {
376
+ console.log(chalk.hex("#6b7280")(message));
377
+ },
378
+ };
379
+ let creds;
380
+ if (provider === "glm" || provider === "moonshot") {
381
+ const keyLabel = provider === "glm" ? "Z.AI" : "Moonshot";
382
+ const apiKey = await rl.question(chalk.hex("#60a5fa")(`Paste your ${keyLabel} API key: `));
383
+ if (!apiKey.trim()) {
384
+ console.log(chalk.hex("#ef4444")("No API key provided. Login cancelled."));
385
+ return;
386
+ }
387
+ creds = {
388
+ accessToken: apiKey.trim(),
389
+ refreshToken: "",
390
+ expiresAt: Date.now() + 365 * 24 * 60 * 60 * 1000 * 100, // ~100 years
391
+ };
392
+ }
393
+ else {
394
+ creds =
395
+ provider === "anthropic" ? await loginAnthropic(callbacks) : await loginOpenAI(callbacks);
396
+ }
397
+ await authStorage.setCredentials(provider, creds);
398
+ log("INFO", "auth", `Login succeeded for ${displayName(provider)}`);
399
+ console.log(chalk.hex("#4ade80")(`\n✓ Logged in to ${displayName(provider)} successfully!`));
400
+ }
401
+ finally {
402
+ rl.close();
403
+ closeLogger();
404
+ }
405
+ }
406
+ // ── Logout ─────────────────────────────────────────────────
407
+ async function runLogout() {
408
+ const paths = await ensureAppDirs();
409
+ initLogger(paths.logFile, { version: CLI_VERSION });
410
+ log("INFO", "auth", "Logout requested");
411
+ const authStorage = new AuthStorage();
412
+ await authStorage.load();
413
+ await authStorage.clearAll();
414
+ log("INFO", "auth", "Logout succeeded");
415
+ closeLogger();
416
+ console.log(chalk.green("Logged out successfully."));
417
+ }
418
+ // ── Sessions ──────────────────────────────────────────────
419
+ async function runSessions() {
420
+ process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
421
+ const paths = await ensureAppDirs();
422
+ initLogger(paths.logFile, { version: CLI_VERSION });
423
+ log("INFO", "session", "Sessions selector started");
424
+ const cwd = process.cwd();
425
+ const selectedPath = await renderSessionSelector(paths.sessionsDir, cwd, CLI_VERSION);
426
+ if (!selectedPath) {
427
+ console.log(chalk.hex("#6b7280")("No session selected."));
428
+ closeLogger();
429
+ process.exit(0);
430
+ }
431
+ // Load saved settings for provider/model/theme
432
+ let savedProvider;
433
+ let savedModel;
434
+ let savedThinkingEnabled = false;
435
+ let savedTheme = "auto";
436
+ try {
437
+ const raw = JSON.parse(fs.readFileSync(paths.settingsFile, "utf-8"));
438
+ if (raw.defaultProvider)
439
+ savedProvider = raw.defaultProvider;
440
+ if (raw.defaultModel)
441
+ savedModel = raw.defaultModel;
442
+ if (raw.thinkingEnabled === true)
443
+ savedThinkingEnabled = true;
444
+ if (raw.theme === "dark" || raw.theme === "light" || raw.theme === "auto")
445
+ savedTheme = raw.theme;
446
+ }
447
+ catch {
448
+ // No settings file — use defaults
449
+ }
450
+ const provider = savedProvider ?? "anthropic";
451
+ function getDefault(p) {
452
+ if (p === "openai")
453
+ return "gpt-5.3-codex";
454
+ if (p === "glm")
455
+ return "glm-5";
456
+ if (p === "moonshot")
457
+ return "kimi-k2.5";
458
+ return "claude-opus-4-6";
459
+ }
460
+ const model = savedModel ?? getDefault(provider);
461
+ const thinkingLevel = savedThinkingEnabled ? "medium" : undefined;
462
+ closeLogger();
463
+ await runInkTUI({
464
+ provider,
465
+ model,
466
+ cwd,
467
+ thinkingLevel,
468
+ resumeSessionPath: selectedPath,
469
+ theme: savedTheme,
470
+ });
471
+ }
472
+ async function loadTelegramConfig() {
473
+ try {
474
+ const raw = await fs.promises.readFile(getAppPaths().telegramFile, "utf-8");
475
+ const data = JSON.parse(raw);
476
+ if (data.botToken && data.userId)
477
+ return data;
478
+ return null;
479
+ }
480
+ catch {
481
+ return null;
482
+ }
483
+ }
484
+ async function saveTelegramConfig(config) {
485
+ const paths = await ensureAppDirs();
486
+ await fs.promises.writeFile(paths.telegramFile, JSON.stringify(config, null, 2), {
487
+ encoding: "utf-8",
488
+ mode: 0o600,
489
+ });
490
+ }
491
+ async function runTelegramSetup() {
492
+ process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
493
+ const paths = await ensureAppDirs();
494
+ initLogger(paths.logFile, { version: CLI_VERSION });
495
+ log("INFO", "telegram", "Telegram setup started");
496
+ const existing = await loadTelegramConfig();
497
+ // Banner (matches Banner.tsx)
498
+ const LOGO = [
499
+ " ╭●╮ ",
500
+ " [◉‿◉]",
501
+ " ╰┬╯ ",
502
+ ];
503
+ const GRADIENT = [
504
+ "#60a5fa",
505
+ "#6da1f9",
506
+ "#7a9df7",
507
+ "#8799f5",
508
+ "#9495f3",
509
+ "#a18ff1",
510
+ "#a78bfa",
511
+ "#a18ff1",
512
+ "#9495f3",
513
+ "#8799f5",
514
+ "#7a9df7",
515
+ "#6da1f9",
516
+ ];
517
+ function gradientText(text) {
518
+ let colorIdx = 0;
519
+ return text
520
+ .split("")
521
+ .map((ch) => {
522
+ if (ch === " ")
523
+ return ch;
524
+ const color = GRADIENT[colorIdx++ % GRADIENT.length];
525
+ return chalk.hex(color)(ch);
526
+ })
527
+ .join("");
528
+ }
529
+ const GAP = " ";
530
+ console.log();
531
+ console.log(` ${gradientText(LOGO[0])}${GAP}` +
532
+ chalk.hex("#60a5fa").bold("MR Agentix Coder") +
533
+ chalk.hex("#6b7280")(` v${CLI_VERSION}`) +
534
+ chalk.hex("#6b7280")(" · By ") +
535
+ chalk.white.bold("Michael Rathgeb"));
536
+ console.log(` ${gradientText(LOGO[1])}${GAP}` + chalk.hex("#a78bfa")("Telegram Setup"));
537
+ console.log(` ${gradientText(LOGO[2])}${GAP}` + chalk.hex("#6b7280")("Remote Control"));
538
+ console.log();
539
+ if (existing) {
540
+ console.log(chalk.hex("#6b7280")(" Current config:\n") +
541
+ chalk.hex("#6b7280")(` Bot token: ${existing.botToken.slice(0, 10)}...${existing.botToken.slice(-4)}\n`) +
542
+ chalk.hex("#6b7280")(` User ID: ${existing.userId}\n`));
543
+ }
544
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
545
+ try {
546
+ // Step 1: Bot token
547
+ console.log(chalk.hex("#a78bfa")(" Step 1: Bot Token\n") +
548
+ chalk.hex("#6b7280")(" 1. Open BotFather: ") +
549
+ chalk.hex("#60a5fa").underline("https://t.me/BotFather") +
550
+ "\n" +
551
+ chalk.hex("#6b7280")(" 2. Send /newbot and follow the prompts\n") +
552
+ chalk.hex("#6b7280")(" 3. Copy the bot token\n"));
553
+ const tokenPrompt = existing
554
+ ? chalk.hex("#60a5fa")(" Paste bot token (enter to keep current): ")
555
+ : chalk.hex("#60a5fa")(" Paste bot token: ");
556
+ const tokenInput = await rl.question(tokenPrompt);
557
+ const botToken = tokenInput.trim() || existing?.botToken;
558
+ if (!botToken) {
559
+ console.log(chalk.hex("#ef4444")("\n No bot token provided. Setup cancelled."));
560
+ return;
561
+ }
562
+ // Validate token format (roughly: digits:alphanumeric)
563
+ if (!/^\d+:[A-Za-z0-9_-]+$/.test(botToken)) {
564
+ console.log(chalk.hex("#ef4444")("\n Invalid token format. Expected: 123456789:ABCdef..."));
565
+ return;
566
+ }
567
+ // Step 2: User ID
568
+ console.log(chalk.hex("#a78bfa")("\n Step 2: User ID\n") +
569
+ chalk.hex("#6b7280")(" 1. Open userinfobot: ") +
570
+ chalk.hex("#60a5fa").underline("https://t.me/userinfobot") +
571
+ "\n" +
572
+ chalk.hex("#6b7280")(" 2. Send any message — it replies with your numeric ID\n") +
573
+ chalk.hex("#6b7280")(" Only this user ID can control the bot.\n"));
574
+ const userPrompt = existing
575
+ ? chalk.hex("#60a5fa")(` Your Telegram user ID (enter to keep ${existing.userId}): `)
576
+ : chalk.hex("#60a5fa")(" Your Telegram user ID: ");
577
+ const userInput = await rl.question(userPrompt);
578
+ const userId = userInput.trim() ? parseInt(userInput.trim(), 10) : existing?.userId;
579
+ if (!userId || isNaN(userId)) {
580
+ console.log(chalk.hex("#ef4444")("\n Invalid user ID. Must be a number."));
581
+ return;
582
+ }
583
+ // Step 3: Verify bot token by calling getMe
584
+ console.log(chalk.hex("#6b7280")("\n Verifying bot token..."));
585
+ const verifyRes = await fetch(`https://api.telegram.org/bot${botToken}/getMe`, {
586
+ method: "POST",
587
+ });
588
+ const verifyData = (await verifyRes.json());
589
+ if (!verifyData.ok || !verifyData.result) {
590
+ console.log(chalk.hex("#ef4444")("\n Invalid bot token — Telegram rejected it. Check and try again."));
591
+ return;
592
+ }
593
+ const botName = verifyData.result.first_name;
594
+ const botUsername = verifyData.result.username;
595
+ // Save config
596
+ await saveTelegramConfig({ botToken, userId });
597
+ log("INFO", "telegram", `Telegram setup complete: @${botUsername} (user ${userId})`);
598
+ console.log(chalk.hex("#4ade80")(`\n ✓ Connected to @${botUsername} (${botName})\n`) +
599
+ chalk.hex("#4ade80")(` ✓ Authorized user ID: ${userId}\n`) +
600
+ chalk.hex("#4ade80")(` ✓ Config saved to ${paths.telegramFile}\n\n`) +
601
+ chalk.hex("#a78bfa")(" For group chats:\n") +
602
+ chalk.hex("#6b7280")(" 1. Message @BotFather → /setprivacy → select your bot → Disable\n") +
603
+ chalk.hex("#6b7280")(" 2. Add the bot to your group\n") +
604
+ chalk.hex("#6b7280")(" 3. Send /link in the group to connect it to a project\n\n") +
605
+ chalk.hex("#60a5fa")(" To start:\n") +
606
+ chalk.hex("#6b7280")(" cd your-project && mragentix serve\n"));
607
+ }
608
+ finally {
609
+ rl.close();
610
+ closeLogger();
611
+ }
612
+ }
613
+ // ── Serve (Telegram) ─────────────────────────────────────
614
+ async function runServe() {
615
+ const { values: serveValues } = parseArgs({
616
+ options: {
617
+ "bot-token": { type: "string" },
618
+ "user-id": { type: "string" },
619
+ provider: { type: "string" },
620
+ model: { type: "string" },
621
+ },
622
+ strict: true,
623
+ });
624
+ // Priority: CLI flags > env vars > saved config
625
+ const saved = await loadTelegramConfig();
626
+ const botToken = serveValues["bot-token"] ?? process.env.MRAGENTIX_TELEGRAM_BOT_TOKEN ?? saved?.botToken;
627
+ const userIdStr = serveValues["user-id"] ?? process.env.MRAGENTIX_TELEGRAM_USER_ID;
628
+ const userId = userIdStr ? parseInt(userIdStr, 10) : saved?.userId;
629
+ if (!botToken || !userId || isNaN(userId)) {
630
+ console.error(chalk.hex("#ef4444")("Telegram not configured.\n\n") +
631
+ "Run " +
632
+ chalk.hex("#60a5fa").bold("mragentix telegram") +
633
+ " to set up your bot token and user ID.\n\n" +
634
+ chalk.hex("#6b7280")("Or provide manually:\n") +
635
+ chalk.hex("#6b7280")(" mragentix serve --bot-token TOKEN --user-id ID"));
636
+ process.exit(1);
637
+ }
638
+ // Load saved settings
639
+ let savedProvider;
640
+ let savedModel;
641
+ let savedThinkingEnabled = false;
642
+ try {
643
+ const raw = JSON.parse(fs.readFileSync(getAppPaths().settingsFile, "utf-8"));
644
+ if (raw.defaultProvider)
645
+ savedProvider = raw.defaultProvider;
646
+ if (raw.defaultModel)
647
+ savedModel = raw.defaultModel;
648
+ if (raw.thinkingEnabled === true)
649
+ savedThinkingEnabled = true;
650
+ }
651
+ catch {
652
+ // No settings file
653
+ }
654
+ const provider = serveValues.provider ?? savedProvider ?? "anthropic";
655
+ function getDefault(p) {
656
+ if (p === "openai")
657
+ return "gpt-5.3-codex";
658
+ if (p === "glm")
659
+ return "glm-5";
660
+ if (p === "moonshot")
661
+ return "kimi-k2.5";
662
+ return "claude-opus-4-6";
663
+ }
664
+ const model = serveValues.model ?? savedModel ?? getDefault(provider);
665
+ const thinkingLevel = savedThinkingEnabled ? "medium" : undefined;
666
+ const paths = await ensureAppDirs();
667
+ initLogger(paths.logFile, {
668
+ version: CLI_VERSION,
669
+ provider,
670
+ model,
671
+ });
672
+ setEstimatorModel(model);
673
+ await runServeMode({
674
+ provider,
675
+ model,
676
+ cwd: process.cwd(),
677
+ version: CLI_VERSION,
678
+ thinkingLevel,
679
+ telegram: { botToken, userId },
680
+ });
681
+ }
682
+ // ── Helpers ────────────────────────────────────────────────
683
+ function displayName(provider) {
684
+ if (provider === "anthropic")
685
+ return "Anthropic";
686
+ if (provider === "glm")
687
+ return "Z.AI (GLM)";
688
+ if (provider === "moonshot")
689
+ return "Moonshot";
690
+ return "OpenAI";
691
+ }
692
+ function extractText(content) {
693
+ if (typeof content === "string")
694
+ return content;
695
+ return content
696
+ .filter((b) => b.type === "text" && b.text)
697
+ .map((b) => b.text)
698
+ .join("\n");
699
+ }
700
+ function messagesToHistoryItems(msgs) {
701
+ const items = [];
702
+ let id = 0;
703
+ // Index tool results by toolCallId for pairing with tool calls
704
+ const toolResults = new Map();
705
+ for (const msg of msgs) {
706
+ if (msg.role === "tool") {
707
+ for (const tr of msg.content) {
708
+ toolResults.set(tr.toolCallId, {
709
+ content: tr.content,
710
+ isError: tr.isError ?? false,
711
+ });
712
+ }
713
+ }
714
+ }
715
+ const roleCounts = {};
716
+ const blockTypeCounts = {};
717
+ for (const msg of msgs) {
718
+ roleCounts[msg.role] = (roleCounts[msg.role] ?? 0) + 1;
719
+ if (msg.role === "user") {
720
+ const text = extractText(msg.content);
721
+ if (text)
722
+ items.push({ kind: "user", text, id: `restore-${id++}` });
723
+ }
724
+ else if (msg.role === "assistant") {
725
+ const content = msg.content;
726
+ if (typeof content === "string") {
727
+ if (content)
728
+ items.push({ kind: "assistant", text: content, id: `restore-${id++}` });
729
+ continue;
730
+ }
731
+ // Count block types for debugging
732
+ for (const block of content) {
733
+ blockTypeCounts[block.type] = (blockTypeCounts[block.type] ?? 0) + 1;
734
+ }
735
+ // Process content blocks in order — text and tool calls
736
+ const text = extractText(content);
737
+ if (text)
738
+ items.push({ kind: "assistant", text, id: `restore-${id++}` });
739
+ for (const block of content) {
740
+ if (block.type === "tool_call") {
741
+ const result = toolResults.get(block.id);
742
+ items.push({
743
+ kind: "tool_done",
744
+ name: block.name,
745
+ args: block.args,
746
+ result: result?.content ?? "",
747
+ isError: result?.isError ?? false,
748
+ durationMs: 0,
749
+ id: `restore-${id++}`,
750
+ });
751
+ }
752
+ }
753
+ }
754
+ }
755
+ log("INFO", "session", "messagesToHistoryItems", {
756
+ totalMessages: String(msgs.length),
757
+ roleCounts: JSON.stringify(roleCounts),
758
+ blockTypeCounts: JSON.stringify(blockTypeCounts),
759
+ toolResultsIndexed: String(toolResults.size),
760
+ historyItemsProduced: String(items.length),
761
+ itemKinds: JSON.stringify(items.map((i) => i.kind)),
762
+ });
763
+ return items;
764
+ }
765
+ function openBrowser(url) {
766
+ const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
767
+ execFile(cmd, [url], () => {
768
+ // Ignore errors — user can copy URL manually
769
+ });
770
+ }
771
+ main();
772
+ //# sourceMappingURL=cli.js.map