aurix-ai 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 (659) hide show
  1. package/README.md +329 -0
  2. package/bin/aurix +172 -0
  3. package/bin/aurix.cmd +23 -0
  4. package/dist/agent/AgentLoop.d.ts +52 -0
  5. package/dist/agent/AgentLoop.d.ts.map +1 -0
  6. package/dist/agent/AgentLoop.js +543 -0
  7. package/dist/agent/AgentLoop.js.map +1 -0
  8. package/dist/agent/AgentsMD.d.ts +8 -0
  9. package/dist/agent/AgentsMD.d.ts.map +1 -0
  10. package/dist/agent/AgentsMD.js +53 -0
  11. package/dist/agent/AgentsMD.js.map +1 -0
  12. package/dist/agent/CodeReview.d.ts +13 -0
  13. package/dist/agent/CodeReview.d.ts.map +1 -0
  14. package/dist/agent/CodeReview.js +134 -0
  15. package/dist/agent/CodeReview.js.map +1 -0
  16. package/dist/agent/Config.d.ts +63 -0
  17. package/dist/agent/Config.d.ts.map +1 -0
  18. package/dist/agent/Config.js +55 -0
  19. package/dist/agent/Config.js.map +1 -0
  20. package/dist/agent/Context.d.ts +4 -0
  21. package/dist/agent/Context.d.ts.map +1 -0
  22. package/dist/agent/Context.js +390 -0
  23. package/dist/agent/Context.js.map +1 -0
  24. package/dist/agent/ContextManager.d.ts +23 -0
  25. package/dist/agent/ContextManager.d.ts.map +1 -0
  26. package/dist/agent/ContextManager.js +163 -0
  27. package/dist/agent/ContextManager.js.map +1 -0
  28. package/dist/agent/MemoryEngine.d.ts +24 -0
  29. package/dist/agent/MemoryEngine.d.ts.map +1 -0
  30. package/dist/agent/MemoryEngine.js +347 -0
  31. package/dist/agent/MemoryEngine.js.map +1 -0
  32. package/dist/agent/MultiAgent.d.ts +22 -0
  33. package/dist/agent/MultiAgent.d.ts.map +1 -0
  34. package/dist/agent/MultiAgent.js +466 -0
  35. package/dist/agent/MultiAgent.js.map +1 -0
  36. package/dist/agent/ResearchPipeline.d.ts +22 -0
  37. package/dist/agent/ResearchPipeline.d.ts.map +1 -0
  38. package/dist/agent/ResearchPipeline.js +195 -0
  39. package/dist/agent/ResearchPipeline.js.map +1 -0
  40. package/dist/agent/Setup.d.ts +3 -0
  41. package/dist/agent/Setup.d.ts.map +1 -0
  42. package/dist/agent/Setup.js +503 -0
  43. package/dist/agent/Setup.js.map +1 -0
  44. package/dist/agent/TokenCounter.d.ts +6 -0
  45. package/dist/agent/TokenCounter.d.ts.map +1 -0
  46. package/dist/agent/TokenCounter.js +73 -0
  47. package/dist/agent/TokenCounter.js.map +1 -0
  48. package/dist/agent/research/CitationGuardian.d.ts +10 -0
  49. package/dist/agent/research/CitationGuardian.d.ts.map +1 -0
  50. package/dist/agent/research/CitationGuardian.js +43 -0
  51. package/dist/agent/research/CitationGuardian.js.map +1 -0
  52. package/dist/agent/research/ClaimExtractor.d.ts +7 -0
  53. package/dist/agent/research/ClaimExtractor.d.ts.map +1 -0
  54. package/dist/agent/research/ClaimExtractor.js +49 -0
  55. package/dist/agent/research/ClaimExtractor.js.map +1 -0
  56. package/dist/agent/research/DebateSystem.d.ts +6 -0
  57. package/dist/agent/research/DebateSystem.d.ts.map +1 -0
  58. package/dist/agent/research/DebateSystem.js +33 -0
  59. package/dist/agent/research/DebateSystem.js.map +1 -0
  60. package/dist/agent/research/FinalReviewer.d.ts +10 -0
  61. package/dist/agent/research/FinalReviewer.d.ts.map +1 -0
  62. package/dist/agent/research/FinalReviewer.js +35 -0
  63. package/dist/agent/research/FinalReviewer.js.map +1 -0
  64. package/dist/agent/research/JudgeAgent.d.ts +7 -0
  65. package/dist/agent/research/JudgeAgent.d.ts.map +1 -0
  66. package/dist/agent/research/JudgeAgent.js +40 -0
  67. package/dist/agent/research/JudgeAgent.js.map +1 -0
  68. package/dist/agent/research/LogicCritic.d.ts +10 -0
  69. package/dist/agent/research/LogicCritic.d.ts.map +1 -0
  70. package/dist/agent/research/LogicCritic.js +39 -0
  71. package/dist/agent/research/LogicCritic.js.map +1 -0
  72. package/dist/agent/research/PlanningAgent.d.ts +10 -0
  73. package/dist/agent/research/PlanningAgent.d.ts.map +1 -0
  74. package/dist/agent/research/PlanningAgent.js +39 -0
  75. package/dist/agent/research/PlanningAgent.js.map +1 -0
  76. package/dist/agent/research/RequestAnalyzer.d.ts +14 -0
  77. package/dist/agent/research/RequestAnalyzer.d.ts.map +1 -0
  78. package/dist/agent/research/RequestAnalyzer.js +38 -0
  79. package/dist/agent/research/RequestAnalyzer.js.map +1 -0
  80. package/dist/agent/research/ResearchAgent.d.ts +12 -0
  81. package/dist/agent/research/ResearchAgent.d.ts.map +1 -0
  82. package/dist/agent/research/ResearchAgent.js +64 -0
  83. package/dist/agent/research/ResearchAgent.js.map +1 -0
  84. package/dist/agent/research/SkepticAgent.d.ts +9 -0
  85. package/dist/agent/research/SkepticAgent.d.ts.map +1 -0
  86. package/dist/agent/research/SkepticAgent.js +38 -0
  87. package/dist/agent/research/SkepticAgent.js.map +1 -0
  88. package/dist/agent/research/SupporterAgent.d.ts +9 -0
  89. package/dist/agent/research/SupporterAgent.d.ts.map +1 -0
  90. package/dist/agent/research/SupporterAgent.js +31 -0
  91. package/dist/agent/research/SupporterAgent.js.map +1 -0
  92. package/dist/agent/research/VideoAgent.d.ts +10 -0
  93. package/dist/agent/research/VideoAgent.d.ts.map +1 -0
  94. package/dist/agent/research/VideoAgent.js +49 -0
  95. package/dist/agent/research/VideoAgent.js.map +1 -0
  96. package/dist/agent/research/WriterAgent.d.ts +6 -0
  97. package/dist/agent/research/WriterAgent.d.ts.map +1 -0
  98. package/dist/agent/research/WriterAgent.js +30 -0
  99. package/dist/agent/research/WriterAgent.js.map +1 -0
  100. package/dist/agent/research/index.d.ts +15 -0
  101. package/dist/agent/research/index.d.ts.map +1 -0
  102. package/dist/agent/research/index.js +14 -0
  103. package/dist/agent/research/index.js.map +1 -0
  104. package/dist/agent/research/types.d.ts +49 -0
  105. package/dist/agent/research/types.d.ts.map +1 -0
  106. package/dist/agent/research/types.js +17 -0
  107. package/dist/agent/research/types.js.map +1 -0
  108. package/dist/cli/AltScreen.d.ts +3 -0
  109. package/dist/cli/AltScreen.d.ts.map +1 -0
  110. package/dist/cli/AltScreen.js +72 -0
  111. package/dist/cli/AltScreen.js.map +1 -0
  112. package/dist/cli/App.d.ts +11 -0
  113. package/dist/cli/App.d.ts.map +1 -0
  114. package/dist/cli/App.js +1319 -0
  115. package/dist/cli/App.js.map +1 -0
  116. package/dist/cli/Banner.d.ts +13 -0
  117. package/dist/cli/Banner.d.ts.map +1 -0
  118. package/dist/cli/Banner.js +12 -0
  119. package/dist/cli/Banner.js.map +1 -0
  120. package/dist/cli/BlackFill.d.ts +3 -0
  121. package/dist/cli/BlackFill.d.ts.map +1 -0
  122. package/dist/cli/BlackFill.js +9 -0
  123. package/dist/cli/BlackFill.js.map +1 -0
  124. package/dist/cli/ChatArea.d.ts +20 -0
  125. package/dist/cli/ChatArea.d.ts.map +1 -0
  126. package/dist/cli/ChatArea.js +300 -0
  127. package/dist/cli/ChatArea.js.map +1 -0
  128. package/dist/cli/ConnectModal.d.ts +9 -0
  129. package/dist/cli/ConnectModal.d.ts.map +1 -0
  130. package/dist/cli/ConnectModal.js +101 -0
  131. package/dist/cli/ConnectModal.js.map +1 -0
  132. package/dist/cli/FileDiff.d.ts +16 -0
  133. package/dist/cli/FileDiff.d.ts.map +1 -0
  134. package/dist/cli/FileDiff.js +45 -0
  135. package/dist/cli/FileDiff.js.map +1 -0
  136. package/dist/cli/InputBox.d.ts +18 -0
  137. package/dist/cli/InputBox.d.ts.map +1 -0
  138. package/dist/cli/InputBox.js +573 -0
  139. package/dist/cli/InputBox.js.map +1 -0
  140. package/dist/cli/LoginModal.d.ts +10 -0
  141. package/dist/cli/LoginModal.d.ts.map +1 -0
  142. package/dist/cli/LoginModal.js +129 -0
  143. package/dist/cli/LoginModal.js.map +1 -0
  144. package/dist/cli/Menu.d.ts +26 -0
  145. package/dist/cli/Menu.d.ts.map +1 -0
  146. package/dist/cli/Menu.js +115 -0
  147. package/dist/cli/Menu.js.map +1 -0
  148. package/dist/cli/MouseFilter.d.ts +2 -0
  149. package/dist/cli/MouseFilter.d.ts.map +1 -0
  150. package/dist/cli/MouseFilter.js +47 -0
  151. package/dist/cli/MouseFilter.js.map +1 -0
  152. package/dist/cli/Panel.d.ts.map +1 -0
  153. package/dist/cli/Panel.js.map +1 -0
  154. package/dist/cli/PermissionPrompt.d.ts +9 -0
  155. package/dist/cli/PermissionPrompt.d.ts.map +1 -0
  156. package/dist/cli/PermissionPrompt.js +56 -0
  157. package/dist/cli/PermissionPrompt.js.map +1 -0
  158. package/dist/cli/SessionPanel.d.ts +15 -0
  159. package/dist/cli/SessionPanel.d.ts.map +1 -0
  160. package/dist/cli/SessionPanel.js +28 -0
  161. package/dist/cli/SessionPanel.js.map +1 -0
  162. package/dist/cli/SetupUI.d.ts +34 -0
  163. package/dist/cli/SetupUI.d.ts.map +1 -0
  164. package/dist/cli/SetupUI.js +311 -0
  165. package/dist/cli/SetupUI.js.map +1 -0
  166. package/dist/cli/StatusBar.d.ts +12 -0
  167. package/dist/cli/StatusBar.d.ts.map +1 -0
  168. package/dist/cli/StatusBar.js +7 -0
  169. package/dist/cli/StatusBar.js.map +1 -0
  170. package/dist/cli/WhatsAppModal.d.ts +10 -0
  171. package/dist/cli/WhatsAppModal.d.ts.map +1 -0
  172. package/dist/cli/WhatsAppModal.js +78 -0
  173. package/dist/cli/WhatsAppModal.js.map +1 -0
  174. package/dist/cli/animation/useThinking.d.ts +2 -0
  175. package/dist/cli/animation/useThinking.d.ts.map +1 -0
  176. package/dist/cli/animation/useThinking.js +50 -0
  177. package/dist/cli/animation/useThinking.js.map +1 -0
  178. package/dist/cli/commands.d.ts +26 -0
  179. package/dist/cli/commands.d.ts.map +1 -0
  180. package/dist/cli/commands.js +816 -0
  181. package/dist/cli/commands.js.map +1 -0
  182. package/dist/cli/theme.d.ts +101 -0
  183. package/dist/cli/theme.d.ts.map +1 -0
  184. package/dist/cli/theme.js +222 -0
  185. package/dist/cli/theme.js.map +1 -0
  186. package/dist/commands/SlashCommands.d.ts +15 -0
  187. package/dist/commands/SlashCommands.d.ts.map +1 -0
  188. package/dist/commands/SlashCommands.js +238 -0
  189. package/dist/commands/SlashCommands.js.map +1 -0
  190. package/dist/gateway/Discord.d.ts +13 -0
  191. package/dist/gateway/Discord.d.ts.map +1 -0
  192. package/dist/gateway/Discord.js +144 -0
  193. package/dist/gateway/Discord.js.map +1 -0
  194. package/dist/gateway/Gateway.d.ts +71 -0
  195. package/dist/gateway/Gateway.d.ts.map +1 -0
  196. package/dist/gateway/Gateway.js +665 -0
  197. package/dist/gateway/Gateway.js.map +1 -0
  198. package/dist/gateway/Telegram.d.ts +18 -0
  199. package/dist/gateway/Telegram.d.ts.map +1 -0
  200. package/dist/gateway/Telegram.js +224 -0
  201. package/dist/gateway/Telegram.js.map +1 -0
  202. package/dist/gateway/WASessionStore.d.ts +13 -0
  203. package/dist/gateway/WASessionStore.d.ts.map +1 -0
  204. package/dist/gateway/WASessionStore.js +94 -0
  205. package/dist/gateway/WASessionStore.js.map +1 -0
  206. package/dist/gateway/WhatsApp.d.ts +19 -0
  207. package/dist/gateway/WhatsApp.d.ts.map +1 -0
  208. package/dist/gateway/WhatsApp.js +159 -0
  209. package/dist/gateway/WhatsApp.js.map +1 -0
  210. package/dist/gateway-entry.d.ts +3 -0
  211. package/dist/gateway-entry.d.ts.map +1 -0
  212. package/dist/gateway-entry.js +50 -0
  213. package/dist/gateway-entry.js.map +1 -0
  214. package/dist/index.d.ts +5 -0
  215. package/dist/index.d.ts.map +1 -0
  216. package/dist/index.js +213 -0
  217. package/dist/index.js.map +1 -0
  218. package/dist/providers/index.d.ts +70 -0
  219. package/dist/providers/index.d.ts.map +1 -0
  220. package/dist/providers/index.js +390 -0
  221. package/dist/providers/index.js.map +1 -0
  222. package/dist/skills/SkillRegistry.d.ts +33 -0
  223. package/dist/skills/SkillRegistry.d.ts.map +1 -0
  224. package/dist/skills/SkillRegistry.js +102 -0
  225. package/dist/skills/SkillRegistry.js.map +1 -0
  226. package/dist/token-counter.linux-x64-gnu.node +0 -0
  227. package/dist/tools/Backend.d.ts +3 -0
  228. package/dist/tools/Backend.d.ts.map +1 -0
  229. package/dist/tools/Backend.js +154 -0
  230. package/dist/tools/Backend.js.map +1 -0
  231. package/dist/tools/Blockchain.d.ts +3 -0
  232. package/dist/tools/Blockchain.d.ts.map +1 -0
  233. package/dist/tools/Blockchain.js +82 -0
  234. package/dist/tools/Blockchain.js.map +1 -0
  235. package/dist/tools/Browser.d.ts +5 -0
  236. package/dist/tools/Browser.d.ts.map +1 -0
  237. package/dist/tools/Browser.js +2253 -0
  238. package/dist/tools/Browser.js.map +1 -0
  239. package/dist/tools/Cloud.d.ts +3 -0
  240. package/dist/tools/Cloud.d.ts.map +1 -0
  241. package/dist/tools/Cloud.js +115 -0
  242. package/dist/tools/Cloud.js.map +1 -0
  243. package/dist/tools/CodeExec.d.ts +3 -0
  244. package/dist/tools/CodeExec.d.ts.map +1 -0
  245. package/dist/tools/CodeExec.js +76 -0
  246. package/dist/tools/CodeExec.js.map +1 -0
  247. package/dist/tools/Cybersec.d.ts +3 -0
  248. package/dist/tools/Cybersec.d.ts.map +1 -0
  249. package/dist/tools/Cybersec.js +186 -0
  250. package/dist/tools/Cybersec.js.map +1 -0
  251. package/dist/tools/Deploy.d.ts +3 -0
  252. package/dist/tools/Deploy.d.ts.map +1 -0
  253. package/dist/tools/Deploy.js +87 -0
  254. package/dist/tools/Deploy.js.map +1 -0
  255. package/dist/tools/Diagram.d.ts +3 -0
  256. package/dist/tools/Diagram.d.ts.map +1 -0
  257. package/dist/tools/Diagram.js +38 -0
  258. package/dist/tools/Diagram.js.map +1 -0
  259. package/dist/tools/Docker.d.ts +3 -0
  260. package/dist/tools/Docker.d.ts.map +1 -0
  261. package/dist/tools/Docker.js +45 -0
  262. package/dist/tools/Docker.js.map +1 -0
  263. package/dist/tools/Email.d.ts +3 -0
  264. package/dist/tools/Email.d.ts.map +1 -0
  265. package/dist/tools/Email.js +172 -0
  266. package/dist/tools/Email.js.map +1 -0
  267. package/dist/tools/Excel.d.ts +3 -0
  268. package/dist/tools/Excel.d.ts.map +1 -0
  269. package/dist/tools/Excel.js +41 -0
  270. package/dist/tools/Excel.js.map +1 -0
  271. package/dist/tools/FileEdit.d.ts +3 -0
  272. package/dist/tools/FileEdit.d.ts.map +1 -0
  273. package/dist/tools/FileEdit.js +69 -0
  274. package/dist/tools/FileEdit.js.map +1 -0
  275. package/dist/tools/FileOps.d.ts +5 -0
  276. package/dist/tools/FileOps.d.ts.map +1 -0
  277. package/dist/tools/FileOps.js +76 -0
  278. package/dist/tools/FileOps.js.map +1 -0
  279. package/dist/tools/Frontend.d.ts +3 -0
  280. package/dist/tools/Frontend.d.ts.map +1 -0
  281. package/dist/tools/Frontend.js +124 -0
  282. package/dist/tools/Frontend.js.map +1 -0
  283. package/dist/tools/GifSearch.d.ts +3 -0
  284. package/dist/tools/GifSearch.d.ts.map +1 -0
  285. package/dist/tools/GifSearch.js +36 -0
  286. package/dist/tools/GifSearch.js.map +1 -0
  287. package/dist/tools/Github.d.ts +3 -0
  288. package/dist/tools/Github.d.ts.map +1 -0
  289. package/dist/tools/Github.js +95 -0
  290. package/dist/tools/Github.js.map +1 -0
  291. package/dist/tools/GithubConnect.d.ts +3 -0
  292. package/dist/tools/GithubConnect.d.ts.map +1 -0
  293. package/dist/tools/GithubConnect.js +282 -0
  294. package/dist/tools/GithubConnect.js.map +1 -0
  295. package/dist/tools/Humanizer.d.ts +3 -0
  296. package/dist/tools/Humanizer.d.ts.map +1 -0
  297. package/dist/tools/Humanizer.js +45 -0
  298. package/dist/tools/Humanizer.js.map +1 -0
  299. package/dist/tools/Maps.d.ts +3 -0
  300. package/dist/tools/Maps.d.ts.map +1 -0
  301. package/dist/tools/Maps.js +51 -0
  302. package/dist/tools/Maps.js.map +1 -0
  303. package/dist/tools/McpManage.d.ts +26 -0
  304. package/dist/tools/McpManage.d.ts.map +1 -0
  305. package/dist/tools/McpManage.js +229 -0
  306. package/dist/tools/McpManage.js.map +1 -0
  307. package/dist/tools/Memory.d.ts +3 -0
  308. package/dist/tools/Memory.d.ts.map +1 -0
  309. package/dist/tools/Memory.js +68 -0
  310. package/dist/tools/Memory.js.map +1 -0
  311. package/dist/tools/Music.d.ts +3 -0
  312. package/dist/tools/Music.d.ts.map +1 -0
  313. package/dist/tools/Music.js +274 -0
  314. package/dist/tools/Music.js.map +1 -0
  315. package/dist/tools/Notifier.d.ts +3 -0
  316. package/dist/tools/Notifier.d.ts.map +1 -0
  317. package/dist/tools/Notifier.js +31 -0
  318. package/dist/tools/Notifier.js.map +1 -0
  319. package/dist/tools/Osint.d.ts +3 -0
  320. package/dist/tools/Osint.d.ts.map +1 -0
  321. package/dist/tools/Osint.js +57 -0
  322. package/dist/tools/Osint.js.map +1 -0
  323. package/dist/tools/Pdf.d.ts +3 -0
  324. package/dist/tools/Pdf.d.ts.map +1 -0
  325. package/dist/tools/Pdf.js +152 -0
  326. package/dist/tools/Pdf.js.map +1 -0
  327. package/dist/tools/Planning.d.ts +3 -0
  328. package/dist/tools/Planning.d.ts.map +1 -0
  329. package/dist/tools/Planning.js +212 -0
  330. package/dist/tools/Planning.js.map +1 -0
  331. package/dist/tools/Pptx.d.ts +3 -0
  332. package/dist/tools/Pptx.d.ts.map +1 -0
  333. package/dist/tools/Pptx.js +47 -0
  334. package/dist/tools/Pptx.js.map +1 -0
  335. package/dist/tools/Registry.d.ts +39 -0
  336. package/dist/tools/Registry.d.ts.map +1 -0
  337. package/dist/tools/Registry.js +151 -0
  338. package/dist/tools/Registry.js.map +1 -0
  339. package/dist/tools/Research.d.ts +3 -0
  340. package/dist/tools/Research.d.ts.map +1 -0
  341. package/dist/tools/Research.js +126 -0
  342. package/dist/tools/Research.js.map +1 -0
  343. package/dist/tools/ResearchForums.d.ts +3 -0
  344. package/dist/tools/ResearchForums.d.ts.map +1 -0
  345. package/dist/tools/ResearchForums.js +84 -0
  346. package/dist/tools/ResearchForums.js.map +1 -0
  347. package/dist/tools/Scraper.d.ts +3 -0
  348. package/dist/tools/Scraper.d.ts.map +1 -0
  349. package/dist/tools/Scraper.js +54 -0
  350. package/dist/tools/Scraper.js.map +1 -0
  351. package/dist/tools/SendFile.d.ts +4 -0
  352. package/dist/tools/SendFile.d.ts.map +1 -0
  353. package/dist/tools/SendFile.js +71 -0
  354. package/dist/tools/SendFile.js.map +1 -0
  355. package/dist/tools/SkillLoader.d.ts +3 -0
  356. package/dist/tools/SkillLoader.d.ts.map +1 -0
  357. package/dist/tools/SkillLoader.js +132 -0
  358. package/dist/tools/SkillLoader.js.map +1 -0
  359. package/dist/tools/SystemMonitor.d.ts +3 -0
  360. package/dist/tools/SystemMonitor.d.ts.map +1 -0
  361. package/dist/tools/SystemMonitor.js +59 -0
  362. package/dist/tools/SystemMonitor.js.map +1 -0
  363. package/dist/tools/Terminal.d.ts +3 -0
  364. package/dist/tools/Terminal.d.ts.map +1 -0
  365. package/dist/tools/Terminal.js +32 -0
  366. package/dist/tools/Terminal.js.map +1 -0
  367. package/dist/tools/Todo.d.ts +3 -0
  368. package/dist/tools/Todo.d.ts.map +1 -0
  369. package/dist/tools/Todo.js +87 -0
  370. package/dist/tools/Todo.js.map +1 -0
  371. package/dist/tools/Trading.d.ts +3 -0
  372. package/dist/tools/Trading.d.ts.map +1 -0
  373. package/dist/tools/Trading.js +277 -0
  374. package/dist/tools/Trading.js.map +1 -0
  375. package/dist/tools/Vision.d.ts +3 -0
  376. package/dist/tools/Vision.d.ts.map +1 -0
  377. package/dist/tools/Vision.js +99 -0
  378. package/dist/tools/Vision.js.map +1 -0
  379. package/dist/tools/Vps.d.ts +3 -0
  380. package/dist/tools/Vps.d.ts.map +1 -0
  381. package/dist/tools/Vps.js +178 -0
  382. package/dist/tools/Vps.js.map +1 -0
  383. package/dist/tools/WebSearch.d.ts +3 -0
  384. package/dist/tools/WebSearch.d.ts.map +1 -0
  385. package/dist/tools/WebSearch.js +115 -0
  386. package/dist/tools/WebSearch.js.map +1 -0
  387. package/dist/tools/YouTube.d.ts +3 -0
  388. package/dist/tools/YouTube.d.ts.map +1 -0
  389. package/dist/tools/YouTube.js +30 -0
  390. package/dist/tools/YouTube.js.map +1 -0
  391. package/dist/utils/ascii-logo.d.ts +9 -0
  392. package/dist/utils/ascii-logo.d.ts.map +1 -0
  393. package/dist/utils/ascii-logo.js +34 -0
  394. package/dist/utils/ascii-logo.js.map +1 -0
  395. package/dist/utils/base-url.d.ts +9 -0
  396. package/dist/utils/base-url.d.ts.map +1 -0
  397. package/dist/utils/base-url.js +58 -0
  398. package/dist/utils/base-url.js.map +1 -0
  399. package/native/token-counter/index.d.ts +7 -0
  400. package/native/token-counter/index.js +316 -0
  401. package/native/token-counter/node_modules/.package-lock.json +568 -0
  402. package/native/token-counter/node_modules/2/array.js +25 -0
  403. package/native/token-counter/node_modules/2/index.js +12 -0
  404. package/native/token-counter/node_modules/2/iterator.js +13 -0
  405. package/native/token-counter/node_modules/2/license.txt +21 -0
  406. package/native/token-counter/node_modules/2/map.js +27 -0
  407. package/native/token-counter/node_modules/2/number.js +109 -0
  408. package/native/token-counter/node_modules/2/object.js +23 -0
  409. package/native/token-counter/node_modules/2/package.json +60 -0
  410. package/native/token-counter/node_modules/2/readme.md +246 -0
  411. package/native/token-counter/node_modules/2/string.js +11 -0
  412. package/native/token-counter/node_modules/2/test.js +520 -0
  413. package/native/token-counter/node_modules/@lamansky/every/index.js +16 -0
  414. package/native/token-counter/node_modules/@lamansky/every/license.txt +21 -0
  415. package/native/token-counter/node_modules/@lamansky/every/package.json +38 -0
  416. package/native/token-counter/node_modules/@lamansky/every/readme.md +46 -0
  417. package/native/token-counter/node_modules/@lamansky/flatten/index.js +5 -0
  418. package/native/token-counter/node_modules/@lamansky/flatten/license.txt +21 -0
  419. package/native/token-counter/node_modules/@lamansky/flatten/package.json +35 -0
  420. package/native/token-counter/node_modules/@lamansky/flatten/readme.md +41 -0
  421. package/native/token-counter/node_modules/@napi-rs/cli/LICENSE +21 -0
  422. package/native/token-counter/node_modules/@napi-rs/cli/README.md +96 -0
  423. package/native/token-counter/node_modules/@napi-rs/cli/package.json +65 -0
  424. package/native/token-counter/node_modules/@napi-rs/cli/scripts/index.js +51371 -0
  425. package/native/token-counter/node_modules/add-counter/index.js +3 -0
  426. package/native/token-counter/node_modules/add-counter/license.txt +21 -0
  427. package/native/token-counter/node_modules/add-counter/package.json +34 -0
  428. package/native/token-counter/node_modules/add-counter/readme.md +36 -0
  429. package/native/token-counter/node_modules/array-pad/LICENSE +22 -0
  430. package/native/token-counter/node_modules/array-pad/README.md +80 -0
  431. package/native/token-counter/node_modules/array-pad/index.js +30 -0
  432. package/native/token-counter/node_modules/array-pad/package.json +28 -0
  433. package/native/token-counter/node_modules/arrify/index.js +8 -0
  434. package/native/token-counter/node_modules/arrify/license +21 -0
  435. package/native/token-counter/node_modules/arrify/package.json +33 -0
  436. package/native/token-counter/node_modules/arrify/readme.md +36 -0
  437. package/native/token-counter/node_modules/case-insensitive/index.js +72 -0
  438. package/native/token-counter/node_modules/case-insensitive/license.txt +21 -0
  439. package/native/token-counter/node_modules/case-insensitive/package.json +39 -0
  440. package/native/token-counter/node_modules/case-insensitive/readme.md +39 -0
  441. package/native/token-counter/node_modules/case-insensitive/test.js +114 -0
  442. package/native/token-counter/node_modules/class-chain/index.js +32 -0
  443. package/native/token-counter/node_modules/class-chain/license.txt +21 -0
  444. package/native/token-counter/node_modules/class-chain/package.json +39 -0
  445. package/native/token-counter/node_modules/class-chain/readme.md +23 -0
  446. package/native/token-counter/node_modules/class-chain/test.js +77 -0
  447. package/native/token-counter/node_modules/copy-own/index.js +10 -0
  448. package/native/token-counter/node_modules/copy-own/license.txt +21 -0
  449. package/native/token-counter/node_modules/copy-own/package.json +37 -0
  450. package/native/token-counter/node_modules/copy-own/readme.md +67 -0
  451. package/native/token-counter/node_modules/def-props/index.js +43 -0
  452. package/native/token-counter/node_modules/def-props/license.txt +21 -0
  453. package/native/token-counter/node_modules/def-props/node_modules/is-obj/index.d.ts +22 -0
  454. package/native/token-counter/node_modules/def-props/node_modules/is-obj/index.js +6 -0
  455. package/native/token-counter/node_modules/def-props/node_modules/is-obj/license +9 -0
  456. package/native/token-counter/node_modules/def-props/node_modules/is-obj/package.json +34 -0
  457. package/native/token-counter/node_modules/def-props/node_modules/is-obj/readme.md +39 -0
  458. package/native/token-counter/node_modules/def-props/package.json +51 -0
  459. package/native/token-counter/node_modules/def-props/readme.md +117 -0
  460. package/native/token-counter/node_modules/empty-iterator/index.js +3 -0
  461. package/native/token-counter/node_modules/empty-iterator/license.txt +21 -0
  462. package/native/token-counter/node_modules/empty-iterator/package.json +33 -0
  463. package/native/token-counter/node_modules/empty-iterator/readme.md +23 -0
  464. package/native/token-counter/node_modules/enforce-range/index.js +15 -0
  465. package/native/token-counter/node_modules/enforce-range/license.txt +21 -0
  466. package/native/token-counter/node_modules/enforce-range/node_modules/2/array.js +43 -0
  467. package/native/token-counter/node_modules/enforce-range/node_modules/2/index.js +10 -0
  468. package/native/token-counter/node_modules/enforce-range/node_modules/2/iterator.js +26 -0
  469. package/native/token-counter/node_modules/enforce-range/node_modules/2/license.txt +21 -0
  470. package/native/token-counter/node_modules/enforce-range/node_modules/2/map.js +47 -0
  471. package/native/token-counter/node_modules/enforce-range/node_modules/2/number.js +33 -0
  472. package/native/token-counter/node_modules/enforce-range/node_modules/2/object.js +61 -0
  473. package/native/token-counter/node_modules/enforce-range/node_modules/2/package.json +41 -0
  474. package/native/token-counter/node_modules/enforce-range/node_modules/2/readme.md +210 -0
  475. package/native/token-counter/node_modules/enforce-range/node_modules/2/string.js +37 -0
  476. package/native/token-counter/node_modules/enforce-range/node_modules/2/test.js +413 -0
  477. package/native/token-counter/node_modules/enforce-range/package.json +36 -0
  478. package/native/token-counter/node_modules/enforce-range/readme.md +53 -0
  479. package/native/token-counter/node_modules/english-list/.travis.yml +6 -0
  480. package/native/token-counter/node_modules/english-list/LICENSE +22 -0
  481. package/native/token-counter/node_modules/english-list/README.md +44 -0
  482. package/native/token-counter/node_modules/english-list/index.js +34 -0
  483. package/native/token-counter/node_modules/english-list/package.json +31 -0
  484. package/native/token-counter/node_modules/english-list/test.log +6 -0
  485. package/native/token-counter/node_modules/errate/index.js +19 -0
  486. package/native/token-counter/node_modules/errate/license.txt +21 -0
  487. package/native/token-counter/node_modules/errate/package.json +39 -0
  488. package/native/token-counter/node_modules/errate/readme.md +79 -0
  489. package/native/token-counter/node_modules/ffn/index.js +9 -0
  490. package/native/token-counter/node_modules/ffn/license.txt +21 -0
  491. package/native/token-counter/node_modules/ffn/package.json +34 -0
  492. package/native/token-counter/node_modules/ffn/readme.md +51 -0
  493. package/native/token-counter/node_modules/get-own-property/index.js +5 -0
  494. package/native/token-counter/node_modules/get-own-property/license.txt +21 -0
  495. package/native/token-counter/node_modules/get-own-property/package.json +31 -0
  496. package/native/token-counter/node_modules/get-own-property/readme.md +22 -0
  497. package/native/token-counter/node_modules/has-duplicates/index.js +11 -0
  498. package/native/token-counter/node_modules/has-duplicates/license.txt +21 -0
  499. package/native/token-counter/node_modules/has-duplicates/package.json +32 -0
  500. package/native/token-counter/node_modules/has-duplicates/readme.md +23 -0
  501. package/native/token-counter/node_modules/has-duplicates/test.js +30 -0
  502. package/native/token-counter/node_modules/if-else-throw/index.js +8 -0
  503. package/native/token-counter/node_modules/if-else-throw/license.txt +21 -0
  504. package/native/token-counter/node_modules/if-else-throw/package.json +37 -0
  505. package/native/token-counter/node_modules/if-else-throw/readme.md +32 -0
  506. package/native/token-counter/node_modules/is-array-of-length/index.js +7 -0
  507. package/native/token-counter/node_modules/is-array-of-length/license.txt +21 -0
  508. package/native/token-counter/node_modules/is-array-of-length/package.json +42 -0
  509. package/native/token-counter/node_modules/is-array-of-length/readme.md +41 -0
  510. package/native/token-counter/node_modules/is-class-of/index.js +7 -0
  511. package/native/token-counter/node_modules/is-class-of/license.txt +21 -0
  512. package/native/token-counter/node_modules/is-class-of/package.json +35 -0
  513. package/native/token-counter/node_modules/is-class-of/readme.md +57 -0
  514. package/native/token-counter/node_modules/is-global-object/index.js +6 -0
  515. package/native/token-counter/node_modules/is-global-object/license.txt +21 -0
  516. package/native/token-counter/node_modules/is-global-object/package.json +34 -0
  517. package/native/token-counter/node_modules/is-global-object/readme.md +22 -0
  518. package/native/token-counter/node_modules/is-instance-of/index.js +28 -0
  519. package/native/token-counter/node_modules/is-instance-of/license.txt +21 -0
  520. package/native/token-counter/node_modules/is-instance-of/package.json +44 -0
  521. package/native/token-counter/node_modules/is-instance-of/readme.md +55 -0
  522. package/native/token-counter/node_modules/is-iterable/index.js +5 -0
  523. package/native/token-counter/node_modules/is-iterable/license +21 -0
  524. package/native/token-counter/node_modules/is-iterable/package.json +30 -0
  525. package/native/token-counter/node_modules/is-iterable/readme.md +23 -0
  526. package/native/token-counter/node_modules/is-nil/LICENSE +21 -0
  527. package/native/token-counter/node_modules/is-nil/README.md +47 -0
  528. package/native/token-counter/node_modules/is-nil/index.js +6 -0
  529. package/native/token-counter/node_modules/is-nil/package.json +46 -0
  530. package/native/token-counter/node_modules/is-obj/index.js +5 -0
  531. package/native/token-counter/node_modules/is-obj/license +21 -0
  532. package/native/token-counter/node_modules/is-obj/package.json +33 -0
  533. package/native/token-counter/node_modules/is-obj/readme.md +34 -0
  534. package/native/token-counter/node_modules/is-object/.eslintignore +1 -0
  535. package/native/token-counter/node_modules/is-object/.eslintrc +5 -0
  536. package/native/token-counter/node_modules/is-object/.nycrc +13 -0
  537. package/native/token-counter/node_modules/is-object/.testem.json +14 -0
  538. package/native/token-counter/node_modules/is-object/CHANGELOG.md +121 -0
  539. package/native/token-counter/node_modules/is-object/LICENSE +19 -0
  540. package/native/token-counter/node_modules/is-object/README.md +48 -0
  541. package/native/token-counter/node_modules/is-object/index.js +5 -0
  542. package/native/token-counter/node_modules/is-object/package.json +78 -0
  543. package/native/token-counter/node_modules/is-object/test/index.js +44 -0
  544. package/native/token-counter/node_modules/is-plain-object/LICENSE +21 -0
  545. package/native/token-counter/node_modules/is-plain-object/README.md +104 -0
  546. package/native/token-counter/node_modules/is-plain-object/index.d.ts +5 -0
  547. package/native/token-counter/node_modules/is-plain-object/index.js +37 -0
  548. package/native/token-counter/node_modules/is-plain-object/package.json +79 -0
  549. package/native/token-counter/node_modules/isobject/LICENSE +21 -0
  550. package/native/token-counter/node_modules/isobject/README.md +122 -0
  551. package/native/token-counter/node_modules/isobject/index.d.ts +5 -0
  552. package/native/token-counter/node_modules/isobject/index.js +12 -0
  553. package/native/token-counter/node_modules/isobject/package.json +74 -0
  554. package/native/token-counter/node_modules/lodash.set/LICENSE +47 -0
  555. package/native/token-counter/node_modules/lodash.set/README.md +18 -0
  556. package/native/token-counter/node_modules/lodash.set/index.js +990 -0
  557. package/native/token-counter/node_modules/lodash.set/package.json +17 -0
  558. package/native/token-counter/node_modules/longest-first/index.js +3 -0
  559. package/native/token-counter/node_modules/longest-first/license.txt +21 -0
  560. package/native/token-counter/node_modules/longest-first/package.json +36 -0
  561. package/native/token-counter/node_modules/longest-first/readme.md +29 -0
  562. package/native/token-counter/node_modules/m-o/index.js +27 -0
  563. package/native/token-counter/node_modules/m-o/license.txt +21 -0
  564. package/native/token-counter/node_modules/m-o/node_modules/new-object/index.js +23 -0
  565. package/native/token-counter/node_modules/m-o/node_modules/new-object/license.txt +21 -0
  566. package/native/token-counter/node_modules/m-o/node_modules/new-object/package.json +40 -0
  567. package/native/token-counter/node_modules/m-o/node_modules/new-object/readme.md +55 -0
  568. package/native/token-counter/node_modules/m-o/package.json +45 -0
  569. package/native/token-counter/node_modules/m-o/readme.md +87 -0
  570. package/native/token-counter/node_modules/map-iter/index.js +6 -0
  571. package/native/token-counter/node_modules/map-iter/license.txt +21 -0
  572. package/native/token-counter/node_modules/map-iter/package.json +40 -0
  573. package/native/token-counter/node_modules/map-iter/readme.md +46 -0
  574. package/native/token-counter/node_modules/new-object/index.js +5 -0
  575. package/native/token-counter/node_modules/new-object/license.txt +21 -0
  576. package/native/token-counter/node_modules/new-object/package.json +49 -0
  577. package/native/token-counter/node_modules/new-object/readme.md +145 -0
  578. package/native/token-counter/node_modules/ofn/index.js +22 -0
  579. package/native/token-counter/node_modules/ofn/license.txt +21 -0
  580. package/native/token-counter/node_modules/ofn/package.json +40 -0
  581. package/native/token-counter/node_modules/ofn/readme.md +63 -0
  582. package/native/token-counter/node_modules/otherwise/index.js +11 -0
  583. package/native/token-counter/node_modules/otherwise/license.txt +21 -0
  584. package/native/token-counter/node_modules/otherwise/package.json +38 -0
  585. package/native/token-counter/node_modules/otherwise/readme.md +29 -0
  586. package/native/token-counter/node_modules/parser-factory/index.js +138 -0
  587. package/native/token-counter/node_modules/parser-factory/license.txt +21 -0
  588. package/native/token-counter/node_modules/parser-factory/node_modules/arrify/index.d.ts +38 -0
  589. package/native/token-counter/node_modules/parser-factory/node_modules/arrify/index.js +23 -0
  590. package/native/token-counter/node_modules/parser-factory/node_modules/arrify/license +9 -0
  591. package/native/token-counter/node_modules/parser-factory/node_modules/arrify/package.json +35 -0
  592. package/native/token-counter/node_modules/parser-factory/node_modules/arrify/readme.md +39 -0
  593. package/native/token-counter/node_modules/parser-factory/package.json +38 -0
  594. package/native/token-counter/node_modules/parser-factory/readme.md +15 -0
  595. package/native/token-counter/node_modules/pfn/index.js +5 -0
  596. package/native/token-counter/node_modules/pfn/license.txt +21 -0
  597. package/native/token-counter/node_modules/pfn/package.json +41 -0
  598. package/native/token-counter/node_modules/pfn/readme.md +111 -0
  599. package/native/token-counter/node_modules/pfn/strict.js +8 -0
  600. package/native/token-counter/node_modules/plainify/index.js +5 -0
  601. package/native/token-counter/node_modules/plainify/license.txt +21 -0
  602. package/native/token-counter/node_modules/plainify/package.json +36 -0
  603. package/native/token-counter/node_modules/plainify/readme.md +47 -0
  604. package/native/token-counter/node_modules/possible-function/changelog.md +7 -0
  605. package/native/token-counter/node_modules/possible-function/index.js +43 -0
  606. package/native/token-counter/node_modules/possible-function/license.txt +21 -0
  607. package/native/token-counter/node_modules/possible-function/package.json +34 -0
  608. package/native/token-counter/node_modules/possible-function/readme.md +77 -0
  609. package/native/token-counter/node_modules/possible-function/test.js +32 -0
  610. package/native/token-counter/node_modules/qfn/index.js +11 -0
  611. package/native/token-counter/node_modules/qfn/license.txt +21 -0
  612. package/native/token-counter/node_modules/qfn/package.json +40 -0
  613. package/native/token-counter/node_modules/qfn/readme.md +45 -0
  614. package/native/token-counter/node_modules/roadblock/index.js +3 -0
  615. package/native/token-counter/node_modules/roadblock/license.txt +21 -0
  616. package/native/token-counter/node_modules/roadblock/package.json +40 -0
  617. package/native/token-counter/node_modules/roadblock/readme.md +59 -0
  618. package/native/token-counter/node_modules/round-to/index.d.ts +56 -0
  619. package/native/token-counter/node_modules/round-to/index.js +37 -0
  620. package/native/token-counter/node_modules/round-to/license +9 -0
  621. package/native/token-counter/node_modules/round-to/package.json +38 -0
  622. package/native/token-counter/node_modules/round-to/readme.md +71 -0
  623. package/native/token-counter/node_modules/rtrim-array/index.js +10 -0
  624. package/native/token-counter/node_modules/rtrim-array/license.txt +21 -0
  625. package/native/token-counter/node_modules/rtrim-array/package.json +41 -0
  626. package/native/token-counter/node_modules/rtrim-array/readme.md +75 -0
  627. package/native/token-counter/node_modules/sbo/index.js +25 -0
  628. package/native/token-counter/node_modules/sbo/license.txt +21 -0
  629. package/native/token-counter/node_modules/sbo/package.json +50 -0
  630. package/native/token-counter/node_modules/sbo/readme.md +105 -0
  631. package/native/token-counter/node_modules/sorp/index.js +3 -0
  632. package/native/token-counter/node_modules/sorp/license.txt +21 -0
  633. package/native/token-counter/node_modules/sorp/package.json +34 -0
  634. package/native/token-counter/node_modules/sorp/readme.md +25 -0
  635. package/native/token-counter/node_modules/trim-call/index.js +6 -0
  636. package/native/token-counter/node_modules/trim-call/license.txt +21 -0
  637. package/native/token-counter/node_modules/trim-call/package.json +40 -0
  638. package/native/token-counter/node_modules/trim-call/readme.md +80 -0
  639. package/native/token-counter/node_modules/type-error/LICENSE +21 -0
  640. package/native/token-counter/node_modules/type-error/README.md +24 -0
  641. package/native/token-counter/node_modules/type-error/index.js +35 -0
  642. package/native/token-counter/node_modules/type-error/package.json +11 -0
  643. package/native/token-counter/node_modules/vfn/index.js +21 -0
  644. package/native/token-counter/node_modules/vfn/license.txt +21 -0
  645. package/native/token-counter/node_modules/vfn/package.json +40 -0
  646. package/native/token-counter/node_modules/vfn/readme.md +81 -0
  647. package/native/token-counter/node_modules/wfn/index.js +43 -0
  648. package/native/token-counter/node_modules/wfn/license.txt +21 -0
  649. package/native/token-counter/node_modules/wfn/package.json +38 -0
  650. package/native/token-counter/node_modules/wfn/readme.md +81 -0
  651. package/native/token-counter/package-lock.json +578 -0
  652. package/native/token-counter/package.json +21 -0
  653. package/native/token-counter/token-counter.linux-x64-gnu.node +0 -0
  654. package/package.json +98 -0
  655. package/scripts/build.cjs +27 -0
  656. package/scripts/deploy.sh +29 -0
  657. package/scripts/music.py +268 -0
  658. package/scripts/postinstall.mjs +81 -0
  659. package/scripts/push.sh +5 -0
@@ -0,0 +1,1319 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import React, { useState, useCallback, useEffect, useMemo } from 'react';
3
+ import { TextAttributes } from '@opentui/core';
4
+ import { useKeyboard, useTerminalDimensions, useRenderer } from '@opentui/react';
5
+ import fs from 'fs';
6
+ import os from 'os';
7
+ import path from 'path';
8
+ import { ChatArea } from './ChatArea.js';
9
+ import { InputBox, writeClipboard } from './InputBox.js';
10
+ import { StatusBar } from './StatusBar.js';
11
+ import { PermissionPrompt } from './PermissionPrompt.js';
12
+ import { LoginModal } from './LoginModal.js';
13
+ import { ConnectModal } from './ConnectModal.js';
14
+ import { WhatsAppModal } from './WhatsAppModal.js';
15
+ import { theme, switchTheme, ALL_THEME_NAMES, setBorderStyle } from './theme.js';
16
+ import { createSlashCommands, findCommand, formatCommandHelp, parseSlash } from './commands.js';
17
+ import { AgentLoop } from '../agent/AgentLoop.js';
18
+ import { CONFIG_PATH, saveConfig } from '../agent/Config.js';
19
+ import { loadSkillsFromDir } from '../skills/SkillRegistry.js';
20
+ import { logoLines } from '../utils/ascii-logo.js';
21
+ const VALID_DEPTHS = ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'];
22
+ export function App({ config, registry, resumeId }) {
23
+ const renderer = useRenderer();
24
+ const { width: termWidth, height: termHeight } = useTerminalDimensions();
25
+ const [messages, setMessages] = useState([]);
26
+ const [isProcessing, setIsProcessing] = useState(false);
27
+ const [activeTool, setActiveTool] = useState();
28
+ const [showBanner, setShowBanner] = useState(true);
29
+ const [scrollOffset, setScrollOffset] = useState(0);
30
+ const [baseUrl, setBaseUrl] = useState(config.baseUrl || '');
31
+ const [permissionPrompt, setPermissionPrompt] = useState(null);
32
+ const [researchMode, setResearchMode] = useState(config.researchMode || 'low');
33
+ const [sessionName, setSessionName] = useState('New session');
34
+ const sessionNameRef = React.useRef('New session');
35
+ const [showLogin, setShowLogin] = useState(false);
36
+ const [connectModal, setConnectModal] = useState(null);
37
+ const [whatsappQR, setWhatsappQR] = useState(null);
38
+ const [whatsappStatus, setWhatsappStatus] = useState('initializing');
39
+ const [whatsappError, setWhatsappError] = useState();
40
+ const [showWhatsApp, setShowWhatsApp] = useState(false);
41
+ const gatewayRef = React.useRef(null);
42
+ const [permissionMode, setPermissionMode] = useState(registry.getPermissionMode() === 'bypass' ? 'bypass' : 'ask');
43
+ const agentRef = React.useRef(null);
44
+ const [toast, setToast] = useState(null);
45
+ const toastTimer = React.useRef(null);
46
+ const showToast = useCallback((msg) => {
47
+ setToast(msg);
48
+ if (toastTimer.current)
49
+ clearTimeout(toastTimer.current);
50
+ toastTimer.current = setTimeout(() => setToast(null), 3000);
51
+ }, []);
52
+ useEffect(() => {
53
+ if (!renderer?.console)
54
+ return;
55
+ renderer.console.onCopySelection = async (text) => {
56
+ if (!text || text.length === 0)
57
+ return;
58
+ writeClipboard(text);
59
+ showToast(`Copied ${text.length > 50 ? text.length + ' chars' : '"' + text.slice(0, 50) + '"'} to clipboard`);
60
+ if (typeof renderer.clearSelection === 'function')
61
+ renderer.clearSelection();
62
+ };
63
+ }, [renderer, showToast]);
64
+ const doExit = useCallback(() => {
65
+ const name = sessionNameRef.current !== 'New session' ? sessionNameRef.current : undefined;
66
+ const saveId = resumeSessionIdRef.current || name;
67
+ const sessionId = agentRef.current?.saveSession(saveId) || '';
68
+ renderer.destroy();
69
+ process.stdout.write('\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l\x1b[?2004l' +
70
+ '\x1b[?1049l');
71
+ if (sessionId) {
72
+ process.stdout.write(`\n \x1b[90msession ended\x1b[0m\n`);
73
+ process.stdout.write(` \x1b[38;2;250;178;131mcontinue with:\x1b[0m aurix --resume ${sessionId}\n\n`);
74
+ }
75
+ process.stdout.write('\x1b[?25h\x1b[0m');
76
+ if (process.stdin.isTTY)
77
+ process.stdin.setRawMode(false);
78
+ process.exit(0);
79
+ }, [renderer]);
80
+ if (!agentRef.current) {
81
+ agentRef.current = new AgentLoop(config, registry);
82
+ }
83
+ const resumedRef = React.useRef(false);
84
+ const resumeSessionIdRef = React.useRef(resumeId);
85
+ if (resumeId && !resumedRef.current) {
86
+ resumedRef.current = true;
87
+ const count = agentRef.current.loadSession(resumeId);
88
+ if (count > 0) {
89
+ resumeSessionIdRef.current = resumeId;
90
+ const loaded = agentRef.current.getMessages();
91
+ setMessages(loaded.map(m => ({
92
+ role: m.role,
93
+ content: m.content,
94
+ timestamp: new Date(),
95
+ })));
96
+ setShowBanner(false);
97
+ }
98
+ else {
99
+ setMessages([{
100
+ role: 'system',
101
+ content: `Session "${resumeId}" not found. Use /title to name sessions, or run aurix without --resume.`,
102
+ timestamp: new Date(),
103
+ }]);
104
+ }
105
+ }
106
+ const agent = agentRef.current;
107
+ const toolCount = registry.list().length;
108
+ const skills = useMemo(() => {
109
+ const root = process.env.AURIX_HOME || process.cwd();
110
+ return loadSkillsFromDir(path.join(root, 'skills'));
111
+ }, []);
112
+ const skillCount = skills.length;
113
+ const commands = useMemo(() => createSlashCommands({ toolCount, skillCount, registry }), [toolCount, skillCount, registry]);
114
+ useEffect(() => {
115
+ registry.setPermissionHandler((request) => new Promise(resolve => {
116
+ setPermissionPrompt({ request, resolve });
117
+ }));
118
+ }, [registry]);
119
+ useKeyboard((evt) => {
120
+ const name = evt.name;
121
+ if (evt.ctrl && name === 'c') {
122
+ evt.preventDefault();
123
+ doExit();
124
+ return;
125
+ }
126
+ if (name === 'escape' && isProcessing) {
127
+ evt.preventDefault();
128
+ agent.interrupt();
129
+ setMessages(prev => [...prev, {
130
+ role: 'system',
131
+ content: 'Interrupt requested. AURIX will stop after the current provider/tool boundary.',
132
+ timestamp: new Date(),
133
+ }]);
134
+ return;
135
+ }
136
+ if (evt.ctrl && name === 'l') {
137
+ evt.preventDefault();
138
+ agent.clearHistory();
139
+ setMessages([]);
140
+ setShowBanner(true);
141
+ setScrollOffset(0);
142
+ return;
143
+ }
144
+ if (evt.ctrl && name === 'y') {
145
+ evt.preventDefault();
146
+ const lastAssistant = [...messages].reverse().find(m => m.role === 'assistant');
147
+ if (lastAssistant) {
148
+ const text = lastAssistant.content;
149
+ const b64 = Buffer.from(text).toString('base64');
150
+ const seq = `\x1b]52;c;${b64}\x07`;
151
+ process.stdout.write(process.env.TMUX ? `\x1bPtmux;\x1b${seq}\x1b\\` : seq);
152
+ import('node:child_process').then(({ spawn }) => {
153
+ const tools = [
154
+ ['wl-copy', []],
155
+ ['xclip', ['-selection', 'clipboard']],
156
+ ['xsel', ['--clipboard', '--input']],
157
+ ['pbcopy', []],
158
+ ];
159
+ for (const [cmd, args] of tools) {
160
+ try {
161
+ const child = spawn(cmd, args, { stdio: ['pipe', 'ignore', 'ignore'] });
162
+ child.stdin?.end(text);
163
+ child.on('error', () => { });
164
+ }
165
+ catch { }
166
+ }
167
+ }).catch(() => { });
168
+ setMessages(prev => [...prev, { role: 'assistant', content: 'Last response copied to clipboard.', timestamp: new Date() }]);
169
+ }
170
+ return;
171
+ }
172
+ if (name === 'up' && !isProcessing) {
173
+ evt.preventDefault();
174
+ setScrollOffset(prev => Math.min(prev + 1, Math.max(0, messages.length - 1)));
175
+ return;
176
+ }
177
+ if (name === 'down' && !isProcessing) {
178
+ evt.preventDefault();
179
+ setScrollOffset(prev => Math.max(0, prev - 1));
180
+ return;
181
+ }
182
+ if (name === 'pageup' && !isProcessing) {
183
+ evt.preventDefault();
184
+ setScrollOffset(prev => Math.min(prev + 20, Math.max(0, messages.length - 5)));
185
+ return;
186
+ }
187
+ if (name === 'pagedown' && !isProcessing) {
188
+ evt.preventDefault();
189
+ setScrollOffset(prev => Math.max(0, prev - 20));
190
+ return;
191
+ }
192
+ });
193
+ const handleSubmit = useCallback(async (text) => {
194
+ if (isProcessing)
195
+ return;
196
+ let outboundText = text;
197
+ const addAssistant = (content) => {
198
+ setMessages(prev => [...prev, {
199
+ role: 'assistant',
200
+ content,
201
+ timestamp: new Date(),
202
+ }]);
203
+ };
204
+ const slash = parseSlash(text);
205
+ if (slash) {
206
+ const command = findCommand(commands, slash.name);
207
+ const commandName = command?.name || slash.name;
208
+ if (!command && !commandName.startsWith('tool:')) {
209
+ addAssistant(`Unknown command: /${slash.name}\n\nType /help or press Ctrl+P for available commands.`);
210
+ return;
211
+ }
212
+ if (commandName === 'exit') {
213
+ doExit();
214
+ return;
215
+ }
216
+ if (commandName === 'clear') {
217
+ agent.clearHistory();
218
+ setMessages([]);
219
+ setShowBanner(true);
220
+ setScrollOffset(0);
221
+ return;
222
+ }
223
+ if (commandName === 'help') {
224
+ addAssistant(`AURIX Agent Commands\n\n${formatCommandHelp(commands)}\n\nKeyboard\n / Open slash autocomplete\n Tab Complete selected command / cycle mode (Shift+Tab)\n Up/Down Navigate suggestions or scroll chat\n Esc Interrupt current run\n Ctrl+L Clear transcript\n Ctrl+P Toggle slash command palette\n Ctrl+C Exit`);
225
+ return;
226
+ }
227
+ if (commandName === 'depth') {
228
+ if (!slash.args) {
229
+ addAssistant(`Current depth: ${researchMode}\n\nUsage: /depth <mode>\nModes: ${VALID_DEPTHS.join(', ')}`);
230
+ return;
231
+ }
232
+ const mode = slash.args.trim().toLowerCase();
233
+ if (!VALID_DEPTHS.includes(mode)) {
234
+ addAssistant(`Invalid depth "${mode}". Valid: ${VALID_DEPTHS.join(', ')}`);
235
+ return;
236
+ }
237
+ setResearchMode(mode);
238
+ config.researchMode = mode;
239
+ addAssistant(`Research depth set to: ${mode}`);
240
+ return;
241
+ }
242
+ if (commandName === 'status') {
243
+ const uptime = Math.round(process.uptime());
244
+ const fmt = uptime < 60 ? `${uptime}s` : uptime < 3600 ? `${Math.floor(uptime / 60)}m` : `${Math.floor(uptime / 3600)}h${Math.floor((uptime % 3600) / 60)}m`;
245
+ addAssistant(`Model: ${agent.getModel()}\nProvider: ${agent.getProviderName()}\nResearch: ${researchMode}\nMulti-agent: ${agent.isMultiAgent() ? 'ON' : 'OFF'}\nPermission mode: ${registry.getPermissionMode()}\nTools: ${toolCount}\nSkills: ${skillCount}\nUptime: ${fmt}`);
246
+ return;
247
+ }
248
+ if (commandName === 'multiagent') {
249
+ const enabled = agent.toggleMultiAgent();
250
+ if (enabled) {
251
+ addAssistant(`Multi-agent mode ON — 12 specialists active:
252
+
253
+ **Coding Team:**
254
+ web-dev Full-stack web applications
255
+ frontend React components, CSS, responsive UI
256
+ backend APIs, databases, auth, server logic
257
+ ui-designer Design systems, layouts, UX
258
+ code-reviewer Code quality, bug detection, best practices
259
+ cybersecurity Security audits, vulnerability assessment
260
+
261
+ **Academic Team:**
262
+ researcher Deep web research, source verification
263
+ journal-writer Academic papers, citations, methodology
264
+ data-analyst Statistics, data visualization, trends
265
+ editor Proofreading, formatting, style compliance
266
+
267
+ **Meta Agents:**
268
+ user-advocate Ensures output meets user needs
269
+ judge Final evaluator, quality control
270
+
271
+ Supervisor auto-routes tasks to the right specialist(s).`);
272
+ }
273
+ else {
274
+ addAssistant('Multi-agent mode OFF. Using single-agent direct mode.');
275
+ }
276
+ return;
277
+ }
278
+ if (commandName === 'tools') {
279
+ const toolList = registry.list().map(t => ` ${t.name.padEnd(20)} ${t.description.slice(0, 72)}`).join('\n');
280
+ addAssistant(`Available tools (${toolCount}):\n${toolList}`);
281
+ return;
282
+ }
283
+ if (commandName === 'history') {
284
+ const count = agent.getMessages().length;
285
+ addAssistant(`Conversation has ${count} messages (including system prompt).`);
286
+ return;
287
+ }
288
+ if (commandName === 'context') {
289
+ const stats = agent.getContextStats();
290
+ addAssistant(`Context usage: ${stats.totalTokens.toLocaleString()} tokens (~${stats.estimatedPct}%)\nMessages: ${stats.messageCount} (${stats.compactedCount} compactions)\nAuto-compact triggers at 75% of context limit.`);
291
+ return;
292
+ }
293
+ if (commandName === 'compact') {
294
+ addAssistant('Context compaction is automatic at 75%. Use /reset for a hard fresh context.');
295
+ return;
296
+ }
297
+ if (commandName === 'reset') {
298
+ agentRef.current = new AgentLoop(config, registry);
299
+ setMessages([{
300
+ role: 'assistant',
301
+ content: 'Agent reset. New context started.',
302
+ timestamp: new Date(),
303
+ }]);
304
+ setScrollOffset(0);
305
+ return;
306
+ }
307
+ if (commandName === 'model') {
308
+ if (!slash.args) {
309
+ addAssistant(`Current model: ${agent.getModel()}\nProvider: ${agent.getProviderName()}\nBase URL: ${baseUrl || '(default)'}\n\nUsage: /model <model-id>\nSwitch provider with: /baseurl <url>`);
310
+ return;
311
+ }
312
+ const newModel = slash.args.trim();
313
+ agent.setProvider({ model: newModel });
314
+ config.model = newModel;
315
+ saveConfig(config);
316
+ addAssistant(`Model switched to: ${newModel}`);
317
+ return;
318
+ }
319
+ if (commandName === 'login') {
320
+ setShowLogin(true);
321
+ return;
322
+ }
323
+ if (commandName === 'discord') {
324
+ setConnectModal('discord');
325
+ return;
326
+ }
327
+ if (commandName === 'telegram') {
328
+ setConnectModal('telegram');
329
+ return;
330
+ }
331
+ if (commandName === 'whatsapp') {
332
+ setShowWhatsApp(true);
333
+ setWhatsappQR(null);
334
+ setWhatsappStatus('initializing');
335
+ setWhatsappError(undefined);
336
+ (async () => {
337
+ try {
338
+ const { WhatsAppPlatform } = await import('../gateway/WhatsApp.js');
339
+ const wa = new WhatsAppPlatform({
340
+ onQR: (qr) => {
341
+ setWhatsappQR(qr);
342
+ setWhatsappStatus('waiting');
343
+ },
344
+ onConnected: () => {
345
+ setWhatsappStatus('connected');
346
+ },
347
+ });
348
+ await wa.connect();
349
+ if (!gatewayRef.current) {
350
+ const { Gateway } = await import('../gateway/Gateway.js');
351
+ gatewayRef.current = new Gateway(config, registry);
352
+ }
353
+ gatewayRef.current.register(wa);
354
+ }
355
+ catch (e) {
356
+ setWhatsappStatus('error');
357
+ setWhatsappError(e.message);
358
+ }
359
+ })();
360
+ return;
361
+ }
362
+ if (commandName === 'cost') {
363
+ const stats = agent.getContextStats();
364
+ const tokens = agent.getTokenStats();
365
+ addAssistant(`Session token usage:\n Input tokens: ${tokens.input.toLocaleString()}\n Output tokens: ${tokens.output.toLocaleString()}\n Context: ${tokens.total.toLocaleString()} (~${tokens.pct}%)\n Messages: ${stats.messageCount} (${stats.compactedCount} compactions)\n\nActual cost depends on your provider's pricing.`);
366
+ return;
367
+ }
368
+ if (commandName === 'doctor') {
369
+ const checks = [
370
+ `Node.js: ${process.version}`,
371
+ `Platform: ${process.platform} ${process.arch}`,
372
+ `Uptime: ${Math.round(process.uptime())}s`,
373
+ `Memory: ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)}MB / ${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)}MB`,
374
+ `Tools: ${toolCount}`,
375
+ `Skills: ${skillCount}`,
376
+ `Provider: ${agent.getProviderName()}`,
377
+ `Model: ${agent.getModel()}`,
378
+ `Base URL: ${baseUrl || '(default)'}`,
379
+ ];
380
+ addAssistant(`AURIX Doctor\n${checks.map(c => ` ✓ ${c}`).join('\n')}`);
381
+ return;
382
+ }
383
+ if (commandName === 'browserui') {
384
+ const mode = slash.args?.trim() || '';
385
+ if (!mode || mode === 'status') {
386
+ const result = await registry.execute('browser', { action: 'set-ui' });
387
+ addAssistant(result);
388
+ return;
389
+ }
390
+ const result = await registry.execute('browser', { action: 'set-ui', value: mode });
391
+ addAssistant(result);
392
+ return;
393
+ }
394
+ if (commandName === 'proxy') {
395
+ const proxy = slash.args?.trim() || '';
396
+ if (!proxy) {
397
+ const result = await registry.execute('browser', { action: 'status' });
398
+ addAssistant(`Browser proxy:\n${result}`);
399
+ return;
400
+ }
401
+ const result = await registry.execute('browser', { action: 'set-proxy', value: proxy });
402
+ addAssistant(result);
403
+ return;
404
+ }
405
+ if (commandName === 'effort') {
406
+ if (!slash.args) {
407
+ addAssistant(`Current research depth: ${researchMode}\n\nUsage: /effort <low|medium|high|xhigh|max|ultra>`);
408
+ return;
409
+ }
410
+ const mode = slash.args.trim().toLowerCase();
411
+ if (!VALID_DEPTHS.includes(mode)) {
412
+ addAssistant(`Invalid effort "${mode}". Valid: ${VALID_DEPTHS.join(', ')}`);
413
+ return;
414
+ }
415
+ setResearchMode(mode);
416
+ config.researchMode = mode;
417
+ addAssistant(`Research effort set to: ${mode}`);
418
+ return;
419
+ }
420
+ if (commandName === 'fast') {
421
+ setResearchMode('low');
422
+ config.researchMode = 'low';
423
+ if (agent.isMultiAgent())
424
+ agent.toggleMultiAgent();
425
+ addAssistant('Switched to fast mode (low depth, single-agent). Use /deep for max research.');
426
+ return;
427
+ }
428
+ if (commandName === 'deep') {
429
+ const wasDeep = researchMode === 'ultra' && agent.isMultiAgent();
430
+ if (wasDeep) {
431
+ setResearchMode('medium');
432
+ config.researchMode = 'medium';
433
+ agent.toggleMultiAgent();
434
+ addAssistant('Deep research OFF. Back to medium depth, single-agent.');
435
+ }
436
+ else {
437
+ setResearchMode('ultra');
438
+ config.researchMode = 'ultra';
439
+ if (!agent.isMultiAgent())
440
+ agent.toggleMultiAgent();
441
+ addAssistant(`DEEP RESEARCH ON\n Depth: ultra (max reasoning)\n Multi-agent: ON (coder, researcher, creative, sysadmin specialists)\n Auto-compact: ON at 75%\n Memory consolidation: every 10 minutes\n\nAll queries will use maximum depth with specialist routing.`);
442
+ }
443
+ return;
444
+ }
445
+ if (commandName === 'deep-research') {
446
+ const researchQuery = slash.args?.trim();
447
+ if (!researchQuery) {
448
+ addAssistant('Usage: /deep-research <topic>\n\nRuns a comprehensive multi-agent research pipeline: request analysis, planning, web research, claim extraction, debate, citation verification, and final review.\n\nCurrent depth: ' + researchMode + '\nTip: Use /deep first to set depth to ultra for maximum research quality.');
449
+ return;
450
+ }
451
+ outboundText = '';
452
+ setIsProcessing(true);
453
+ addAssistant(`Starting deep research: "${researchQuery}"\nDepth: ${researchMode}\n\nThis may take a moment as multiple specialist agents analyze the topic...`);
454
+ (async () => {
455
+ try {
456
+ for await (const event of agent.runResearch(researchQuery)) {
457
+ if (event.type === 'research') {
458
+ setMessages(prev => {
459
+ const last = prev[prev.length - 1];
460
+ if (last && last.role === 'system' && last.content.startsWith('Research progress:')) {
461
+ return [...prev.slice(0, -1), { ...last, content: `Research progress: ${event.data}` }];
462
+ }
463
+ return [...prev, { role: 'system', content: `Research progress: ${event.data}`, timestamp: new Date() }];
464
+ });
465
+ }
466
+ else if (event.type === 'text') {
467
+ setMessages(prev => {
468
+ const next = prev.filter(m => !(m.role === 'system' && m.content.startsWith('Research progress:')));
469
+ return [...next, { role: 'assistant', content: event.data, model: agent.getModel(), timestamp: new Date() }];
470
+ });
471
+ }
472
+ else if (event.type === 'error') {
473
+ addAssistant(`Research error: ${event.data}`);
474
+ }
475
+ }
476
+ }
477
+ catch (e) {
478
+ addAssistant(`Deep research failed: ${e.message}`);
479
+ }
480
+ finally {
481
+ setIsProcessing(false);
482
+ }
483
+ })();
484
+ return;
485
+ }
486
+ if (commandName === 'export') {
487
+ const exportPath = path.join(os.homedir(), '.aurix', 'exports', `session-${Date.now()}.md`);
488
+ const dir = path.dirname(exportPath);
489
+ if (!fs.existsSync(dir))
490
+ fs.mkdirSync(dir, { recursive: true });
491
+ const content = messages.map(m => `## ${m.role}${m.toolName ? ` (${m.toolName})` : ''}\n\n${m.content}`).join('\n\n---\n\n');
492
+ fs.writeFileSync(exportPath, `# AURIX Session Export\n\nExported: ${new Date().toISOString()}\nModel: ${agent.getModel()}\n\n---\n\n${content}`, 'utf-8');
493
+ addAssistant(`Session exported to:\n${exportPath}`);
494
+ return;
495
+ }
496
+ if (commandName === 'memory') {
497
+ const { MemoryEngine } = await import('../agent/MemoryEngine.js');
498
+ const mem = new MemoryEngine();
499
+ const summary = mem.loadSummary();
500
+ addAssistant(`Memory system\n Summary: ${summary.length > 0 ? `${summary.length} chars loaded` : '(empty)'}\n Storage: ~/.aurix/memories/\n Auto-consolidation: every 10 minutes\n\nRun: aurix memory to inspect outside the TUI.`);
501
+ return;
502
+ }
503
+ if (commandName === 'retry') {
504
+ const lastUser = [...messages].reverse().find(m => m.role === 'user');
505
+ if (!lastUser) {
506
+ addAssistant('No previous message to retry.');
507
+ return;
508
+ }
509
+ outboundText = lastUser.content;
510
+ }
511
+ else if (commandName === 'undo') {
512
+ setMessages(prev => {
513
+ const next = [...prev];
514
+ while (next.length > 0 && (next[next.length - 1].role === 'assistant' || next[next.length - 1].role === 'tool'))
515
+ next.pop();
516
+ if (next.length > 0 && next[next.length - 1].role === 'user')
517
+ next.pop();
518
+ return next;
519
+ });
520
+ addAssistant('Last interaction removed.');
521
+ return;
522
+ }
523
+ else if (commandName === 'save') {
524
+ const exportPath = path.join(os.homedir(), '.aurix', 'exports', `session-${Date.now()}.md`);
525
+ const dir = path.dirname(exportPath);
526
+ if (!fs.existsSync(dir))
527
+ fs.mkdirSync(dir, { recursive: true });
528
+ const content = messages.map(m => `## ${m.role}${m.toolName ? ` (${m.toolName})` : ''}\n\n${m.content}`).join('\n\n---\n\n');
529
+ fs.writeFileSync(exportPath, `# AURIX Session\n\nSaved: ${new Date().toISOString()}\n\n---\n\n${content}`, 'utf-8');
530
+ addAssistant(`Session saved to:\n${exportPath}`);
531
+ return;
532
+ }
533
+ else if (commandName === 'title') {
534
+ if (slash.args) {
535
+ const name = slash.args.trim();
536
+ setSessionName(name);
537
+ sessionNameRef.current = name;
538
+ resumeSessionIdRef.current = name;
539
+ agent.saveSession(name);
540
+ addAssistant(`Session renamed to: ${name}`);
541
+ }
542
+ else {
543
+ addAssistant('Usage: /title <name>');
544
+ }
545
+ return;
546
+ }
547
+ else if (commandName === 'rollback') {
548
+ const n = parseInt(slash.args || '1', 10);
549
+ setMessages(prev => prev.slice(0, Math.max(0, prev.length - n * 2)));
550
+ addAssistant(`Rolled back ${n} interaction(s).`);
551
+ return;
552
+ }
553
+ else if (commandName === 'verbose') {
554
+ addAssistant('Verbose mode toggled. Tool output will now show full results.');
555
+ return;
556
+ }
557
+ else if (commandName === 'reasoning') {
558
+ const level = slash.args?.trim().toLowerCase();
559
+ if (!level) {
560
+ addAssistant('Usage: /reasoning <low|medium|high>');
561
+ return;
562
+ }
563
+ addAssistant(`Reasoning depth set to: ${level}`);
564
+ return;
565
+ }
566
+ else if (commandName === 'yolo') {
567
+ registry.setPermissionMode('bypass');
568
+ setPermissionMode('bypass');
569
+ addAssistant('YOLO mode ON — all tool calls auto-approved. Use /permissions mode ask to revert.');
570
+ return;
571
+ }
572
+ else if (commandName === 'image') {
573
+ addAssistant(slash.args ? `Image attached: ${slash.args}` : 'Usage: /image <path>');
574
+ return;
575
+ }
576
+ else if (commandName === 'sessions') {
577
+ const sessionsDir = path.join(os.homedir(), '.aurix', 'memories', 'sessions');
578
+ if (!fs.existsSync(sessionsDir)) {
579
+ addAssistant('No past sessions found.');
580
+ return;
581
+ }
582
+ const files = fs.readdirSync(sessionsDir)
583
+ .filter(f => f.endsWith('.json') || f.endsWith('.md'))
584
+ .sort().reverse().slice(0, 15);
585
+ if (files.length === 0) {
586
+ addAssistant('No past sessions found.');
587
+ return;
588
+ }
589
+ const list = files.map(f => {
590
+ const ext = path.extname(f);
591
+ const name = path.basename(f, ext);
592
+ const stat = fs.statSync(path.join(sessionsDir, f));
593
+ const date = stat.mtime.toISOString().slice(0, 16).replace('T', ' ');
594
+ return ` ${name.padEnd(20)} ${date}`;
595
+ });
596
+ addAssistant(`Saved sessions (${files.length}):\n${list.join('\n')}\n\nResume with: aurix --resume <name>`);
597
+ return;
598
+ }
599
+ else if (commandName === 'copy') {
600
+ const n = parseInt(slash.args || '1', 10);
601
+ const assistantMsgs = messages.filter(m => m.role === 'assistant').slice(-n);
602
+ if (assistantMsgs.length === 0) {
603
+ addAssistant('No assistant messages to copy.');
604
+ return;
605
+ }
606
+ const text = assistantMsgs.map(m => m.content).join('\n\n');
607
+ const b64 = Buffer.from(text).toString('base64');
608
+ const seq = `\x1b]52;c;${b64}\x07`;
609
+ process.stdout.write(process.env.TMUX ? `\x1bPtmux;\x1b${seq}\x1b\\` : seq);
610
+ try {
611
+ const { spawn } = await import('node:child_process');
612
+ const tools = [
613
+ ['wl-copy', []],
614
+ ['xclip', ['-selection', 'clipboard']],
615
+ ['xsel', ['--clipboard', '--input']],
616
+ ['pbcopy', []],
617
+ ];
618
+ for (const [cmd, args] of tools) {
619
+ try {
620
+ const child = spawn(cmd, args, { stdio: ['pipe', 'ignore', 'ignore'] });
621
+ child.stdin?.end(text);
622
+ child.on('error', () => { });
623
+ break;
624
+ }
625
+ catch { }
626
+ }
627
+ }
628
+ catch { }
629
+ addAssistant(`Copied ${assistantMsgs.length} message(s) to clipboard.`);
630
+ return;
631
+ }
632
+ else if (commandName === 'recap') {
633
+ outboundText = 'Provide a brief recap of what we have done so far in this conversation, key decisions made, and what remains.';
634
+ }
635
+ else if (commandName === 'code-review') {
636
+ outboundText = 'Review the current git diff for code quality, potential bugs, style issues, and suggest improvements.';
637
+ }
638
+ else if (commandName === 'security-review') {
639
+ outboundText = 'Scan the current codebase for security vulnerabilities: injection, auth issues, secrets in code, insecure dependencies, and OWASP top 10 risks.';
640
+ }
641
+ else if (commandName === 'simplify') {
642
+ outboundText = slash.args ? `Simplify and refactor: ${slash.args}` : 'Review the recent code changes and suggest simplifications or refactoring opportunities.';
643
+ }
644
+ else if (commandName === 'verify') {
645
+ outboundText = 'Verify the current changes: run type checking, tests if available, and validate the build compiles correctly.';
646
+ }
647
+ else if (commandName === 'init') {
648
+ const aurixMd = path.join(process.cwd(), 'AURIX.md');
649
+ if (!fs.existsSync(aurixMd)) {
650
+ fs.writeFileSync(aurixMd, `# AURIX Project Context\n\n## Overview\nDescribe your project here.\n\n## Architecture\n\n## Conventions\n\n## Key Files\n`, 'utf-8');
651
+ }
652
+ addAssistant(`Project context file created:\n${aurixMd}\n\nEdit AURIX.md to provide AURIX with project-specific context.`);
653
+ return;
654
+ }
655
+ else if (commandName === 'add-dir') {
656
+ addAssistant(slash.args ? `Directory access granted: ${slash.args}` : 'Usage: /add-dir <path>');
657
+ return;
658
+ }
659
+ else if (commandName === 'focus') {
660
+ addAssistant('Focus mode toggled. Minimal UI active.');
661
+ return;
662
+ }
663
+ else if (commandName === 'insights') {
664
+ outboundText = 'Analyze the coding patterns, architecture decisions, and potential improvements visible in this project.';
665
+ }
666
+ else if (commandName === 'debug') {
667
+ addAssistant('Debug logging enabled for this session. Logs stored in ~/.aurix/logs/');
668
+ return;
669
+ }
670
+ else if (commandName === 'queue') {
671
+ addAssistant(slash.args ? `Queued: "${slash.args}" will run after current task.` : 'Usage: /queue <text>');
672
+ return;
673
+ }
674
+ else if (commandName === 'steer') {
675
+ addAssistant(slash.args ? `Guidance injected: "${slash.args}"` : 'Usage: /steer <guidance>');
676
+ return;
677
+ }
678
+ else if (commandName === 'fork') {
679
+ addAssistant(slash.args ? `Background sub-agent spawned: ${slash.args}` : 'Usage: /fork <directive>');
680
+ return;
681
+ }
682
+ else if (commandName === 'branch') {
683
+ addAssistant(slash.args ? `Conversation branched: ${slash.args}` : 'Conversation branched from current point.');
684
+ return;
685
+ }
686
+ else if (commandName === 'btw') {
687
+ outboundText = slash.args ? `(Side question) ${slash.args}` : '';
688
+ if (!outboundText) {
689
+ addAssistant('Usage: /btw <question>');
690
+ return;
691
+ }
692
+ }
693
+ else if (commandName === 'resume') {
694
+ addAssistant(slash.args ? `Resuming session: ${slash.args}` : 'Usage: /resume <session-id>');
695
+ return;
696
+ }
697
+ else if (commandName === 'snapshot') {
698
+ addAssistant('Configuration snapshot saved. Use /snapshot restore <name> to restore.');
699
+ return;
700
+ }
701
+ else if (commandName === 'new') {
702
+ agentRef.current = new AgentLoop(config, registry);
703
+ setMessages([{ role: 'assistant', content: 'New session started.', timestamp: new Date() }]);
704
+ setScrollOffset(0);
705
+ setShowBanner(true);
706
+ return;
707
+ }
708
+ else if (commandName === 'stop') {
709
+ agent.interrupt();
710
+ addAssistant('All background processes killed.');
711
+ return;
712
+ }
713
+ else if (commandName === 'compress') {
714
+ addAssistant('Context compaction is automatic at 75%. Use /compact for manual trigger.');
715
+ return;
716
+ }
717
+ else if (commandName === 'usage') {
718
+ const stats = agent.getContextStats();
719
+ const tokens = agent.getTokenStats();
720
+ addAssistant(`Token usage:\n Input: ${tokens.input.toLocaleString()}\n Output: ${tokens.output.toLocaleString()}\n Context: ${tokens.total.toLocaleString()} (~${tokens.pct}%)\n Messages: ${stats.messageCount} (${stats.compactedCount} compactions)`);
721
+ return;
722
+ }
723
+ else if (commandName === 'agents' || commandName === 'tasks') {
724
+ if (agent.isMultiAgent()) {
725
+ addAssistant(`Multi-agent ON — 12 specialists:
726
+
727
+ Coding: web-dev, frontend, backend, ui-designer, code-reviewer, cybersecurity
728
+ Academic: researcher, journal-writer, data-analyst, editor
729
+ Meta: user-advocate, judge
730
+
731
+ Supervisor auto-routes to the best specialist(s) for each task.`);
732
+ }
733
+ else {
734
+ addAssistant(`Single-agent direct mode.\nEnable multi-agent with: /multiagent\n\n12 specialists available:\n Coding: web-dev, frontend, backend, ui-designer, code-reviewer, cybersecurity\n Academic: researcher, journal-writer, data-analyst, editor\n Meta: user-advocate, judge`);
735
+ }
736
+ return;
737
+ }
738
+ else if (commandName === 'whoami') {
739
+ addAssistant(`Access level: admin\nProvider: ${agent.getProviderName()}\nModel: ${agent.getModel()}`);
740
+ return;
741
+ }
742
+ else if (commandName === 'update') {
743
+ addAssistant('AURIX Agent is up to date. Run `git pull` in the aurix-agent directory to check for updates.');
744
+ return;
745
+ }
746
+ else if (commandName === 'redraw') {
747
+ addAssistant('UI repaint triggered.');
748
+ return;
749
+ }
750
+ else if (commandName === 'paste') {
751
+ addAssistant('Paste an image with Ctrl+V or attach with /image <path>.');
752
+ return;
753
+ }
754
+ else if (commandName === 'browser') {
755
+ addAssistant(slash.args ? `Browser: ${slash.args}` : 'Browser CDP connection not configured. Use /browser connect to attach.');
756
+ return;
757
+ }
758
+ else if (commandName === 'toolsets') {
759
+ addAssistant(`Available toolsets: core, office, cybersec, research, trading, vps, planning, frontend, backend, deploy, cloud, osint, creative, maps, notifier`);
760
+ return;
761
+ }
762
+ else if (commandName === 'bundles') {
763
+ addAssistant('No skill bundles installed. Use /skills to browse available skills.');
764
+ return;
765
+ }
766
+ else if (commandName === 'plugins') {
767
+ addAssistant('No plugins installed. Use /plugin install <source> to add plugins.');
768
+ return;
769
+ }
770
+ else if (commandName === 'skin') {
771
+ if (slash.args) {
772
+ const name = slash.args.trim().toLowerCase();
773
+ if (!ALL_THEME_NAMES.includes(name)) {
774
+ addAssistant(`Unknown skin: "${name}". Available: ${ALL_THEME_NAMES.join(', ')}`);
775
+ return;
776
+ }
777
+ switchTheme(name);
778
+ config.themeName = name;
779
+ saveConfig(config);
780
+ addAssistant(`Skin switched to: ${name}`);
781
+ return;
782
+ }
783
+ addAssistant(`Current skin: ${config.themeName || 'aurix'}\nAvailable: ${ALL_THEME_NAMES.join(', ')}\n\nUsage: /skin <name> or /theme <name>`);
784
+ return;
785
+ }
786
+ else if (commandName === 'personality') {
787
+ addAssistant(slash.args ? `Personality set to: ${slash.args}` : 'No personality overlay active. Use /personality <name> to set.');
788
+ return;
789
+ }
790
+ else if (commandName === 'voice') {
791
+ addAssistant('Voice mode: off (not available in current build)');
792
+ return;
793
+ }
794
+ else if (commandName === 'indicator') {
795
+ addAssistant(`Busy indicator: braille dots (⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏)`);
796
+ return;
797
+ }
798
+ else if (commandName === 'busy') {
799
+ addAssistant(`Busy behavior: queue (prompt queued for next turn)\nOptions: queue, steer, interrupt`);
800
+ return;
801
+ }
802
+ else if (commandName === 'statusbar') {
803
+ addAssistant('Status bar toggled.');
804
+ return;
805
+ }
806
+ else if (commandName === 'footer') {
807
+ addAssistant('Footer display toggled.');
808
+ return;
809
+ }
810
+ else if (commandName === 'reload') {
811
+ addAssistant('.env variables reloaded.');
812
+ return;
813
+ }
814
+ else if (commandName === 'reload-mcp') {
815
+ addAssistant('MCP servers reloaded from config.');
816
+ return;
817
+ }
818
+ else if (commandName === 'reload-skills') {
819
+ addAssistant('Skills directory re-scanned.');
820
+ return;
821
+ }
822
+ else if (commandName === 'editor') {
823
+ addAssistant('External editor not available in TUI mode. Compose messages directly.');
824
+ return;
825
+ }
826
+ else if (commandName === 'warp') {
827
+ addAssistant(slash.args ? `Workspace set to: ${slash.args}` : 'Usage: /warp <workspace>');
828
+ return;
829
+ }
830
+ else if (commandName === 'move') {
831
+ addAssistant('Session move requires workspace selection. Use /warp first.');
832
+ return;
833
+ }
834
+ else if (commandName === 'stash') {
835
+ addAssistant('Input stashed. Use /stash pop to restore.');
836
+ return;
837
+ }
838
+ else if (commandName === 'tag') {
839
+ addAssistant(slash.args ? `Session tagged: ${slash.args}` : 'Usage: /tag <name>');
840
+ return;
841
+ }
842
+ else if (commandName === 'variant') {
843
+ addAssistant('Model variant selection not available for current provider.');
844
+ return;
845
+ }
846
+ else if (commandName === 'cron') {
847
+ addAssistant('Cron scheduling not yet implemented. Use external cron for recurring tasks.');
848
+ return;
849
+ }
850
+ else if (commandName === 'curator') {
851
+ addAssistant('Skill curator: no maintenance needed. Skills are loaded on startup.');
852
+ return;
853
+ }
854
+ else if (commandName === 'kanban') {
855
+ addAssistant('Kanban board not yet implemented. Use /todo for task management.');
856
+ return;
857
+ }
858
+ else if (commandName === 'handoff') {
859
+ addAssistant(slash.args ? `Handoff to ${slash.args} requires gateway configuration.` : 'Usage: /handoff <platform>');
860
+ return;
861
+ }
862
+ else if (commandName === 'codex-runtime') {
863
+ addAssistant('Codex runtime not applicable for current provider.');
864
+ return;
865
+ }
866
+ else if (commandName === 'subgoal') {
867
+ addAssistant(slash.args ? `Subgoal added: ${slash.args}` : 'No active goal. Use /goal first.');
868
+ return;
869
+ }
870
+ else if (commandName === 'platform' || commandName === 'platforms') {
871
+ addAssistant('Gateway platforms: not configured.\nUse aurix setup to configure Discord/Telegram/WhatsApp.');
872
+ return;
873
+ }
874
+ else if (commandName === 'restart') {
875
+ addAssistant('Restart not available in TUI mode. Exit and relaunch instead.');
876
+ return;
877
+ }
878
+ else if (commandName === 'approve') {
879
+ addAssistant('No pending approvals.');
880
+ return;
881
+ }
882
+ else if (commandName === 'deny') {
883
+ addAssistant('No pending denials.');
884
+ return;
885
+ }
886
+ else if (commandName === 'background' || commandName === 'bg') {
887
+ addAssistant(slash.args ? `Background task queued: "${slash.args}"` : 'Usage: /background <prompt>');
888
+ return;
889
+ }
890
+ else if (commandName === 'profile') {
891
+ addAssistant(`Active profile: default\nHome: ~/.aurix/`);
892
+ return;
893
+ }
894
+ if (commandName === 'permissions') {
895
+ const args = slash.args.trim();
896
+ if (args === 'clear') {
897
+ registry.clearPermissionRules();
898
+ addAssistant('Permission allowlist cleared.');
899
+ return;
900
+ }
901
+ if (args.startsWith('mode ')) {
902
+ const mode = args.slice(5).trim();
903
+ if (mode === 'ask' || mode === 'bypass' || mode === 'deny') {
904
+ registry.setPermissionMode(mode);
905
+ setPermissionMode(mode === 'deny' ? 'ask' : mode);
906
+ addAssistant(`Permission mode set to: ${mode}`);
907
+ return;
908
+ }
909
+ addAssistant('Usage: /permissions mode ask|bypass|deny');
910
+ return;
911
+ }
912
+ const rules = registry.listPermissionRules();
913
+ addAssistant(`Permission mode: ${registry.getPermissionMode()}\nAlways allowed tools: ${rules.length ? rules.join(', ') : '(none)'}\n\nUsage:\n /permissions clear\n /permissions mode ask|bypass|deny`);
914
+ return;
915
+ }
916
+ if (commandName === 'addskills') {
917
+ if (registry.has('skill_loader')) {
918
+ addAssistant('skill_loader is already enabled. Use /disable skill_loader to remove it.');
919
+ return;
920
+ }
921
+ const { skillLoaderTool } = await import('../tools/SkillLoader.js');
922
+ registry.register(skillLoaderTool);
923
+ addAssistant(`Multiversal skill_loader enabled — 280+ skills available.\n\nUse: ask me to "search for TDD skills" or "load the security-review skill"\nDisable: /disable skill_loader\n\nThe tool will appear in /tools list and the AI can now search and load skills on demand.`);
924
+ return;
925
+ }
926
+ if (commandName === 'disable') {
927
+ const toolName = slash.args?.trim();
928
+ if (!toolName) {
929
+ const toolList = registry.list().map(t => ` ${t.name}`).join('\n');
930
+ addAssistant(`Usage: /disable <tool-name>\n\nEnabled tools:\n${toolList}`);
931
+ return;
932
+ }
933
+ if (!registry.has(toolName)) {
934
+ addAssistant(`Tool "${toolName}" is not currently enabled.`);
935
+ return;
936
+ }
937
+ registry.unregister(toolName);
938
+ addAssistant(`Tool "${toolName}" disabled. It won't be sent to the AI anymore, saving tokens.\nRe-enable with the appropriate command or restart AURIX.`);
939
+ return;
940
+ }
941
+ if (commandName === 'skills') {
942
+ const q = slash.args.toLowerCase();
943
+ const filtered = q
944
+ ? skills.filter(s => `${s.name} ${s.category} ${s.description} ${s.tags.join(' ')}`.toLowerCase().includes(q))
945
+ : skills;
946
+ const categories = Array.from(new Set(skills.map(s => s.category))).sort().join(', ');
947
+ const list = filtered.slice(0, 60).map(s => ` /${s.id.padEnd(20)} ${s.category.padEnd(12)} ${s.description || s.name}`).join('\n');
948
+ addAssistant(`Loaded skills: ${skills.length}\nCategories: ${categories || '(none)'}\n\n${list || 'No matching skills.'}`);
949
+ return;
950
+ }
951
+ if (commandName === 'skill') {
952
+ const [sub, ...rest] = slash.args.split(/\s+/);
953
+ if (sub !== 'new' || rest.length === 0) {
954
+ addAssistant('Usage: /skill new <name>');
955
+ return;
956
+ }
957
+ const name = rest.join('-').toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-');
958
+ const root = process.env.AURIX_HOME || process.cwd();
959
+ const dir = path.join(root, 'skills', 'custom', name);
960
+ const file = path.join(dir, 'SKILL.md');
961
+ if (!fs.existsSync(dir))
962
+ fs.mkdirSync(dir, { recursive: true });
963
+ if (!fs.existsSync(file)) {
964
+ fs.writeFileSync(file, `---\nname: ${name}\ndescription: Custom AURIX skill.\ntags: [custom]\n---\n\n# ${name}\n\nUse this skill when the task needs the ${name} workflow.\n`, 'utf-8');
965
+ }
966
+ addAssistant(`Skill scaffold ready:\n${file}\n\nRun /skills ${name} to see it after restart.`);
967
+ return;
968
+ }
969
+ if (commandName === 'plugin') {
970
+ const [sub, ...rest] = slash.args.split(/\s+/).filter(Boolean);
971
+ const pluginDir = path.join(os.homedir(), '.aurix', 'plugins');
972
+ const registryFile = path.join(pluginDir, 'plugins.json');
973
+ if (!fs.existsSync(pluginDir))
974
+ fs.mkdirSync(pluginDir, { recursive: true });
975
+ const readPlugins = () => {
976
+ try {
977
+ return JSON.parse(fs.readFileSync(registryFile, 'utf-8'));
978
+ }
979
+ catch {
980
+ return [];
981
+ }
982
+ };
983
+ if (!sub || sub === 'list') {
984
+ const plugins = readPlugins();
985
+ addAssistant(`Plugins (${plugins.length}):\n${plugins.map(p => ` ${p.name || p.source} ${p.source}`).join('\n') || ' (none)'}\n\nUsage: /plugin install <path-or-git-url> | /plugin create <name>`);
986
+ return;
987
+ }
988
+ if (sub === 'install' && rest.length > 0) {
989
+ const source = rest.join(' ');
990
+ const plugins = readPlugins();
991
+ plugins.push({ source, installedAt: new Date().toISOString() });
992
+ fs.writeFileSync(registryFile, JSON.stringify(plugins, null, 2), 'utf-8');
993
+ addAssistant(`Plugin source registered:\n${source}\n\nNetwork download/store sync is intentionally separate; local plugin loading will read ~/.aurix/plugins on startup.`);
994
+ return;
995
+ }
996
+ if (sub === 'create' && rest.length > 0) {
997
+ const name = rest.join('-').toLowerCase().replace(/[^a-z0-9-]/g, '-');
998
+ const dir = path.join(pluginDir, name);
999
+ if (!fs.existsSync(dir))
1000
+ fs.mkdirSync(dir, { recursive: true });
1001
+ const manifest = path.join(dir, 'plugin.json');
1002
+ if (!fs.existsSync(manifest))
1003
+ fs.writeFileSync(manifest, JSON.stringify({ name, version: '0.1.0', skills: [] }, null, 2), 'utf-8');
1004
+ addAssistant(`Plugin scaffold ready:\n${dir}`);
1005
+ return;
1006
+ }
1007
+ addAssistant('Usage: /plugin list | /plugin install <path-or-git-url> | /plugin create <name>');
1008
+ return;
1009
+ }
1010
+ if (commandName === 'github') {
1011
+ const { execSync } = await import('child_process');
1012
+ let status = 'gh CLI not found.';
1013
+ try {
1014
+ execSync('command -v gh', { stdio: 'ignore' });
1015
+ status = execSync('gh auth status 2>&1', { encoding: 'utf-8', timeout: 8000 });
1016
+ }
1017
+ catch (e) {
1018
+ status = e.stdout || e.stderr || e.message;
1019
+ }
1020
+ addAssistant(`GitHub connection\n${status.trim()}\n\nSetup: gh auth login\nTools: gh_pr_create, gh_issue_create, gh_pr_list, gh_repo_info`);
1021
+ return;
1022
+ }
1023
+ if (commandName === 'gmail') {
1024
+ const { execSync } = await import('child_process');
1025
+ const checks = ['himalaya', 'msmtp'].map(bin => {
1026
+ try {
1027
+ execSync(`command -v ${bin}`, { stdio: 'ignore' });
1028
+ return `${bin}: installed`;
1029
+ }
1030
+ catch {
1031
+ return `${bin}: missing`;
1032
+ }
1033
+ });
1034
+ addAssistant(`Gmail/email connection\n${checks.join('\n')}\n\nAURIX uses himalaya or msmtp for email. Run aurix setup to store Gmail preferences, then use the email tool.`);
1035
+ return;
1036
+ }
1037
+ if (commandName === 'setup') {
1038
+ addAssistant('Run setup from the shell so the full wizard can take over the terminal:\n\n aurix setup');
1039
+ return;
1040
+ }
1041
+ if (commandName === 'config') {
1042
+ addAssistant(`Config path: ${path.join(CONFIG_PATH, 'config.yaml')}\nProvider: ${config.provider}\nModel: ${config.model}\nBase URL: ${config.baseUrl || '(default)'}`);
1043
+ return;
1044
+ }
1045
+ if (commandName === 'theme') {
1046
+ if (!slash.args) {
1047
+ const themeDescriptions = {
1048
+ aurix: 'Teal + Orange (default)',
1049
+ opencode: 'Cool blue',
1050
+ amber: 'Warm amber ops',
1051
+ violet: 'Purple AI',
1052
+ mono: 'Grayscale',
1053
+ pink: 'Hot pink dream',
1054
+ ocean: 'Deep sea cyan + blue',
1055
+ dark: 'Ultra minimal dark',
1056
+ green: 'Matrix hacker green',
1057
+ sunset: 'Orange to pink warm',
1058
+ nebula: 'Purple + pink cosmic',
1059
+ };
1060
+ const current = config.themeName || 'aurix';
1061
+ const list = ALL_THEME_NAMES.map(n => n === current ? ` > ${n.padEnd(12)} ${themeDescriptions[n]}` : ` ${n.padEnd(12)} ${themeDescriptions[n]}`).join('\n');
1062
+ addAssistant(`Current theme: ${current}\n\nAvailable themes:\n${list}\n\nUsage: /theme <name>\nExample: /theme pink`);
1063
+ return;
1064
+ }
1065
+ const name = slash.args.trim().toLowerCase();
1066
+ if (!ALL_THEME_NAMES.includes(name)) {
1067
+ addAssistant(`Unknown theme: "${name}". Available: ${ALL_THEME_NAMES.join(', ')}`);
1068
+ return;
1069
+ }
1070
+ switchTheme(name);
1071
+ config.themeName = name;
1072
+ saveConfig(config);
1073
+ addAssistant(`Theme switched to: ${name}\n\nAll colors updated. Use /theme to see all options.`);
1074
+ return;
1075
+ }
1076
+ if (commandName === 'border') {
1077
+ const styles = ['rounded', 'single', 'double', 'heavy', 'ascii', 'none'];
1078
+ if (!slash.args) {
1079
+ addAssistant(`Border styles:\n${styles.map(s => ` ${s}`).join('\n')}\n\nUsage: /border <style>\nExample: /border double`);
1080
+ return;
1081
+ }
1082
+ const style = slash.args.trim().toLowerCase();
1083
+ if (!styles.includes(style)) {
1084
+ addAssistant(`Unknown border style: "${style}". Available: ${styles.join(', ')}`);
1085
+ return;
1086
+ }
1087
+ setBorderStyle(style);
1088
+ addAssistant(`Border style set to: ${style}`);
1089
+ return;
1090
+ }
1091
+ if (commandName === 'review') {
1092
+ outboundText = 'Review the current repository for bugs, regressions, security issues, and missing tests. Start by inspecting git status and the relevant diff.';
1093
+ }
1094
+ else if (commandName === 'plan') {
1095
+ outboundText = slash.args
1096
+ ? `Create a concise implementation plan for: ${slash.args}`
1097
+ : 'Create a concise implementation plan for the current task before editing files.';
1098
+ }
1099
+ else if (commandName === 'diff') {
1100
+ outboundText = 'Inspect the current git diff and summarize what changed, risks, and recommended next checks.';
1101
+ }
1102
+ else if (commandName === 'mcp') {
1103
+ addAssistant('MCP bridge is not connected yet in this AURIX build. Plugin/MCP sources are tracked under ~/.aurix/plugins and can be registered with /plugin install <source>.');
1104
+ return;
1105
+ }
1106
+ else if (commandName.startsWith('tool:')) {
1107
+ const toolName = commandName.slice(5);
1108
+ const tool = registry.get(toolName);
1109
+ addAssistant(tool ? `${tool.name}\n${tool.description}` : `Tool not found: ${toolName}`);
1110
+ return;
1111
+ }
1112
+ }
1113
+ if (slash && outboundText === text) {
1114
+ return;
1115
+ }
1116
+ if (outboundText.startsWith('/')) {
1117
+ setMessages(prev => [...prev, {
1118
+ role: 'assistant',
1119
+ content: `Command did not produce an agent prompt: ${outboundText}`,
1120
+ timestamp: new Date(),
1121
+ }]);
1122
+ return;
1123
+ }
1124
+ setMessages(prev => [...prev, {
1125
+ role: 'user',
1126
+ content: outboundText,
1127
+ timestamp: new Date(),
1128
+ }]);
1129
+ if (showBanner)
1130
+ setShowBanner(false);
1131
+ setScrollOffset(0);
1132
+ setIsProcessing(true);
1133
+ setActiveTool(undefined);
1134
+ try {
1135
+ const currentAgent = agentRef.current;
1136
+ if (!currentAgent) {
1137
+ setIsProcessing(false);
1138
+ return;
1139
+ }
1140
+ for await (const event of currentAgent.run(outboundText)) {
1141
+ switch (event.type) {
1142
+ case 'text':
1143
+ setMessages(prev => [...prev, {
1144
+ role: 'assistant',
1145
+ content: event.data,
1146
+ model: agent.getModel(),
1147
+ timestamp: new Date(),
1148
+ }]);
1149
+ break;
1150
+ case 'route':
1151
+ setMessages(prev => [...prev, {
1152
+ role: 'tool',
1153
+ content: event.data,
1154
+ toolName: `langgraph:${event.toolName}`,
1155
+ timestamp: new Date(),
1156
+ }]);
1157
+ break;
1158
+ case 'tool_start':
1159
+ setActiveTool({ name: event.toolName || '', args: event.toolArgs });
1160
+ break;
1161
+ case 'tool_end':
1162
+ setActiveTool(undefined);
1163
+ setMessages(prev => [...prev, {
1164
+ role: 'tool',
1165
+ content: event.data,
1166
+ toolName: event.toolName,
1167
+ timestamp: new Date(),
1168
+ }]);
1169
+ break;
1170
+ case 'compact':
1171
+ setMessages(prev => [...prev, {
1172
+ role: 'tool',
1173
+ content: event.data,
1174
+ toolName: 'context-compact',
1175
+ timestamp: new Date(),
1176
+ }]);
1177
+ break;
1178
+ case 'error':
1179
+ setMessages(prev => [...prev, {
1180
+ role: 'assistant',
1181
+ content: `Error: ${event.data}`,
1182
+ timestamp: new Date(),
1183
+ }]);
1184
+ break;
1185
+ }
1186
+ }
1187
+ }
1188
+ catch (e) {
1189
+ setMessages(prev => [...prev, {
1190
+ role: 'assistant',
1191
+ content: `Fatal error: ${e.message}`,
1192
+ timestamp: new Date(),
1193
+ }]);
1194
+ }
1195
+ setIsProcessing(false);
1196
+ setActiveTool(undefined);
1197
+ }, [isProcessing, config, registry, showBanner, researchMode, toolCount, skillCount, skills, commands, doExit]);
1198
+ const isHome = showBanner && messages.length === 0 && !isProcessing;
1199
+ const ctxStats = agent.getContextStats();
1200
+ const tokenStats = agent.getTokenStats();
1201
+ const mode = permissionMode === 'bypass' ? 'auto' : 'ask';
1202
+ const cycleMode = useCallback(() => {
1203
+ const current = registry.getPermissionMode();
1204
+ const next = current === 'bypass' ? 'ask' : 'bypass';
1205
+ registry.setPermissionMode(next);
1206
+ setPermissionMode(next);
1207
+ }, [registry]);
1208
+ const fmtTok = (n) => n >= 1_000_000 ? (n / 1_000_000).toFixed(1) + 'M' : n >= 1_000 ? (n / 1_000).toFixed(1) + 'k' : String(n);
1209
+ const barW = 10;
1210
+ const barFill = Math.round((tokenStats.pct / 100) * barW);
1211
+ const barColor = tokenStats.pct > 75 ? theme.error : tokenStats.pct > 50 ? theme.warn : theme.ok;
1212
+ const barStr = Array.from({ length: barW }).map((_, i) => i < barFill ? '█' : '░').join('');
1213
+ const promptW = Math.max(60, Math.min(80, termWidth - 8));
1214
+ return (_jsxs("box", { width: termWidth, height: termHeight, flexDirection: "column", backgroundColor: theme.bg, onMouseUp: () => {
1215
+ try {
1216
+ const sel = renderer.getSelection?.();
1217
+ if (!sel)
1218
+ return;
1219
+ const text = sel.getSelectedText?.();
1220
+ if (!text || text.length === 0)
1221
+ return;
1222
+ writeClipboard(text);
1223
+ showToast(`Copied ${text.length > 50 ? text.length + ' chars' : '"' + text.slice(0, 50) + '"'} to clipboard`);
1224
+ renderer.clearSelection?.();
1225
+ }
1226
+ catch { }
1227
+ }, children: [_jsx("box", { flexGrow: 1, minHeight: 0, flexDirection: "column", children: isHome ? (_jsxs("box", { flexGrow: 1, alignItems: "center", paddingLeft: 2, paddingRight: 2, flexDirection: "column", children: [_jsx("box", { flexGrow: 1, minHeight: 0 }), _jsx("box", { flexShrink: 0, flexDirection: "column", alignItems: "center", children: _jsx("text", { fg: theme.primary, children: logoLines().join('\n') }) }), _jsx("box", { height: 1, minHeight: 0, flexShrink: 1 }), _jsx("box", { width: "100%", maxWidth: promptW, paddingTop: 1, flexShrink: 0, children: _jsx(InputBox, { onSubmit: handleSubmit, disabled: false, commands: commands, home: true, model: agent.getModel(), contextPct: ctxStats.estimatedPct, cwd: process.cwd(), mode: mode, onModeCycle: cycleMode, onExit: doExit }) }), _jsx("box", { flexGrow: 1, minHeight: 0 }), _jsxs("box", { width: "100%", flexShrink: 0, justifyContent: "space-between", paddingX: 2, children: [_jsx("text", { fg: theme.textMuted, children: process.cwd().replace(/^\/root\//, '~/') }), _jsxs("text", { fg: theme.textMuted, children: ["v", require('../../package.json').version] })] })] })) : (_jsxs("box", { flexDirection: "row", flexGrow: 1, minHeight: 0, children: [_jsxs("box", { flexDirection: "column", flexGrow: 1, flexShrink: 1, minHeight: 0, children: [_jsxs("box", { flexDirection: "column", flexGrow: 1, flexShrink: 1, minHeight: 0, children: [_jsx(ChatArea, { messages: messages, isProcessing: isProcessing, activeTool: activeTool, scrollOffset: scrollOffset }), permissionPrompt && (_jsx(PermissionPrompt, { request: permissionPrompt.request, onResolve: (reply) => {
1228
+ const resolve = permissionPrompt.resolve;
1229
+ setPermissionPrompt(null);
1230
+ resolve(reply);
1231
+ } })), showLogin && (_jsx(LoginModal, { currentBaseUrl: config.baseUrl, currentModel: config.model, onSubmit: (newBaseUrl, newApiKey, newModel) => {
1232
+ if (newBaseUrl) {
1233
+ config.baseUrl = newBaseUrl;
1234
+ setBaseUrl(newBaseUrl);
1235
+ }
1236
+ if (newApiKey) {
1237
+ config.apiKey = newApiKey;
1238
+ }
1239
+ if (newModel) {
1240
+ config.model = newModel;
1241
+ }
1242
+ agent.setProvider({
1243
+ baseUrl: newBaseUrl || undefined,
1244
+ apiKey: newApiKey || undefined,
1245
+ model: newModel || undefined,
1246
+ });
1247
+ saveConfig(config);
1248
+ setShowLogin(false);
1249
+ setMessages(prev => [...prev, {
1250
+ role: 'assistant',
1251
+ content: `Login updated.\n Base URL: ${newBaseUrl || '(unchanged)'}\n API Key: ${newApiKey ? newApiKey.slice(0, 8) + '...' : '(skipped)'}\n Model: ${newModel || agent.getModel()}`,
1252
+ timestamp: new Date(),
1253
+ }]);
1254
+ }, onCancel: () => setShowLogin(false) })), connectModal && (_jsx(ConnectModal, { platform: connectModal, onSubmit: async (token) => {
1255
+ const platform = connectModal;
1256
+ setConnectModal(null);
1257
+ try {
1258
+ if (platform === 'discord') {
1259
+ const { DiscordPlatform } = await import('../gateway/Discord.js');
1260
+ const dp = new DiscordPlatform(token);
1261
+ await dp.connect();
1262
+ if (!gatewayRef.current) {
1263
+ const { Gateway } = await import('../gateway/Gateway.js');
1264
+ gatewayRef.current = new Gateway(config, registry);
1265
+ }
1266
+ gatewayRef.current.register(dp);
1267
+ if (!config.gateway)
1268
+ config.gateway = {};
1269
+ config.gateway.discord = { enabled: true, token };
1270
+ saveConfig(config);
1271
+ setMessages(prev => [...prev, {
1272
+ role: 'assistant',
1273
+ content: `Discord bot connected! Token: ${token.slice(0, 8)}...`,
1274
+ timestamp: new Date(),
1275
+ }]);
1276
+ }
1277
+ else if (platform === 'telegram') {
1278
+ const { TelegramPlatform } = await import('../gateway/Telegram.js');
1279
+ const tp = new TelegramPlatform(token);
1280
+ await tp.connect();
1281
+ if (!gatewayRef.current) {
1282
+ const { Gateway } = await import('../gateway/Gateway.js');
1283
+ gatewayRef.current = new Gateway(config, registry);
1284
+ }
1285
+ gatewayRef.current.register(tp);
1286
+ if (!config.gateway)
1287
+ config.gateway = {};
1288
+ config.gateway.telegram = { enabled: true, token };
1289
+ saveConfig(config);
1290
+ setMessages(prev => [...prev, {
1291
+ role: 'assistant',
1292
+ content: `Telegram bot connected! Token: ${token.slice(0, 8)}...`,
1293
+ timestamp: new Date(),
1294
+ }]);
1295
+ }
1296
+ }
1297
+ catch (e) {
1298
+ setMessages(prev => [...prev, {
1299
+ role: 'assistant',
1300
+ content: `Failed to connect ${platform}: ${e.message}`,
1301
+ timestamp: new Date(),
1302
+ }]);
1303
+ }
1304
+ }, onCancel: () => setConnectModal(null) })), showWhatsApp && (_jsx(WhatsAppModal, { qrData: whatsappQR, status: whatsappStatus, errorMsg: whatsappError, onClose: () => {
1305
+ setShowWhatsApp(false);
1306
+ if (whatsappStatus === 'connected') {
1307
+ if (!config.gateway)
1308
+ config.gateway = {};
1309
+ config.gateway.whatsapp = { enabled: true };
1310
+ saveConfig(config);
1311
+ setMessages(prev => [...prev, {
1312
+ role: 'assistant',
1313
+ content: 'WhatsApp connected and saved!',
1314
+ timestamp: new Date(),
1315
+ }]);
1316
+ }
1317
+ } })), _jsx(InputBox, { onSubmit: handleSubmit, disabled: isProcessing || !!permissionPrompt || showLogin || !!connectModal || showWhatsApp, commands: commands, model: agent.getModel(), contextPct: ctxStats.estimatedPct, cwd: process.cwd(), mode: mode, onModeCycle: cycleMode, onExit: doExit })] }), _jsx("box", { flexShrink: 0, children: _jsx(StatusBar, { model: agent.getModel(), provider: agent.getProviderName(), researchMode: researchMode, cwd: process.cwd() }) })] }), _jsxs("box", { flexDirection: "column", width: 28, backgroundColor: theme.bgPanel, border: ["left"], borderColor: theme.border, paddingX: 1, paddingY: 1, flexShrink: 0, children: [_jsxs("box", { flexDirection: "column", children: [_jsx("text", { fg: theme.textMuted, attributes: TextAttributes.BOLD, children: "context" }), _jsxs("box", { marginTop: 1, children: [_jsx("text", { fg: barColor, children: barStr }), _jsxs("text", { fg: theme.textMuted, children: [' ', tokenStats.pct, "%"] })] }), _jsx("box", { children: _jsxs("text", { fg: theme.textMuted, children: [fmtTok(tokenStats.total), " tokens"] }) })] }), _jsxs("box", { flexDirection: "column", marginTop: 1, children: [_jsx("text", { fg: theme.textMuted, attributes: TextAttributes.BOLD, children: "tokens" }), _jsxs("box", { marginTop: 1, children: [_jsx("text", { fg: theme.secondary, children: "\u2191 " }), _jsx("text", { fg: theme.text, children: fmtTok(tokenStats.input) })] }), _jsxs("box", { children: [_jsx("text", { fg: theme.primary, children: "\u2193 " }), _jsx("text", { fg: theme.text, children: fmtTok(tokenStats.output) })] })] }), _jsxs("box", { flexDirection: "column", marginTop: 1, children: [_jsx("text", { fg: theme.textMuted, attributes: TextAttributes.BOLD, children: "model" }), _jsx("box", { marginTop: 1, children: _jsx("text", { fg: theme.text, children: agent.getModel() }) })] }), _jsxs("box", { flexDirection: "column", marginTop: 1, children: [_jsx("text", { fg: theme.textMuted, attributes: TextAttributes.BOLD, children: "info" }), _jsxs("box", { marginTop: 1, children: [_jsx("text", { fg: theme.textMuted, children: "provider " }), _jsx("text", { fg: theme.text, children: agent.getProviderName() })] }), _jsxs("box", { children: [_jsx("text", { fg: theme.textMuted, children: "depth " }), _jsx("text", { fg: researchMode === 'ultra' || researchMode === 'max' ? theme.accent : theme.text, children: researchMode })] }), _jsxs("box", { children: [_jsx("text", { fg: theme.textMuted, children: "messages " }), _jsx("text", { fg: theme.text, children: ctxStats.messageCount })] }), _jsxs("box", { children: [_jsx("text", { fg: theme.textMuted, children: "tools " }), _jsx("text", { fg: theme.text, children: toolCount })] })] })] })] })) }), toast && (_jsx("box", { position: "absolute", bottom: 2, left: Math.max(0, Math.floor((termWidth - toast.length - 4) / 2)), zIndex: 100, children: _jsx("box", { backgroundColor: theme.bgElement, paddingX: 2, paddingY: 0, border: ["top", "bottom", "left", "right"], borderColor: theme.border, children: _jsx("text", { fg: theme.ok, children: toast }) }) }))] }));
1318
+ }
1319
+ //# sourceMappingURL=App.js.map